pax_global_header00006660000000000000000000000064151570662020014516gustar00rootroot0000000000000052 comment=20aa4b73aef76bffb6fbc46a8827588dfa9bb89d pydicom-pydicom-20aa4b7/000077500000000000000000000000001515706620200152265ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/.circleci/000077500000000000000000000000001515706620200170615ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/.circleci/config.yml000066400000000000000000000011121515706620200210440ustar00rootroot00000000000000version: 2 jobs: build: docker: - image: python:3.10 steps: - checkout - run: name: Build documentation command: ./build_tools/circle/build_doc.sh timeout: "3600" - store_artifacts: path: doc/_build/html - add_ssh_keys: fingerprints: - "36:ae:e2:2f:a7:11:f1:3f:d5:45:1d:c1:ef:55:0b:9d" - run: name: Deploy documentation environment: USERNAME: darcymason EMAIL: darcymason@gmail.com command: ./build_tools/circle/push_doc.sh pydicom-pydicom-20aa4b7/.coveragerc000066400000000000000000000000521515706620200173440ustar00rootroot00000000000000[run] omit = tests/* benchmarks/* pydicom-pydicom-20aa4b7/.github/000077500000000000000000000000001515706620200165665ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/.github/FUNDING.yml000066400000000000000000000000221515706620200203750ustar00rootroot00000000000000github: darcymasonpydicom-pydicom-20aa4b7/.github/ISSUE_TEMPLATE/000077500000000000000000000000001515706620200207515ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000012461515706620200234460ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **Expected behavior** What you expected to happen (please include a reference to the DICOM standard if relevant). **Steps To Reproduce** How to reproduce the issue. Please include a minimum working code sample, the traceback (if any) and the anonymized DICOM dataset (if relevant). **Your environment** Please use the `pydicom.env_info` module (available in **pydicom 2 or later**) to gather information about your environment and paste it into the issue: ```bash $ python -m pydicom.env_info ``` pydicom-pydicom-20aa4b7/.github/ISSUE_TEMPLATE/documentation.md000066400000000000000000000006031515706620200241430ustar00rootroot00000000000000--- name: Documentation issue about: For issues with the documentation, no matter how small title: '' labels: Documentation assignees: '' --- **Link to the documentation** A link to the documentation page containing the issue, ideally from the [development version](https://pydicom.github.io/pydicom/dev/). **Describe the issue** A clear and concise description of what the issue is. pydicom-pydicom-20aa4b7/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000010071515706620200244740ustar00rootroot00000000000000--- name: Feature request about: Suggest an enhancement for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Example: I'm always frustrated when [...] Please take into account that *pydicom* is a general-purpose framework and does not handle the specifics of individual SOP classes. **Describe the solution you'd like** A clear and concise description of what you want to happen. pydicom-pydicom-20aa4b7/.github/ISSUE_TEMPLATE/other_issues.md000066400000000000000000000003031515706620200240030ustar00rootroot00000000000000--- name: Other issues about: For all other issues. Please consider creating a discussion item instead if you have a question, an idea, or a general discussion item. title: '' assignees: '' --- pydicom-pydicom-20aa4b7/.github/ISSUE_TEMPLATE/pixel_issue.md000066400000000000000000000025661515706620200236350ustar00rootroot00000000000000--- name: Pixel Data issue about: For issues related to Pixel Data or one of the bulk data handlers title: '' labels: pixel-data assignees: '' --- **Describe the issue** Please include: * A clear description of what the issue is * (If relevant) **anonymized** screenshots that demonstrate the issue * The output from `python -m pydicom.env_info` **Steps to reproduce** A way for us to reproduce and troubleshoot the issue: * A minimum working code sample * The *entire* traceback (if one occurred). It's also extremely helpful if you can include one of the following: * The **anonymized** DICOM dataset, which can be attached to the issue as a zip archive, or * The output from: For **pydicom >= 2.3**: ```python from pydicom import dcmread from pydicom.util import debug_pixel_data ds = dcmread("/path/to/the/dataset") debug_pixel_data(ds) ``` For **pydicom < 2.3**: ```python from pydicom import dcmread ds = dcmread("/path/to/the/dataset") print(ds.file_meta.get("TransferSyntaxUID", "(no transfer syntax)")) print(ds.group_dataset(0x0028)) print(ds.group_dataset(0x7FE0)) ``` pydicom-pydicom-20aa4b7/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000011621515706620200223670ustar00rootroot00000000000000 #### Describe the changes The related issue or a description of the bug or feature that this PR addresses. #### Tasks - [ ] Unit tests added that reproduce the issue or prove feature is working - [ ] Fix or feature added - [ ] Code typed and mypy shows no errors - [ ] Documentation updated (if relevant) - [ ] No warnings during build - [ ] Preview link (CircleCI -> Artifacts -> `doc/_build/html/index.html`) - [ ] Unit tests passing and overall coverage the same or better pydicom-pydicom-20aa4b7/.github/codecov.yml000066400000000000000000000001071515706620200207310ustar00rootroot00000000000000coverage: status: project: default: threshold: 0.2%pydicom-pydicom-20aa4b7/.github/dependabot.yml000066400000000000000000000007671515706620200214300ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "pip" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "monthly" pydicom-pydicom-20aa4b7/.github/workflows/000077500000000000000000000000001515706620200206235ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/.github/workflows/PR.yml000066400000000000000000000027741515706620200217010ustar00rootroot00000000000000name: PR on: pull_request: types: [opened, synchronize] jobs: tests: strategy: fail-fast: false matrix: # One Python version per OS, one combo does coverage # PyPy only has one line in pydicom (as of 2003-07) so cover in merge only # Macos unlikely to fail if ubuntu okay so also cover in merge os: [windows] python-version: ["3.10"] # , "3.12" soon test-extras: [false] upload-coverage: [false] include: - os: ubuntu python-version: "3.11" test-extras: true upload-coverage: true - os: macos python-version: "3.10" test-extras: true upload-coverage: false uses: ./.github/workflows/tests_wf.yml secrets: codecov_token: ${{ secrets.CODECOV_TOKEN }} with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} test-extras: ${{ matrix.test-extras }} upload-coverage: ${{ matrix.upload-coverage }} typing: runs-on: ubuntu-latest timeout-minutes: 20 strategy: fail-fast: false matrix: python-version: ['3.10'] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install typing dependencies run: | python -m pip install .[dev] - name: Run typing check with mypy run: mypy pydicom-pydicom-20aa4b7/.github/workflows/merge.yml000066400000000000000000000022511515706620200224450ustar00rootroot00000000000000name: merge on: push: branches: - main workflow_dispatch: jobs: tests: strategy: matrix: # Do the ones not covered in PR workflow os: [ubuntu, macos] python-version: ["3.10"] # , "3.12" except PyPy test-extras: [false] upload-coverage: [false] include: - os: windows python-version: "3.11" test-extras: true upload-coverage: true - os: macos python-version: "3.10" test-extras: true upload-coverage: false - os: ubuntu python-version: "pypy3.10" test-extras: false upload-coverage: false exclude: # for combo with test-extras, already includes false tests, so remove from matrix - os: macos python-version: "3.10" test-extras: false uses: ./.github/workflows/tests_wf.yml secrets: codecov_token: ${{ secrets.CODECOV_TOKEN }} with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} test-extras: ${{ matrix.test-extras }} upload-coverage: ${{ matrix.upload-coverage }} pydicom-pydicom-20aa4b7/.github/workflows/pr-typing.yml000066400000000000000000000012621515706620200233000ustar00rootroot00000000000000name: pr-typing on: pull_request: branches: [ main ] jobs: check-typing: runs-on: ubuntu-latest timeout-minutes: 30 strategy: fail-fast: false matrix: python-version: [ '3.10', '3.11' ] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install typing dependencies run: | python -m pip install --upgrade pip python -m pip install mypy==1.3.0 python -m pip install --upgrade types-requests - name: Run typing check with mypy run: | mypy pydicom-pydicom-20aa4b7/.github/workflows/publish-pypi-deploy.yml000066400000000000000000000022021515706620200252610ustar00rootroot00000000000000name: publish-pypi-deploy on: release: types: [ published ] jobs: deploy: runs-on: ubuntu-latest strategy: fail-fast: true matrix: python-version: [ '3.11' ] environment: name: pypi url: https://pypi.org/p/pydicom permissions: id-token: write steps: - name: Checkout uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Build package run: | python -m pip install --upgrade pip python -m pip install flit flit build # Run tests? Removed for now as merge into main does full testing - name: Upload release to PyPI # Note: in docs at https://github.com/pypa/gh-action-pypi-publish, # it is suggested to publish in its own job, using 'needs' to # ensure previous job succeeded, and artifact upload/download of # the dist folder. That seems to be related mainly to multi-OS builds, # so done in same job here. uses: pypa/gh-action-pypi-publish@release/v1 pydicom-pydicom-20aa4b7/.github/workflows/tests_wf.yml000066400000000000000000000051251515706620200232070ustar00rootroot00000000000000name: tests_wf on: workflow_call: inputs: os: required: true type: string python-version: required: true type: string test-extras: required: false type: boolean default: false upload-coverage: required: false type: boolean default: false secrets: codecov_token: required: true env: PYTEST_ARGS: "" jobs: tests: runs-on: ${{ inputs.os }}-latest defaults: run: shell: bash steps: - name: Install BLAS on PyPy3.10 if: startsWith(inputs.python-version, 'pypy') run: sudo apt install -y libopenblas-dev - name: Set env variables run: echo "PYTEST_ARGS=--cov-append --cov=pydicom" >> "$GITHUB_ENV" - name: Check-out code uses: actions/checkout@v3 with: fetch-depth: 2 - name: Set up Python ${{ inputs.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ inputs.python-version }} cache: pip allow-prereleases: true - name: Install pydicom and tools # not 'editable install' run: | python -m pip install .[dev] - name: Test without numpy or handlers, incl pydicom-data (in [dev]) run: | python -m pytest --cov-reset ${{ env.PYTEST_ARGS }} - name: Test with Numpy run: | python -m pip install .[basic] python -m pytest ${{ env.PYTEST_ARGS }} - name: Test with all optional dependencies if: inputs.test-extras run: | python -m pip install .[pixeldata,gpl-license] python -m pytest ${{ env.PYTEST_ARGS }} tests/test_pylibjpeg.py python -m pytest ${{ env.PYTEST_ARGS }} tests/test_pillow_pixel_data.py python -m pytest ${{ env.PYTEST_ARGS }} tests/test_JPEG_LS_transfer_syntax.py tests/test_jpeg_ls_pixel_data.py python -m pytest ${{ env.PYTEST_ARGS }} tests/test_gdcm_pixel_data.py tests/pixels/test_encoder_gdcm.py python -m pytest ${{ env.PYTEST_ARGS }} tests/pixels - name: Test with missing libs if: inputs.test-extras # A small number of tests only run if libs missing run: | python -m pip uninstall -y pydicom_data pylibjpeg-openjpeg pylibjpeg-libjpeg pylibjpeg-rle python -m pytest ${{ env.PYTEST_ARGS }} tests/test_pylibjpeg.py tests/test_data_manager.py - name: Send coverage results if: success() && inputs.upload-coverage uses: codecov/codecov-action@v4 env: codecov_token: ${{ secrets.codecov_token }} with: env_vars: inputs.os, inputs.python-version pydicom-pydicom-20aa4b7/.github/workflows/types-pydicom-update.yml000066400000000000000000000020531515706620200254340ustar00rootroot00000000000000name: Trigger a types-pydicom package update on: workflow_run: # This the value of the 'name:' variable for the workflow # For example, if 'name: Trigger Update' then this would be # - 'Trigger Update' workflows: - 'merge' types: - completed jobs: trigger-workflow: if: github.event.workflow_run.conclusion == 'success' runs-on: ubuntu-latest steps: - name: Trigger types-pydicom's update-package.yml workflow uses: actions/github-script@v6 with: # Personal Access Token with # repo: types-pydicom # repo permissions: Actions (RW), Contents (RW), Metadata (R), PR (RW) github-token: ${{ secrets.TRIGGER_TYPES_PYDICOM_UPDATE }} script: | await github.rest.actions.createWorkflowDispatch({ owner: 'scaramallion', repo: 'types-pydicom', workflow_id: 'update-package.yml', ref: 'main', }) pydicom-pydicom-20aa4b7/.gitignore000066400000000000000000000013121515706620200172130ustar00rootroot00000000000000# .gitignore file # Backup files *~ # Lock files used by the Emacs editor. .\#* # Temporary files used by editors. *.swp *.orig *.bak # A hidden file created by the Mac OS X Finder. .DS_Store # python byte-code files *.pyc *.pyo # Build/dist files dist/* build/* pydicom.egg-info distribute*.egg distribute*.tar.gz py3source .tox/* __pycache__ .eggs/* # Docs build docs/_build/* doc/_build/* doc/auto_examples/* doc/generated/* doc/reference/generated/* # coverage.py files .coverage # PyCharm IDE files *.idea* # jupyter notebooks *.ipynb .ipynb_checkpoints/* tests/test_pixel.py # mypy .mypy_cache # vscode .vscode/* # virtualenv env/ venv/ .venv/ # pytest .pytest_cache # airspeed velocity asv/* pydicom-pydicom-20aa4b7/.pre-commit-config.yaml000066400000000000000000000017711515706620200215150ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: - id: check-added-large-files - id: check-case-conflict - id: check-merge-conflict - id: check-symlinks - id: check-yaml - id: debug-statements - id: end-of-file-fixer - id: mixed-line-ending - id: trailing-whitespace repos: - repo: https://github.com/crate-ci/typos rev: v1.16.25 hooks: - id: typos exclude: _.*_dict.py - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. rev: v0.5.1 hooks: - id: ruff args: [src, --fix, --show-fixes, --exit-non-zero-on-fix] - repo: https://github.com/psf/black-pre-commit-mirror rev: 24.4.2 hooks: - id: black - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.10.0 hooks: - id: mypy files: src args: [] additional_dependencies: ["types-requests"] pydicom-pydicom-20aa4b7/CONTRIBUTING.md000066400000000000000000000213531515706620200174630ustar00rootroot00000000000000 Contributing to pydicom ======================= This is the guide for contributing code, documentation and tests to *pydicom*, as well as information on filing issues. Please read it carefully to help make the code review process go as smoothly as possible and maximize the likelihood of your contribution being merged. How to contribute ----------------- The preferred workflow for contributing to *pydicom* is to fork the [main repository](https://github.com/pydicom/pydicom) on GitHub, clone, and develop on a branch. Steps: 1. Fork the [project repository](https://github.com/pydicom/pydicom) by clicking on the 'Fork' button near the top right of the page. This creates a copy of the code under your GitHub user account. For more details on how to fork a repository see [this guide](https://help.github.com/articles/fork-a-repo/). 2. Clone your fork of the *pydicom* repo from your GitHub account to your local disk: ```bash $ git clone https://github.com/YourUsername/pydicom $ cd pydicom/ ``` 3. Install [pre-commit](https://pre-commit.com): ```bash $ pip install pre-commit $ pre-commit install ``` 4. Create a ``feature`` branch to hold your development changes: ```bash $ git checkout -b my-feature ``` Always use a ``feature`` branch. It's good practice to never work on the ``main`` branch! 5. Develop the feature on your feature branch. Add changed files using ``git add`` and then ``git commit`` files: ```bash $ git add modified_files $ git commit ``` 6. Add a meaningful commit message. Pull requests are "squash-merged", e.g. squashed into one commit with all commit messages combined. The commit messages can be edited during the merge, but it helps if they are clearly and briefly showing what has been done in the commit. Check out the [seven commonly accepted rules](https://www.theserverside.com/video/Follow-these-git-commit-message-guidelines) for commit messages. Here are some examples, taken from actual commits: ``` Add support for new VRs OV, SV, UV - closes #1016 ``` ``` Add warning when saving compressed without encapsulation ``` ``` Add optional handler argument to Dataset.decompress() - also add it to Dataset.convert_pixel_data() - add separate error handling for given handle - see #537 ``` When you run ``git commit`` the pre-commit checks will automatically run, if it finds any errors then they should be fixed before calling ``git commit`` again. 7. To record your changes in Git, push the changes to your GitHub account with: ```bash $ git push -u origin my-feature ``` 8. Follow [these instructions](https://help.github.com/articles/creating-a-pull-request-from-a-fork) to create a pull request from your fork. This will send an email to the committers. (If any of the above seems like magic to you, please look up the [Git documentation](https://git-scm.com/documentation) on the web, or ask a friend or another contributor for help.) Pull Request Checklist ---------------------- We recommend that your contribution complies with the following rules before you submit a pull request: - Follow the style used in the rest of the code. That mostly means to follow [PEP-8 guidelines](https://www.python.org/dev/peps/pep-0008/) for the code, and the [NumPy style](https://numpydoc.readthedocs.io/en/latest/format.html) for documentation. - If your pull request addresses an issue, please use the pull request title to describe the issue and mention the issue number in the pull request description. This will make sure a link back to the original issue is created. Use "closes #issue-number" or "fixes #issue-number" to let GitHub automatically close the related issue on commit. Use any other keyword (i.e. works on, related) to avoid GitHub to close the referenced issue. - All public methods should have informative docstrings with sample usage presented as doctests when appropriate. - Please prefix the title of your pull request with `[MRG]` (Ready for Merge), if the contribution is complete and ready for a detailed review. Some of the core developers will review your code, make suggestions for changes, and approve it as soon as it is ready for merge. Pull requests are usually merged after two approvals by core developers, or other developers asked to review the code. An incomplete contribution -- where you expect to do more work before receiving a full review -- should be prefixed with `[WIP]` (to indicate a work in progress) and changed to `[MRG]` when it matures. WIPs may be useful to: indicate you are working on something to avoid duplicated work, request broad review of functionality or API, or seek collaborators. WIPs often benefit from the inclusion of a [task list](https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments) in the PR description. - When adding additional functionality, check if it makes sense to add one or more example scripts in the ``examples/`` folder. Have a look at other examples for reference. Examples should demonstrate why the new functionality is useful in practice and, if possible, compare it to other methods available in pydicom. - Documentation and high-coverage tests are necessary for enhancements to be accepted. Bug-fixes shall be provided with [regression tests](https://en.wikipedia.org/wiki/regression_testing) that fail before the fix. For new features, the correct behavior shall be verified by feature tests. A good practice to write sufficient tests is [test-driven development](https://en.wikipedia.org/wiki/Test-driven_development). You can also check for common programming errors and style issues with the following tools: - The test coverage should be at least as good as the current coverage and any new lines of code must be covered: ```bash $ pip install pytest pytest-cov $ cd pydicom/ $ pytest --cov=pydicom tests/ ``` - The type hints, code syntax, spelling and formatting should be checked: ```bash $ pre-commit run ``` Alternatively you can run these checks manually without pre-commit: - Check the type hints ```bash $ pip install mypy $ cd pydicom/ $ mypy ``` - Check the code style and syntax ```bash $ pip install ruff $ cd pydicom/ $ ruff check . ``` - Consistent code formatting ```bash $ pip install black $ cd pydicom/ $ black src/pydicom/ $ black tests/ ``` Filing issues ------------- We use GitHub issues to track all bugs and feature requests; feel free to open an issue if you have found a bug or wish to see a feature implemented. It is recommended to check that your issue complies with the following rules before submitting: - Verify that your issue is not being currently addressed by other [issues](https://github.com/pydicom/pydicom/issues?q=) or [pull requests](https://github.com/pydicom/pydicom/pulls?q=). - Please ensure all code snippets and error messages are formatted in appropriate code blocks. See [Creating and highlighting code blocks](https://help.github.com/articles/creating-and-highlighting-code-blocks). - Please include your operating system type and version number, as well as your Python and pydicom versions. Please use the `pydicom_env_info` module to gather this information : ```bash $ python -m pydicom.env_info ``` - Please include a [reproducible](https://stackoverflow.com/help/minimal-reproducible-example) code snippet or link to a [gist](https://gist.github.com). If an exception is raised, please provide the complete traceback. (use `%xmode` in ipython to use the non beautified version of the trackeback) Documentation ------------- We are glad to accept any sort of documentation: function docstrings, reStructuredText documents, tutorials, etc. reStructuredText documents live in the source code repository under the ``doc/`` directory. You can edit the documentation using any text editor and then generate the HTML output by typing ``make html`` from the ``doc/`` directory. Alternatively, ``make`` can be used to quickly generate the documentation without the example gallery. The resulting HTML files will be placed in ``_build/html/`` and are viewable in a web browser. See the ``README`` file in the ``doc/`` directory for more information. Install the dependencies needed for building the documentation:: ```bash $ cd pydicom/ $ pip install -e .[docs] ``` To build the documentation itself:: ```bash $ cd pydicom/doc/ $ make clean && make html ``` When you are writing documentation that references DICOM, it is often helpful to reference the related part of the [DICOM standard](https://www.dicomstandard.org/current/). Try to make the explanations intuitive and understandable also for users not fluent in DICOM. pydicom-pydicom-20aa4b7/LICENSE000066400000000000000000000061051515706620200162350ustar00rootroot00000000000000License file for pydicom, a pure-python DICOM library Copyright (c) 2008-2020 Darcy Mason and pydicom contributors Except for portions outlined below, pydicom is released under an MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of pydicom (private dictionary file(s)) were generated from the private dictionary of the GDCM library, released under the following license: Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2016 Mathieu Malaterre Copyright (c) 1993-2005 CREATIS (CREATIS = Centre de Recherche et d'Applications en Traitement de l'Image) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither name of Mathieu Malaterre, or CREATIS, nor the names of any contributors (CNRS, INSERM, UCB, Universite Lyon I), may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pydicom-pydicom-20aa4b7/Makefile000066400000000000000000000012541515706620200166700ustar00rootroot00000000000000# simple makefile to simplify repetitive build env management tasks under posix # caution: testing won't work on windows test-code: pytest pydicom test-doc: pytest doc/*.rst test-coverage: rm -rf coverage .coverage pytest pydicom --cov-report term-missing --cov=pydicom test: test-code test-doc doc: make -C doc html clean: find . -name "*.so" -o -name "*.pyc" -o -name "*.md5" -o -name "*.pyd" -o -name "*~" | xargs rm -f find . -name "*.pyx" -exec ./tools/rm_pyx_c_file.sh {} \; rm -rf .cache rm -rf .coverage rm -rf dist rm -rf build rm -rf doc/auto_examples rm -rf doc/generated rm -rf doc/modules rm -rf examples/.ipynb_checkpoints code-analysis: ruff . pydicom-pydicom-20aa4b7/README.md000066400000000000000000000151701515706620200165110ustar00rootroot00000000000000[![unit-tests](https://github.com/pydicom/pydicom/workflows/unit-tests/badge.svg)](https://github.com/pydicom/pydicom/actions?query=workflow%3Aunit-tests) [![type-hints](https://github.com/pydicom/pydicom/workflows/type-hints/badge.svg)](https://github.com/pydicom/pydicom/actions?query=workflow%3Atype-hints) [![doc-build](https://circleci.com/gh/pydicom/pydicom/tree/main.svg?style=shield)](https://circleci.com/gh/pydicom/pydicom/tree/main) [![test-coverage](https://codecov.io/gh/pydicom/pydicom/branch/main/graph/badge.svg)](https://codecov.io/gh/pydicom/pydicom) [![Python version](https://img.shields.io/pypi/pyversions/pydicom.svg)](https://img.shields.io/pypi/pyversions/pydicom.svg) [![PyPI version](https://badge.fury.io/py/pydicom.svg)](https://badge.fury.io/py/pydicom) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8034250.svg)](https://doi.org/10.5281/zenodo.8034250) # *pydicom* *pydicom* is a pure Python package for working with [DICOM](https://www.dicomstandard.org/) files. It lets you read, modify and write DICOM data in an easy "pythonic" way. As a pure Python package, *pydicom* can run anywhere Python runs without any other requirements, although if you're working with *Pixel Data* then we recommend you also install [NumPy](https://numpy.org). Note that *pydicom* is a general-purpose DICOM framework concerned with reading and writing DICOM datasets. In order to keep the project manageable, it does not handle the specifics of individual SOP classes or other aspects of DICOM. Other libraries both inside and outside the [pydicom organization](https://github.com/pydicom) are based on *pydicom* and provide support for other aspects of DICOM, and for more specific applications. Examples are [pynetdicom](https://github.com/pydicom/pynetdicom), which is a Python library for DICOM networking, and [deid](https://github.com/pydicom/deid), which supports the anonymization of DICOM files. ## Installation Using [pip](https://pip.pypa.io/en/stable/): ``` pip install pydicom ``` Using [conda](https://docs.conda.io/en/latest/): ``` conda install -c conda-forge pydicom ``` For more information, including installation instructions for the development version, see the [installation guide](https://pydicom.github.io/pydicom/stable/tutorials/installation.html). ## Documentation The *pydicom* [user guide](https://pydicom.github.io/pydicom/stable/guides/user/index.html), [tutorials](https://pydicom.github.io/pydicom/stable/tutorials/index.html), [examples](https://pydicom.github.io/pydicom/stable/auto_examples/index.html) and [API reference](https://pydicom.github.io/pydicom/stable/reference/index.html) documentation is available for both the [current release](https://pydicom.github.io/pydicom/stable) and the [development version](https://pydicom.github.io/pydicom/dev) on GitHub Pages. ## *Pixel Data* Compressed and uncompressed *Pixel Data* is always available to be read, changed and written as [bytes](https://docs.python.org/3/library/stdtypes.html#bytes-objects): ```python >>> from pydicom import dcmread >>> from pydicom.data import get_testdata_file >>> path = get_testdata_file("CT_small.dcm") >>> ds = dcmread(path) >>> type(ds.PixelData) >>> len(ds.PixelData) 32768 >>> ds.PixelData[:2] b'\xaf\x00' ``` If [NumPy](https://www.numpy.org) is installed, *Pixel Data* can be converted to an [ndarray](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html) using the [Dataset.pixel_array](https://pydicom.github.io/pydicom/stable/reference/generated/pydicom.dataset.Dataset.html#pydicom.dataset.Dataset.pixel_array) property: ```python >>> arr = ds.pixel_array >>> arr.shape (128, 128) >>> arr array([[175, 180, 166, ..., 203, 207, 216], [186, 183, 157, ..., 181, 190, 239], [184, 180, 171, ..., 152, 164, 235], ..., [906, 910, 923, ..., 922, 929, 927], [914, 954, 938, ..., 942, 925, 905], [959, 955, 916, ..., 911, 904, 909]], dtype=int16) ``` ### Decompressing *Pixel Data* #### JPEG, JPEG-LS and JPEG 2000 Converting JPEG, JPEG-LS or JPEG 2000 compressed *Pixel Data* to an ``ndarray`` requires installing one or more additional Python libraries. For information on which libraries are required, see the [pixel data handler documentation](https://pydicom.github.io/pydicom/stable/guides/user/image_data_handlers.html#guide-compressed). #### RLE Decompressing RLE *Pixel Data* only requires NumPy, however it can be quite slow. You may want to consider [installing one or more additional Python libraries](https://pydicom.github.io/pydicom/stable/guides/user/image_data_compression.html) to speed up the process. ### Compressing *Pixel Data* Information on compressing *Pixel Data* using one of the below formats can be found in the corresponding [encoding guides](https://pydicom.github.io/pydicom/stable/guides/encoding/index.html). These guides cover the specific requirements for each encoding method and we recommend you be familiar with them when performing image compression. #### JPEG-LS, JPEG 2000 Compressing image data from an ``ndarray`` or ``bytes`` object to JPEG-LS or JPEG 2000 requires installing the following: * JPEG-LS requires [pyjpegls](https://github.com/pydicom/pyjpegls) * JPEG 2000 requires [pylibjpeg](https://github.com/pydicom/pylibjpeg) and the [pylibjpeg-openjpeg](https://github.com/pydicom/pylibjpeg-openjpeg) plugin #### RLE Compressing using RLE requires no additional packages but can be quite slow. It can be sped up by installing [pylibjpeg](https://github.com/pydicom/pylibjpeg) with the [pylibjpeg-rle](https://github.com/pydicom/pylibjpeg-rle) plugin, or [gdcm](https://github.com/tfmoraes/python-gdcm). ## Examples More [examples](https://pydicom.github.io/pydicom/stable/auto_examples/index.html) are available in the documentation. **Change a patient's ID** ```python from pydicom import dcmread ds = dcmread("/path/to/file.dcm") # Edit the (0010,0020) 'Patient ID' element ds.PatientID = "12345678" ds.save_as("/path/to/file_updated.dcm") ``` **Display the Pixel Data** With [NumPy](https://numpy.org) and [matplotlib](https://matplotlib.org/) ```python import matplotlib.pyplot as plt from pydicom import dcmread, examples # The path to the example "ct" dataset included with pydicom path: "pathlib.Path" = examples.get_path("ct") ds = dcmread(path) # `arr` is a numpy.ndarray arr = ds.pixel_array plt.imshow(arr, cmap="gray") plt.show() ``` ## Contributing We are all volunteers working on *pydicom* in our free time. As our resources are limited, we very much value your contributions, be it bug fixes, new core features, or documentation improvements. For more information, please read our [contribution guide](https://github.com/pydicom/pydicom/blob/main/CONTRIBUTING.md). pydicom-pydicom-20aa4b7/_typos.toml000066400000000000000000000002561515706620200174430ustar00rootroot00000000000000[default.extend-words] ba = "ba" ot = "ot" siz = "siz" parm = "parm" universite = "universite" womens = "womens" observ = "observ" [files] extend-exclude = ["**/_*_dict.py"]pydicom-pydicom-20aa4b7/asv.conf.json000066400000000000000000000046641515706620200176500ustar00rootroot00000000000000{ "version": 1, "project": "pydicom", "project_url": "https://github.com/pydicom/pydicom.git", // The URL or local path of the repo for the project being benchmarked "repo": ".", "repo_subdir": "", // Customizable commands for building, installing, and // uninstalling the project. See asv.conf.json documentation. // // "install_command": ["in-dir={env_dir} python -mpip install {wheel_file}"], // "uninstall_command": ["return-code=any python -mpip uninstall -y {project}"], // "build_command": [ // "python setup.py build", // "PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps --no-index -w {build_cache_dir} {build_dir}" // ], // List of branches to benchmark. If not provided, defaults to "main" // (for git) or "default" (for mercurial). "branches": ["nested-seq-speed", "main"], "environment_type": "virtualenv", // timeout in seconds for installing any dependencies in environment //"install_timeout": 600, // the base URL to show a commit for the project. "show_commit_url": "https://github.com/pydicom/pydicom/commit/", // The Pythons you'd like to test against. If not provided, defaults // to the current version of Python used to run `asv`. // "pythons": ["2.7", "3.6"], // The matrix of dependencies to test. "matrix": { "req": { "numpy": [] }, }, // "benchmark_dir": "benchmarks", "env_dir": "asv/env", "results_dir": "asv/results", "html_dir": "asv/html", // The number of characters to retain in the commit hashes. // "hash_length": 8, // `asv` will cache results of the recent builds in each // environment, making them faster to install next time. This is // the number of builds to keep, per environment. // "build_cache_size": 2, // The commits after which the regression search in `asv publish` // should start looking for regressions. ... // "regressions_first_commits": { // "some_benchmark": "352cdf", // Consider regressions only after this commit // "another_benchmark": null, // Skip regression detection altogether // }, // The thresholds for relative change in results, after which `asv // publish` starts reporting regressions. ... // "regressions_thresholds": { // "some_benchmark": 0.01, // Threshold of 1% // "another_benchmark": 0.5, // Threshold of 50% // }, } pydicom-pydicom-20aa4b7/benchmarks/000077500000000000000000000000001515706620200173435ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/benchmarks/__init__.py000066400000000000000000000000001515706620200214420ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/benchmarks/bench_encaps.py000066400000000000000000000056261515706620200223360ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Benchmarks for the encaps module.""" from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.encaps import ( fragment_frame, itemise_frame, encapsulate, decode_data_sequence, ) JP2K_10FRAME = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") class TimeFragmentFrame: """Time tests for the encaps.fragment_frame function.""" def setup(self): """Setup the test""" ds = dcmread(JP2K_10FRAME) self.test_data = decode_data_sequence(ds.PixelData) assert len(self.test_data) == 10 self.no_runs = 1000 def time_fragment_single(self): """Time fragmenting each frame into 1 fragment.""" for ii in range(self.no_runs): for fragment in fragment_frame(self.test_data[0], 1): pass def time_fragment_ten(self): """Time fragmenting each frame into 10 fragments.""" for ii in range(self.no_runs): for fragment in fragment_frame(self.test_data[0], 10): pass class TimeItemiseFrame: """Time tests for the encaps.itemise_frame function.""" def setup(self): """Setup the test""" ds = dcmread(JP2K_10FRAME) self.test_data = decode_data_sequence(ds.PixelData) assert len(self.test_data) == 10 self.no_runs = 1000 def time_itemise_single(self): """Time itemising a frame into 1 fragment.""" for ii in range(self.no_runs): for item in itemise_frame(self.test_data[0], 1): pass def time_itemise_ten(self): """Time itemising a frame into 10 fragments.""" for ii in range(self.no_runs): for item in itemise_frame(self.test_data[0], 10): pass class TimeEncapsulate: """Time tests for the encaps.encapsulate function.""" def setup(self): """Setup the test""" ds = dcmread(JP2K_10FRAME) self.test_data = decode_data_sequence(ds.PixelData) assert len(self.test_data) == 10 self.no_runs = 1000 def time_encapsulate_single_bot(self): """Time encapsulating frames with 1 fragment per frame.""" for ii in range(self.no_runs): encapsulate(self.test_data, 1, has_bot=True) def time_encapsulate_ten_bot(self): """Time encapsulating frames with 10 fragments per frame.""" for ii in range(self.no_runs): encapsulate(self.test_data, 10, has_bot=True) def time_encapsulate_single_nobot(self): """Time encapsulating frames with 1 fragment per frame.""" for ii in range(self.no_runs): encapsulate(self.test_data, 1, has_bot=False) def time_encapsulate_ten_nobot(self): """Time encapsulating frames with 10 fragments per frame.""" for ii in range(self.no_runs): encapsulate(self.test_data, 10, has_bot=False) pydicom-pydicom-20aa4b7/benchmarks/bench_handler_numpy.py000066400000000000000000000174121515706620200237260ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Benchmarks for the numpy_handler module. Requires asv and numpy. """ from platform import python_implementation from tempfile import TemporaryFile import numpy as np from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.dataset import Dataset, FileMetaDataset from pydicom.pixel_data_handlers.numpy_handler import ( get_pixeldata, unpack_bits, pack_bits, ) from pydicom.uid import ExplicitVRLittleEndian, generate_uid # 1/1, 1 sample/pixel, 1 frame EXPL_1_1_1F = get_testdata_file("liver_1frame.dcm") # 1/1, 1 sample/pixel, 3 frame EXPL_1_1_3F = get_testdata_file("liver.dcm") # 8/8, 1 sample/pixel, 1 frame EXPL_8_1_1F = get_testdata_file("OBXXXX1A.dcm") # 8/8, 1 sample/pixel, 2 frame EXPL_8_1_2F = get_testdata_file("OBXXXX1A_2frame.dcm") # 8/8, 3 sample/pixel, 1 frame EXPL_8_3_1F = get_testdata_file("SC_rgb.dcm") # 8/8, 3 sample/pixel, 1 frame, YBR_FULL_422 EXPL_8_3_1F_YBR422 = get_testdata_file("SC_ybr_full_422_uncompressed.dcm") # 8/8, 3 sample/pixel, 2 frame EXPL_8_3_2F = get_testdata_file("SC_rgb_2frame.dcm") # 16/16, 1 sample/pixel, 1 frame EXPL_16_1_1F = get_testdata_file("MR_small.dcm") # 16/12, 1 sample/pixel, 10 frame EXPL_16_1_10F = get_testdata_file("emri_small.dcm") # 16/16, 3 sample/pixel, 1 frame EXPL_16_3_1F = get_testdata_file("SC_rgb_16bit.dcm") # 16/16, 3 sample/pixel, 2 frame EXPL_16_3_2F = get_testdata_file("SC_rgb_16bit_2frame.dcm") # 32/32, 1 sample/pixel, 1 frame IMPL_32_1_1F = get_testdata_file("rtdose_1frame.dcm") # 32/32, 1 sample/pixel, 15 frame IMPL_32_1_15F = get_testdata_file("rtdose.dcm") # 32/32, 3 sample/pixel, 1 frame EXPL_32_3_1F = get_testdata_file("SC_rgb_32bit.dcm") # 32/32, 3 sample/pixel, 2 frame EXPL_32_3_2F = get_testdata_file("SC_rgb_32bit_2frame.dcm") def _create_temporary_dataset(shape=(100, 1024, 1024, 3), bit_depth=16): """Function to create a temporary dataset for use in testing. Parameters ---------- shape : 4-tuple The (frames, rows, columns, channels) of the test dataset. bit_depth : int The BitsAllocated value to use for the dataset, one of 8, 16, 32, 64. Returns ------- tempfile.TemporaryFile A created DICOM File Format conformant dataset. """ ds = Dataset() ds.is_little_endian = True ds.is_implicit_VR = False ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.SOPClassUID = "1.2.3.4" ds.SOPInstanceUID = generate_uid() ds.BitsAllocated = bit_depth ds.PixelRepresentation = 0 ds.PlanarConfiguration = 0 ds.Rows = shape[1] ds.Columns = shape[2] ds.NumberOfFrames = shape[0] ds.SamplesPerPixel = shape[3] if shape[3] == 1: ds.PhotometricInterpretation = "MONOCHROME2" elif shape[3] == 3: ds.PhotometricInterpretation = "RGB" arr = np.zeros(shape, dtype=f"uint{bit_depth}") ds.PixelData = arr.tobytes() if len(ds.PixelData) % 2: ds.PixelData += b"\x00" tfile = TemporaryFile(mode="w+b") ds.save_as(tfile, write_like_original=False) tfile.seek(0) return tfile class TimeGetPixelData_LargeDataset: """Time tests for numpy_handler.get_pixeldata with large datasets.""" def setup(self): """Setup the tests.""" self.no_runs = 100 self.ds_16_3_100 = dcmread(_create_temporary_dataset()) def time_large_dataset(self): """Time reading pixel data from a large dataset.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_3_100) class TimeGetPixelData: """Time tests for numpy_handler.get_pixeldata.""" def setup(self): """Setup the tests.""" self.no_runs = 100 self.ds_1_1_1 = dcmread(EXPL_1_1_1F) self.ds_1_1_3 = dcmread(EXPL_1_1_3F) self.ds_8_1_1 = dcmread(EXPL_8_1_1F) self.ds_8_1_2 = dcmread(EXPL_8_1_2F) self.ds_8_3_1 = dcmread(EXPL_8_3_1F) self.ds_8_3_2 = dcmread(EXPL_8_3_2F) self.ds_16_1_1 = dcmread(EXPL_16_1_1F) self.ds_16_1_10 = dcmread(EXPL_16_1_10F) self.ds_16_3_1 = dcmread(EXPL_16_3_1F) self.ds_16_3_2 = dcmread(EXPL_16_3_2F) self.ds_32_1_1 = dcmread(IMPL_32_1_1F) self.ds_32_1_15 = dcmread(IMPL_32_1_15F) self.ds_32_3_1 = dcmread(EXPL_32_3_1F) self.ds_32_3_2 = dcmread(EXPL_32_3_2F) self.ds_ybr_422 = dcmread(EXPL_8_3_1F_YBR422) def time_1bit_1sample_1frame(self): """Time retrieval of 1-bit, 1 sample/pixel, 1 frame.""" no_runs = self.no_runs if "PyPy" in python_implementation(): no_runs = 1 for ii in range(no_runs): get_pixeldata(self.ds_1_1_1) def time_1bit_1sample_3frame(self): """Time retrieval of 1-bit, 1 sample/pixel, 3 frame.""" no_runs = self.no_runs if "PyPy" in python_implementation(): no_runs = 1 for ii in range(no_runs): get_pixeldata(self.ds_1_1_3) def time_8bit_1sample_1frame(self): """Time retrieval of 8-bit, 1 sample/pixel, 1 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_8_1_1) def time_8bit_1sample_2frame(self): """Time retrieval of 8-bit, 1 sample/pixel, 2 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_8_1_2) def time_8bit_3sample_1frame(self): """Time retrieval of 8-bit, 3 sample/pixel, 1 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_8_3_1) def time_8bit_3sample_2frame(self): """Time retrieval of 8-bit, 3 sample/pixel, 2 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_8_3_2) def time_16bit_1sample_1frame(self): """Time retrieval of 16-bit, 1 sample/pixel, 1 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_1_1) def time_16bit_1sample_10frame(self): """Time retrieval of 16-bit, 1 sample/pixel, 10 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_1_10) def time_16bit_3sample_1frame(self): """Time retrieval of 16-bit, 3 sample/pixel, 1 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_3_1) def time_16bit_3sample_2frame(self): """Time retrieval of 16-bit, 3 sample/pixel, 2 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_3_2) def time_32bit_1sample_1frame(self): """Time retrieval of 32-bit, 1 sample/pixel, 1 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_32_1_1) def time_32bit_1sample_15frame(self): """Time retrieval of 32-bit, 1 sample/pixel, 15 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_32_1_15) def time_32bit_3sample_1frame(self): """Time retrieval of 32-bit, 3 sample/pixel, 1 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_32_3_1) def time_32bit_3sample_2frame(self): """Time retrieval of 32-bit, 3 sample/pixel, 2 frame.""" for ii in range(self.no_runs): get_pixeldata(self.ds_32_3_2) def time_ybr_422(self): """Time retrieval of YBR_FULL_422 data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_ybr_422) class TimePackUnpack: def setup(self): """Setup the tests.""" self.no_runs = 100 self.ds_1_1_1 = dcmread(EXPL_1_1_1F) self.unpacked = unpack_bits(self.ds_1_1_1.PixelData) def time_unpack(self): """Time unpacking""" for ii in range(self.no_runs): unpack_bits(self.ds_1_1_1.PixelData) def time_pack(self): """Time packing.""" for ii in range(self.no_runs): pack_bits(self.unpacked) pydicom-pydicom-20aa4b7/benchmarks/bench_nested_seq.py000066400000000000000000000056571515706620200232230ustar00rootroot00000000000000from pydicom.dataset import Dataset from pydicom.sequence import Sequence from pydicom.tag import Tag def create_nested_test_seq(num_items: int = 6280) -> Dataset: """Create a simplified version of sequence from issue #1728""" # original had 6280 items, but that is probably larger than needed from copy import deepcopy ds = Dataset() # Per-frame Functional Groups Sequence func_gps_seq = Sequence() ds.PerFrameFunctionalGroupsSequence = func_gps_seq # Per-frame Functional Groups Sequence: Per-frame Functional Groups 1 func_gps1 = Dataset() # Plane Position Sequence plane_pos_seq = Sequence() func_gps1.PlanePositionSequence = plane_pos_seq func_gps_seq.append(func_gps1) # Plane Position Sequence: Plane Position 1 plane_pos1 = Dataset() plane_pos1.XOffsetInSlideCoordinateSystem = "0.0" plane_pos1.YOffsetInSlideCoordinateSystem = "0.0" plane_pos1.ZOffsetInSlideCoordinateSystem = "0.0" plane_pos1.ColumnPositionInTotalImagePixelMatrix = 1 plane_pos1.RowPositionInTotalImagePixelMatrix = 1 plane_pos_seq.append(plane_pos1) for i in range(num_items - 1): func_gp = Dataset() plane_pos = deepcopy(plane_pos1) # Ensure different numbers to avoid memory caching of some kind plane_pos.ColumnPositionInTotalImagePixelMatrix = i plane_pos.RowPositionInTotalImagePixelMatrix = i func_gp.PlanePositionSequence = Sequence([plane_pos]) func_gps_seq.append(func_gp) return ds class TimeNestedSeqAccess: """Time tests for large nested sequences.""" len_top_sequence = 2000 dataset = create_nested_test_seq(len_top_sequence) def setup(self): pass def time_iterate_nested_elems(self): for func_gp in self.dataset.PerFrameFunctionalGroupsSequence: pps_item = func_gp.PlanePositionSequence[0] ( pps_item.RowPositionInTotalImagePixelMatrix, pps_item.ColumnPositionInTotalImagePixelMatrix, ) def time_index_to_nested_items(self): for i in range(len(self.dataset.PerFrameFunctionalGroupsSequence)): func_gp = self.dataset.PerFrameFunctionalGroupsSequence[i] pps_item = func_gp.PlanePositionSequence[0] ( pps_item.RowPositionInTotalImagePixelMatrix, pps_item.ColumnPositionInTotalImagePixelMatrix, ) def time_iterate_preload_tags(self): row_pos_tag = Tag("RowPositionInTotalImagePixelMatrix") col_pos_tag = Tag("ColumnPositionInTotalImagePixelMatrix") plane_pos_seq_tag = Tag("PlanePositionSequence") for func_gp in self.dataset.PerFrameFunctionalGroupsSequence: pps_item = func_gp[plane_pos_seq_tag][0] ( pps_item[row_pos_tag].value, pps_item[col_pos_tag].value, ) def track_len_top_sequence(self): return self.len_top_sequence pydicom-pydicom-20aa4b7/benchmarks/bench_pixel_util.py000066400000000000000000000037451515706620200232430ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Benchmarks for the pixel data utilities.""" import numpy as np from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.pixel_data_handlers.util import convert_color_space # 32/32, 3 sample/pixel, 2 frame EXPL_32_3_2F = get_testdata_file("SC_rgb_32bit_2frame.dcm") class TimeConvertColorSpace: """Benchmarks for utils.convert_color_space().""" def setup(self): """Setup the benchmark.""" self.no_runs = 1000 ds = dcmread(get_testdata_file("SC_rgb_gdcm2k_uncompressed.dcm")) self.rgb = ds.pixel_array ds = dcmread(get_testdata_file("SC_ybr_full_uncompressed.dcm")) self.ybr_full = ds.pixel_array self.arr_large = np.ones((10, 1024, 1024, 3), dtype=np.uint8) self.arr_32_3_2f = dcmread(EXPL_32_3_2F).pixel_array def time_rgb_ybr(self): """Time converting from RGB to YBR color space.""" for ii in range(self.no_runs): convert_color_space(self.rgb, "RGB", "YBR_FULL") def time_ybr_rgb(self): """Time converting from YBR to RGB color space.""" for ii in range(self.no_runs): convert_color_space(self.ybr_full, "YBR_FULL", "RGB") def time_ybr_rgb_32_3_2f(self): """Time converting YBR to RGB.""" for ii in range(self.no_runs): convert_color_space(self.arr_32_3_2f, "YBR_FULL", "RGB") def time_rgb_ybr_32_3_2f(self): """Time converting RGB to YBR.""" for ii in range(self.no_runs): convert_color_space(self.arr_32_3_2f, "RGB", "YBR_FULL") def time_ybr_rgb_large(self): """Time converting YBR to RGB.""" for ii in range(1): convert_color_space(self.arr_large, "YBR_FULL", "RGB", per_frame=True) def time_rgb_ybr_large(self): """Time converting RGB to YBR.""" for ii in range(1): convert_color_space(self.arr_large, "RGB", "YBR_FULL", per_frame=True) pydicom-pydicom-20aa4b7/benchmarks/bench_rle_decode.py000066400000000000000000000100301515706620200231330ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Decoding benchmarks for the rle_handler module.""" from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.encaps import decode_data_sequence from pydicom.pixel_data_handlers.rle_handler import ( get_pixeldata, _rle_decode_frame, ) # 8/8-bit, 1 sample/pixel, 1 frame OB_RLE_1F = get_testdata_file("OBXXXX1A_rle.dcm") # 8/8-bit, 1 sample/pixel, 2 frame OB_RLE_2F = get_testdata_file("OBXXXX1A_rle_2frame.dcm") # 8/8-bit, 3 sample/pixel, 1 frame SC_RLE_1F = get_testdata_file("SC_rgb_rle.dcm") # 8/8-bit, 3 sample/pixel, 2 frame SC_RLE_2F = get_testdata_file("SC_rgb_rle_2frame.dcm") # 16/16-bit, 1 sample/pixel, 1 frame MR_RLE_1F = get_testdata_file("MR_small_RLE.dcm") # 16/16-bit, 3 sample/pixel, 1 frame SC_RLE_16_1F = get_testdata_file("SC_rgb_rle_16bit.dcm") # 16/16-bit, 3 sample/pixel, 2 frame SC_RLE_16_2F = get_testdata_file("SC_rgb_rle_16bit_2frame.dcm") # 16/12-bit, 1 sample/pixel, 10 frame EMRI_RLE_10F = get_testdata_file("emri_small_RLE.dcm") # 32/32-bit, 1 sample/pixel, 1 frame RTDOSE_RLE_1F = get_testdata_file("rtdose_rle_1frame.dcm") # 32/32-bit, 3 sample/pixel, 1 frame SC_RLE_32_1F = get_testdata_file("SC_rgb_rle_32bit.dcm") # 32/32-bit, 3 sample/pixel, 2 frame SC_RLE_32_2F = get_testdata_file("SC_rgb_rle_32bit_2frame.dcm") # 32/32-bit, 1 sample/pixel, 15 frame RTDOSE_RLE_15F = get_testdata_file("rtdose_rle.dcm") class TimeRLEDecodeFrame: """Time tests for rle_handler._rle_decode_frame.""" def setup(self): # MONOCHROME2, 64x64, 1 sample/pixel, 16 bits allocated, 12 bits stored self.ds = dcmread(EMRI_RLE_10F) self.frames = decode_data_sequence(self.ds.PixelData) assert len(self.frames) == 10 self.no_runs = 100 def time_decode_16bit_1sample_1frame(self): """Time decoding the pixel data from a single RLE frame.""" for ii in range(self.no_runs): _rle_decode_frame( self.frames[0], self.ds.Rows, self.ds.Columns, self.ds.SamplesPerPixel, self.ds.BitsAllocated, ) def time_decode_16bit_1sample_10frame(self): """Time decoding the pixel data from 10 RLE frames.""" for ii in range(self.no_runs): for frame in self.frames: _rle_decode_frame( frame, self.ds.Rows, self.ds.Columns, self.ds.SamplesPerPixel, self.ds.BitsAllocated, ) class TimeGetPixelData: """Time tests for rle_handler.get_pixeldata.""" def setup(self): """Setup the test""" self.ds_8_1_1 = dcmread(OB_RLE_1F) self.ds_8_3_1 = dcmread(SC_RLE_1F) self.ds_16_1_1 = dcmread(MR_RLE_1F) self.ds_16_3_1 = dcmread(SC_RLE_16_1F) self.ds_32_1_1 = dcmread(RTDOSE_RLE_1F) self.ds_32_3_1 = dcmread(SC_RLE_32_1F) self.no_runs = 100 def time_08bit_1sample(self): """Time retrieval of 8-bit, 1 sample/pixel RLE data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_8_1_1) def time_08bit_3sample(self): """Time retrieval of 8-bit, 3 sample/pixel RLE data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_8_3_1) def time_16bit_1sample(self): """Time retrieval of 16-bit, 1 sample/pixel RLE data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_1_1) def time_16bit_3sample(self): """Time retrieval of 16-bit, 3 sample/pixel RLE data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_16_3_1) def time_32bit_1sample(self): """Time retrieval of 32-bit, 1 sample/pixel RLE data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_32_1_1) def time_32bit_3sample(self): """Time retrieval of 32-bit, 3 sample/pixel RLE data.""" for ii in range(self.no_runs): get_pixeldata(self.ds_32_3_1) pydicom-pydicom-20aa4b7/benchmarks/bench_rle_encode.py000066400000000000000000000062261515706620200231610ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Encoding benchmarks for the rle_handler module.""" from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.pixel_data_handlers.rle_handler import rle_encode_frame from pydicom.uid import RLELossless # 8/8-bit, 1 sample/pixel, 1 frame EXPL_8_1_1F = get_testdata_file("OBXXXX1A.dcm") # 8/8-bit, 3 sample/pixel, 1 frame EXPL_8_3_1F = get_testdata_file("SC_rgb.dcm") # 16/16-bit, 1 sample/pixel, 1 frame EXPL_16_1_1F = get_testdata_file("MR_small.dcm") # 16/16-bit, 3 sample/pixel, 1 frame EXPL_16_3_1F = get_testdata_file("SC_rgb_16bit.dcm") # 32/32-bit, 1 sample/pixel, 1 frame EXPL_32_1_1F = get_testdata_file("rtdose_1frame.dcm") # 32/32-bit, 3 sample/pixel, 1 frame EXPL_32_3_1F = get_testdata_file("SC_rgb_32bit.dcm") class TimeRLEEncodeFrame: """Time tests for rle_handler.rle_encode_frame.""" def setup(self): ds = dcmread(EXPL_8_1_1F) self.arr8_1 = ds.pixel_array ds = dcmread(EXPL_8_3_1F) self.arr8_3 = ds.pixel_array ds = dcmread(EXPL_16_1_1F) self.arr16_1 = ds.pixel_array ds = dcmread(EXPL_16_3_1F) self.arr16_3 = ds.pixel_array ds = dcmread(EXPL_32_1_1F) self.arr32_1 = ds.pixel_array ds = dcmread(EXPL_32_3_1F) self.arr32_3 = ds.pixel_array self.no_runs = 100 def time_08_1(self): """Time encoding 8 bit 1 sample/pixel.""" for ii in range(self.no_runs): rle_encode_frame(self.arr8_1) def time_08_3(self): """Time encoding 8 bit 3 sample/pixel.""" for ii in range(self.no_runs): rle_encode_frame(self.arr8_3) def time_16_1(self): """Time encoding 16 bit 1 sample/pixel.""" for ii in range(self.no_runs): rle_encode_frame(self.arr16_1) def time_16_3(self): """Time encoding 16 bit 3 sample/pixel.""" for ii in range(self.no_runs): rle_encode_frame(self.arr16_3) def time_32_1(self): """Time encoding 32 bit 1 sample/pixel.""" for ii in range(self.no_runs): rle_encode_frame(self.arr32_1) def time_32_3(self): """Time encoding 32 bit 3 sample/pixel.""" for ii in range(self.no_runs): rle_encode_frame(self.arr32_3) # Requires numpy, pylibjpeg, pylibjpeg-rle and python-gdcm class TimeDatasetCompress: """Test Dataset.compress().""" def setup(self): # More real-world like dataset self.ds = dcmread(EXPL_8_1_1F) self.arr8_1 = self.ds.pixel_array self.no_runs = 1000 def time_pydicom(self): """Time the native RLE encoder.""" for _ in range(self.no_runs): self.ds.compress(RLELossless, self.arr8_1, encoding_plugin="pydicom") def time_pylibjpeg(self): """Time the pylibjpeg-rle Rust RLE encoder.""" for _ in range(self.no_runs): self.ds.compress(RLELossless, self.arr8_1, encoding_plugin="pylibjpeg") def time_gdcm(self): """Time the GDCM C++ RLE encoder.""" for _ in range(self.no_runs): self.ds.compress(RLELossless, self.arr8_1, encoding_plugin="gdcm") pydicom-pydicom-20aa4b7/build_tools/000077500000000000000000000000001515706620200175455ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/build_tools/circle/000077500000000000000000000000001515706620200210065ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/build_tools/circle/build_doc.sh000077500000000000000000000057411515706620200233000ustar00rootroot00000000000000#!/usr/bin/env bash set -x set -e # Decide what kind of documentation build to run, and run it. # # If the last commit message has a "[doc skip]" marker, do not build # the doc. On the contrary if a "[doc build]" marker is found, build the doc # instead of relying on the subsequent rules. # # We always build the documentation for jobs that are not related to a specific # PR (e.g. a merge to main or a maintenance branch). # # If this is a PR, do a full build if there are some files in this PR that are # under the "doc/" or "examples/" folders, otherwise perform a quick build. # # If the inspection of the current commit fails for any reason, the default # behavior is to quick build the documentation. get_build_type() { if [ -z "$CIRCLE_SHA1" ] then echo SKIP: undefined CIRCLE_SHA1 return fi commit_msg=$(git log --format=%B -n 1 $CIRCLE_SHA1) if [ -z "$commit_msg" ] then echo QUICK BUILD: failed to inspect commit $CIRCLE_SHA1 return fi if [[ "$commit_msg" =~ \[doc\ skip\] ]] then echo SKIP: [doc skip] marker found return fi if [[ "$commit_msg" =~ \[doc\ quick\] ]] then echo QUICK: [doc quick] marker found return fi if [[ "$commit_msg" =~ \[doc\ build\] ]] then echo BUILD: [doc build] marker found return fi if [ -z "$CI_PULL_REQUEST" ] then echo BUILD: not a pull request return fi git_range="origin/main...$CIRCLE_SHA1" git fetch origin main >&2 || (echo QUICK BUILD: failed to get changed filenames for $git_range; return) filenames=$(git diff --name-only $git_range) if [ -z "$filenames" ] then echo QUICK BUILD: no changed filenames for $git_range return fi if echo "$filenames" | grep -q -e ^examples/ then echo BUILD: detected examples/ filename modified in $git_range: $(echo "$filenames" | grep -e ^examples/ | head -n1) return fi echo QUICK BUILD: no examples/ filename modified in $git_range: echo "$filenames" } build_type=$(get_build_type) if [[ "$build_type" =~ ^SKIP ]] then exit 0 fi if [[ "$CIRCLE_BRANCH" =~ ^main$|^[0-9]+\.[0-9]+\.X$ && -z "$CI_PULL_REQUEST" ]] then # PDF linked into HTML MAKE_TARGET="dist LATEXMKOPTS=-halt-on-error" elif [[ "$build_type" =~ ^QUICK ]] then MAKE_TARGET=html else MAKE_TARGET=html fi # Installing required system packages to support the rendering of math # notation in the HTML documentation apt-get -yq update apt-get -yq remove texlive-binaries --purge apt-get -yq --no-install-suggests --no-install-recommends --force-yes \ install dvipng texlive-latex-base texlive-latex-extra \ texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended\ latexmk python3 -m venv venv . venv/bin/activate python --version pip install -e .[docs] # The pipefail is requested to propagate exit code set -o pipefail && cd doc && make $MAKE_TARGET 2>&1 | tee ~/log.txt cd - set +o pipefail pydicom-pydicom-20aa4b7/build_tools/circle/push_doc.sh000077500000000000000000000066721515706620200231640ustar00rootroot00000000000000#!/bin/bash # This script is meant to be called in the "deploy" step defined # in .circleci/config.yml. See https://circleci.com/docs/2.0 for more details. # We have three possible workflows: # If the git branch is 'main' then we want to commit and merge the dev/ # docs on gh-pages # If the git branch is [0-9].[0.9].X (i.e. 0.9.X, 1.0.X, 1.2.X, 41.21.X) then # we want to commit and merge the major.minor/ docs on gh-pages # If the git branch is anything else then we just want to test that committing # the changes works so that any issues can be debugged function doc_clone_commit { # Clone the pydicom/$DOC_BRANCH branch, update the $DIR directory # by deleting existing content and copying the most recent version from the # $CIRCLE_BRANCH, then commit the changes with message $MSG # Note that we use [skip ci] to tell CircleCI not to build the commit MSG="Updating the docs in $DIR/ for branch: $CIRCLE_BRANCH, commit $CIRCLE_SHA1 [skip ci]" # CircleCI version 2.0 builds the project in $HOME/project, i.e.: # /home/circleci/project/pydicom/dataset.py # note the base directory for the repo is 'project' not 'pydicom' # Clone the $DOC_BRANCH branch cd $HOME git clone -b $DOC_BRANCH --single-branch $CIRCLE_REPOSITORY_URL cd $CIRCLE_PROJECT_REPONAME git reset --hard origin/$DOC_BRANCH # Update the doc directory that will be committed git rm -rf $DIR/ && rm -rf $DIR/ cp -R $HOME/project/doc/_build/html $DIR # Set the git details of the committer git config --global user.email $EMAIL git config --global user.name $USERNAME git config --global push.default matching # Add back to git the doc directory that will be committed git add -f $DIR/ git commit -m "$MSG" $DIR } # Test that the vars have been set if [ -z ${CIRCLE_BRANCH+x} ]; then echo "CIRCLE_BRANCH is unset"; fi if [ -z ${CIRCLE_SHA1+x} ]; then echo "CIRCLE_SHA1 is unset"; fi if [ -z ${CIRCLE_REPOSITORY_URL+x} ]; then echo "CIRCLE_REPOSITORY_URL is unset"; fi if [ -z ${CIRCLE_PROJECT_REPONAME+x} ]; then echo "CIRCLE_PROJECT_REPONAME is unset"; fi if [ -z ${HOME+x} ]; then echo "HOME is unset"; fi if [ -z ${EMAIL+x} ]; then echo "EMAIL is unset"; fi if [ -z ${USERNAME+x} ]; then echo "USERNAME is unset"; fi DOC_BRANCH=gh-pages echo $GIT_AUTHOR_EMAIL echo $GIT_AUTHOR_NAME # Determine which of the three workflows to take if [ "$CIRCLE_BRANCH" = "main" ] then # build of current main echo "Performing commit and push to $CIRCLE_PROJECT_REPONAME/$DOC_BRANCH for $CIRCLE_BRANCH" # Changes are made to dev/ directory DIR=dev doc_clone_commit git push origin $DOC_BRANCH echo "Push complete" elif [[ "$CIRCLE_BRANCH" =~ ^[0-9]+\.[0-9]+\.X$ ]] then # build of release, matches branch name against 0.1.X, 91.235.X, etc echo "Performing commit and push to $CIRCLE_PROJECT_REPONAME/$DOC_BRANCH for $CIRCLE_BRANCH" # Strip off .X from branch name, so changes will go to 0.1/, 91.235/, etc DIR="${CIRCLE_BRANCH::-2}" doc_clone_commit git push origin $DOC_BRANCH echo "Push complete" else # build pull release, should be regex ^pull\/[0-9]+$ but lets run against # everything that doesn't match the other two workflows echo "Testing commit only to $CIRCLE_PROJECT_REPONAME/$DOC_BRANCH for $CIRCLE_BRANCH" # Changes are made to dev/ directory but not merged DIR=dev doc_clone_commit echo "Test complete, changes NOT pushed" fi pydicom-pydicom-20aa4b7/build_tools/sphinx/000077500000000000000000000000001515706620200210565ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/build_tools/sphinx/github_link.py000066400000000000000000000053041515706620200237310ustar00rootroot00000000000000from operator import attrgetter import inspect import subprocess import os import sys from functools import partial REVISION_CMD = "git rev-parse --short HEAD" def _get_git_revision(): try: revision = subprocess.check_output(REVISION_CMD.split()).strip() except (subprocess.CalledProcessError, OSError): print("Failed to execute git to get revision") return None return revision.decode("utf-8") def _linkcode_resolve(domain, info, package, url_fmt, revision): """Determine a link to online source for a class/method/function This is called by sphinx.ext.linkcode An example with a long-untouched module that everyone has >>> _linkcode_resolve('py', {'module': 'tty', ... 'fullname': 'setraw'}, ... package='tty', ... url_fmt='http://hg.python.org/cpython/file/' ... '{revision}/Lib/{package}/{path}#L{lineno}', ... revision='xxxx') 'http://hg.python.org/cpython/file/xxxx/Lib/tty/tty.py#L18' """ if revision is None: return if domain not in ("py", "pyx"): return if not info.get("module") or not info.get("fullname"): return class_name = info["fullname"].split(".")[0] if not isinstance(class_name, str): # Python 2 only class_name = class_name.encode("utf-8") module = __import__(info["module"], fromlist=[class_name]) try: obj = attrgetter(info["fullname"])(module) except AttributeError: # For some reason DataElement.is_undefined_length causes an exception pass try: fn = inspect.getsourcefile(obj) except Exception: fn = None if not fn: try: fn = inspect.getsourcefile(sys.modules[obj.__module__]) except Exception: fn = None if not fn: return fn = os.path.relpath(fn, start=os.path.dirname(__import__(package).__file__)) try: lineno = inspect.getsourcelines(obj)[1] except Exception: lineno = "" return url_fmt.format(revision=revision, package=package, path=fn, lineno=lineno) def make_linkcode_resolve(package, url_fmt): """Returns a linkcode_resolve function for the given URL format revision is a git commit reference (hash or name) package is the name of the root module of the package url_fmt is along the lines of ('https://github.com/USER/PROJECT/' 'blob/{revision}/{package}/' '{path}#L{lineno}') """ revision = _get_git_revision() return partial( _linkcode_resolve, revision=revision, package=package, url_fmt=url_fmt ) pydicom-pydicom-20aa4b7/doc/000077500000000000000000000000001515706620200157735ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/Makefile000066400000000000000000000157711515706620200174460ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* -rm -rf auto_examples/ -rm -rf generated -rm -rf modules/generated -rm -rf reference/generated html: # These two lines make the build a bit more lengthy, and the # the embedding of images more robust rm -rf $(BUILDDIR)/html/_images #rm -rf _build/doctrees/ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html -j auto touch $(BUILDDIR)/html/.nojekyll @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pydicom.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pydicom.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/pydicom" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pydicom" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." dist: html #latexpdf cp _build/latex/user_guide.pdf _build/html/_downloads/pydicom-docs.pdf pydicom-pydicom-20aa4b7/doc/README.md000066400000000000000000000022711515706620200172540ustar00rootroot00000000000000# Docs with Sphinx ## Building This documentation will be automatically built and generated with continuous integration, via the [circle.yml](../.circleci/config.yml). To get started, create a new virtualenv using Python 3: ``` mkvirtualenv -p /path/to/python3.X pydicom-sphinx cd pydicom/ pip install -e . pip install matplotlib pip install sphinx sphinx_rtd_theme sphinx_gallery sphinx_copybutton sphinx_issues cd doc ``` However, if you have need to test locally you may not want to use a virtualenv or install dependencies. We have provided a [Docker container](https://hub.docker.com/r/pydicom/pydicom-docs/) that will let you do this. To build the documentation run: ``` make html ``` Cleaning up the generated documentation files is sometimes necessary before changes are apparent such as when new reStructuredText files are added, this can be done with: ``` make clean ``` Whether you use the local approach or the Docker container, when you finish you should then be able to cd into `_build/html` on your local machine and preview with your browser of choice: ``` cd doc/_build/html python -m http.server 9999 ``` Then open your browser to [http://127.0.0.1:9999](http://127.0.0.1:9999) pydicom-pydicom-20aa4b7/doc/_static/000077500000000000000000000000001515706620200174215ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/_static/css/000077500000000000000000000000001515706620200202115ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/_static/css/pydicom.css000066400000000000000000000033271515706620200223740ustar00rootroot00000000000000@import url("theme.css"); .highlight a { text-decoration: underline; } .deprecated p { padding: 10px 7px 10px 10px; color: #b94a48; background-color: #F3E5E5; border: 1px solid #eed3d7; } /* Sidebar */ .wy-menu-vertical a { color: #333 !important; } .wy-menu-vertical a:hover, .wy-menu-vertical a:active, .wy-menu-vertical a:focus { background-color: #ffdf5a; } .wy-nav-side { background: #fcfcfc !important; } .wy-side-nav-search>a, .wy-side-nav-search .wy-dropdown>a { color: #3f7cad !important } .version { color: #3f7cad !important; } .wy-side-nav-search { background-color: white !important; } .deprecated p span.versionmodified { font-weight: bold; } .wy-nav-content { max-width: 1200px !important; } /* Spinx Gallery */ div.sphx-glr-download a { background-image: none !important; background-color: #ffdf5a !important; border: 1px solid #cea455 !important; min-width: 20em; } div.sphx-glr-download a:hover { box-shadow: none !important; background-color: #3f7cad !important; color: white !important; border: 1px solid #3f7cad !important; } .section { padding-bottom:20px !important; } /* pydicom custom */ a:hover { text-decoration: underline; } div.rst-content a:hover { color: #00b0e4 !important; } a.reference code.xref { color: #2980B9 !important; background: none; font-size: 95%; } a.reference code.xref:hover { color: #00b0e4 !important; text-decoration: underline; } code.literal { color: #000000 !important; border: none !important; background: #f2f2f2; font-size: 90%; font-weight: 500 !important; padding: 2px 3px 2px 3px; } ul p { margin-bottom: 0px !important; } pydicom-pydicom-20aa4b7/doc/_templates/000077500000000000000000000000001515706620200201305ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/_templates/class.rst000066400000000000000000000004421515706620200217670ustar00rootroot00000000000000:mod:`{{module}}`.{{objname}} {{ underline }}============== .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} {% block methods %} .. automethod:: __init__ {% endblock %} .. include:: {{module}}.{{objname}}.examples .. raw:: html
pydicom-pydicom-20aa4b7/doc/_templates/function.rst000066400000000000000000000003451515706620200225110ustar00rootroot00000000000000:mod:`{{module}}`.{{objname}} {{ underline }}==================== .. currentmodule:: {{ module }} .. autofunction:: {{ objname }} .. include:: {{module}}.{{objname}}.examples .. raw:: html
pydicom-pydicom-20aa4b7/doc/assets/000077500000000000000000000000001515706620200172755ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/assets/img/000077500000000000000000000000001515706620200200515ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/assets/img/favicon.ico000066400000000000000000000021761515706620200222000ustar00rootroot00000000000000 h(    tFPMV^[|S[YS\ZƤzʫǥ{͸sRXY]m)v6p-J`g]NOPOPjy:EE|>_xk[^]]ep.x:w8x9v6t3s1x7MUSV_z<~B~Dhv7}A{?hv7~A{>gv7}Az=ku5}@|@pydicom-pydicom-20aa4b7/doc/assets/img/logo.png000066400000000000000000000130751515706620200215250ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx{xSEǿ'IӦ6-ZJ)( .lWwYw[Vu*lW]d V~]Xj -b)岔J-^4Is=#IJsR䁜s23|3;Px\x\ xxxxxxJJ|$4قНFeOǗ 5s-SAfUٹsAWh(&(&T&Zm6fJeTURp^S`Lj343#i?|Pomգ/uu}=}ZUZ]kEK /FdẊD"p "%%>(Fl[Z(+SEE]%mkwc6M(&(>-ăJtߘ_deE񲲢~\;0H\c0 ȷvya EÆ`Ҥ0!"d=ӧ矷B1gN8eK &^rEDs]V+ @(7qd **RPP0gG sgɹ8yg"67>x*2 `֬|($&,gKm["RSC*T&| XT*{,BPT!7*e8@üya~0_I8(kr߉0|M4J*D>ܹl#Lk` $gH$l>&kΜl͉ʝ{F ``ɒKoEho?|f#ys$>Ã4tNkW;"#ض+|9ɌաNM&Q-` (*Bl//7*q阘ŠP?Lxxhhh$(.V@'X0>0d0 .)XP*꫎*?V 1{v$~Z_:fWeBXۂ󿉦&V݇W^{J+rʊ?`7?sF矯!$%| S1.( 7OO?pg<cdž`͚A6{@5cJˏ~Ŋ"FIxҥ,J`@aq Y?==&\FEUUj7DvhC.eC <\&Ӄ1l#]3`v9-+o!%%!f3 l,ZB+~@YY($j&p}xqdh4JKrE0V@@ ,]_vgfbBC}%AxH`Ȉ))A@̘3Bڪֈ 88LG|E $%a +~J`(~3 '6VKˎI] {U-`A 6B2v#T?%DVQZ ԩ$%d1o+.^Հ-_%[qjk|K޽┻} GϧvcLFO܌J5LADX>V/,td*aliy?zc^_?kӎNg`pT.@WfLQ@J:@ͼ;V^߱MK/ g-FvH`*] ]͵\)FXу BH&?cկsJ_ ڌ`)S麰Y͵x?̛ 2oFE9AG$%3`47vWSo3 tUmbֱØJe 8uJ:ۙ3'F\!Lk,Rla@X04]|J/֮m)+Jٛ @,BPQDK^@Jen. `tSKJ]+ޟן}.t짼]'@( l}\4Mph75\w/NUXpTnd--E} Y @ӀHn' (H rv2Fdu2&k*+S Y?o2P~}e[XcT ,ZT/ bc}sg&OfomPTILzDw_c F]BۡVNEM&r>bӇ 9bhnzǏ+Xu\WTo i'N 3x )BۑB pP7 v,<0t4'W6],>^{㍡HM q< zC` GY:J͡F.Hôi,AQ%~˖ 닊 %qޒ1QX[yX$$:;PT xʕqQ+W^a59s'N(d 0h$\7x M I*;7M& ^}=n9s, &uKDD~/26:`OX:?;70O>wmd <a g3&,X4M[Dpށ^} xGSSĠiZUZX= *LCXE*{曎\)DQ%b!SNK zxH' 8W!;"ߌT踓3F#Mj!*(,kW;@$K$myΞƍرߘF$8X)SGc>9N!(jDvcWB`/\l)%TzA.7\r%ƩS*&Ipnmc:}NoAA'N+5pw'b6vС~Xb8mk'$qEr&@ysRS1iRcudhm=1<1 jtiS22o[UUjTTpcqŤIl"fzw3 @*a͚ξ}J5^xnSI22BǣX<;Wǚ )PoҊK8qBQ?uj0&[BHFyT&T}|xVDI`sLfײ?khjE{ 1s%`>>x>TUMTNLy`MZGغP? FFƍk`kOf„ TVN[o@@aӦfe5fT]`6_}Չ lVk**&"9955de߳|覦iǸ('O*pii8}Z{>hrj| sFb(L|Ф#M?eX] hl`͚Fطz 99mv X6MMӰwo2Fǹsjde׋/Fs]SEE̴t7>{`r)EAA3 ̌SO`{{kW[[䢯wkf36Njhk0ЈOܬñcy@ 1qG@,| v ;ܳGk28Y iWU0% @$?wdr~~<41RSHKc̘P!{LCHێm8siPɏ^1سG*/2ߟD+0o8sϫuuu+'O* YOHFu͕p(0EẏDGt+㐗nsјqZ?h.5"$ l™8&Z~Vط\W8|hb0VkhfU_ݣј{z{JS.7ʛu]]vXa Np>\h;ϯjii>HLwE<N޺A%. u[鞀S44XK`BqW{> @W .dzFܿv̀:D/ @@}rXcOpvչOl{NnZ]fw aC1 >>fc(Wnɓ],׭ݻ`6{`ʔ0:>iS, $DKv}LaC "wSw bo_!?lj G6Ξa^}rr莰*g#$K1,K^ ]!Z}̛w- :0h\|`na^F`} (D` TEmtVbd0؇Z8 ,-;&c?A/ڈ[gh$2DpB{*9yLGWpjc1}zOyaBm!!$1Ǽ0>##41p5b;jVSn{j^F㍑Lf@z%nps^ pBח^?O d"0,\[CJJfnBc 8@OUU.-U"(H/! q/z3rÈ [ 8Zm jTWkPب~, (+#3j  \p |xv|+GطXXY#!D` ;e^y_lx~Ol(>e X$i6-m#ʬOҟ:yQx?GH"t m $2;Ez @(NIn l|Ge&w$bÆlJ2Xd<@Q Ie߱~EJ]H")ylsI?K"/Le)I?D,t`<(vUxo"4exII%kѬzM(5D,c: x@WOٸӊ-I]zvNmu@2I_`: ɶ:5eHZ> 8%H!a[4$5vM;-ڒީg7Tw/[0N!I 'tmKoj+;)?V,nD!]Xd 8&jTіukIz_g:&mt:u;{hѥu;@KWl[fFvt1nZ@Żٱd ʶEZ;}}eExBI;gh/v'2Q HEjIO8RApe0ӫd*e:AXߜhM mX[˶$ut@TIщ M :ʶAtZ(XDSL 2ʶAm]ݾ^} mTSN4tl´BvwDm:;*Xv[h'_m:P 6W-^'_c:P 6P%N4mBH Iw9%xeW.N'tQPe){'tQኂe*?N4~ lI%DLeQckbʶQ),(LAlBن+ls$D5؂mPgmb2b6\~D` sae` @ lj?m:Im?lXD1ʶQ)\ @}ljh: me$Z_9jAF6(He$^۝h| nlL~DaAB6(5۔mqo6\2{hCmPg+wh!򍲍c?0Iq'o0$(;ka̔t/luAy`\.u!򅲍c FA't|l JYʼn2"(&@T &M%ʶAA mْ~d:D.Qwm0W:MʶIFN4t\l dQamʶQ(AJI1b(e rN4~AFޱS9x EFq$m:xQwL]Dg:xPwmDL"nRJ&-P*Vo*d*d2d*d*ޤzz]H<>ܮ@8X$=-A6Bu99V*VGWO櫻[]=jRKGWN?L@\,Ce:HB|g>`z)5CMjv=܆ɚ0_j$6$L}@u*U7RӫMsٵdP &l[ RYIʋ2wa<;Vf5w:;zjuhf8ҪT* Ψ̺kȽCi5Ze:Hlȱ}ѲYZd*J=)v ~e:ai͛)9unIzAd{7T u3Uiq/\Tמ5OWG6=bX0S[>_aNyQ,黒.5d8L鬓kN LGd*_?^?+Ps^ٱO>c,UDy["ClA@6[wZ vlW~vp=zquoQEi׬ڧMe$Y* g/PdIR J}On]VeaX0Sn5@YANd{UeapRv1ou;۟ӛ=ӫg6TWOu).*uDRV%b'L+׆ IW9W?fmIZ]/^Z+=V.i f(\8ӉƭтNpҴIw]_R5%U\T_ZfcyIάULI0?Q%a}.ֲ9SLDZFEIX_aN{Jʳz=Smu2! Ill#MOb ;Iڍk4x>yf}VE#fJɪo>Gݽz~E;]tZPHRB͝Z Z0Iƴ}6R@698kJ:w G1jwQ֌޻x*֓//Vg7]ɮvS)UNPAZ'6{^@]Xo{b>1B?g~QgM΃M#NdP+>a:H '2C7,ypwgo}\Ֆ?R xNs/xthF]$<Żm]z#ڰϯ./ gz\k0y5ۡ􎋗oYɢTZߤnڠ-I][/y_*CmE^wOVIx-@R.ӦC s׮ -Uȣ+k՛L z|VuƧuhSCG7+oYHP(>e$w:&lϘ\N7eBz(d7?/I* l-=Һ]Y娫*Օg~a/,` )9|߄VpW2a=kB**l%VoGLj( 83BS?y1fىW:vuyz5L,{9 4e2BoiI#]̳':}^wSW9`OiU*-z^aQHLܷMH_w>p 4r .}j/ /Pb}5YmwLQa1PHsI`˜h'e (UZ:k jJU}CDP^qUI+3ɕ?JfԌ9(oR mK|I}W B!tY:zQ򦮺LźfBZL]{43i7t㗞6[?%0쳦 gn38ljO&ם&*B}wWM7f}BE*(*ִ鴷~Je}Q[pn~٪(w'mIRy0)"s.;/=t u$˿׭lPGwtJdREǗu N Β9G^٣OAoj3?utMCNK"/u2FqgƋaDIPxx4xrzRV~E̹Ye-{íǮҶjVa!kUu2_@ x%kOO2]|ђ=O?ןӢ-o>yGnX-N4>ۭbKNMkre }Qgwwv̅I(-lۄ%I<߄͙7t +hKRGWrğkmVz}qt. oZٷܵiAiP:nRJ¾/Ɖ<]9ysȿtZzt&ֽzyǾB|v,yl`x1kF5v xlӞI&uUv4 + raWϖfgC[yI;4 `,>DyÞ,/Cxa!oOڰkmsP-]"Io Jxtoc:z|~Gw[#p\> Smgt:m0l=Wo`mwy~Z݇3m{%ޝ{ld`m-qcڲЈe w*۬6{\NNںvhcޥ Oc:/u$vC`imlѶ}GaMVloԉ%b8e;\X gL1|efjM-ں:l<cBAҧrq09T]5ՓT]-Z};>jnӖԖc`$}tDң_%~P?:+`DI"e,!dJl9?KKCL%][VK{gж]p8|tD5KqfIBҝ=e4Ջ) /VsSNm{HMydpO"i$呞D:^HZkzcWU~.-B17ӫ}Mآ.W`D,,Y:I?s)Xu):xI"Pil`Jzz v2#mآvSfPoI"$=xRŒ5?jIA-wxTZn=H;NCuMTŤ'mEvJ)Ir$]*IkϛDzPS΍l vwmhiҾfoj!D|)%=wkN4J}sdc` ^DD,2=a鴴v!yN=.jyojѾ퍝K,rN4^%Beޗ*F3XYO_g:vlOo}wՁVojQK;:WmD,ҢUwJ/t$+/yVrqdgOR;uS#>7ԁ#mԒrHHR"yE'hfe&KFR`07:{Hx^l]ٞQ[Icպ]멭;6ҏT*͙}] lj6NHJ8%A%].^h2C?֕mN;{utS[iaNu]ZuMTŔdpH_K7(s$0 F~)ۧn&ۨ؍:ԢGԓc'\lF"'D㯑IIk̦>W;Ș֕mL4w7lНOnUgK|{z~. `$_Lp$hPfX_hUٞZ]R1&dV/usՓ\` `Cr%ݤnk4] 6޻7w+{Z7|>VQ\ `& IDATXjeXKIYkK"G;&*,yzuS[ǎ!~LJ"YE&iH6 @̔tX_dYd{f}K󔎴h@%bXL|T*FM1/Xd]"Hҍ17xl2^Gש7W}GY O$-ߒw/^r֔Ie( 1í>q\GܐE'bw*sL[%. )sڽdہ{ ݔ2D,I+?w8iLKI)u}Cta6%bD,yI$=h:߹t,OlVY>md(LI"Mg++h<[S+JLGݷVk2óXFD,қEE[$Bt۞]i_+{7<~tm6H"tɖtZ9 )mH"/J:[HҚ][aךGюcxk$4KZ͒rt4ۉgD{ʶe[tϣhQ"I'btæ𬬖XQ B./6Mzv:Y"֚ZJbEZUvdVIKr">r$+va]-=]o?g, CJ"$]" 7d'QOݫM& ` qXTss˦A0 7qJٶ"$鹭./!1& `R)ev0Enc̉Gze]jϥ`(T(鬑`Elnt~3eG vjC+vw=wmj31'lD,W5Mg`m[Qۻ{LGcŚ^d$bG%}t@5Oi7BlD,rJh|p?l'Siu&Mǐ$L$=e:+ ;ݶlKLˊMG 6?I""! {=eێ=gj$b"Ɏ` 'L՛)~ke$(IMsN4>dluٱ#\Cm?b ȗ%t֨tXS3,h%&0so8nPZS7u I(ђcm~EKad{s}V/vļc-e Mf!Xϒɶ$^Vm{&ےtYϟm'Ƈ%IO|Кe-%)$W'~\LXdOA붭)ے]톚r]tkc1$=o:۶l:f:o>okc/{$b^I3QvO7;b:LYLM"Wҳs0=V׬vg^ǥ1ntetAe\ЏS`?'­IN4>VmZԛL1@aAHW:)؏ FEj:c\$iUM}۔* ڣ潯^O^d2AI5Ownަv1F4kJ>wANbTaW 8lKޘnY ogor$@prdy~uےTU -qM6J"$t(T'^7W*6cTot ~ʶKId[~jju݅~ߪ)]FD;mIئg0cL޲ffUf\-lɶ$V$\XeȱZMWEN4^驲Km:ƘuRe3G}Ϻ6mћ۬3@zlt߳;L^qʊF|&>{?޺xxlK]Om1atKG|)mV䝷&ےy_^yt1fBo~+~yd?M%'0f!5ˇߺ)G(ۀyo-ISݽcٴaIV7'ݽzcY2g!ob lɶ=%)~[vdFE$1@^yl㰶o6cLR#ooo6o=[%NMS#LVN6kAٍ/\2߂W%v//vAg55&ۀlKxF.'I_>4 (ۀl7v?zsp6oڍD=]Fݍ'%/zpk djq\Aٍ/+N}w/R ksMWmImz|þgɶOnj y+1I?ґsI 3lE>KcM \@0eWv5wAlgsȅ4`''/To:jl'ꮧSsl֞/5Y_< ]HVc:kl|Vv5/#Ib=LHҊyu[UQ! KHc=ޔ>H{noe$Y<[]h>yYc0tyd{83y|iX6Y]y9- ߼ml;F]_٬>^y<}5)X srd2 H\}k[/^@`'6L?/qF[◲"a-5-m be;z~ g5~YFd{$xiy r Ңlg7OQm?2cɸm>g}ԙ9LVYm:kI")tc?}D]z}`((7sNnA"*]ݖgoS>G;٬"f.,g]s X _Dt/SOr|&4\/^wͨ1$'/tyd{"ڴ_1fe$MelXxEiX_aL@*JIa!z]Alcb}5j)e,!v.}znPj=UKןRB< xhn}dè d;1:Z{* (@0(9s˽/l9MS>N?U/7'-ClL:-}wOW 䨷ku*3Y3ѷzi-Que;R>֡o>d[Ǻm&^HWs@\e:P7~nlKXJMmr6?t dznyDŒ^o:W%(y֕-fOn?m7CA(9KTvNK$q. 'bn7Mm]?}GnI>S#rF+J[UI0g:iڤ<ƍ%$@mo;ʶ atP\UpKwvpB&۶2,&y|3'WW,`.4tbm+,#1@jT @֜h<,6IMg` XqP-cQlJ-;JW%o:<>k=gw<YSfOּj1Xktp?l[H)v D$}tVl{˶WHgQ7:GTa: tIznzHFMW[QSgsI'J&b~hg 0w&6mwՋ>F!Xk؋#%ʶu>&iޛx,DH6zmm&me Ig^}ײ$Dg(6l{ϙReoٖLs%/tV;E6ʶeF6H(lvhI!F\-Qvee$t*x]9qL)A \ 9v@fԘeN4~2)kKmx=sl_F"I濵@Pm~bm2I'_LѮ3E$ʶe<޵[6N4Jms6Ol[G^Z\"ҌR5Ԕ h4tt_6OP(i1eLܩ'k_Sr̉K%"FQxWD6Odm!/-s,~D$="6y<4gDʶ|cіxlϪ4@9咞t,Od{/6ɝ 9.,Ip` '_# QփX''3ٶ̪u)In̜\Ɏ$8dI_tAwa?(o s hܑII x(~e$#M/X:$d_L>tx"=Q-e$#žo26`H(. qyeB^-MW5.ɍR&8xJ%D-#.'ɝp@].2ll"4R-Ѯ=dٞ]W2&7R@ 8tqDjKm+yw,^zm _h|)SO1FB?$̚RK6&7zS)_qjIoR`;r"yy/l[Ȼ큹p w{H2d;^L~2`L~;S-)~r.[1`H&lD(sәK`W 7%$eJ^ړ.\BO%:~_&ؔE(2paϪ~zm^}\r ʼnk%]Ef@^Lh Dٶז,5UPHן$5uD%-Bi LLh Dٶ&jU7kV/ EN8xeXKb2=<1уP-䕡piqX g}ҴI˖L{ma eTϐ4K <A(d; idP7pVP+erң_c%~_'4dǹ8eB^( gԩfogޘlOw KKJ*=?Vb$)ߓV IDATʶl@rZmmV-=`2jI7 W͓譯ZUL_[g;rDl[e$fNUMEYWTo##wK"m VΨӴwqԿ ܱ6AөDٶMHOu5}ߟAl2 mGOs}Pʶlsk5es(U  k;\4clϜ2IMiSi`*8آ1{rDl[iZ8^3'W7Qei`*w=)lvH72YghጺwQm?)ȏH*l[@BZ8nmثˋhZM Mcw%(_l[vQaN;MK2}k*Wढ़k:p|m!7/,+k*/){l~C5lWKHm 5ٞTQSMS#g̟Ͻu*t1䉞ܸtGȣ<eBniZ4ks]rl=íZt m k/>Ex-k=/:i1@|mP(祯@K4by>tiܓrz.#w|-_GٶT(rXKEZ6o*ˎ]\Tyl#ڴ K'l[*붫Jlt./߶ZLjN"nm\fJ-ݠ~^[/<ͮ IҺck]NFٶT.&sk55yr~jq.0!NFٶTP]=㻋aA(EP;prf }TV?F@%%}Һ,UT4ˊ:eBKN[/Xim=7 Xd'l[]U7RgիMi&SwVTxכܑ[m1 i)UW3%3kkUä\}Mzc'z 5]Jf z ٓ4WS-P[-{nY_S3.x }٪./v3g:ܪv&S'l[lu򬩪xc($]%z%KU~Yϫ'2Wm5L奚0y-%4t_2PBoz|>=n E @ٶi f 9^P[WiJ7 %}tʶ*ڗ6[}* 7Aw_7jV1@})4ApQ>t xҦG^2nI2Bl{F2}UZ2tOI곷>^. >E:L(۞pz}$h1I?4ʶB! ]2h'dv'M"CCٶTEIXxJY:tO;ܡi1;tQ-4ZkWivMDwoR1{'Y};u{vU\ecmM(07w ;< 7y!^!<L52Xnl۴Vڙٝs:g~9H_ NT_G¡B"l;/^ϼs"rKst) ? v.L$:y=7\w_}R mO;M㤤[L ajˋ\KV/6]JAxx 2t > L a۰W/o|U. 8ɂH"нHmxY7\,kp_sp Ĉt ( wn.Yiqc@Ӎf[#ᐣ lYMYn}Zc׭5OtzL瀤.b6f`/"ݦ¶Eiַ>|ʊ*m}_>mK/¶VUmKog9,!郑pȵ7vՔyJK)Om֗ڬQv`Z$h\sDȵZ\Qlq3Çw)#,t[%}t"lSuYkPSfH$?npt)QICQӅ䊰=}CjU]R XLz&m:#@ts$c+$>xn2]JA8֯[|A]XI3]UsHU`eR ½?ڥ !$KMn;%2ʳʳ.{_ҳZL#.=pt!V"lgiiu>~p-Gu/s4C.j,xjgQ_UOp2\m'ix,f< Lb,TZo\ E?lӣO.8SB"aӅ؉7=h3x5KpD2;6mQ<*Hֽn5]D>Ө.+ҫΥ}hRB:&vot>2\ᙽ-_RRkbAB򅰝ƫ]jw/1] pD¡ 'v ^G篨1]jӗެcKH8t"򍰝š LHdRw>sP?ylr;|%}t&S`eD/"gMa a;M8OlԷ۪xBZt"L"lP^4]c Em'f?CM]n68K b 1dzOyK_{Z{]tS} `Ò Mb2㉤~^ݾqgէ]MYB` MpؤӮ@cFg|C$52]SS([c$[t;_Pd2=:ޣd2Dm )&F¡ͦ q*g;wl<={HЈ4vhx,1^:@H8"B:fx,ު ߜ vs$"ja9y= bwȮ&}ޗ42~z˞a=ަh<>{-/ҧ#7Md3D DUQR$DR.Ӯ.Y3,H m#l38Za{h4ym91y-HhvuyHXpO$"܀BИVU.RpE#cQ>ޢ̻̆ wp{p v ݃3nq_<)Ǯw ki'AmCa7!l3NNd>g?r{3i+6/)#M6 %l?EƢwiӡ ߚ;6-)pLF a[:Dm:m؍H8cӅa;!ww^쉽ӮnTcg-cDоt!nFNc$Iicz2|+7m ΰF¡Lv&m>aBBt]_{S{M=  $(4.yt YԣN9PS:z\p$>Y?0>}s@3M^;֭ ߲ $pCu HqO1[34O >ϖ}gC)}t!vDR{zLR2)}-O̖ D%}m?vN8swҦm{GD[o؋6/͑pW Y9#N [z?kvoIp# v.d2ag;7Ocјl7Xtdmi fgq_;ftx6N)h:H8?tM$:f1,ޣDA'L>$#pQӅ =:Y:9ym=1ɤz m7.&h;9u9KlN2)=tW{pt\fOa7pӅ ;t`ˑvjƭG{z_Q۟ N /D7"93mƃSf%a F$}Rp~ĘH]ĖEԞiלfۼ$phB0?t(OLjOlO≄Fǣ= m,%I&hy#zǕ봬{?ĴN!P$ ar۝dˑםvG_\/Hj"d1.CضȣOGǻ,&#)+ h P"=pH8dߩxp,¶vhFc:1`CE&lW%Il]pI_t~$b`aBXB_& xC}3>t"l{=c(X I?tn$l$RŚ{o8o wxڞKg[VU#[ogI&Nh$j4] mgO{l^,( L{kչ˪* |{I#["NY6ٓ{qOsV4г48?ǏՎJz&N|t1p&ҎMI߽#mGܼ8Rγ( θnIgQv)M,~#9{^EضxL9#1G2Eؖ_w^'oGv9+}'xem ٔp7kKYl~W7r`PLm:HkgY;tOk-:VG LwG߽v|=<ScrI[)wmȪK$}^H8t3AV lQ,ؤaIތ#%7g;sg[֯l+J`$&Bv8{AgCc۟xLeoG2߭R/ЊE幖@KupۑphtA(~EzzoƢ49KI v. aZg[Jt5}- }#pea a᜾ެa{=yk/S輾X pqat%8zӅ=/Cҏ$0Bv8:lK X{?͙,X$}_]pht1@*msIfOx}˥i>Iwi:ےtEzEՔ}&v/Av8/mf{QEq }-9 */h"`&u.¶ùmE^Z]wr~P81IH8p-@Z ¶$5m(\9plg# 9-jJFz,4Pa;C}tOykn#{I ؎p2`żTox-/VݒD~8 +¶ x=%_4Fbu.+ ',/r$&H8D a<԰m$Մmpm:=t1S]ȩ-aζ$bMՔg{$&i^`G¡GNMH=7Oc:kb,.S$3 i$pj􉽎c- M"sDvٖX\IOtzk$J- p7¶ d4jl{yju:\?2.#3T8`۳_^î$0wqI;%=#QIH8g$]Y[~7{*m}y˫m?IIzoCla}i[]WaiQ<"IxYLvG¡fK@vLGk EWp+ժ9I/q:H*.ζ?Eg8y E  KjV (%@A#lcHپt"}߶ZY1aX`$ueϩNuG$Y]m#wfް>u# DR{HgXҠneьrp 8qf;ݼg7l2F"I.b?+=NyFC#yNl.+Һ%Uy1IH8t"Lż91lloXW| p2¶ 8qd==- p6¶ 8L>.u6p2¶ 8qdyIѴ 5eZVS:NFv'v+K~%+'< mpZg88rj# .p.¶ 8]qFWuj00B"I#m\mpX֞1B+6p6¶ 8mdeEf}ZGƍ=`6mpIQaV)4| N ^5f ya8a2FxKV/+"lg#l!J*K >k1Xv#NL^g1ektFBg83R2\xJâ*U|D%+@Nf>aV;O떞j:`EMa<^s$-]$'I* u/0VT':4. -¶KnWhHwݹ-/9k.qgz~ՒKJu5w 9` a8a%|^ES*O6p:¶K Z\U>.Y2I&C-}Ȉ:O]>mNZ<÷8H.@v Od2&sul}|d^a%g5 *8vItb}M\h1].aхTUV2yD_UFO@sM0+gzCZv}^]ffGSMyQoh]1`K.SYqpڒR}hYMϲZdWBv +;%E]vC..woNKK-{7gtY!lU3%Ex2堽A[ \VԔ5 YVSo-r~ЖBv\Hʵ~yWg/<[ p#¶dHaQYxB5/_e>&x2挰"}:kbWWL~eܻPIнԿtDQe̙{K1FHUkioGC])Mnu׳L0/m9]YZsM[)Ie}\ogyQ.`^.r*l>kX53>R_zUZ|{n%.`.y|q,M9VwmP糧zpqu.` #-+פz=kܷv:DR~j2rBvTAH_J].'!6.~EnyU,1]ɤn aۥv}PݩnF4]@.y 5KEȸ~eX"A}^yӥP j@vҠ~ERl@vt!l@]ekt)m1]B_5ZRUj[j1]v}ר4h[m?֩?xt#l;g+TR G3knQ2ivs.X+g=jfOmP ?͹ Uܻ_ n!eئTZERl7<𝛕`~0¶Cx}+wh<sj2] /҆uȋo~v2]KVk1]F^zS"A6*;7.#/6i֏m !lDh՗~`A!lDvnNѸRmBY9s?ӥaۀ7,DREo1] מg%A}򭗚.vXB^S{M` a;כ.Teits?-GM`a;iۮXc [_<>KxLb}X{R'_JZd 4uj6] c(p2lsO3] ï_beb.㯞ht)CضٚJ:tx@MdH6^*EI=SH&MXmڰtj-w='Mxmx=}↋Ma'v6me> Kmz-.5]%FqcKp¶MvZ%XPKn0] mP[^o0]F~a𑝊Kp%¶ ޼aw }Io^2Tcgj+y Tmy<._cy{|I}?<>lj+ T.m]NjL1g݃}Gc:ҥs{;BضۮpGC#ӻ٧FFu+>a`6m ULQ}zv_ˌzuSc3IqdFض XvB`FP3ps:3~1-΁Q}㿷;ѱn%Ɍ hdmZ]:^:ܮ];46xTNoh4Cض5KH+Lꗑ}HNZtpsxIY!l[ }]P۴ј7{`xd ;m]߾i׻dKa>G4T.cE3;6wPs@fDak+U.c҃[&GZt'3 ¶4*h'I?٦{gg1-yTA;Ohױ dܐCض:ۛqm=ܤGc$qnIzt^>:Hj˃ @9:ki|^s3w/gplڵ'Z?݉sEa;G+>gꅃ9ܡ!۞iBQgd~i׎wa;G>=[xbu[πv\6@v9'Ԟף1l˳ٍ ;#;>Ԯx""kd#c$k][{303Fv=FH$-t35CQHz\'_lP,Sa;Gnma6@ygh9u6@y6>Fb:maۀj挟I7͡6A6xlɹG6oXKXӶ C:10z"L6X =¶AxBöׇt =¶a[v']N̏GvMvN(Kef ktT[pYue"O8aazt׳Ҿo<[خ- ׭Qq-;=R2?F2AUWSEEva{vMY@t|Xm1Ȭa40_ZA%8aeٞk˂U+. .cz7fkʂ^ٹaU%8ae>FR;}_fʋ,ȯڲLc$ccJ&gn'44FB&ytIy}_`܊B>_܉d4#g!I_aFv!@>-)O@QQ{$qESdp(¶ w=[:l34]15T]ɔ5%*/yBɸ_t@"l1)#$`őkBEv!Iځ`P45 ԉdR[O@"lT>kN칎dj?{G(mWgtNvőڿڜ{Fv|uUM>ȯ5%)?nYW(]*_ $k*&}2͸>}Jp,¶K0Fy(-Rc1jo<ح~]*iy"Ruwl<=tAv|tO-I~UWsgv462u}6X.ewg(WuŐVU˛J'?zldD)O$uVp(¶Kٮ>5)?WTzٙn ¶Kٞ:BR絋_dR=J$)?mPwlnP#llU^rz+H<׫O}dHTy≤=8aۥ}磢88H4N'¶8 ]4xT_U>0/mNHj+J6X r9}psƢ1&XoR}uqqIDAT=s킱vi;,,eG Dq0JK fI%XdZ}^]A܎a>kX4{=]AEVp ̲EU`Ry8ozuEX$ P]uvkQ,.ZӠ`X8l]~*-̸HmE6 `:8y+zI:{58:h,X\5%ZYWB^~l2Hx%5.@N:LRJb9yt 56~/.{I1Ӆ~I.捄C[%}t!Spt S]& 0gG¡LJR$"pn񤤛L2g;t[ 7TCF image/svg+xml pydicom-pydicom-20aa4b7/doc/assets/img/pydicom_flat_black.png000066400000000000000000001010031515706620200243600ustar00rootroot00000000000000PNG  IHDRl$%sBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATxw\ulͦM6 ~#EQDk/p•t  m7lcL̜9g^cs h|L&#IlgJRR~ݽ.YmX2+dd~'@HjѿuvD8׉xloq(%soifu]7HZ-i}"0ν xLRz: @RgjrC 2 @*ګ$-9cu"K (Eҫ:`/McFS eȂDpe/i:Hz xe-i:OcF@R\G"[m6Pz(NV%-Jcf#F R\wOIIzr eѮΉc?54QRBu"[i6?ipDuiehn_`,>"雒:LAϴG*m8hwc'h|J͒^l,aP|L=hо{OWQаsvk(AF/$}16dcN<\?\iIGٞ$teCN7D7tTDMGVr3շtb_[Ov¢L{Ĉ55).EP?nz˚iLz`:HL&`l4AJeeALL4D?-۹tL,b:( UlSee0[-۹ݲz_eeSRGQ]Vdq:Q1$H(.G9MBv&4;LƩs/L ʴxx@IY.A22&#*$Cvi!!unyA22te;כGi1ue;77iQ-~BvLe;74;1>vn1(.D_l6!22&G>oM2ʴ8̧-^EviCPw22&>aWMʴ7,Cx e زiD{v2 (UZ3t([So:IiT:1g-h:)iT*MLe;U@FA%SiNGv"2b2 @ɺ\OMpedavn0MiT4&v.6-iiJ^Xҽ3 ik:e;5eJ3~a:DQQPiwY!2b48͖\`:DPQPIy#E$޲e2ЅAltBLxtc5(((v>k:D!QQP<zmvN7P(((LD$β>en $i:D!PQP)y|ȲL<SvF4 @Ie;!Az2b2 rt2L(5e֑Ҿv5h׾v5th_KZSDB*  + kH*Gơ-nlD߷\s C5wPPrŚiK'JIMEgPuj,s UmU_> ҒOc AE.HX֌͛>8/jKv}x f&FA2ёJ% ztIw>^*vC@yt &E#iv_};TPU4t:t# )+ %Y]*@V*Az۩Sǩ_uyAoyM(YiI"AzB.ʲܫIhӿI흥9ڡh0S܌XEo Ӣ7iJg+k*YS{(y%R< |25kAݿl^_M7޳Plj*z"9IJta2a} dݤ4R{-CW'iapXj;YOҫ{}7zGi45yL"9c%kΈ-Ї=bfءQݾw/էOuP, Kt0Ҍtz˸Mvś΅~oϚ1R_{iPOcʼnx!B>~m|:]2a3R鐜kΚ]<3OZְYν[M9<iWSDsj]0A =zlj _NuyI7H G+67S^ l>܀V] Y/vTϬܒ8ɗ,ۙd:(M[?[jDm8l:}E-LF?>o:<B]C>d[+Cwt&ds[(>vڑR`2 |v5p%[I_oנv_2Vk2PFecT:dY9~֘օϨ"raCmޫ?#iP\XSa:!%Iuuً4tt*TY8ږҺfް_@KJee!EŠDB(kjU~DFUuش9!ܦTw,sk >yx_L1E5Z'#~tt4us_Wbݚ,SE$hR [ןQ/-ۣLytyu: TTXHmS^_W׺=GE=z~6:qX_d(/[Dl?*wQt$gXOR;TxYEYJO]SkR}W$IӒSv]׺~e%5l![V;?+n:J5Hڋ_3w >xU9EY3d@'WCsFtR&)^9Jԑ~Cf y^ۼW.o(*)n2@M㲄jd_ͷP,ugO$EOh3(-I5<1Si`6u@~KԀ6QVI=ԗ?>`׭wKj(j-aœLBe)uOj`U(SI)n,PGwxڒUE[ݷ]c u)&K-9čQW>80΄tG龻RMuyEohjj+WyYn[M!ĵ[5AtY8o@0(¡ =Vz-{-uY}uUD'遟~QmPߊ)8sGM4ϲ+ܾO]iCIY(HZe3F\g#Gw.>g=|>JgBjOտw˳xP1ݾyVCM2TG*tX|h{Js:GnX~5WƎQs{TPFeWdLagXs7\ӿI_8E1\tQU%uctc=S誋U ))zFL"/Jz[7e2ލ"ywK*R:i4dIR&R{*Hm[]X< v&n̗< :l jUuCIPEZVTF5<$}Ljus_5sBR *ӓil'2-)`dBۛGi >ƍ|UOۮ5Qr^2O9_sh l_o2}WLG(9I]2*GN&)ӧo{L(9On|5c>eNy1o29MG(9LH|iZ]{c>ncFHz_1o2Tڌ8]=N#݃C[}޲P.2T}xeY:{.?D=S$]^{LXxѬ._9fN;xž/WL^g:BIyp 3'wZ x)~- IJŸpY1.Z(+tͦcr}癓;+kOӰr H }aOO/A0^Axuuy8uN׻:vO鮰xGT*eI# zfGm_kj1ڲ/I?/<xS"k,۩4U*3~r3#he;B\seM:dҖ#ziqQcԙSF䝃4?xM?dNuC$Is7>")etm׫#VEk~8E x4xl~H,+RRHf$v>{!Oh$&l0vkhؘ3E(6o.3FUO-5IY3B*狥!wKYT>{:tzvczmcҙ S& ;MЩ)T:XDEHГDXPؓlg:'o(:7_lLG#it9@,7e=F4wP3mΘ$y(DӹV柣ڂ^7T'2x$Mt<|ˏet.3!uǂ99d2x3K"ۖ#IL;*e*R&#t5Y&u߲EG',xau^`: _`Θ\ht&= O' DBpA[cIc| q,n6=-ډpD<\M`i{˴Df]"_-splvʻ{ta4IUfubIa}Z;p $ⱴk%3]7]ezL&c2$<Dc$H27ɖꅒgz= #hܠ}?ГDLU46yL tEqtx޾ZIS*ҽ4ͥLws( o錤MMޙN_ʽU^@nAn9b{zҢ1i.eǖHZe:?(ӯ8Vp6ꒉz  `'Te;e: mM8ƇOZʲTѮ2( i xFOiIZ{ezpuQ? 47nХDv^}mPJhP~(n?oO%,5;r EۓiIzymo6#+:eC㠔vv\1e;!Ot&G׌6#+4ꪩks -xlW`ZXR?OiIz'K=$'-ӀʶA>eM/kr1RSޡNy%ek<&+L/ӒӗL\Cvgd:%5+M7O%ՖORV#&Sd?L}M$MGMZRBY3 tydZ[6A~^5=gJi1 {jѦcd-ED5i3?.h:BRP D7(?~ILL%7iݞcd%22(yLdZt:dгKkGkok=JKLfz4oQߕTDY9t1da2-I^1N)oGDL@i:Lit4 Lr_iI{d&{xVe: i4e7N鴳|ʦLRByz2 ˴$jѥTt0JhPi]Wt6 f28eki]%ONTS[fn02 tsGT.l:1.Xdz2 w8+&hwKGf$R,b:2-IɈ^2t#dst<L2-I]9N c)eA{XFRz-8e# 明l4<1+8eZ^L /;,@R+ӒW'j^3<Aզ赎@F,<<2 W0˴$-LS /L v~R̓2 yL2-I~jy(5~/ɤaiJLnw9{f[Y3 %2 [iiIzb(=vk~kQ nGchr^Y?ɴ|aiJg2-IۣS,4 iJLKҋ~L2P+2-Ih[{dJd7vv|7@^JL"?CѢ#eR6ty)dOg̃5Pƚ /9>䙍uݒE6i@ƚ /;>䗋i ~R̓5KSɗt&x4m_/.~XS)n[eZe?~S]3->/^#),xA?;`vF))(b𝱦=zr\Aq>_3d:~ siWƚ oLv9Zixzk[lyXժ h,p"G?zZodljshˀ6'4q&lg`鞬1PiYC2ڒ%Oj=Jpv uP:ݾ =KeG!|V뻗<Yd3@He:K]9N]25sxnj;tOi( L+Qs+gR9%5GXժ\T5Dtoܱ`Y3e=2BOGݯ[/~JdA 2YR!tod$\=zʹ''{Ҡg Si LV*7ݾ']u+>aDTX_y ->׳?54R91Y<9k~p\IeC(ti柭m\:ˎ2|r˲Nʽxyj}n9R))C[=vLC}5mnWEr "%iD.MM}gk_[Rd:kpZϩ&=P,"\9ĖD<(~#g5ݒt:tƿiCQ۬OI \{J.;jC&v#pF]8~9e i1Iٝ/ ʴGaT%'j:H,ۉJ nῠL{Ji6&lA{MIV(!ek(ӅeSyekW?uZI#k^W]lRI3MPGGNs#r.IeR%vl&]>ykC,ۙ+N<je";P=yxLK҇,Wu4=@L [q'(iwUv*W Y3N;LP4i/iO%]3^ n2E).qH\²Q>l:L{QLpMب 9@}_RCҚ?IOwS[ՅC]35#P,۹Xզs(5xOR=&Ӧ|nRߊve;~h:;fDnÚiSK<FҺtz֗$M0@Qʯ\rxhWLy]!!n0+(^n>Z!IלcH4+wIʴJ`22-Io²Kz\$ieW/P=' fsXj:lZsp x eJakӹ$< 7gO`YD<)PL{Lϫߪ!5-c;%b:u;(Ӟ2˚h[c8[L|Hus02u~=%U1I̭f:l$IwʴוdoE{Μ;<X3PCTe$p7P=yR{p2][Ѯ, K[XQ25 i>vW2-I'@[%C0K<$ʴ'8\r2I[tdW%]o:(~5mT4c.G>e;7J<2)q-{yDI*4s.1xe;_7'4Iz7Q=d*}=:X7 e;׫s4H?XCʴq7Ғw'H|QͦsDzye>@[GNiI0h'v>/V9xe/̣5t4Vu4I¡`: "v>+69xΦD<27R=e:ɴ҇Lh:YsJKRY1S ;I˚i1}ͦ#pe;5~!],ʴ|8nn~2=I ce( L馳4<< q>XB1e;KZ$4{%eo.i 1Ia nQy$TtfNH$}URph.of2~+ԹL'L$ c: e;%Me" Y/(Ӟᷥ\3]I߾") Mb u.t.\eJd;>a@"a0e:]j / XN2Lgf京7eY3]O$e: _iD>~Kp&ӀoYS ?+)j8z$/L{t66t i 5Ӏ?YsJk8 ۤ,rBd_ei*4/팔t,Ic9ʴG$S)RvsƾB©$v"K7% 8Q=oLa*ݷ]N\NJe8v’I lZ!Q=O<=~oVeǟ\{Q4 Iz/Kl8%)/L{DGyl呔4Úi,v%}Hҗ$`8D<]L{vhع.A*\LS8L3,,}>'i8JOxHi2n&PF4{,۩PCt8⇣L{D'y-ݰE_uiq: $7`" ʴGe2hvlj9pF@If( v&@X [iCnOǖu{fԄ{]NTX DzN3,|/Bv^-4WHTX,zϲZIH:LI _";sD|$ g/R4zt7nc7OIS/ q#7[k\I865Vgq>_ْkH!.D7tv}7v@>ao_OlZtu.81G@~ R(ŭ|^=><,8dC#eŲ :4ϔ4NR`4( CL{Fcyd2mYnw\)Yq<4f 4⨏,$U f<bid-CI8h>Ԟh˾1l',BFp[&N IDATL{u]VW۬[/zZшwBCc/o7²_(Sg1>Tsc.I.)}kmbe jw.yJZ]NU|@6Ï&_O~jEOv˩ziJ }AʴG>% o/wZ4M<}\dD<0i09~zf⼠tBeda {+胇f#Rvxlinn_9cp9Rhc:(fI(ƅ)ab2_ם.r"-I>i˩ܷ| uCxl_1.LoX?^WM]^b"s8tP\?)օ)x?n_tz׼F g6֙Dt P%SP=ezŦ=ڵU= ~o?X0BLt Pw$b߄2㱥 ՞Luz}}5OsA'Oi:(&Iƍ(,nǗwO=S->~mmW7 7O+NT&-It"=bK7j~Uu=. , :$(dz vk?]2qp拊5wDN0=x뽀2'ʆ]]]/IzI^Jzmt>7oFT/˴pJD;t9t֘ t&O0Cxգ)n-I+2n:7^`xY3Fnd:($)Jg yU[utE6sg.VEbNsGTh8~֘9eCM$a>h+Zjk/ S*6?Ӵt Px-i2eC_IήoRy# a:nZ.!O%zvR@fdSv'LhKm}%}t"Lg6}㦍9t)zrR@E%}6.$Y,;V_ik7]u@0aL:/ܦ|7o/ԗVԑKKWWMS 9T/Z# @!.a"Lg,ܧ9d ;VW/NmEKUϻt LS+Mx;}/PKc;k$}t"L /ݸY׎=g[[5Z]`m;չ{Gt!"L 5]r4xlEL=mtS0_}׫41[ Z-_]uULrW~HaJ㦋Ug\"L_e帳*+ .ZjuKtt)>$}} WBg =-@L$y[Lk+Jq?>La E}opĥn;5}KӧoFjU,I1]MW#Kȩ~[=8=E<}kto\ 9Xh}+4u0-ɥw*ߚo/{aeڇjܐoN Jv.6i 33dK&QA~tkJ/n ´$O^Ӎzhm>3<=yt.ʙ#C֨#j[;/k8=s \Ř}+KN0$}5 F1?wiTљ/xYҝ~t!#LKjxvϯ.Kƽ __.F%.iz%m7]%E.5<*+{MDe=^}赞Wgf L_Q1HSe}}q.+&wIj>:<蕞~thly&}W9'߭9_?.0@}^+:hW*u ޱcpY?>L3FHY0izI[2]SmMwT疹/2B|teyt5y0]ٮ63;g|θA_PIQяTp>OML>8)a^:ugTsC5s>zBz Jqr4/7bP4u^~wBz̧- E:Pjn87T]H4v]4A}pqVDJZNLЙJ{(_k.-~{`-Q;{3oǘV;/FtfaKxe91?ܿHkURYzUϻt!} amvZ(C#Е~z/Whhy@љFߑt`9X;P|{BF]3tv@nK_MaeI:XY_}3]H_Egmvb51?mhٴ9ML`"Lǰc1O8|Iz҉zSC[3H4]H_ǘG Բ]"#t#wePЙ/}.LQͧs?JĞs<]_F5 |ɐ mt/g>d.tݡ㖹cx["Fչݫ [xj: rx]yך.ɡ3ݍ_]#VuwL5KKv:XS9ZXO#de"k& 3AgtBst}SQ1O;,ӌQvxHi2l9i3??jt3 '߾ahE=Ӆ =5 uԁQ^brL^eiz7 ЙN'Ca ckgC۳gYkӅ sL'@?93ka]ʳA4=އt$9W4Vs]|ha1zdO} AvЙpĥm&#k8PHIVvYKZFLֳô{>u^L]Yϖp4}jӅ )kxt<Ի´%Ѩ㈤{>jӅ wKlpTONDa -1@I:)?F w7r{a )-kH> t"Q\T?ӗTý&ϋbItx%}5]"LbK?="=tˆ}`M0ṽ4*^7]`gjsNQɷs̃<}qI љ΀:W3iƐnD]:z"=NqXiڂjs{?zࢤoH/4] cgjs`ح/x.u{﹦uw=L'6}󝯩 /ȚIJy xQ/RKWY_ZyɅcK=]%,釒}>o`7tն_XTw߽ĎPaZz帳, L J~nϛQ3ΰª*-'BtmH3}߿o1մӓ{e(&'yO.C΂u o]򢎷|t v⽪i)cQh}IyM"LgoУzUCJ$I[w]Oa3o{WnrU%?d%I.~b|v^2s7Lc$tC#vԑdgaa^XܸIE0✤Ky}id a:˪ޡuIxHH2L+/hԧ\AtR'%M- B˜GԷ3|f !KO&mw*p^;5RsdnIK=o ´–L'5^qAFgJ;2!YIk Yi 93ݓ1}|t|X͒Rgz絳$@L';3]\0=Mޙz]%m5\´lL'tOg_s'9ITg~^0] )i ,L';3ʘ$sf}uIzZү>~@P_LKҟ8wOW[ߚ@uJ}b![tһy=!44;{ssiI aBֆd;)x;Un$A%%Bei 9y7O^DwzRtor#L[("nNLff8ŗiyY vu?,yϻp=Ӗ [#ѨIXƼ9kq܉sXy͖؏0mp$"ܦxC ɗdfl0ǟfd=@Lfx~p´B%7=)cϼcj%a2Vj] ~l9-eێ1EUHaRL'әˇ?QE^ Z%tTa}(iK֙Nfliy#._9:+@K:!:C?αз-e>摭iIO[IJ:y4cӖ3͘6{BY{>s2(,ZIgOJ:Xd-e]g0/d9M]C2L!L[ʺt73jCJROzuݏW3S*0mpخ0䁗^ВVU՗e92"O IDAT.q+my5^M`;´Byt73hTgejW@OD sF'Y@?oeW }aR֍y$ӣ˚54-i3,u.3]mf[NtQ9wӖm7D/ .Qw;RiK,{=yh3 lCmcbDr)\ $0m)<.6 jC0Ӗ3}Yhzr$r$- ә>gģa@4 aRVu/5Ǽ`D9p1,CUa:Ng:#6"L[ʦus!L[*dIg:؅.ǔ7iXinQa؆0m)[<<-]:Tki -e˘﷜r=Sr^˥? ´'~I;N\r}٘ \/3!L[*h>ly]չp4 aR0]ЪgUu>M\}AjL- >?V{ *szPL-0ؙ~yv|%?󘁊:13 lC@H=;g}T 9MteӖ ͌ylAU7t= :jNQIK= ´LtOT77bq|hs\ћ5%1|XӖt$տ~G̓uJKK> ´r^أb~eT1וF aRgUzj񘟭{^7MwX;DVkH֑ZF<ӖxѨn 1?/ m+ḱMaRٜn٘$}冭Sޔ#LaRpDѮ[>'u~7g2n Mab zz(OԟύM@WX0m@nU#kvlw ^iejn{ѯF}㦍sga$ MW3tq.ebGqw %iLyuJ 3ز@WiәFǞۥmWz*/״iK-H@Hv$-U-UJ pe$DX*ckuTU[&җWnS;Gjm(<H0myv6tğଣgnkN7CM-´ŒLGQ앃CqzqI{9v#K2f`?´Œnj [hu{  [tL58lweOwЕCڦ*k7o٠qw5peaڡ?cL6G{v%phH aAb4Ytz=4ti#L[#s{Mq[~m aJq!}b>ed2eda2w@22={220m^_wtY M1iK}CȚo}5LQi |r^ٜæȚG=LqiYG}tYS\-f+1jS+{uFz`25v. +ӆLШO/e:xq20m@Q~HܸIyaӥdr~{`20mgWԸFed͙R}{Beda:=J|tYSOZt)YGΡ;M5\SRr0#Ea=p&9Ǝ}uRr0#^S9閠G_\RMSuI6tYח^Nk. Y6I[;<}W=t)Fpx{6LqumEr!H0E׍;..#^W/Wmk?ӥE+]t8k .8t>Rc˛L1K?2WRA΂>>22@__L 5] UYG4tq\^sMKa:*:9MHԥ7U?1K0;(Bΰ;b;X->H0A#7'LNmut0AheX z0!6Θ.#%/nF-AR0!N>)"zH@iG"LgKMN.GUң-TcGA 5j`_hQeA΀k5tIi M{Ѻ=sM 13执L}Ճк%:TqC3w\;_F R%@ӔXa(_H4dw'Oi>bosQ&ӴhT ˈTC=vHx߂CuhxEqLFN}&#"yݶ`|{LFNCQ~X׍=g."Qi~wpRV1O%0 a: +ƜS?Oto,#3Px<0kTRkyBN͓k+җ_6|Cth@ia2a: GԘ. UeKש v7Lo!gg5"@l .nS%#;%yEIEZBhV )Sޜgyj v== e0SPmzvTr}l#L 琔lfO[_zBe`0 a:N̆wO׹.~- >t rՙn.֯t?Lwݐ9q` @|¹1߽k7v0P^֎D]z.׋ 5s=7N@0}\]/8Tyx0 a:ź^\Yy^wa^@0C1Xu4@|A1`(L Stb;gKc"љa:E0B| (Όvw8 >tڊt_F׌;/=8 <#L!5K =}NO0a: 2bT҅sўpJaLlA1+0]LjuǴtKa!I쬑I R^ԑz@y ^Vp"´CR8@%25kגQ) :iug:yz{TX 3L'|PUƾ!L;D;݇$;wN:jI!L;Dgy1.a!lLW`7MtY+S) :ixY~ݔASm1@7i;Or򦔾`´Cvhf\=0 z´CЖn)=4%a[gzڔ],"ׇtי\F.U23 z ´C|#FxcO]P~؀0LCkA .iK{'G- 3Dm t%i 4=?H%˵y#.nU}.3/ z´9zţ.1i`´bnz./;zhJ{5'w!L;HGvx~.צW; R4mLDB6r}Ȯc=i`´d{c'-cmh/Գ&[bx41{rT9>ifg:h;v,s^.Wַ郓Ө ^i5)ێר=LLoKk [=_u˵aMK=̬40 Gp#kIcKwMW0o1{t-u@mV=G/UӨ ~iijNg]G<ܮ6Zz`2"iAљE"x|3ԩaj{tBC) 3ێ֨uRxDR9&ݲ0 YL|x]c5it0.cʛ4Gk]Six[Vţ#<=fN7Tio$// y2z0/]}Ճ2Uc#H4*˕ZPDTw>M3%ƥ"}qJ/O'bAQXF*V rgLT?XxF4ԞQWż~Ä3~X]w|SIFjp*<-( Ho`(Gx *n졗/SvP[:$"K[U+t~r1}o5:Ɇo L;L&~zˉouLc4O[ O aaҝ~E;0Z aaLo;vQHQ#kJի'GiMh5,ގ00MiԦc1rbU5@_;Ls/ vYy1gQ CiiL#L<~Q#H aaOp400 :rr4´z\seE]G
NiiԙK=(.p&3pTF=oоS2&@oGvwya~!:=AvFϚY-﷜Z} a~K{'_=4)Do=Jyӵzr Vwl]ޔFT0pU}axfkXws,T7{_n‘ѨͼtmEqRN=G˦yO]sr:>^&} 1zLYc[Z6> Ida:x^ԛ.WcfHaHaHaHaHaHaHaHaHaHa=PIDATHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaH[Rt .斴t:d[kfܒ|L co"P9)~t! 6W4$ߎtk%͒g.ꐴKIM ?~1[UIENDB`pydicom-pydicom-20aa4b7/doc/assets/img/pydicom_flat_black.svg000066400000000000000000000276151515706620200244130ustar00rootroot00000000000000 image/svg+xml pydicom-pydicom-20aa4b7/doc/assets/img/pydicom_flat_black_alpha.png000066400000000000000000000710311515706620200255340ustar00rootroot00000000000000PNG  IHDRl$%bKGDC pHYs^tIME)8rV_j IDATxy|\w}Fٲ%[ǻdHY!,MZ rko\ pޖ^ZieKB2YJ6/^Ƕd-ˬ)ؒ<3fz>z8F3|(~~t:-I G[$wIoNKIJHJfR_I4T&{CRo'2‘͒.HZ)a{\Ҡ ͣeW:A^I`QB{@RPJ@n^]} L܌IG]@nf5߱KTYR5J4@~..I?ͣiK9@^I*M9@^Jۛ[(h a 7Ӛ7ֱa w% )yIҿi~-AAR.~)4J9@I @)@̈́PK9@4?ra 7]7m*  LdoV75߭~r0 % ? LEI ߢ L怤υitI|(ha 7%m(h~R0 !I_N9@޸Ԕ<@9@ޔ/g(9!W(/㡠CJx(Ka8},^J9p::PTMU-/VSqG>)&fir6ə&f㚜kr6d,|G'BA3J)@"hն*6rtR:>24Wg[/m{k0M|uetkjKVB'%QrlXDb1oQ~; Ljʋ-j^3O*Elz$Q(h~RaA{t暼DLc&pv?yRyXHW^_ -I~.٨my38$D?A)܃δE^vՖ89=J/dUI(ayVWg㊥<ףY$.-|͛}E^(ayRWl1~cb HPмR83AZqF^02 p$p8A9XU~mO-oH7]. sWIz1 Lc<:bCמ7%Y8=D/ikݠNMVmͼdo Gi[ȶǿk]67UF=τ#ѧÑVAFڛ*uNk㊝x GKz>~Ri=R+wdHҹuLW‘HJ4fۺ9iq ڪUM^Gi,0Lur`$0)ah߁MkysX=p$z8RqGW~j:4ޟS 4$|=4+HXPmlG :~/o2k㚯I3LWUI4?AJAvivvɋLG_i).3 V GO#0N3 @^QsH͔0 t*kP8CJAv"LsIP>I_ GߠigMǯa&P8 G/#͔0HN_@+p$z) L;gK` "H]0(^%yQ"H#0휂ӺzDH)ӎ`iwD i, H#3R ´4%s=/Ht LS6Kz"^A)+8sj%=DRm4bId<´ Nah~鼏Q ´=X4 G i4 p$g0midi`aD?K-8aXg‘_Q4a 7 G iaÑ(aZ'Lp$0mt|$~2)8@n~@MƁ30MgÑR4a 7_GP4p$z L {I? G @j$D7UIԝi`(nGl%LIÑ݄i`a9p$ $Lf G$L93 e80 IG#4mf̯A4m3 G&LلiDa4Lәw{80 d Ip$0 c`u"Lg t GNAp$Q4$ MH2448 4s6#;a4Ñ a4?#ui`A4 2W'_f@DЮ+٤4Ok6\ƲՖ*KțIɳ} kBF+trT{j6' >]U+X@LQpn*RdN2 TބOF*Of-;72vE/~99V UQӎamUIlY빾FuTlGXQZQ5#zՓa\ҎP2m<)u0ISTNIfzYj|t\T ڪ~yS)|t3bJ;~t~Ɔ*Hg>n˺*]!gl&Bo x`tQR!hd1U[5w_O4fŒxoL%~acUMgꁱ".XwR;o KFZ[[[!-5!Ef2ӬVD0m[F[m}/.벎c㘌%yW''3a#mij.ҭ[; \wCz%"k_}uj2AfD6%ab*cnKnsP6q.mHݰ娼3qC~T/_;m,>v}.oG7_P `mm G Ϳ%Lדқ6֖~{p3z)cza=ꈺOg4lЮڽJ22$l'XS/]CΘȃOZ@\iK}ٌ3;(2wݔ't}'VVz-mںFJx]dxBkRx޺E??Xq24ኙst˞ H~|1U Ғ4K@|^fjBki ,~<‘h3az-OΓ[6wM=[SgViGe_sE[u/Ӥie0F޹#M=k#E959}rlz04ț GUVS29IDPy}@M5yJB=%:-8c $azՖݻ,2rm?k覷,,o9{]Wyf6DJs4@?H|*)ջvFOƓRmVe՞3lVۖ3%ob) ͐ׄ -s. OJJKۯY⧫)Go.sGx7Ù _B4@]D* ;bӖrLώ.Yu׻:sW7ni 1|uʧep|FR5? ͸;OJ7n픧ء#a ;jۥ][2vw_Aގ >HKR"~u8KÑLOSξ44Pңj~}:߭;J6WohL+yr<@I_֝#2syxSی mUO|d~ݛiCVUQz&}[t;=w}AvY8]gs,n]*9sU\i` GB W 0ibf|}Nәi6VM~#|ce=E_ӧlcE<|~}.4p$N&LoSy4E"+3b0\6dOˢ_Ь?syi G!ׇi҅Bwg|B3JњǮt@_mZk~i`AÑ]7Vӕγ:=ֵҌjT]l,Ileˇ=Cytd~vdâ_+)s[^Vu]8m]'v%E ԎC§lPtzߺ=L }{8ݾtj~s5Raz'#31Y5:0X*K)yFoׇ%[$P!sy8m ž&]7X59q\hS]q^=b9C o|JI`I\X&L׌IK[I:oV}ʥ U%ڶF[J c _[ޯV*0m֌KоZR",sMyuy8k1 졺G._TGu3*Kf0R=wlzDku`Fl}b-UR2-lx Oo'_Cdw%ۋ["mmkcE:08+tsU2[*X<6г}:8Txz3m,ӆZ7ӧ di'$)^'NIMTZv=h@ʣnZ -Iɴ4ieB}~jȂDm iCX Nuo(hQҗ,d՝.pވ -+_q2rtX4TWI-ijpVؼtHx3 _$IRpoM.ИGjίF7*_qЉ4gMwJzjXF}8aڐu-Moq ~CAZIK?Gô5cE:0Td '4?!VI1`#LoT*R$Sߑ5E\n0mR%zd]_GMp@8}ôպFKz%@ 4zvD t{* N&Ly{!PQ 2 *uu637>aKf䵝638{$@ @' |2wI *- &bE tӒkՄ#ѭӅMO0L;ñ87P$\bˆTa:2 I<8-&)@T.t3)8-L ,4_TpK <)Զf+sTp ݙ6L^D"~*Jq8Ȣax^i7 23 ->xeG@Q*Ŗ өyԖYgl1TpK, ݜ--`fi<P|@7L@´"RI +ld.yu32 t"iP<.O F8ra:,ʧ 7 ?HzJraz6-xUګ i4'8 IDAT iaI 8˅9 Uy]-GRP 0wGJTY>/M9v춫:ntJraZ,pwHkgpôv 3 hQ*8Zk-0qn@WpjL pPg\#L/iSM~oDtZtZryJ8N i%*s^NJ~9`BA;Tp cs~KTjۋ?LSXJfd29t慂Wa:oaz:aaX~o$0MkNpV uMiWP^I\fWnw$MP y‘% ӓsorse+:J֝g*8K鴤i MԖeh/)Ni0-I#KU - JӄixP *8:ӒtbRP[w?S{J8˅rU5b<4yBAI(,K$ l+~l^pRg1Xw((eTKtPӗn8"u\4A4w1Y*}- s:OP1Z-iC]u,[8e ~%̄ ITp ӒG=I+_*)$?L Ӏ3X3-IF+a5׎z|e!!ii L.b0Kz58Vn ^+ nFt IklIgܬ-Gf,GE}I)3&L@(`{5;At\>Yv I4䠓Wm0}`FJylSLoFt4iiљMtF8t13 I ۫M 9ᔆn< tMhp6I)!4Eg Pәۧ;Af\nVc0}lR{ s<#F={WgZ?hL]ԙf5U'%l-`0}`FSiL44`oE ӉG~$ҙa:^:Y/ Kc*1a:cE:x+{3x_i5ǮGL_lf0 ƊlcEgu3ɗ)֙4t<(%2^g:u \Um)aљ^tܧ3/Of;(w<.6ity7UcXwߜӒyv]xQB슪l ē;%5S ZjJ Lʼn2=t]Jghi-(_ByXMjqGEۛ$t W,נDyoU}#\RJa: /׫OgiuR8̲yJ(a:KOkmx5Y1nqXE .6iVGg:ݠ ´;IeL;ӌy,nTWmb@`E݄'LݲGӠ.p #W\«^4L:'tN GWJQ 0SL}k_Rs_i ѵR7p2s+0KtJ2+wW*b nB`;!K%G!Le\ YP? \h(@^P7*0F<ctaoޤ3C"bp:Ӱ)]`xBgJnZ_9I!XL6IA*8 i+%Hm[Tc<'b Lc$mښJ|cz1.$Vu+%BAaBovB_W7]C\L,ea**8n"L[v-6M=*/qAo?U#G%G$L[LʦCV ǹXG(8V ӌy5MsQ(p$IT Lc%m-yFZWqQ?ayJ#LF~γrB5c\X & ii/ajaڦTa:vE[_;,cpP$L[.YxmqɬvTG'Vi{g%NegDyGWp}i'RwFi(\`&vHz7Ӱr(;Ӓ\ ayن(ȓp$A҇@FCKf \I* cCAs/aڂ\G3z:fp$zP Ѣ}0m0BvT_ Z%oaڢ.XS TO%mʎc,דH37HTP }ii1}Y.D}AJXă>0mILgUט>Ue` pWV}Ԫ)L21}"U]na\"0]g 4 }_Hr(hyX=g3 eӖ?g'DA~Dy0a9̃gc-Ή4{gf6ҒT L6 ѭAT*71av[j:δY;f%?OһUuHNI:'LW\c0f Z!m>'Ut24!L9L۬38jc>Ls]>Lv2mxt _)I?6Jm2Z|NoyV IIߢP(h>7S #KztN=4`a/qw''?!´ôuGdGðTdU1 b|&~۷쪒Q^=´´a0:ei ‘Iͅ]DEX(h޳' L[D2m07<7׌_2k MgGb!@*;T@-}iKgz`*xҺdq[if [%=FEXw ӄzu'UZ:c4jn{{I% `ASyJ0mvx<:3s]i=a 4"H&IW/|7"{4?rFvwjox-杚QPP(h~kC :OLC'Z?w8,WxTJ?%ؿIj>Z:Gg{eas? _['$L[%L3=S䕞Et#*-qlg{*4_&L;T!י>1/by0ҺRM夣?(BA~:KMĥo>ѹd.k3HKR:mpL_NjЙLKJ$ޚYݲ㰼1#8x(h~>/Dg*az/-˧]\~u4z!´U*uׯ__5iWT*J/h`gK|cV +1%Ghp|vle]^_E3{(hL[%߭ LIxAڐtIqWmƲu%\t8bt-"1۷dgMfk($ x:L˄itF=0}K~tV7m=*,^pbJcg]i7,<=tkxrnǘuK()?@pBA|(a*a:thL?{G!0ҺlqXfrTIKӄ%^\_BmT}]ģ]gV(h>W&L[%L/3tbdz4MmG]r ԪoB< I&齄ia`2xL3䒏07mlv7k*VD!pI.ÄiP4Q5G?vb-cv:OW L[#}OKRKŔnzT?N J ~ʎK }l'n1g {uC ֨gp{=ƕ>:6ܣ!Ouq!u<4oЙ޳A: F7j28ӟ[@L[܆ mKTۤΑ* 3ECAV9:uzێ, s}JCgڂI]qLF)F6>wM4wPw]V: :S{w$Hg+mCI\3jEgB6ՌjK%)F^mRX24qC%kw =L!pWV<0< ؗ۷!Hhn:{3' UtՕmGT9Hu׾&poCV=8:nDs xCmLG|0ҺOZ)F^`_fPд,,a:JaQTNR\< NP P0'MӺqQy1lRDR>,ihW޸[) 5ZI-p/p5te{67 R'lju` kӍ[;UQ1E1V=F%Kr5rRo픊c%`3ۄkJ`[ð8&GHܧPT)^͏ٴemk5 IDATү+. %f+[ ǜL6ibK}Q Saڅ #7wqbx~bI/="TmJ<EF5z1´}I}UW5Jm-J y'@A?w8I>ܦP5} ߰I&uvJf& O(sU:DYzRyWp~mFC)-a0"ufj*GKEoXl(h)'CUzR7J!rhF*PN:!t.p\M"G3%&S P(h촓"L!n=A!r=XިGf)´TtY{Eң;[Z+N<12-yS"Ke?Xχwzr%lR}8ku5!BAN>A"q]K! hNNR IӦ'$]Kvl|I #'Xzœd$I3{sOS_61 OިΑ*jN_BA97(a4(BGፚs ߡn9Y)ԏPYO- ?p OQ;&b  Kލ83yN0}݌x,.m襞f%7 LߛTm8L@jSKEK$Ɠ'L/-9xQkQ"Œw`Qnͨ[ @^PWJ~M*э`)qI g\Z´${FݠbBA>0ZvG§GP 8O杔0Ku.ӃzFMŊ|kM ,롗{`p/픁0:"/6ܱuzqه7V]M*4:b Og2ӱ"{]}K>kݭj&- .H(h2. `K]VGK*Mgz,4 Eyf]m;Eg0fhx(4BӮ=QǺ+Ė!]h6ʌ4`(h^CKzᬛӆF]!E>zTe܀44Jәδ!%!kM'f-]U_7]Q%잚0  QtbqX~C%K>fC}޶9giPм2s2os;4̍om97 H捔00Sd\wجwѯ{޲Um5+z<p͔0"3 ww}?%K쮴ZɲbYlFǎ84̤q MI$NNiIf:uL:iUb+aI#Jv&$q<σA*^<߯-|<#g}~6xw0u5zCCj),N40]x"\||@"nWKH?؀cߗ4 @H_0 iGĶ*N[S}9?oo3s;YgJh$? ´a:TQ{o =ݤ~i%D4*CAvj"X1ZouT9IF#01{!)S\Yo wv70Mݐ$AyTi> ˷N\Cn=z @yg>1q0]R! hՓNaHl. 4#Ngυi6*oK}f7<w=դ\lvLI0 (=*I[~m6xwir={չNS2 I Ӯ\ݐܩY?k s?pD!h$ |h>Mz'1!YV 7!4[Hk2 ´{%'m2ݫx TwxJ\F#?`(AE↻ 4wo|x I&Htcn[w)z1TشOh$32ŝXy.ء,Vdž6\eJ ´7%̀WCfwD>ቱ2 k%`4M0y7'?7ЪzoLi\v{zs[m'̀0#C>4ekH?He8th|=cRиLޕ^GQ>vY.e E=1[n˒0Fe .RtKY=!5=o7}Ҥv2e2P㭙=}fqc)Î{ZWeVT~/ >l Ae:۱VY5l@G4YHɽ tud }gdǿkɺaoxp FPT&< pmCj_&J[{[<9i#W$0tLۧ+]8F\ɱ2 @ޫF|T teS-9JkIj =9JGHK2c%atiWO;v̻l 8XdiǧߎF¿(K Gu]Trǡ ӯƜ7z4L\ fۆ^pXzv:j<:i &E#ǣ a{&֚Zf* 񆊼~6m /Jz  6CQ>q`9ax)LmI7 ,4rXKL./"LL| @HH7H%p/yѷ{xߵAs=o0-T[tf/H0Be2zwH2_ܟ:_ϬuKz4 h$=wtA#A6k FJ%_G#ᮽ K)aGd%\l;X^ ViÐ32 TK p0]FTP|=,k^6 .45}bxP Ғ~G҃HoE#Yi%juƈd}Ѵ >ܻ/pcjG$D# .[ Oo,v*ôֲЬurcdSҿt* h$<(XnDgW+#}3ch5Q[aڲ VXzdRۡ*PLOa*Wt lUz/@ɶ+wC.0Lg[Dg뙳c~) wD#_7 c!al&kgs ]yՆ47$h$h(T3k*= >h9hͥvn @)]J/ .i5\Xh'Yht?vjJ Z+Q%9I_ ǐw<wt,N#@$wI5 OIk ӄi)t5_vЬ^; V(^a؇i@ bGwIwbhdږ{!IeH@ôg@,,$Vାt,玤sE0~^3$ L#+fiYVtSӖFtoGڭBUo1$ L#J1xȍYj2HeI'HxVҏ1$ L0mWztm(]+5#鋒~/ _I0ÇiVӶm9ZnRyp%_{i]— `Z]۳=P,I/ߗ@3l>XuuSIMHxNgQ06+ӵGhؽM}AoLs@u*颤JXi'W߉Mn.!麾WmF_[%I~!p2Lے<_aa4B5vܮ iAҴ" ߓtn ӶAT'J(跔% /4b0]as=tTVl0 JZN^K_>/)qXytkSmqs1V$wy#K(^O`ܱ4^=b`kׂn aì-na7g2Z6U0:D4~+CM>ġ֍CcmQH6rxHǺ2 8TXi:}zTaiyog_Gq/1aiSOd l,20brc}> L`<ֶWL55l3Y0 o:k[OlJFiKKzimWix2L{ĥľB j˽ y4 si$}?йZsܮ0 W&b3w~.[n @F~y2r|6dV0 (kY߿BUZ2 (4L[i[ɕ}7Snpi@FAaڶ]׮/*m? =nr*0ô{MK A ˮ=0 χ׮Mg}E)`Sn @F~Kmߙ\:j..:&Zn @F~nTwl靱E)`6DR0ʕYe+טzݪV=7 L0]64O OK~X)a23=;cW8ݾUc4 L0]6W-ENMybۛo4Ç0##02WޞVl3:VȤz3Ң&i1L['6-ΤRf-g<.tr4әA݌eAfCGf@;SٍFn@љVaak Xy]ԧLu"B(gKmK[ZNm={vLT\O7ڙ|@FqLV[zR|gYO OKL\J&% LHVʴ-+sOVV*yQ0=ҫWgL^.ϞS~wg;ă0 6TyֲnϮ#ߚcaNVv2zI?g=yrN*Z0 ;V2ђ[̙ uW~s4 LA䁟%c6lj3( }̄0+ZiczlpV22-k\obRaSs&Ui@F5Szܸba]i@F)6nƤ`z.L. LtwS/SU~SA&Q/걡]]da=:4[}12L1 LXgڮheIi8sz|U^[rNfzd@<9NTgV ʲ}L4 LYO B^;S}l`aЬ ڢii8[볓Ax;@uEuǪ:H+cJ ᠎<5]xib@qa[z䳫gcԡ (eHt=صRy'+'5aH:۱ZQ<kFO*a| |jjy#DQ)J[>9~B;V=}S68YUpw(,퍵vW,I L;uf ][d?V7^=M;D7ز)LϞ_jN_;x?wQ?paӥ{ na@vZɶuXХ]:DIDATFZy+L0 @vةuﱠi[ͽvt}m@ k)萖Eaa<⑮џ<}`F}C4aq=͛9v.f2sÐM>6 LyceI_uJ)ӟPm@~tP#ӎj %=qK-òsޠ@"4aQ!ފ;C9Czt[C4aQm.i+sN+meo]hrX0v7<̀.vjv!E.:美6´\Lۆ)~<:Xхh L;%dӮ|w4Ѹ"~çVg8ydcϭ֔-LarX2&>:vr~O=2Pkeӎ2+3=ZO{pj0{,@v6`6;۳hslw|L L;T~w3kp؃V<3-%MIaI]0=Ң?|ך L;P~ws{퍵m*M L;0KS;u^HoKٯ4aQnءl=M4aAR.1t}qO-_+a0vdڮS}ɕkX0dPJA졹%ʵz[ڪ/qg7Rt:L?aӉڬHR;YZKX6Ƭܛ&<NJ(|TZ<]jX0]"Nzӵa6tItHf@ õk2 @.-~NʱG LWxq&nrEi L@ haّcœfQ LWkg4=4,_"4mdۆn,}z]mLKa: ZݩfcQLjA Lص"[=f]}{D4aZ%Ùk4aʥ-cmG匡"Y0 @.G]s:OE4ao6hg;t_< >@>ޘ?g7+ LjV֛;2m7&LP LCUם|=iV L⛓]LUF´⩠vnV(Ml) y´;i0 @vM[S}ix!Lg*'LKRsӖ>9<4<3mdTϲZaarkW?4rGfT0@@{2w'@@{\ȟցiI鎩aio麀~Ԕ #D4ϣYZiIۺc"aC!]ڡC<\y|Ta@!5TIkei_(dn~uan0!a L4 L,{Ps`ld@* (/aRe>Ū02ʼsK!9|oQG} ii7L|_mMHj`GD@F2milomuI&Qpki[Rqchieyg!*02Wy5Ə|P]R021^>8w5Ѫ9a άVVBiiy'L|)`wB-VhMJEa;c000=YS|X'L4nK<8>aQ&^Zͣہ3i@mi/wxwb%ab02R@2 (W-xV)z%IJ00(tn(逶Ri@Fm{s1ܺYWwP@Fg:G%EUQ־>[Pc^&L4\RGO{aG23 i-Q$4aoz|q;ɖ͢{s i;/mo38Յ&aYtwgb@JtSmQA54ܕ)K[YK3=J[f0 %VɎ}czhlu + Ө0=DfQK]es4< 6Krܥ-[,O7֏|- L#,qsf*pôOɦ* RUx6nK}-^[Jeii?ZUztScmL LKߍX;!>>D4'Q0mPB5u2ixQ0qۧNCP9Lߘ^´F44+e:dzx4Sjj*jtƈCL L2玵dZ.pmtVoh%athҮMƲȿvHoh;UÄ4*GҔi1ts[ߞQ30TXNjbܒegih_$-z}| ӕ+Pqarxzm&V|te^-5ښk|z{O:e az--iɖ݀ޤ+-kN0]Eݸ^nӝVٶ SX<I4 [aiȿC15}@>6w:bqz:GƽCFJdُ.Wgsh8,TEu=rP~>C5W~ƢF7`tm&ni=xӉAG71VXt1.Omȴ2 ,a62LTqނ6S͢wV Ldlw:F*#=`=zWˢW0}\;nxilUS@>޼97W7uy-UԊW~u5sK4ɀqxRŘzBjV_[$)25хu֓ L ;_a Ji0 4@@a Lii0 4@@a L Li0 44@a L Li0 4@aa(ILk i7`O6CwPt7 {h$<' ԀLH)22$zO?QII3<@%%#h$O6(6)ccIENDB`pydicom-pydicom-20aa4b7/doc/conf.py000066400000000000000000000244721515706620200173030ustar00rootroot00000000000000# # pydicom documentation build configuration file # # This file is execfile()d with the current # directory set to its containing dir. # # Note that not all possible configuration # values are present in this # autogenerated file. # # All configuration values have a default; # values that are commented out # serve to show the default. from datetime import datetime import os import sys import sphinx_rtd_theme import pydicom # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration --------------------------------------------------- # Try to override the matplotlib configuration as early as possible try: import gen_rst # noqa: F401 except ImportError: pass # -- General configuration ------------------------------------------------ # If extensions (or modules to document with autodoc) are in another # directory, add these directories to sys.path here. If the directory # is relative to the documentation root, use os.path.abspath to make it # absolute, like shown here. sys.path.insert(0, os.path.abspath("../build_tools/sphinx")) from github_link import make_linkcode_resolve # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.append(os.path.abspath('.')) # -- General configuration ------------------------------------------ # Add any Sphinx extension module names here, as strings. # They can be extensions coming with Sphinx # (named 'sphinx.ext.*') or your custom ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.intersphinx", "sphinx.ext.todo", "sphinx.ext.imgmath", "sphinx.ext.ifconfig", "sphinx_gallery.gen_gallery", "sphinx.ext.autosummary", "sphinx.ext.napoleon", # Numpy style docstrings "sphinx.ext.linkcode", "sphinx.ext.extlinks", "sphinxcontrib.jquery", # Needed by sphinx_rtd_theme # Custom "sphinx_copybutton", ] autosummary_generate = True autodoc_default_options = { "members": None, "inherited-members": True, } # copybutton conf copybutton_prompt_text = r">>> |\.\.\. " copybutton_prompt_is_regexp = True # Shortcuts for sphinx.ext.extlinks extlinks = { # 'alias' : (url_prefix, caption) # Usage :dcm:`link text ` "dcm": ("http://dicom.nema.org/medical/dicom/current/output/chtml/%s", None), "gh": ("https://github.com/pydicom/%s", None), "issue": ("https://github.com/pydicom/pydicom/issues/%s", "#%s"), "pr": ("https://github.com/pydicom/pydicom/pull/%s", "#%s"), } # intersphinx configuration intersphinx_mapping = { "python": (f"https://docs.python.org/{sys.version_info.major}", None), "numpy": ("https://numpy.org/doc/stable", None), "scipy": ("https://docs.scipy.org/doc/scipy", None), "matplotlib": ("https://matplotlib.org/stable", None), "pillow": ("https://pillow.readthedocs.io/en/stable", None), } sphinx_gallery_conf = { "default_thumb_file": "assets/img/pydicom_flat_black_alpha.png", # path to your examples scripts "examples_dirs": "../examples", # path where to save gallery generated examples "gallery_dirs": "auto_examples", "backreferences_dir": os.path.join("generated"), # to make references clickable "doc_module": "pydicom", "reference_url": {"pydicom": None}, } napoleon_google_docstring = False napoleon_numpy_docstring = True # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8' # The main toctree document. master_doc = "index" # General information about the project. project = "pydicom" year = datetime.now().strftime("%Y") copyright = f"2008-{year}, Darcy Mason and pydicom contributors" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = pydicom.__version__ # The full version, including alpha/beta/rc tags. release = pydicom.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. # unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ["_build"] # The reST default role (used for this markup: `text`) # to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # Custom style html_style = "css/pydicom.css" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output ----------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "assets/img/pydicom_flat_black.svg" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "assets/img/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_use_modindex = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. html_show_sourcelink = False # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = "pydicomdoc" # -- Options for LaTeX output -------------------------------------- # The paper size ('letter' or 'a4'). # latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). # latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, # documentclass [howto/manual]). latex_documents = [ ( "index", "pydicom.tex", "pydicom Documentation", "Darcy Mason and pydicom contributors", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # Additional stuff for the LaTeX preamble. # latex_preamble = '' # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_use_modindex = True def generate_example_rst(app, what, name, obj, options, lines): # generate empty examples files, so that we don't get # inclusion errors if there are no examples for a class / module examples_path = os.path.join(app.srcdir, "generated", f"{name}.examples") if not os.path.exists(examples_path): # touch file open(examples_path, "w").close() def setup(app): app.connect("autodoc-process-docstring", generate_example_rst) app.add_css_file("css/pydicom.css") # Example configuration for intersphinx: refer to # the Python standard library. # intersphinx_mapping = {'https://docs.python.org/': None} # The following is used by sphinx.ext.linkcode to provide links to github linkcode_resolve = make_linkcode_resolve( "pydicom", "https://github.com/pydicom/pydicom/blob/{revision}/{package}/{path}#L{lineno}", ) doctest_global_setup = """ import pydicom import os, os.path testfile_path = os.path.join(pydicom.__path__[0], '../tests/test_files') save_dir = os.getcwd() os.chdir(testfile_path) """ pydicom-pydicom-20aa4b7/doc/faq/000077500000000000000000000000001515706620200165425ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/faq/index.rst000066400000000000000000000055561515706620200204160ustar00rootroot00000000000000.. _faq: ========================== Frequently asked questions ========================== .. _faq_general: General ======= How do I cite pydicom? ---------------------- The easiest method is probably to `find the Zenodo DOI `_ for the version you are using and then entering your required citation style in the *Cite as* box. Alternatively, you can use something along the lines of: .. code-block:: text Mason, D. L., et al, pydicom: An open source DICOM library, https://github.com/pydicom/pydicom [Online; accessed YYYY-MM-DD]. .. _faq_install: Installation ============ What are pydicom's prerequisites? --------------------------------- Required ~~~~~~~~ *pydicom* requires Python. Optional ~~~~~~~~ When manipulating *Pixel Data* it's recommended you install `NumPy `_. When dealing with compressed *Pixel Data* see :ref:`this table` for which libraries are required. .. _faq_install_version: What version of Python can I use? --------------------------------- +-----------------+------------------+---------------------------+ | pydicom version | Release date | Python versions | +=================+==================+===========================+ | 1.0 | March 2018 | 2.7, 3.4, 3.5, 3.6 | +-----------------+------------------+---------------------------+ | 1.1 | June 2018 | 2.7, 3.4, 3.5, 3.6 | +-----------------+------------------+---------------------------+ | 1.2 | October 2018 | 2.7, 3.4, 3.5, 3.6 | +-----------------+------------------+---------------------------+ | 1.3 | July 2019 | 2.7, 3.4, 3.5, 3.6 | +-----------------+------------------+---------------------------+ | 1.4 | January 2020 | 2.7, 3.5, 3.6, 3.7, 3.8 | +-----------------+------------------+---------------------------+ | 2.0 | May 2020 | 3.5, 3.6, 3.7, 3.8 | +-----------------+------------------+---------------------------+ | 2.1 | November 2020 | 3.6, 3.7, 3.8, 3.9 | +-----------------+------------------+---------------------------+ | 2.2 | August 2021 | 3.6, 3.7, 3.8, 3.9 | +-----------------+------------------+---------------------------+ | 2.3 | March 2022 | 3.6, 3.7, 3.8, 3.9, 3.10 | +-----------------+------------------+---------------------------+ | 2.4 | June 2023 | 3.7, 3.8, 3.9, 3.10, 3.11 | +-----------------+------------------+---------------------------+ | 3.0 | ~September 2024 | 3.10, 3.11, 3.12 | +-----------------+------------------+---------------------------+ What license does pydicom use? ============================== *pydicom* has an MIT-based :gh:`license `. pydicom-pydicom-20aa4b7/doc/guides/000077500000000000000000000000001515706620200172535ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/guides/cli/000077500000000000000000000000001515706620200200225ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/guides/cli/cli_codify.rst000066400000000000000000000116271515706620200226670ustar00rootroot00000000000000 ``pydicom codify`` command ========================== The ``pydicom codify`` command takes a DICOM file and produces Python code to recreate that file, or, optionally a subset within that file. See :ref:`writing_files_using_codify` for full details of writing a complete file. Here we will review the command-line options in more detail than in that section, and show how to export a dataset within a DICOM file that has sequences. .. Warning:: The code produced by ``codify`` will contain all the information in the original file, which may include private health information or other sensitive information. A simple example ---------------- A simple example of using the ``codify`` command would be:: $ pydicom codify pydicom::rtplan.dcm # Coded version of DICOM file 'C:\git\pydicom\pydicom\data\test_files\rtplan.dcm' # Produced by pydicom codify utility script import pydicom from pydicom.dataset import Dataset, FileMetaDataset from pydicom.sequence import Sequence # Main data elements ds = Dataset() ds.InstanceCreationDate = '20030903' ds.InstanceCreationTime = '150031' ds.SOPClassUID = '1.2.840.10008.5.1.4.1.1.481.5' ds.SOPInstanceUID = '1.2.777.777.77.7.7777.7777.20030903150023' ds.StudyDate = '20030716' ds.StudyTime = '153557' . . . Note that prefixing the file specification with ``pydicom::`` will read the file from the *pydicom* test data files rather than from the file system. Command options --------------- In the above example, the output was directed to screen, because no output file was specified. To see the available command options, use the ``help`` command: .. code-block:: pydicom help codify usage: pydicom codify [-h] [-e EXCLUDE_SIZE] [-p] [-s SAVE_AS] filespec [outfile] Read a DICOM file and produce the *pydicom* (Python) code which can create that file positional arguments: filespec File specification, in format [pydicom::]filename[::element]. If `pydicom::` prefix is used, then use the pydicom test file with that name. If `element` is given, use only that data element within the file. Examples: path/to/your_file.dcm, your_file.dcm::StudyDate, pydicom::rtplan.dcm::BeamSequence[0], yourplan.dcm::BeamSequence[0].BeamNumber outfile Filename to write python code to. If not specified, code is written to stdout optional arguments: -h, --help show this help message and exit -e EXCLUDE_SIZE, --exclude-size EXCLUDE_SIZE Exclude binary data larger than specified (bytes). Default is 100 bytes -p, --include-private Include private data elements (default is to exclude them) -s SAVE_AS, --save-as SAVE_AS Specify the filename for ds.save_as(save_filename); otherwise the input name + '_from_codify' will be used Binary data (e.g. pixels) larger than --exclude-size (default 100 bytes) is not included. A dummy line with a syntax error is produced. Private data elements are not included by default. For example:: pydicom codify -s savename.dcm dicomfile.dcm pythoncode.py would read the DICOM file "dicomfile.dcm" and write the Python code to file "pythoncode.py". In that code, near the end of the file would be a ``ds.save_as("savename.dcm", ...)`` line. .. Note:: By default, any private data elements within the file are not translated to code. If you want to include them, use the ``-p`` parameter. Codifying a part of a DICOM file -------------------------------- Note that the ``filespec`` argument to the ``codify`` command, as for :ref:`the show command`, allows you to specify a data element within the file, rather than the whole file:: pydicom codify pydicom::rtplan.dcm::FractionGroupSequence[0] # Coded version of non-file dataset ... # Main data elements ds = Dataset() ds.FractionGroupNumber = "1" ds.NumberOfFractionsPlanned = "30" ds.NumberOfBeams = "1" ds.NumberOfBrachyApplicationSetups = "0" # Referenced Beam Sequence refd_beam_sequence = Sequence() ds.ReferencedBeamSequence = refd_beam_sequence # Referenced Beam Sequence: Referenced Beam 1 refd_beam1 = Dataset() refd_beam1.BeamDoseSpecificationPoint = [239.531250000000, 239.531250000000, -751.87000000000] ... Currently, only a data element which is a :class:`~pydicom.dataset.Dataset` (an item within a :class:`~pydicom.sequence.Sequence`) is accepted. The resulting code would not on its own produce a correct DICOM file, but could be useful as a model when creating more complete code. For example, issuing code for one item in a ``Sequence`` could be the starting point towards a loop producing a number of sequence items. pydicom-pydicom-20aa4b7/doc/guides/cli/cli_dev.rst000066400000000000000000000055061515706620200221670ustar00rootroot00000000000000 Extending the CLI ================= Developers can create their own 'subcommands' for the ``pydicom`` command, by adding entry points to their package's setup.py file, specifying a callback function to register the subcommand and its arguments. If you wanted to create two subcommands, 'command1' and 'command2', your setup.py file should include something like: .. code-block:: python from setuptools import setup if __name__ == '__main__': setup( name="yourpackage", # various setup options..., entry_points = { "pydicom_subcommands": [ "command1 = yourpackage.command1module.add_subparser", "command2 = yourpackage.command2module.add_subparser" ] } ) The ``"pydicom_subcommands"`` is a literal string; this must not be changed or *pydicom* will not find your subcommand. The ``add_subparser`` function name could be changed if you wish, but usually would be used by convention, and is assumed in the following examples. In the module you have specified, create the ``add_subparser`` function, which takes a single argument ``subparsers``, and a ``do_command`` function, which will take the call when you subcommand is actually used at the command line:: from pydicom.cli.main import filespec_help, filespec_parser def add_subparser(subparsers): # Register the sub-parser subparser = subparsers.add_parser( "subcommandname", description="Summary of your subcommand" ) subparser.add_argument( "filespec", help=filespec_help, type=filespec_parser ) subparser.add_argument( ... ) subparser.set_defaults(func=do_command) And define your command function:: def do_command(args): for ds, element_val in args.filespec: if args.yourarg: # Do something... # work with the dataset ds or element as needed... The ``pydicom`` command uses Python's `argparse `_ library to process commands. The above code snippets show adding the ``filespec`` argument, and processing the resulting dataset-element_value pairs in the ``do_command()`` function. This is recommended if you wish to use the filespec as was seen in the :ref:`cli_show` and :ref:`cli_codify` sections. If not, you can just create a normal arg with the type set to ``argparse.FileType`` to open files yourself. The above has been shown in relation to a different package than *pydicom*; however, if you think your command has general use, please consider contributing it to *pydicom*: in that case, change the entry points in the *pydicom* ``setup.py`` script, and add a module under ``pydicom.cli`` and create a pull request. pydicom-pydicom-20aa4b7/doc/guides/cli/cli_guide.rst000066400000000000000000000006321515706620200225010ustar00rootroot00000000000000:orphan: .. rubric:: pydicom command-line interface .. _cli_guide: ============================ Command-line Interface Guide ============================ .. versionadded:: 2.2 .. contents:: :depth: 1 :local: :backlinks: top .. _cli_intro: .. include:: cli_intro.rst .. _cli_show: .. include:: cli_show.rst .. _cli_codify: .. include:: cli_codify.rst .. _cli_dev: .. include:: cli_dev.rst pydicom-pydicom-20aa4b7/doc/guides/cli/cli_intro.rst000066400000000000000000000170611515706620200225430ustar00rootroot00000000000000 Introduction ============ Starting in v2.2, *pydicom* offers a useful command-line interface (CLI) for exploring DICOM files, and access to the `codify` option for creating pydicom Python code. Additional subcommands may be added over time. Example at the command line in a terminal window: .. code-block:: console $ pydicom show pydicom::rtplan.dcm Dataset.file_meta ------------------------------- (0002, 0000) File Meta Information Group Length UL: 156 (0002, 0001) File Meta Information Version OB: b'\x00\x01' (0002, 0002) Media Storage SOP Class UID UI: RT Plan Storage (0002, 0003) Media Storage SOP Instance UID UI: 1.2.999.999.99.9.9999.9999.20030903150023 (0002, 0010) Transfer Syntax UID UI: Implicit VR Little Endian (0002, 0012) Implementation Class UID UI: 1.2.888.888.88.8.8.8 ------------------------------------------------- (0008, 0012) Instance Creation Date DA: '20030903' (0008, 0013) Instance Creation Time TM: '150031' (0008, 0016) SOP Class UID UI: RT Plan Storage (0008, 0018) SOP Instance UID UI: 1.2.777.777.77.7.7777.7777.20030903150023 (0008, 0020) Study Date DA: '20030716' ... Note that prefixing the file specification with ``pydicom::`` will read the file from the *pydicom* test data files rather than from the normal file system. The following examples will use that so that you can replicate these examples exactly. In normal use, you would leave the ``pydicom::`` prefix off when working with your files. You can also show just parts of the DICOM file by specifying a data element using the usual *pydicom* keyword notation: .. code-block:: console $ pydicom show pydicom::rtplan.dcm::FractionGroupSequence[0] (300a, 0071) Fraction Group Number IS: "1" (300a, 0078) Number of Fractions Planned IS: "30" (300a, 0080) Number of Beams IS: "1" (300a, 00a0) Number of Brachy Application Setups IS: "0" (300c, 0004) Referenced Beam Sequence 1 item(s) ---- (300a, 0082) Beam Dose Specification Point DS: [239.531250000000, 239.531250000000, -751.87000000000] (300a, 0084) Beam Dose DS: "1.0275401" (300a, 0086) Beam Meterset DS: "116.0036697" (300c, 0006) Referenced Beam Number IS: "1" --------- You can see the available subcommands by simply typing ``pydicom`` with no arguments, or with ``pydicom help``: .. code-block:: console $ pydicom help Use pydicom help [subcommand] to show help for a subcommand Available subcommands: codify, show And, as noted in the block above, you get help for a particular subcommand by typing ``pydicom help [subcommand]``. For example: .. code-block:: console $ pydicom help show usage: pydicom show [-h] [-x] [-t] [-q] filespec Display all or part of a DICOM file positional arguments: filespec File specification, in format [pydicom::]filename[::element]. If `pydicom::` prefix is used, then show the pydicom test file with that name. If `element` is given, use only that data element within the file. Examples: path/to/your_file.dcm, your_file.dcm::StudyDate, pydicom::rtplan.dcm::BeamSequence[0], yourplan.dcm::BeamSequence[0].BeamNumber optional arguments: -h, --help show this help message and exit -x, --exclude-private Don't show private data elements -t, --top Only show top level -q, --quiet Only show basic information Installing the pydicom CLI -------------------------- The ``pydicom`` command should automatically be available after you `pip install pydicom`. It should not require any updates to the system path or environment variables. If you are helping develop *pydicom* code, and are using git clones, you will have to ``pip install -e .`` or ``python setup.py develop`` from the `pydicom` repository root. This has to be repeated for any changes to `setup.py` (e.g. to add a new subcommand). If you are developing subcommands within your own package, you will need to reinstall your package similar to the above as you add entry points. Combining with other CLIs ------------------------- CLIs are useful for general exploration while programming, but also can be combined with other command-line filters for additional functionality. The following is an example of piping the output of the pydicom 'show' subcommand into 'grep', filtering for lines with either "Dose" or "Sequence" in them: .. code-block:: console $ pydicom show pydicom::rtplan.dcm | grep "Dose\|Sequence" (300a, 0010) Dose Reference Sequence 2 item(s) ---- (300a, 0012) Dose Reference Number IS: "1" (300a, 0014) Dose Reference Structure Type CS: 'COORDINATES' (300a, 0016) Dose Reference Description LO: 'iso' (300a, 0018) Dose Reference Point Coordinates DS: [239.531250000000, 239.531250000000, -741.87000000000] (300a, 0020) Dose Reference Type CS: 'ORGAN_AT_RISK' (300a, 0023) Delivery Maximum Dose DS: "75.0" (300a, 002c) Organ at Risk Maximum Dose DS: "75.0" (300a, 0012) Dose Reference Number IS: "2" (300a, 0014) Dose Reference Structure Type CS: 'COORDINATES' (300a, 0016) Dose Reference Description LO: 'PTV' (300a, 0018) Dose Reference Point Coordinates DS: [239.531250000000, 239.531250000000, -751.87000000000] (300a, 0020) Dose Reference Type CS: 'TARGET' (300a, 0026) Target Prescription Dose DS: "30.826203" (300a, 0070) Fraction Group Sequence 1 item(s) ---- (300c, 0004) Referenced Beam Sequence 1 item(s) ---- (300a, 0082) Beam Dose Specification Point DS: [239.531250000000, 239.531250000000, -751.87000000000] (300a, 0084) Beam Dose DS: "1.0275401" (300a, 00b0) Beam Sequence 1 item(s) ---- (300a, 00b6) Beam Limiting Device Sequence 2 item(s) ---- (300a, 0111) Control Point Sequence 2 item(s) ---- (300a, 0115) Dose Rate Set DS: "650.0" (300a, 011a) Beam Limiting Device Position Sequence 2 item(s) ---- (300c, 0050) Referenced Dose Reference Sequence 2 item(s) ---- (300a, 010c) Cumulative Dose Reference Coefficie DS: "0.0" (300c, 0051) Referenced Dose Reference Number IS: "1" (300a, 010c) Cumulative Dose Reference Coefficie DS: "0.0" (300c, 0051) Referenced Dose Reference Number IS: "2" (300c, 0050) Referenced Dose Reference Sequence 2 item(s) ---- (300a, 010c) Cumulative Dose Reference Coefficie DS: "0.9990268" (300c, 0051) Referenced Dose Reference Number IS: "1" (300a, 010c) Cumulative Dose Reference Coefficie DS: "1.0" (300c, 0051) Referenced Dose Reference Number IS: "2" (300a, 0180) Patient Setup Sequence 1 item(s) ---- (300c, 0002) Referenced RT Plan Sequence 1 item(s) ---- (300c, 0060) Referenced Structure Set Sequence 1 item(s) ---- Using the "or Sequence" (```\|Sequence```) regular expression as above allows you to see any filtered results in relation to their parent Sequences. See the :ref:`cli_show` section for more examples of the `show` command, its options, and the ability to show only data elements or sequences within the file. pydicom-pydicom-20aa4b7/doc/guides/cli/cli_show.rst000066400000000000000000000133341515706620200223670ustar00rootroot00000000000000 ``pydicom show`` command ======================== The `pydicom show` command displays representation of DICOM files or parts of them from a command-line terminal. Some examples were already given in the :ref:`cli_intro`, but here we will show some additional options. To see the available options, in a command-line terminal, type ``pydicom help show`` or ``pydicom show -h``. .. code-block:: console $ pydicom help show usage: pydicom show [-h] [-x] [-t] [-q] filespec Display all or part of a DICOM file positional arguments: filespec File specification, in format [pydicom::]filename[::element]. If `pydicom::` prefix is present, then use the pydicom test file with that name. If `element` is given, use only that data element within the file. Examples: path/to/your_file.dcm, your_file.dcm::StudyDate, pydicom::rtplan.dcm::BeamSequence[0], yourplan.dcm::BeamSequence[0].BeamNumber optional arguments: -h, --help show this help message and exit -x, --exclude-private Don't show private data elements -t, --top Only show top level -q, --quiet Only show basic information The basic command with no options shows all data elements and nested sequences: .. code-block:: console $ pydicom show pydicom::CT_small.dcm Dataset.file_meta ------------------------------- (0002, 0000) File Meta Information Group Length UL: 192 (0002, 0001) File Meta Information Version OB: b'\x00\x01' (0002, 0002) Media Storage SOP Class UID UI: CT Image Storage (0002, 0003) Media Storage SOP Instance UID UI: 1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 (0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian (0002, 0012) Implementation Class UID UI: 1.3.6.1.4.1.5962.2 (0002, 0013) Implementation Version Name SH: 'DCTOOL100' (0002, 0016) Source Application Entity Title AE: 'CLUNIE1' ------------------------------------------------- (0008, 0005) Specific Character Set CS: 'ISO_IR 100' (0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL'] (0008, 0012) Instance Creation Date DA: '20040119' (0008, 0013) Instance Creation Time TM: '072731' (0008, 0014) Instance Creator UID UI: 1.3.6.1.4.1.5962.3 (0008, 0016) SOP Class UID UI: CT Image Storage (0008, 0018) SOP Instance UID UI: 1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 (0008, 0020) Study Date DA: '20040119' . . . (0043, 104b) [DAS xm pattern] SL: 0 (0043, 104c) [TGGC trigger mode] SS: 0 (0043, 104d) [Start scan to X-ray on delay] FL: 0.0 (0043, 104e) [Duration of X-ray on] FL: 10.60060977935791 (7fe0, 0010) Pixel Data OW: Array of 32768 elements (fffc, fffc) Data Set Trailing Padding OB: Array of 126 elements Note that prefixing the file specification with ``pydicom::`` will read the file from the *pydicom* test data files rather than from the file system. You can also show just parts of the DICOM file by specifying a data element using the usual pydicom keyword notation: .. code-block:: console $ pydicom show pydicom::CT_small.dcm::PatientName CompressedSamples^CT1 $ pydicom show pydicom::rtplan.dcm::FractionGroupSequence [(300a, 0071) Fraction Group Number IS: "1" (300a, 0078) Number of Fractions Planned IS: "30" (300a, 0080) Number of Beams IS: "1" (300a, 00a0) Number of Brachy Application Setups IS: "0" (300c, 0004) Referenced Beam Sequence 1 item(s) ---- (300a, 0082) Beam Dose Specification Point DS: [239.531250000000, 239.531250000000, -751.87000000000] (300a, 0084) Beam Dose DS: "1.0275401" (300a, 0086) Beam Meterset DS: "116.0036697" (300c, 0006) Referenced Beam Number IS: "1" ---------] The ``-q`` quiet argument shows a minimal version of some of the information in the file, using just the DICOM keyword and value (not showing the tag numbers and VR). The example below shows the quiet mode with an image slice:: pydicom show -q pydicom::ct_small.dcm SOPClassUID: CT Image Storage PatientName: CompressedSamples^CT1 PatientID: 1CT1 StudyID: 1CT1 StudyDate: 20040119 StudyTime: 072730 StudyDescription: e+1 BitsStored: 16 Modality: CT Rows: 128 Columns: 128 SliceLocation: -77.2040634155 And the following example shows an RT Plan in quiet mode:: pydicom show -q pydicom::rtplan.dcm SOPClassUID: RT Plan Storage PatientName: Last^First^mid^pre PatientID: id00001 StudyID: study1 StudyDate: 20030716 StudyTime: 153557 StudyDescription: N/A Plan Label: Plan1 Plan Name: Plan1 Fraction Group 1 30 fraction(s) planned Brachy Application Setups: 0 Beam 1 Dose 1.02754010000000 Meterset 116.003669700000 Beam 1 'Field 1' TREATMENT STATIC PHOTON energy 6.00000000000000 gantry 0.0, coll 0.0, couch 0.0 (0 wedges, 0 comps, 0 boli, 0 blocks) Quiet modes always show the SOP Class UID, patient and study information as shown in the above two examples. After those elements, custom values for different SOP classes are shown. Currently "Image Storage" and "RT Plan Storage" classes have custom extra information. Please submit an issue on the *pydicom* issues list or a pull request to help us expand the list of custom 'quiet' mode SOP Classes. pydicom-pydicom-20aa4b7/doc/guides/decoding/000077500000000000000000000000001515706620200210275ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/guides/decoding/decoder_options.rst000066400000000000000000000240031515706620200247400ustar00rootroot00000000000000.. _guide_decoder_options: ========================== Pixel Data Decoder Options ========================== .. currentmodule:: pydicom.pixels.decoders.base The following applies to the functions and class methods that use the :doc:`pixels` backend for decoding pixel data. When decoding to a NumPy :class:`~numpy.ndarray`: * The :attr:`Dataset.pixel_array` property (configurable via :meth:`Dataset.pixel_array_options()`) * :func:`~pydicom.pixels.pixel_array` * :func:`~pydicom.pixels.iter_pixels` * :func:`~pydicom.pixels.decompress` * :meth:`Decoder.as_array()` * :meth:`Decoder.iter_array()` When decoding to a buffer (such as :class:`bytes`, :class:`bytearray` or :class:`memoryview`): * :meth:`Decoder.as_buffer()` * :meth:`Decoder.iter_buffer()` *Image Pixel* Options ===================== The following options are required when the decoding source `src` is not a :class:`~pydicom.dataset.Dataset` and are used to describe the encoded pixel data. They may also be used to override the corresponding element values when `src` is a :class:`~pydicom.dataset.Dataset`: +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | Option | Type | Corresponding Element | Description | | | +-----------+---------------+ | | | | Tag | Name | | +==============================+============+===========+===============+==========================================================+ | `rows` |:class:`int`|(0028,0010)| *Rows* | The number of :ref:`rows` in `src` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `columns` |:class:`int`|(0028,0011)| *Columns* | The number of :ref:`columns` in `src` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `number_of_frames` |:class:`int`|(0028,0008)| *Number | The :ref:`number of frames` in `src` | | | | | of Frames* | | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `samples_per_pixel` |:class:`int`|(0028,0002)| *Samples | The number of :ref:`samples per pixel | | | | | Per Pixel* | ` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `bits_allocated` |:class:`int`|(0028,0100)| *Bits | The number of bits used to :ref:`contain each pixel | | | | | Allocated* | ` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `bits_stored` |:class:`int`|(0028,0101)|*Bits Stored* | The number of bits actually :ref:`used by each pixel | | | | | | ` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `photometric_interpretation` |:class:`str`|(0028,0004)|*Photometric | The :ref:`color space` | | | | |Interpretation*| of the encoded pixel data | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `pixel_representation` |:class:`int`|(0028,0103)|*Pixel | Required if `pixel_keyword` is ``'PixelData'``, whether | | | | |Representation*| the pixels are :ref:`signed or unsigned | | | | | | ` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `planar_configuration` |:class:`int`|(0028,0006)|*Planar | Required if `samples_per_pixel` > 1, the :ref:`pixel | | | | |Configuration* | encoding order` | +------------------------------+------------+-----------+---------------+----------------------------------------------------------+ | `pixel_keyword` |:class:`str`| | Required if `src` uses a :ref:`native transfer syntax | | | | | `, the keyword of the element containing| | | | | the pixel data. One of ``'PixelData'``, | | | | | ``'FloatPixelData'``, ``'DoubleFloatPixelData'`` | +------------------------------+------------+---------------------------+----------------------------------------------------------+ Image Processing Options ======================== The following options may be used with any transfer syntax for controlling the processing applied after decoding to a NumPy :class:`~numpy.ndarray`: * `as_rgb`: :class:`bool` - if ``True`` (default) then convert pixel data with a YCbCr :ref:`photometric interpretation` such as ``"YBR_FULL_422"`` to RGB. * `force_rgb`: :class:`bool` - if ``True`` then force a YCbCr to RGB color space conversion on the array (default ``False``). * `force_ybr`: :class:`bool` - if ``True`` then force an RGB to YCbCr color space conversion on the array (default ``False``). Miscellaneous Options ===================== The following options may be used with both native (uncompressed) and encapsulated (compressed) transfer syntaxes when decoding to a NumPy :class:`~numpy.ndarray`: * `correct_unused_bits`: :class:`bool` - if ``True`` (default) and *Bits Stored* doesn't equal *Bits Allocated* then apply bit-shifting operations to correct for any misinterpretation due to the unused bits. For example, if *Bits Stored* is 5 and *Bits Allocated* is 8 then the 3 most significant bits are unused. A raw value of ``0b00011001`` with a *Pixel Representation* of 1 would therefore be interpreted as the value 25 if `correct_unused_bits` is ``False`` instead of its correct value of -7. However, in most cases this correction shouldn't be necessary as the unused bits are typically filled with values that will produce the correct interpretation. The following options may be used with both native (uncompressed) and encapsulated (compressed) transfer syntaxes when decoding to a NumPy :class:`~numpy.ndarray` or buffer-like object: * `allow_excess_frames`: :class:`bool` - if ``True`` (default) and `src` contains more frames of data than given by the value of (0028,0008) *Number of Frames* then include those extra frames in the returned data, otherwise return only the number of frames given by *Number of Frames*. The following options may be used with native (uncompressed) transfer syntaxes when decoding to a NumPy :class:`~numpy.ndarray`: * `view_only`: :class:`bool` - if ``True`` and `src` is a :class:`~pydicom.dataset.Dataset` or buffer-like then make a best effort attempt to return an :class:`~numpy.ndarray` that's a `view `_ on the original buffer (default ``False``). Note that if the original buffer is immutable then the returned :class:`~numpy.ndarray` will be read-only. The following options may be used with encapsulated (compressed) transfer syntaxes of the corresponding type when decoding to a NumPy :class:`~numpy.ndarray`: * `apply_jls_sign_correction`: :class:`bool` - if ``True`` (default), `src` contains JPEG-LS compressed pixel data and the pixel representation is 1, then convert the raw decoded pixel values from unsigned to signed integers. * `apply_j2k_sign_correction`: :class:`bool` - if ``True`` (default), `src` contains JPEG 2000 compressed pixel data and the pixel representation doesn't match the signedness given in the JPEG 2000 codestream, then convert the raw decoded pixel values to match the pixel representation. .. _guide_decoder_plugin_opts: Decoding Plugin Options ======================= The following options are plugin and transfer syntax specific. *RLE Lossless* -------------- +---------------+---------------------+----------------------------------------+ | Plugin | Option | Description | | name | | | +===============+=====================+========================================+ | ``pydicom`` |``rle_segment_order``| ``">"`` for big endian segment order | +---------------+---------------------+ (default) or ``"<"`` for little endian | | ``pylibjpeg`` |``byteorder`` | segment order | +---------------+---------------------+----------------------------------------+ pydicom-pydicom-20aa4b7/doc/guides/decoding/decoder_plugins.rst000066400000000000000000000125431515706620200247340ustar00rootroot00000000000000.. _guide_decoder_plugins: ========================== Pixel Data Decoder Plugins ========================== .. note:: This guide is intended for advanced users who need support for something not provided by the :doc:`existing decoder plugins `. *Pixel Data* decoding in *pydicom* uses a :class:`~pydicom.pixels.decoders.base.Decoder` instance to manage plugins that perform the actual decoding work. This guide covers the requirements for those plugins and how to add them to *pydicom*. Plugin Requirements =================== Each available pixel data decoder in *pydicom* corresponds directly to a single DICOM *Transfer Syntax UID*, and is intended to provide a mechanism for converting raw encoded source data to unencoded pixel values. In order to do so, each decoder for compressed transfer syntaxes has at least one decoding plugin which performs the actual conversion. An decoding plugin must implement three objects within the same module: * A function named ``is_available`` with the following signature: .. code-block:: python def is_available(uid: pydicom.uid.UID) -> bool: Where `uid` is the *Transfer Syntax UID* for the corresponding decoder as a :class:`~pydicom.uid.UID`. If the plugin supports the `uid` and has its dependencies met then it should return ``True``, otherwise it should return ``False``. * A :class:`dict` named ``DECODER_DEPENDENCIES`` with the type ``dict[pydicom.uid.UID, tuple[str, ...]``, such as: .. code-block:: python from pydicom.uid import RLELossless, JPEG2000 DECODER_DEPENDENCIES = { RLELossless: ('numpy', 'pillow', 'imagecodecs'), JPEG2000: ('numpy', 'gdcm'), } This will be used to provide the user with a list of dependencies required by the plugin. * A function that performs the decoding with the following function signature: .. code-block:: python def decoder(src: bytes, runner: DecodeRunner) -> bytearray | bytes: Where * `src` is a single frame's worth of raw compressed data to be decoded. * `runner` is a :class:`~pydicom.pixels.decoders.base.DecodeRunner` instance that manages the decoding process and has access to the decoding options, either directly through the class properties or indirectly with the :meth:`~pydicom.pixels.decoders.base.DecodeRunner.get_option` method. At a minimum the following decoding options should be available: * ``transfer_syntax_uid``: :class:`~pydicom.uid.UID` - the *Transfer Syntax UID* of the encoded data. * ``rows``: :class:`int` - the number of rows of pixels in decoded data. * ``columns``: :class:`int` - the number of columns of pixels in the decoded data. * ``samples_per_pixel``: :class:`int` - the number of samples used per pixel, e.g. 1 for grayscale images or 3 for RGB. * ``number_of_frames``: :class:`int` - the number of image frames contained in `src` * ``bits_allocated``: :class:`int` - the number of bits used to contain each pixel in `src`, should be a multiple of 8. * ``bits_stored``: :class:`int` - the number of bits actually used by each pixel in `src`, e.g. 12-bit pixel data (range 0 to 4095) will be contained by 16-bits (range 0 to 65535). * ``photometric_interpretation``: :class:`str` - the color space of the encoded data, such as ``'YBR_FULL'`` * ``pixel_keyword``: :class:`str` - one of ``"PixelData"``, ``"FloatPixelData"``, ``"DoubleFloatPixelData"``. And conditionally: * ``pixel_representation``: :class:`int` - required when `pixel_keyword` is ``"PixelData"``, ``0`` for unsigned integers, ``1`` for signed. * ``planar_configuration``: :class:`int` - required when ``samples_per_pixel`` > 1, ``0`` for color-by-pixel, ``1`` for color-by-plane. If your decoder needs to signal that one of the decoding option values needs to be modified then this can be done with the :meth:`~pydicom.pixels.decoders.base.DecodeRunner.set_option` method. This should only be done after successfully decoding the frame, as if the decoding fails changing the option value may cause issues with other decoding plugins that may also attempt to decode the same frame. It's also important to be aware that any changes you make will also affect following frames (if any). When possible it's recommended that the decoding function return the decoded pixel data as a :class:`bytearray` to minimize later memory usage. An example of the requirements of a plugin is available :gh:`here `. Adding Plugins to a Decoder =========================== Additional plugins can be added to an existing decoder with the :meth:`~pydicom.pixels.decoders.base.Decoder.add_plugin` method, which takes the a unique :class:`str` `plugin_label`, and a :class:`tuple` of ``('the import path to the decoder function's module', 'decoder function name')``. For example, if you'd import your decoder function `my_decoder_func` with ``from my_package.decoders import my_decoder_func``, then you'd do the following: .. code-block:: python from pydicom.pixels.decoders import RLELosslessDecoder RLELosslessDecoder.add_plugin( 'my_decoder', # the plugin's label ('my_package.decoders', 'my_decoder_func') # the import paths ) The ``my_package.decoders`` module must contain the encoding function and the ``DECODER_DEPENDENCIES`` and ``is_available`` objects. pydicom-pydicom-20aa4b7/doc/guides/decoding/index.rst000066400000000000000000000002401515706620200226640ustar00rootroot00000000000000 =================== Pixel Data Decoding =================== Decoding plugin information: .. toctree:: :maxdepth: 1 decoder_options decoder_plugins pydicom-pydicom-20aa4b7/doc/guides/element_value_types.rst000066400000000000000000000332551515706620200240660ustar00rootroot00000000000000============================ Element VRs and Python types ============================ .. currentmodule:: pydicom DICOM elements can contain anything from ASCII strings to unicode text, decimals, floats, signed and unsigned integers of different byte-depth and even encoded data. The format of the value of an element is given by its :dcm:`Value Representation` or VR, and a list of VRs is given in the DICOM Standard in Part 5, :dcm:`Table 6.2-1 `. So when using *pydicom*, what Python type should be used with a given VR to ensure that the value gets written correctly? * Elements of any VR: * Can be set as empty by using ``None`` * Can have their values set using their *set using* or *stored as* type from the table below * Non-**SQ** element values: * Can also be set using a :class:`list` of their *set using* type - for :dcm:`Value Multiplicity` (VM) > 1, the value will be stored as a :class:`~multival.MultiValue` of their *stored as* type * However, according to the DICOM Standard, elements with VR **LT**, **OB**, **OD**, **OF**, **OL**, **OW**, **ST**, **UN**, **UR** and **UT** should never have a VM greater than 1. * **SQ** element values should be set using a :class:`list` of zero or more :class:`~dataset.Dataset` instances. +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | VR | Name | Set using | Stored as (T) | Type hint for element value | +====+==================+============================+===================================+=============================+ | AE | Application | :class:`str` | :class:`str` | None | T | | | | Entity | | | MutableSequence[T] | +----+------------------+----------------------------+-----------------------------------+ | | AS | Age String | :class:`str` | :class:`str` | | +----+------------------+----------------------------+-----------------------------------+ | | AT | Attribute Tag | Tag\ :sup:`1` | :class:`~tag.BaseTag` | | +----+------------------+----------------------------+-----------------------------------+ | | CS | Code String | :class:`str` | :class:`str` | | +----+------------------+----------------------------+-----------------------------------+ | | DA | Date | :class:`str` | :class:`str` or | | | | | | :class:`~valuerep.DA`\ :sup:`2` | | +----+------------------+----------------------------+-----------------------------------+ | | DS | Decimal String | :class:`str`, | :class:`~valuerep.DSfloat` or | | | | | :class:`float` | :class:`~valuerep.DSdecimal`\ | | | | | or :class:`int` | :sup:`3` | | +----+------------------+----------------------------+-----------------------------------+ | | DT | Date Time | :class:`str` | :class:`str` or | | | | | | :class:`~valuerep.DT`\ :sup:`2` | | +----+------------------+----------------------------+-----------------------------------+ | | FL | Floating Point | :class:`float` | :class:`float` | | | | Single | | | | +----+------------------+ | | | | FD | Floating Point | | | | | | Double | | | | +----+------------------+----------------------------+-----------------------------------+ | | IS | Integer String | :class:`str` | :class:`~valuerep.IS` | | | | | or :class:`int` | | | +----+------------------+----------------------------+-----------------------------------+ | | LO | Long String | :class:`str` | :class:`str` | | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | LT | Long Text | :class:`str` | :class:`str` | None | T | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | OB | Other Byte | :class:`bytes` or | :class:`bytes` or | None | T | +----+------------------+ :class:`io.BufferedIOBase` | :class:`io.BufferedIOBase` | | | OD | Other Double | \ :sup:`4` | | | +----+------------------+ | | | | OF | Other Float | | | | +----+------------------+ | | | | OL | Other Long | | | | +----+------------------+ | | | | OV | Other 64-bit | | | | | | Very Long | | | | +----+------------------+ | | | | OW | Other Word | | | | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | PN | Person Name | :class:`str` | :class:`~valuerep.PersonName` | None | T | | +----+------------------+----------------------------+-----------------------------------+ MutableSequence[T] | | SH | Short String | :class:`str` | :class:`str` | | +----+------------------+----------------------------+-----------------------------------+ | | SL | Signed Long | :class:`int` | :class:`int` | | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | SQ | Sequence of | :class:`list` | :class:`~sequence.Sequence` | MutableSequence[ | | | Items | | | :class:`~dataset.Dataset`] | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | SS | Signed Short | :class:`int` | :class:`int` | None | T | | | | | | | MutableSequence[T] | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | ST | Short Text | :class:`str` | :class:`str` | None | T | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | SV | Signed 64-bit | :class:`int` | :class:`int` | None | T | | | | Very Long | | | MutableSequence[T] | +----+------------------+----------------------------+-----------------------------------+ | | TM | Time | :class:`str` | :class:`str` or | | | | | | :class:`~valuerep.TM`\ :sup:`2` | | +----+------------------+----------------------------+-----------------------------------+ | | UC | Unlimited | :class:`str` | :class:`str` | | | | Characters | | | | +----+------------------+----------------------------+-----------------------------------+ | | UI | Unique | :class:`str` | :class:`~uid.UID` | | | | Identifier (UID) | | | | +----+------------------+----------------------------+-----------------------------------+ | | UL | Unsigned Long | :class:`int` | :class:`int` | | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | UN | Unknown | :class:`bytes` | :class:`bytes` | None | T | +----+------------------+----------------------------+-----------------------------------+ | | UR | URI/URL | :class:`str` | :class:`str` | | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | US | Unsigned Short | :class:`int` | :class:`int` | None | T | | | | | | | MutableSequence[T] | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | UT | Unlimited Text | :class:`str` | :class:`str` | None | T | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | UV | Unsigned 64-bit | :class:`int` | :class:`int` | None | T | | | | Very Long | | | MutableSequence[T] | +----+------------------+----------------------------+-----------------------------------+-----------------------------+ | :sup:`1` Any type accepted by :func:`~tag.Tag` can be used | :sup:`2` If :attr:`config.datetime_conversion` = ``True`` (default ``False``) | :sup:`3` If :attr:`config.use_DS_decimal` = ``True`` (default ``False``) | :sup:`4` See notes for bufferable O* VRs below Bufferable O* VRs ----------------- The value for elements with O\* VRs (**OB**, **OD**, **OF**, **OL**, **OV** and **OW**) can be set using an object that inherits from :class:`io.BufferedIOBase` such as the :class:`io.BufferedReader` instances returned by the :func:`open` built-in when in read mode. This allows you to avoid having to read a large amount of data into memory when creating datasets:: from pydicom import Dataset, FileMetaDataset from pydicom.uid import ExplicitVRLittleEndian with open("a_large_amount_of_data", "rb") as f: ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.PixelData = f ds.save_as("large_dataset.dcm") To use a buffered *Pixel Data* value with a dataset that has a compressed transfer syntax such as *JPEG 2000 Lossles*, the :func:`~pydicom.encaps.encapsulate_buffer` and :func:`~pydicom.encaps.encapsulate_extended_buffer` functions can be used to encapsulate the buffered frames:: from pydicom import Dataset, FileMetaDataset from pydicom.encaps import encapsulate_buffer from pydicom.uid import JPEG2000Lossless with open("a_large_jpeg2000_file.j2k", "rb") as f: ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEG2000Lossless ds.PixelData = encapsulate_buffer([f]) ds.save_as("large_compressed_dataset.dcm") However, be aware that Datasets containing buffered objects that don't normally work with :mod:`pickle` or :func:`~copy.deepcopy` such as :class:`~io.BufferedReader` are not able to be pickled or deepcopied. pydicom-pydicom-20aa4b7/doc/guides/encoding/000077500000000000000000000000001515706620200210415ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/guides/encoding/encoder_plugin_options.rst000066400000000000000000000115501515706620200263450ustar00rootroot00000000000000.. _guide_encoder_plugin_opts: ======================= Encoder Plugins Options ======================= .. currentmodule:: pydicom.pixels.encoders .. _encoder_plugin_pydicom: pydicom ======= +--------------------------+----------+--------+-------------+ | Encoder | Options | + +----------+--------+-------------+ | | Key | Value | Description | +==========================+==========+========+=============+ |:attr:`RLELosslessEncoder`| (none available) | +--------------------------+----------+--------+-------------+ .. _encoder_plugin_gdcm: gdcm ===== +--------------------------+----------+--------+-------------+ | Encoder | Options | + +----------+--------+-------------+ | | Key | Value | Description | +==========================+==========+========+=============+ |:attr:`RLELosslessEncoder`| (none available) | +--------------------------+----------+--------+-------------+ .. _encoder_plugin_pylibjpeg: pylibjpeg ========= +--------------------------------+----------------------------+-------------+-------------------------------+ | Encoder | Options | + +----------------------------+-------------+-------------------------------+ | | Key | Value | Description | +================================+============================+=============+===============================+ |:attr:`JPEG2000LosslessEncoder` | ``'use_mct'`` | bool | Enable MCT for RGB pixel data | | | | | (default ``True``) | +--------------------------------+----------------------------+-------------+-------------------------------+ |:attr:`JPEG2000Encoder` | ``'use_mct'`` | bool | Enable MCT for RGB pixel data | | | | | (default ``True``) | | +----------------------------+-------------+-------------------------------+ | | ``compression_ratios`` | list[float] | The compression ratio for | | | | | each quality layer | | +----------------------------+-------------+-------------------------------+ | | ``signal_to_noise_ratios`` | list[float] | The peak signal-to-noise | | | | | ratio for each quality layer | +--------------------------------+----------------------------+-------------+-------------------------------+ |:attr:`RLELosslessEncoder` | ``'byteorder'`` | ``'<'``, | The byte order of `src` may | | | | ``'>'`` | be little- or big-endian | +--------------------------------+----------------------------+-------------+-------------------------------+ .. _encoder_plugin_pyjpegls: pyjpegls ======== +---------------------------------+-----------------------+--------+-------------------------------------------------+ | Encoder | Options | + +-----------------------+--------+-------------------------------------------------+ | | Key | Value | Description | +=================================+=======================+========+=================================================+ |:attr:`JPEGLSLosslessEncoder` | ``'interleave_mode'`` | int | The interleave mode used by the image data, 0 | | | | | for color-by-plane, 2 for color-by-pixel | +---------------------------------+-----------------------+--------+-------------------------------------------------+ |:attr:`JPEGLSNearLosslessEncoder`| ``'lossy_error'`` | int | The absolute error in pixel intensity units | | +-----------------------+--------+-------------------------------------------------+ | | ``'interleave_mode'`` | int | The interleave mode used by the image data, 0 | | | | | for color-by-plane, 2 for color-by-pixel | +---------------------------------+-----------------------+--------+-------------------------------------------------+ pydicom-pydicom-20aa4b7/doc/guides/encoding/encoder_plugins.rst000066400000000000000000000137521515706620200247630ustar00rootroot00000000000000.. _guide_encoder_plugins: ========================== Pixel Data Encoder Plugins ========================== .. note:: This guide is intended for advanced users who need support for something not provided by the :doc:`existing encoder plugins `. *Pixel Data* encoding in *pydicom* uses an :class:`~pydicom.pixels.encoders.base.Encoder` instance for the specific *Transfer Syntax* as a manager for plugins that perform the encoding work. This guide covers the requirements for those plugins and how to add them to *pydicom*. For a more general introduction to compression in *pydicom* see the :doc:`tutorial` instead. Plugin Requirements =================== Each available pixel data encoder in *pydicom* corresponds directly to a single DICOM *Transfer Syntax UID*, and is intended to provide a mechanism for converting raw unencoded source data to meet the requirements of that transfer syntax. In order to do so, each encoder has at least one encoding plugin which performs the actual conversion. An encoding plugin must implement three objects within the same module: * A function that performs the encoding with the following function signature: .. code-block:: python def foo(src: bytes, runner: EncodeRunner) -> bytes | bytearray: Where: * `src` is the raw uncompressed data to be encoded as :class:`bytes`. When the data in `src` represents multi-byte values (such as 16-bit pixels), then `src` will use little-endian byte ordering by default. Support for big-endian byte ordering by the encoding function is completely optional. The data in `src` will be sized as: * 1 byte per sample for 0 < *Bits Stored* <= 8 * 2 bytes per sample for 8 < *Bits Stored* <= 16 * 4 bytes per sample for 16 < *Bits Stored* <= 32 * 8 bytes per sample for 32 < *Bits Stored* <= 64 * `runner` is an :class:`~pydicom.pixels.encoders.base.EncodeRunner` instance that manages the encoding process and has access to the encoding options, either directly through the class properties or indirectly with the :meth:`~pydicom.pixels.encoders.base.EncodeRunner.get_option` method. * ``'transfer_syntax_uid'``: :class:`~pydicom.uid.UID` - the intended *Transfer Syntax UID* of the encoded data. * ``'byteorder'``: :class:`str` - the byte ordering used by `src`, ``'<'`` for little-endian (the default), ``'>'`` for big-endian. * ``'rows'``: :class:`int` - the number of rows of pixels in the `src`. * ``'columns'``: :class:`int` - the number of columns of pixels in the `src`. * ``'samples_per_pixel'``: :class:`int` - the number of samples used per pixel, e.g. 1 for grayscale images or 3 for RGB. * ``'number_of_frames'``: :class:`int` - the number of image frames contained in `src` * ``'bits_allocated'``: :class:`int` - the number of bits used to contain each pixel in `src`, should be a multiple of 8. * ``'bits_stored'``: :class:`int` - the number of bits actually used by each pixel in `src`, e.g. 12-bit pixel data (range 0 to 4095) will be contained by 16-bits (range 0 to 65535). * ``'pixel_representation'``: :class:`int` - the type of data in `src`, ``0`` for unsigned integers, ``1`` for 2's complement (signed) integers. * ``'photometric_interpretation'``: :class:`str` - the intended color space of the encoded data, such as ``'YBR_FULL'`` If your encoder needs to signal that one of the encoding option values needs to be modified then this can be done with the :meth:`~pydicom.pixels.encoders.base.EncodeRunner.set_option` method. This should only be done after successfully encoding the frame, as if the encoding fails changing the option value may cause issues with other encoding plugins that may also attempt to encode the same frame. It's also important to be aware that any changes you make will also affect following frames (if any). At a minimum the encoding function must support the encoding of little-endian byte ordered data and should return the encoded data in a format meeting the requirements of the corresponding *Transfer Syntax UID* as :class:`bytes` or :class:`bytearray`. * A function named ``is_available`` with the following signature: .. code-block:: python def is_available(uid: pydicom.uid.UID) -> bool: Where `uid` is the *Transfer Syntax UID* for the corresponding encoder as a :class:`~pydicom.uid.UID`. If the plugin supports the `uid` and has its dependencies met then it should return ``True``, otherwise it should return ``False``. * A :class:`dict` named ``ENCODER_DEPENDENCIES`` with the type ``Dict[pydicom.uid.UID, Tuple[str, ...]``, such as: .. code-block:: python from pydicom.uid import RLELossless, JPEG2000 ENCODER_DEPENDENCIES = { RLELossless: ('numpy', 'pillow', 'imagecodecs'), JPEG2000: ('numpy', 'gdcm'), } This will be used to provide the user with a list of missing dependencies required by the plugin. An example of the requirements of a plugin is available :gh:`here `. Adding Plugins to an Encoder ============================ Additional plugins can be added to an existing encoder with the :meth:`~pydicom.pixels.encoders.base.Encoder.add_plugin` method, which takes the a unique :class:`str` `plugin_label`, and a :class:`tuple` of ``('the import path to the encoder function's module', 'encoder function name')``. For example, if you'd import your encoder function `my_encoder_func` with ``from my_package.encoders import my_encoder_func``, then you'd do the following: .. code-block:: python from pydicom.pixels.encoders import RLELosslessEncoder RLELosslessEncoder.add_plugin( 'my_encoder', # the plugin's label ('my_package.encoders', 'my_encoder_func') # the import paths ) The ``my_package.encoders`` module must contain the encoding function and the ``ENCODER_DEPENDENCIES`` and ``is_available`` objects. pydicom-pydicom-20aa4b7/doc/guides/encoding/index.rst000066400000000000000000000004431515706620200227030ustar00rootroot00000000000000 =================== Pixel Data Encoding =================== *Transfer Syntax UID* specific encoding information: .. toctree:: :maxdepth: 1 jpeg_ls jpeg_2k rle_lossless Encoding plugin information: .. toctree:: :maxdepth: 1 encoder_plugin_options encoder_plugins pydicom-pydicom-20aa4b7/doc/guides/encoding/jpeg_2k.rst000066400000000000000000000246011515706620200231170ustar00rootroot00000000000000 JPEG 2000 Encoding ================== The requirements for JPEG 2000 encoding are defined in :dcm:`Section 8.2.4 ` and Annex :dcm:`A.4.4` of Part 5 of the DICOM Standard. The JPEG 2000 compression scheme is defined by `ISO/IEC 15444-1 `_/`ITU T.800 `_ (the second link has free access). The following JPEG 2000 encoding parameters are used by `pylibjpeg` plugin: * For *JPEG 2000 Lossless* the reversible DWT 5-3 wavelet * For *JPEG 2000* the irreversible DWT 9-7 wavelet * 6 DWT decomposition levels * 64 x 64 code block size * 1 tile * LRCP progression order * No sub-sampling * No JP2 header Valid Image Pixel Parameters ---------------------------- The table below lists the valid :dcm:`Image Pixel` module parameters for *Pixel Data* encoded using the *JPEG 2000 Lossless* or *JPEG 2000* transfer syntaxes. For an explanation of each parameter and its relationship with the *Pixel Data* see the :doc:`glossary of Image Pixel elements<../glossary>`. +------------+-----------------------+-----------------+----------------+------------+---------+ | *Samples | *Photometric | *Pixel | *Planar | *Bits | *Bits | | per Pixel* | Interpretation* | Representation* | Configuration* | Allocated* | Stored* | +============+=======================+=================+================+============+=========+ | 1 | MONOCHROME1 | 0 or 1 | (absent) | 8, 16, 24, | 1 to 38 | | +-----------------------+ | | 32 or 40 | | | | MONOCHROME2 | | | | | | +-----------------------+-----------------+----------------+------------+---------+ | | PALETTE COLOR :sup:`1`| 0 | (absent) | 8 or 16 | 1 to 16 | +------------+-----------------------+-----------------+----------------+------------+---------+ | 3 | RGB | 0 | 0 | 8, 16, 24, | 1 to 38 | | +-----------------------+ | | 32 or 40 | | | | YBR_RCT | | | | | | +-----------------------+ | | | | | | YBR_ICT :sup:`2` | | | | | | +-----------------------+ | | | | | | YBR_FULL | | | | | +------------+-----------------------+-----------------+----------------+------------+---------+ | :sup:`1` *JPEG 2000 Lossless* only | :sup:`2` *JPEG 2000* only Photometric Interpretation .......................... To ensure you have the correct *Photometric Interpretation* the uncompressed pixel data should already be in the corresponding color space: * If your uncompressed pixel data is grayscale (intensity) based: * Use ``MONOCHROME1`` if the minimum intensity value should be displayed as white. * Use ``MONOCHROME2`` if the minimum intensity value should be displayed as black. * If your uncompressed pixel data uses a single sample per pixel and is an index to the :dcm:`Red, Green and Blue Palette Color Lookup Tables `: * Use ``PALETTE COLOR``. * If your uncompressed pixel data is in RGB color space: * For *Photometric Interpretation* ``RGB``, ``YBR_ICT`` or ``YBR_RCT``; nothing else is required. * For *Photometric Interpretation* ``YBR_FULL`` the pixel data must first be converted into RGB color space, however the conversion operation is lossy. * If your uncompressed pixel data is in `YCbCr `_ color space: * For *Photometric Interpretation* ``RGB``, ``YBR_ICT`` or ``YBR_RCT``; the pixel data must first be converted into RGB color space, however the conversion operation is lossy. * For *Photometric Interpretation* ``YBR_FULL`` nothing else is required. If your uncompressed pixel data is in RGB color space then setting the *Photometric Interpretation* to ``YBR_ICT`` or ``YBR_RCT`` will signal the encoder to apply multiple-component transformation (MCT) to the pixel data during the encoding process, which should result in a higher compression ratio for a given image quality. If you don't wish to use MCT then keep the *Photometric Interpretation* as ``RGB`` Bits Stored ........... The maximum supported *Bits Stored* value for encoding is ``24``. Examples -------- JPEG 2000 Lossless ................... Losslessly compress unsigned RGB pixel data in-place, without the use of the multiple-component transformation: .. code-block:: python from pydicom import examples from pydicom.uid import JPE2000Lossless ds = examples.rgb_color assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "RGB" assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 assert len(ds.PixelData) == 921600 ds.compress(JPE2000Lossless) print(len(ds.PixelData)) # ~334412 Losslessly compress unsigned RGB pixel data in-place with multiple-component transformation: .. code-block:: python from pydicom import examples from pydicom.uid import JPE2000Lossless ds = examples.rgb_color assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "RGB" assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 assert len(ds.PixelData) == 921600 # YBR_ICT is not valid with *JPEG 2000 Lossless* ds.PhotometricInterpretation = "YBR_RCT" ds.compress(JPE2000Lossless) print(len(ds.PixelData)) # ~152342 Losslessly compress signed greyscale pixel data in-place: .. code-block:: python from pydicom import examples from pydicom.uid import JPE2000Lossless ds = examples.ct assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'MONOCHROME2' assert ds.BitsAllocated == 16 assert ds.BitsStored == 16 assert ds.PixelRepresentation == 1 assert len(ds.PixelData) == 32768 ds.compress(JPE2000Lossless) print(len(ds.PixelData)) # ~13656 JPEG 2000 ......... .. warning:: *pydicom* makes no recommendations for specifying image quality for lossy encoding methods. Any examples of lossy encoding are for **illustration purposes only**. When performing lossy encoding one or more quality layers may be used, with each quality layer allowing the reconstruction of the pixel data at a given resolution. The image quality of each layer is controlled by passing either the `j2k_cr` or the `j2k_psnr` parameter to the :meth:`encoding function` as ``list[float]``, where: * `j2k_cr`: a list of the compression ratios to use for each quality layer. There must be at least one quality layer and the minimum allowable compression ratio is ``1``. When using multiple quality layers they should be ordered in decreasing value from left to right:: # 1 quality layer at 1.5:1 j2k_cr = [1.5] # 2 quality layers at 5:1, and 2:1 j2k_cr = [5, 2] * `j2k_psnr`: a list of the peak signal-to-noise ratios (in dB) to use for each quality layer. There must be at least one quality layer and when using multiple quality layers they should be ordered in increasing value from left to right:: # 1 quality layer j2k_psnr = [80] # 3 quality layers j2k_psnr = [80, 100, 200] Lossy compression of unsigned RGB pixel data without multiple-component transformation: .. code-block:: python from pydicom import examples from pydicom.uid import JPEG2000 ds = examples.rgb_color assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'RGB' assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 assert len(ds.PixelData) == 921600 ds.compress(JPEG2000, j2k_cr=[20]) print(len(ds.PixelData)) # ~46100 Lossy compression of unsigned RGB pixel data with multiple-component transformation: .. code-block:: python from pydicom import examples from pydicom.uid import JPEG2000 ds = examples.rgb_color assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'RGB' assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 assert len(ds.PixelData) == 921600 # YBR_RCT is not valid with lossy *JPEG 2000* ds.PhotometricInterpretation = "YBR_ICT" ds.compress(JPEG2000, j2k_cr=[20]) print(len(ds.PixelData)) # ~46076 Lossy compression of signed greyscale pixel data: .. code-block:: python from pydicom import examples from pydicom.uid import JPEG2000 ds = examples.ct assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'MONOCHROME2' assert ds.BitsAllocated == 16 assert ds.BitsStored == 16 assert ds.PixelRepresentation == 1 assert len(ds.PixelData) == 32768 ds.compress(JPEG2000, j2k_cr=[20]) print(ds.PixelData) # ~1582 Available Plugins ----------------- pylibjpeg ......... .. |br| raw:: html
.. _np: https://numpy.org/ .. _pylj: https://github.com/pydicom/pylibjpeg .. _oj: https://github.com/pydicom/pylibjpeg-openjpeg +----------------------------------------------------------+-----------------------------------------------+ | Encoder | Plugins | | +-----------+-----------------------------+-----+ | | Name | Requires |Added| +==========================================================+===========+=============================+=====+ |:attr:`~pydicom.pixels.encoders.JPEG2000LosslessEncoder` | pylibjpeg | `numpy `_, |v3.0 | +----------------------------------------------------------+ | `pylibjpeg <_pylj>`_, | | |:attr:`~pydicom.pixels.encoders.JPEG2000Encoder` | | `pylibjpeg-openjpeg <_oj>`_ | | +----------------------------------------------------------+-----------+-----------------------------+-----+ pydicom-pydicom-20aa4b7/doc/guides/encoding/jpeg_ls.rst000066400000000000000000000266141515706620200232270ustar00rootroot00000000000000 JPEG-LS Encoding ================ The requirements for JPEG-LS encoding are defined in :dcm:`Section 8.2.3 ` and Annex :dcm:`A.4.3` of Part 5 of the DICOM Standard. The JPEG-LS compression scheme is defined by `ISO/IEC 14495-1 `_/`ITU T.87 `_ (the second link has free access). Valid Image Pixel Parameters ---------------------------- The table below lists the valid :dcm:`Image Pixel` module parameters for *Pixel Data* encoded using the *JPEG-LS Lossless* or *JPEG-LS Near-lossless* transfer syntaxes. For an explanation of each parameter and its relationship with the *Pixel Data* see the :doc:`glossary of Image Pixel elements<../glossary>`. +------------+-----------------------+-----------------+----------------+------------+---------+ | *Samples | *Photometric | *Pixel | *Planar | *Bits | *Bits | | per Pixel* | Interpretation* | Representation* | Configuration* | Allocated* | Stored* | +============+=======================+=================+================+============+=========+ | 1 | MONOCHROME1 | 0 or 1 | (absent) | 8 or 16 | 2 to 16 | | +-----------------------+ | | | | | | MONOCHROME2 | | | | | | +-----------------------+-----------------+ | | | | | PALETTE COLOR :sup:`1`| 0 | | | | +------------+-----------------------+-----------------+----------------+------------+---------+ | 3 | RGB | 0 | 0 | 8 or 16 | 2 to 16 | | +-----------------------+ | +------------+---------+ | | YBR_FULL | | | 8 | 2 to 8 | +------------+-----------------------+-----------------+----------------+------------+---------+ | :sup:`1` *JPEG-LS Lossless* only Pixel Representation .................... The DICOM Standard allows the use of the *JPEG-LS Near Lossless* transfer syntax with signed pixel data as long as the *Photometric Interpretation* is ``MONOCHROME1`` or ``MONOCHROME2``. In practice, however, this is complicated by the way lossy JPEG-LS encoding works: * JPEG-LS does not track the signedness of the pixel data, so all data is assumed to be unsigned during compression * JPEG-LS uses the specified absolute pixel value error as the constraint when performing lossy encoding (the NEAR parameter - in *pydicom* this is the `jls_error` parameter passed to the :meth:`encoding functions `) Because of this, even though a NEAR value of ``1`` should limit the absolute pixel value error to 1 intensity unit, it's possible to have pixels with an absolute error up to the sample bit-depth of the data: .. code-block:: text Raw 8-bit value: -128: 0b10000000 (as signed integer) 128: 0b10000000 (as unsigned integer) Possible value after lossy encoding with a NEAR value of 1: 127: 0b01111111 (as signed/unsigned integer) Total error as unsigned: 1 - OK Total error as signed: 255 - Very much not OK Signed pixel data values should therefore be limited to the range (MIN + NEAR, MAX - NEAR), where MIN and MAX are the minimum and maximum values allowed for the given *Bits Stored* value: ``-2**(Bits Stored - 1)`` and ``2**(Bits Stored - 1) - 1``. For example, when performing lossy encoding of 8-bit signed data and a NEAR value of 3 you should limit the pixel data values to the range (-128 + 3, 127 - 3). Lossless JPEG-LS encoding has no such restriction and the full value range for the given *Bits Stored* can be used with both signed and unsigned pixel data. Photometric Interpretation .......................... To ensure you have the correct *Photometric Interpretation* the uncompressed pixel data should already be in the corresponding color space: * If your uncompressed pixel data is grayscale (intensity) based: * Use ``MONOCHROME1`` if the minimum intensity value should be displayed as white. * Use ``MONOCHROME2`` if the minimum intensity value should be displayed as black. * If your uncompressed pixel data uses a single sample per pixel and is an index to the :dcm:`Red, Green and Blue Palette Color Lookup Tables `: * Use ``PALETTE COLOR``. * If your uncompressed pixel data is in RGB color space: * For *Photometric Interpretation* ``RGB`` nothing else is required. * For *Photometric Interpretation* ``YBR_FULL`` * For *Bits Allocated* and *Bits Stored* less than or equal to 8: pixel data must be :func:`converted into YCbCr color space `. However you should keep in mind that the conversion operation is lossy. * For *Bits Allocated* and *Bits Stored* between 9 and 16 (inclusive): pixel data should be downscaled to 8-bit (with *Bits Stored*, *Bits Allocated* and *High Bit* updated accordingly) and converted to `YCbCr `_ color space. Both of these operations are lossy. * If your uncompressed pixel data is in `YCbCr `_ color space: * For *Photometric Interpretation* ``RGB`` the pixel data must first be :func:`converted into RGB color space `. However the conversion operation is lossy. * For *Photometric Interpretation* ``YBR_FULL`` nothing else is required. Planar Configuration .................... If your uncompressed pixel data is in ``RGB`` or ``YBR_FULL`` color space then you may use a *Planar Configuration* of either ``0`` or ``1`` as JPEG-LS allows the use of different interleave modes. While a *Planar Configuration* of ``1`` (interleave mode 0) may result in better compression ratios, its also more likely to result in downstream issues with decoders that expect the more common *Planar Configuration* ``0`` (interleave mode 2) pixel ordering. For either case, if the pixel data being encoded is in an :class:`~numpy.ndarray` then each frame should be shaped as (rows, columns, samples). If the pixel data being encoded is :class:`bytes` then with *Planar Configuration* ``0`` the data is ordered as color-by-pixel:: # Three 8-bit RGB pixels: (255, 255, 0), (0, 255, 0), (0, 255, 255) # Each pixel is encoded separately the concatenated # first pixel | second px | third px | src = b"\xFF\xFF\x00\x00\xFF\x00\x00\xFF\xFF" With *Planar Configuration* ``1`` the data is ordered as color-by-plane:: # Three 8-bit RGB pixels: (255, 255, 0), (0, 255, 0), (0, 255, 255) # Each color channel is encoded separately then concatenated # red channel | green ch. | blue ch. | src = b"\xFF\x00\x00\xFF\xFF\xFF\x00\x00\xFF" Examples -------- JPEG-LS Lossless ................ Losslessly compress unsigned RGB pixel data in-place: .. code-block:: python from pydicom import examples from pydicom.uid import JPEGLSLossless ds = examples.rgb_color assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'RGB' assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 assert len(ds.PixelData) == 921600 ds.compress(JPEGLSLossless) print(len(ds.PixelData)) # ~261792 Losslessly compress signed greyscale pixel data in-place: .. code-block:: python from pydicom import examples from pydicom.uid import JPEGLSLossless ds = examples.ct assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'MONOCHROME2' assert ds.BitsAllocated == 16 assert ds.BitsStored == 16 assert ds.PixelRepresentation == 1 assert len(ds.PixelData) == 32768 ds.compress(JPEGLSLossless) print(len(ds.PixelData)) # ~14180 JPEG-LS Near-lossless ..................... .. warning:: *pydicom* makes no recommendations for specifying image quality for lossy encoding methods. Any examples of lossy encoding are for **illustration purposes only**. When using the *JPEG-LS Near-lossless* transfer syntax, image quality is controlled by passing the `jls_error` parameter to the :meth:`encoding function `. `jls_error` is directly related to the JPEG-LS NEAR parameter, which is the allowed absolute error in pixel intensity units from the compression process and should be in the range ``(0, 2**BitsStored - 1)``. Lossy compression of unsigned pixel data with a maximum error of 2 pixel intensity units: .. code-block:: python from pydicom import examples from pydicom.uid import JPEGLSNearLossless ds = examples.rgb_color assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'RGB' assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 assert len(ds.PixelData) == 921600 ds.compress(JPEGLSNearLossless, jls_error=2) print(len(ds.PixelData)) # ~149188 Lossy compression of signed pixel data with a maximum error of 3 pixel intensity units: .. code-block:: python from pydicom import examples from pydicom.uid import JPEGLSNearLossless ds = examples.ct assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == 'MONOCHROME2' assert ds.BitsAllocated == 16 assert ds.BitsStored == 16 assert ds.PixelRepresentation == 1 assert len(ds.PixelData) == 32768 # Our pixel data therefore uses signed 16-bit integers with a single channel # We need to make sure the maximum and minimum values are within the allowed # range (see the section on Pixel Representation near the start of this page) jls_error = 3 # The minimum and maximum sample values for the given *Bits Stored* minimum = -2**(ds.BitsStored - 1) maximum = 2**(ds.BitsStored - 1) - 1 arr = ds.pixel_array # Clip the array so all values are within the limits, you may want to # rescale instead of clipping. For this dataset this isn't actually # necessary as the pixel data is already within the limits arr = np.clip(minimum + jls_error, maximum - jls_error) ds.compress(JPEGLSNearLossless, arr, jls_error=jls_error) print(ds.PixelData) # ~8508 Available Plugins ----------------- .. |br| raw:: html
.. _np: https://numpy.org/ .. _jls: https://github.com/pydicom/pyjpegls +----------------------------------------------------------+------------------------------------+ | Encoder | Plugins | | +---------+--------------------+-----+ | | Name | Requires |Added| +==========================================================+=========+====================+=====+ |:attr:`~pydicom.pixels.encoders.JPEGLSLosslessEncoder` | pyjpegls| `numpy `_, |v3.0 | +----------------------------------------------------------+ | `pyjpegls `_ | | |:attr:`~pydicom.pixels.encoders.JPEGLSNearLosslessEncoder`| | | | +----------------------------------------------------------+---------+--------------------+-----+ pydicom-pydicom-20aa4b7/doc/guides/encoding/rle_lossless.rst000066400000000000000000000162571515706620200243170ustar00rootroot00000000000000 RLE Lossless Encoding ===================== The requirements for RLE encoding are defined in :dcm:`Section 8.2.2 ` and Annexes :dcm:`A.4.2` and :dcm:`G` of Part 5 of the DICOM Standard. The underlying algorithm is based on the `PackBits `_ compression scheme. Valid Image Pixel Parameters ---------------------------- The table below lists the valid :dcm:`Image Pixel` module parameters for *Pixel Data* encoded using the *RLE Lossless* transfer syntax. For an explanation of each parameter and its relationship with the *Pixel Data* see the :doc:`glossary of Image Pixel elements<../glossary>`. +------------+-----------------+-----------------+------------+---------+ | *Samples | *Photometric | *Pixel | *Bits | *Bits | | per Pixel* | Interpretation* | Representation* | Allocated* | Stored* | +============+=================+=================+============+=========+ | 1 | MONOCHROME1 | 0 or 1 | 8 or 16 | 1 to 16 | | +-----------------+ | | | | | MONOCHROME2 | | | | | +-----------------+-----------------+ | | | | PALETTE COLOR | 0 | | | +------------+-----------------+-----------------+------------+---------+ | 3 | RGB | 0 | 8 or 16 | 1 to 16 | | +-----------------+ +------------+---------+ | | YBR_FULL | | 8 | 1 to 8 | +------------+-----------------+-----------------+------------+---------+ To ensure you have the correct *Photometric Interpretation* when encoding using *RLE Lossless*, the uncompressed pixel data should already be in the corresponding color space: * If your uncompressed pixel data is grayscale (intensity) based: * Use ``MONOCHROME1`` if the minimum intensity value should be displayed as white. * Use ``MONOCHROME2`` if the minimum intensity value should be displayed as black. * If your uncompressed pixel data uses a single sample per pixel and is an index to the :dcm:`Red, Green and Blue Palette Color Lookup Tables `: * Use ``PALETTE COLOR``. * If your uncompressed pixel data is in RGB color space: * For *Photometric Interpretation* ``RGB`` nothing else is required. * For *Photometric Interpretation* ``YBR_FULL`` * For *Bits Allocated* and *Bits Stored* less than or equal to 8: pixel data must be :func:`converted into YCbCr color space `. However you should keep in mind that the conversion operation is lossy. * For *Bits Allocated* and *Bits Stored* between 9 and 16 (inclusive): pixel data should be downscaled to 8-bit (with *Bits Stored*, *Bits Allocated* and *High Bit* updated accordingly) and converted to `YCbCr `_ color space. Both of these operations are lossy. * If your uncompressed pixel data is in `YCbCr `_ color space: * For *Photometric Interpretation* ``RGB`` the pixel data must first be :func:`converted into RGB color space `. However the conversion operation is lossy. * For *Photometric Interpretation* ``YBR_FULL`` nothing else is required. If a change is made to existing *Pixel Data*, such as conversion to a different color space or downsampling to 8-bit then a new *SOP Instance UID* should be generated. You might be asking why you would convert uncompressed RGB pixel data to YCbCr (or vice versa) if the conversion itself is lossy. The answer is that using YCbCr data should result in a higher compression ratio than with RGB, while YCbCr data is usually converted back to RGB before viewing. The decision to change the color space should be made with the intended usage of your dataset in mind. Available Plugins ----------------- .. |br| raw:: html
+---------------------------------------------------+-----------------------------------------------------------------------------+ | Encoder | Plugins | | +---------+--------------------------------------+-----+----------------------+ | | Name | Requires |Added| Known Limitations | +===================================================+=========+======================================+=====+======================+ |:attr:`~pydicom.pixels.encoders.RLELosslessEncoder`| pydicom | |v2.2 | ~20x slower to encode| | +---------+--------------------------------------+-----+----------------------+ | |pylibjpeg|:ref:`NumPy`, |v2.2 | | | | |:ref:`pylibjpeg`, | | | | | |:ref:`pylibjpeg-rle`| | | | +---------+--------------------------------------+-----+----------------------+ | | gdcm |:ref:`GDCM` |v2.2 | | +---------------------------------------------------+---------+--------------------------------------+-----+----------------------+ Examples -------- Compressing grayscale pixel data in-place: .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import RLELossless >>> ds = examples.ct >>> ds.SamplesPerPixel 1 >>> ds.PhotometricInterpretation 'MONOCHROME2' >>> ds.BitsAllocated 16 >>> ds.PixelRepresentation 1 >>> ds.compress(RLELossless) Compressing RGB pixel data in-place: .. code-block:: python >>> from pydicom import examples >>> ds = examples.rgb_color >>> ds.SamplesPerPixel 3 >>> ds.PhotometricInterpretation 'RGB' >>> ds.BitsAllocated 8 >>> ds.PixelRepresentation 0 >>> len(ds.PixelData) 921600 >>> ds.compress(RLELossless) >>> len(ds.PixelData) 424152 Convert RGB pixel data to YCbCr (requires :ref:`NumPy`), then compress in-place. Because the color space has changed we need to generate a new *SOP Instance UID*: .. code-block:: python >>> from pydicom import examples >>> from pydicom.pixels import convert_color_space >>> from pydicom.uid import generate_uid >>> ds = examples.rgb_color >>> rgb = ds.pixel_array >>> ybr = convert_color_space(rgb, 'RGB', 'YBR_FULL') >>> ds.PhotometricInterpretation = 'YBR_FULL' >>> ds.compress(RLELossless, ybr) >>> ds.SOPInstanceUID = generate_uid() >>> len(ds.PixelData) 187460 pydicom-pydicom-20aa4b7/doc/guides/glossary.rst000066400000000000000000000175661515706620200216670ustar00rootroot00000000000000 ======== Glossary ======== .. _glossary_file_meta: :dcm:`File Meta Information<>` ============================== .. _transfer_syntax: **(0002,0010) Transfer Syntax UID** The *Transfer Syntax UID* is a unique identifier that provides information on how a DICOM dataset has been encoded. All transfer syntaxes have two attributes that describe how the dataset's encoded elements should be interpreted: * Whether the dataset uses little-endian or big-endian byte ordering (retired), * Whether the dataset uses implicit or explicit VR encoding In addition, transfer syntaxes can be grouped by how the dataset's *Pixel Data* has been encoded: * **Encapsulated transfer syntaxes**: so-called because any *Pixel Data* present in the dataset is :func:`encapsulated`. All encapsulated transfer syntaxes have pixel data that's been compressed using the compression technique specified by the transfer syntax. For example, a dataset with the *JPEG Baseline (Process 1)* transfer syntax will have pixel data that's compressed using :dcm:`ISO/IEC 10918-1 JPEG compression `. * **Native (unencapsulated) transfer syntaxes**: these have no encapsulation, and hence no compression of the *Pixel Data*. All encapsulated transfer syntaxes use explicit VR, little endian encoding, while native transfer syntaxes use the encoding matching their description: a dataset with the *Implicit VR Little Endian* transfer syntax uses implicit VR, little endian encoding, for example. The DICOM Standard provides a :dcm:`list of public transfer syntaxes `, however privately defined transfer syntaxes are also allowed. References: :dcm:`DICOM Standard, Part 5, Section 10` and :dcm:`Annex A` .. _glossary_image_pixel: :dcm:`Image Pixel Module` =================================================== .. _samples_per_pixel: **(0028,0002) Samples per Pixel** The number of samples per pixel, otherwise known as the number of image channels, components or planes. An RGB image has 3 samples per pixel (red, green and blue), a grayscale image has 1 sample per pixel (intensity). The *Samples per Pixel* for all DICOM *Pixel Data* is either 1 or 3, however 4 was previously allowed. Allowed values: ``1`` or ``3``, but may be constrained by the :dcm:`IOD `. Reference: :dcm:`DICOM Standard, Part 3, Section C.7.6.3.1.1 ` .. _photometric_interpretation: **(0028,0004) Photometric Interpretation** The intended interpretation of the *Pixel Data* in its *current form* in the dataset. For example: * If you have a dataset with RGB *Pixel Data* then the *Photometric Interpretation* should be ``'RGB'``. * If you take your RGB data and convert it to `YCbCr `_ then the *Photometric Interpretation* should be ``'YBR_FULL'`` (or a related interpretation depending on the conversion method). * If you then compress that data using *RLE Lossless* encoding then the *Photometric Interpretation* remains ``'YBR_FULL'``. * On the other hand, if you take your original RGB data and apply *JPEG 2000 Lossless* encoding then the *Photometric Interpretation* will either be ``'RGB'`` or ``'YBR_RCT'`` depending on whether or not the encoder performs a multi-component transformation when encoding. When compressing pixel data using one of the JPEG encodings it's important to know if the encoder is performing any color space transformation prior to compression, as this needs to be taken into account when setting the *Photometric Interpretation*. This is especially important when an encoder performs a transformation and the decoder doesn't, since having a correct *Photometric Interpretation* makes it possible to determine which inverse transformation to use to return the pixel data to its original color space. For more detailed information on each of the defined photometric interpretations refer to :dcm:`Annex C.7.6.3.1 ` of Part 3 of the DICOM Standard. Allowed values: ``'MONOCHROME1'``, ``'MONOCHROME2'``, ``'PALETTE COLOR'``, ``'RGB'``, ``'YBR_FULL'``, ``'YBR_FULL_422'``, ``'YBR_PARTIAL_420'``, ``'YBR_ICT'``, ``'YBR_RCT'``, however restrictions apply based on the *Transfer Syntax UID*, and further constraints may be required by the :dcm:`IOD`. .. _planar_configuration: **(0028,0006) Planar Configuration** Required when *Samples per Pixel* is greater than one, this indicates the order of the samples used by the pixel data, as either: * ``0``, where sample values for the first pixel is followed by the sample value for the second pixel: R1, G1, B1, R2, G2, B2, ..., Rn, Gn, Bn. * ``1``, where sample values for each color plane are contiguous: R1, R2, ..., Rn, G1, G2, ..., Gn, B1, B2, ..., Bn. Allowed values: ``0`` or ``1`` Reference: :dcm:`DICOM Standard, Part 3, Section C.7.6.3.1.3 ` .. _number_of_frames: **(0028,0008) Number of Frames** The number of frames in a multi-frame image. May not be present if the pixel data only has a single frame. Allowed values: must be at least ``1`` (if present) .. _rows: **(0028,0010) Rows** The number of rows in the image. Allowed values: ``1`` to ``65535`` .. _columns: **(0028,0011) Columns** The number of columns in the image. Allowed values: ``1`` to ``65535`` .. _bits_allocated: **(0028,0100) Bits Allocated** The number of bits used to actually *contain* each sample of each pixel. All DICOM *Pixel Data* is either 1 (for bit-packed *Pixel Data*) or more typically a multiple of 8 such as 8, 16 or 32, with 64 currently being the maximum used. Using the example of a *Bits Stored* of 12, this means that the actual number of bits used to contain the values must be at least 16. For more detailed information refer to :dcm:`Chapter 8 ` and :dcm:`Annex D ` in Part 5 of the DICOM Standard. Allowed values: ``1`` or a multiple of ``8``, however many :dcm:`IODs ` place further restrictions on what the value may be. .. _bits_stored: **(0028,0101) Bits Stored** The number of bits actually *used* by each sample of each pixel. For example, with a *Bits Stored* value of ``12``, an unsigned grayscale image will have pixel values in the range 0 to 4095 and an unsigned RGB image will have values in the range (R: 0 to 4095, G: 0 to 4095, B: 0 to 4095). Must be equal to or less than *Bits Allocated*. For more detailed information refer to :dcm:`Chapter 8 ` and :dcm:`Annex D ` in Part 5 of the DICOM Standard. Allowed values: ``1`` to *Bits Allocated* (inclusive) .. _high_bit: **(0028,0102) High Bit** The `most significant bit `_ of the pixel sample data and is equal to *Bits Stored* - 1, however other values have been allowed in past versions of the DICOM Standard. Allowed values: *Bits Stored* - 1 .. _pixel_representation: **(0028,0103) Pixel Representation** Describes the type of pixel values, either signed (using `2's complement `_) or unsigned integers. A value of ``0`` indicates the *Pixel Data* contains unsigned integers while a value of ``1`` indicates it contains signed integers. Allowed values: ``0`` or ``1``, but may be constrained by the :dcm:`IOD `. pydicom-pydicom-20aa4b7/doc/guides/index.rst000066400000000000000000000004451515706620200211170ustar00rootroot00000000000000:orphan: ====== Guides ====== These guides contain higher-level information for those already familiar with pydicom: .. toctree:: :maxdepth: 1 user/index element_value_types plugin_table decoding/index encoding/index cli/cli_guide glossary writing_documentation pydicom-pydicom-20aa4b7/doc/guides/plugin_table.rst000066400000000000000000000211061515706620200224520ustar00rootroot00000000000000 ==================================================== Plugins for Pixel Data Compression and Decompression ==================================================== .. _guide_decoding_plugins: Plugins for Decompression ========================= The table below lists the plugins available for decompressing pixel data that's been compressed using the corresponding *Transfer Syntax UID*. No plugins are used for uncompressed pixel data. .. |chk| unicode:: U+02713 .. CHECK MARK +---------------------------------------------------+---------------------------------------------------------------------------+ | Transfer Syntax | Plugins | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | Name | UID | ``pylibjpeg`` | ``gdcm`` | ``pillow`` | ``pyjpegls`` | ``pydicom`` | +=========================+=========================+=================+==========+=================+==============+=============+ | *JPEG Baseline 8-bit* | 1.2.840.10008.1.2.4.50 | |chk|\ :sup:`1` | |chk| | |chk| | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG Extended 12-bit* | 1.2.840.10008.1.2.4.51 | |chk|\ :sup:`1` | |chk| | |chk| | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG Lossless P14* | 1.2.840.10008.1.2.4.57 | |chk|\ :sup:`1` | |chk| | | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG Lossless SV1* | 1.2.840.10008.1.2.4.70 | |chk|\ :sup:`1` | |chk| | | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG-LS Lossless* | 1.2.840.10008.1.2.4.80 | |chk|\ :sup:`1` | |chk| | | |chk| | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG-LS Near Lossless* | 1.2.840.10008.1.2.4.81 | |chk|\ :sup:`1` | |chk| | | |chk| | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG 2000 Lossless* | 1.2.840.10008.1.2.4.90 | |chk|\ :sup:`2` | |chk| | |chk|\ :sup:`4` | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *JPEG 2000* | 1.2.840.10008.1.2.4.91 | |chk|\ :sup:`2` | |chk| | |chk|\ :sup:`4` | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *HTJ2K Lossless* | 1.2.840.10008.1.2.4.201 | |chk|\ :sup:`2` | | | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *HTJ2K Lossless RPCL* | 1.2.840.10008.1.2.4.202 | |chk|\ :sup:`2` | | | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *HTJ2K* | 1.2.840.10008.1.2.4.203 | |chk|\ :sup:`2` | | | | | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | *RLE Lossless* | 1.2.840.10008.1.2.5 | |chk|\ :sup:`3` | |chk| | | | |chk| | +-------------------------+-------------------------+-----------------+----------+-----------------+--------------+-------------+ | :sup:`1` with ``pylibjpeg-libjpeg`` | :sup:`2` with ``pylibjpeg-openjpeg`` | :sup:`3` with ``pylibjpeg-rle`` | :sup:`4` with Pillow's *Jpeg2KImagePlugin* Plugins ------- ``pylibjpeg`` ............. Requires `pylibjpeg `_ and at least one of: * `pylibjpeg-libjpeg `_ * `pylibjpeg-openjpeg `_ * `pylibjpeg-rle `_ **Known limitations** * Maximum supported *Bits Stored* for JPEG 2000 and HTJ2K is 24 ``gdcm`` ........ Requires `python-gdcm `_. **Known limitations** * *JPEG Extended 12-bit* is only available if *Bits Allocated* is 8 * *JPEG-LS Near Lossless* only if *Bits Stored* is at least 8 for a *Pixel Representation* of 1 * *JPEG-LS Lossless* and *JPEG-LS Near Lossless* only if *Bits Stored* is not 6 or 7 * Maximum supported *Bits Stored* is 16 ``pillow`` .......... Requires `Pillow `_, with support for JPEG 2000 via Pillow's `Jpeg2KImagePlugin `_ requiring `OpenJPEG `_. **Known limitations** * *JPEG Extended 12-bit* is only available if *Bits Allocated* is 8 * *JPEG 2000 Lossless* and *JPEG 2000* are only available for a *Samples per Pixel* of 3 when *Bits Stored* is <= 8 * Maximum supported *Bits Stored* is 16 ``pyjpegls`` ............ Requires `pyjpegls `_. ``pydicom`` ........... Requires `pydicom `_. **Known limitations** * Slower than the other plugins by 3-4x .. _guide_encoding_plugins: Plugins for Compression ======================= .. currentmodule:: pydicom.pixels.encoders +---------------------------------------------------+---------------+--------------------------------------------+ | Transfer Syntax | Plugins | Encoding guide | +-------------------------+-------------------------+ | | | Name | UID | | | +=========================+=========================+===============+============================================+ | *JPEG-LS Lossless* | 1.2.840.10008.1.2.4.80 | ``pyjpegls`` | :doc:`JPEG-LS` | +-------------------------+-------------------------+ | | | *JPEG-LS Near Lossless* | 1.2.840.10008.1.2.4.81 | | | +-------------------------+-------------------------+---------------+--------------------------------------------+ | *JPEG 2000 Lossless* | 1.2.840.10008.1.2.4.90 | ``pylibjpeg`` | :doc:`JPEG 2000` | +-------------------------+-------------------------+ | | | *JPEG 2000* | 1.2.840.10008.1.2.4.91 | | | +-------------------------+-------------------------+---------------+--------------------------------------------+ | *RLE Lossless* | 1.2.840.10008.1.2.5 | ``pylibjpeg`` | :doc:`RLE` | | | +---------------+ | | | | ``pydicom`` | | +-------------------------+-------------------------+---------------+--------------------------------------------+ Plugins ------- ``pyjpegls`` ............ Requires `pyjpegls `_. ``pylibjpeg`` ............. Requires `pylibjpeg `_ as well as `pylibjpeg-openjpeg `_ for JPEG 2000 compression and `pylibjpeg-rle `_ for *RLE Lossless*. **Known limitations** * The maximum supported *Bits Stored* for JPEG 2000 is 24, however the results for 20-24 are very poor when using lossy compression. ``pydicom`` ........... Requires `pydicom `_. **Known limitations** * Much slower than the other plugins pydicom-pydicom-20aa4b7/doc/guides/user/000077500000000000000000000000001515706620200202315ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/guides/user/base_element.rst000066400000000000000000000250771515706620200234210ustar00rootroot00000000000000Core elements in pydicom ======================== .. rubric:: pydicom object model, description of classes, examples Dataset ------- .. currentmodule:: pydicom The main class in *pydicom* is :class:`~dataset.Dataset` which emulates the behavior of a Python :class:`dict` whose keys are DICOM tags (:class:`~pydicom.tag.BaseTag` instances), and values are the corresponding :class:`~dataelem.DataElement` instances. .. warning:: The iterator of a :class:`~dataset.Dataset` yields :class:`~dataelem.DataElement` instances, e.g. the values of the dictionary instead of the keys normally yielded by iterating a :class:`dict`. A :class:`~dataset.Dataset` can be created directly, but you'll usually get one by reading an existing DICOM dataset from file using :func:`~pydicom.filereader.dcmread`:: >>> from pydicom import dcmread, examples >>> # Returns the path to pydicom's examples.rt_plan dataset >>> path = examples.get_path("rt_plan") >>> print(path) PosixPath('/path/to/pydicom/data/test_files/rtplan.dcm') >>> # Read the DICOM dataset at `path` >>> ds = dcmread(path) You can display the contents of the entire dataset using ``str(ds)`` or with:: >>> ds # doctest: +ELLIPSIS Dataset.file_meta ------------------------------- (0002,0000) File Meta Information Group Length UL: 156 (0002,0001) File Meta Information Version OB: b'\x00\x01' (0002,0002) Media Storage SOP Class UID UI: RT Plan Storage (0002,0003) Media Storage SOP Instance UID UI: 1.2.999.999.99.9.9999.9999.20030903150023 (0002,0010) Transfer Syntax UID UI: Implicit VR Little Endian (0002,0012) Implementation Class UID UI: 1.2.888.888.88.8.8.8 ------------------------------------------------- (0008,0012) Instance Creation Date DA: '20030903' (0008,0013) Instance Creation Time TM: '150031' (0008,0016) SOP Class UID UI: RT Plan Storage (0008,0018) SOP Instance UID UI: 1.2.777.777.77.7.7777.7777.20030903150023 (0008,0020) Study Date DA: '20030716' (0008,0030) Study Time TM: '153557' (0008,0050) Accession Number SH: '' (0008,0060) Modality CS: 'RTPLAN' ... You can access specific elements by their DICOM keyword or tag:: >>> ds.PatientName # element keyword 'Last^First^mid^pre' >>> ds[0x10, 0x10].value # element tag 'Last^First^mid^pre' When using the element tag directly a :class:`~dataelem.DataElement` instance is returned, so :attr:`DataElement.value` must be used to get the value. .. warning:: In *pydicom*, private data elements are displayed with square brackets around the name (if the name is known to *pydicom*). These are shown for convenience only; the descriptive name in brackets cannot be used to retrieve data elements. See details in :doc:`private_data_elements`. You can also set an element's value by using the element's keyword or tag number:: >>> ds.PatientID = "12345" >>> ds.SeriesNumber = 5 >>> ds[0x10, 0x10].value = 'Test' The use of element keywords is possible because *pydicom* intercepts requests for member variables, and checks if they are in the DICOM dictionary. It translates the keyword to a (group, element) tag and returns the corresponding value for that tag if it exists in the dataset. See :ref:`sphx_glr_auto_examples_metadata_processing_plot_anonymize.py` for a usage example of data elements removal and assignation. .. note:: To understand using :class:`~sequence.Sequence` in *pydicom*, please refer to this object model: * :class:`~dataset.Dataset` (emulates a Python :class:`dict`) * Contains :class:`~dataelem.DataElement` instances, the value of each element can be one of: * a regular numeric, string or text value as an :class:`int`, :class:`float`, :class:`str`, :class:`bytes`, etc * a :class:`list` of regular values (e.g. a 3-D coordinate) * a :class:`~sequence.Sequence` instance, where :class:`~sequence.Sequence` is a :class:`list` of :class:`~dataset.Dataset` instances * Where each :class:`~dataset.Dataset` contains :class:`~dataelem.DataElement` instances, and so on... The value of sequence elements is a :class:`~sequence.Sequence` instance, which wraps a Python :class:`list`. Items in the sequence are referenced by number, beginning at index ``0`` as per Python convention:: >>> ds.BeamSequence[0].BeamName 'Field 1' >>> # Or, set an intermediate variable to a dataset in the list >>> beam1 = ds.BeamSequence[0] # First dataset in the sequence >>> beam1.BeamName 'Field 1' See :ref:`sphx_glr_auto_examples_metadata_processing_plot_sequences.py`. Using DICOM keywords is the recommended way to access data elements, but you can also use the tag numbers directly, such as:: >>> # Same thing with tag numbers - much harder to read: >>> # Really should only be used if DICOM keyword not in pydicom dictionary >>> ds[0x300a, 0xb0][0][0x300a, 0xc2].value 'Field 1' If you don't remember or know the exact element tag or keyword, :class:`~dataset.Dataset` provides a handy :func:`Dataset.dir()` method, useful during interactive sessions at the Python prompt:: >>> ds.dir("pat") ['PatientBirthDate', 'PatientID', 'PatientName', 'PatientSetupSequence', 'PatientSex'] :func:`Dataset.dir()` will return any non-private element keywords in the dataset that have the specified string anywhere in the keyword (case insensitive). .. note:: Calling :func:`Dataset.dir()` without passing it an argument will return a :class:`list` of all non-private element keywords in the dataset. You can also see all the names that *pydicom* knows about by viewing the :gh:`_dicom_dict.py` file. It should not normally be necessary, but you can add your own entries to the DICOM dictionary at run time using :func:`~datadict.add_dict_entry` or :func:`~datadict.add_dict_entries`. Similarly, you can add private data elements to the private dictionary using :func:`~datadict.add_private_dict_entry` or :func:`~datadict.add_private_dict_entries`. Under the hood, :class:`~dataset.Dataset` stores a :class:`~dataelem.DataElement` object for each item, but when accessed by keyword (e.g. ``ds.PatientName``) only the value of that :class:`~dataelem.DataElement` is returned. If you need the object itself, you can use the access the item using either the keyword (for official DICOM elements) or tag number:: >>> # reload the data >>> ds = pydicom.dcmread(path) >>> elem = ds['PatientName'] >>> elem.VR, elem.value ('PN', 'Last^First^mid^pre') >>> # an alternative is to use: >>> elem = ds[0x0010,0x0010] >>> elem.VR, elem.value ('PN', 'Last^First^mid^pre') To see whether the :class:`~dataset.Dataset` contains a particular element, use the ``in`` operator with the element's keyword or tag:: >>> "PatientName" in ds # or (0x0010, 0x0010) in ds True To remove an element from the :class:`~dataset.Dataset`, use the ``del`` operator:: >>> del ds.SoftwareVersions # or del ds[0x0018, 0x1020] To work with (7FE0,0010) *Pixel Data*, the raw :class:`bytes` are available through the `PixelData` keyword:: >>> # example CT dataset with actual pixel data >>> ds = examples.ct >>> pixel_bytes = ds.PixelData However its much more convenient to use :func:`Dataset.pixel_array` to return a :class:`numpy.ndarray` (requires the `NumPy library `_):: >>> arr = ds.pixel_array >>> arr # doctest: +NORMALIZE_WHITESPACE array([[175, 180, 166, ..., 203, 207, 216], [186, 183, 157, ..., 181, 190, 239], [184, 180, 171, ..., 152, 164, 235], ..., [906, 910, 923, ..., 922, 929, 927], [914, 954, 938, ..., 942, 925, 905], [959, 955, 916, ..., 911, 904, 909]], dtype=int16) For more details, see :doc:`working_with_pixel_data`. DataElement ----------- The :class:`~dataelem.DataElement` class is not usually used directly in user code, but is used extensively by :class:`~dataset.Dataset`. :class:`~dataelem.DataElement` is a simple object which stores the following things: * :attr:`~dataelem.DataElement.tag` -- the element's tag (as a :class:`~pydicom.tag.BaseTag` object). * :attr:`~dataelem.DataElement.VR` -- the element's Value Representation -- a two letter :class:`str` that describes to the format of the stored value. * :attr:`~dataelem.DataElement.VM` -- the element's Value Multiplicity as an :class:`int`. This is automatically determined from the contents of the :attr:`~dataelem.DataElement.value`. * :attr:`~dataelem.DataElement.value` -- the element's actual value. A regular value like a number or string (or :class:`list` of them if the VM > 1), or a :class:`~sequence.Sequence`. Tag --- :func:`~tag.Tag` is not generally used directly in user code, as :func:`BaseTags` are automatically created when you assign or read elements using their keywords as illustrated in sections above. The :class:`~tag.BaseTag` class is derived from :class:`int`, so in effect it's just a number with some extra behavior: * :func:`~tag.Tag` is used to create instances of :class:`~tag.BaseTag` and enforces the expected 4-byte (group, element) structure. * A :class:`~tag.BaseTag` instance can be created from an :class:`int` or a :class:`tuple` containing the (group, element), or from the DICOM keyword:: >>> from pydicom.tag import Tag >>> t1 = Tag(0x00100010) # all of these are equivalent >>> t2 = Tag(0x10, 0x10) >>> t3 = Tag((0x10, 0x10)) >>> t4 = Tag("PatientName") >>> t1 (0010,0010) >>> type(t1) >>> t1==t2, t1==t3, t1==t4 (True, True, True) * :attr:`BaseTag.group` and :attr:`BaseTag.elem` to return the group and element portions of the tag. * The :attr:`BaseTag.is_private` property checks whether the tag represents a private tag (i.e. if group number is odd). Sequence -------- :class:`~sequence.Sequence` is derived from Python's :class:`list`. The only added functionality is to make string representations prettier. Otherwise all the usual methods of :class:`list` like item selection, append, etc. are available. For examples of accessing data nested in sequences, see :ref:`sphx_glr_auto_examples_metadata_processing_plot_sequences.py`. pydicom-pydicom-20aa4b7/doc/guides/user/best_practices.rst000066400000000000000000000110601515706620200237530ustar00rootroot00000000000000.. _best_practices: .. title:: Best Practices Best Practices ============== .. currentmodule:: pydicom .. rubric:: Future-proof your code, and help ensure valid DICOM Introduction ------------ There are some features of *pydicom* that allow you to help check your code for more strict DICOM practices, and to future-proof against major *pydicom* version changes. It is recommended that you turn on two features if you can: enforcement of valid DICOM, and a flag to enable "future" *pydicom* changes. Enforcing Valid DICOM --------------------- *pydicom* has configuration options to help enforce valid DICOM: :attr:`~pydicom.config.Settings.reading_validation_mode` and :attr:`~pydicom.config.Settings.writing_validation_mode`. The first setting is about validation of values read from existing DICOM data, the second about validation of newly created and written values. Both can have the values :attr:`~pydicom.config.IGNORE`, :attr:`~pydicom.config.WARN` and :attr:`~pydicom.config.RAISE`. As the name suggests, some non-standard DICOM datasets may result in a warning (this is the default for ``reading_validation_mode``) or in a raised exception (the default for ``writing_validation_mode``). If ``IGNORE`` is set, the validation is not performed in most cases. This setting may be used in some special cases where you want to avoid the validation. The setting for ``writing_validation_mode`` may be changed for some cases, where writing invalid DICOM is needed to support some legacy software, but this is generally not recommended. The default setting for ``reading_validation_mode`` allows you to deal with files that do not strictly adhere to the DICOM Standard. Setting it to ``RAISE`` can help to ensure that only valid DICOM data is accepted. These flags do not guarantee strict DICOM results, as not all of the possible validations from the DICOM Standard are checked. Included are checks for correct value length, contained character set and for predefined formats where applicable (such as for date/time related values). To change a flag in your code: .. code-block:: python from pydicom import config config.settings.reading_validation_mode = config.RAISE Note that you *must not* use :code:`from pydicom.config.settings import reading_validation_mode`. That makes the ``reading_validation_mode`` variable local only to that module, so *pydicom* would not see your change to its value. Future-proofing your code ------------------------- *pydicom*, like all software, must balance its evolution with not breaking existing code using the library. Sometimes, major changes are necessary to make significant improvements to the library. To help you protect your code against future changes, *pydicom* allows you to flag that it should behave as it will for any known upcoming major changes. Running your code with this turned on will help identify any parts of your code that are not compatible with the known changes in the next major version of *pydicom*. The simplest way to set this behavior is to set an environment variable ``PYDICOM_FUTURE`` to ``True``. For example to temporarily turn it on in the current terminal session: .. code-block:: SET PYDICOM_FUTURE=True (Windows) export PYDICOM_FUTURE=True (many linux environments) If you wish to turn off the behavior, you can either remove the environment variable, or set it to "False". See your operating system documentation for more details on setting or removing environment variables. The other way to enable the future behavior is to turn it on at run-time using the :func:`~pydicom.config.future_behavior` function: .. code-block:: python from pydicom import config config.future_behavior() If you needed to turn the future behavior off again at run-time, call :func:`~pydicom.config.future_behavior` with False: .. code-block:: python config.future_behavior(False) Limiting the *pydicom* major version in your package ---------------------------------------------------- Another way to avoid breaking changes in future *pydicom* versions is to limit the version of *pydicom* that your code uses. If you follow standard Python packaging recommendations, you can add a line to your ``requirements.txt`` or ``pyproject.toml`` file to limit the *pydicom* version to the current major version. E.g. a line like: .. code-block:: pydicom >=2.0,<3.0 in the ``requirements.txt`` file will ensure that those installing your package will get the same major version (in the example, version 2) of *pydicom* that you have developed the code for. This works best if your package is installed in a virtual environment. pydicom-pydicom-20aa4b7/doc/guides/user/image_data_compression.rst000066400000000000000000000162541515706620200254670ustar00rootroot00000000000000.. _guide_compression: Compressing *Pixel Data* ======================== .. currentmodule:: pydicom .. rubric:: How to compress Pixel Data Compressing using pydicom ------------------------- .. _guide_compression_supported: Supported Transfer Syntaxes ........................... *Pixel Data* can be compressed natively using *pydicom* for the following transfer syntaxes: .. _np: https://numpy.org/ .. _pylj: https://github.com/pydicom/pylibjpeg .. _rle: https://github.com/pydicom/pylibjpeg-rle .. _oj: https://github.com/pydicom/pylibjpeg-openjpeg .. _gdcm: https://sourceforge.net/projects/gdcm/ .. _jls: https://github.com/pydicom/pyjpegls +------------------------------------------------+------------------+-----------------------------+ | Transfer Syntax | Plugin names | Dependencies | +-----------------------+------------------------+ | | | Name | UID | | | +=======================+========================+==================+=============================+ | JPEG-LS Lossless | 1.2.840.10008.1.2.4.80 | pyjpegls | `numpy `_, | +-----------------------+------------------------+ | `pyjpegls `_ | | JPEG-LS Near Lossless | 1.2.840.10008.1.2.4.81 | | | +-----------------------+------------------------+------------------+-----------------------------+ | JPEG 2000 Lossless | 1.2.840.10008.1.2.4.90 | pylibjpeg | `numpy `_, | +-----------------------+------------------------+ | `pylibjpeg `_, | | JPEG 2000 | 1.2.840.10008.1.2.4.91 | | `pylibjpeg-openjpeg `_ | +-----------------------+------------------------+------------------+-----------------------------+ | RLE Lossless | 1.2.840.10008.1.2.5 | pydicom :sup:`1` | | | | +------------------+-----------------------------+ | | | pylibjpeg | `numpy `_, | | | | | `pylibjpeg `_, | | | | | `pylibjpeg-rle `_ | | | +------------------+-----------------------------+ | | | gdcm | `gdcm `_ | +-----------------------+------------------------+------------------+-----------------------------+ | :sup:`1` *~20x slower than the other plugins* Each of the supported transfer syntaxes has a corresponding encoding guide to help you with the specific requirements of the encoding method. +-------------------------+-----------------------------------------------------+ | Transfer Syntax | Encoding guide | +=========================+=====================================================+ | JPEG-LS Lossless | :doc:`JPEG-LS Encoding` | +-------------------------+ | | JPEG-LS Near Lossless | | +-------------------------+-----------------------------------------------------+ | JPEG 2000 Lossless | :doc:`JPEG 2000 Encoding` | +-------------------------+ | | JPEG 2000 | | +-------------------------+-----------------------------------------------------+ | RLE Lossless | :doc:`RLE Encoding` | +-------------------------+-----------------------------------------------------+ Compressing with ``Dataset.compress()`` ....................................... The :meth:`Dataset.compress()` method or :func:`~pydicom.pixels.compress` function can be used to compress an uncompressed dataset in-place: .. code-block:: python from pydicom import examples from pydicom.uid import RLELossless ds = examples.ct ds.compress(RLELossless) ds.save_as("ct_rle_lossless.dcm") A specific encoding plugin can be used by passing the plugin name via the `encoding_plugin` argument: .. code-block:: python # Will set `ds.is_little_endian` and `ds.is_implicit_VR` automatically ds.compress(RLELossless, encoding_plugin='pylibjpeg') ds.save_as("ct_rle_lossless.dcm") Implicitly changing the compression on an already compressed dataset is not currently supported, however it can still be done by decompressing prior to calling :meth:`~pydicom.dataset.Dataset.compress`. In the example below, a matching :doc:`image data handler` for the original transfer syntax - *JPEG 2000 Lossless* - is required. .. code-block:: python # Requires a JPEG 2000 compatible image data handler ds = examples.jpeg2k ds.decompress() ds.compress(RLELossless) ds.save_as("US1_RLE.dcm") Compressing using third-party packages -------------------------------------- If you need to perform pixel data compression using an encoding method not supported by *pydicom* - such as :dcm:`ISO/IEC 10918-1 JPEG ` - then you'll need to find a third-party package or application to do so. Once you've done that you have to follow the requirements for compressed *Pixel Data* in the DICOM Standard: * Each frame of pixel data must be encoded separately * All the encoded frames must then be :func:`encapsulated ` using a basic offset table. When the amount of encoded data is too large for the basic offset table then the use of the :func:`extended offset table ` is recommended. * A dataset with encapsulated pixel data must use explicit VR little endian encoding See the :dcm:`relevant sections of the DICOM Standard` for more information. .. code-block:: python from typing import List, Tuple from pydicom import examples from pydicom.encaps import encapsulate, encapsulate_extended from pydicom.uid import JPEGBaseline8Bit # Fetch an example dataset ds = examples.ct # Use third-party package to compress # Let's assume it compresses to JPEG Baseline (lossy) frames: List[bytes] = third_party_compression_func(...) # Set the *Transfer Syntax UID* appropriately ds.file_meta.TransferSyntaxUID = JPEGBaseline8Bit # Basic encapsulation ds.PixelData = encapsulate(frames) # Set the element's VR and use an undefined length ds["PixelData"].is_undefined_length = True ds["PixelData"].VR = "OB" if ds.BitsAllocated <= 8 else "OW" # Save! ds.save_as("ct_compressed_basic.dcm") # Extended encapsulation result: Tuple[bytes, bytes, bytes] = encapsulate_extended(frames) ds.PixelData = result[0] ds.ExtendedOffsetTable = result[1] ds.ExtendedOffsetTableLength = result[2] ds.save_as("ct_compressed_ext.dcm") pydicom-pydicom-20aa4b7/doc/guides/user/image_data_handlers.rst000066400000000000000000000200311515706620200247120ustar00rootroot00000000000000.. _guide_compressed: Handling of compressed pixel data --------------------------------- .. currentmodule:: pydicom .. rubric:: How to get compressed pixel data .. |chk| unicode:: U+02713 .. CHECK MARK Prerequisites ............. To be able to decompress compressed DICOM pixel data, you need to install one or more packages that are able to handle the format the data is encoded in. The following packages can be used with *pydicom* and `NumPy `_ to decompress compressed *Pixel Data*: * :gh:`pylibjpeg ` with the ``pylibjpeg-libjpeg``, ``pylibjpeg-openjpeg`` and ``pylibjpeg-rle`` plugins. Supports the most commonly used transfer syntaxes. * `jpeg_ls `_ supports JPEG-LS transfer syntaxes. * `GDCM `_ supports the most commonly used transfer syntaxes. * `Pillow `_, ideally with the ``jpeg`` and ``jpeg2000`` plugins. However we don't recommend using Pillow as it performs a number of undesirable operations on the decoded images which are not always reversible. .. caution:: We rely on the data handling capacity of the mentioned packages and cannot guarantee the correctness of the generated uncompressed pixel data. Be sure to verify the correctness of the output using other means before you use them. Supported Transfer Syntaxes ........................... To get the transfer syntax of a dataset you can do:: >>> from pydicom import dcmread >>> ds = dcmread('path/to/dicom/file') >>> ds.file_meta.TransferSyntaxUID '1.2.840.10008.1.2.1' >>> ds.BitsAllocated 16 As far as we have been able to verify, the following transfer syntaxes are handled by the given packages: +---------------------------------------------------------------------+-------+-------------+----------+-----------------+-----------------+ | Transfer Syntax | NumPy | NumPy + | NumPy + | NumPy + | NumPy + | +-------------------------------------------+-------------------------+ | JPEG-LS | GDCM | Pillow | pylibjpeg | | Name | UID | | | | | | +===========================================+=========================+=======+=============+==========+=================+=================+ | Explicit VR Little Endian | 1.2.840.10008.1.2.1 | |chk| | |chk| | |chk| | |chk| | |chk| | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | Implicit VR Little Endian | 1.2.840.10008.1.2 | |chk| | |chk| | |chk| | |chk| | |chk| | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | Explicit VR Big Endian | 1.2.840.10008.1.2.2 | |chk| | |chk| | |chk| | |chk| | |chk| | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | Deflated Explicit VR Little Endian | 1.2.840.10008.1.2.1.99 | |chk| | |chk| | |chk| | |chk| | |chk| | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | RLE Lossless | 1.2.840.10008.1.2.5 | |chk| | |chk| | |chk| | |chk| | |chk|\ :sup:`4` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG Baseline (Process 1) | 1.2.840.10008.1.2.4.50 | | | |chk| | |chk|\ :sup:`1` | |chk|\ :sup:`5` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG Extended (Process 2 and 4) | 1.2.840.10008.1.2.4.51 | | | |chk| | |chk|\ | |chk|\ :sup:`5` | | | | | | | :sup:`1,3` | | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG Lossless (Process 14) | 1.2.840.10008.1.2.4.57 | | | |chk| | | |chk|\ :sup:`5` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG Lossless (Process 14, SV1) | 1.2.840.10008.1.2.4.70 | | | |chk| | | |chk|\ :sup:`5` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG LS Lossless | 1.2.840.10008.1.2.4.80 | | |chk| | |chk| | | |chk|\ :sup:`5` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG LS Lossy | 1.2.840.10008.1.2.4.81 | | |chk| | |chk| | | |chk|\ :sup:`5` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG 2000 Lossless | 1.2.840.10008.1.2.4.90 | | | |chk| | |chk|\ :sup:`2` | |chk|\ :sup:`6` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | JPEG 2000 | 1.2.840.10008.1.2.4.91 | | | |chk| | |chk|\ :sup:`2` | |chk|\ :sup:`6` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | High-Throughput JPEG 2000 Lossless | 1.2.840.10008.1.2.4.201 | | | | | |chk|\ :sup:`6` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | High-Throughput JPEG 2000 (RPCL) Lossless | 1.2.840.10008.1.2.4.202 | | | | | |chk|\ :sup:`6` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | High-Throughput JPEG 2000 | 1.2.840.10008.1.2.4.203 | | | | | |chk|\ :sup:`6` | +-------------------------------------------+-------------------------+-------+-------------+----------+-----------------+-----------------+ | :sup:`1` *only with JpegImagePlugin* | :sup:`2` *only with Jpeg2KImagePlugin* | :sup:`3` *only if (0028,0100) Bits Allocated = 8* | :sup:`4` *with the pylibjpeg-rle plugin, 4-5x faster than default* | :sup:`5` *with the pylibjpeg-libjpeg plugin* | :sup:`6` *with the pylibjpeg-openjpeg plugin* Usage ..... To get uncompressed pixel data as a NumPy :class:`~numpy.ndarray` you have a number of options, depending on your requirements: * To access the pixel data without modifying the dataset you can use the :attr:`Dataset.pixel_array` property, or the :func:`~pydicom.pixels.pixel_array` and :func:`~pydicom.pixels.iter_pixels` functions with a :class:`~pydicom.dataset.Dataset` instance. * To access the pixel data while minimizing memory usage you can use the :func:`~pydicom.pixels.pixel_array` or :func:`~pydicom.pixels.iter_pixels` functions with the path to the dataset. * To decompress a dataset in-place you can use :meth:`Dataset.decompress()` or the :func:`~pydicom.pixels.decompress` function. pydicom-pydicom-20aa4b7/doc/guides/user/index.rst000066400000000000000000000004761515706620200221010ustar00rootroot00000000000000.. _pydicom_user_guide: ================== pydicom User Guide ================== .. toctree:: base_element writing_files working_with_pixel_data working_with_overlays working_with_waveforms image_data_handlers image_data_compression viewing_images private_data_elements best_practices pydicom-pydicom-20aa4b7/doc/guides/user/private_data_elements.rst000066400000000000000000000161411515706620200253250ustar00rootroot00000000000000.. _private_data_elements: Private Data Elements ===================== .. rubric:: Accessing or creating private data elements .. currentmodule:: pydicom.dataset Introduction ------------ The DICOM standard allows DICOM file creators to use `private data elements` to store information that is not defined by the DICOM standard itself. Private data elements are stored in a :class:`~pydicom.dataset.Dataset` just like other data elements. When reading files with *pydicom*, they will automatically be read and available for display. *pydicom* knows descriptive names for some 'well-known' private data elements, but for others it may not be able to show anything except the tag and the value. When writing your own private data elements, the DICOM standard requires the use of 'private creator blocks'. *pydicom* has some convenience functions to make creating private blocks and data elements easier. The sections below outlines accessing and creating private blocks and data elements using *pydicom*. Displaying Private Data Elements in *pydicom* --------------------------------------------- Here is an example of some private tags displayed for *pydicom's* example CT dataset:: >>> from pydicom import examples >>> ds = examples.ct >>> ds Dataset.file_meta ------------------------------- (0002, 0000) File Meta Information Group Length UL: 192 (0002, 0001) File Meta Information Version OB: b'\x00\x01' (0002, 0002) Media Storage SOP Class UID UI: CT Image Storage (0002, 0003) Media Storage SOP Instance UID UI: 1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 (0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian (0002, 0012) Implementation Class UID UI: 1.3.6.1.4.1.5962.2 (0002, 0013) Implementation Version Name SH: 'DCTOOL100' (0002, 0016) Source Application Entity Title AE: 'CLUNIE1' ------------------------------------------------- (0008, 0005) Specific Character Set CS: 'ISO_IR 100' (0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL'] ... (0009, 0010) Private Creator LO: 'GEMS_IDEN_01' (0009, 1001) [Full fidelity] LO: 'GE_GENESIS_FF' (0009, 1002) [Suite id] SH: 'CT01' ... The last two lines in the example above show *pydicom's* display of two private data elements. The line preceding those shows the private creator data element that reserves a section of tag element numbers for that creator's use. Since the descriptions for private data elements are not part of the DICOM standard, and are thus not necessarily unique, *pydicom* does not allow you to access data elements using those names. This is indicated by enclosing the text in square brackets, to make it clear it is different from DICOM standard descriptors. You can still access the private data elements using the tag, remembering that data elements access by tag number return a full :class:`~pydicom.dataelem.DataElement` instance, and the `value` attribute is needed to get the value:: >>> ds[0x00091001].value 'GE_GENESIS_FF' You can also create a :class:`PrivateBlock` instance and access elements through it:: >>> block = ds.private_block(0x0009, 'GEMS_IDEN_01') >>> block[0x01] (0009, 1001) [Full fidelity] LO: 'GE_GENESIS_FF' >>> block[0x01].value 'GE_GENESIS_FF' Using the private block like this is even more useful when creating your own private data elements, as shown in the next section. Setting Private Data Elements with *pydicom* -------------------------------------------- The DICOM standard requires a private creator data element to identify and reserve a section of private tags. That name should be unique, and usually has the company name as the first part to accomplish that. *pydicom* provides convenience functions to manage this:: >>> block = ds.private_block(0x000b, "My company 001", create=True) >>> block.add_new(0x01, "SH", "my value") >>> ds ... (000b, 0010) Private Creator LO: 'My company 001' (000b, 1001) Private tag data SH: 'my value' ... Standard Python operations like ``in`` and ``del`` can also be used when working with block object:: >>> 0x01 in block True >>> 0x02 in block False >>> del block[0x01] >>> 0x01 in block False Since v3.0, there's also a convenience method to add a private tag without creating a private block first:: >>> block = ds.add_new_private("My company 001", 0x000B, 0x01, "my value", VR.SH) >>> ds ... (000b, 0010) Private Creator LO: 'My company 001' (000b, 1001) Private tag data SH: 'my value' ... Note that for known private tags you don't need to provide the VR in this function. Removing All Private Data Elements ----------------------------------------------- One part of anonymizing a DICOM file is to ensure that private data elements have been removed, as there is no guarantee as to what kind of information might be contained in them. *pydicom* provides a convenience function :func:`Dataset.remove_private_tags` to recursively remove private elements:: >>> ds.remove_private_tags() This can also be helpful during interactive sessions when exploring DICOM files, to remove a large number of lines from the display of a dataset -- lines which may not provide useful information. Adding new entries to the DICOM dictionary ------------------------------------------ *pydicom* contains a dictionary with all known DICOM tags from the latest DICOM standard at release time. It also contains a dictionary with a number of known private tags collected from various sources. Sometimes you may encounter tags unknown to *pydicom* - either tags defined in a newer version of the standard, or, the more common case, private tags that are not contained in the private tags dictionary. In this case, you can add these tags to the DICOM dictionary before reading or writing datasets containing these tags. After that, *pydicom* will correctly handle the type of these tags, and can display their description if needed. For standard tags, you can use :func:`~pydicom.datadict.add_dict_entry` or :func:`~pydicom.datadict.add_dict_entries` (to add multiple tags at once):: >>> add_dict_entry(tag=0x888800001, VR="SH", keyword="SomeNewTag", description="Some New Tag") For private tags, the analogous functions are :func:`~pydicom.datadict.add_private_dict_entry` and :func:`~pydicom.datadict.add_private_dict_entries`:: >>> add_private_dict_entry(private_creator="ACME 1.1", tag=0x004100001, VR="DA", description="Release Date") Note that private tags do not have a keyword, as they are not registered in the standard DICOM data dictionary. As a private tag is defined by the tuple of private creator, group ID and tag offset, you always have to provide the private creator to define a new private tag. An example of how to use :func:`~pydicom.datadict.add_private_dict_entries` can be found in :ref:`this code snippet `. pydicom-pydicom-20aa4b7/doc/guides/user/viewing_images.rst000066400000000000000000000025541515706620200237660ustar00rootroot00000000000000.. _viewing_images: Viewing Images ============== .. rubric:: How to use other packages with pydicom to view DICOM images Introduction ------------ *pydicom* is mainly concerned with getting at the DICOM data elements in files, but it is often desirable to view pixel data as an image. There are several options: * Use any of the many `DICOM viewer `_ programs available * use pydicom with `matplotlib `_ * use pydicom with Python's stdlib `Tkinter `_ module. * use pydicom with `Pillow `_ * use pydicom with `wxPython `_ Using pydicom with matplotlib ----------------------------- `matplotlib `_ can be used with the :class:`numpy.ndarray` from :attr:`Dataset.pixel_array` to display it:: >>> import matplotlib.pyplot as plt >>> from pydicom import examples >>> ds = examples.ct >>> plt.imshow(ds.pixel_array, cmap=plt.cm.gray) # doctest: +ELLIPSIS .. image:: ./../../auto_examples/input_output/images/sphx_glr_plot_read_dicom_001.png :target: ./../../auto_examples/input_output/plot_printing_dataset.html :scale: 60 :align: center pydicom-pydicom-20aa4b7/doc/guides/user/working_with_overlays.rst000066400000000000000000000066171515706620200254340ustar00rootroot00000000000000.. _working_with_overlay_data: .. title:: Working with Overlay Data Working with Overlay Data ========================= .. currentmodule:: pydicom .. rubric:: How to work with overlay data in pydicom. Introduction ------------ :dcm:`Overlays` in DICOM are present in what's called a :dcm:`Repeating Group`, where the group number of the element tags are defined over a range rather than a specific value. For example, the tag's group number for (60xx,3000) *Overlay Data* may be (in hex) ``6000``, ``6002``, or any even value up to ``601E``. This allows a dataset to include multiple overlays, where the related elements for each overlay use the same group number. Because of this, the only way to access a particular element from an overlay is to use the ``Dataset[group, elem]`` method:: >>> from pydicom import examples >>> ds = examples.overlay >>> elem = ds[0x6000, 0x3000] # returns a DataElement >>> print(elem) (6000, 3000) Overlay Data OW: Array of 29282 elements *pydicom* tends to be "lazy" in interpreting DICOM data. For example, by default it doesn't do anything with overlay data except read in the raw bytes:: >>> elem.value # doctest: +ELLIPSIS b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00... ``Dataset.overlay_array()`` --------------------------- .. warning:: :meth:`Dataset.overlay_array()` requires `NumPy `_. The *Overlay Data* element contains the raw bytes exactly as found in the file as bit-packed data. To unpack and get an overlay in a more useful form you can use the :meth:`~pydicom.dataset.Dataset.overlay_array` method to return a :class:`numpy.ndarray`. To use it you only need to pass the group number of the overlay elements you're interested in:: >>> arr = ds.overlay_array(0x6000) # doctest: +NORMALIZE_WHITESPACE >>> arr array([[ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0], ..., [ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0], [ 0, 0, 0, ..., 0, 0, 0],], dtype=uint8) >>> arr.shape (484, 484) One thing to remember when dealing with *Overlay Data* is that the top left of the overlay doesn't necessarily have to line up with the top left of the related *Pixel Data*. The actual offset between them can be determined from (60xx,0050) *Overlay Origin*, where a value of ``[1, 1]`` indicates that the top left pixels are aligned and a value of ``[0, 0]`` indicates that the overlay pixels start 1 row above and 1 row to the left of the image pixels. NumPy can be used to modify the pixels, but if the changes are to be saved, they must be bit-packed (using something like :func:`~pydicom.pixels.pack_bits`) and written back to the correct element: .. code-block:: python # Add a line arr[10, :] = 1 # Pack the data from pydicom.pixels import pack_bits packed_bytes = pack_bits(arr) # Update the element value ds[0x6000, 0x3000].value = packed_bytes ds.save_as("temp.dcm") Some changes may require other DICOM elements to be modified. For example, if the overlay data is reduced (e.g. a 512x512 image is resized to 256x256) then the corresponding (60xx,0010) *Overlay Rows* and (60xx,0011) *Overlay Columns* should be set appropriately. You must explicitly set these yourself as *pydicom* does not do so automatically. pydicom-pydicom-20aa4b7/doc/guides/user/working_with_pixel_data.rst000066400000000000000000000176151515706620200257020ustar00rootroot00000000000000.. _working_with_pixel_data: .. title:: Working with Pixel Data Working with Pixel Data ======================= .. currentmodule:: pydicom .. rubric:: How to work with pixel data in pydicom. Introduction ------------ Many DICOM SOP classes contain bulk pixel data, which is usually used to represent one or more image frames (although :dcm:`other types of data ` are possible). In these SOP classes the pixel data is (almost) always contained in the (7FE0,0010) *Pixel Data* element. The only exception to this is :dcm:`Parametric Map Storage ` which may instead contain data in the (7FE0,0008) *Float Pixel Data* or (7FE0,0009) *Double Float Pixel Data* elements. .. note:: In the following the term *pixel data* will be used to refer to the bulk data from *Pixel Data*, *Float Pixel Data* and *Double Float Pixel Data* elements. While the examples use ``PixelData``, ``FloatPixelData`` or ``DoubleFloatPixelData`` could also be used interchangeably provided the dataset contains the corresponding element. By default *pydicom* reads in pixel data as the raw bytes found in the file:: >>> from pydicom import dcmread, examples >>> path = examples.get_path("mr") # The path to the examples.mr dataset >>> ds = dcmread(path) >>> ds.PixelData # doctest: +ELLIPSIS b'\x89\x03\xfb\x03\xcb\x04\xeb\x04\xf9\x02\x94\x01\x7f... ``PixelData`` is often not immediately useful as data may be stored in a variety of different ways: - The pixel values may be signed or unsigned integers, or floats - There may be multiple image frames - There may be :dcm:`multiple planes per frame ` (i.e. RGB) and the :dcm:`order of the pixels` may be different - The image data may be encoded using one of the available compression standards (``1.2.840.10008.1.2.4.50`` *JPEG Baseline*, ``1.2.840.10008.1.2.5`` *RLE Lossless*, etc). Encoded image data will also be :dcm:`encapsulated` and each encapsulated image frame may be broken up into one or more fragments. Because of the complexity in interpreting the pixel data, *pydicom* provides an easy way to get it in a convenient form: :attr:`Dataset.pixel_array`. ``Dataset.pixel_array`` ----------------------- .. warning:: :attr:`Dataset.pixel_array` requires `NumPy `_. :attr:`Dataset.pixel_array` returns a :class:`numpy.ndarray` containing the pixel data:: >>> arr = ds.pixel_array # doctest: +NORMALIZE_WHITESPACE >>> arr array([[ 905, 1019, 1227, ..., 302, 304, 328], [ 628, 770, 907, ..., 298, 331, 355], [ 498, 566, 706, ..., 280, 285, 320], ..., [ 334, 400, 431, ..., 1094, 1068, 1083], [ 339, 377, 413, ..., 1318, 1346, 1336], [ 378, 374, 422, ..., 1369, 1129, 862]], dtype=int16) >>> arr.shape (64, 64) If the pixel data is compressed then :attr:`~pydicom.dataset.Dataset.pixel_array` will return the uncompressed data, provided the dependencies of the required pixel data decoder have been met. See :doc:`handling compressed image data ` for more information. NumPy can be used to modify the data, but if the changes are to be saved, they must be written back to the dataset's ``PixelData`` element. .. warning:: Converting data from an ``ndarray`` back to ``bytes`` may not be as straightforward as in the following example, particularly for multi-planar images or where compression is required. .. code-block:: python # example: zero anything < 300 arr = ds.pixel_array arr[arr < 300] = 0 ds.PixelData = arr.tobytes() ds.save_as("temp.dcm") Some changes may require other DICOM tags to be modified. For example, if the image size is reduced (e.g. a 512x512 image is shrunk to 256x256) then ``Rows`` and ``Columns`` should be set appropriately. You must explicitly set these yourself; *pydicom* does not do so automatically. See :ref:`sphx_glr_auto_examples_image_processing_plot_downsize_image.py` for an example. :attr:`~pydicom.dataset.Dataset.pixel_array` can also be used to pass image data to graphics libraries for viewing. See :doc:`viewing_images` for details. .. _colorspace: Color space ----------- When using :attr:`~pydicom.dataset.Dataset.pixel_array` with *Pixel Data* that has an (0028,0002) *Samples per Pixel* value of ``3`` then the returned pixel data will be in the color space as given by (0028,0004) *Photometric Interpretation* (e.g. ``RGB``, ``YBR_FULL``, ``YBR_FULL_422``, etc). *pydicom* offers a limited ability to convert between 8-bits/channel YBR and RGB color spaces through the :func:`~pydicom.pixels.processing.convert_color_space` function. When changing the color space you should also change the value of *Photometric Interpretation* to match. .. note:: See the DICOM Standard, Part 3, :dcm:`Section C.7.6.3.1` for more information about color spaces. Palette Color ------------- Some DICOM datasets store their output image pixel values in a lookup table (LUT), where the values in *Pixel Data* are the index to a corresponding LUT entry. When a dataset's (0028,0004) *Photometric Interpretation* value is ``PALETTE COLOR`` then the :func:`~pydicom.pixels.processing.apply_color_lut` function can be used to apply a palette color LUT to the pixel data to produce an RGB image. .. code-block:: python from pydicom import examples from pydicom.pixels import apply_color_lut # Fetch an example PALETTE COLOR dataset ds = examples.palette_color arr = ds.pixel_array rgb = apply_color_lut(arr, ds) It's also possible to apply one of the DICOM :dcm:`well-known color palettes` provided the bit-depth of the pixel data is 8-bit. .. code-block:: python from pydicom import examples from pydicom.pixels import apply_color_lut ds = examples.palette_color arr = ds.pixel_array # You could also use the corresponding well-known SOP Instance UID rgb = apply_color_lut(arr, palette='PET') .. note:: See the DICOM Standard, Part 3, Annexes :dcm:`C.7.6.3` and :dcm:`C.7.9` for more information. Modality LUT or Rescale Operation --------------------------------- The DICOM :dcm:`Modality LUT` module converts raw pixel data values to a specific (possibly unitless) physical quantity, such as Hounsfield units for CT. The :func:`~pydicom.pixels.processing.apply_modality_lut` function can be used with an input array of raw values and a dataset containing a Modality LUT module to return the converted values. When a dataset requires multiple grayscale transformations, the Modality LUT transformation is always applied first. .. code-block:: python from pydicom import examples from pydicom.pixels import apply_modality_lut ds = examples.ct arr = ds.pixel_array hu = apply_modality_lut(arr, ds) VOI LUT or Windowing Operation ------------------------------ The DICOM :dcm:`VOI LUT` module applies a VOI or windowing operation to input values. The :func:`~pydicom.pixels.processing.apply_voi_lut` function can be used with an input array and a dataset containing a VOI LUT module to return values with applied VOI LUT or windowing. When a dataset contains multiple VOI or windowing views then a particular view can be returned by using the `index` keyword parameter. When a dataset requires multiple grayscale transformations, then it's assumed that the modality LUT or rescale operation has already been applied. .. code-block:: python from pydicom import examples from pydicom.pixels import apply_voi_lut ds = examples.overlay arr = ds.pixel_array out = apply_voi_lut(arr, ds, index=0) pydicom-pydicom-20aa4b7/doc/guides/user/working_with_waveforms.rst000066400000000000000000000061371515706620200255760ustar00rootroot00000000000000.. _working_with_waveform_data: .. title:: Working with Waveform Data Working with Waveform Data ========================== .. currentmodule:: pydicom .. rubric:: How to work with waveform data in pydicom. Introduction ------------ Some DICOM SOP classes such as :dcm:`Basic Voice Audio Waveform ` and :dcm:`12-Lead ECG` contain a (5400,0100) *Waveform Sequence* element, where each item in the sequence is a related group of waveforms (a multiplex). The requirements of the sequence is given by the :dcm:`Waveform module ` in Part 3, Annex C.10.9 of the DICOM Standard. Each multiplex consists of one or more channels synchronised at a common sampling frequency (in Hz), which is given by the (003A,001A) *Sampling Frequency*. The waveform data for each multiplex is encoded in the corresponding (5400,1010) *Waveform Data* element. >>> from pydicom import examples >>> ds = examples.waveform >>> ds.WaveformSequence >>> multiplex = ds.WaveformSequence[0] >>> multiplex.NumberOfWaveformChannels 12 >>> multiplex.SamplingFrequency "1000.0" >>> multiplex['WaveformData'] (5400, 1010) Waveform Data OW: Array of 240000 elements ``Dataset.waveform_array()`` ---------------------------- .. warning:: :attr:`Dataset.waveform_array()` requires `NumPy `_. The *Waveform Data* element contains the raw bytes exactly as found in the file. To get the waveforms in a more useful form you can use the :attr:`Dataset.waveform_array()` method to return a :class:`numpy.ndarray` with shape (samples, channels) for the multiplex group at `index` in the *Waveform Sequence*. >>> multiplex_1 = ds.waveform_array(0) >>> multiplex_1 array([[ 100. , 112.5 , 12.5 , ..., -25. , -68.75, -50. ], [ 81.25, 106.25, 25. , ..., -25. , -75. , -50. ], [ 62.5 , 100. , 37.5 , ..., -25. , -81.25, -50. ], ..., [ 25. , 131.25, 106.25, ..., -137.5 , -150. , -100. ], [ 21.25, 137.5 , 116.25, ..., -137.5 , -150. , -106.25], [ 25. , 137.5 , 112.5 , ..., -137.5 , -150. , -112.5 ]]) >>> multiplex_1.shape (10000, 12) >>> multiplex_2 = ds.waveform_array(1) >>> multiplex_2.shape (1200, 12) If the *Channel Sensitivity Correction Factor* is available for a given channel then it will be applied to the raw channel data. If you need the raw data without any corrections then you can use the :func:`~pydicom.waveforms.numpy_handler.multiplex_array` function with the *as_raw* keyword parameter instead: >>> from pydicom.waveforms import multiplex_array >>> arr = multiplex_array(ds, 0, as_raw=True) >>> arr array([[ 80, 90, 10, ..., -20, -55, -40], [ 65, 85, 20, ..., -20, -60, -40], [ 50, 80, 30, ..., -20, -65, -40], ..., [ 20, 105, 85, ..., -110, -120, -80], [ 17, 110, 93, ..., -110, -120, -85], [ 20, 110, 90, ..., -110, -120, -90]], dtype=int16) pydicom-pydicom-20aa4b7/doc/guides/user/writing_files.rst000066400000000000000000000073751515706620200236440ustar00rootroot00000000000000.. _writing_dicom_files: .. title:: Writing DICOM Files Writing DICOM Files =================== .. currentmodule:: pydicom .. rubric:: How to write DICOM files using pydicom. Introduction ------------ Probably the most common use of *pydicom* is to read an existing DICOM file, alter some items, and write it back out again. The :doc:`Dataset basics tutorial ` shows how to do this. If you need to create a DICOM file from scratch then you can either: * Use the ``codify`` script to create Python code from an existing dataset. * Create a new :class:`~pydicom.dataset.Dataset` instance and populate it. .. Warning:: To be truly DICOM compliant, certain data elements will be required in the file meta information and in the main dataset. Also, you should create your own UIDs, implementation name, and so on. .. _writing_files_using_codify: Using ``codify`` ---------------- *pydicom* has a command-line utility called ``codify`` that takes an existing DICOM file, and produces Python code that can be run to produce a copy of the original file. In other words: *pydicom* has a tool that can automatically generate well-designed Python code for you - code that creates DICOM files. The only requirement is that you have an existing DICOM file that looks approximately like the one you need. You can then use the code as a model to work from. The tool is especially useful with sequences, which can be tricky to code correctly. .. Warning:: The code produced by ``codify`` will contain all the information in the original file, which may include private health information or other sensitive information. If the code is run, the resulting DICOM file will also contain that information. You may want to consider using de-identified DICOM files with ``codify``, or handling the output files according to your requirements for sensitive information. One issue to be aware of is that ``codify`` will not create code for large items like pixel data. Instead it creates a line like: .. code-block:: python ds.PixelData = # XXX Array of 524288 bytes excluded In that case, the code will produce a syntax error when run, and you will have to edit the code to supply a valid value. .. note:: The ``--exclude-size parameter`` can set the maximum size of the data element value that is coded. Data elements bigger than that will have the syntax error line as shown above. One potential disadvantage of ``codify``, depending on your use case, is that it does not create loops. If you have, say, 30 items in a Sequence, ``codify`` will produce code that makes them one at a time. Code you wrote by hand would likely create them in a loop, because most of the code needed is quite repetitive. If you want to switch to a loop, you could use the first item's code as a starting point, and modify as needed, deleting the code for the other individual items. For details on calling the ``codify`` command, see the :ref:`cli_codify` section. ``codify`` could also be called from code, rather than from a command line; you can look at the codify.py source and the ``code_file`` function for a starting point for that. Writing a file from scratch --------------------------- The ``codify`` tool, described in the previous section, is a good starting point for *pydicom* code, but if you can't (or don't want to) use that tool, then you can certainly write code from scratch to make a complete DICOM file using *pydicom*. It's not particularly difficult, but to produce a valid DICOM file requires specific items to be created. A basic example of that is available in the example file :ref:`sphx_glr_auto_examples_input_output_plot_write_dicom.py`. Just don't forget the warnings in the Introduction section above, and be sure to create all the required DICOM data elements. pydicom-pydicom-20aa4b7/doc/guides/writing_documentation.rst000066400000000000000000000076361515706620200244350ustar00rootroot00000000000000:orphan: ===================== Writing documentation ===================== Types of documentation ====================== * **Tutorials**: take a reader unfamiliar with *pydicom* through a series of steps to achieve something useful * **How-to/examples**: more advanced versions of tutorials, for readers that already have some understanding of how *pydicom* works * **Guides**: aim to explain a subject at a fairly high level * **Reference**: contain technical reference information for the *pydicom* API for a reader that has some familiarity with *pydicom* but needs to learn or be reminded about a specific part of it General style guidelines ======================== * **pydicom** - italicized lowercase: *pydicom* * **DICOM**, **DICOM Standard** - uppercase DICOM, and S on Standard * **Python** - capitalize Python * **itemize**, etc - use the American English spelling * **(7FE0,0010) Pixel Data** - use uppercase hex, no space between the comma and element number, and italicize the element name, e.g. (7FE0,0010) *Pixel Data*. When referring to an element name by itself then use italics: *Bits Allocated* * **ds**, **elem**, **seq**, **arr** - when writing examples try to use ``ds`` as the variable name for :class:`~pydicom.dataset.Dataset`, ``elem`` for :class:`~pydicom.dataelem.DataElement`, ``seq`` for sequences and ``arr`` for numpy arrays. * **them**, **they**, **their** - use gender neutral pronouns when referring to a hypothetical person * Use the double back-tick markup \``0xB4\`` when referring to: * A Python built-in value such as ``True``, ``False``, ``None`` * When referring to a value passed by a parameter: If `fragments_per_frame` is not ``1`` then... * When writing a hex value ``0xB4`` * When referring to a class, function, variable, etc and you haven't used semantic markup: ``Dataset`` when not using :class:`~pydicom.dataset.Dataset` * Use a single back-tick \`italics\` for parameter names: If `fragments_per_frame` is not... * For the API reference documentation, follow the `NumPy docstring guide `_ Guidelines for reStructuredText =============================== * In section titles, capitalize only initial words and proper nouns * Documentation should be wrapped at 80 characters unless there's a good reason not to * Because Sphinx will automatically link to the corresponding API documentation, the more semantic markup you can add, the better. So this:: :attr:`Dataset.pixel_array` returns a :class:`numpy.ndarray` which produces: ":attr:`Dataset.pixel_array ` returns a :class:`numpy.ndarray`", is better than this:: ``Dataset.pixel_array`` returns a numpy ``ndarray`` which produces: "``Dataset.pixel_array`` returns a numpy ``ndarray``" * Targets can be prefixed with **~** so that the last bit of the path gets used as the link title. So ``:class:`~pydicom.dataset.Dataset``` will show as a :class:`~pydicom.dataset.Dataset`. * Python and NumPy objects can also be referenced: ``:class:`float```, ``:class:`numpy.dtype``` * Use ``:dcm:`` to link to the CHTML version of the DICOM Standard. For example, ``:dcm:`this section``` will link to :dcm:`this section` of the Standard. The link target should be the part of the URL after ``http://dicom.nema.org/medical/dicom/current/output/chtml/`` * Use these heading styles:: === One === Two === Three ----- Four ~~~~ Five ^^^^ * Use ``.. note::`` and ``.. warning::`` and similar boxes sparingly * New features should be documented with ``.. versionadded:: X.Y`` at the top of the first section and changes to existing features with ``..versionchanged:: X.Y`` at the bottom of the first section:: .. versionchanged:: 1.4 The ``handler`` keyword argument was added pydicom-pydicom-20aa4b7/doc/index.rst000066400000000000000000000035001515706620200176320ustar00rootroot00000000000000 ===================== pydicom documentation ===================== .. toctree:: :maxdepth: 2 :hidden: :caption: Getting started tutorials/installation .. toctree:: :maxdepth: 2 :hidden: :caption: Documentation guides/user/index tutorials/index guides/index reference/index .. toctree:: :maxdepth: 2 :hidden: :caption: Examples auto_examples/index .. toctree:: :maxdepth: 1 :hidden: :caption: Additional Information tutorials/contributing faq/index release_notes/index Getting Started =============== If you're new to *pydicom* then start here: * :doc:`Installation` | :doc:`Plugins for Pixel Data` | :doc:`What Python types do I use for each VR` * **Basics**: :doc:`Dataset: read, access, modify, write` * **Intermediate**: :doc:`Waveform decoding and encoding` | :doc:`DICOM File-sets and DICOMDIR` * **Pixel Data**: :doc:`Introduction & accessing` | :doc:`Creating new Pixel Data` | :doc:`Compression and decompression` :doc:`User Guide ` ========================================== The main documentation. This contains an in-depth description of all core elements of *pydicom* and how to use them. :doc:`Examples ` ===================================== A set of examples illustrating the use of the different core elements. It complements the :doc:`User Guide `. :doc:`API Reference ` ====================================== The API Reference provides technical documentation for the *pydicom* API's functions, variables and classes. pydicom-pydicom-20aa4b7/doc/make.bat000066400000000000000000000060011515706620200173750ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation set SPHINXBUILD=sphinx-build set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\pydicom.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\pydicom.ghc goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end pydicom-pydicom-20aa4b7/doc/reference/000077500000000000000000000000001515706620200177315ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/reference/charset.rst000066400000000000000000000005071515706620200221160ustar00rootroot00000000000000.. _api_charset: Character Encoding and Decoding (:mod:`pydicom.charset`) ======================================================== .. currentmodule:: pydicom.charset Character encoding and decoding functions. .. autosummary:: :toctree: generated/ convert_encodings decode_element decode_bytes encode_string pydicom-pydicom-20aa4b7/doc/reference/config.rst000066400000000000000000000013541515706620200217330ustar00rootroot00000000000000.. _api_config: Configuration Options (:mod:`pydicom.config`) ============================================= .. currentmodule:: pydicom.config *pydicom* configuration options .. autoclass:: Settings :exclude-members: __init__ .. autosummary:: :toctree: generated/ settings allow_DS_float assume_implicit_vr_switch convert_wrong_length_to_UN data_element_callback data_element_callback_kwargs datetime_conversion debug enforce_valid_values future_behavior pixel_data_handlers reset_data_element_callback show_file_meta DS_decimal DS_numpy use_DS_decimal use_IS_numpy use_DS_numpy APPLY_J2K_CORRECTIONS INVALID_KEY_BEHAVIOR INVALID_KEYWORD_BEHAVIOR IGNORE WARN RAISE pydicom-pydicom-20aa4b7/doc/reference/data.rst000066400000000000000000000004721515706620200213770ustar00rootroot00000000000000.. _api_data: Getting Included Datasets (:mod:`pydicom.data`) =============================================== .. currentmodule:: pydicom.data Getting datasets included with *pydicom* .. autosummary:: :toctree: generated/ get_charset_files get_palette_files get_testdata_file get_testdata_files pydicom-pydicom-20aa4b7/doc/reference/datadict.rst000066400000000000000000000014421515706620200222410ustar00rootroot00000000000000.. _api_datadict: Data Dictionary Utilities (:mod:`pydicom.datadict`) =================================================== .. currentmodule:: pydicom.datadict Data dictionary functions DICOM Data Dictionary --------------------- .. autosummary:: :toctree: generated/ add_dict_entries add_dict_entry dictionary_description dictionary_has_tag dictionary_is_retired dictionary_keyword dictionary_VM dictionary_VR get_entry keyword_for_tag mask_match repeater_has_keyword repeater_has_tag tag_for_keyword Private Data Dictionary ----------------------- .. autosummary:: :toctree: generated/ add_private_dict_entries add_private_dict_entry get_private_entry private_dictionary_description private_dictionary_VM private_dictionary_VR pydicom-pydicom-20aa4b7/doc/reference/dataset.rst000066400000000000000000000005251515706620200221120ustar00rootroot00000000000000.. _api_dataset: Representation of Datasets (:mod:`pydicom.dataset`) =================================================== .. currentmodule:: pydicom.dataset Representation of DICOM datasets and related functions. .. autosummary:: :toctree: generated/ Dataset FileDataset FileMetaDataset PrivateBlock validate_file_meta pydicom-pydicom-20aa4b7/doc/reference/elem.dataelem.rst000066400000000000000000000004641515706620200231640ustar00rootroot00000000000000.. _api_elem_dataelem: Data Elements (:mod:`pydicom.dataelem`) ======================================= .. currentmodule:: pydicom.dataelem Representation of DICOM data elements .. autosummary:: :toctree: generated/ convert_raw_data_element DataElement DataElement_from_raw RawDataElement pydicom-pydicom-20aa4b7/doc/reference/elem.multival.rst000066400000000000000000000004551515706620200232450ustar00rootroot00000000000000.. _api_elem_multival: Element Multi-value Representation (:mod:`pydicom.multival`) ============================================================ .. currentmodule:: pydicom.multival Representation of the values for data elements with VM > 1. .. autosummary:: :toctree: generated/ MultiValue pydicom-pydicom-20aa4b7/doc/reference/elem.rst000066400000000000000000000003401515706620200214020ustar00rootroot00000000000000.. _api_elem: Representation of Data Elements =============================== .. toctree:: :maxdepth: 2 :includehidden: elem.dataelem elem.tag elem.values elem.multival elem.sequence elem.valuerep pydicom-pydicom-20aa4b7/doc/reference/elem.sequence.rst000066400000000000000000000004731515706620200232200ustar00rootroot00000000000000.. _api_elem_sequence: Sequence Element Value Representation (:mod:`pydicom.sequence`) =============================================================== .. currentmodule:: pydicom.sequence Representation of the value for sequence data elements and utilities. .. autosummary:: :toctree: generated/ Sequence pydicom-pydicom-20aa4b7/doc/reference/elem.tag.rst000066400000000000000000000004131515706620200221550ustar00rootroot00000000000000.. _api_elem_tag: Element Tags (:mod:`pydicom.tag`) ================================= .. currentmodule:: pydicom.tag Representation of the data element tag and utilities. .. autosummary:: :toctree: generated/ BaseTag Tag tag_in_exception TupleTag pydicom-pydicom-20aa4b7/doc/reference/elem.valuerep.rst000066400000000000000000000007131515706620200232300ustar00rootroot00000000000000.. _api_elem_valuerep: Specialized Element Value Representation (:mod:`pydicom.valuerep`) ================================================================== .. currentmodule:: pydicom.valuerep Representation of the value for data elements with VR of PN, DS, IS, DA, DT or TM and utilities. .. autosummary:: :toctree: generated/ DA is_valid_ds format_number_as_ds DS DSdecimal DSfloat DT IS ISfloat PersonName TM VR pydicom-pydicom-20aa4b7/doc/reference/elem.values.rst000066400000000000000000000011351515706620200227030ustar00rootroot00000000000000.. _api_elem_values: Element Value Decoding (:mod:`pydicom.values`) ============================================== .. currentmodule:: pydicom.values Element value decoding. .. autosummary:: :toctree: generated/ convert_AE_string convert_ATvalue convert_DA_string convert_DS_string convert_DT_string convert_IS_string convert_numbers convert_OBvalue convert_OWvalue convert_PN convert_single_string convert_SQ convert_string convert_tag convert_text convert_TM_string convert_UI convert_UN convert_UR_string convert_value multi_string pydicom-pydicom-20aa4b7/doc/reference/encaps.rst000066400000000000000000000022041515706620200217320ustar00rootroot00000000000000.. _api_encaps: Bulk Data Encapsulation Utilities (:mod:`pydicom.encaps`) ========================================================= .. module:: pydicom.encaps .. currentmodule:: pydicom.encaps Functions for parsing and applying encapsulation to bulk data elements such as (7FE0,0010) *Pixel Data*. Parsing Encapsulated Data ------------------------- .. autosummary:: :toctree: generated/ decode_data_sequence defragment_data generate_pixel_data generate_pixel_data_fragment generate_pixel_data_frame get_frame_offsets read_item parse_basic_offsets parse_fragments generate_fragments generate_fragmented_frames generate_frames get_frame Creating Encapsulated Data -------------------------- .. autosummary:: :toctree: generated/ encapsulate encapsulate_buffer encapsulate_extended encapsulate_extended_buffer fragment_frame itemize_fragment itemize_frame Management class for encapsulating buffers: .. autoclass:: EncapsulatedBuffer :exclude-members: close, detach, fileno, flush, isatty, read1, readinto, readint1, readline, readlines, truncate, writable, write, writelines pydicom-pydicom-20aa4b7/doc/reference/errors.rst000066400000000000000000000002721515706620200220000ustar00rootroot00000000000000.. _api_errors: Exceptions (:mod:`pydicom.errors`) ================================== .. currentmodule:: pydicom.errors .. autosummary:: :toctree: generated/ InvalidDicomError pydicom-pydicom-20aa4b7/doc/reference/examples.rst000066400000000000000000000065761515706620200223170ustar00rootroot00000000000000.. _api_examples: Example Datasets (:mod:`pydicom.examples`) ========================================== .. module:: pydicom.examples .. currentmodule:: pydicom.examples The ``examples`` module contains the following DICOM datasets: +-------------------+---------------------------------------+----------------------+ | Module Attribute | File | SOP Class | +===================+=======================================+======================+ | ``ct`` | ``CT_small.dcm`` | CT Image | +-------------------+---------------------------------------+----------------------+ | ``mr`` | ``MR_small.dcm`` | MR Image | +-------------------+---------------------------------------+----------------------+ | ``rt_plan`` | ``rtplan.dcm`` | RT Plan | +-------------------+---------------------------------------+----------------------+ | ``rt_dose`` | ``rtdose.dcm`` | RT Dose | +-------------------+---------------------------------------+----------------------+ | ``rt_ss`` | ``rtstruct.dcm`` | RT Structure Set | +-------------------+---------------------------------------+----------------------+ | ``overlay`` | ``examples_overlay.dcm`` | MR Image | +-------------------+---------------------------------------+----------------------+ | ``waveform`` | ``waveform_ecg.dcm`` | 12 Lead ECG | +-------------------+---------------------------------------+----------------------+ | ``rgb_color`` | ``examples_rgb_color.dcm`` | US Image | +-------------------+---------------------------------------+----------------------+ | ``palette_color`` | ``OBXXXX1A.dcm`` | US Image | +-------------------+---------------------------------------+----------------------+ | ``ybr_color`` | ``examples_ybr_color.dcm`` | US Multi-frame Image | +-------------------+---------------------------------------+----------------------+ | ``jpeg2k`` | ``examples_jpeg2k.dcm`` | US Image | +-------------------+---------------------------------------+----------------------+ | ``dicomdir`` | ``DICOMDIR`` | Media Storage | +-------------------+---------------------------------------+----------------------+ As well as the utility function: .. autosummary:: :toctree: generated/ get_path Usage ----- The module attributes are all normal :class:`~pydicom.dataset.FileDataset` instances:: >>> from pydicom import examples >>> type(examples.ct) >>> examples.ct.PatientName 'CompressedSamples^CT1' Each time the module attribute is accessed a new :class:`~pydicom.dataset.FileDataset` instance of the dataset will be returned:: >>> examples.ct is examples.ct False >>> examples.ct == examples.ct True Because of this, best practice is to assign the returned dataset to a local variable:: >>> ds = examples.ct The :func:`~pydicom.examples.get_path` function can be used to return the path to an example dataset as a :class:`pathlib.Path` instance:: >>> examples.get_path("ct") PosixPath('/home/user/pydicom/src/pydicom/data/test_files/CT_small.dcm') pydicom-pydicom-20aa4b7/doc/reference/fileio.base.rst000066400000000000000000000004231515706620200226420ustar00rootroot00000000000000.. _api_fileio_filebase: IO Base Classes (:mod:`pydicom.filebase`) ========================================= .. currentmodule:: pydicom.filebase Basic I/O support classes. .. autosummary:: :toctree: generated/ DicomBytesIO DicomFile DicomFileLike DicomIO pydicom-pydicom-20aa4b7/doc/reference/fileio.read.rst000066400000000000000000000007171515706620200226510ustar00rootroot00000000000000.. _api_fileio_filereader: Dataset Reading (:mod:`pydicom.filereader`) =========================================== .. currentmodule:: pydicom.filereader Functions for reading DICOM datasets from file-likes. .. autosummary:: :toctree: generated/ data_element_generator data_element_offset_to_value dcmread read_dataset read_deferred_data_element read_file_meta_info read_partial read_preamble read_sequence read_sequence_item pydicom-pydicom-20aa4b7/doc/reference/fileio.rst000066400000000000000000000003351515706620200217330ustar00rootroot00000000000000.. _api_fileio: Dataset IO ========== Reading and writing DICOM datasets and support classes and functions. .. toctree:: :maxdepth: 2 :includehidden: fileio.read fileio.write fileio.base fileio.util pydicom-pydicom-20aa4b7/doc/reference/fileio.util.rst000066400000000000000000000005131515706620200227050ustar00rootroot00000000000000.. _api_fileio_fileutils: IO Utilities (:mod:`pydicom.fileutil`) ====================================== .. currentmodule:: pydicom.fileutil Utilities for dataset I/O. .. autosummary:: :toctree: generated/ absorb_delimiter_item find_bytes find_delimiter length_of_undefined_length read_undefined_length_value pydicom-pydicom-20aa4b7/doc/reference/fileio.write.rst000066400000000000000000000011701515706620200230620ustar00rootroot00000000000000.. _api_fileio_filewriter: Dataset Writing (:mod:`pydicom.filewriter`) =========================================== .. currentmodule:: pydicom.filewriter Functions for writing DICOM datasets to file-likes. .. autosummary:: :toctree: generated/ correct_ambiguous_vr correct_ambiguous_vr_element dcmwrite multi_string write_ATvalue write_DA write_dataset write_data_element write_DT write_file_meta_info write_numbers write_number_string write_OBvalue write_OWvalue write_PN write_sequence write_sequence_item write_string write_text write_TM write_UI write_UN pydicom-pydicom-20aa4b7/doc/reference/fileset.rst000066400000000000000000000005051515706620200221160ustar00rootroot00000000000000.. _api_fileset: DICOM File-sets (:mod:`pydicom.fileset`) ======================================== .. currentmodule:: pydicom.fileset Representation of DICOM File-sets. .. autosummary:: :toctree: generated/ RecordNode FileInstance FileSet generate_filename is_conformant_file_id DIRECTORY_RECORDERS pydicom-pydicom-20aa4b7/doc/reference/handlers.pixel_data.rst000066400000000000000000000010611515706620200243720ustar00rootroot00000000000000.. _api_handlers_pixeldata: Pixel Data Handlers (:mod:`pydicom.pixel_data_handlers`) ======================================================== .. deprecated:: 3.0 The ``pydicom.pixel_data_handlers`` module is deprecated and will be removed in v4.0. Use the :mod:`~pydicom.pixels` module instead. .. currentmodule:: pydicom.pixel_data_handlers .. autosummary:: :toctree: generated/ gdcm_handler jpeg_ls_handler numpy_handler pillow_handler pylibjpeg_handler rle_handler .. automodule:: pydicom.pixel_data_handlers :members: pydicom-pydicom-20aa4b7/doc/reference/handlers.rst000066400000000000000000000005611515706620200222650ustar00rootroot00000000000000.. _api_handlers: Bulk Data Handlers ================== .. deprecated:: 3.0 The ``pydicom.pixel_data_handlers`` module is deprecated and will be removed in v4.0. Use the :mod:`~pydicom.pixels` module instead. Functions for handling bulk data elements such as (7FE0,0010) *Pixel Data* .. toctree:: :maxdepth: 1 :includehidden: handlers.pixel_data pydicom-pydicom-20aa4b7/doc/reference/hooks.rst000066400000000000000000000006761515706620200216170ustar00rootroot00000000000000.. _api_hooks: User Hooks (:mod:`pydicom.hooks`) ================================= .. module:: pydicom.hooks .. currentmodule:: pydicom.hooks Hooks manager class and instance .. autosummary:: :toctree: generated/ hooks Hooks Hooks for :func:`~pydicom.dataelem.convert_raw_data_element` .. autosummary:: :toctree: generated/ raw_element_vr raw_element_value raw_element_value_fix_separator raw_element_value_retry pydicom-pydicom-20aa4b7/doc/reference/index.rst000066400000000000000000000006651515706620200216010ustar00rootroot00000000000000.. _api_reference: API Reference ============= :Release: |version| :Date: |today| .. module:: pydicom This API reference guide details the functions, modules and objects included in *pydicom*. .. toctree:: :maxdepth: 2 :includehidden: charset config data datadict dataset elem examples encaps errors fileio fileset handlers hooks misc overlays pixels sr waveforms uid pydicom-pydicom-20aa4b7/doc/reference/misc.rst000066400000000000000000000003321515706620200214140ustar00rootroot00000000000000.. _api_misc: Miscellaneous (:mod:`pydicom.misc`) =================================== .. currentmodule:: pydicom.misc Miscellaneous functions. .. autosummary:: :toctree: generated/ is_dicom size_in_bytes pydicom-pydicom-20aa4b7/doc/reference/overlays.rst000066400000000000000000000004201515706620200223230ustar00rootroot00000000000000.. _api_handlers_overlaydata: Overlay Data Handling (:mod:`pydicom.overlays`) =============================================== .. currentmodule:: pydicom.overlays .. autosummary:: :toctree: generated/ numpy_handler .. automodule:: pydicom.overlays :members: pydicom-pydicom-20aa4b7/doc/reference/pixels.decoders.rst000066400000000000000000000020221515706620200235520ustar00rootroot00000000000000.. _api_decoders: Pixel Data Decoders (:mod:`pydicom.pixels.decoders`) ==================================================== .. module:: pydicom.pixels.decoders :class:`~pydicom.pixels.decoders.base.Decoder` class instances for decoding native and compressed (7FE0,0010) *Pixel Data*, (7FE0,0008) *Float Pixel Data* and (7FE0,0009) *Double Float Pixel Data*. .. currentmodule:: pydicom.pixels.decoders .. autosummary:: :toctree: generated/ ExplicitVRLittleEndianDecoder ImplicitVRLittleEndianDecoder DeflatedExplicitVRLittleEndianDecoder ExplicitVRBigEndianDecoder JPEGBaseline8BitDecoder JPEGExtended12BitDecoder JPEGLosslessDecoder JPEGLosslessSV1Decoder JPEGLSLosslessDecoder JPEGLSNearLosslessDecoder JPEG2000LosslessDecoder JPEG2000Decoder HTJ2KLosslessDecoder HTJ2KLosslessRPCLDecoder HTJ2KDecoder RLELosslessDecoder Base decoder classes used by all decoders .. currentmodule:: pydicom.pixels.decoders.base .. autosummary:: :toctree: generated/ DecodeRunner Decoder pydicom-pydicom-20aa4b7/doc/reference/pixels.encoders.rst000066400000000000000000000012001515706620200235610ustar00rootroot00000000000000.. _api_encoders: Pixel Data Encoders (:mod:`pydicom.pixels.encoders`) ==================================================== .. module:: pydicom.pixels.encoders :class:`~pydicom.pixels.encoders.base.Encoder` class instances for compressing (7FE0,0010) *Pixel Data*. .. currentmodule:: pydicom.pixels.encoders .. autosummary:: :toctree: generated/ JPEGLSLosslessEncoder JPEGLSNearLosslessEncoder JPEG2000LosslessEncoder JPEG2000Encoder RLELosslessEncoder Base encoder classes used by all encoders .. currentmodule:: pydicom.pixels.encoders.base .. autosummary:: :toctree: generated/ Encoder EncodeRunner pydicom-pydicom-20aa4b7/doc/reference/pixels.processing.rst000066400000000000000000000010151515706620200241370ustar00rootroot00000000000000.. _api_pixel_processing: Pixel Data Processing (:mod:`pydicom.pixels.processing`) ======================================================== Functions for applying image processing to pixel data. .. module:: pydicom.pixels.processing .. currentmodule:: pydicom.pixels.processing .. autosummary:: :toctree: generated/ apply_color_lut apply_icc_profile apply_modality_lut apply_presentation_lut apply_rescale apply_voi_lut apply_voi apply_windowing convert_color_space create_icc_transform pydicom-pydicom-20aa4b7/doc/reference/pixels.rst000066400000000000000000000014231515706620200217670ustar00rootroot00000000000000.. _api_pixels: Pixel Data (:mod:`pydicom.pixels`) ================================== .. module:: pydicom.pixels .. currentmodule:: pydicom.pixels Image processing functions .. autosummary:: :toctree: generated/ apply_color_lut apply_icc_profile apply_modality_lut apply_presentation_lut apply_rescale apply_voi_lut apply_voi apply_windowing convert_color_space create_icc_transform Utility functions .. autosummary:: :toctree: generated/ as_pixel_options compress decompress get_decoder get_encoder iter_pixels pack_bits pixel_array set_pixel_data unpack_bits Sub-modules ----------- .. toctree:: :maxdepth: 1 :includehidden: pixels.decoders pixels.encoders pixels.processing pixels.utils pydicom-pydicom-20aa4b7/doc/reference/pixels.utils.rst000066400000000000000000000010361515706620200231260ustar00rootroot00000000000000.. _api_pixel_utils: Pixel Data Utilities (:mod:`pydicom.pixels.utils`) ================================================== .. module:: pydicom.pixels.utils .. currentmodule:: pydicom.pixels.utils Pixel data related utility functions. .. autosummary:: :toctree: generated/ as_pixel_options compress decompress expand_ybr422 get_expected_length get_image_pixel_ids get_j2k_parameters get_nr_frames iter_pixels pack_bits pixel_array pixel_dtype reshape_pixel_array set_pixel_data unpack_bits pydicom-pydicom-20aa4b7/doc/reference/sr.rst000066400000000000000000000016241515706620200211120ustar00rootroot00000000000000 Concepts and Context Groups (:mod:`pydicom.sr`) =============================================== .. module:: pydicom.sr .. currentmodule:: pydicom.sr The ``sr`` module contains an interface for DICOM's :dcm:`CIDs`. .. autosummary:: :toctree: generated/ Collection Concepts Code Usage ----- Individual :class:`~pydicom.sr.coding.Code` values can be accessed via either their scheme (such as SCT) or the DICOM CID:: >>> from pydicom.sr import codes >>> codes.SCT.Transverse Code(value='62824007', scheme_designator='SCT', meaning='Transverse', scheme_version=None) >>> codes.CID4.Cornea Code(value='28726007', scheme_designator='SCT', meaning='Cornea', scheme_version=None) A list of available attribute keywords for each scheme or CID is available via :meth:`~pydicom.sr.Collection.dir`:: >>> dir(codes.CID6) ['Coronal', 'FiveChamber', 'FourChamber', ... ] pydicom-pydicom-20aa4b7/doc/reference/uid.rst000066400000000000000000000201641515706620200212470ustar00rootroot00000000000000.. _api_uid: UID Definitions and Utilities (:mod:`pydicom.uid`) ================================================== .. module:: pydicom.uid .. currentmodule:: pydicom.uid Transfer Syntax UIDs -------------------- .. autosummary:: :toctree: generated/ ImplicitVRLittleEndian ExplicitVRLittleEndian DeflatedExplicitVRLittleEndian ExplicitVRBigEndian JPEGBaseline8Bit JPEGExtended12Bit JPEGLossless JPEGLosslessSV1 JPEGLSLossless JPEGLSNearLossless JPEG2000Lossless JPEG2000 JPEG2000MCLossless JPEG2000MC MPEG2MPML MPEG2MPMLF MPEG2MPHL MPEG2MPHLF MPEG4HP41 MPEG4HP41F MPEG4HP41BD MPEG4HP41BDF MPEG4HP422D MPEG4HP422DF MPEG4HP423D MPEG4HP423DF MPEG4HP42STEREO MPEG4HP42STEREOF HEVCMP51 HEVCM10P51 RLELossless HTJ2KLossless HTJ2KLosslessRPCL HTJ2K JPIPHTJ2KReferenced JPIPHTJ2KReferencedDeflate SMPTEST211020UncompressedProgressiveActiveVideo SMPTEST211020UncompressedInterlacedActiveVideo SMPTEST211030PCMDigitalAudio Transfer Syntax Lists --------------------- .. autosummary:: :toctree: generated/ AllTransferSyntaxes JPEGTransferSyntaxes JPEGLSTransferSyntaxes JPEG2000TransferSyntaxes MPEGTransferSyntaxes RLETransferSyntaxes UncompressedTransferSyntaxes PrivateTransferSyntaxes UID Utilities ------------- .. autosummary:: :toctree: generated/ generate_uid register_transfer_syntax PYDICOM_ROOT_UID PYDICOM_IMPLEMENTATION_UID RE_VALID_UID RE_VALID_UID_PREFIX UID Storage SOP Class UIDs ---------------------- .. autosummary:: :toctree: generated/ AcquisitionContextSRStorage AdvancedBlendingPresentationStateStorage AmbulatoryECGWaveformStorage ArterialPulseWaveformStorage AutorefractionMeasurementsStorage BasicStructuredDisplayStorage BasicTextSRStorage BasicVoiceAudioWaveformStorage BlendingSoftcopyPresentationStateStorage BodyPositionWaveformStorage BreastProjectionXRayImageStorageForPresentation BreastProjectionXRayImageStorageForProcessing BreastTomosynthesisImageStorage CArmPhotonElectronRadiationRecordStorage CArmPhotonElectronRadiationStorage CTDefinedProcedureProtocolStorage CTImageStorage CTPerformedProcedureProtocolStorage CardiacElectrophysiologyWaveformStorage ChestCADSRStorage ColonCADSRStorage ColorPaletteStorage ColorSoftcopyPresentationStateStorage CompositingPlanarMPRVolumetricPresentationStateStorage Comprehensive3DSRStorage ComprehensiveSRStorage ComputedRadiographyImageStorage ConfocalMicroscopyImageStorage ConfocalMicroscopyTiledPyramidalImageStorage ContentAssessmentResultsStorage CornealTopographyMapStorage DICOS2DAITStorage DICOS3DAITStorage DICOSCTImageStorage DICOSDigitalXRayImageStorageForPresentation DICOSDigitalXRayImageStorageForProcessing DICOSQuadrupoleResonanceStorage DICOSThreatDetectionReportStorage DeformableSpatialRegistrationStorage DermoscopicPhotographyImageStorage DigitalIntraOralXRayImageStorageForPresentation DigitalIntraOralXRayImageStorageForProcessing DigitalMammographyXRayImageStorageForPresentation DigitalMammographyXRayImageStorageForProcessing DigitalXRayImageStorageForPresentation DigitalXRayImageStorageForProcessing EddyCurrentImageStorage EddyCurrentMultiFrameImageStorage ElectromyogramWaveformStorage ElectrooculogramWaveformStorage EncapsulatedCDAStorage EncapsulatedMTLStorage EncapsulatedOBJStorage EncapsulatedPDFStorage EncapsulatedSTLStorage EnhancedCTImageStorage EnhancedContinuousRTImageStorage EnhancedMRColorImageStorage EnhancedMRImageStorage EnhancedPETImageStorage EnhancedRTImageStorage EnhancedSRStorage EnhancedUSVolumeStorage EnhancedXAImageStorage EnhancedXRFImageStorage EnhancedXRayRadiationDoseSRStorage ExtensibleSRStorage General32bitECGWaveformStorage GeneralAudioWaveformStorage GeneralECGWaveformStorage GenericImplantTemplateStorage GrayscalePlanarMPRVolumetricPresentationStateStorage GrayscaleSoftcopyPresentationStateStorage HangingProtocolStorage HemodynamicWaveformStorage ImplantAssemblyTemplateStorage ImplantTemplateGroupStorage ImplantationPlanSRStorage IntraocularLensCalculationsStorage IntravascularOpticalCoherenceTomographyImageStorageForPresentation IntravascularOpticalCoherenceTomographyImageStorageForProcessing InventoryStorage KeratometryMeasurementsStorage KeyObjectSelectionDocumentStorage LegacyConvertedEnhancedCTImageStorage LegacyConvertedEnhancedMRImageStorage LegacyConvertedEnhancedPETImageStorage LensometryMeasurementsStorage MRImageStorage MRSpectroscopyStorage MacularGridThicknessAndVolumeReportStorage MammographyCADSRStorage MediaStorageDirectoryStorage MicroscopyBulkSimpleAnnotationsStorage MultiFrameGrayscaleByteSecondaryCaptureImageStorage MultiFrameGrayscaleWordSecondaryCaptureImageStorage MultiFrameSingleBitSecondaryCaptureImageStorage MultiFrameTrueColorSecondaryCaptureImageStorage MultichannelRespiratoryWaveformStorage MultipleVolumeRenderingVolumetricPresentationStateStorage NuclearMedicineImageStorage OphthalmicAxialMeasurementsStorage OphthalmicOpticalCoherenceTomographyBscanVolumeAnalysisStorage OphthalmicOpticalCoherenceTomographyEnFaceImageStorage OphthalmicPhotography16BitImageStorage OphthalmicPhotography8BitImageStorage OphthalmicThicknessMapStorage OphthalmicTomographyImageStorage OphthalmicVisualFieldStaticPerimetryMeasurementsStorage ParametricMapStorage PatientRadiationDoseSRStorage PerformedImagingAgentAdministrationSRStorage PhotoacousticImageStorage PlannedImagingAgentAdministrationSRStorage PositronEmissionTomographyImageStorage ProcedureLogStorage ProtocolApprovalStorage PseudoColorSoftcopyPresentationStateStorage RTBeamsDeliveryInstructionStorage RTBeamsTreatmentRecordStorage RTBrachyApplicationSetupDeliveryInstructionStorage RTBrachyTreatmentRecordStorage RTDoseStorage RTImageStorage RTIonBeamsTreatmentRecordStorage RTIonPlanStorage RTPatientPositionAcquisitionInstructionStorage RTPhysicianIntentStorage RTPlanStorage RTRadiationRecordSetStorage RTRadiationSalvageRecordStorage RTRadiationSetDeliveryInstructionStorage RTRadiationSetStorage RTSegmentAnnotationStorage RTStructureSetStorage RTTreatmentPreparationStorage RTTreatmentSummaryRecordStorage RadiopharmaceuticalRadiationDoseSRStorage RawDataStorage RealWorldValueMappingStorage RespiratoryWaveformStorage RoboticArmRadiationStorage RoboticRadiationRecordStorage RoutineScalpElectroencephalogramWaveformStorage SecondaryCaptureImageStorage SegmentationStorage SegmentedVolumeRenderingVolumetricPresentationStateStorage SimplifiedAdultEchoSRStorage SleepElectroencephalogramWaveformStorage SpatialFiducialsStorage SpatialRegistrationStorage SpectaclePrescriptionReportStorage StereometricRelationshipStorage SubjectiveRefractionMeasurementsStorage SurfaceScanMeshStorage SurfaceScanPointCloudStorage SurfaceSegmentationStorage TomotherapeuticRadiationRecordStorage TomotherapeuticRadiationStorage TractographyResultsStorage TwelveLeadECGWaveformStorage UltrasoundImageStorage UltrasoundMultiFrameImageStorage VLEndoscopicImageStorage VLMicroscopicImageStorage VLPhotographicImageStorage VLSlideCoordinatesMicroscopicImageStorage VLWholeSlideMicroscopyImageStorage VariableModalityLUTSoftcopyPresentationStateStorage VideoEndoscopicImageStorage VideoMicroscopicImageStorage VideoPhotographicImageStorage VisualAcuityMeasurementsStorage VolumeRenderingVolumetricPresentationStateStorage WaveformAnnotationSRStorage WideFieldOphthalmicPhotography3DCoordinatesImageStorage WideFieldOphthalmicPhotographyStereographicProjectionImageStorage XADefinedProcedureProtocolStorage XAPerformedProcedureProtocolStorage XAXRFGrayscaleSoftcopyPresentationStateStorage XRay3DAngiographicImageStorage XRay3DCraniofacialImageStorage XRayAngiographicImageStorage XRayRadiationDoseSRStorage XRayRadiofluoroscopicImageStorage pydicom-pydicom-20aa4b7/doc/reference/waveforms.rst000066400000000000000000000004241515706620200224740ustar00rootroot00000000000000.. _api_handlers_waveforms: Waveform Data Handlers (:mod:`pydicom.waveforms`) ================================================= .. currentmodule:: pydicom.waveforms .. autosummary:: :toctree: generated/ numpy_handler .. automodule:: pydicom.waveforms :members: pydicom-pydicom-20aa4b7/doc/release_notes/000077500000000000000000000000001515706620200206235ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/release_notes/index.rst000066400000000000000000000011231515706620200224610ustar00rootroot00000000000000============= Release notes ============= .. include:: v3.0.2.rst .. include:: v3.0.1.rst .. include:: v3.0.0.rst .. include:: v2.4.0.rst .. include:: v2.3.0.rst .. include:: v2.2.0.rst .. include:: v2.1.1.rst .. include:: v2.1.0.rst .. include:: v2.0.0.rst .. include:: v1.4.1.rst .. include:: v1.4.0.rst .. include:: v1.3.0.rst .. include:: v1.2.0.rst .. include:: v1.1.0.rst .. include:: v1.0.0.rst .. include:: v0.9.9.rst .. include:: v0.9.8.rst .. include:: v0.9.7.rst .. include:: v0.9.6.rst .. include:: v0.9.5.rst .. include:: v0.9.4.rst .. include:: v0.9.3.rst .. include:: v0.9.2.rst pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.2.rst000066400000000000000000000036221515706620200222140ustar00rootroot00000000000000Version 0.9.2 ============= Major changes ------------- * Renamed Attribute class and related modules to !DataElement. Old code will continue to work until pydicom 1.0, but with a !DeprecationWarning (issue22, r72, r73) * Added support for character sets through Specific Character Set (0008,0005), using Python unicode. Thus foreign languages can display names in Greek, Japanese, Chinese etc characters in environments which support unicode (demonstrated in dicomtree.py example using Tkinter GUI) (r64, r65) Other Enhancements ------------------ * Added support for auto-completion of dataset elements in ipython; also all environments using Python 2.6 (r69, r70) * Added __iter__() to Dataset so returns data elements in DICOM order with "for data_elem in dataset:" (r68) * Added dicomtree.py example program showing a DICOM file in a GUI window (Tkinter/Tix). * Added !PersonName class to parse components of names more easily (r55) * Added UID class to handle UID values. Name rather than UID number shown, UID_dictionary used (r51). * Code tested under Python 2.6 * Added !DataElement.name property; synonym for !DataElement.description() function Bug Fixes --------- * Fixed issue27, sequence with a single empty item read incorrectly * Fixed bug that read_OW did not handle !UndefinedLength (r50) * Fixed bugs in example files anonymize.py, !DicomInfo.py, and dicomtree.py (r51) * Fixed issue33, VR=UN being split on backslash (r70) * Fixed issue18, util directory not installed (r45) Other ----- * Added example file myprint.py -- shows how to custom format DICOM file information (r67) * Reorganized test files and added various new tests * added preliminary work on encapsulated data (r50) * added some simple files to view or work with pixel data (r46) * Dataset.!PixelDataArray() NumPy array changed to property Dataset.!PixelArray * changed to setuptools for packaging rather than distutils pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.3.rst000066400000000000000000000031041515706620200222100ustar00rootroot00000000000000Version 0.9.3 ============= Major changes ------------- * changed to MIT-style license * option to defer reading of large data element values using read_file()'s new defer_size argument (r102, r103) * dictionary of private tags added -- descriptive text shown when available (issue36, r97, r110) * more conversion to PEP-8 style. Should now use read_file(), save_as(), pixel_array rather than !ReadFile(), !SaveAs(), !PixelArray. Old names kept for now as aliases. Other Enhancements ------------------ * added DicomFileLike class to simplify and generalize access. Any object that has read, write, seek, tell, and close can now be used. (r105) * added dataset.iterall() function to iterate through all items (including inside sequences) (r105) * added dataset.formatted_lines() generator to allow custom formatting (r91, r113) * made reading tolerant of truncated files -- gives a warning, but returns dataset read to that point (r95) Bug Fixes --------- * fixed issue38, name collision for 'Other Patient Ids' as both data element and sequence name in DICOM standard (r95, r96) * fixed issue40, blank VRs in some DICOM dictionary entries caused NotImplementError on reading (r100) * fixed issue41, reading VRs of 'US or SS' and similar split on backslash character (r104) * fixed bug where TransferSyntaxUID not present when reading file without DICOM header (r109) * fixed print recursion bug when printing a UID (r111) Other ----- * many of the example files updated * updated anonymize example file to also deal with 'OtherPatientIDs' and 'PatientsBirthDate' (r98) pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.4.rst000066400000000000000000000060471515706620200222220ustar00rootroot00000000000000Version 0.9.4 ============= .. note:: * there is a *backwards incompatible* change made to storage of file_meta info. See item below. * pydicom 0.9.4 requires Python 2.4 or higher (pydicom 0.9.3 can run under Python 2.3) Major changes/additions in this version --------------------------------------- * file reading code reorganized substantially * significant speed increase for reading DICOM files -- approx 3 times faster than 0.9.3 * partial file reading available -- in particular, new optional argument to read_file(), stop_before_pixels, will stop before getting to the pixel data, not reading those into memory. Saves a little time for small images, but could be quite helpful for very large images when the pixel data is not needed. * read_file() now returns a !FileDataset object, instead of a plain Dataset. Most user code will not see much difference (except see next bullet on file meta information) but now the information stored in the object has been made explicit -- e.g. the endian-ness and whether the file syntax was explicit VR or implicit VR. * file meta info has been separated from the main dataset. Logically, this makes more sense, as the file meta is not really part of the dataset, but is specific to the method of storage. This is a backwards-incompatible change, but is easily fixed by changing any references to file-meta data elements from {{{dataset.}}} to {{{dataset.file_meta.}}}. The file_meta is a dataset like any other, all the usual methods for viewing, changing data elements work on it also. * private dictionaries file now generated from the GDCM library's private dictionary -- code to convert formats contributed by Daniel Nanz. * license has returned to an MIT-based license (with the compatible GDCM also noted for the private dictionary component). * contributed files with example code for viewing using wxPython or Tkinter (and PIL) -- in dicom.contrib folder. Thanks to Dave Witten, Daniel Nanz and Adit Panchal for these contributions. * updates to pydicom's DICOM data dictionary contributed by Adit Panchal: CP805/916; Supp 43 and 117 (and UID dict), Supp 119 and 122 Other changes and bug fixes --------------------------- * Tag is now a factory function; the class is called !BaseTag. This was part of the file reading speed-up process -- a new class !TupleTag was also created, for faster file reading * passing a file object to read_file() now works correctly, and also the file closing works as it should (caller needs to close any files passed in) (issue 73) * Fix for issue 72 : dataset.get() fails when passed type other than string or Tag. Patch contributed by !NikitaTheSpider * Fix for issue 58 : error opening file with unicode. Fix contributed by Pierre Raybaut * Fix for issue 42 : catch !AttributeError in property and give proper error message * Fix for issue 55 : UI type changed with string operations * Tag fixes and enhancements : can create tags with hex string (group, elem). Allow lists as well as tuples (issue 47). Fix arg2=0 bug (issue 64). pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.5.rst000066400000000000000000000024231515706620200222150ustar00rootroot00000000000000Version 0.9.5 ============= pydicom 0.9.5 is primarily a bug-fix release but includes some contrib files also. Major fixes in this release --------------------------- * fix for incorrect pixel integer types which could lead to numeric errors (issue 79) * By default an InvalidDicomError will be raised when trying to read a non-DICOM file (unless read_file keyword arg {{{force}}} is True) (revision fc790f01f5) * fix recursion error on private data elements (issue 81, issue 84) Other fixes in this release --------------------------- * Fix for unicode decode failing with VM > 1 (issue 78) * fix for fail of DicomIter on files with Explicit VR Transfer Syntax UID (issue 82) * Fix for Python 2.5 and 'with' statement (revision 1c32791bf0) * Handle 'OB/OW' VR as well as 'OW/OB' (revision e3ee934bbc) * Fix dataset.get(tag) so returns same as dataset[tag] (issue 88) New 'Contrib' files ------------------- * dicom_dao.py by Mike Wallace -- CouchDB storage of DICOM info and binary data * pydicom_series.py by Almar Klein -- Reads files and separates into distinct series. Other ----- * switch to Distribute for packaging * preliminary work on Python 3 compatibility * preliminary work on using sphinx for documentation * preliminary work on better writing of files from scratch pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.6.rst000066400000000000000000000012571515706620200222220ustar00rootroot00000000000000Version 0.9.6 ============= pydicom 0.9.6 updates the dictionary to the DICOM 2011 standard, and has a number of bug fixes Major changes ------------- * updated the dictionary to the DICOM 2011 standard's dictionary. Bug fixes --------- * Fixed bug in Dataset.file_metadata() and deprecated in favor of FileDataset (issue 93) * Fixed UID comparisons against non-string values (issue 96) * catch exceptions on reading undefined length private data elements (issue 91, issue 97) * Fixed bug in raising exception for unknown tag Other ----- * added example file write_new.py to show how to create DICOM files from scratch * updated other example files * more PEP-8 style changes pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.7.rst000066400000000000000000000047051515706620200222240ustar00rootroot00000000000000Version 0.9.7 ============= pydicom 0.9.7 resolves some remaining bugs before moving to Python 3 compatibility. ** It is the last version which will run with Python < 2.6 ** (it will run with Python 2.4 to Python 2.7) Major changes ------------- * Added DICOM 2011 keywords. Old "named tags" still work, but will be deprecated in future versions. Most names are identical, but some have changed. For example: * SamplesperPixel becomes SamplesPerPixel (capital 'P' on 'Per') * Beams becomes BeamSequence (and similar for all sequences) * Decimal and integer strings handled much better (revisions 4ed698a7bfbe and c313d2befb08). * New classes for VR of types DS and IS (DS is derived from Python Decimal) * New MultiValue class, enforcing all values of same type * New config.py file with user-definable parameters: * allow_DS_float (default False) for controlling whether float values can be used to construct DS or IS strings. * enforce_valid_values (default True) for ensuring IS, DS meet DICOM standard limits To change these, use 'import dicom.config, then dicom.config.={True|False}' before setting values of data elements Users are encouraged to switch to the official DICOM keywords, as these are now part of the standard, and promote consistency across programming languages and libraries. Bug fixes --------- * New way to read file meta information, not using the group length, instead reading until end of group 2 data elements. If group length dose not match, log a warning (revision b6b3658f3b14). * Fix bug in copying raw private data elements (issue 98) * Force logging level to warning on 'import dicom' (issue 102) * Deferred read fixed to work with gzipped files (issue 103) * Setting individual items in a DS or IS list now saves to file correctly * Japanese and Korean encoding fixes (issue 110) Other Enhancements ------------------ * New Sequence class which verifies items are Datasets (issue 52) * Assignment to SQ data element checks value is a Sequence or can be converted to one (issue 111) * dir(ds) now includes methods and properties as well as DICOM named tags. Work only on Python >= 2.6 as previous versions do not call __dir__ method (issue 95) * Added much more debugging info and simplified reading of data elements (revision b6b3658f3b14) * updated example files to DICOM 2011 keywords; fixed bugs Many of the bug fixes/enhancements were submitted by users. Many thanks to those who contributed. pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.8.rst000066400000000000000000000032631515706620200222230ustar00rootroot00000000000000Version 0.9.8 ============= pydicom 0.9.8 is mainly a consolidation step before moving to official Python 3 compatibility in pydicom 1.0. It also reverts the change to using Decimal for VR of DS (in pydicom 0.9.7), due to performance issues. DS as Decimal is still available, but is off by default. Major changes ------------- * Requires Python 2.6 or later, in preparation for Python 3 compatibility * experimental Python 3 compatibility (unofficial at this point) -- uncomment the two indicated lines in setup.py to use it. Please provide feedback to the issues list. * DS values reverted to using float as default (issue 114) due to slow performance using Python Decimal. Speed tests show approx factor of 10 improvement compared with pydicom 0.9.7 (several revisions up to r78ba350a3eb8) * streamlined much code internally taking advantage of modern Python constructs: decorators, generators, etc Bug fixes --------- * Fix for duplicate logger from Gunnar Schaefer. Fixes issue 107 (revision 774b7a55db33) * Fix rewind behavior in find_bytes (issue 60, revision 6b949a5b925b) * Fix error in nested private sequences (issue 113, revision 84af4b240add) Enhancements ------------ * UID generator added (Félix C. Morency) (revisions 0197b5846bb5 and 3678b1be6aca, tests in f1ae573d9de5, 0411bab7c985) * new PersonName3 class for Python 3: (revision 9b92b336e7d4) Contrib file changes -------------------- * Fix for pydicom_series for DS decimal (revision e830f30b6781) * new dcm_qt_tree.py module - tree display of DICOM files using PySide and Qt. Contributed by Padraig Looney. Special acknowledgement to Jonathan Suever who contributed most of the Python 3 work and many bug fixes. pydicom-pydicom-20aa4b7/doc/release_notes/v0.9.9.rst000066400000000000000000000023301515706620200222160ustar00rootroot00000000000000Version 0.9.9 ============= In addition to bug fixes, pydicom 0.9.9 contains updates for all DICOM dictionaries. New features include DICOMDIR handling, and a utility module which produces python/pydicom source code to recreate a DICOM file. Enhancements ------------ * All DICOM dictionaries updated (standard dictionary, UID dictionary, and private dictionaries) * Dicom commands also added to dictionary * Ability to work with DICOMDIR: ``read_dicomdir()`` function and ``DicomDir`` class. Example file ``show_dicomdir.py`` file added to examples subdirectory. * ``codify.py``: Produce python/pydicom source code from a DICOM file. * a number of Python 3 compatibility enhancements * setup.py uses ez_setup only if setuptools not already installed * exceptions carry tag info with them, to aid in debugging Contrib file changes -------------------- * pydicom_series: force parameter added (Nil Goyette) * dcm_qt_tree: switch to OrderedDict to preserve ordering of tags (Padraig Looney) Other Contributors ------------------ Other than Jonathan and myself, other contributors were: Rickard Holmberg, Julien Lamy, Yaroslav Halchenko, Mark White, Matthew Brett, Dimitri Papadopoulos, videan42 ...(sorry if I've missed anyone). pydicom-pydicom-20aa4b7/doc/release_notes/v1.0.0.rst000066400000000000000000000065431515706620200222070ustar00rootroot00000000000000 Version 1.0.0 ============= This is a major release, with major changes, including backwards-incompatible changes. Major changes ------------- * full Python 3 compatibility - one code base for both Python 2 and Python 3 * package name and import name now match -- use ``import pydicom`` rather than ``import dicom``. * added handlers for converting (7fe0,0010) *Pixel Data* to a `numpy.ndarray` * optional GDCM support for reading files with compressed pixel data (:issue:`18`) * optional Pillow and jpeg_ls support for reading some compressed pixel data files * support for decompressing a compressed dataset in-place * DICOM dictionary updated to 2017c * cleaned up DICOM dictionary code, old non-DICOM-keyword code removed Other enhancements ------------------ * added ``util/fixer.py`` callbacks available to fix non DICOM-compliant values before exceptions thrown * added context management methods to ``Dataset`` * added ``misc.is_dicom()`` function to check for DICOM file format * added date/time converters (:issue:`143`) * added option to attempt other VRs if translate fails (:issue:`197`) * added heuristics to read files that have no preamble or file meta information * support for multi-valued DA, DT, TM data elements (:issue:`212`) * ``DataElement``: added ``keyword`` and ``is_retired`` properties * ``datadict``: added ``dictionary_is_retired()`` * ``datadict``: added ability to add custom DICOM dictionary items via ``add_dict_entry()`` and ``add_dict_entries()`` * added some support for pickle * added support for VRs ``OD``, ``OL`` and ``UC`` * added support for Thai, Japanese and Chinese encodings (#346, #353) * added support for slicing to Dataset * add/update TransferSyntaxUID when writing standard * renamed ``UID`` package to ``uid`` (conforms to Python standard) * added property ``uid.is_private`` * added definitions for storage SOP Class UIDs (:issue:`172`) * added possibility to read only specific tags (:issue:`95`) * added missing meta elements when writing DICOM file * added ``encaps`` generator functions to access compressed frames * ``read_file`` changed to ``dcmread``, ``write_file`` to ``dcmwrite`` for greater clarity. Previous names still available for backwards compatibility. Infrastructure -------------- * added `TravisCI `_ and `AppVeyor `_ builds for automatic tests under Linux and Windows * added automatic `code coverage builds `_ and PEP-8 checks * added automatic `documentation builds `_ on GitHub Pages for `development `_ and `release `_ builds * added PyPy support * removed support for Python 2.6, added support for Python 3.6 Fixes ----- * correctly handle PlanarConfiguration==0 (:issue:`151`) * updated uid generation to ensure uniqueness (:issue:`125`) * handle missing patient data in ``show_dicomdir`` * assume default transfer syntax if none in file meta (:issue:`258`) * fixed reading/writing of empty tags and tags with bad VR * fixed reading AE elements with leading or trailing spaces * fixed handling of ambiguous VR elements * fixed handling for several error conditions * fixed Latin5 (Turkish) character set handling * a lot of other small fixes... pydicom-pydicom-20aa4b7/doc/release_notes/v1.1.0.rst000066400000000000000000000037461515706620200222120ustar00rootroot00000000000000Version 1.1.0 ================================= Enhancements ------------ * ``UID.__str__`` no longer returns the UID name (when known). The UID name is still available using the ``UID.name`` property. * ``Dataset`` equality now only compares the dataset's ``DataElements`` (:issue:`464`) * the ``codify`` script now supports VRs OD and OL, and works in Python 3 (:issue:`498`); documentation has been added for ``codify`` * the performance for reading and writing datasets has been improved to be better than in pydicom 0.9.9 (:issue:`605`, :issue:`512`) * added support for bit-packed pixel data (:issue:`292`) * updated DICOM dictionary for 2018b edition * added full API documentation to pydicom documentation (:issue:`649`) Fixes ----- * ``UID`` should behave as expected for a python ``str`` subclass (:issue:`256`) * group length elements in groups above 0x0006 removed on writing (:issue:`32`) * fixed ``write_PN`` raising a ``TypeError`` when called with a non-iterable encoding parameter (:issue:`489`) * fixed padding for some odd-sized image data (:issue:`599`) * removed unneeded warning for incorrect date string length (:issue:`597`) * fixed ``Dataset`` not slicing correctly when an (0xFFFF,0xFFFF) element is present (:issue:`92`) * use correct VR for unknown private tags and private creators (:issue:`620`) * fixed crash on reading RGB data with implicit VR (:issue:`620`) * parent encoding was not used in sequences without own encoding (:issue:`625`) * fixed error handling for values too large to fit in VR IS (:issue:`640`) Other ----- * A deprecation warning has been added for UID.__eq__ and UID.__ne__ when comparing ``UID == [UID name]`` and ``UID != [UID name]``. Starting in v1.2, ``UID`` equality and inequality comparisons will return ``False`` when performing the equivalent of ``UID == [UID name]`` and ``UID != [UID name]``, respectively. E.g. UID('1.2.840.10008.1.1') == 'Verification SOP Class' will return False. Use ``UID.name == [UID name]`` instead. pydicom-pydicom-20aa4b7/doc/release_notes/v1.2.0.rst000066400000000000000000000067351515706620200222140ustar00rootroot00000000000000Version 1.2.0 ================================= Changes ------- * PIL removed as a fallback if Pillow is not available in the pillow pixel data handler (:issue:`722`) * ``uid.JPEGBaseLineLossy8bit`` deprecated and will be removed in v1.3. Use ``uid.JPEGBaseline`` instead. (:issue:`726`) * ``uid.JPEGBaseLineLossy12bit`` deprecated and will be removed in v1.3. Use ``uid.JPEGExtended`` instead. (:issue:`726`) * ``uid.JPEG2000Lossy`` deprecated and will be removed in v1.3. Use ``uid.JPEG2000`` instead. (:issue:`726`) * Equality and inequality operator overrides removed from ``UID``. * ``config.image_handlers`` deprecated and will be removed in v1.3. - use ``config.pixel_data_handlers`` instead. There is also a change in behavior in that ``image_handlers`` previously used to only contain the pixel data handlers that had their dependencies met. Now ``pixel_data_handlers`` contains all handlers no matter whether or not their dependencies are met. To check if a handler is available for use (it has its dependency met) use the handler's ``is_available`` method. * ``DeferredDataElement`` class deprecated and will be removed in v1.3 (:issue:`291`) * The use of NumPyPy with PyPy is no longer supported, use NumPy instead. Enhancements ------------ * Updated DICOM dictionary for 2018c edition (:issue:`677`) * Added possibility to set byte strings as value for VRs that use only the default character set (:issue:`624`) * Functions for encapsulating frames added to ``encaps`` module (:pr:`696`) * Added ``Dataset.fix_meta_info()`` (:issue:`584`) * Added new function for bit packing ``pack_bits`` for use with BitsAllocated = 1 (:pr:`715`) * Added/corrected encoding and decoding of text and person name VRs using character sets with code extensions, added handling of encoding/decoding errors (:issue:`716`) * Handle common spelling errors in Specific Character Set values (:pr:`695,737`) * Added ``uid.JPEGLosslessP14`` for UID 1.2.840.10008.1.2.4.57 * Added ``uid.JPEG2000MultiComponentLossless`` for UID 1.2.840.10008.1.2.4.92 * Added ``uid.JPEG2000MultiComponent`` for UID 1.2.840.10008.1.2.4.93 * Added full support for Planar Configuration (:issue:`713`) * Added support for single frame pixel data where BitsAllocated > 8 and SamplesPerPixel > 1 (:issue:`713`) * Small improvement in RLE decoding speed (~10%) * Added support for non-conformant RLE segment ordering (:pr:`729`) Fixes ----- * Removed unused ``original_string`` attribute from the ``DataElement`` class (:pr:`660`) * Improve performance for Python 3 when dealing with compressed multi-frame Pixel Data with pillow and jpeg-ls (:issue:`682`) * Fixed handling of private tags in repeater range (:issue:`689`) * Fixed Pillow pixel data handler for non-JPEG2k transfer syntax (:issue:`663`) * Fixed handling of elements with ambiguous VR (:pr:`700, 728`) * Adapted pixel handlers where endianness is explicitly adapted (:issue:`704`) * Improve performance of bit unpacking (:pr:`715`) * First character set no longer removed (:issue:`707`) * Fixed RLE decoded data having the wrong byte order (:pr:`729`) * Fixed RLE decoded data having the wrong planar configuration (:pr:`729`) * Fixed numpy arrays returned by the pixel data handlers sometimes being read-only. Read-only arrays are still available for uncompressed transfer syntaxes via a keyword argument for the numpy pixel data handler and should help reduce memory consumption if required. (:issue:`717`) * Fixed deprecation warning in Python 3.7 (:issue:`740`) pydicom-pydicom-20aa4b7/doc/release_notes/v1.3.0.rst000066400000000000000000000057461515706620200222160ustar00rootroot00000000000000Version 1.3.0 ================================= Documentation ------------- * New User Guide page for Python 2 support timeline * New User Guide page for working with private data elements * example loading set of CT slices and plotting axial, sagittal and coronal (:pr:`789`) Changes ------- * Removed deprecated uid variables, config.image_handlers and DeferredDataElement (:pr:`760`) * ``dataelem.isMultiValue`` is deprecated and will be removed in v1.4. Use ``dataelem.DataElement.VM`` instead. * ``dataelem.isStringOrStringList`` and ``dataelem.isString`` functions are removed * ``datadict.add_dict_entry`` and ``datadict.add_dict_entries`` now raise if trying to add a private tag * ``dataset.Dataset.maxBytesToDisplay`` also limits display length for non-binary VRs (by number of items) (:issue:`666`) Enhancements ------------ * Added ``datadict.add_private_dict_entry`` and ``datadict.add_private_dict_entries`` to add custom private tags (:issue:`799`) * Added possibility to write into zip file using gzip, by avoiding seek (:issue:`753`) * Added RLE encoding (:pr:`730`) * Added handling of incorrect transfer syntax (explicit vs implicit) (:issue:`820`) * Added creation of Tag instances by DICOM keyword, e.g Tag("PatientName") * Added possibility to get and add private tags without adding them to the private dictionary * Added possibility to use a ``Dataset`` in a ``NumPy`` array * Allow missing padding byte in Pixel Data, issue a warning in this case (:issue:`864`) * Add in-memory image decoding with GDCM * Check really used implicit/explicit VR before reading a data set (:issue:`819`, :issue:`820`) * Added alpha conversion of Datasets to/from JSON format (Python 3 only) Fixes ----- * Correctly handle `Dataset.pop` and `Dataset.setdefault` for tuple and keyword arguments (:issue:`852`) * Correctly handle encoding errors when any of the encodings are invalid (not just the first) (:issue:`850`) * Do not raise while resolving an ambiguous VR dependent on `PixelRepresentation` if both `PixelRepresentation` and `PixelData` are not present (:issue:`838`) * Raise exception with specific message if value is too large to be written in explicit transfer syntax (:issue:`757`) * Make hash for `PersonName3` behave as expected, make `PersonName` objects immutable (:issue:`785`) * Fixed `generate_uid()` returning non-conformant UIDs when `prefix=None` (:issue:`788`) * Avoid exception if reading from empty file (:issue:`810`) * An invalid encoding is now replaced by the default encoding, if ``config.enforce_valid_values`` is not set (:issue:`815`) * Correctly handle elements with ambiguous VR in sequence items (:issue:`804`) * Fix bug where new DicomDir objects always have is_implicit_VR * Fix dataset equality for mixed raw vs converted data elements (:issue:`835`) * Remove excess padding in Pixel Data * Fix wrong date format in anonymize example * Fix unknown VR exception message when VR isn't ASCII (:issue:`791`) * Fix jis-x-0201 characters encoding (:issue:`856`) pydicom-pydicom-20aa4b7/doc/release_notes/v1.4.0.rst000066400000000000000000000103751515706620200222110ustar00rootroot00000000000000Version 1.4.0 ================================= Fixes ----- * Fixed handling of VRs AT and PN in json encoding (:issue:`915`) * Fixed handling of binary values in json encoding (:issue:`887`) * Prevent exception if assigning `None` to UI element (:issue:`894`) * Fixed print output for numeric multi-value elements (:issue:`892`) * Fixed testing PN values for truthiness (:issue:`891`) * Fixed handling of data too large to written in explicit transfer syntax * Fixed handling of known tags with VR UN (:issue:`899`, :issue:`968`) * Fixed assigning of empty values to data elements (:issue:`896`) * Fixed error in unpickling dataset (:issue:`947`) * Fixed error in pickling modified datasets (:issue:`951`) * Fixed improper conversion of the first value of the *LUT Descriptor* elements (0028,1101-1103) and (0028,3002) (:issue:`942`) * Fixed handling of ISO IR 159 encoding (:issue:`917`) * Fixed propagation of bulk data handler in Dataset.from_json (:issue:`971`) * Correctly handle DICOMDIR files with records in reverse-hierarchical order (:issue:`822`) * *Pixel Data* encoded using JPEG2000 and decoded using the Pillow handler no longer returns RGB data when the (0028,0004) *Photometric Interpretation* is YBR_FULL or YBR_FULL_422. (:issue:`263`, :issue:`273`, :issue:`826`) * Avoid possible high memory usage while reading sequences (:issue:`994`) * Fixed :func:`~pydicom.encaps.generate_pixel_data` not returning all available frames when the Basic Offset Table was empty. This may still occur when multiple fragments per frame are present for non-JPEG transfer syntaxes or where no JPEG EOI/EOC marker is present (:issue:`685`) * Fixed possible incorrect switch to explicit VR in sequence items (:issue:`999`) * Fixed JPEG 2000 (UIDs 1.2.840.10008.1.2.4.90 and 1.2.840.10008.1.2.4.91) pixel data with bit depth range 9-16 not producing the correct values with the Pillow handler (:issue:`693`) * Fixed parsing a DICOMDIR file with no records raising an exception (:issue:`1004`) Enhancements ------------ * Added support for converting (60xx,3000) *Overlay Data* to a numpy ndarray using :meth:`Dataset.overlay_array() ` (:issue:`912`) * Added support for deferred reading in file-like objects (:issue:`932`) * Tolerate values with multiple and/or incorrect padding bytes (:issue:`940`) * Added support for uncompressed pixel data with (0028,0004) *Photometric Interpretation* of `YBR_FULL_422` to the numpy pixel data handler. * Added :func:`~pydicom.pixel_data_handlers.util.apply_color_lut` function for applying color palette LUTs (:issue:`205`) * Added :func:`~pydicom.pixel_data_handlers.util.apply_modality_lut` function for applying modality LUTs. * Added :func:`~pydicom.data.get_palette_files` for retrieving well-known palette color datasets. * Raise on end of file errors if `config.enforce_valid_values` is set (:issue:`277`) * Added user warning, or exception in strict mode, if a DICOMDIR has an unexpected transfer syntax (:issue:`848`) * Handle missing offset tags in DICOMDIR (:issue:`981`) * Added optional `handler` argument to :func:`~pydicom.dataset.Dataset.decompress`. This lets you specify a particular handler, rather than following pydicom's default order (:issue:`537`) * Added :func:`~pydicom.pixel_data_handlers.util.apply_voi_lut` function for applying VOI LUTs or windowing operations. * Added support for (7fe0,0008) *Float Pixel Data* and (7fe0,0009) *Double Float Pixel Data* to :attr:`~pydicom.dataset.Dataset.pixel_array` (:issue:`452`) * JPEG 2000 (1.2.840.10008.1.2.4.91) transfer syntax is supported for data with bit depth > 8 with the Pillow pixel data handler * :attr:`PixelData.is_undefined_length ` is now set automatically based on whether the Dataset's Transfer Syntax is compressed (:issue:`1006`) * Updated DICOM dictionary to 2019e edition (:issue:`1013`) * Added support for new VRs OV, SV, UV (:issue:`1016`) * Code dictionaries and ``Code`` class for structured reporting added (alpha release only). See the :doc:`Structured Reporting tutorial <../tutorials/sr_basics>` for more information Changes ------- * :func:`~pydicom.encaps.get_frame_offsets` now returns whether the Basic Offset Table is empty and a list of the offsets. pydicom-pydicom-20aa4b7/doc/release_notes/v1.4.1.rst000066400000000000000000000005211515706620200222020ustar00rootroot00000000000000Version 1.4.1 ================================= Fixes ----- * Fixed writing of empty sequences (regression, :issue:`1030`) Changes ------- * In `Dataset.to_json` and `Dataset.to_json_dict`, the default of the `bulk_data_threshold` argument has changed to 1024, and is now ignored if no bulk data handler is set (see :issue:`1029`) pydicom-pydicom-20aa4b7/doc/release_notes/v2.0.0.rst000066400000000000000000000053661515706620200222120ustar00rootroot00000000000000Version 2.0.0 ================================= Changelog --------- * Dropped support for Python 2 (only Python 3.5+ supported) * Changes to `Dataset.file_meta` * file_meta now shown by default in dataset `str` or `repr` output; :data:`pydicom.config.show_file_meta` can be set ``False`` to restore previous behavior * new :class:`~pydicom.dataset.FileMetaDataset` class that accepts only group 2 data elements * Deprecation warning given unless `Dataset.file_meta` set with a :class:`~pydicom.dataset.FileMetaDataset` object (in *pydicom* 3, it will be required) * Old `PersonName` class removed; `PersonName3` renamed to `PersonName`. Classes `PersonNameUnicode` and `PersonName3` are aliased to `PersonName` but are deprecated and will be removed in version 2.1 * ``dataelem.isMultiValue`` (previously deprecated) has been removed. Use ``dataelem.DataElement.VM`` instead. Enhancements ------------ * Allow PathLike objects for filename argument in `dcmread`, `dcmwrite` and `Dataset.save_as` (:issue:`1047`) * Deflate post-file meta information data when writing a dataset with the Deflated Explicit VR Little Endian transfer syntax UID (:issue:`1086`) * Added `config.replace_un_with_known_vr` to be able to switch off automatic VR conversion for known tags with VR "UN" (see :issue:`1067`) * Added `config.use_DS_numpy` and `config.use_IS_numpy` to have multi-valued data elements with VR of **DS** or **IS** return a numpy array (:issue:`623`) (much faster for bigger arrays). Both default to False to preserve previous behavior Fixes ----- * Fixed reading of datasets with an empty `Specific Character Set` tag (regression, :issue:`1038`) * Fixed failure to parse dataset with an empty *LUT Descriptor* or *Red/Green/Blue Palette Color LUT Descriptor* element. (:issue:`1049`) * Made `Dataset.save_as` a wrapper for `dcmwrite` (:issue:`1042`) rather than having different checks in each * Removed ``1.2.840.10008.1.2.4.70`` - JPEG Lossless (Process 14, SV1) from the Pillow pixel data handler as Pillow doesn't support JPEG Lossless. (:issue:`1053`) * Fixed error when writing elements with a VR of **OF** (:issue:`1075`) * Fixed improper conversion when reading elements with a VR of **OF** (:issue:`1075`) * Fixed :func:`~pydicom.pixel_data_handlers.util.apply_voi_lut` and :func:`~pydicom.pixel_data_handlers.util.apply_modality_lut` not handling (0028,3006) *LUT Data* with a VR of **OW** (:issue:`1073`) * Fixed access to private creator tag in raw datasets (:issue:`1078`) * Fixed description of newly added known private tag (:issue:`1082`) * Fixed update of private blocks after deleting private creator (:issue:`1097`) * Fixed bug in updating `pydicom.config.use_DS_Decimal` flag in :func:`~pydicom.config.DS_decimal` pydicom-pydicom-20aa4b7/doc/release_notes/v2.1.0.rst000066400000000000000000000165411515706620200222100ustar00rootroot00000000000000Version 2.1.0 ================================= Enhancements ------------ * Large testing data is no longer distributed within the pydicom package with the aim to reduce the package download size. These test files will download on-the-fly whenever either the tests are run, or should the file(s) be requested via the data manager functions. For example: * To download all files and get their paths on disk you can run :func:`pydicom.data.get_testdata_files`. * To download an individual file and get its path on disk you can use :func:`pydicom.data.get_testdata_file`, e.g. for ``RG1_UNCI.dcm`` use ``pydicom.data.get_testdata_file("RG1_UNCI.dcm")`` * Added a new pixel data handler based on :gh:`pylibjpeg ` which supports all (non-retired) JPEG transfer syntaxes (:issue:`1127`) * Added :func:`~pydicom.pixel_data_handlers.apply_rescale` alias * Added :func:`~pydicom.pixel_data_handlers.util.apply_voi` and :func:`~pydicom.pixel_data_handlers.util.apply_windowing` * Added *prefer_lut* keyword parameter to :func:`~pydicom.pixel_data_handlers.util.apply_voi_lut` and handle empty VOI LUT module elements (:issue:`1234`, :issue:`1237`) * Added ability to register external data sources for use with the functions in :mod:`pydicom.data` (:pr:`1156`) * ``__contains__``, ``__next__`` and ``__iter__`` implementations added to :class:`~pydicom.valuerep.PersonName` (:issue:`1103`) * Added convenience constants for the MPEG transfer syntaxes to :mod:`pydicom.uid` (:pr:`1155`) * Added support for decoding *Waveform Data*: * Added :mod:`pydicom.waveforms` module and :func:`~pydicom.waveforms.numpy_handler.generate_multiplex` and :func:`~pydicom.waveforms.numpy_handler.multiplex_array` functions. * Added :meth:`Dataset.waveform_array() ` which returns an :class:`~numpy.ndarray` for the multiplex group at `index` within a *Waveform Sequence* element. * When JPEG 2000 image data is unsigned and the *Pixel Representation* is 1 the image data is converted to signed (:issue:`1149`) * Added :attr:`~pydicom.uid.UID.keyword` property for the new UID keywords in version 2020d of the DICOM Standard * Added testing of the variable names used when setting :class:`~pydicom.dataset.Dataset` attributes and :attr:`~pydicom.config.INVALID_KEYWORD_BEHAVIOR` config option to allow customizing the behavior when a camel case variable name is used that isn't a known element keyword (:issue:`1014`) * Added :attr:`~pydicom.config.INVALID_KEY_BEHAVIOR` config option to allow customizing the behavior when an invalid key is used with the :class:`~pydicom.dataset.Dataset` :func:`in` operator (:issue:`1200`) * Implemented full support (loading, accessing, modifying, writing) of DICOM File-sets and their DICOMDIR files via the :class:`~pydicom.fileset.FileSet` class (:issue:`9`, :issue:`243`, :issue:`1093`) * Added :attr:`~pydicom.uid.AllTransferSyntaxes` * Added option to turn on *pydicom* future breaking behavior to allow user code to check itself against the next major version release. Set environment variable "PYDICOM_FUTURE" to "True" or call :func:`~pydicom.config.future_behavior` * Added another signature to the `bulk_data_uri_handler` in `from_json` to allow for the communication of not just the URI but also the tag and VR to the handler. Previous handlers will work as expected, new signature handlers will get the additional information. * :func:`~pydicom.pixel_data_handlers.numpy_handler.pack_bits` can now be used with 2D or 3D input arrays and will pad the packed data to even length by default. * Elements with the :class:`~pydicom.valuerep.IS` VR accept float strings that are convertible to integers without loss, e.g. "1.0" (:pr:`1240`) * Added :func:`~pydicom.encaps.encapsulate_extended` function for use when an Extended Offset Table is required (:issue:`1178`) Changes ------- * Dropped support for Python 3.5 (only Python 3.6+ supported) * Reading and adding unknown non-private tags now does not raise an exception per default, only when :attr:`~pydicom.config.enforce_valid_values` is set (:issue:`1161`) * Data dictionaries updated to version 2020d of the DICOM Standard * Updated a handful of the SOP Class variable names in ``_storage_sopclass_uids`` to use the new UID keywords. Variables with ``Multiframe`` in them become ``MultiFrame``, those with ``and`` in them become ``And``, and ``DICOSQuadrupoleResonanceQRStorage`` becomes ``DICOSQuadrupoleResonanceStorage``. * The following UID constants are deprecated and will be removed in v2.2: * ``JPEGBaseline``: use :attr:`~pydicom.uid.JPEGBaseline8Bit` * ``JPEGExtended``: use :attr:`~pydicom.uid.JPEGExtended12Bit` * ``JPEGLossless``: use :attr:`~pydicom.uid.JPEGLosslessSV1` * ``JPEGLSLossy``: use :attr:`~pydicom.uid.JPEGLSNearLossless` * ``JPEG2000MultiComponentLossless``: use :attr:`~pydicom.uid.JPEG2000MCLossless` * ``JPEG2000MultiComponent``: use :attr:`~pydicom.uid.JPEG2000MC` * In v3.0 the value for ``JPEGLossless`` will change from 1.2.840.10008.1.2.4.70 to 1.2.840.10008.1.2.4.57 to match its UID keyword * The following lists of UIDs are deprecated and will be removed in v2.2: * ``JPEGLossyCompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.JPEGTransferSyntaxes` * ``JPEGLSSupportedCompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.JPEGLSTransferSyntaxes` * ``JPEG2000CompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.JPEG2000TransferSyntaxes` * ``RLECompressedLosslessSyntaxes``: use :attr:`~pydicom.uid.RLETransferSyntaxes` * ``UncompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.UncompressedTransferSyntaxes` * ``PILSupportedCompressedPixelTransferSyntaxes`` * :class:`~pydicom.dicomdir.DicomDir` and the ``dicomdir`` module are deprecated and will be removed in v3.0. Use :class:`~pydicom.fileset.FileSet` instead (:issue:`1211`) * ``pydicom.overlay_data_handlers`` is deprecated, use ``pydicom.overlays`` instead * Removed transfer syntax limitations when converting overlays to an ``ndarray`` (:issue:`1181`) * The :attr:`~pydicom.config.overlay_data_handlers` config option is deprecated, the default handler will always be used. Fixes ----- * :meth:`Dataset.copy()` now works as expected (:issue:`1146`) * Optimistically parse undefined length non-SQ data as if it's encapsulated pixel data to avoid erroring out on embedded sequence delimiter (:issue:`1140`) * Fixed :func:`~pydicom.data.get_testdata_file` and :func:`~pydicom.data.get_testdata_files` raising an exception if no network connection is available (:pr:`1156`) * Fixed GDCM < v2.8.8 not returning the pixel array for datasets not read from a file-like (:issue:`1153`) * Raise :class:`TypeError` if :func:`~pydicom.filereader.dcmread` or :func:`~pydicom.filewriter.dcmwrite` is called with wrong argument * Gracefully handle empty Specific Character Set (:issue:`1190`) * Fixed empty ambiguous VR elements raising an exception (:issue:`1193`) * Allow :func:`~pydicom.pixel_data_handlers.util.apply_voi_lut` to apply VOI lookup to an input float array * Fixed :meth:`Dataset.setdefault()` not adding working correctly when the `default` value is ``None`` and not adding private elements when :attr:`~pydicom.config.enforce_valid_values` is ``True`` (:issue:`1215`) pydicom-pydicom-20aa4b7/doc/release_notes/v2.1.1.rst000066400000000000000000000003331515706620200222010ustar00rootroot00000000000000Version 2.1.1 ============= Fixes ----- * Remove ``py.typed`` (:issue:`1251`) * Fix ``ImportError`` with Python 3.6.0 (:issue:`1253`) * Fix converting Sequences with Bulk Data when loading from JSON (:issue:`1254`) pydicom-pydicom-20aa4b7/doc/release_notes/v2.2.0.rst000066400000000000000000000145571515706620200222160ustar00rootroot00000000000000Version 2.2.0 ================================= Changes ------- * Data elements with a VR of **AT** must now be set with values acceptable to :func:`~pydicom.tag.Tag`, and are always stored as a :class:`~pydicom.tag.BaseTag`. Previously, any Python type could be set. * :meth:`BaseTag.__eq__()` returns ``False`` rather than raising an exception when the operand cannot be converted to :class:`~pydicom.tag.BaseTag` (:pr:`1327`) * :meth:`DA.__str__()`, :meth:`DT.__str__()` and :meth:`TM.__str__()` return valid DICOM strings instead of the formatted date and time representations (:issue:`1262`) * If comparing :class:`~pydicom.dataset.FileDataset` instances, the file metadata is now ignored. This makes it possible to compare a :class:`~pydicom.dataset.FileDataset` object with a :class:`~pydicom.dataset.Dataset` object. * :func:`~pydicom.pixel_data_handlers.rle_handler.rle_encode_frame` is deprecated and will be removed in v3.0, use :meth:`~pydicom.dataset.Dataset.compress` or :attr:`~pydicom.encoders.RLELosslessEncoder` instead. * :func:`~pydicom.filereader.read_file` is deprecated and will be removed in v3.0, use :func:`~pydicom.filereader.dcmread` instead. * :func:`~pydicom.filewriter.write_file` is deprecated and will be removed in v3.0, use :func:`~pydicom.filewriter.dcmwrite` instead. * Data dictionaries updated to version 2021b of the DICOM Standard * :class:`~pydicom.dataset.Dataset` no longer inherits from :class:`dict` Enhancements ------------ * Added a command-line interface for pydicom. Current subcommands are: * ``show``: display all or part of a DICOM file * ``codify`` to produce Python code for writing files or sequence items from scratch. Please see the :ref:`cli_guide` for examples and details of all the options for each command. * A field containing an invalid number of bytes will result in a warning instead of an exception when :attr:`~pydicom.config.convert_wrong_length_to_UN` is set to ``True``. * Private tags known via the private dictionary will now get the configured VR if read from a dataset instead of **UN** (:issue:`1051`). * While reading explicit VR, a switch to implicit VR will be silently attempted if the VR bytes are not valid VR characters, and config option :attr:`~pydicom.config.assume_implicit_vr_switch` is ``True`` (default) * New functionality to help with correct formatting of decimal strings (**DS**) * Added :func:`~pydicom.valuerep.is_valid_ds` to check whether a string is valid as a DICOM decimal string and :func:`~pydicom.valuerep.format_number_as_ds` to format a given ``float`` or ``Decimal`` as a DS while retaining the highest possible level of precision * If :attr:`~pydicom.config.enforce_valid_values` is set to ``True``, all **DS** objects created will be checked for the validity of their string representations. * Added optional ``auto_format`` parameter to the init methods of :class:`~pydicom.valuerep.DSfloat` and :class:`~pydicom.valuerep.DSdecimal` and the :func:`~pydicom.valuerep.DS` factory function to allow explicitly requesting automatic formatting of the string representations of these objects when they are constructed. * Added methods to construct :class:`~pydicom.valuerep.PersonName` objects from individual components of names (``family_name``, ``given_name``, etc.). See :meth:`~pydicom.valuerep.PersonName.from_named_components` and :meth:`~pydicom.valuerep.PersonName.from_named_components_veterinary`. * Added support for downloading the large test files with the `requests `_ package in addition to :mod:`urllib.request` (:pr:`1340`) * Ensured :func:`~pydicom.pixel_data_handlers.util.convert_color_space` uses 32-bit floats for calculation, added `per_frame` flag to allow frame-by-frame processing and improved the speed by ~20-60% (:issue:`1348`) * Optimisations for RLE encoding using *pydicom* (~40% faster). * Added support for faster decoding (~4-5x) and encoding (~20x) of *RLE Lossless* *Pixel Data* via the :gh:`pylibjpeg-rle ` plugin (:pr:`1361`, :pr:`1372`). * Added :func:`Dataset.compress()` function for compressing uncompressed pixel data using a given encoding format as specified by a UID. Only *RLE Lossless* is currently supported (:pr:`1372`) * Added :mod:`~pydicom.encoders` module and the following encoders: * :attr:`~pydicom.encoders.RLELosslessEncoder` with 'pydicom', 'pylibjpeg' and 'gdcm' plugins * Added `read` parameter to :func:`~pydicom.data.get_testdata_file` to allow reading and returning the corresponding dataset (:pr:`1372`) * Handle decoded RLE segments with padding (:issue:`1438`) * Add option to JSON functions to suppress exception and continue (:pr:`1332`) * Allow searching :class:`~pydicom.fileset.FileSet` s for a list of elements (:pr:`1428`) * Added hash function to SR :class:`~pydicom.sr.Code` (:pr:`1434`) Fixes ----- * Fixed pickling a :class:`~pydicom.dataset.Dataset` instance with sequences after the sequence had been read (:issue:`1278`) * Fixed JSON export of numeric values * Fixed handling of sequences of unknown length that switch to implicit encoding, and sequences with VR **UN** (:issue:`1312`) * Do not load external data sources until needed - fixes problems with standard workflow if `setuptools` are not installed (:issue:`1341`) * Fixed empty **PN** elements read from file being :class:`str` rather than :class:`~pydicom.valuerep.PersonName` (:issue:`1338`) * Fixed handling of JPEG (10918-1) images compressed using RGB colourspace rather than YBR with the Pillow pixel data handler (:pr:`878`) * Allow to deepcopy a `~pydicom.dataset.FileDataset` object (:issue:`1147`) * Fixed elements with a VR of **OL**, **OD** and **OV** not being set correctly when an encoded backslash was part of the element value (:issue:`1412`) * Fixed expansion of linear segments with floating point steps in segmented LUTs (:issue:`1415`) * Fixed handling of code extensions with person name component delimiter (:pr:`1449`) * Fixed bug decoding RBG jpg with APP14 marker due to change in Pillow (:pr:`1444`) * Fixed decoding for `FloatPixelData` and `DoubleFloatPixelData` via `pydicom.pixel_data_handlers.numpy_handler` (:issue:`1457`) pydicom-pydicom-20aa4b7/doc/release_notes/v2.3.0.rst000066400000000000000000000055151515706620200222110ustar00rootroot00000000000000Version 2.3.0 ================================= Changes ------- * :meth:`DataElement.description` is deprecated and will be removed in v3.0, use :attr:`DataElement.name` instead * Updated the private dictionary * :attr:`~pydicom.config.enforce_valid_values` is deprecated in favor of :attr:`~pydicom.config.settings.reading_validation_mode` * Added `download` parameter to :func:`~pydicom.data.get_testdata_file` to allow skipping downloading the file if missed locally (:pr:`1617`) Enhancements ------------ * Values are now validated for valid length, allowed character set and format on reading and writing. Depending on the value of :attr:`~pydicom.config.settings.reading_validation_mode` and :attr:`~pydicom.config.settings.writing_validation_mode` a warning is logged, an exception is raised, or the validation is skipped. * Added :class:`~pydicom.valuerep.VR` enum (:pr:`1500`) * UIDs for all Storage SOP Classes have been added to the ``uid`` module (:issue:`1498`) * Use rle_handler as last resort handler for decoding RLE encoded data as it is the slowest handler (:issue:`1487`) * Added, enhanced, or removed a number of Mitra private dictionary entries (:pr:`1588`) * Added support for unpacking bit-packed data without using NumPy to :func:`~pydicom.pixel_data_handlers.utils.unpack_bits`(:pr:`1594`) * Added :func:`~pydicom.pixel_data_handlers.util.expand_ybr422` for expanding uncompressed ``YBR_FULL_422`` data to ``YBR_FULL`` (:pr:`1593`) * Replacement of ``UN`` VR with ``SQ`` VR for undefined length data elements (introduced in 2.2.2), can now be configured via :attr:`~pydicom.config.settings.infer_sq_for_un_vr` * Updated dictionaries to DICOM 2022a Fixes ----- * Fixed odd-length **OB** values not being padded during write (:issue:`1511`) * Fixed Hologic private dictionary entry (0019xx43) * Fixed Mitra global patient ID private dictionary entry (:pr:`1588`) * Fixed :meth:`~pydicom.dataset.Dataset.compress` not setting the correct encoding for the rest of the dataset (:issue:`1565`) * Fixed `AttributeError` on deep copy of :class:`~pydicom.dataset.FileDataset` (:issue:`1571`) * Fixed an exception during pixel decoding if using GDCM < 2.8.8 on Windows (:issue:`1581`) * Fixed crashes on Windows and MacOS when using the GDCM plugin to compress into *RLE Lossless* (:issue:`1581`) * Fixed ``dir(Dataset())`` not returning class attributes (:issue:`1599`) * Fixed bad DICOMDIR offsets when using :meth:`FileSet.write() ` with a *Directory Record Sequence* using undefined length items (:issue:`1596`) * Assigning a list of length one as tag value is now correctly handled as assigning the single value (:issue:`1606`) * Fixed an exception with multiple deferred reads with file-like objects (:issue:`1609`) pydicom-pydicom-20aa4b7/doc/release_notes/v2.4.0.rst000066400000000000000000000041531515706620200222070ustar00rootroot00000000000000Version 2.4.0 ================================= Changes ------- * Removed support for Python 3.6 (EOL since December 2021) Enhancements ------------ * Added attribute :attr:`~pydicom.valuerep.PersonName.alphabetic` (:pr:`1634`) * Added attribute :attr:`~pydicom.tag.BaseTag.json_key` (:pr:`1648`) * Added value validation for numerical VRs, add type validation for all validated VRs (:issue:`1414`) * CLI commands now accept *pydicom* charset test files and CLI help shows Python Version (:pr:`1674`) * Added support for Python 3.11 (:issue:`1658`) * Added :class:`~pydicom.valuerep.ISfloat` to allow non-strict reading of existing files with float IS values (:issue:`1661`) * Improved speed of creating and accessing highly nested structures (:issue:`1728`, :pr:`1734`) * Switched to a pyproject.toml build process (:pr:`1792`) * Updated DICOM and UID dicts to DICOM 2023b (:pr:`1803`) Fixes ----- * Fixed length validation of DS values with maximum length without a leading zero (:issue:`1632`) * Increased download speed with progress bar for test data (:issue:`1611`) * Fixed crash due to invalid private creator (:issue:`1638`) * Fixed extremely long BytesLengthException error messages (:pr:`1683`) * In codify, ensure unique variable names for DICOM keywords repeated in sequences, and handle unicode characters correctly (:issue:`1670`) * Fixed handling of some invalid values in :meth:`~pydicom.dataset.Dataset.to_json_dict` if `suppress_invalid_tags` is set to `True` (:issue:`1693`) * Fixed reading of data with 8 bits allocated, encoded in Big Endian transfer syntax using VR ``OW`` (:issue:`1680`) * Fixed crash if reading regular dataset that has the SOP Class of a DICOMDIR (:issue:`1702`) * Fixed wrong waveform data calculation when as_raw=False and baseline!=0 (:issue:`1667`) * Fixed reading LUTData to expected size (:pr:`1747`) * Fixed handling of AT VRs when codifying data elements (:issue:`1738`) Pydicom Internals ----------------- * In test suites, renamed 'setup' and 'teardown' methods, deprecated starting in pytest 7.2 * Use own fork of `CharPyLS` to handle builds with Python 3.11 (:issue:`1788`) pydicom-pydicom-20aa4b7/doc/release_notes/v3.0.0.rst000066400000000000000000000544021515706620200222060ustar00rootroot00000000000000Version 3.0.0 ================================= The major breaking changes with the version 3.0 release are: * The value for :attr:`~pydicom.uid.JPEGLossless` has changed to ``1.2.840.10008.1.2.4.57``. * The encoding used when saving datasets defaults to the set *Transfer Syntax UID*. * :attr:`Dataset.pixel_array` will convert YCbCr *Pixel Data* to RGB by default when possible. * ``read_file`` and ``write_file`` have been removed. Changes ------- * Removed support for Python <= 3.9. * All tag formats changed to upper case, no space e.g. "(7FE0,0010)" rather than "(7fe0, 0010)". * Values with VR **AE** with an incorrect value length are now handled gracefully (extra bytes are ignored with a warning). * A value of 0 for *Number of Frames* is now handled as 1 frame, with a user warning issued on reading the pixel data (:issue:`1844`). * The value for :attr:`~pydicom.uid.JPEGLossless` has changed from 1.2.840.10008.1.2.4.70 to 1.2.840.10008.1.2.4.57 to match its UID keyword. Use :attr:`~pydicom.uid.JPEGLosslessSV1` instead for 1.2.840.10008.1.2.4.70. * The theoretical maximum number of instances supported by :class:`~pydicom.fileset.FileSet` has been reduced to 1838265625 to ensure support for 32-bit systems (:issue:`1743`). * The characters used by :func:`~pydicom.fileset.generate_filename` when `alphanumeric` is ``True`` has been reduced to [0-9][A-I,K-Z]. * :func:`~pydicom.data.get_testdata_file` and :func:`~pydicom.data.get_testdata_files` now raise ``ValueError`` if called with an absolute path or pattern. * :func:`~pydicom.uid.generate_uid` has been changed to use a random suffix generated using :func:`~secrets.randbelow` when `entropy_srcs` isn't used, and the maximum allowed length of the `prefix` has been changed to 54 characters (:issue:`1773`). * :attr:`DataElement.VM` always returns ``1`` for **SQ** elements (:issue:`1481`). * DICOM dictionary updated to 2024c. * Concepts dictionaries updated to 2024c. * :func:`~pydicom.dataset.validate_file_meta` now checks to ensure required Type 1 elements aren't empty. * `implicit_vr` and `little_endian` optional arguments added to :meth:`Dataset.save_as()`. In addition, this method will now raise an exception if the user tries to convert between little and big endian datasets. If this is something you need, use :func:`~pydicom.filewriter.dcmwrite` instead. * Added the `overwrite` argument to :meth:`Dataset.save_as()` and :func:`~pydicom.filewriter.dcmwrite` to allow raising a :class:`FileExistsError` if trying to write to a file that already exists (:issue:`2104`). * `implicit_vr`, `little_endian` and `force_encoding` optional arguments added to :func:`~pydicom.filewriter.dcmwrite`. * The priority used to decide which encoding to use with :meth:`Dataset.save_as()` and :func:`~pydicom.filewriter.dcmwrite` has been changed to: 1. The set *Transfer Syntax UID*, 2. The `implicit_vr` and `little_endian` arguments, 3. :attr:`Dataset.is_implicit_VR` and :attr:`Dataset.is_little_endian`, 4. :attr:`Dataset.original_encoding`. * Datasets containing *Command Set* (0000,eeee) elements can no longer be written using :meth:`Dataset.save_as()` or :func:`~pydicom.filewriter.dcmwrite`, use :func:`~pydicom.filewriter.write_dataset` instead. * A dataset's :attr:`~pydicom.dataset.FileDataset.file_meta` elements are no longer modified when writing. * :class:`~pydicom.filebase.DicomIO` now requires a readable or writeable buffer during initialisation and :class:`~pydicom.filebase.DicomBytesIO` directly inherits from it. * The ``pydicom.encoders`` module has been moved to :mod:`pydicom.pixels.encoders `, the original import path will be removed in v4.0. * Using GDCM v3.0.23 or lower to decode JPEG-LS datasets with a *Bits Stored* of 6 or 7 produces incorrect results, so attempting to do so now raises an exception. ``pyjpegls`` or ``pylibjpeg`` with ``pylibjpeg-libjpeg`` can be used instead (:issue:`2008`). * Using Pillow with JPEG 2000 encoded > 8-bit multi-sample data (such as RGB) now raises an exception as Pillow cannot decode such data correctly (:issue:`2006`). * An exception will now be raised if an :class:`~numpy.ndarray` is used to set *Pixel Data* (:issue:`50`). * Logging of errors when converting elements using :meth:`Dataset.to_json_dict() ` have been made more verbose and now use ``logging.WARNING`` (:issue:`1909`). * Added :attr:`FileDataset.buffer` and changed :attr:`FileDataset.filename` to only be the filename the dataset was read from (if any) (:issue:`1937`). Removals ~~~~~~~~ * The ``compat`` module has been removed. * The ``dicomdir`` module and ``DicomDir`` class have been removed and reading a DICOMDIR dataset now returns a normal :class:`~pydicom.dataset.FileDataset` instance. For handling DICOM File-sets and DICOMDIR datasets use the :class:`~pydicom.fileset.FileSet` class instead. * The ``read_file`` and ``write_file`` functions have been removed, use :func:`~pydicom.filereader.dcmread` and :func:`~pydicom.filewriter.dcmwrite` instead. * The following UID constants have been removed: * ``JPEGBaseline`` (use :attr:`~pydicom.uid.JPEGBaseline8Bit` instead) * ``JPEGExtended`` (use :attr:`~pydicom.uid.JPEGExtended12Bit` instead) * ``JPEGLSLossy`` (use :attr:`~pydicom.uid.JPEGLSNearLossless` instead) * ``JPEG2000MultiComponentLossless`` (use :attr:`~pydicom.uid.JPEG2000MCLossless` instead) * ``JPEG2000MultiComponent`` (use :attr:`~pydicom.uid.JPEG2000MC` instead) * The following UID lists have been removed: * ``JPEGLossyCompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.JPEGTransferSyntaxes` * ``JPEGLSSupportedCompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.JPEGLSTransferSyntaxes` * ``JPEG2000CompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.JPEG2000TransferSyntaxes` * ``RLECompressedLosslessSyntaxes``: use :attr:`~pydicom.uid.RLETransferSyntaxes` * ``UncompressedPixelTransferSyntaxes``: use :attr:`~pydicom.uid.UncompressedTransferSyntaxes` * ``PILSupportedCompressedPixelTransferSyntaxes`` * The ``PersonNameUnicode`` class has been removed, use :class:`~pydicom.valuerep.PersonName` instead. * The ``DataElement.description`` attribute has been removed, use :attr:`DataElement.name` instead. * The ``pixel_data_handlers.rle_handler.rle_encode_frame`` function has been removed, use :meth:`Dataset.compress()` or :attr:`~pydicom.pixels.encoders.base.RLELosslessEncoder` instead. * The ``_storage_sopclass_uids`` module has been removed, import UIDs from the :mod:`~pydicom.uid` module instead. * The following properties have been removed: * ``Dataset.parent`` and ``Dataset.parent_seq`` * ``Sequence.parent`` and ``Sequence.parent_dataset`` * ``DataElement.parent`` * The ``overlay_data_handlers`` module has been removed, use the :mod:`~pydicom.overlays` module instead. * ``config.overlay_data_handlers`` has been removed. * ``Dataset.fix_meta_info()`` has been removed as encoding state now follows the transfer syntax instead of the other way around. Enhancements ------------ * Added details of missing required tag information when adding a dataset to a File-set (:issue:`1752`). * The following UID constants have been added: * :attr:`~pydicom.uid.MPEG2MPMLF` * :attr:`~pydicom.uid.MPEG2MPHLF` * :attr:`~pydicom.uid.MPEG4HP41F` * :attr:`~pydicom.uid.MPEG4HP41BDF` * :attr:`~pydicom.uid.MPEG4HP422DF` * :attr:`~pydicom.uid.MPEG4HP423DF` * :attr:`~pydicom.uid.MPEG4HP42STEREOF` * :attr:`~pydicom.uid.HTJ2KLossless` * :attr:`~pydicom.uid.HTJ2KLosslessRPCL` * :attr:`~pydicom.uid.HTJ2K` * :attr:`~pydicom.uid.JPIPHTJ2KReferenced` * :attr:`~pydicom.uid.JPIPHTJ2KReferencedDeflate` * :attr:`~pydicom.uid.SMPTEST211020UncompressedProgressiveActiveVideo` * :attr:`~pydicom.uid.SMPTEST211020UncompressedInterlacedActiveVideo` * :attr:`~pydicom.uid.SMPTEST211030PCMDigitalAudio` * Added convenience method :meth:`~pydicom.dataset.Dataset.add_new_private` to add a private tag. * Added the :ref:`examples` module to make it easier and less confusing for users to work with the example datasets used by the documentation. * Added the ability to set the corresponding dataset encoding for private transfer syntaxes to :class:`~pydicom.uid.UID` via the :meth:`~pydicom.uid.UID.set_private_encoding` method. * Added the ability to register private transfer syntaxes with :func:`~pydicom.uid.register_transfer_syntax` so they can be used when reading datasets with :func:`~pydicom.filereader.dcmread`. * Warning messages are also sent to the pydicom logger (:issue:`1529`). * Added the following to the :mod:`~pydicom.encaps` module: * :func:`~pydicom.encaps.parse_basic_offsets` for parsing the Basic Offset Table. * :func:`~pydicom.encaps.parse_fragments` for determining the number of encapsulated fragments and their byte offsets. * :func:`~pydicom.encaps.generate_fragments` for yielding encapsulated fragments. * :func:`~pydicom.encaps.generate_fragmented_frames` for yielding encapsulated frame fragments. * :func:`~pydicom.encaps.generate_frames` for yielding whole encapsulated frames. * :func:`~pydicom.encaps.get_frame` for returning the specific encapsulated frame at `index` without necessarily having to read the preceding frames into memory. These new functions support reading encapsulated data from both :class:`bytes` or any Python object with ``read()``, ``seek()`` and ``tell()`` methods such as :class:`io.BytesIO`, :class:`BinaryIO` or :class:`mmap.mmap`. They also support using the :dcm:`Extended Offset Table ` for determining frame boundaries. * Added the `keep_deferred` keyword argument to :meth:`Dataset.get_item() ` to allow accessing the file offset and element length without having to read the element value. (:issue:`1873`). * Added the :mod:`~pydicom.pixels` module and a new more flexible backend for decoding pixel data via :class:`~pydicom.pixels.decoders.base.Decoder` factory class instances. The new decoding backend adds support for the following: * Returning a view over the original pixel data buffer (:issue:`746`). * Retrieving specific frames (:issue:`1263`, :issue:`1243`). * Returning RGB pixel data by default for JPEG (:issue:`1781`, :issue:`1133` and many others). * Returning excess frames for JPEG when there is no Basic or Extended Offset Table and the *Number of Frames* is incorrect (:issue:`1666`). * Returning excess frames for native encoding when the *Number of Frames* is incorrect (:issue:`2035`) * Returning the decoded pixel data as either a NumPy :class:`~numpy.ndarray` or `buffer-like object `_. * Iterating through either all or specific frames. * Added support for decoding HTJ2K transfer syntaxes (:issue:`1848`). * Added two functions for returning pixel data as a NumPy :class:`~numpy.ndarray` from a path to a dataset while minimizing memory-usage: :func:`~pydicom.pixels.pixel_array` and :func:`~pydicom.pixels.iter_pixels`. * Added two functions for compressing and decompressing datasets using the new decoding backend: :func:`~pydicom.pixels.compress` and :func:`~pydicom.pixels.decompress`. * Added support for the following transfer syntaxes to :meth:`Dataset.compress() ` (:issue:`1997`): * *JPEG-LS Lossless* with :attr:`~pydicom.pixels.encoders.JPEGLSLosslessEncoder` * *JPEG-LS Near Lossless* with :attr:`~pydicom.pixels.encoders.JPEGLSNearLosslessEncoder` * *JPEG 2000 Lossless* with :attr:`~pydicom.pixels.encoders.JPEG2000LosslessEncoder` * *JPEG 2000* with :attr:`~pydicom.pixels.encoders.JPEG2000Encoder` See the :doc:`JPEG-LS` and :doc:`JPEG 2000 ` encoding guides for more information. * Added :meth:`Dataset.pixel_array_options()` for controlling pixel data decoding when using :attr:`Dataset.pixel_array ` with the new :mod:`~pydicom.pixels` backend. * Improve support for reading and resolving inline binary data with `VR=UN` from Json (:issue:`2062`). * :func:`~pydicom.pixels.utils.get_j2k_parameters` now takes into account the JP2 header (if present, although it's non-conformant for it to be) (:issue:`2073`). * Added support for NumPy v2.0 (:issue:`2075`). * Added ``pydicom.__concepts_version__`` attribute with the DICOM Standard version used to create the concepts dictionaries in :mod:`pydicom.sr` (:issue:`1021`). * Refactored the interface for the concepts in :mod:`pydicom.sr` to simplify the access types (:issue:`1454`). * Added the :meth:`Dataset.set_pixel_data()` method and :func:`~pydicom.pixels.set_pixel_data` function for automatically setting a dataset's *Pixel Data* and related Image Pixel module elements using an :class:`~numpy.ndarray` (:issue:`50`). * Added typing support for :class:`~pydicom.dataset.Dataset` element access using the `types-pydicom `_ package. (:issue:`1485`). * Added :func:`~pydicom.pixels.apply_presentation_lut` for applying a Presentation LUT to an :class:`~numpy.ndarray` (:issue:`1265`). * Added :func:`~pydicom.pixels.apply_icc_profile` and :func:`~pydicom.pixels.create_icc_transform` for applying ICC profiles to an :class:`~numpy.ndarray` (:issue:`1244`). * Added :meth:`Dataset.update_raw_element()` to make it easier to modify a :class:`~pydicom.dataelem.RawDataElement`'s VR or value prior to conversion to a :class:`~pydicom.dataelem.DataElement` (:issue:`1739`). * Added support for using :class:`io.BufferedIOBase` subclasses to set the value for elements with O* VRs such as **OB** and **OW** (:issue:`1913`). * Added :func:`~pydicom.encaps.encapsulate_buffer` and :func:`~pydicom.encaps.encapsulate_extended_buffer` for encapsulating buffered compressed *Pixel Data* via :class:`~pydicom.encaps.EncapsulatedBuffer` instances. * Added elements with **OB**, **OD**, **OF**, **OL**, **OW**, **OV** VRs to the type validation checking when setting :class:`~pydicom.dataelem.DataElement` values (:issue:`1414`). * Added :func:`~pydicom.dataelem.convert_raw_data_element` for converting raw element data to :class:`~pydicom.dataelem.DataElement` instances. * Added the :mod:`~pydicom.hooks` module which contains an interface for adding callback functions via the :class:`~pydicom.hooks.Hooks` singleton, as well as default and alternative convenience callbacks for :func:`~pydicom.dataelem.convert_raw_data_element` (:issue:`1556`). Fixes ----- * Fixed the GDCM and pylibjpeg handlers changing the *Pixel Representation* value to 0 when the J2K stream disagrees with the dataset and :attr:`~pydicom.config.APPLY_J2K_CORRECTIONS` is ``True`` (:issue:`1689`). * Fixed pydicom codify error when relative path did not exist. * Fixed the VR enum sometimes returning invalid values for Python 3.11+ (:issue:`1874`). * Fixed pixel data handler for Pillow 10.1 raising an AttributeError (:issue:`1907`). * Fixed a possible security issue with :class:`~pydicom.fileset.FileInstance` instances being able to escape the temporary directory when being added to a :class:`~pydicom.fileset.FileSet` (:issue:`1922`). * Fixed an ``AttributeError`` when running :py:func:`~copy.deepcopy` after :meth:`Dataset.update` (:issue:`1816`). * Fixed :func:`~pydicom.encaps.encapsulate_extended` not returning the correct values for odd-length frames (:issue:`1968`). * Fixed using the incorrect encoding when writing datasets converted between explicit and implicit VR when only the *Transfer Syntax UID* was changed (:issue:`1943`). * Fixed the ``jpeg_ls``, ``pillow`` and ``rle`` pixel data handlers not working correctly when a frame is spread across multiple fragments (:issue:`1774`). * Added mitigation for a rare case where clearing the pixel data value prior to updating it may sometimes result in :attr:`~pydicom.dataset.Dataset.pixel_array` returning the previous array instead of creating a new one (:issue:`1983`). * Fixed a ``KeyError`` when comparing codes with one of the codes having ``scheme_designator`` set to ``SRT`` but not being included in the ``SRT`` to ``SCT`` code mapping (:issue:`1994`). * Fixed JPEG-LS datasets with a *Pixel Representation* of 1 returning incorrect image data when *Bits Stored* is less than *Bits Allocated* (:issue:`2009`). * Fixed decoding failures for JPEG-LS datasets with *Bits Allocated* of 16 and *Bits Stored* <= 8 (:issue:`2010`). * Fixed the *Pixel Data* VR not being set correctly with :func:`Dataset.compress() ` (:issue:`2013`). * Fixed :meth:`Dataset.decompress()` not updating the *Pixel Data* element value until after saving (:issue:`2024`). * Fixed a rare issue with converting pixel data to an :class:`~numpy.ndarray` when *Bits Stored* is less than *Bits Allocated* and the unused bits haven't been set to an appropriate value for correct interpretation of the data. * Fixed a ``RecursionError`` when using :func:`copy.deepcopy` with a dataset containing a private block (:issue:`2025`). * Fixed non-unique keywords for the concept codes in ``pydicom.sr`` (:issue:`1388`). * Fixed keywords using Python identifiers in ``pydicom.sr`` (:issue:`1273`). * Fixed being unable to write *LUT Descriptor* when the VR is **SS** and the first value is greater than 32767 (:issue:`2081`). * Fixed *Deflated Explicit VR Little Endian* datasets not working correctly with ``codify`` (:issue:`1937`). Deprecations ------------ * :attr:`Dataset.is_little_endian ` and :attr:`Dataset.is_implicit_VR` will be removed in v4.0. * :attr:`Dataset.read_little_endian` and :attr:`Dataset.read_implicit_vr` will be removed in v4.0, use :attr:`Dataset.original_encoding` instead. * :attr:`Dataset.read_encoding` will be removed in v4.0, use :attr:`Dataset.original_character_set` instead. * The `write_like_original` optional argument to :meth:`Dataset.save_as` and :func:`~pydicom.filewriter.dcmwrite` will be removed in v4.0, use `enforce_file_format` instead. * The following :mod:`~pydicom.encaps` module functions will be removed in v4.0: * :func:`~pydicom.encaps.get_frame_offsets`, use :func:`~pydicom.encaps.parse_basic_offsets` instead. * :func:`~pydicom.encaps.generate_pixel_data_fragment`, use :func:`~pydicom.encaps.generate_fragments` instead. * :func:`~pydicom.encaps.generate_pixel_data_frame`, use :func:`~pydicom.encaps.generate_fragmented_frames` instead. * :func:`~pydicom.encaps.generate_pixel_data`, use :func:`~pydicom.encaps.generate_frames` instead. * :func:`~pydicom.encaps.decode_data_sequence`, use :func:`~pydicom.encaps.generate_fragments` instead. * :func:`~pydicom.encaps.defragment_data`, use :func:`~pydicom.encaps.generate_frames` instead. * :func:`~pydicom.encaps.read_item`, use :func:`~pydicom.encaps.generate_fragments` instead. * The :mod:`pydicom.pixel_data_handlers` module will be removed in v4.0. All pixel data processing will use the :mod:`pydicom.pixels` module instead starting with v3.0. * The following functions from :mod:`pydicom.pixel_data_handlers.util` have been moved to :mod:`pydicom.pixels.processing`: * :func:`~pydicom.pixels.processing.apply_color_lut` * :func:`~pydicom.pixels.processing.apply_modality_lut` * :func:`~pydicom.pixels.processing.apply_rescale` * :func:`~pydicom.pixels.processing.apply_voi_lut` * :func:`~pydicom.pixels.processing.apply_voi` * :func:`~pydicom.pixels.processing.apply_windowing` * :func:`~pydicom.pixels.processing.convert_color_space` * The following functions from :mod:`pydicom.pixel_data_handlers.util` have been moved to :mod:`pydicom.pixels.utils`: * :func:`~pydicom.pixels.utils.expand_ybr422` * :func:`~pydicom.pixels.utils.get_expected_length` * :func:`~pydicom.pixels.utils.get_image_pixel_ids` * :func:`~pydicom.pixels.utils.get_j2k_parameters` * :func:`~pydicom.pixels.utils.get_nr_frames` * :func:`~pydicom.pixels.utils.pack_bits` * :func:`~pydicom.pixels.utils.pixel_dtype` * :func:`~pydicom.pixels.utils.reshape_pixel_array` * :func:`~pydicom.pixels.utils.unpack_bits` * :func:`pydicom.pixel_data_handlers.util.dtype_corrected_for_endianness` will be removed in v4.0. * :meth:`Dataset.convert_pixel_data()` will be removed in v4.0, use :meth:`Dataset.pixel_array_options() ` instead. * :func:`~pydicom.dataelem.DataElement_from_raw` will be removed in v4.0, please use :func:`~pydicom.dataelem.convert_raw_data_element` instead. * :attr:`config.data_element_callback` and :attr:`config.data_element_callback_kwargs` will be removed in v4.0, please use the hooks for :func:`~pydicom.dataelem.convert_raw_data_element` instead. * The ``pydicom.utils.fixers`` submodule will be removed in v4.0, please use the alternative callbacks for :func:`~pydicom.dataelem.convert_raw_data_element` in the :mod:`~pydicom.hooks` module instead. Pydicom Internals ----------------- * Repository folder structure refactored. * Renamed top level ``source`` folder to ``util``. * New CI tools - `dependabot`, and `pre-commit` using black and ruff. pydicom-pydicom-20aa4b7/doc/release_notes/v3.0.1.rst000066400000000000000000000011501515706620200221770ustar00rootroot00000000000000Version 3.0.1 ============= Fixes ----- * Changed logging of missing plugin imports to use :attr:`logging.DEBUG` (:issue:`2128`). * Include all :mod:`~pydicom.examples` module datasets with the package (:issue:`2128`, :issue:`2131`) * Fixed an invalid VR value in the private data dictionary (:issue:`2132`). * Fixed checking for *Bits Stored* when converting *Float Pixel Data* and *Double Float Pixel Data* using the :mod:`~pydicom.pixels` backend (:issue:`2135`). * Fixed decoding of pixel data for images with *Bits Allocated* of 1 when frame boundaries are not aligned with byte boundaries (:issue:`2134`). pydicom-pydicom-20aa4b7/doc/release_notes/v3.0.2.rst000066400000000000000000000002541515706620200222040ustar00rootroot000000000000003.0.2 ===== Fixes ----- * Fixed a security issue: a crafted DICOMDIR could set ``ReferencedFileID`` to a path outside the File-set root. This addresses CVE-2026-32711. pydicom-pydicom-20aa4b7/doc/tutorials/000077500000000000000000000000001515706620200200215ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/tutorials/contributing.rst000066400000000000000000000020441515706620200232620ustar00rootroot00000000000000 Contributing to pydicom ======================= If you're interested in contributing to *pydicom* there are many ways to help out: * Adding new features, improving existing ones or submitting bug fixes for the source code * Reporting bugs, suggesting improvements or requesting features on the :gh:`issue tracker `. * Reviewing :gh:`existing pull requests ` on GitHub. * Improving the documentation, whether by fixing typos, contributing new material or adding code examples. No change is too small. * Answering (or asking!) questions on `stackoverflow `_, the `Google groups page `_, or :gh:`GitHub `. If it's your first time contributing to *pydicom* then we have a general :gh:`guide for contributing`, as well as tutorials for: * :doc:`Contributing a source code patch ` * :doc:`Contributing a documentation change ` pydicom-pydicom-20aa4b7/doc/tutorials/contributing_code.rst000066400000000000000000000235161515706620200242630ustar00rootroot00000000000000================================= Contributing a source code change ================================= This tutorial will take you through the process of: * Downloading the current source code * Installing required libraries (if any) * Running the test suite * Creating a new git branch * Making a change and documenting it * Previewing your changes * Committing the changes and making a pull request Download the current source code ================================ 1. Sign up to `GitHub `_ and :gh:`fork pydicom ` 2. Install `Git `_. If you're new to Git, the Django project has a good introduction on `working with Git and GitHub `_. You can also take a look at the `GitHub branch-based workflow `_ 3. Using the command line, ``cd`` to the directory where you want your local copy of *pydicom* to live. The source code can then be downloaded using:: $ git clone https://github.com/YourUsername/pydicom.git 4. Install the cloned copy of *pydicom* (``-e`` for editable mode):: $ pip install -e pydicom/ (Optional) Install required libraries ===================================== If you're making changes to one of the pixel data handlers you'll need to install `NumPy `_ as well as the library the handler is based on. For example, if you're working on the :mod:`~pydicom.pixel_data_handlers.pillow_handler` you'll also need to install `Pillow `_:: $ pip install numpy pillow See the :doc:`installation page` for details on installing the optional libraries. Install pytest and run the test suite ===================================== When making changes to *pydicom* it's important that your changes don't accidentally introduce bugs into other areas of the code. In order to check that everything still works afterwards, you should run our test suite, which is based on `pytest `_. Install and run pytest:: $ pip install pytest $ cd pydicom/tests $ pytest While the tests are running you'll see a filename followed by a stream of characters that represent the result of each test. A dot means the test passed, **F** indicates a failure, **E** that an error occurred during the test, **s** that the test was skipped (usually due to a missing optional library) and **x** that the test failed as expected. Once the tests are complete you should get a short summary of the results. At this stage the entire test suite *should* pass. If you get any failures or errors you should check the :gh:`issue tracker ` for any relevant issues or create a new one if there are none. Create a new branch =================== Create a new branch ``new-uid`` for your changes (you can choose any name that you want instead). Any changes made in this branch will be specific to it and won't affect the main copy (the ``main`` branch) of the code:: $ git checkout -b new-uid Write tests for your changes ============================ If a change is to be accepted into *pydicom* it usually has to include tests. For bug fixes you should write a regression test that reproduces the bug. For new features you'll need to include tests that ensure the features work as intended. .. note:: If you've never had to write tests before they can seem pretty daunting, especially if you're also learning how to use pytest from scratch. You may find the following resources useful: * Take a look at the :gh:`existing pydicom test suite ` and see how the tests are written. There are examples for writing :gh:`a single test `, :gh:`a group of related tests `, :gh:`testing for exceptions `, :gh:`capturing log output `, :gh:`testing for warnings `, and running :gh:`parametrized tests `. * Dive Into Python has a very nice `section on unit testing `_ (however it uses ``unittest`` instead of pytest). * The `pytest documentation `_ may also be helpful If you're still having trouble writing a test for something, once you've created a pull request (to be discussed a bit later) add a comment asking for help. Let's say we wanted to add a new `pre-defined UID `_ to *pydicom* with a value of ``1.2.3.4.500``. We'd first add a new test at the bottom of :gh:`test_uid.py `:: def test_new_uid(): """Test uid.NewDefinedUID.""" from pydicom.uid import NewDefinedUID assert '1.2.3.4.500' == NewDefinedUID Since we haven't made any modification to the actual source code, when we run the tests we should get a failure:: $ pytest test_uid.py :: def test_new_uid(): """Test uid.NewDefinedUID.""" > from pydicom.uid import NewDefinedUID E ImportError: cannot import name 'NewDefinedUID' test_uid.py:380: ImportError If all the tests passed then make sure you've added the test to the correct file and that the test itself is written correctly. Make a code change and document it ================================== Next we'll make changes to the actual source code. Open :gh:`uid.py ` in a text editor and around :gh:`line 236 ` make the following changes:: RLELossless = UID('1.2.840.10008.1.2.5') """1.2.840.10008.1.2.5""" # **Add this** NewDefinedUID = UID('1.2.3.4.500') """1.2.3.4.500""" The line ``"""1.2.3.4.500"""`` is the `docstring `_ for our new UID. In order for it to be included in the API reference documentation we'll also need to update :gh:`uid.rst `:: JPEG2000MultiComponentLossless JPEG2000MultiComponent RLELossless NewDefinedUID When making changes, and especially when adding new features, it's important that they're documented. It's very difficult for users to find and understand how to use code that hasn't been documented, or whose documentation contains errors. For more information on how to properly document *pydicom* see :doc:`writing documentation`. Now we run the tests again so we can see whether or not the code we added is working:: $ pytest test_uid.py Everything should pass. If it doesn't, make sure you've correctly added the new UID. Once you're happy that the tests in ``test_uid.py`` are working you should make sure the entire test suite passes:: $ pytest Preview your changes ==================== It's a good idea to go through all the changes you've made by first staging and then displaying the difference between the current copy and the initial version we first checked out with:: $ git add --all $ git diff --cached You can scroll through the output using the up and down keys and quit with **q**. Lines with a **-** in front will be removed and lines with a **+** added. If everything looks good then it's time to commit the changes. Commit your changes and make a pull request =========================================== To commit the changes:: $ git commit This will open a text editor so you can add the commit message. Alternatively, if you only want a short commit message you can do:: $ git commit -m "Add NewDefinedUID" Which will commit with the message *"Add NewDefinedUID"*. After committing the patch, send it to your fork:: $ git push origin new-uid You can create a pull request by visiting the :gh:`pydicom GitHub page ` where you should see your branch under *"Your recently push branches"*. Click *"Compare & pull request"* and fill out the title (with a ``[WIP]`` prefix, i.e. ``[WIP] Add NewDefinedUID to uid.py``) and follow the instructions in the main entry window. To submit the pull request (PR) for real - **please don't do this for this example!** - then on the next page you would click *"Create pull request"*. Creating the PR would automatically start our checks; that the tests pass and the test coverage is good, that the documentation builds OK, etc. If all the checks passed and you were happy with your changes, you'd change the PR title prefix to ``[MRG]``. This would indicate that you considered the PR ready to be reviewed and merged into the main branch. You could also ask for a review or help at any point after creating the PR. What happens next? ================== One or more reviewers would look at your pull request and may make suggestions, ask for clarification or request changes. Once the reviewers were happy, the pull request would be approved and your changes merged into the ``main`` branch where they would become part of *pydicom*. However, because this is just an example, all we're going to do is clean up the changes we've made. First we switch back to the ``main`` branch:: $ git checkout main We delete the local copy of the branch we created:: $ git branch -d new-uid And lastly we delete the remote copy on GitHub. Go to ``https://github.com/YourUsername/pydicom/branches``, find the ``new-uid`` branch and click the corresponding red bin icon. All done! pydicom-pydicom-20aa4b7/doc/tutorials/contributing_docs.rst000066400000000000000000000217611515706620200243010ustar00rootroot00000000000000=================================== Contributing a documentation change =================================== This tutorial will take you through the process of: * Downloading the current documentation * Installing required libraries * Building and previewing the documentation * Creating a new git branch * Making a change to the documentation * Committing the changes and making a pull request Download the documentation ========================== 1. Sign up to `GitHub `_ and :gh:`fork pydicom ` 2. Install `Git `_. If you're new to Git, the Django project has a good introduction on `working with Git and GitHub `_. You can also take a look at the `GitHub branch-based workflow `_ 3. Using the command line, ``cd`` to the directory where you want your local copy of *pydicom* to live. The documentation can then be downloaded using:: git clone https://github.com/YourUsername/pydicom.git 4. Install the cloned copy of *pydicom* and the dependencies requires for building the documentation (using ``-e`` for an editable install):: pip install -e pydicom[docs] Build and preview the documentation =================================== *pydicom's* documentation consists of a series of `reStructuredText `_ (reST) files located in the project's ``pydicom/doc`` directory which are converted to HTML using `Sphinx `_ during our build process. To build the documentation locally, navigate to the ``doc`` directory and run ``make html``:: cd pydicom/doc make html Occasionally you may need to clean up the generated files before a change gets applied:: $ make clean && make html The HTML generated by the build can be viewed by opening ``_build/html/index.html`` in a web browser or by doing:: cd _build/html python -m http.server 9999 And then going to http://localhost:9999 Create a new branch =================== Create a new branch ``doc-tut`` for your changes (you can choose any name that you want instead). Any changes made in this branch will be specific to it and won't affect the main copy (the ``main`` branch) of the documentation:: git checkout -b doc-tut Make a change to the documentation ================================== Let's add a new guide on how to read a DICOM file. Create a new ``reading.rst`` file in ``doc/tutorials``, open it in a text editor and add in a title and some text:: =================== Reading DICOM files =================== In this tutorial we will be reading a DICOM file using *pydicom*. Save it and build the documentation (``make html``). You should see a warning in the build output, which we'll ignore for now: .. code-block:: text checking consistency... [/path/to]/pydicom/doc/tutorials/reading.rst: WARNING: document isn't included in any toctree Open the file ``_build/html/tutorials/reading.html`` in your browser (if you're not using the Python ``http.server`` command) or `here `__ (if you are). Your new page should be visible. The reason we got the warning above is because the page itself hasn't been included in Sphinx's table of contents (the ``toctree``), which Sphinx uses to map the relationship between pages in the documentation. It's not a requirement that a page be included in the ``toctree``, but it's a good idea. To make our new page a bit easier to find we'll include a link to it in ``tutorials/index.rst``, which will also include it in the ``toctree``:: .. toctree:: :maxdepth: 1 installation virtualenvs contributing_code contributing_docs reading .. |rarr| unicode:: U+2192 .. RIGHTWARDS ARROW If you rebuild the HTML you should find that the warning is gone and that your new page is reachable from the main documentation page (on the left under "Documentation": Tutorials |rarr| Reading DICOM files). Next we'll expand our page a bit to show off how to use some of the reST markup:: =================== Reading DICOM files =================== In this tutorial we will be reading a DICOM file using `pydicom `_. The tasks you'll be doing will include: * Installing *pydicom* * Reading a :dcm:`DICOM dataset` * Printing an element Installing pydicom ================== See the :doc:`Installation guide` on how to install *pydicom*. Reading a DICOM dataset ======================= In a command window start a new **Python** session:: $ python Python 3.6.5 (default, Apr 1 2018, 05:46:30) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. .. note:: Your Python version may be different *pydicom* includes a number of files which can be accessed through the :func:`~pydicom.data.get_testdata_file` function. To read the file ``CT_small.dcm`` we use :func:`~pydicom.filereader.dcmread`:: >>> from pydicom import dcmread >>> from pydicom.data import get_testdata_file >>> path = get_testdata_file("CT_small.dcm") >>> path '[path/to]/pydicom/data/test_files/CT_small.dcm' >>> ds = dcmread(path) Printing an element =================== To get a :class:`list` of keywords for all the elements in the top level of the dataset you can do: >>> ds.dir() ['AccessionNumber', 'AcquisitionData', ..., 'PatientName', ..., 'XRayTubeCurrent'] To :func:`print` the value of the (0010,0010) *Patient Name* element: >>> print(ds.PatientName) CompressedSamples^CT1 To print the element itself: >>> print(ds['PatientName']) (0010, 0010) Patient's Name PN: 'CompressedSamples^CT1' If you need help with the reST markup then you can: * Take a look at the existing documentation to see how it was created * Check out Sphinx's `reStructuredText primer `_ There are also a number of directives that tell Sphinx to do certain things (like inserting code blocks or a table of contents). Sphinx has a list of these `here `_. For more information on writing documentation for *pydicom*, see :doc:`writing documentation`. Just like before, you should build and preview the updated page. When you're happy with the results move on to the next section. Commit your changes and make a pull request =========================================== First we add our new file to git:: git add tutorials/reading.rst And then stage the remaining changes (``-a``) and commit at the same time:: git commit -am "Add documentation on reading a DICOM file" After committing the changes, send them to your fork:: git push origin doc-tut You can create a pull request by visiting the :gh:`pydicom GitHub page ` where you should see your branch under *"Your recently push branches"*. Click *"Compare & pull request"* and fill out the title (with a ``[WIP]`` prefix, i.e. ``[WIP] Add documentation of reading a DICOM file``) and follow the instructions in the main entry window. To submit the pull request (PR) for real - **please don't do this for this example!** - then on the next page you would click *"Create pull request"*. Creating the PR would automatically start the documentation build checks which would be visible at the bottom of the PR as the `CircleCI `_ check. Depending on when you view it, the check would either be in progress, have passed or failed. The details of the CircleCI build could be seen by clicking on "Details" If the build was successful then the Artifacts tab would be visible (which may require signing into CircleCI). The artifacts are the generated HTML files and can be used to preview the results of the build by clicking Artifacts |rarr| ``circleci/project/doc/_build/html/index.html`` If all the checks passed and you were happy with your changes, you'd change the PR title prefix to ``[MRG]``. This would indicate that you considered the PR ready to be reviewed and merged into the main branch. What happens next? ================== One or more reviewers would look at your pull request and may make suggestions, ask for clarification or request changes. Once the reviewers were happy, the pull request would be approved and your changes merged into the ``main`` branch where they would become part of *pydicom*. However, because this is just an example, all we're going to do is clean up the changes we've made. First we switch back to the ``main`` branch:: git checkout main We delete the local copy of the branch we created:: git branch -d doc-tut And lastly we delete the remote copy on GitHub. Go to ``https://github.com/YourUsername/pydicom/branches``, find the ``doc-tut`` branch and click the corresponding red bin icon. All done! pydicom-pydicom-20aa4b7/doc/tutorials/dataset_basics.rst000066400000000000000000000535101515706620200235300ustar00rootroot00000000000000=========================================== Dataset basics: read, access, modify, write =========================================== In this tutorial we're going to cover the basics of using *pydicom*: * Reading a DICOM dataset from file * Viewing and accessing the contents of the dataset * Modifying the dataset by adding, changing and deleting elements * Writing our modifications back to file If you haven't installed *pydicom* yet, follow the instructions in our :doc:`installation guide`. Getting the path to the example dataset ======================================= In the tutorial we're going to be using one of the example DICOM datasets included with *pydicom*: :gh:`CT_small.dcm`. You can get the file path to the dataset by using the :func:`~pydicom.examples.get_path` function to return the path as a :class:`pathlib.Path` (your path may vary):: >>> from pydicom import examples >>> path = examples.get_path("ct") >>> path PosixPath('/path/to/pydicom/data/test_files/CT_small.dcm') Reading ======= To read the DICOM dataset at a given file path (as a :class:`str` or :class:`pathlib.Path`) we use :func:`~pydicom.filereader.dcmread`, which returns a :class:`~pydicom.dataset.FileDataset` instance:: >>> from pydicom import dcmread, examples >>> path = get_path("ct") >>> ds = dcmread(path) :func:`~pydicom.filereader.dcmread` can also handle file-likes:: >>> with open(path, 'rb') as infile: ... ds = dcmread(infile) And can even be used as a context manager:: >>> with dcmread(path) as ds: ... type(ds) ... By default, :func:`~pydicom.filereader.dcmread` will read any DICOM dataset stored in accordance with the :dcm:`DICOM File Format`. However, occasionally you may try to read a file that gives you the following exception: .. code-block:: pycon >>> no_meta_path = examples.get_path('no_meta') >>> ds = dcmread(no_meta_path) Traceback (most recent call last): File "", line 1, in File ".../pydicom/filereader.py", line 887, in dcmread force=force, specific_tags=specific_tags) File ".../pydicom/filereader.py", line 678, in read_partial preamble = read_preamble(fileobj, force) File ".../pydicom/filereader.py", line 631, in read_preamble raise InvalidDicomError("File is missing DICOM File Meta Information " pydicom.errors.InvalidDicomError: File is missing DICOM File Meta Information header or the 'DICM' prefix is missing from the header. Use force=True to force reading. This indicates that either: * The file isn't a DICOM file, or * The file isn't in the DICOM File Format but contains DICOM data If you're sure that the file contains DICOM data then you can use the `force` keyword parameter to force reading:: >>> ds = dcmread(no_meta_path, force=True) A note of caution about using ``force=True``; because *pydicom* uses a deferred-read system, **no exceptions** will be raised at the time of reading, no matter what the contents of the file are: .. code-block:: pycon >>> with open('not_dicom.txt', 'w') as not_dicom: ... not_dicom.write('This is not a DICOM file!') >>> ds = dcmread('not_dicom.txt', force=True) You'll only run into problems when trying to use the dataset:: >>> print(ds) Traceback (most recent call last): File "", line 1, in File "../pydicom/dataset.py", line 1703, in __str__ return self._pretty_str() File "../pydicom/dataset.py", line 1436, in _pretty_str for data_element in self: File "../pydicom/dataset.py", line 1079, in __iter__ yield self[tag] File "../pydicom/dataset.py", line 833, in __getitem__ self[tag] = DataElement_from_raw(data_elem, character_set) File "../pydicom/dataelem.py", line 581, in DataElement_from_raw raise KeyError(msg) KeyError: "Unknown DICOM tag (6854, 7369) can't look up VR" Viewing and accessing ===================== The ``CT_small.dcm`` dataset is also included as an example dataset: >>> from pydicom import examples >>> ds = examples.ct >>> type(ds) You can view the contents of the entire dataset by using :func:`print`:: >>> print(ds) Dataset.file_meta ------------------------------- (0002, 0000) File Meta Information Group Length UL: 192 (0002, 0001) File Meta Information Version OB: b'\x00\x01' (0002, 0002) Media Storage SOP Class UID UI: CT Image Storage (0002, 0003) Media Storage SOP Instance UID UI: 1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 (0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian (0002, 0012) Implementation Class UID UI: 1.3.6.1.4.1.5962.2 (0002, 0013) Implementation Version Name SH: 'DCTOOL100' (0002, 0016) Source Application Entity Title AE: 'CLUNIE1' ------------------------------------------------- (0008, 0005) Specific Character Set CS: 'ISO_IR 100' (0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL'] (0008, 0012) Instance Creation Date DA: '20040119' (0008, 0013) Instance Creation Time TM: '072731' (0008, 0014) Instance Creator UID UI: 1.3.6.1.4.1.5962.3 (0008, 0016) SOP Class UID UI: CT Image Storage ... (0010, 1002) Other Patient IDs Sequence 2 item(s) ---- (0010, 0020) Patient ID LO: 'ABCD1234' (0010, 0022) Type of Patient ID CS: 'TEXT' --------- (0010, 0020) Patient ID LO: '1234ABCD' (0010, 0022) Type of Patient ID CS: 'TEXT' --------- ... (0043, 104e) [Duration of X-ray on] FL: 10.60060977935791 (7fe0, 0010) Pixel Data OW: Array of 32768 elements (fffc, fffc) Data Set Trailing Padding OB: Array of 126 elements The print output shows a list of the :dcm:`data elements ` (or *elements* for short) present in the dataset, one element per line. The format of each line is: * **(0008, 0005)**: The element's :dcm:`tag`, as (group number, element number) in hexadecimal * **Specific Character Set**: the element's name, if known * **CS**: The element's :dcm:`Value Representation` (VR), if known * **'ISO_IR_100'**: the element's stored value Elements -------- There are three categories of elements: * **Standard elements** such as (0008,0016) *SOP Class UID*. These elements are registered in the official DICOM Standard, have an even group number and are unique at each level of the dataset. * **Repeating group elements** such as (60xx,3000) *Overlay Data* (not found in this dataset). :dcm:`Repeating group` elements are also registered in the official DICOM Standard, however they have a group number defined over a range rather than a fixed value. For example, there may be multiple *Overlay Data* elements at a given level of the dataset as long as each has its own unique group number; ``0x6000``, ``0x6002``, ``0x6004``, or any even value up to ``0x601E``. * **Private elements** such as (0043,104E) *[Duration of X-ray on]*. :dcm:`Private elements` have an odd group number, aren't registered in the official DICOM Standard, and are instead created privately, as specified by the (gggg,0010) *Private Creator* element. * If the private creator is unknown then the element name will be *Private tag data* and the VR **UN**. * If the private creator is known then the element name will be surrounded by square brackets, e.g. *[Duration of X-ray on]* and the VR will be as shown. For all element categories, we can access a particular element in the dataset through its tag, which returns a :class:`~pydicom.dataelem.DataElement` instance:: >>> elem = ds[0x0008, 0x0016] >>> elem (0008, 0016) SOP Class UID UI: CT Image Storage >>> elem.keyword 'SOPClassUID' >>> private_elem = ds[0x0043, 0x104E] >>> private_elem (0043, 104e) [Duration of X-ray on] FL: 10.60060977935791 >>> private_elem.keyword '' We can also access standard elements through their *keyword*. The keyword is usually the same as the element's name without any spaces, but there are exceptions - such as (0010,0010) *Patient's Name* having a keyword of *PatientName*. A list of keywords for all standard elements can be found :dcm:`here`. :: >>> elem = ds['SOPClassUID'] >>> elem (0008, 0016) SOP Class UID UI: CT Image Storage Because of the lack of a unique keyword, this won't work for private or repeating group elements. So for those elements stick to the ``Dataset[group number, element number]`` method. In most cases, the important thing about an element is its value:: >>> elem.value '1.2.840.10008.5.1.4.1.1.2' For standard elements, you can use the Python dot notation with the keyword to get the value:: >>> ds.SOPClassUID '1.2.840.10008.5.1.4.1.1.2' This is the recommended method of accessing the value of standard elements. It's simpler and more human-friendly then dealing with element tags and later on you'll see how you can use the keyword to do more than accessing the value. Elements may also be multi-valued (have a :dcm:`Value Multiplicity ` (VM) > 1):: >>> ds.ImageType ['ORIGINAL', 'PRIMARY', 'AXIAL'] >>> ds['ImageType'].VM 3 The items for multi-valued elements can be accessed using the standard Python :class:`~list` methods:: >>> ds.ImageType[1] 'PRIMARY' Sequences --------- When viewing a dataset, you may see that some of the elements are indented:: >>> print(ds) ... (0010, 1002) Other Patient IDs Sequence 2 item(s) ---- (0010, 0020) Patient ID LO: 'ABCD1234' (0010, 0022) Type of Patient ID CS: 'TEXT' --------- (0010, 0020) Patient ID LO: '1234ABCD' (0010, 0022) Type of Patient ID CS: 'TEXT' --------- ... This indicates that those elements are part of a sequence, in this case part of the *Other Patient IDs Sequence* element. Sequence elements have a VR of **SQ** and they usually have the word *Sequence* in their name. DICOM datasets use the `tree data structure `_, with non-sequence elements acting as leaves and sequence elements acting as the nodes where branches start. * The top-level (root) dataset contains 0 or more elements (leaves): * An element may be non-sequence type (VR is not **SQ**), or * An element may be a sequence type (VR is **SQ**), contains 0 or more items (branches): * Each item in the sequence is another dataset, containing 0 or more elements: * An element may be non-sequence type, or * An element may be a sequence type, and so on... Sequence elements can be accessed in the same manner as non-sequence ones:: >>> seq = ds[0x0010, 0x1002] >>> seq = ds['OtherPatientIDsSequence'] The main difference between sequence and non-sequence elements is that their value is a list of zero or more :class:`~pydicom.dataset.Dataset` objects, which can be accessed using the standard Python :class:`list` methods:: >>> len(ds.OtherPatientIDsSequence) 2 >>> type(ds.OtherPatientIDsSequence[0]) >>> ds.OtherPatientIDsSequence[0] (0010, 0020) Patient ID LO: 'ABCD1234' (0010, 0022) Type of Patient ID CS: 'TEXT' >>> ds.OtherPatientIDsSequence[1] (0010, 0020) Patient ID LO: '1234ABCD' (0010, 0022) Type of Patient ID CS: 'TEXT' file_meta --------- Earlier we saw that by default :func:`~pydicom.filereader.dcmread` only reads files that are in the DICOM File Format. So what's the difference between a DICOM dataset written to file and one written in the DICOM File Format? The answer is a file header containing: * An 128 byte preamble:: >>> ds.preamble b'II*\x00T\x18\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00... * Followed by a 4 byte ``DICM`` prefix * Followed by the required DICOM :dcm:`File Meta Information ` elements, which in *pydicom* are stored in a :class:`~pydicom.dataset.FileMetaDataset` instance in the :attr:`~pydicom.dataset.FileDataset.file_meta` attribute:: >>> ds.file_meta (0002, 0000) File Meta Information Group Length UL: 192 (0002, 0001) File Meta Information Version OB: b'\x00\x01' (0002, 0002) Media Storage SOP Class UID UI: CT Image Storage (0002, 0003) Media Storage SOP Instance UID UI: 1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 (0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian (0002, 0012) Implementation Class UID UI: 1.3.6.1.4.1.5962.2 (0002, 0013) Implementation Version Name SH: 'DCTOOL100' (0002, 0016) Source Application Entity Title AE: 'CLUNIE1' As you can see, all the elements in the ``file_meta`` are group ``0x0002``. In fact, the DICOM File Format header is the only place you should find group ``0x0002`` elements as their presence anywhere else is non-conformant. Out of all of the elements in the ``file_meta``, the most important is (0002,0010) *Transfer Syntax UID*, as the :dcm:`transfer syntax ` defines the way the entire dataset (including the pixel data) has been encoded. Chances are that at some point you'll need to know it:: >>> ds.file_meta.TransferSyntaxUID '1.2.840.10008.1.2.1' >>> ds.file_meta.TransferSyntaxUID.name 'Explicit VR Little Endian' Modifying ========= Modifying elements ------------------ We can modify the value of any element by retrieving it and setting the value:: >>> elem = ds[0x0010, 0x0010] >>> elem.value 'CompressedSamples^CT1' >>> elem.value = 'Citizen^Jan' >>> elem (0010, 0010) Patient's Name PN: 'Citizen^Jan' But for standard elements it's simpler to use the keyword:: >>> ds.PatientName = 'Citizen^Snips' >>> elem (0010, 0010) Patient's Name PN: 'Citizen^Snips' Multi-valued elements can be set using a :class:`list` or modified using the :class:`list` methods:: >>> ds.ImageType = ['ORIGINAL', 'PRIMARY', 'LOCALIZER'] >>> ds.ImageType ['ORIGINAL', 'PRIMARY', 'LOCALIZER'] >>> ds.ImageType[1] = 'DERIVED' >>> ds.ImageType ['ORIGINAL', 'DERIVED', 'LOCALIZER'] >>> ds.ImageType.insert(1, 'PRIMARY') >>> ds.ImageType ['ORIGINAL', 'PRIMARY', 'DERIVED', 'LOCALIZER'] Similarly, for sequence elements:: >>> from pydicom.dataset import Dataset >>> ds.OtherPatientIDsSequence = [Dataset(), Dataset()] >>> ds.OtherPatientIDsSequence.append(Dataset()) >>> len(ds.OtherPatientIDsSequence) 3 As mentioned before, the items in a sequence are :class:`~pydicom.dataset.Dataset` instances. If you try to add any other type to a sequence you'll get an exception:: >>> ds.OtherPatientIDsSequence.append('Hello world?') Traceback (most recent call last): File "", line 1, in File ".../pydicom/multival.py", line 63, in append self._list.append(self.type_constructor(val)) File ".../pydicom/sequence.py", line 15, in validate_dataset raise TypeError('Sequence contents must be Dataset instances.') TypeError: Sequence contents must be Dataset instances. You can set any element value as empty by using ``None`` (sequence elements will automatically be converted to an empty list when you do so):: >>> ds.PatientName = None >>> elem (0010, 0010) Patient's Name PN: None >>> ds.OtherPatientIDsSequence = None >>> len(ds.OtherPatientIDsSequence) 0 Elements with a value of ``None``, ``b''``, ``''`` or ``[]`` will still be written to file, but will have an empty value and zero length. Adding elements --------------- Any category ~~~~~~~~~~~~ New elements of any category can be added to the dataset with the :meth:`~pydicom.dataset.Dataset.add_new` method, which takes the tag, VR and value to use for the new element. Let's say we wanted to add the (0028,1050) *Window Center* standard element. We already know the tag is (0028,1050), but how we get the VR and how do we know the Python :class:`type` to use for the value? There are two ways to get an element's VR: * You can use :dcm:`Part 6 of the DICOM Standard` and search for the element * Alternatively, you can use the :func:`~pydicom.datadict.dictionary_VR` function to look it up :: >>> from pydicom.datadict import dictionary_VR >>> dictionary_VR([0x0028, 0x1050]) 'DS' The Python type to use for a given VR is given by :doc:`this table `. For **DS** we can use a :class:`str`, :class:`int` or :class:`float`, so to add the new element:: >>> ds.add_new([0x0028, 0x1050], 'DS', "100.0") >>> elem = ds[0x0028, 0x1050] >>> elem (0028, 1050) Window Center DS: "100.0" Standard elements ~~~~~~~~~~~~~~~~~ Adding elements with :meth:`~pydicom.dataset.Dataset.add_new` is a lot of work, so for standard elements you can just use the keyword and *pydicom* will do the lookup for you:: >>> 'WindowWidth' in ds False >>> ds.WindowWidth = 500 >>> ds['WindowWidth'] (0028, 1051) Window Width DS: "500.0" Notice how we can also use the element keyword with the Python :func:`in` operator to see if a standard element is in the dataset? This also works with element tags, so private and repeating group elements are also covered:: >>> [0x0043, 0x104E] in ds True Sequences ~~~~~~~~~ Because sequence items are also :class:`~pydicom.dataset.Dataset` instances, you can use the same methods on them as well. >>> seq = ds.OtherPatientIDsSequence >>> seq += [Dataset(), Dataset(), Dataset()] >>> seq[0].PatientID = 'Citizen^Jan' >>> seq[0].TypeOfPatientID = 'TEXT' >>> seq[1].PatientID = 'CompressedSamples^CT1' >>> seq[1].TypeOfPatientID = 'TEXT' >>> seq[0] (0010, 0020) Patient ID LO: 'Citizen^Jan' (0010, 0022) Type of Patient ID CS: 'TEXT' >>> seq[1] (0010, 0020) Patient ID LO: 'CompressedSamples^CT1' (0010, 0022) Type of Patient ID CS: 'TEXT' Deleting elements ----------------- All elements can be deleted with the :func:`del` operator in combination with the element tag:: >>> del ds[0x0043, 0x104E] >>> [0x0043, 0x104E] in ds False For standard elements you can use the keyword instead:: >>> del ds.WindowCenter >>> 'WindowCenter' in ds False And you can remove items from sequences and multi-valued elements using your preferred :class:`list` method:: >>> del ds.OtherPatientIDsSequence[2] >>> len(seq) 2 >>> del ds.ImageType[2] >>> ds.ImageType ['ORIGINAL', 'PRIMARY', 'LOCALIZER'] Writing ======= After changing the dataset, the final step is to write the modifications back to file. This can be done by using :meth:`~pydicom.dataset.Dataset.save_as` to write the dataset to the supplied path:: >>> ds.save_as('out.dcm') You can also write to any Python file-like:: >>> with open('out.dcm', 'wb') as outfile: ... ds.save_as(outfile) ... :: >>> from io import BytesIO >>> out = BytesIO() >>> ds.save_as(out) By default, :meth:`~pydicom.dataset.Dataset.save_as` will write the dataset as-is. This means that even if your dataset is not conformant to the :dcm:`DICOM File Format` it will still be written exactly as given. To be certain you're writing the dataset in the DICOM File Format you can use the `enforce_file_format` keyword parameter:: >>> ds.save_as('out.dcm', enforce_file_format=True) This will attempt to automatically add in any missing required group ``0x0002`` File Meta Information elements and set a blank 128 byte preamble (if required). If it's unable to do so then an exception will be raised: .. code-block:: pycon >>> del ds.file_meta >>> ds.save_as('out.dcm', enforce_file_format=True) Traceback (most recent call last): File "", line 1, in File ".../pydicom/dataset.py", line 2452, in save_as pydicom.dcmwrite( File ".../pydicom/filewriter.py", line 1311, in dcmwrite validate_file_meta(file_meta, enforce_standard=True) File ".../pydicom/dataset.py", line 3204, in validate_file_meta raise AttributeError( AttributeError: Required File Meta Information elements are either missing or have an empty value: (0002,0010) Transfer Syntax UID The exception message contains the required element(s) that need to be added, usually this will only be the *Transfer Syntax UID*. It's an important element, so get in the habit of making sure it's there and correct. Because we deleted the :attr:`~pydicom.dataset.FileDataset.file_meta` dataset we need to add it back:: >>> ds.file_meta = FileMetaDataset() And now we can add our *Transfer Syntax UID* element and save to file:: >>> ds.file_meta.TransferSyntaxUID = '1.2.840.10008.1.2.1' >>> ds.save_as('out.dcm', enforce_file_format=True) And we're done. Next steps ========== Congratulations, you're now familiar with the basics of using *pydicom* to read, access, modify and write DICOM datasets. Next up you may be interested in looking at our :doc:`User Guide` or some of our :doc:`examples`. pydicom-pydicom-20aa4b7/doc/tutorials/dicom_json.rst000066400000000000000000000100311515706620200226720ustar00rootroot00000000000000============================ Introduction to JSON support ============================ Starting in *pydicom* version 1.3, some support for converting DICOM data to and from JSON format has been added. This support is considered to be in beta state, and the API is still subject to change. Support for the JSON format has been added to the DICOM Standard in Part 18 as the :dcm:`DICOM JSON Model`. The standard describes how different DICOM value representations can be encoded in JSON. Converting a dataset into JSON format ===================================== *pydicom* supports the conversion of a DICOM dataset both into a JSON string and into a deserialized JSON dictionary: >>> import pydicom >>> ds = pydicom.examples.ct >>> ds.to_json() '{"00080005": {"Value": ["ISO_IR 100"], "vr": "CS"}, "00080008": {"Value":... >>> ds.to_json_dict() {"00080005": {"Value": ["ISO_IR 100"], "vr": "CS"}, "00080008": {"Value":... Which of these methods you need depends on your use case. The JSON string format created by :func:`~pydicom.dataset.Dataset.to_json` can be used in low-level APIs to serialize the dataset. Higher-level Python APIs (like Django) often work directly with Python dictionaries deserialized from a JSON string instead, so :func:`~pydicom.dataset.Dataset.to_json_dict` can be more convenient here. Creating a dataset from JSON ============================ Similar, a dataset can be created both from a JSON string and from a JSON dictionary. There is only a single function to handle both cases: >>> from pydicom.dataset import Dataset >>> Dataset.from_json('{"00080005": {"Value": ["ISO_IR 100"], "vr": "CS"}}') (0008, 0005) Specific Character Set CS: u'ISO_IR 100' >>> Dataset.from_json({"00080005": {"Value": ["ISO_IR 100"], "vr": "CS"}}) (0008, 0005) Specific Character Set CS: u'ISO_IR 100' The conversion in both directions is symmetric: >>> import pydicom >>> ds = pydicom.examples.ct >>> ds_json = ds.to_json() >>> ds1 = pydicom.dataset.Dataset.from_json(ds_json) >>> assert ds == ds1 Working with large binary data ============================== Large binary data can be handled in two ways. It can be encoded :dcm:`inline` as a base64-encoded string, or it can be accessed via a :dcm:`BulkDataURI` provided in the JSON data, that provides the possibility to retrieve the data using the `DICOMweb WADO-RS `_ standard. If you don't provide additional arguments to the encoding functions, the data is encoded inline. If you want to save or retrieve data using DICOMweb WADO-RS, you have to provide a bulk data handler. On writing JSON data, the bulk data handler is responsible to store the data so it can be retrieved via the ``BulkDataURI`` saved in the JSON dataset. Note that only data greater than ``bulk_data_threshold`` (by default set to 1024) is handled by the bulk data handler - smaller data is encoded inline. >>> import pydicom >>> def bulk_data_handler(data_element): >>> uri = store_data_and_return_uri(data_element) >>> return uri >>> >>> ds = pydicom.examples.ct >>> ds_json = ds.to_json(bulk_data_element_handler=bulk_data_handler) On reading JSON data, the handler must be able to retrieve the data using the stored ``BulkDataURI``: >>> def bulk_data_reader(bulk_data_uri): >>> return data_retrieved_via_uri(bulk_data_uri) >>> >>> json_data = { >>> "00091002": {"vr": "OB", "BulkDataURI": "https://my.wado.org/123"} >>> } >>> ds = Dataset.from_json(json_data, bulk_data_uri_handler=bulk_data_reader) or, if you need to also know the tag and the vr, in addition to the stored ``BulkDataURI``: >>> def bulk_data_reader(tag, vr, bulk_data_uri): >>> return data_retrieved_for_tag_and_vr_via_uri(tag, vr, bulk_data_uri) >>> >>> json_data = { >>> "00091002": {"vr": "OB", "BulkDataURI": "https://my.wado.org/123"} >>> } >>> ds = Dataset.from_json(json_data, bulk_data_uri_handler=bulk_data_reader) pydicom-pydicom-20aa4b7/doc/tutorials/filesets.rst000066400000000000000000000457141515706620200224040ustar00rootroot00000000000000============================ DICOM File-sets and DICOMDIR ============================ This tutorial is about DICOM File-sets and covers: * An introduction to DICOM File-sets and the DICOMDIR file * Loading a File-set using the :class:`~pydicom.fileset.FileSet` class and accessing its managed SOP instances * Creating a new File-set and modifying existing ones It's assumed that you're already familiar with the :doc:`dataset basics `. **References** * :dcm:`Basic Directory IOD` * :dcm:`DICOM File Service` * :dcm:`Media Formats and Physical Media for Media Interchange ` The DICOM File-set ================== A File-set is a collection of DICOM files that share a common naming space. Most people have probably interacted with a File-set without being aware of it; one place they're frequently used is on the CDs/DVDs containing DICOM data that are given to a patient after a medical procedure (such as an MR or ultrasound). The specification for File-sets is given in :dcm:`Part 10 of the DICOM Standard`. The DICOMDIR file ----------------- .. note:: Despite its name, a DICOMDIR file is not a file system directory and can be read using :func:`~pydicom.filereader.dcmread` like any other DICOM dataset. Every File-set must contain a single file with the filename ``DICOMDIR``, the location of which is dependent on the type of media used to store the File-set. For the most commonly used media (DVD, CD, USB, PC file system, etc), the DICOMDIR file will be in the root directory of the File-set. For other media types, :dcm:`Part 12 of the DICOM Standard` specifies where the DICOMDIR must be located. .. warning:: It's **strongly recommended** that you avoid making changes to a DICOMDIR dataset directly unless you know what you're doing. Even minor changes may require recalculating the offsets for each directory record. Use the :class:`~pydicom.fileset.FileSet` methods (see below) instead. The DICOMDIR file is used to summarize the contents of the File-set and is a *Media Storage Directory* instance that follows the :dcm:`Basic Directory IOD`. .. code-block:: python >>> from pydicom import examples >>> ds = examples.dicomdir >>> ds.file_meta.MediaStorageSOPClassUID.name 'Media Storage Directory Storage' The most important element in a DICOMDIR is the (0004,1220) *Directory Record Sequence*; each item in the sequence is a *directory record*, and one or more records are used to briefly describe an available SOP Instance and its location within the File-set's directory structure. Each record has a *record type* given by the (0004,1430) *Directory Record Type* element, and different records are related to each other using the hierarchy given in :dcm:`Table F.4-1`. .. code-block:: python >>> print(ds.DirectoryRecordSequence[0]) (0004, 1400) Offset of the Next Directory Record UL: 3126 (0004, 1410) Record In-use Flag US: 65535 (0004, 1420) Offset of Referenced Lower-Level Di UL: 510 (0004, 1430) Directory Record Type CS: 'PATIENT' (0008, 0005) Specific Character Set CS: 'ISO_IR 100' (0010, 0010) Patient's Name PN: 'Doe^Archibald' (0010, 0020) Patient ID LO: '77654033' Here we have a ``'PATIENT'`` record, which from :dcm:`Table F.5-1 ` we see must also contain *Patient's Name* and *Patient ID* elements. The full list of available record types and their requirements is in :dcm:`Annex F.5 of Part 3 of the DICOM Standard `. FileSet ======= While it's possible to access everything within a File-set using the DICOMDIR dataset, making changes to an existing File-set quickly becomes complicated due to the need to add and remove directory records, recalculate the byte offsets for existing records and manage the corresponding file system changes. A more user-friendly way to interact with one is via the :class:`~pydicom.fileset.FileSet` class. Loading existing File-sets -------------------------- To load an existing File-set just pass a DICOMDIR :class:`~pydicom.dataset.Dataset` or the path to the DICOMDIR file to :class:`~pydicom.fileset.FileSet`: .. code-block:: python >>> from pydicom import dcmread >>> from pydicom.fileset import FileSet >>> path = examples.get_path("dicomdir") # The path to the examples.dicomdir dataset >>> ds = dcmread(path) >>> fs = FileSet(ds) # or FileSet(path) An overview of the File-set's contents is shown when printing: .. code-block:: python >>> print(fs) DICOM File-set Root directory: /home/user/env/lib/python3.7/site-packages/pydicom/data/test_files/dicomdirtests File-set ID: PYDICOM_TEST File-set UID: 1.2.276.0.7230010.3.1.4.0.31906.1359940846.78187 Descriptor file ID: (no value available) Descriptor file character set: (no value available) Changes staged for write(): DICOMDIR update, directory structure update Managed instances: PATIENT: PatientID='77654033', PatientName='Doe^Archibald' STUDY: StudyDate=20010101, StudyTime=000000, StudyDescription='XR C Spine Comp Min 4 Views' SERIES: Modality=CR, SeriesNumber=1 IMAGE: 1 SOP Instance SERIES: Modality=CR, SeriesNumber=2 IMAGE: 1 SOP Instance SERIES: Modality=CR, SeriesNumber=3 IMAGE: 1 SOP Instance STUDY: StudyDate=19950903, StudyTime=173032, StudyDescription='CT, HEAD/BRAIN WO CONTRAST' SERIES: Modality=CT, SeriesNumber=2 IMAGE: 4 SOP Instances PATIENT: PatientID='98890234', PatientName='Doe^Peter' STUDY: StudyDate=20010101, StudyTime=000000 SERIES: Modality=CT, SeriesNumber=4 IMAGE: 2 SOP Instances SERIES: Modality=CT, SeriesNumber=5 IMAGE: 5 SOP Instances STUDY: StudyDate=20030505, StudyTime=050743, StudyDescription='Carotids' SERIES: Modality=MR, SeriesNumber=1 IMAGE: 1 SOP Instance SERIES: Modality=MR, SeriesNumber=2 IMAGE: 1 SOP Instance STUDY: StudyDate=20030505, StudyTime=025109, StudyDescription='Brain' SERIES: Modality=MR, SeriesNumber=1 IMAGE: 1 SOP Instance SERIES: Modality=MR, SeriesNumber=2 IMAGE: 3 SOP Instances STUDY: StudyDate=20030505, StudyTime=045357, StudyDescription='Brain-MRA' SERIES: Modality=MR, SeriesNumber=1 IMAGE: 1 SOP Instance SERIES: Modality=MR, SeriesNumber=2 IMAGE: 3 SOP Instances SERIES: Modality=MR, SeriesNumber=700 IMAGE: 7 SOP Instances The :class:`~pydicom.fileset.FileSet` class treats a File-set as a flat collection of SOP Instances, abstracting away the need to dig down into the hierarchy like you would with a DICOMDIR dataset. For example, iterating over the :class:`~pydicom.fileset.FileSet` yields a :class:`~pydicom.fileset.FileInstance` object for each of the managed instances. .. code-block:: python >>> for instance in fs: ... print(instance.PatientName) ... break ... Doe^Archibald A list of unique element values within the File-set can be found using the :meth:`~pydicom.fileset.FileSet.find_values` method, which by default searches the corresponding DICOMDIR records: .. code-block:: python >>> fs.find_values("PatientID") ['77654033', '98890234'] The search can be expanded to the File-set's managed instances by supplying the `load` parameter, at the cost of a longer search time due to having to read and decode the corresponding files: .. code-block:: python >>> fs.find_values("PhotometricInterpretation") [] >>> fs.find_values("PhotometricInterpretation", load=True) ['MONOCHROME1', 'MONOCHROME2'] More importantly, the File-set can be searched to find instances matching a query using the :func:`~pydicom.fileset.FileSet.find` method, which returns a list of :class:`~pydicom.fileset.FileInstance`. The corresponding file can then be read and decoded using :meth:`FileInstance.load() `, returning it as a :class:`~pydicom.dataset.FileDataset`: .. code-block:: python >>> for instance in fs.find(PatientID='77654033'): ... ds = instance.load() ... print(ds.PhotometricInterpretation) ... MONOCHROME1 MONOCHROME1 MONOCHROME1 MONOCHROME2 MONOCHROME2 MONOCHROME2 MONOCHROME2 :func:`~pydicom.fileset.FileSet.find` also supports the use of the `load` parameter: .. code-block:: python >>> len(fs.find(PatientID='77654033', PhotometricInterpretation='MONOCHROME1')) 0 >>> len(fs.find(PatientID='77654033', PhotometricInterpretation='MONOCHROME1', load=True)) 3 Creating a new File-set ----------------------- You can create a new File-set by creating a new :class:`~pydicom.fileset.FileSet` instance: .. code-block:: python >>> fs = FileSet() This will create a completely conformant File-set, however it won't contain any SOP instances. Since empty File-sets aren't very useful, our next step will be to add some SOP instances to it. Modifying a File-set -------------------- :class:`~pydicom.fileset.FileSet` and staging ............................................. Before we go any further we need to discuss how the :class:`~pydicom.fileset.FileSet` class manages changes to the File-set. Modifications to the File-set are first *staged*, which means that although the :class:`~pydicom.fileset.FileSet` instance behaves as though you've applied them, nothing will actually change on the file system itself until you explicitly call :meth:`FileSet.write()`. This includes changes such as: * Adding SOP instances using the :meth:`FileSet.add() ` or :meth:`FileSet.add_custom() ` methods * Removing SOP instances with :meth:`FileSet.remove() ` * Changing one of the following properties: :attr:`~pydicom.fileset.FileSet.ID`, :attr:`~pydicom.fileset.FileSet.UID`, :attr:`~pydicom.fileset.FileSet.descriptor_file_id` and :attr:`~pydicom.fileset.FileSet.descriptor_character_set` * When the :class:`~pydicom.fileset.FileSet` class determines it needs to move SOP instances from an existing File-set's directory structure to the structure used by *pydicom* You can tell if changes are staged with the :attr:`~pydicom.fileset.FileSet.is_staged` property: .. code-block:: python >>> fs.is_staged True You may also have noticed this line in the ``print(fs)`` output shown above: .. code-block:: text Changes staged for write(): DICOMDIR update, directory structure update This appears when the :class:`~pydicom.fileset.FileSet` is staged and will contain at least one of the following: * ``DICOMDIR update`` or ``DICOMDIR creation``: the DICOMDIR file will be updated or created * ``directory structure update``: one or more of the SOP instances in the existing File-set will be moved over to use the *pydicom* File-set directory structure * ``N additions``: *N* SOP instances will be added to the File-set * ``M removals``: *M* SOP instances will be removed from the File-set Adding SOP instances .................... The simplest way to add new SOP instances to the File-set is with the :meth:`~pydicom.fileset.FileSet.add` method, which takes the path to the instance or the instance itself as a :class:`~pydicom.dataset.Dataset` and returns the addition as a :class:`~pydicom.fileset.FileInstance`. To reduce memory usage, instances staged for addition are written to a temporary directory and only copied to the File-set itself when :meth:`~pydicom.fileset.FileSet.write` is called. However, they can still be accessed and loaded: .. code-block:: python >>> instance = fs.add(examples.ct) >>> instance.is_staged True >>> instance.for_addition True >>> instance.path '/tmp/tmp0aalrzir/86e6b75b-b764-46af-bec3-51698a8366f2' >>> type(instance.load()) Alternatively, if you want more control over the directory records that will be added to the DICOMDIR file, or if you need to use PRIVATE records, you can use the :meth:`~pydicom.fileset.FileSet.add_custom` method. The :meth:`~pydicom.fileset.FileSet.add` method uses *pydicom's* default directory record creation functions to create the necessary records based on the SOP instance's attributes, such as *SOP Class UID* and *Modality*. Occasionally, they may fail when an element required by these functions is empty or missing: .. code-block:: python >>> rt_dose = examples.rt_dose >>> fs.add(rt_dose) Traceback (most recent call last): File ".../pydicom/fileset.py", line 1858, in _recordify record = DIRECTORY_RECORDERS[record_type](ds) File ".../pydicom/fileset.py", line 2338, in _define_rt_dose _check_dataset(ds, ["InstanceNumber", "DoseSummationType"]) File ".../pydicom/fileset.py", line 2281, in _check_dataset raise ValueError( ValueError: The instance's (0020, 0013) 'Instance Number' element cannot be empty The above exception was the direct cause of the following exception: Traceback (most recent call last): File "", line 1, in File ".../pydicom/fileset.py", line 1039, in add record = next(record_gen) File ".../pydicom/fileset.py", line 1860, in _recordify raise ValueError( ValueError: Unable to use the default 'RT DOSE' record creator as the instance is missing a required element or value. Either update the instance, define your own record creation function or use 'FileSet.add_custom()' instead When this occurs, there are three options: * Update the instance to include the required element and/or value * Override the default record creation functions with your own by modifying :attr:`~pydicom.fileset.DIRECTORY_RECORDERS` * Use the :meth:`~pydicom.fileset.FileSet.add_custom` method According to the exception message above, the *Instance Number* element is empty. Let's update the instance and try adding it again: .. code-block:: python >>> rt_dose.InstanceNumber = "1" >>> fs.add(rt_dose) Removing instances .................. SOP instances can be removed from the File-set with the :meth:`~pydicom.fileset.FileSet.remove` method, which takes the :class:`~pydicom.fileset.FileInstance` or :class:`list` of :class:`~pydicom.fileset.FileInstance` to be removed: .. code-block:: python >>> len(fs) 2 >>> instances = fs.find(PatientID="1CT1") >>> len(instances) 1 >>> fs.remove(instances) >>> len(fs) 1 Applying the changes -------------------- Let's add a couple of SOP instances back to the File-set: .. code-block:: python >>> fs.add(examples.ct) >>> fs.add(examples.mr) To apply the changes we've made to the File-set we use :meth:`~pydicom.fileset.FileSet.write`. For new File-sets, we have to supply the path where the File-set root directory will be located: .. code-block:: python >>> from pathlib import Path >>> from tempfile import TemporaryDirectory >>> t = TemporaryDirectory() >>> t.name '/tmp/tmpsqz8rhgb' >>> fs.write(t.name) >>> fs.is_staged False >>> root = Path(t.name) >>> for path in sorted([p for p in root.glob('**/*') if p.is_file()]): ... print(path) ... /tmp/tmpsqz8rhgb/DICOMDIR /tmp/tmpsqz8rhgb/PT000000/ST000000/SE000000/RD000000 /tmp/tmpsqz8rhgb/PT000001/ST000000/SE000000/IM000000 /tmp/tmpsqz8rhgb/PT000002/ST000000/SE000000/IM000000 The root directory for existing File-sets cannot be changed, so for those you only need to call :meth:`~pydicom.fileset.FileSet.write` without any arguments: .. code-block:: python >>> instances = fs.find(PatientID="1CT1") >>> fs.remove(instances) >>> fs.write() >>> for path in sorted([p for p in root.glob('**/*') if p.is_file()]): ... print(path) ... /tmp/tmpsqz8rhgb/DICOMDIR /tmp/tmpsqz8rhgb/PT000000/ST000000/SE000000/RD000000 /tmp/tmpsqz8rhgb/PT000001/ST000000/SE000000/IM000000 For existing File-sets that don't use the same directory structure semantics as :class:`~pydicom.fileset.FileSet`, calling :meth:`~pydicom.fileset.FileSet.write` will move SOP instances over to the new structure. However, if the only modification you've made is to remove SOP instances or change :attr:`~pydicom.fileset.FileSet.ID`, :attr:`~pydicom.fileset.FileSet.UID`, :attr:`~pydicom.fileset.FileSet.descriptor_file_id`, or :attr:`~pydicom.fileset.FileSet.descriptor_character_set`, then you can pass the *use_existing* keyword parameter to keep the existing directory structure and update the DICOMDIR file. First, we need to copy the existing example File-set to a temporary directory so we don't accidentally modify it: .. code-block:: python >>> from shutil import copytree, copyfile >>> t = TemporaryDirectory() >>> dst = Path(t.name) >>> src = examples.get_path("dicomdir").parent >>> copyfile(src / "DICOMDIR", dst / "DICOMDIR") >>> copytree(src / "77654033", dst / "77654033") >>> copytree(src / "98892001", dst / "98892001") >>> copytree(src / "98892003", dst / "98892003") Now we load the File-set from the temporary directory, remove instances and write out the changes with *use_existing* to keep the current directory structure: .. code-block:: python >>> fs = FileSet(dst / "DICOMDIR") >>> instances = fs.find(PatientID="98890234") >>> fs.remove(instances) >>> fs.write(use_existing=True) # Keep the current directory structure >>> for path in sorted([p for p in dst.glob('**/*') if p.is_file()]): ... print(path) ... /tmp/tmpu068kdwp/DICOMDIR /tmp/tmpu068kdwp/77654033/CR1/6154 /tmp/tmpu068kdwp/77654033/CR2/6247 /tmp/tmpu068kdwp/77654033/CR3/6278 /tmp/tmpu068kdwp/77654033/CT2/17106 /tmp/tmpu068kdwp/77654033/CT2/17136 /tmp/tmpu068kdwp/77654033/CT2/17166 /tmp/tmpu068kdwp/77654033/CT2/17196 If you'd just called :meth:`~pydicom.fileset.FileSet.write` without *use_existing*, then it would've moved the SOP instances to the new directory structure: .. code-block:: python >>> fs.write() >>> for path in sorted([p for p in dst.glob('**/*') if p.is_file()]): ... print(path) ... /tmp/tmpu068kdwp/DICOMDIR /tmp/tmpu068kdwp/PT000000/ST000000/SE000000/IM000000 /tmp/tmpu068kdwp/PT000000/ST000000/SE000001/IM000000 /tmp/tmpu068kdwp/PT000000/ST000000/SE000002/IM000000 /tmp/tmpu068kdwp/PT000000/ST000001/SE000000/IM000000 /tmp/tmpu068kdwp/PT000000/ST000001/SE000000/IM000001 /tmp/tmpu068kdwp/PT000000/ST000001/SE000000/IM000002 /tmp/tmpu068kdwp/PT000000/ST000001/SE000000/IM000003 Conclusion ========== In this tutorial you've learned about DICOM File-sets and the DICOMDIR file. You should now be able to use the :class:`~pydicom.fileset.FileSet` class to create new File-sets, and to load, search and modify existing ones. pydicom-pydicom-20aa4b7/doc/tutorials/index.rst000066400000000000000000000004421515706620200216620ustar00rootroot00000000000000:orphan: ========= Tutorials ========= New to *pydicom*? Then these tutorials should get you up and running. .. toctree:: :maxdepth: 1 installation dataset_basics pixel_data/index waveforms filesets sr_basics dicom_json contributing_code contributing_docs pydicom-pydicom-20aa4b7/doc/tutorials/installation.rst000066400000000000000000000140001515706620200232470ustar00rootroot00000000000000====================== How to install pydicom ====================== .. note:: We recommend installing into a `virtual environment `_, which is an isolated Python environment that allows you to install packages without admin privileges. .. _tut_install: Install the official release ============================ *pydicom*, being a Python library, requires `Python `_. If you're not sure whether or not your version of Python is supported, check :ref:`this table`. Install using pip ----------------- *pydicom* is available on `PyPI `__, the official third-party Python software repository. The simplest way to install from PyPI is using `pip `_ with the command:: pip install pydicom You may need to use this instead, depending on your operating system:: python -m pip install pydicom You can also perform an offline installation by :gh:`downloading ` and installing one of the release ``*.whl`` files. For example, with the v2.0 release:: pip install pydicom-2.0.0-py3-none-any.whl Install using conda ------------------- *pydicom* is also available for `conda `_ at `conda-forge `__:: conda install -c conda-forge pydicom Additional type hints --------------------- The default *pydicom* type hinting doesn't cover standard element keywords accessed through :class:`~pydicom.dataset.Dataset`:: # foo.py from pydicom import Dataset ds = Dataset() ds.PatientName = 1234 .. code-block:: shell $ mypy foo.py Success: no issues found in 1 source file To add extra type hints for these attributes you can install the `types-pydicom `_ package:: pip install types-pydicom .. code-block:: shell $ mypy foo.py foo.py:5: error: Incompatible types in assignment (expression has type "int", variable has type "str | PersonName | None") [assignment] Found 1 error in 1 file (checked 1 source file) Downloading example/test DICOM files ------------------------------------ To keep the package size small, a number of the larger DICOM files are not distributed with *pydicom* and are instead kept in the :gh:`pydicom-data ` repository. To get the complete set of testing and example files you can either install the *pydicom-data* repository:: pip install git+https://github.com/pydicom/pydicom-data Or download the missing files to the local cache (after installing *pydicom*):: python -c "import pydicom; pydicom.data.fetch_data_files()" .. _tut_install_libs: .. _tut_install_np: Install the optional libraries ============================== If you're going to be manipulating pixel data then `NumPy `_ is required. Using pip:: pip install numpy Through conda:: conda install numpy To decode JPEG compressed pixel data one or more additional libraries will need to be installed. See :ref:`this page ` for a list of which library is needed to handle a given JPEG format, as specified by the dataset's (0002,0010) *Transfer Syntax UID* value. .. _tut_install_pil: Installing Pillow ----------------- `Pillow `_ is a popular Python imaging library that can handle the decompression of some JPEG and JPEG 2000 images. Using pip; you may need to make sure that the `libjpeg `_ (for JPEG) and `openjpeg `_ (for JPEG 2000) libraries are installed beforehand:: pip install pillow Through conda:: conda install -c conda-forge openjpeg jpeg conda install pillow Installing pyjpegls ------------------- `pyjpegls `_ is a Python interface to the `CharLS `_ C++ library and can decompress JPEG-LS images. It is a fork of `CharPyLS `_ created to provide compatibility with the latest Python versions. Using pip:: pip install pyjpegls Through conda:: conda install cython pip install git+https://github.com/pydicom/pyjpegls .. _tut_install_gdcm: Installing GDCM --------------- `GDCM `_ is a C++ library for working with DICOM datasets that can decompress JPEG, JPEG-LS and JPEG 2000 images. The wheels on `PyPI `__ are built by the `python-gdcm `_ project for current versions of Python on Windows, MacOS and Linux, and can be installed using pip:: pip install python-gdcm The wheels available through `conda-forge `__ tend to be older versions and not as well supported. They're available on conda using:: conda install gdcm -c conda-forge .. _tut_install_pylj: Installing pylibjpeg -------------------- :gh:`pylibjpeg ` is a Python framework for decompressing JPEG, JPEG-LS, JPEG 2000 images and compressing or decompressing RLE images provided a suitable plugin is installed. Using pip:: pip install -U pylibjpeg[all] .. _tut_install_dev: Install the development version =============================== To install a snapshot of the latest code (the ``main`` branch) from :gh:`GitHub `:: pip install git+https://github.com/pydicom/pydicom The ``main`` branch is under active development and while it is usually stable, it may have undocumented changes or bugs. If you want to keep up-to-date with the latest code, make sure you have `Git `_ installed and then clone the ``main`` branch (this will create a ``pydicom`` directory in your current directory):: git clone --depth=1 https://github.com/pydicom/pydicom.git Then install using pip in editable (``-e``) mode:: pip install -e pydicom/ When you want to update your copy of the source code, run ``git pull`` from within the ``pydicom`` directory and Git will download and apply any changes. pydicom-pydicom-20aa4b7/doc/tutorials/pixel_data/000077500000000000000000000000001515706620200221335ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/tutorials/pixel_data/compressing.rst000066400000000000000000000405241515706620200252230ustar00rootroot00000000000000==================================================== *Pixel Data* - Part 3: Compression and decompression ==================================================== .. currentmodule:: pydicom In part 1 of this tutorial you learned how to :doc:`access the pixel data ` as either the raw :class:`bytes` or a NumPy :class:`~numpy.ndarray` and in part 2 you learned how to :doc:`create new pixel data ` and add it to a :class:`~pydicom.dataset.Dataset`. In this final part you'll learn how to compress and decompress datasets containing *Pixel Data*. **Prerequisites** Installing using pip: .. code-block:: bash python -m pip install -U pydicom numpy pylibjpeg[all] pyjpegls Installing on conda: .. code-block:: bash conda install numpy conda install -c conda-forge pydicom pip install pylibjpeg[all] pyjpegls Compression of *Pixel Data* =========================== *pydicom* can perform dataset compression for the the following transfer syntaxes: * *JPEG-LS Lossless* and *JPEG-LS Near-lossless* compression with `pyjpegls `_. * *JPEG 2000 Lossless* and *JPEG 2000* compression with `pylibjpeg `_ and `pylibjpeg-openjpeg `_. * *RLE Lossless*, which doesn't need any additional packages but can be sped up if `pylibjpeg `_ and `pylibjpeg-rle `_ are available. For all other transfer syntaxes it's entirely up to you to compress the *Pixel Data* in a manner conformant to the :dcm:`requirements of the DICOM Standard `: * Each frame of pixel data must be compressed separately * All compressed frames must then be :dcm:`encapsulated`. * The encapsulated byte stream is used to set the *Pixel Data* value * When the amount of compressed frame data is very large then it's recommended (but not required) that an :dcm:`extended offset table` also be included in the dataset * The VR for compressed *Pixel Data* is always **OB** Compressing a dataset (with *RLE Lossless*) ------------------------------------------- Compression of an existing uncompressed dataset can be performed by passing the *Transfer Syntax UID* of the compression method you'd like to use to :meth:`Dataset.compress() `, or by using the :func:`~pydicom.pixels.compress` function. We'll be using *RLE Lossless* to start with, which is based on the `PackBits `_ compression scheme: .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import RLELossless >>> ds = examples.ct >>> ds.file_meta.TransferSyntaxUID.is_compressed False >>> ds.compress(RLELossless) If you're creating a new dataset, or if you want to update the *Pixel Data* for an existing dataset, you can pass an :class:`~numpy.ndarray` along with the *Transfer Syntax UID*:: import numpy as np from pydicom import Dataset from pydicom.uid import RLELossless ds = Dataset() ds.Rows = 320 ds.Columns = 480 ds.BitsAllocated = 8 ds.BitsStored = 8 ds.HighBit = ds.BitsStored - 1 ds.PixelRepresentation = 0 ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = "MONOCHROME2" arr = np.ones((ds.Rows, ds.Columns), dtype="uint8") ds.compress(RLELossless, arr) assert ds.file_meta.TransferSyntaxUID == RLELossless assert isinstance(ds.PixelData, bytes) In both cases this will compress the :class:`~pydicom.dataset.Dataset` in-place: * The *Pixel Data* will be set with the encapsulated RLE codestream * The *Transfer Syntax UID* will be set to *RLE Lossless* * A new *SOP Instance UID* value will be also be generated, but this can be disabled by passing ``generate_instance_uid=False``. When using an :class:`~numpy.ndarray` the :attr:`~numpy.ndarray.shape`, :class:`~numpy.dtype` and contents of `arr` must match the corresponding :dcm:`Image Pixel` module elements in the dataset, such as *Rows*, *Columns*, *Samples per Pixel*, etc. If they don't match you'll get an exception: .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import RLELossless >>> ds = examples.ct >>> arr = np.zeros((ds.Rows, ds.Columns + 1), dtype='>> ds.compress(RLELossless, arr) Traceback (most recent call last): File "", line 1, in File ".../pydicom/src/pydicom/dataset.py", line 1957, in compress encoded = [f for f in frame_iterator] ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File ".../pydicom/pixels/encoders/base.py", line 678, in iter_encode runner.validate() File ".../pydicom/pixels/encoders/base.py", line 304, in validate self._validate_array() File ".../pydicom/pixels/encoders/base.py", line 333, in _validate_array raise ValueError( ValueError: Mismatch between the expected ndarray shape (128, 128) and the actual shape (128, 129) When there are multiple plugins available for compressing the given transfer syntax a :ref:`specific encoding plugin` can be used by passing the plugin name via the `encoding_plugin` argument: .. code-block:: python >>> ds.compress(RLELossless, encoding_plugin='pylibjpeg') The RLE compression method is well supported by DICOM applications and can compress a wide range of images, however it's usually less efficient than the JPEG family of compression schemes. More information on performing compression with *RLE Lossless* can be found in the :doc:`RLE encoding guide`. Compressing with JPEG-LS ------------------------ The JPEG-LS compression scheme is based on `ISO/IEC 14495-1 `_/`ITU T.87 `_. While it can compress 2- to 16-bit images and uses a lossy quality specification mechanism that's easy to understand, it's not well suited for lossy compression of signed integers and is generally not well supported by third-party applications, so keep that in mind if you decide to use it. **Lossless compression** Performing lossless compression is straightforward:: >>> from pydicom import examples >>> from pydicom.uid import JPEGLSLossless >>> ds = examples.ct >>> ds.compress(JPEGLSLossless) **Lossy compression** Lossy compression is a bit more complicated, especially when the pixel data uses signed integers. First up though, we'll use an example with unsigned pixel data. .. warning:: *pydicom* makes no recommendations for specifying the image quality for lossy encoding methods. Any examples of lossy encoding are for **illustration purposes only**. .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import JPEGLSNearLossless >>> ds = examples.rgb_color >>> ds.PixelRepresentation 0 >>> ds.compress(JPEGLSNearLossless, jls_error=3) The `jls_error` parameter is used to control the loss in image quality, and is directly related to the JPEG-LS NEAR parameter, which is the absolute allowed error in (unsigned) pixel data values. A `jls_error` of ``3`` therefore means that all pixels will be within 3 intensity units of the original. In our second lossy JPEG-LS example we'll use a dataset with 16-bit signed integers, which is where the complication starts. The NEAR parameter is defined in terms of unsigned integers, so when used with signed values there can potentially be compression errors of up to the maximum bit-depth of the pixel data. To avoid this, the range of pixel values must be in the `closed interval `_:: [-2**(ds.BitsStored - 1) + jls_error, 2**(ds.BitsStored - 1) - 1 - jls_error] For example, with a *Bits Stored* of ``8`` and ``jls_error=3`` the pixels must be in the range [-125, 124]. .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import JPEGLSNearLossless >>> ds = examples.ct >>> ds.PixelRepresentation 1 >>> ds.BitsStored 16 >>> arr = ds.pixel_array >>> arr.min(), arr.max() (128, 2191) >>> ds.compress(JPEGLSNearLossless, jls_error=3) In this example the pixel values are within the allowed range so we don't need to do anything further. If that weren't the case you'd have to rescale the values or use a different compression method such as JPEG 2000 (recommended). More information on performing compression with JPEG-LS can be found in the :doc:`JPEG-LS encoding guide`. Compressing with JPEG 2000 -------------------------- The JPEG 2000 compression scheme is based on `ISO/IEC 15444-1 `_/`ITU T.800 `_. The format is fairly well supported by third-party applications and it can compress images with a wide variety of properties, making it a good choice for compressing datasets. Two transfer syntaxes are available that use JPEG 2000 compression; *JPEG 2000 Lossless* and *JPEG 2000*. While the DICOM Standard allows *JPEG 2000* to be either lossy or lossless, when used for compression in *pydicom* it's always treated as being lossy in order to simplify its usage. **Lossless compression** As with RLE and JPEG-LS, performing lossless compression is straightforward:: >>> from pydicom import examples >>> from pydicom.uid import JPEG2000Lossless >>> ds = examples.ct >>> ds.compress(JPEG2000Lossless) For RGB pixel data, JPEG 2000 can perform multiple component transformation (MCT) during the encoding process, which should improve the compression efficiency. This can be enabled or disabled by setting an appropriate *Photometric Interpretation* prior to compression: * ``"RGB"`` to disable MCT * ``"YBR_RCT"`` to enable MCT for *JPEG 2000 Lossless* * ``"YBR_ICT"`` to enable MCT for *JPEG 2000* .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import JPEG2000Lossless >>> ds = examples.rgb_color >>> ds.PhotometricInterpretation "RGB" >>> ds.compress(JPEG2000Lossless) # No MCT applied >>> len(ds.PixelData) 334412 >>> ds = examples.rgb_color >>> ds.PhotometricInterpretation = "YBR_RCT" >>> ds.compress(JPEG2000Lossless) # MCT applied >>> len(ds.PixelData) 152342 **Lossy compression** Lossy compression with *JPEG 2000* is both more and less complicated then JPEG-LS; you don't have to worry about the pixel values for signed integers, but specifying the image quality is less intuitive. .. warning:: *pydicom* makes no recommendations for specifying the image quality for lossy encoding methods. Any examples of lossy encoding are for **illustration purposes only**. .. code-block:: python >>> from pydicom import examples >>> from pydicom.uid import JPEG2000 >>> ds = examples.ct >>> ds.compress(JPEG2000, j2k_cr=[5, 2]) # 2 quality layers With JPEG 2000 image quality is specified with either the `j2k_cr` or `j2k_psnr` parameters: * `j2k_cr` is a ``list[float]`` of compression ratios to use for each quality layer and is directly related to OpenJPEG's `-r compression ratio `_ option. There must be at least one layer and the minimum allowable compression ratio is ``1``. When using multiple layers they should be ordered in decreasing value from left to right. * `j2k_psnr` is a ``list[float]`` of the peak signal-to-noise ratios (in dB) to use for each quality layer and is directly related to OpenJPEG's `-q quality `_ option. There must be at least one layer and when using multiple layers they should be ordered in increasing value from left to right. Choosing appropriate quality settings for *JPEG 2000* is far beyond the scope of this tutorial, but whatever you end up selecting should be thoroughly tested with a representative sample of expected pixel data. More information on performing compression with JPEG 2000 can be found in the :doc:`JPEG 2000 encoding guide`. Encapsulating data compressed by third-party packages ..................................................... You can also use *pydicom* with third-party compression packages to encapsulate the compressed *Pixel Data*, provided they meet the requirements of the corresponding transfer syntax. The :func:`~pydicom.encaps.encapsulate` or :func:`~pydicom.encaps.encapsulate_extended` functions are used to encapsulate the compressed data. .. code-block:: python from pydicom import examples from pydicom.encaps import encapsulate, encapsulate_extended from pydicom.uid import JPEGBaseline8Bit # Fetch an example dataset ds = examples.ct # Use third-party package to compress # Let's assume it compresses to JPEG Baseline frames: list[bytes] = third_party_compression_func(...) # Set the *Transfer Syntax UID* appropriately ds.file_meta.TransferSyntaxUID = JPEGBaseline8Bit # For *Samples per Pixel* 1 the *Photometric Interpretation* is unchanged # Basic encapsulation ds.PixelData = encapsulate(frames) ds["PixelData"].VR = "OB" # always for encapsulated pixel data ds.save_as("ct_compressed_basic.dcm") # Extended encapsulation result: tuple[bytes, bytes, bytes] = encapsulate_extended(frames) ds.PixelData = result[0] ds.ExtendedOffsetTable = result[1] ds.ExtendedOffsetTableLength = result[2] ds.save_as("ct_compressed_ext.dcm") Decompression of *Pixel Data* ============================= Datasets with a compressed *Transfer Syntax UID* can be decompressed with :meth:`Dataset.decompress()` or the :func:`~pydicom.pixels.decompress` function. .. code-block:: python >>> from pydicom import examples >>> ds = examples.jpeg2k >>> ds.decompress() This will decompress the :class:`~pydicom.dataset.Dataset` in-place: * The *Pixel Data* will be set using the uncompressed pixel data. * The *Transfer Syntax UID* will be changed to *Explicit VR Little Endian*. * The :dcm:`Image Pixel` module elements will be updated as required to match the uncompressed pixel data. * A new *SOP Instance UID* value will be also be generated, but this can be disabled by passing ``generate_instance_uid=False``. Dataset decompression uses the same backend as accessing compressed *Pixel Data*, so the same :doc:`customization options` of the decoding process apply. For example, to use a :doc:`specific plugin` you can pass its name via the `decoding_plugin` argument:: >>> from pydicom import examples >>> ds = examples.jpeg2k >>> ds.decompress(decoding_plugin="pylibjpeg") If the dataset's *Pixel Data* is in the YCbCr color space it will also be converted to RGB by default. This can be disabled by passing ``as_rgb=False``:: import numpy as np from pydicom import examples from pydicom.pixels import convert_color_space, pixel_array from pydicom.uid import JPEG2000Lossless # Original dataset in RGB ds = examples.rgb_color assert ds.PhotometricInterpretation == "RGB" # Convert to YCbCr and compress ybr = convert_color_space(ds.pixel_array, "RGB", "YBR_FULL") ds.PhotometricInterpretation = "YBR_FULL" ds.compress(JPEG2000Lossless, ybr) assert ds.PhotometricInterpretation == "YBR_FULL" # RGB reference - needed because converting RGB -> YBR -> RGB is lossy rgb = convert_color_space(ybr, "YBR_FULL", "RGB") # Decompress with conversion to RGB ds.decompress() assert ds.PhotometricInterpretation == "RGB" assert np.array_equal(rgb, pixel_array(ds, raw=True)) # Decompress without conversion to RGB ds.PhotometricInterpretation = "YBR_FULL" ds.compress(JPEG2000Lossless, ybr) ds.decompress(as_rgb=False) assert ds.PhotometricInterpretation == "YBR_FULL" assert np.array_equal(ybr, pixel_array(ds, raw=True)) Conclusion ========== In part 3 of this tutorial you've learned how to use *pydicom* to compress and decompress datasets and how to encapsulate pixel data that has been compressed by third-party packages. Having made it to the end of the pixel data tutorial you should now be comfortable using *pydicom* to perform pixel data related tasks. pydicom-pydicom-20aa4b7/doc/tutorials/pixel_data/creation.rst000066400000000000000000000306621515706620200245000ustar00rootroot00000000000000============================================= *Pixel Data* - Part 2: Creation of pixel data ============================================= .. currentmodule:: pydicom In part 1 of this tutorial you learned how to :doc:`access the pixel data ` as either the raw :class:`bytes` or a NumPy :class:`~numpy.ndarray`. In this part we'll be creating pixel data from scratch and adding it to a :class:`~pydicom.dataset.Dataset`. We'll be creating uncompressed datasets with the following types of *Pixel Data*: * Grayscale with 8-bit unsigned integers * Multi-frame RGB with 8-bit unsigned integers * Grayscale with 12-bit signed integers * Grayscale with 32-bit floats (for *Float Pixel Data*) **Prerequisites** Installing using pip: .. code-block:: bash python -m pip install -U pydicom numpy matplotlib pylibjpeg[all] Installing on conda: .. code-block:: bash conda install numpy matplotlib conda install -c conda-forge pydicom pip install pylibjpeg[all] Creating *Pixel Data* --------------------- We'll be using NumPy to create an array containing the pixel data and converting it to little-endian ordered :class:`bytes` using :meth:`ndarray.tobytes() `. This is the function we'll be using to create the array:: import numpy as np def draw_circle(shape: tuple[int, int], dtype: str, value: int) -> np.ndarray: """Return an ndarray containing a circle.""" (rows, columns), radius = shape, min(shape) // 2 x0, y0 = columns // 2, rows // 2 x = np.linspace(0, columns, columns) y = np.linspace(0, rows, rows)[:, None] # Create a boolean array where values inside the radius are True arr = (x - x0)**2 + (y - y0)**2 <= radius**2 # Convert to the required `dtype` and set the maximum `value` return arr.astype(dtype) * value The datasets we'll be creating don't meet the requirements of any DICOM :dcm:`IOD` and so aren't conformant DICOM SOP instances, but they're sufficient to demonstrate how to create and add pixel data to a :class:`~pydicom.dataset.Dataset` using *pydicom*. To create pixel data for an actual dataset you should check the requirements of the specific IOD you're working with, as many IODs place restrictions on the allowed values for elements such as *Bits Stored*, *Photometric Interpretation* and others. Grayscale with 8-bit unsigned integers ...................................... The first example uses a single frame of grayscale *Pixel Data* with 8-bit unsigned integers: * For 8-bit pixel values *Bits Stored* is ``8`` * *Bits Allocated* must be a multiple of 8 and not less than *Bits Stored* * For unsigned integers *Pixel Representation* must be ``0`` * For 8-bit unsigned integers all pixel values must be in the `closed interval `_ [0, 2\ :sup:`8` - 1] * For pixel data that uses a single sample per pixel, *Samples per Pixel* is ``1`` * The *Photometric Interpretation* should be appropriate for a single sample per pixel * If *Bits Allocated* is <= 8 then *Pixel Data* uses a VR of **OB** The :dcm:`VR` for *Pixel Data* may be **OB** or **OW** depending on the value of *Bits Allocated*. *pydicom* will set this automatically when writing the :class:`~pydicom.dataset.Dataset` to file as long as *Bits Allocated* has been set, but for completeness we'll be setting it manually. The example has two different sets of *Pixel Data*; one with an even number of bytes and one with an odd number. The :dcm:`DICOM Standard` requires odd length *Pixel Data* have trailing padding sufficient to make it an even length, so the latter case demonstrates how to do so. Because we'll be using NumPy to create the data we need an array with a :class:`~numpy.dtype` appropriate for our chosen pixel data properties. For unsigned 8-bit integers the obvious choice is ``uint8`` as it can contain the values with the minimum amount of memory usage and can be converted directly to a suitable *Pixel Data* :class:`bytes` value with :meth:`ndarray.tobytes()`. If instead we were to use something like ``uint16`` we would double the memory usage and require either setting ``ds.BitsAllocated = 16`` (and roughly doubling the final size of the dataset) or keeping *Bits Stored* as ``8`` and stripping out the unused bytes with ``ds.PixelData == arr.tobytes()[1::2]``. .. code-block:: python import matplotlib.pyplot as plt from pydicom import Dataset, FileMetaDataset from pydicom.uid import ExplicitVRLittleEndian ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.BitsAllocated = 8 # 8-bit containers ds.BitsStored = 8 # 8-bits used ds.HighBit = ds.BitsStored - 1 ds.PixelRepresentation = 0 # unsigned ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = "MONOCHROME2" ## Even number of bytes # Create a 480 x 320, 8-bit unsigned array arr = draw_circle((320, 480), "uint8", 255) assert arr.size % 2 == 0 # No padding needed ds.PixelData = arr.tobytes() ds["PixelData"].VR = "OB" ds.Rows = arr.shape[0] # 320 pixels ds.Columns = arr.shape[1] # 480 pixels plt.imshow(ds.pixel_array) plt.show() ## Odd number of bytes # Create a 31 x 63, 8-bit unsigned array arr = draw_circle((63, 31), "uint8", 255) assert arr.size % 2 == 1 # Trailing padding required to make the length an even number of bytes ds.PixelData = b"".join((arr.tobytes(), b"\x00")) ds["PixelData"].VR = "OB" ds.Rows = arr.shape[0] ds.Columns = arr.shape[1] plt.imshow(ds.pixel_array) plt.show() **Experimentation** Modify the example to use the following and see what effects they have on the displayed images: * Set *Bits Allocated* and *Bits Stored* to ``16`` and ``ds.Columns = arr.shape[1] // 2`` * Set ``ds.Rows = arr.shape[1]`` and ``ds.Columns = arr.shape[0]`` Multi-frame RGB with 8-bit unsigned integers ............................................ The second example uses multi-frame RGB *Pixel Data* with 8-bit unsigned integers: * *Samples per Pixel* has changed to ``3``, because there are 3 channels; R, G and B. * *Photometric Interpretation* has changed to ``"RGB"`` to match the image type * *Planar Configuration* has been added as it's required when *Samples per Pixel* > 1 * *Number of Frames* has been added as it's required when there are multiple frames The *Planar Configuration* value is set as ``0``, which means each pixel is encoded separately then all the encoded pixels are concatenated together. This matches how :meth:`ndarray.tobytes()` will encode an array that's ordered as (rows, columns, samples) or (frames, rows, columns, samples). .. code-block:: python import matplotlib.pyplot as plt from pydicom import Dataset, FileMetaDataset from pydicom.pixels import iter_pixels from pydicom.uid import ExplicitVRLittleEndian ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.BitsAllocated = 8 # 8-bit containers ds.BitsStored = 8 # 8-bits used ds.HighBit = ds.BitsStored - 1 ds.PixelRepresentation = 0 # unsigned ds.SamplesPerPixel = 3 ds.PhotometricInterpretation = "RGB" ds.PlanarConfiguration = 0 ds.NumberOfFrames = 2 # Create 2 frames of 480 x 320 x 3, 8-bit unsigned array arr = np.empty((2, 320, 480, 3), dtype="uint8") # Frame 1 arr[0, ..., 0] = draw_circle((320, 480), "uint8", 255) arr[0, ..., 1] = draw_circle((320, 480), "uint8", 127) arr[0, ..., 2] = draw_circle((320, 480), "uint8", 0) # Frame 2 arr[1, ..., 0] = draw_circle((320, 480), "uint8", 0) arr[1, ..., 1] = draw_circle((320, 480), "uint8", 127) arr[1, ..., 2] = draw_circle((320, 480), "uint8", 255) ds.PixelData = b"".join((arr.tobytes(), b"\x00")) if arr.size % 2 else arr.tobytes() ds["PixelData"].VR = "OB" ds.Rows = arr.shape[1] ds.Columns = arr.shape[2] # Display the frames im = plt.imshow(np.zeros((ds.Rows, ds.Columns, 3), dtype="uint8")) for frame in iter_pixels(ds): im.set_data(frame) plt.pause(1) **Experimentation** * A *Planar Configuration* value of ``1`` means each color channel is encoded separately and then the results concatenated together. Try setting ``ds.PlanarConfiguration = 1`` and seeing what effect it has. * By default *pydicom* will :doc:`return any extra frames` it finds in the *Pixel Data*. Set ``ds.NumberOfFrames = 1`` and see what effect it has, then pass ``allow_excess_frames=False`` to :func:`~pydicom.pixels.iter_pixels` and compare the results. Grayscale with 12-bit signed integers ..................................... The final *Pixel Data* example uses a single channel of 12-bit signed integers: * For 12-bit pixel values *Bits Stored* is ``12`` and *Bits Allocated* should be at least ``16`` * For signed integers *Pixel Representation* must be ``1`` * For 12-bit signed integers all pixels must have values in the `closed interval `_ [-2\ :sup:`11`, 2\ :sup:`11` - 1] * If *Bits Allocated* is > 8 then *Pixel Data* uses a VR of **OW** We need a :class:`~numpy.dtype` sufficient for containing 12-bit integers, so to minimize memory usage we'll go with ``int16`` and use a *Bits Allocated* value of ``16`` to match. .. code-block:: python import matplotlib.pyplot as plt from pydicom import Dataset, FileMetaDataset from pydicom.uid import ExplicitVRLittleEndian ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.BitsAllocated = 16 # 16-bits allocated ds.BitsStored = 12 # 12-bits used; interval is [-2048, 2047] ds.HighBit = ds.BitsStored - 1 ds.PixelRepresentation = 1 # signed ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = "MONOCHROME2" # Create a 480 x 320, 16-bit signed array arr = draw_circle((320, 480), "int16", -2048) ds.PixelData = arr.tobytes() ds["PixelData"].VR = "OW" ds.Rows = arr.shape[0] ds.Columns = arr.shape[1] plt.imshow(ds.pixel_array) plt.show() **Experimentation** Set *Pixel Representation* to 0 and see what effect it has on the value of the pixels in the circle. Creating *Float Pixel Data* and *Double Float Pixel Data* --------------------------------------------------------- The creation of *Float Pixel Data* or *Double Float Pixel Data* is very similar to that of *Pixel Data*, the main differences being: * *Bits Allocated* and *Bits Stored* are always 32 for *Float Pixel Data* and 64 for *Double Float Pixel Data* * The *Pixel Representation* element should not be present * The VR doesn't need to be set manually +---------------------------+--------+------------------+---------------+-----------------------+ | Element | VR | *Bits Allocated* | *Bits Stored* | :class:`~numpy.dtype` | +===========================+========+==================+===============+=======================+ | *Float Pixel Data* | **OF** | 32 | 32 | ``float32`` | +---------------------------+--------+------------------+---------------+-----------------------+ | *Double Float Pixel Data* | **OD** | 64 | 64 | ``float64`` | +---------------------------+--------+------------------+---------------+-----------------------+ The example below demonstrates creating *Float Pixel Data*:: from pydicom import Dataset, FileMetaDataset from pydicom.uid import ExplicitVRLittleEndian ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.BitsAllocated = 32 ds.BitsStored = 32 ds.HighBit = ds.BitsStored - 1 ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = "MONOCHROME2" # Create a 480 x 320, 32-bit float array arr = draw_circle((320, 480), "float32", 1024.58) ds.FloatPixelData = arr.tobytes() ds.Rows = arr.shape[0] ds.Columns = arr.shape[1] Conclusion and next steps ------------------------- In part 2 of this tutorial you've learned how to create and add a variety of different pixel data to a :class:`~pydicom.dataset.Dataset` using an :class:`~numpy.ndarray`. In the final part you'll learn how to :doc:`compress and decompress datasets ` containing pixel data. pydicom-pydicom-20aa4b7/doc/tutorials/pixel_data/index.rst000066400000000000000000000001621515706620200237730ustar00rootroot00000000000000 ============ *Pixel Data* ============ .. toctree:: :maxdepth: 1 introduction creation compressing pydicom-pydicom-20aa4b7/doc/tutorials/pixel_data/introduction.rst000066400000000000000000000375301515706620200254160ustar00rootroot00000000000000================================================= *Pixel Data* - Part 1: Introduction and accessing ================================================= .. currentmodule:: pydicom This is part 1 of the tutorial on using *pydicom* with DICOM *Pixel Data*. It covers: * An introduction to DICOM pixel data * Converting pixel data to a NumPy :class:`~numpy.ndarray` * Customizing the conversion process It's assumed that you're already familiar with the :doc:`dataset basics <../dataset_basics>`. **Prerequisites** Installing using pip: .. code-block:: bash python -m pip install -U pydicom numpy matplotlib pylibjpeg[all] Installing on conda: .. code-block:: bash conda install numpy matplotlib conda install -c conda-forge pydicom pip install pylibjpeg[all] Introduction ------------ Many DICOM SOP classes contain bulk pixel data, which typically represents medical imagery or 2D slices of a 3D volume. This data is most commonly found in the *Pixel Data* element, however it may be in *Float Pixel Data* or *Double Float Pixel Data* instead, depending on the SOP class. The table below lists these possible pixel data containing elements, although it's important to note that only one may be present in any given dataset. +-------------+---------------------+----------------------+------------------+ | Tag | Description | Keyword | VR | +=============+=====================+======================+==================+ | (7FE0,0008) | *Float Pixel Data* | FloatPixelData | **OF** | +-------------+---------------------+----------------------+------------------+ | (7FE0,0009) | *Double Pixel Data* | DoubleFloatPixelData | **OD** | +-------------+---------------------+----------------------+------------------+ | (7FE0,0010) | *Pixel Data* | PixelData | **OB** or **OW** | +-------------+---------------------+----------------------+------------------+ All three elements use **O*** :dcm:`VRs` (such as **OB** and **OD**), which in *pydicom* are :doc:`stored as` (and should be set using) :class:`bytes`:: >>> from pydicom import examples >>> ds = examples.jpeg2k >>> ds.group_dataset(0x7FE0) (7FE0,0010) Pixel Data OB: Array of 152326 elements >>> ds.PixelData[:50] # doctest: +ELLIPSIS b'\xfe\xff\x00\xe0\x00\x00\x00\x00\xfe\xff\x00\xe0\x00\x00\x01\x00\xffO\xffQ... If the dataset's been written using the :dcm:`DICOM File Format` it should have a *Transfer Syntax UID* element which describes how the pixel data is encoded and whether it's undergone compression:: >>> tsyntax = ds.file_meta.TransferSyntaxUID >>> tsyntax.name 'JPEG 2000 Image Compression (Lossless Only)' >>> tsyntax.is_compressed True In the example above the *Transfer Syntax UID* indicates that the pixel data has been compressed using the :dcm:`JPEG 2000 ` compression method. Other things to keep in mind with compressed transfer syntaxes are: * Only datasets that use the *Pixel Data* element may be compressed * Each frame of pixel data is compressed separately * The compressed frames are then :func:`encapsulated` and the encapsulated data used to set the *Pixel Data* value To access the encapsulated frames you can use :func:`~pydicom.encaps.get_frame` or the :func:`~pydicom.encaps.generate_frames` iterator:: >>> from pydicom.encaps import get_frame >>> frame = get_frame(ds.PixelData, 0, number_of_frames=1) >>> print(len(frame)) 152294 The next example uses an uncompressed *Transfer Syntax UID*:: >>> ds = examples.ct >>> tsyntax = ds.file_meta.TransferSyntaxUID >>> tsyntax.name 'Explicit VR Little Endian' >>> tsyntax.is_compressed False The pixel data in this dataset uses `little-endian byte ordering `_ and is uncompressed. Uncompressed transfer syntaxes never use encapsulation and may use any one of the three pixel data elements, although *Pixel Data* is the most common. A dataset with pixel data should always contain group ``0x0028`` :dcm:`Image Pixel ` module elements, which are needed to properly interpret the encoded pixel data byte stream:: >>> ds.group_dataset(0x0028) (0028,0002) Samples per Pixel US: 1 (0028,0004) Photometric Interpretation CS: 'MONOCHROME2' (0028,0010) Rows US: 128 (0028,0011) Columns US: 128 (0028,0030) Pixel Spacing DS: [0.661468, 0.661468] (0028,0100) Bits Allocated US: 16 (0028,0101) Bits Stored US: 16 (0028,0102) High Bit US: 15 (0028,0103) Pixel Representation US: 1 ... An explanation of what these elements represent can be found in the :doc:`glossary`, but briefly, the above indicates that this dataset contains a single grayscale image with dimensions 128 x 128 and that each pixel should be interpreted as a 2-byte signed integer. Converting to an :class:`~numpy.ndarray` ---------------------------------------- Properly interpreting all the possible variations of a dataset's pixel data requires a lot of specific domain knowledge, not just of DICOM but also the various JPEG compression schemes. For this reason *pydicom* offers a number of methods for converting the pixel data to a NumPy :class:`~numpy.ndarray`, the most high-level of which are the :func:`~pydicom.pixels.pixel_array` and :func:`~pydicom.pixels.iter_pixels` functions:: import matplotlib.pyplot as plt from pydicom import examples from pydicom.pixels import pixel_array # Get an example dataset as a FileDataset instance ds = examples.ct # Convert the pixel data to an ndarray arr = pixel_array(ds) assert arr.shape == (128, 128) assert str(arr.dtype) == "int16" # Display the pixel data using matplotlib plt.imshow(arr, cmap="gray") plt.show() This will convert the entire pixel data to an :class:`~numpy.ndarray` before using `matplotlib `_ to display it. If the dataset has multiple frames but you're only interested in a particular one, then you can use the `index` parameter to return it:: from pydicom import examples from pydicom.pixels import pixel_array # Get an example multi-frame dataset ds = examples.rt_dose assert ds.NumberOfFrames == '15' # Return all frames arr = pixel_array(ds) assert arr.shape == (15, 10, 10) # Return only the first frame arr = pixel_array(ds, index=0) assert arr.shape == (10, 10) :func:`~pydicom.pixels.iter_pixels` can be used to iterate through either all the available frames or those specified by the `indices` parameter:: from pydicom import examples from pydicom.pixels import iter_pixels # Iterate through all frames for arr in iter_pixels(examples.rt_dose): assert arr.shape == (10, 10) # Iterate through the first 3 even frames for arr in iter_pixels(examples.rt_dose, indices=[1, 3, 5]): assert arr.shape == (10, 10) Controlling decoding .................... The default decoding options for :func:`~pydicom.pixels.pixel_array` and :func:`~pydicom.pixels.iter_pixels` have been chosen to return the pixel data in its most commonly used form; for multi-sample data this means RGB is returned by default. Datasets with pixel data in `YCbCr `_ color space are converted using :func:`~pydicom.pixels.convert_color_space` prior to the array being returned. If you'd like to skip this conversion and return the data as found in the dataset you can pass ``raw=True``:: import matplotlib.pyplot as plt from pydicom import examples from pydicom.pixels import pixel_array ds = examples.ybr_color assert ds.PhotometricInterpretation == "YBR_FULL_422" ybr = pixel_array(ds, index=0, raw=True) rgb = pixel_array(ds, index=0) fig, (im1, im2) = plt.subplots(1, 2) im1.imshow(ybr) im1.set_title("Original (in YCbCr)") im2.imshow(rgb) im2.set_title("Converted (in RGB)") plt.show() Further customization of the returned :class:`~numpy.ndarray` is possible by passing one or more :doc:`decoding options` to :func:`~pydicom.pixels.pixel_array` and :func:`~pydicom.pixels.iter_pixels`. Compressed transfer syntaxes ............................ When converting datasets with a compressed transfer syntax, one or more additional packages are needed to perform the actual decompression (via their corresponding decoding plugins). By default, all available plugins will be tried and the first successful one will have its results returned:: from pydicom import examples from pydicom.pixels import pixel_array ds = examples.jpeg2k # Returns the results from the first successful decoding plugin arr = pixel_array(ds) If no plugins are available for the given transfer syntax due to missing dependencies you'll get an exception: .. code-block:: pytb Traceback (most recent call last): File "", line 1, in File ".../pydicom/pixels/utils.py", line 1386, in pixel_array return decoder.as_array( ^^^^^^^^^^^^^^^^^ File ".../pydicom/pixels/decoders/base.py", line 971, in as_array self._validate_plugins(decoding_plugin), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File ".../pydicom/pixels/common.py", line 249, in _validate_plugins raise RuntimeError( RuntimeError: Unable to decompress 'JPEG 2000 Image Compression (Lossless Only)' pixel data because all plugins are missing dependencies: gdcm - requires gdcm>=3.0.10 pylibjpeg - requires pylibjpeg>=2.0 and pylibjpeg-openjpeg>=2.0 pillow - requires numpy and pillow>=10.0 While the resulting :class:`~numpy.ndarray` for lossless compression methods should be identical no matter which plugin is used, there may be slight differences for lossy compression methods. To ensure consistency you can use the `decoding_plugin` argument to use the specified :doc:`decompression plugin`:: from pydicom import examples from pydicom.pixels import pixel_array ds = examples.jpeg2k # Return the results from the 'pylibjpeg' decoding plugin arr = pixel_array(ds, decoding_plugin="pylibjpeg") And of course if the specified plugin isn't available you'll get an exception:: >>> from pydicom import examples >>> from pydicom.pixels import pixel_array >>> pixel_array(examples.jpeg2k, decoding_plugin="pillow") Traceback (most recent call last): File "", line 1, in File ".../pydicom/pixels/utils.py", line 1386, in pixel_array return decoder.as_array( ^^^^^^^^^^^^^^^^^ File ".../pydicom/pixels/decoders/base.py", line 971, in as_array self._validate_plugins(decoding_plugin), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File ".../pydicom/pixels/common.py", line 230, in _validate_plugins raise RuntimeError( RuntimeError: Unable to decompress 'JPEG 2000 Image Compression (Lossless Only)' pixel data because the specified plugin is missing dependencies: pillow - requires numpy and pillow>=10.0 Minimizing memory usage ....................... Sometimes a dataset's pixel data may be very large due to it having a large number of frames and you'd like to avoid having the entire thing read into memory. By passing the path to the dataset (as :class:`str` or :class:`pathlib.Path`) to :func:`~pydicom.pixels.pixel_array` only the :dcm:`Image Pixel ` module elements and the minimum amount of required pixel data will be loaded:: from pydicom import examples from pydicom.pixels import pixel_array # Get the path to the 'examples.rt_dose' dataset path = examples.get_path("rt_dose") # Return the first frame of the pixel data arr = pixel_array(path, index=0) The same is true for :func:`~pydicom.pixels.iter_pixels`:: import matplotlib.pyplot as plt import numpy as np from pydicom import examples from pydicom.pixels import iter_pixels # Get the path to the 'examples.ybr_color' dataset path = examples.get_path("ybr_color") # Create an empty ndarray and use it to initialize the display im = plt.imshow(np.zeros((ds.Rows, ds.Columns), dtype="u1")) # Iterate through the frames and update the display for frame in iter_pixels(path): im.set_data(frame) plt.pause(0.033) If you're supplying a path to :func:`~pydicom.pixels.pixel_array` or :func:`~pydicom.pixels.iter_pixels` and you need access to the :dcm:`Image Pixel ` elements to perform image processing operations on the array (such as :func:`rescale` or :func:`windowing`) you can access them by passing an empty :class:`~pydicom.dataset.Dataset` instance via the `ds_out` argument, or alternatively by using :func:`~pydicom.filereader.dcmread` with ``stop_before_pixels=True``:: from pydicom import Dataset, examples from pydicom.pixels import pixel_array, apply_rescale # Get the path to the 'examples.ct' dataset path = examples.get_path("ct") ds = Dataset() arr = pixel_array(path, ds_out=ds) assert ds.RescaleIntercept == "-1024.0" assert ds.RescaleSlope == "1.0" # Convert raw CT values to Hounsfield units hu = apply_rescale(arr, ds) Converting to an :class:`~numpy.ndarray` with metadata ------------------------------------------------------ While :func:`~pydicom.pixels.pixel_array` and :func:`~pydicom.pixels.iter_pixels` should cover most use cases, you may want more information about the returned :class:`~numpy.ndarray`, such as what color space it's in. The :meth:`Decoder.as_array() ` and :meth:`Decoder.iter_array() ` methods provide mid-level access to *pydicom's* pixel data decoding functionality while still handling most of the complexity of conversion to an array. More importantly, they return or yield a tuple of (:class:`~numpy.ndarray`, :class:`dict`), where the :class:`dict` contains metadata describing the corresponding :class:`~numpy.ndarray`. .. warning:: The :class:`~pydicom.pixels.decoders.base.Decoder` class should not be used directly, instead use the class instance returned by :func:`~pydicom.pixels.get_decoder`. .. code-block:: python from pydicom import examples from pydicom.pixels import get_decoder ds = examples.ybr_color assert ds.PhotometricInterpretation == "YBR_FULL_422" # Get the 'Decoder' instance required to decode the dataset's pixel data decoder = get_decoder(ds.file_meta.TransferSyntaxUID) # Converts the pixel data to an ndarray in the original color space arr, meta = decoder.as_array(ds, raw=True, index=0) assert (meta["rows"], meta["columns"], meta["samples_per_pixel"]) == arr.shape assert meta["photometric_interpretation"] == "YBR_FULL_422" # Converts the pixel data to an ndarray in RGB color space arr, meta = decoder.as_array(ds, index=0) assert meta["photometric_interpretation"] == "RGB" This is especially useful for non-conformant datasets where the :dcm:`Image Pixel ` module elements have values that don't match the actual pixel data (such as *Number of Frames* or *Photometric Interpretation*). Conclusion and next steps ------------------------- In part 1 of this tutorial you've been introduced to DICOM's pixel data and learned how to use *pydicom* to access it, convert it to an :class:`~numpy.ndarray` and how to control the conversion process. In the next part you'll learn how to :doc:`create your own pixel data from scratch`. pydicom-pydicom-20aa4b7/doc/tutorials/sr_basics.rst000066400000000000000000000041141515706620200225230ustar00rootroot00000000000000==================== Structured Reporting ==================== Starting in *pydicom* version 1.4, some support for DICOM Structured Reporting (SR) began to be added, as alpha code; the API for this is subject to change in future *pydicom* versions. At this point the code is limited to code dictionaries and one class :class:`~pydicom.sr.coding.Code` as a foundational step for future work. Most access is through a ``codes`` class instance provided in ``pydicom.sr.codedict``. This can be used with a ``dir()`` method on a particular scheme designator ('DCM' here) or CID (see further below):: >>> from pydicom.sr.codedict import codes >>> codes.DCM.dir("Modality") ['IncorrectModalityWorklistEntry', 'MixedModality3DCAMModel', 'Modality', 'ModalityToRead', 'OtherModality'] Once a name is known, the ``Code`` instance can be created using that name:: >>> codes.DCM.ModalityToRead Code(value='128002', scheme_designator='DCM', meaning='Modality to Read', scheme_version=None) Codes with keywords that start with a number are prefixed with an underscore:: >>> codes.SCT._1SigmaLowerValueOfPopulation Code(value='371919006', scheme_designator='SCT', meaning='1 Sigma Lower Value of population', scheme_version=None) Codes can also be accessed by CID:: >>> codes.cid270.Person Code(value='121006', scheme_designator='DCM', meaning='Person', scheme_version=None) >>> codes.cid270.dir() ['Device', 'Person'] If the CID number is unknown, it is possible to find it through a CID name dictionary:: >>> from pydicom.sr.codedict import cid_for_name >>> [name for name in cid_for_name if 'Observ' in name] ['ObservationSubjectClass', 'ObserverType', 'EchoFindingObservationTypes'] >>> cid_for_name['ObserverType'] 270 The following Scheme Designators are available in ``codes``: SCT, DCM, LN, FMA, MDC, UMLS, BARI, NCIt, NEU, UCUM, RADLEX, NDC, ITIS_TSN, PUBCHEM_CID, MSH As noted, these steps do not yet directly provide SR capabilities in *pydicom*, but provide some access to codes and CIDs in a similar way to DICOM keywords for the DICOM dictionary. pydicom-pydicom-20aa4b7/doc/tutorials/waveforms.rst000066400000000000000000000216511515706620200225710ustar00rootroot00000000000000========= Waveforms ========= This tutorial is about understanding waveforms in DICOM datasets and covers: * An introduction to DICOM waveforms * Decoding and displaying *Waveform Data* * Encoding *Waveform Data* It's assumed that you're already familiar with the :doc:`dataset basics `. **Prerequisites** .. code-block:: bash python -m pip install -U pydicom>=2.1 numpy matplotlib .. code-block:: bash conda install numpy matplotlib conda install -c conda-forge pydicom>=2.1 **References** * :dcm:`Waveform Module ` * :dcm:`Waveform Explanatory Information` * :dcm:`Waveform Information Model` * :dcm:`Waveform IODs` Waveforms in DICOM ================== There are a number of DICOM :dcm:`Information Object Definitions ` (IODs) that contain waveforms, such as :dcm:`12-Lead ECG`, :dcm:`Respiratory Waveform` and :dcm:`Real-Time Audio Waveform`. Every waveform IOD uses the :dcm:`Waveform Module ` to represent one or more multi-channel time-based digitized waveforms, sampled at constant time intervals. The waveforms within a dataset are contained in the items of the (5400,0100) *Waveform Sequence* element: .. code-block:: python >>> from pydicom import examples >>> ds = examples.waveform >>> ds.SOPClassUID.name '12-lead ECG Waveform Storage' >>> waveforms = ds.WaveformSequence >>> len(waveforms) 2 Each item in the sequence is a *multiplex group*, which is a group of related waveforms that are synchronised at common sampling frequency. .. code-block:: python >>> multiplex = waveforms[0] >>> multiplex.MultiplexGroupLabel 'RHYTHM' >>> multiplex.SamplingFrequency # in Hz "1000.0" >>> multiplex.NumberOfWaveformChannels 12 >>> multiplex.NumberOfWaveformSamples 10000 So the first multiplex group has 12 channels, each with 10,000 samples. Since the sampling frequency is 1 kHz, this represents 10 seconds of data. The defining information for each channel is available in the (5400,0200) *Channel Definition Sequence*: .. code-block:: python >>> for ii, channel in enumerate(multiplex.ChannelDefinitionSequence): ... source = channel.ChannelSourceSequence[0].CodeMeaning ... units = 'unitless' ... if 'ChannelSensitivity' in channel: # Type 1C, may be absent ... units = channel.ChannelSensitivityUnitsSequence[0].CodeMeaning ... print(f"Channel {ii + 1}: {source} ({units})") ... Channel 1: Lead I (Einthoven) (microvolt) Channel 2: Lead II (microvolt) Channel 3: Lead III (microvolt) Channel 4: Lead aVR (microvolt) Channel 5: Lead aVL (microvolt) Channel 6: Lead aVF (microvolt) Channel 7: Lead V1 (microvolt) Channel 8: Lead V2 (microvolt) Channel 9: Lead V3 (microvolt) Channel 10: Lead V4 (microvolt) Channel 11: Lead V5 (microvolt) Channel 12: Lead V6 (microvolt) Decoding *Waveform Data* ======================== The combined sample data for each multiplex is stored in the corresponding (5400,1010) *Waveform Data* element: .. code-block:: python >>> multiplex.WaveformBitsAllocated 16 >>> multiplex.WaveformSampleInterpretation 'SS' >>> len(multiplex.WaveformData) 240000 If *Waveform Bits Allocated* is ``16`` and *Waveform Sample Interpretation* is ``'SS'`` then the data for this multiplex consists of :dcm:`signed 16-bit samples `. Waveform data is encoded with the channels interleaved, so for our case the data is ordered as: .. code-block:: text (Ch 1, Sample 1), (Ch 2, Sample 1), ..., (Ch 12, Sample 1), (Ch 1, Sample 2), (Ch 2, Sample 2), ..., (Ch 12, Sample 2), ..., (Ch 1, Sample 10,000), (Ch 2, Sample 10,000), ..., (Ch 12, Sample 10,000) To decode the raw multiplex waveform data to a numpy :class:`~numpy.ndarray` you can use the :func:`~pydicom.waveforms.numpy_handler.multiplex_array` function. The following decodes and returns the raw data from the multiplex at *index* ``0`` within the *Waveform Sequence*: .. code-block:: python >>> from pydicom.waveforms import multiplex_array >>> raw = multiplex_array(ds, 0, as_raw=True) >>> raw[0, 0] 80 If (003A,0210) *Channel Sensitivity* is present within the multiplex's *Channel Definition Sequence* then the raw sample data needs to be corrected before it's in the quantity it represents. This correction is given by sample x *Channel Sensitivity* x *Channel Sensitivity Correction Factor* + *Channel Baseline* and will be applied when `as_raw` is ``False`` or when using the :meth:`Dataset.waveform_array()` function: >>> arr = ds.waveform_array(0) >>> arr[0, 0] >>> 100.0 >>> import matplotlib.pyplot as plt >>> fig, (ax1, ax2) = plt.subplots(2) >>> ax1.plot(raw[:, 0]) >>> ax1.set_ylabel("unitless") >>> ax2.plot(arr[:, 0]) >>> ax2.set_ylabel("μV") >>> plt.show() .. image:: waveforms_assets/waveforms_decode.png :width: 800 :align: center When processing large amounts of waveform data it might be more efficient to use the :func:`~pydicom.waveforms.numpy_handler.generate_multiplex` function instead. It yields an :class:`~numpy.ndarray` for each multiplex group within the *Waveform Sequence*: .. code-block:: python >>> from pydicom.waveforms import generate_multiplex >>> for arr in generate_multiplex(ds, as_raw=False): ... print(arr.shape) ... (10000, 12) (1200, 12) Encoding *Waveform Data* ======================== Having seen how to decode and view a waveform then next step is creating our own multiplex group. The new group will contain two channels representing cosine and sine curves. We've chosen to represent our waveforms using signed 16-bit integers, but you can use signed or unsigned 8, 16, 32 or 64-bit integers depending on the requirements of the IOD. First we create two :class:`ndarrays` with our waveform data: .. code-block:: python >>> import numpy as np >>> x = np.arange(0, 4 * np.pi, 0.1) >>> ch1 = (np.cos(x) * (2**15 - 1)).astype('int16') >>> ch2 = (np.sin(x) * (2**15 - 1)).astype('int16') Next we create the new multiplex group that will contain the waveforms: .. code-block:: python >>> from pydicom.dataset import Dataset >>> new = Dataset() >>> new.WaveformOriginality = "ORIGINAL" >>> new.NumberOfWaveformChannels = 2 >>> new.NumberOfWaveformSamples = len(x) >>> new.SamplingFrequency = 1000.0 To find out which elements we need to add to our new multiplex, we check the :dcm:`Waveform Module ` in Part 3 of the DICOM Standard. Type 1 elements must be present and not empty, Type 1C are conditionally required, Type 2 elements must be present but may be empty, and Type 3 elements are optional. Set our channel definitions, one for each channel (note that we have opted not to include a *Channel Sensitivity*, so our data will be unit-less). If you were to do this for real you would obviously use an official coding scheme. .. code-block:: python >>> new.ChannelDefinitionSequence = [Dataset(), Dataset()] >>> chdef_seq = new.ChannelDefinitionSequence >>> for chdef, curve_type in zip(chdef_seq, ["cosine", "sine"]): ... chdef.ChannelSampleSkew = "0" ... chdef.WaveformBitsStored = 16 ... chdef.ChannelSourceSequence = [Dataset()] ... source = chdef.ChannelSourceSequence[0] ... source.CodeValue = "1.0" ... source.CodingSchemeDesignator = "PYDICOM" ... source.CodingSchemeVersion = "1.0" ... source.CodeMeaning = curve_type Interleave the waveform samples, convert to bytes and set the *Waveform Data*. Since the dataset's transfer syntax is little endian, if you're working on a big endian system you'll need to perform the necessary conversion. You can determine the endianness of your system with ``import sys; print(sys.byteorder)``. We also set our corresponding *Waveform Bits Allocated* and *Waveform Sample Interpretation* element values to match our data representation type: .. code-block:: python >>> arr = np.stack((ch1, ch2), axis=1) >>> arr.shape (126, 2) >>> new.WaveformData = arr.tobytes() >>> new.WaveformBitsAllocated = 16 >>> new.WaveformSampleInterpretation = 'SS' And finally add the new multiplex group to our example dataset and save: .. code-block:: python >>> ds.WaveformSequence.append(new) >>> ds.save_as("my_waveform.dcm") We should now be able to plot our new waveforms: .. code-block:: python >>> from pydicom import dcmread >>> ds = dcmread("my_waveform.dcm") >>> arr = ds.waveform_array(2) >>> fig, (ax1, ax2) = plt.subplots(2) >>> ax1.plot(arr[:, 0]) >>> ax2.plot(arr[:, 1]) >>> plt.show() .. image:: waveforms_assets/waveforms_encode.png :width: 800 :align: center pydicom-pydicom-20aa4b7/doc/tutorials/waveforms_assets/000077500000000000000000000000001515706620200234145ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/doc/tutorials/waveforms_assets/waveforms_decode.png000066400000000000000000004102441515706620200274430ustar00rootroot00000000000000PNG  IHDR8ba9tEXtSoftwareMatplotlib version3.3.0, https://matplotlib.org/:Zd pHYsaa?iIDATxyUolH "s\WQTP@*TT@Qda_ Y $!dlu>U]]=]]y^yfTթOW_դI/ګN}Zzkѡ#Gq)T &PuN8}رcuo__|Z[[uύ9R'|f̘!I1cFeK駟d2YfU"[lGW}_m&Ijmm$7}ƍ_kmmرc766j{ܺt:N8A?O%I{,Xw:C5\+2(an=ԤI~Zr$i;޳~zkÆ {{{e=n^zV (";SxbsK,~'I8qƏ~Cfɓ%I'OV[[fϞm'P:'ݖ1)Pu7ַU?OO|B/?$)H~ĉuk҇?aIgu/wzzztESkt L&N`yu饗jҥ8q.b}__d2?jkkioQr-[袋.XYq~j8~ DZQ@0j\`Hy (Z45|Mz);5zPDc@ w#gW&jEWGg@@l1}irNK#](3 V F/(2ԍۻ-M 5|aH9򸱈!fE|@0J9@e8:e^8~Xo1}裸X0mf @0zD  dQ+UbeԐf1sX hNeXh}49hH1ۆ @@(+_4X0mm;{ ISU4eGX饠XdX; Dڕ,s㨭QH1i+,,R⸙~ X ! Hay2.RlXIb @0SJ 4(]L4b%((V/#P|p DI g,BB A# V+F'AkkbrTUQaydAUHD_ԅ^1chذa:s~zg\Rs cK.QoooˉŹ|v20Pin?fF s5 4 `F5LF5qGhݺu{~xu]z駵vZ}_OR:sݭӧnӭު+? ̜LK .=؏9⃸Z9jp?P}%P1Q'RCXcwSccƏ|{{?;лnI-ܢ?\3g)G}T-c=qcW_~я~j8"f xjnUH3c渊-c'ͪcNt `@M,]T{8wyZr$i駟nӾ3fHf̘#YzNnI˗/6m۶Mjnn֨Q3n8JZ[[k\s59ro„ `4X1sr]M7f$96+j#((C/vU+)h(qΠUwgۏ:(|oSm^z.b뎎1,T?iVĂ4ܤG~Zv~A5rH]p5zh1B_4ydr)38C&Mg?Y]wujmme] /P---56NjcП,Rk)⣗ 9v$4ŏy$y4()j#TիOZ7o{N;M3g{!IL&u窫KgynF+_&OCUW]U U,VU?M i Ň9 @ Eas(>8TݝwYAiʔ)2eJ~z衇57B{Gk+DZ4f0,vzit->_t4jjK{+_AIVU2~)Lh(⸊.3I@G E3(Ufpmֈ^Vk`LVos Ei&D)X!||5Rܤ7NSB4R.:,f|.Uї:;֊XJDHI@D YBc5&Bli֭EїbBA^E))&EW(H-)J))W4rW v}ڍ>REuXa@9^706)j+hHr_TE_尊&:5*ZM h _񒡽bgv4rGk@ZE"B;Ey $L4)&D iXaFy0XZ 4TR!>4hJeiukSt-Xhp `J@Bxp䀥"-͒[P@i4T$bEMe21cbH0bż+} 5g1mU5ܬG)KBnhsḊ&VDYb%#fI_`6Hx6w{1M)&DuXa9q8g^QX,06^ghGPRbG xq8l'&D +ifCĊ@XR*ċXbGJxhs,P*Ra@9VCXțK[EZ X,kIOn/+:TDsun w@ Vj#%̢X P̀+>́)K ,X]CbT%BxVC[Dx_QAQ?5(t@ +bŹb*GJȟGkE)ՅGx@<8"u?@@d+䖏/b!ol #2 E)>ERuFUmcZ@4ʱb&biqte2 ~A&oK+ j(,?JCExp?TY +TX!LhhJ<ƿg[PQD xf ZCu4J+*k:7DxO)CcE{2]Յ̂@vAȑ("݇:eTX!UI͢(Md-/y`5d/ my)ER~4bqN/57& `ƃi8xpGR4Q ^vP)bQhGPTٯJ068h2<+**h" VJE07MEV~ |!Z+:x`@%^ShGP3=0I;EUwbє?VAQ+jh(/L{EQ~ DQ`XmrOơRPS/~먣rяگR)s9um[oW\QUFxb<0(XQ/kJxafyl]}՚2ek# }fD7wAHʛQN;EZ~rG+Z0U]>j̅^s9G~ٳga}W3f̐$͘1CGyƍg3TGG.\X5_P88⁀Z`\ x LkW o h Lwy̙_|1V577kԨQǍV=.uuu_wttT#Fok#^F5#ʘj#("B:. TݪU5hРmkȑ#&Lڶt<&xJ0̲S/!e]$q=Tnڰa;8566QO?n566jܸqV[[֯_KƏnK/U{{oժUp3U `<UюW$)z] /W: FUGܹs'p;/ìf%EW~0J&s@cUFP)bBʒxXi<4SW5.N,hr`0,ڬɥƹ@MXmaCP)bx )!E (GUxhHd2yh8TXɛQ^݀O*5x%7R˽A)!WF;jNfWd~J$WDy6B@(7iRă`q@`-XYŚk#(K#jDB s-8Xq} E+@x2`r*pgP8"B49EUb`M!|t٫4 F#=S}> VT4wg@є?PYAQrjx`Z뚔LP9jVp _6EKYMI*ɞQX,0Z 'a"Z0SN`8 x+V21Q5j7(n'RE*Ij@4̠ZAHq+z-o2wxɪ"-ː7}h/(豎l c5`B_yy*F@*Q eZ+sRQ;eg@9H-@ hJl5S'ḙช:@ ! 62!BFʒxډbіPfr,9Z`ޠ\&5m ;5x24%5!vpFFp{fLJxhsMj6f:i2k3ˣj1L&"!!3XIXpɞYJ*ImJ5%w#e2ٯihOYÝT*d"!+Qh 4av|X "p E!m(Nq@qxȯ@CEV h˫E{E٧HZ5R  @3RĆc``\J* D[~`"kl#e"-Xs-lj/룳R-j[D@l}RTxpf0Eihr)a#'HD?=J'OmT0oQV1,2 łD&\PNdfeMkpeIvy9)vH& a5R8FJ]@0QfjNŃzEsEOX/3qP)bNhXiܗMJ(Sq @%\Io}K{|r]|5; i3${3U@`'iT%ƌZ Jhi|覛n̙3>O$r-:5sLr)zGh"=c7n9]}wGjnnF5=iEc[HJ3P+" DWj-jђX@/ڼִYf&rio +o[566_n&ޒ~XguV>3J;Ԏ;4yd͞=[===:vaw}5c IҌ3tGjܸq{E2ۯc[U4A}_֒%K$I˖-ӧ>) 2DwuY:蠃tkG_?~x5~xI~׭ Kn[jUY·XAqŹ +6צU0niRkZQk̴&B?j*uՏiˎ& Tf`&D |[d9I]wݥ;t뭷鴺tǫI?ŋrJML 9[HQf5Y[Z]ݤ'X)8v '?N?t=Ӻ馛$I˗/+[̆ }N֭ȑ#uQGG{^I٢dR{tgoA>h:t?|]uU*Ee+c,:lp1ŵ+ `e~]˽A!V1U]:s 9IAWy睧~:HKo}[}Ο4HSLє)S gC={rfCڲS{ oѠp7T/VD׸$eg1,RF^D{,7Y_v5hH,\m(mf2q&>#-|;ꨣ4O "|r5*_YݦyP=w:T0AV:n83".7YQgި7$iHs.>jhI{O}YIQ (QT`)m曺:}̾R>JQeikkG]zڲe$iѢE@X|5͍lжQb2ʬ@2Z 1WAٹʙI1Čh3\h1닠Zy," ̘\s0,6F2G}k;xJop7P'a?߷@O/٨  !X/}{キZ[[kGh2JkFex!n-+@Y_IfGu4VgrEk3(jg!L+JYSXPB }r5;X ݛւ5̲uB^eh!_̙LƱ2@}`|kiiQGG%Kh=a**K JW4zҎYF- ̂4U4\* 0P{HR1ի9g:u\yk*m,u\5{m @ouUWGRrJ}չ[@`*ak˹E-_׿e˖zW18r#ui;1,́glEw׳jA꫷ m[ TI96жUoT ^zU~T-Zꄳ?~.9+˧+ꔵFyWCx˥N]]yεʓwpO-?|ܯ[ʶvUWiΝyڵKW]uU 3w s9$CՕa~8S5Yυ]2K<Jgt;{uO:k+3z]+ܜ_7se咤kvE:U磋Kνi$iжU1cvym+|VV:ٓV=uGw89gaE~> ߮Jm߾=;w+a7HU`ue[~vhGsˬ@eҜWf_t.XvG9^IaŌV9 WǮgI] *_W?oՖ]sCZ}S9lkvgO~޾kzSC*3T^@uorΛ7OGS3gSD@ur˿7ُ_Yݮ^]9i/&H25%ꀊYGkոy&oಌՅU:RRtb{!V fmduKY\޺X4&CQ0Jmׇr#J}vj(ry*"ݛVs#qSqOGgOs3\m 4wUfVU5S|#(5k0`NtAcBVrAS*^UT@ťTԪSzrmk 77&VmWw^@Iկd/|AW^yFiܬ_'ObpT: ?^Z;;!Gq1sa 9mf]0SUN=h#&FS.P@:X Cl+[`?f?xH3Wa-}f=@):aVW޿~lXc7kZsC*\GTwBE%'o}jGO:)ܬpQ KvxDpWZ*]Aʻ:65YυV>ZfM6Po*fRՅ0Cxs&++ ¯b8sb Wl7'7m|LVۭW ѡ#FH=XڵKv|> ,^D]՚%{-Wq\w`g_w-fTVL *ksnszRN$G-*,ZסTZMSQTZ5(bرJRšgf|Ofͧ0Sh(jvӺu4vX5s0*JqA9Ý־+?<ʓJ뾢P$ʄu\y3¢8JxmdY|gXVnF,z^-S5WlؖW7謷guN$jE\a*;5suyaen0kh x =ZOxo0Un}>0Oo:W*{fy4@2v][{U*ƀ>=>/){57r`^5B*tdf?֯Y sWʟ&dU: :ߙ1ڸ+gLg,49YY qNDDB>i*JЋ>W5u90SuSH wx>jMd(i[C[uQ{bI@JsW wƽ/{ gəV+2ӑ3:paT9z.=s+I%G*n;wO8[ٰվ3<Յ}pR9`?.7DYW(̕5?2 K{Ɔd w‡0vM/6lؠk*> s6=ʃQOOߗ_BzÚr[Ǵj;MO݆RXޯT=MeؐI5X 1a"{h:YyW7??rf/O Q*<*W˓u\Jj,V}F?W9N$yD:}MkN\=g}+u># "xwyھ}FP' W>jKO?k3܅d3DonީnnJf z9zakTq 6u\u3x {$u ]Cf=嗯]g6%eSZtFLZ/XK: ȽFIG;rwS( [YLHZrPsA:l\EI+P~([/hjkk֭[[la*aTS;% ;iݰ1Hvh݁KUi xF Bj1ݩ#8/ k+jlΘa-D?V!Lm[6y{ǽ7aJ-=Y1Z5窳 5R : 5$]`0J416f}_א!Cj+6KDx#$Iњ{{;:)痵tKo? ]_Kd(-Xf|.L8.#r*n}f u흡|@քZK^/V౹!zΞ\ B?24kӪ#d1k}HvoUc2wG`4_3*ܮsߠRB vg꥗^n`$IV>bܠr9vkJc>]1+Js,y?~\C=I1kg(IRSǑ[9KTƹ XVmmB;_Xi?n2Ғ0Kٿc@o5Oq[$w_c`8;PRYf`Cf٫s>D81r>E v9K.ѢEtGY` QJSL[ھ_fD3Ϩlfo)YaWۻz_ux}W$I]i{ skٹ#ZfOi{j@5jJ'I{(:tT6# 3?)#T%'O+mL)9:) 9HRX޺+܍P{fI$I{l?՛vkoEIUW]Z"PBK[3$p b0ܬAiLvK_>nJ5IsqJ5Ȩx㓯3 ~u&W8Y a@k&lo5FF*ɐW֠r#v~yQ ˷hѺd)Zad ٣˜|3Ɯ\PA:q|q+Jp &Φ6k6qlo9gw[Ǒ$5&jPTg0m;?x@KVB:qx}_xޝש̒yY>VNqr`Z7mVy\Y`xȽ\gp}s!i_ HV7D"/{h݇juqR80Wi{B]h $H]@ˌjYDkѻf[I{wϗ!nu__S"'o EމBC 98JEqgZ5Rn%sV[T=:ݙ\ UL:< 3WQ[ǏR oyM Iu) {u|ӣ˗Qx ꤘaݣ[Qsj'̀_ksaڜqSJyF]jOJ3*oy~6Fn6nCfu\1%3VW,:v_Ksպ\ SomByutt|{ߘLePd2Ze$!;o !u Xl{%C,@ahj$`3œk$g[YY/|I{ X1eik=RyG+ cq{2R2^ BsYI %QvIFR 0k=e+Ryl Ҡ 3bgޤW42-_EúY7?57վۂ`%DV1MsEdt~X׉dxmD"r )]@ex3%jU¼^n%U1?%c@~YP#P3\}\!m'o7pL&u>@wUP,xm;{M_v d6\++z d 4$s7a3$Ibme~^j?D@YҎh9ғʨo%<ԘLՂm^*Le?frqx TLwAҎ5Zvte46#c? «] sAfzΆRhI_g)I69, >o_d2=C.k^S2D"cw=s89c/\W ę:pg*[3VRF@VdVyk Lvv1TZEbW|xs5O5vX}ŋԅ^1chذa:s~z{V\s9GC رcu%zSe4~ IҧO~JD`9XuN"}w2.c`%YF/0SGُwr.P o͏3/;pI{}KZC2MIܼb4$#YR7Xv:7\a6N/0GסΪ}+6f/9gVk0Sk+#'eC@m'Lp|M OPuO?.B͜9SӦMSOO8 ؑ7x@wu~i]VGS9uwwkt뭷+ŏ*5R9ܺaa,z}sa¿aUzRV뇝g4^&边ٙooil9q{3,iT<`2n֭c+"!hzZrfϞ-)[TO~_~?xr->}fΜ)IzGh"o1>[W_}LZx5~pS}SFјEi 3v3hq7{,IP\h-bXPJ5)ߎ]T1gf?f0ٟT.$Y@u?fUa)p25X{סc%I1Tp~mfSYFC2FWp3?$m-.H>|I>ǏWww_~Əogy[yiiiш#/V'ٯo;"L_n&e,20Wq2nO?ܹzꁙVRheO;\[)ُYQY\;25B _Z:{8f*Q ݽ)5,E`V--ksX%׬*?AqҜ=v2O*o L&.H{x M8&=s/ʕ+5ydIɓ5|mذ~ϴi4bM4:?κ4_q3ѾGt~9rWr39cZGqU\c`%ю75E?Ik̛}qscR6Kó@㻬@ _tVp[ 8 nP/@ la->udB}'^΁ 24<B7&V`m<@!]EϿC$I0:m- /PtwhjmmUkkv%I9r.]|z'5{l}ɓu)H8 M4Ig5o<=#t?B6R*$Bd>;^˥Tf{,n ky#Mqn'Śsn#m9l(jLASV׍꼞ZbP)-7gn*oUQS?=vϥ`vyaB!(0{s ]KNp}XKv c{"p(P&KƍOn?N& d@ wLFTTM7ݤvԞ{i?a~{z߮{_ohhЃ>McDRVTEY7VJ0 aqxHsJV>g s21r)81s`K5պ7$s)]^ٟ0fv{FyX9ujOYRSKt#f0\ɤQ[-&ڰI斝mTP!a{!T~؏៙Z&_־+MS,\o2X9%I;共 LN&I{F*-|_ 8uAekŚ~]oW3 D~Re0ڮ,XrS1'd~3+@VL-[ĴLOrc2rs !:}sV7a~E%I/mq.\R:ŤXHKCZar-V..c*X/-FcȽ )k1QjK %.$I-#3d W#ITX y<bmm$鑅߃ \lڢcwF2&p\y1O7f |fuxzИ!fr"{._1FI=fbþP"|%I{ o nuL-VfԐf5Yկc Vܐ!$VZ 5LŊ`0sdH :\i.(0[u<%^`~U$Y+` Y} c?nl,\DX{yJF!eL m6o'xau?D(_K;:H'16WVI,w3e +1k5=_,5.%ڧ>VR8EOo[A΀E":f!jXW9 kk}m. +bӘHd`fg`kJA;taۏfz6 Y #|w ('XgfՁ8w2\=bkPE g˜қ[9?~竳Ktߺy X u<YS4HUZƕ(&w >`))cPV&ooV۱Ld<$V˘}ιm@mV'3D XP B{c΀WPtƾ*gVg*"P ǔo,Nj0 ^M9RBB E9+^CG؏inuKf[EL^y3WI52>hƵ^=௨X5cw45ת^܆aU8_f /gݸwU+G YXK+.rkn]akbQ+r,TWwa;2kHF }s5 ¬U~CZDt{!cb:Q5ELIX^sYͺ_J$Yd\! b#cT!9W:&uL왕D(˿g.\u+:\0ٯ:㽴U!W kKҧNuHP4;PU4R@YvrWdFFfds0zӞُG "V)"I{H Bς< ]-WGØiG;ذ;CpfY I>%us@=6AX j*^t%Hk+^)s8=h)s`u|_w:.m+39Tsuy'>4D" s\V8PpشK[wHrURNX):vBoZSCRo=p$.eh]Gն'dx+ >6W):` F7yLP rȾfo꼊!IKTJ3gY+3;*u;@(J2@XI& Iټ+ Sb%gi܆PvQ1c,/A(ɬU#VXycIJWX\LF[+lء}Łwus8 '3UN6{ ֔^l=P`6vQ W1#yjkdOp\=z.]W R xzjFqI րF+83~.U}'݇舽Fz vr\c(ЖlĠFҚaܨfW)7C+n2(`e͖ !A^5+]JC䃁 : dY@ 1\*y*njHڹw T"}2Qx?]\!phmSc'PQ?;%rd"Ԛ n,@&`A0fm%I ǚBk0#,U̬r_ٕ y`S[YB{`9_+Gͮٸ+m{ZH+̠gKwZ]˹:PkU-;UK8n~v$+kD()JM>uInCWY'b)|FXG N$nn>ˋ}6^+Y^94fZmgv"7cH61VPXa b@Y|E@iSN^0/ݖ݁mޘ5D)HU_ _i),ŮWJۍ\.`+6dh1|aѶS>Ya5A@ gC!T34a`IV(,6;]Z<_D ?́J-?qpKj(,f†Q1ҘmG*a~րG+k$AAYUPnZ0W:کNN/#;yp۰|Ē}s3+4R:̏Yfn/Q\s %;ł3Vsv@ OB @O*+;C̿Fk*%U^]!Ijj,=[t% S_!R!$?V䊖fKD[[ޚ\%1#AAۋ ty+j>YVSJ/l=wjKpYc,w:>yfbT%P]@r IL"x}vIKon fjX0;j\嗯,&X+f-Rv덻dIc]O9 ly eu?c|@} +2Hv ȿ0Dk{eƕvk{nv N玧Tnek(fD gn d>jT^,OY5jx][#(ϸ.^fdi׊\*ҕd=MEV?+@Ne|ڲC͚վh]E]r#VIxhnL=+>U1iޓJyka[x1Ds[;5mzIs=ǛvtUa5G@,n&ZP)ϜYlvm ˥ ~y\ nS@M!9WG/f.\A"_=`*)On?m :ͦ_ATP} 3]㆗|M]vMn@kR y )(Zo)^T,\f "m5fQ/ኌ.ZWxU[7?.!>g?{\r׼7 Óy3f1&Oo)r)̂}l$0 Y,V`ü,gTMv毳3QW^X~ckEk)R$s3SAsڹ]S|@N+e9 ڭ ) Tc=1<XK5X7#80~+A6n/i{wP{qې-}F +ǵ!}zw(/7~X`˭WdVzrS1\P n*jd= rl ׫#Ibwlk*YDqPb(^Qc&Ӷ&4OX+XQSu]S= { -9pJ1tt.$@} n{IR^E AN8Yog@@,}QG >\pR}L-&8fjTZ π޲7\ 6,#Un(W_q|]lP3(:r+q\*C5逊:֣\pk[+Fz+N3rI҂" &/]:>Y!9>:YѧruuZuW~c0O@͋MΑ}v.V I{Ї-L?`૘B5Ufo?݆4WzdrKoMҐB9僾'k`{vR+$I-]@6X\f5nّk=xGhHlˮ޴RLٹ- !pvXG֞"X"I=ИǏ9PdXlt +J+5Yn @u"W4chitM=bF)w+zda6G..Q0sJԲN}쾣ǻzR5}\eWADjn(~N{޹YA]A_)e*Np3N>uuw̐YZqfY7[ o^5A@} 3sAڸK߾k$cF?ΔMp'~j,}X6yūRE_'Piff)UPA%fTŸkp%ȕ5Q%_{/Vj=_yC3{=nIIGWzK!r[1ڒYf^&^>NV?>,RFwgwȥi=(VOG˲;The}f-kfĀ޾ (PĂsFy"G:5*&*ld±Ƹ}WOETwRO7#ArԐe޺~|QEkw R ͠.ҡyJ)K_^+6NWv[_ l$eW}k@dj=jQE{d_Ҡy~-tS3(#HhXKv({eMe߿wRD" gwrrT? Vfe;P? iثG/g;*5F &G@,D˜1JWx TRX5s9L uóo=yF#H 0OU6Y/L-T@q qb|T:kؼ)3;ݮ?@G 3x{?FO~cF:2ơ+r]ü/d kFnDZ~YA4URMrr)wm+&]]qiW@, bPڇ3vj,.=wm ^|`SƕIʥ@rˮor)wa۳ ;d!SXMXMC rb3PiQro Ί[́d"ᨭP,c.X竻V*B {Kک)>Q>+Mu դ '৔KA[_;=7Ajat@Cs}q2L +4?YJpP{Pu<>hR"пoLFW\qsO UaG *e3hY*i(u~mk #?USe۟f3I{5;yJ7eWk{]u7%OoGazYTrYWV 5vWvOoE5l*g on$_C!tu3ǃ /X/A8Ҩ {7^[ԿрzAUc}њ2e]wnwӬY4tPy&8pBM6M>y}K_֏=gR0s*,d7rC@3Ɩ7py{W7 iנu#yəVA :Pӟfm XV!A2ϟ~5б^]p ,VALO~yZ{Er+~:.O/+΁]~j1o?dsy,F!`M> W["ty+Z|Y6/?} ;~n,>l?G>2~_.Ӈ>!uQ_k+^}UM:Uu'No~yZ"Z9s+]2o-iV Tn@ߌ 4ڏt)v|jF&V!v\QܯnVaRxveIGzf9{Vn ;fԔs[uo[a[+;{RTSC+6(9)dmzdz_G ~pWHim^(Ǎx~ܸqk;vF=~.utt8!>?WIYPѾzC9hMpRJTØ7O/ T^+u3Y?],)Hq5Ft/SLg\zye{kY[ӯ}/;n*qԜ{}k 4^*Qn2&3I;bd=\~tk) so?k L]Ъ6z~ufcnS#:Sp꺗NgtMU*_lOw9?v ->'ܕck4rH߄ jK(C_)]moqf?O8[7#J@GE-"هُ#V4Rns-0XǏ$ XS.Q.Ik1RVmq~}~#MaJkRV.y Zw8w´hs1iW!Ι3߀ӮZUSfJ/Ҙ}`r&Q&.#'79oyg};+;^{r⯯0%Jg?̬kM i}XR&#1S7~s b֬]JW]+uM / \0)Ǐ$_Ə ^mٲ~K/TUV|/+WeEvut/;!WJSJu` <6)t3PyʍJ)07k_;:;g1C$e@רq(7."ǯ}9I@>ocnҍzϦcFm9)C\۶MUOcg])NT胿}^Lğ|sy=WuOt+chAVw/TAr{UaS;݇~Ssji2>fhGR{9[>PyoHO|T/,RNDĉ5~x=s5k&O,IghĈy}v}w%FŴ4 @YJ)w#Xɀy31MץkMs׏A>s[S՞yyaE7\oNh?^ѥ{__IohWOJ7:?+f-e]JgOZztO+g%޽ruĺN v 5[6 ;^abV;!{zyʗoڡk5هV vz6n-4'^++_WzM#I#7;._ϼLۻ1}G]u.l٣Vl7A5W;5\ފOo׮y5m=@5p{1۷kܹ;wl߹sjʕJ$7Ǻ5|}s^{Ò?\gu/^?.Hԧ^{Crʹ*Y)kZg2fY7!Δ?n,/"kv.֝/Vs`5l'k֗߿ǖ'嘡l)bV`q>w4Hn?2g̰a3go(}ǁTs)$}MqVf+H-wj-wNdL&=[I}¹"7Yco?.'wv-YMD}qȶ\~d~iA4/m;s~~)]s@>ɽZ~=+Ui[?W"=~}sש+d}6o~fy ۸cG,$yt]-H#.^һ./Xt[owرC_җ֦N;MSNՠAo]]t(Ls 7PI*  f[\az}6Z|`iq-/hF6J{.ob~mն mnUkz#_B3 int T>hߦ@% 5{^kݦZ?\#5y~{p\3`~-u?iJνq^E;U^YF X?p-PvhۭF]9xg\UzKzwzv& |Wa^VJ;@V?PZ|pWl'!Da7 J(t6M%ܟOw̪[vtTN#9 b6;Wjt2%Wxqrty{lu$*';!Il>t/WIMrK|9:G\0suöN}գ:g뛴xwҮyk5M}?O5,ؖ;Z6[KuVڟf7? x&e]k݇- {Is⾴Ae:\MB'7w~uдo=\+_ V|/3P=m IS7|J Nf jjx=ſb( Fc^\yW}1E;,#>E%+vv!9l\*\ze_?yU_klH#볓㆗ ŭ* ߕism(ޮ޴.|=4?{N6g"P;:߷4]w~s m֥Sf.ߴ,kx~+@!jKu^fM7(f)1rkf^93,+iSu5$8s-?~bN.<3k>G:}*c֘.Gs7w.k{ZVb)R5fI]fJcVȨdµ9ZQ_9KYZf]W^Xݷ>"fTnSU= _?bo=0o}}L=0o^(0 ?<؏Ϳ6*;٫iKK|/'n1'M]Xz\JtbQ՟Y8]N7^I^md_.knXw,=;Ӿ[9%npOܿykYZ O?R.z_KosG^+\8IWTFݰ(\3/|ARJզ~'OP^Z=dՖj-PSA>+(X |`MlsM= gF9I:gO~m%H,w8rtZ-4lJ5gF[c)J?=[ohK]ws{o ?# &,׵׏/շ8xcib+ %iF~EM;N~>*RǃNx_Wz^0`m]j(::L^ Ʉ/3[;֠}+8PhҒ:tٿ{',wuj)՛BE/K-z9s㝇Qͥ_G !((4T:r~fZguѺ3*[w|R[|:wt㿛+ϻh}ו,YzVSMg |da+M6M)g>3OW!}xYcd|%eYH!WLK3/}}߲[%΋ )gP_uȕ]+f3 T|Iq:=ejHٓ'~?17Z%fmԇ~⪢B)JȾ{`öV<:xp.`Wݽi}晎?oNzqV_3tV쳛s0_=snx'E -k8V P"Y8:yA;`ҟXAd2_wU^>J\s_W 3e]2~tB-XӮ3Z??PbߙLF_KyUbq67<;@JT@Ǖ{g*k٣]q¼2#y]cgK gh6}3vY?NgL՗^7x+QAͬx]rLsg'jq+׽/g.۬Yw ^!(1 z!'Sn{ɞ{ۯ簱=P*dъkѥ+/Ns~uç49,6ƞSd+.tE3Va TCޥnrG{-\E_Ś])0hMbcaΛ&/>}%{EE_olv*nX5bjf؜!՛5+On+tn.5Pi}j~mwtF_u|O!ܖ{N=0oҪ34M RW)sߓ+pm{unq]pۋEgJҾ˛,.ZסG_|lij`ͬ[ ~ ;^֭}g}5-Xӡ[_k+gmS1slP'1*ܗW T}7<^Zv޴JRmޞKH+f{C/5SWzAS95,9PsTi,`C=sV* ^+&sr)"v߇KYJGg*ts98ǎrf+v y=q+*v?ٟ@?{|SΞN6k~'G`Θ5ִS7cJh(0W1>x^:qM_؃g:N p]u {tڒEM}MZa_R07Pck~plgnw`?bx~ Y6{{tM ~_&}PS;5G2ygYšifg ذ:L1ذjN]$t:w 7uLݿ;m}wio=go=tcbn0eĽn3V|u4+ywl7@T|kcPܝTW4r,, 1y{Rm/:U_ٹG~Γ&֧Ol799r[YJyY1cWw=?y?{%T&ɿKwOe^o5'1uf)RLѕf[rfocwoZb#5A3G|Y3mqWObc9qqKRgO1yk}}iZt"^As֡c[t3/}OZ13cYsݯvq=\ǂxgYc: xz5&Iž>GS]O]~-\[8-_'U }nCt1=/Von\h! u`JC3ήޚ XM;<ϿIG_ݏ\LyusգzuY/SUAJ30fZrfsգېLOe^`nMq]zOosvݓ (q#TɵЖFMqy1缹UG_WX8~>~OA9:u+8<\j kݬ;7gM[^|!_3ܚzo~cQC/ޗF?s,}psMG_nxxACȼoޭ+H5pG]?[3B=N&e33ͼ|/*bkoP&~7CizL])uT+i$} }N}˫uH6n׆΢}מ t׀;Eoґ?zD?OS!7q?/>ҾjVKI0si9+E٥MKbz| K. 97vQ#I6D/_q>qB V ]=VMb+8J {.Dv-g90|O*6k}w Z} 2>kK~F\ZubYhGqF/^.~}[vtk[6m^x$=w? 奶}o1RYWnė:['Z5}7=:{Һ*׵=%F ?L+k*Qi 9QlҒyx^Cn|uWL63%g6ZjԐ&]#CVt=8?[4jH&0=7z{uZ;uTPg٠.=tVyܼ!%:gJgtK5R^1]`6IRVM᲍;/#~*oYꭹ\ {K6uS_ӆm7=׽/]V~:姏d@6t TZy~65mtoywPSM}+4|aH&wtꘫ]={uӏmۥM}Ǭ[զ_N[Ξf8ZKK,/A+͛ӹWW?`?MԞ#;u{LGȳH\K"֠ɇߒXvyށJta_^?u)ӊ;Ӈ^-+S]=Mr? H;_Ks_:E~>mIҐ~Xm_̆.lk:GZ.~|VuÝ7x&XB㻹U盌t]{{jܼS^n~f~p|=4,wecK # ۵G?dn㯮/3td*?+O -bo?}G%RJOOQBJͮ|i*+){=gXqI|52렪lDz;1F߫O~AP睼^:fQ i/]@\D@ ~6kYo;xw}}gvvkԐf=g=kTBz{ 0-5>Hvr(@9̼nx13G~64ge$}wSw\tT +1C\^ޢ5fwV8?!cslys<^]ס{օ:dY__Ҽzda;sJ+ m~Ыիo5Ot[_ w~c_{zqV=zثX˗%3ɓg<uƟykF]M^oR_uV`JwN&#,Yz@rít~>՞xxh$ Ӈ]|#V7ggv>*q#6VNkk0Q^Q;8TQmHմr>1MC(Tz U~ r%eڊ[s}@jeɈ2='T(bUE7Tso eƉ$ [__U8R^,=R7&<*P6*&Euޏ5HmUf'VGӍ뫢:o6NWqeP*lXt,SWoߗ~}}t͘w#&"˄ᙃX~\|<1}>ߣUh]r1xxm\7Hjm#֨D?SɇBkJG>?-(>JkҸ-P_iʣLX,xPǗ/]\3itHX""?f#O0gxo(jCꀂ~0"wUpE5ޱckׯ-!Mf\fu80>?ZS&*U~r;Z/[>/=Rj64ju*F+F,zZw>KcHؤ8랺o^ VWd1Õ%BaHmz`_^^ɖ= ?&Q*n)?BqڧkmmƱC;4ūWe W{ƬQ@@o+"yTV"jVWLn:sS0mpdEe.m/6PqC ܾ&<g\CM/euꍅdF~ֹݪ6M {E񿑋*vupߴu,݂;OB?N[~WKh( Zt,8oxr&..)~MJ]6|}^bG܅U~vj~m8N ?.ӞfbCSC]Zt`0Õ:䔿~=/Vm2&UIYy0'wopGYJ]0zDr0o˨ɨ}jJBQtt-hb">Q^rnϷ3+L膥Ktfvh} DYU~}p뵫c ;C2J#'ˇ-s8ڨ _`d@ ۢȓz{i?V1rQ":UU~?1 ӱ,=~.K捴F]Zh[b{61=!?;:P+u%cś1k\>Gb5ېSEbg~-&k2ߵ+p$Q^G*5r*gGu@ChskRX2#:oWߍĠ8w5l]uY~wYJ8gxiztZ >Z:S׹rp6X_]Vٺ0~s[4f"2cJ V'@ű{#v2+sCqv'as_:![AGu1Q:ؑM" i7fnpL}#5yl_դez_pƓ OIYy0xCFT\{56rbyJ#.oghw,dṫ[mW/"Z%cݽ^h%uĢ[~È˰iW*/PïᓴlŐM1&¤ޅ8O}汝1g>~{rkSnY!H+Dj7LXSz$J}v'`$ÇW4O+cbWF|/'\v(_*PY|׿  41v˹ߙ#\uU@цjus7<|Xǔ~-kj|o>MzV9q¹Âigrsliݲ'd=6U0kwc2QWχ,;hfF-j9R&Ax_8Ry.qJo|<ŚIˁr->ш5f ,v{;X0}ϛ_nš;Uu bbm1?zzGkgZeba-s̯ꮨخժI1&;.Aذ,b0%Ih2|CD{v׾W{ n{sgR N?Ή71ڭ ѧuXnSZe@[JNuWڵ/}]i^wSE)VOu7K~cX^-0ɦªۛ X|cQ"fFu1Oi#EOuYc؇~գĈ{rlAcUmvoߟ{f_؇EKi9?cmd&sB`MPXjcw93J#XuoV?BUֽش,N(+A*⃺Z? Bkz٣1w|E׬yq~qi͏}yיDl^4Ш&Y!\Uʪx/ݮ᝚i]2)b1  ^ӆ޽8F ;ʫBwߠZϤQb-Prl'|y,^x,TP^X΅J/UQҚ1knSW1יvqn! $8bƉ:Wb٦]hchiZ⫏낗 88P|BFvʹDgWi {xaR}okQv)+fm6;DV^ؼ:6o}ӽxzИW4 ң(/9Xs(բّ~-Z4,\|n6N'#Y^ &`򙗕4qU׏5crS\D,Lb6$h[8_**p^#B)n;'jbڪ ˆ"re˅mrpZh 5$+5;g,zk+tY6p] SIqE0Wn7LDO&z]+& 3 ;VnŔ5o=n-мq:3V"`|$oz4/bͲmo0/eS|f*ȿ /ȏ8. mSDA]>kǧGawبԾeiJػ#;DK+RPp#P9!%F׭kQ `Խ~^nD]ssuܵivyYؾf&qRymcsA=#_0 0W浯h no䱮; R:m`k!ʿ7cWnpZ*XUZ[0U=SՅYZ#~Zz%eԮ)ƀhf'#zM ID/NL-F| |R3Q,?EWLAS4<L节$nI=~Nm:3ZyX߃j{m1 y)RnZ+v|_rPWA-z~?;?N ӇCO?&W{,fqvrl'C^ZZ('oߵʚ ƒ fZ`!vPibIwGZ=%]c'=Jj>(JTwDyݘ3>kxaAmp%/ZGG*10aҝ~[Asj6x>%"a`#qmR2D;j@`[Vu_53}x;mt4+|cѷ8w3voBO<|ZXzxb>cpPt D[UoOO^̳>&Omdp֐x܁h80,^(8TQ-7O틹{ nw ~[viȢ)WC"v S}5f;b j}͌Ϻbޭ߿Mk׎_Wƚ\!N냬4/|fZ8³N%-Bn omNec:>ي;ڀq1yC _;'"Vz䜁qEtXEܾ{(fcxvF ní'sSx䜁Z#;7Cg ¤Vun,|^+EYW },53.7`'ƒgd`m ^tvZNֹvlw n=; lMbc"9Dd[7wQ\Gc7ȚVغW+RfEMUOJ{u*79ko=9xT([eFwiz <:Xs_ l4QBj Vn؏ v6 ۴4&SеKpUլƺ_YZwƵI MXڪ*dFBlW"ʮ"1ɪ?yٺBwֽ_+6wo:kn3E 2Loɘѩ\tZ(2S^-۰v{)X9jj\uv+Z_f?G~v.ެ}w;vP8YEu@P\/iW~:sҞN{D̮MTߩuWJm%O]4bw]6"gURec:aڠ6XbY%)P%%û׎Ap\8TQׄowj+g3hcn[wJPЊVn6Wt:]t>z<*gPZ}N˾W$C7p552ڪXA&RMNG1"U1Ğls‚ Z}a%cgMύ)4!'ӇwN]%"/,jNSME8T^_,̊G>wnoEE2s#Uhv95K3|CJ]}}GоY6Hxy_Jko|Eכ߭[&bC0O'׷sD9bmBw07O<X-C9knMI>(@i#9o4k٣k,`xe׎rMwjkS\ZD_yOkY'7Z4 V{yJBrtc&Q'w)6yQ 6rurB+㝈5sǷc\]``u+6&C;v:D(QW=FW`+v9mU+skqkxbV9mm_+ku}ixΎkb| >>IS.VJk7I]vD)l"ZfΌ=t#up=u㙋bJ\4Q3ps{ku8ҕ*B9C✡l󆵋{MYqcM\Xgn{擂{m#p˔g2!aRzJdzZNl\/⊑&* SӫnM",Yx>vل^;޸qͮ~(x0o ṋGۺf1w8ڝa%e v6GKW;߮41,kD"k py|bOZ=1׿mnR>"[WwRM4O?/8 ^ky7oY:WluZ/z48&T@l\Ua0)9&`Z ^7Ln|]ˆ{s3ۭn3n+ hpS+QQG @QP.1+;> />əa5"UeQh%b,bns&:3+Ħ\Ul;5ˏ4zvj(SDg iSMD{>ҽx5]?BKB^[w9k\wעc ;v루s3\6! Wٹzs%]Esk,X48݋kwEv$|B$|+!]gl6,{36pVwrZWx4tjli뜡mq_o24#$55xH9(Fx~ CTieaSD ֨vۣun&.1֒6ELΈD5K3t+h =ѾY*GuDi(Ԁ}W—&ӜiEaXǼh?Lꎿ3yEu>*YAX3Fv@ ݪd%;&ދFv@~v3'LzRzKWs9}JF~ڇ&na<QvG_::x-'Yi1$W_‘ʺ L1mn\B'1SDy1@T'r.&zk, >.q;M|ļjJ!mq6Rjlg\yqy,rУ0>1W=u(˥+~4 |, \41G_Uu ˅ nAw\}^8{ 0w!] i^7>{:KKe[jGq}^z1Ӵm~߿կŜly(mx1̎=( o()Zkmaۅ{Na YxW9%L/ӢI:V=fMLv*}\48%Gmh1 Fǭoj-'ˇnggOOCQm.9ri37N}柈LO.tX$˅.=6%_q<\.eL5(T^4|~&x*w W/0w!^b;ɉY#.Ю&U%Kb~TXtʹAm3EVׯGM?v~-iֳY͵|Ӯ=;OyIQ4g?=7V3vUd|n^ixC1znmF8ϳJtS Zd`C> ʎVkE+Eۼ$9dKDuvժ7]Ep-@)xt39ۤ>Vs7+ +K/pLqu{ޭS V`G?&s)= [ 0CpYxW@&pҤҮmGk0V!"MMIXtR[%Ka~tk^jӯBkZӮϮCi6̎rZ=숋g<` `5i5Tu3/E>W>0wm&\<ɲ~p"q9;sn^l]'G?Z'զnOҰ38X\.CܼƟ)/M#wCƠUm:y4@/`o:k*֤X5dȪ8W빸t#.U ?;dS7ۨUN^niRjI +X qWYWԯ%niQ-y?f-P/h{LRqS-~,&nsi5'3:5m1}SX͡R8Zu\dTG::0nԮ)޾f w2ү%7[N_&v:JL5ϤҋvZۅ/Aru^2 ٣ d>ڍc&:].j|1M, /R\uGa,z4u#g.}'\S9KɄ(@i''>ީ}Zy(RQh^"xmLDhV٘:VcsQ}$h᎚MQtj'İyaRw nB#IM >vzg$>;NmQ7M_7둯=w 1|~baX3tͯ.lxrv 6`LGE?W҂Ӆ ӑ/,&JUs&txx"m1S5 Yi^<Yp5om~> (?/ xpB+FN'ig.(WOUz26I|[='oSԵ7G)L #+*@s3; Q]cTG8'89?[ [V9T@]].#z``M:'XmN1;o[/}_25ōW=ut}td۞ >ؚC ߃y_a`hz;Ҽn,pe< ks3\¥gśqɽc9vM 6ƗL0<6Xt7 Gn: C)fB2\ܹ&ܮ` ;Ğݥ9.Q6:hl];S)&ǭ5ӯ>aRw,Tv nӴ}d|8u@k뇖|wW!kRujh7YO*d!ǩ r@].|qsmp3w2gBo"%"K)w8}`p[u' m['r0slW4/';XS9j8SSDsѨY[VƋI5>^`~I3ZQSҊkOmNծY^bn[d6yg2!_;6`h؄ƍ]^&:}Lc}6&_w s2_c6s}d < 'lSxAD԰9f_~_=nv]ǤI{d#{=:G[]гe6{T$[qNSd6'T]MDL=^Ēm. }D-M"aŢ#ME#S 6Y:[`ԮYdk~݂b5Ju=vCKYbmrpwj(b@Z4IǤޅhwMɤ]:4odT%Xvt+h%rqod1w ^r2}V*ƪXmѭ 3| o4<^-)+7TFj_O$h;ڈ(8ܥTC/_^z'DVV&٣0uPk<1}0x(@,Sj?LCg/Z+Or{8gh[s3+'d׌IA8D;LL`['1]Knֺ/@n?1zNچb. w u5 n4Ԑ 5 8鵙#cV|M.'BzMC!{<@#ƬQԎˎg@ ^Q{2bAj[Gs`xsy""~Z#UVVb͚50!T@vc„ Xb鿩@YY?225m0{>Oz>>?7f9oSx!ǹ5uǽk uqL~h$vğN odYCFog =)5T4v+Bޯ&:k;HES}Zࡰbw+pv=~h;7 z﴾ֱycucE#;_m%lr2}үy@APnk=n8pܵI\PVxSSK(?ɑ~7~̟?999m۶5}%g'(T$Vvr܊:5&J:]nTv)irgtǐi@eJ/˿:t^Nt Fț7;R" 1ג􃵕 7,JRF j_ӇӞKq)1{~W7ˀy@ʯ J1)e'4",6w\\eee H!m1w!r2}8p 9>;\)B[ 9".7ck}*лUxP1i4[7Y!Wn7Lo6}Wwylgݮ%dIL_`dΐ{NDIY9F7raǣگ9 =l)O}'.İyQWu r~-]:vCJLxy볓=Z[Qb1#͛񠤤D|II MMzz:WjOW( #;7k_)q0ohk.KOyBB65 DiRIY +̓;hx5aJ`fﹶ5Pv L/岤#{v6Jj""zܺzN,{=jlg<:w_: {U{CQi^7^2 ;"ouN]tYi^aRu>[e6%"0@ugcϞ=P\\3&rBA9> Fun-ѭq770M膗Woip_cʘqun&vhF^Kr_qL'NZzT{.00kdBّwllY}k;\S%:bw%87B"bm٘={vOl&r9YId-)yxѵN%\;+. _2pWaֽ_8KݿIvʕENǡwM QGNQmq!^4k/ o)\cⶓ{֓z66&"519w,Ld捃f)'`drr!0ICѾտS˅{ӫk~54o@r wtnјc05}vw7ف;Hz}ۄRTTx&Dk`Ͷ KT l.YiP*]ay˲{54[4FnG&ǰj{s`ߡJoȒJ'}}=Si}xVDDrcwlꍊ*τ(u7-}D O 0sԈ亱X2<9Uy{f>ϏvxyHIra΄ظ C:%tHbL=+p ?,բI:uOit˔to:uONaa΄n>""r9xʢDD ec:1l?'Cc %lO""""" ;f3!""'8D;?3:?} wu0YDȈ;, 'D<=#W9{kA3|ϳDDDDDw9ADD1x.n}M2|ha»L;@DDin~0@DDDDdt/DDDR,p6p=}*DDD)QZ(""# """"@Av9 ^OO(.|8TQY>tNyF  """"HVDDDu#ϛ{DDFLDDDDDDDDD""#Ȉ""""""""r<1@DDDDDDDDDDF cuo 8$ |>""""""""z"iOI""""""""rpBd(1@DDDDDDDDDD """"""""""JA  RDDDDDDDDDDD)""""""""""Q b(1@DDDDDDDDDD """"""""""JA  oO(YE%L!Q)"0@ m۶MQCtA$4( عs'4i˕ӱLYYڶm;v ;;;٧CrLjEd/"{'U(8x ZjY>@ F6m}NF"ٰه>_Db#O*/D`x(1@DDDDDDDDDD J1ۑS!JIcDa"LjET?,LDDDDDDDDDD(1@DDDDDDDDDD """"""""""JA  C_$2| :M4A~~>N;4l޼Yr̚5 ͚5Cƍ1m4޳}vL2YYY 7܀j{># 4ҥ }Y<"{p\3gQ8ѬY3dffo߾/Em݆-["33&L-[tc߾}>}:K/ҽoŘ1cmOG,~z+:vLtwuIJ_DOp'UVp\x7t'?ѣ222зo_;D2c(˸qcڵ߿?&Mݻw'Ԉc֬YXr%,Y*L8su᭷«?;wԩS~?LJ,_ .ij>nM{O?)S`ܸq1g\veXxqB^dYz5_~ٿn5j|>}]lܸ> 6mǣ>'|VBF0i$k>}:6l؀%K`ѢEOpWhaĉh߾=֬YxwqzꩄDt}'_Wlڴ w~(u"YgL2Ew>ÇWJKF"qQĚ5k0a9ۍ &`ŊI<3"8pXf t}Gh׮֗VX}@{ϤIPVV 6hGjf͚)SQÐ!Cpg"??w~ źÇXnn. g„ pXjc9iii{&M͛7cvDI1rH,[ =og}ɓ'`"R"ǍDLD2~7~݄ 8IgE$@ 9s`ԨQӧiiiսWKŦ}M}-{pQ;~")KXv-ϟox~n݊'x]vŋ1sL\s5Xp!P6,..F~~u׋ZCTsM7sA=0p@̙3ӧOEdDHaě ""JYfaϒ}*D)aǎkdddd$tRN !Cp='Č3|vD+ /޽{k5fZjEDDD)yx<())=_RR$fϞE?D6m QYYRžTXXhע';;V8DRXf vލA?ƣ> ׋/zhٲ%z{gϞؾ};P6,,,ݻuWWWc߾}Dnv\p:mGuٟ"RDZZe˖i,[ EEEI<3"(ٳg_|;^/m޼۷oRQQ֭[.YLQQ{aT6~x[_ߐ!C0}t1Qݍ5 7o=ߣ};P?ʰj*]+--Ś5k|>|O>UUU{,YݻiӦ|Dt)ǃ@ JO7Hvb"K/+>qF+Prssd4fΜ(}k.#Ghꪫv)|_*EEEJQQzuuҧOeĉ_{J-sjٺup ʦM (Gy%رckV *w}eW{N{Ͻޫ*o*zұcGѣ{N8eʪU>Lڵrj*\_^y饗,o[B^D1cҺukeѢEO?kJ͕?{ؿwA嫯R+C)_}?++^WlڴIϧ[.q $c(""""""""j EѪU+\Ma;wm۶> """"""""jv؁6m$4(1@ V&M/I>""""""""j(жm[m~. PfinL0EDDDDDDDDDD """"""""""JA  RDDDDDDDDDDD)""""""""""Q b(1@DDDDDDDDDD """"""""""JA  qOůP$Tup鳫qHUOl9μEovu}*DDDDDDbw}*DDd#ȱv'UDD"rU$P} DDd#ȱ8P%"""""ǕS ""1@D( fJX>é!"Tƫ<%\r ͚5 P^^YfYfhܸ1Mؾ};L,n@uuu2~""""""~uRp-Z@aaߢEйsg;O?zwgy˗/ʕ+>6n܈{ ɓq]waLOGDDDDD԰)/;15RTxp%ra͚5„ ڵÊ++V@߾}QPPgҤI(++Æ 3QlUdQRTTGD +ʥWQsxEDVU7@ii)."@qq1Ґ{_AAkTTTL7ףǭ=}*DD ׿-/w$Tҫ ^>"J PR=Ә"ĺϷ="CS R:\Y=v͓|&D 矱tR\vesDii%%%(,,SRRbx]}-s;vp5Q"UDDDDD'(3 C@Ail"?(iycʔ)sòe˴6oތ۷PTTua{,Yl+ӑMCN"n3&;X^#,zODDk N2K"7'@ S 3<3f K/_h x䤯6=YBnU.CXŚ%W%XЂkdBWRbjUgp󃉈,9>yx&U^K~ۜS(@U @dj+%Sɏ4ú4DdQYě &~ I>F:5u*'BBXX~"l"i1@DV`PEuOjAHa g1*9QId9NTYJ~bpL!/""+./Cy/!?;Ƥ&b"FaYԪ@D`ELp*=}&Vܪ\QId5V82@D`_p$ÛS(t5ة,%DRHc@vipaTJʵܝKDV`EQ rJM}UNd=_1ei*E ERF~ 8E٧Q~Ed9nrKF@l"Q1=Y"rmr\'?pˍEWD%՘R~:L$~. "GTIv YJnEd ֒_)%g'"D(\M,Z< /sB@\^@d .4Mb!"1@DRr0$;X8k; Kd*?YM\!Y--1폟CD`7`NX"k_Y)_e!1S "G̈́p*}8QId } 'BBL)=^_DŶ!c;+@D3XMd51m W0Ia`i~"D(~p+$@ks0&7qY]zb\9ۉWDtm=f"F5kY:tifP*; T@ Ɏ7R1&M2Wrf ٕW} TKb:~^ɉ;EoDd5Qwpec*5qT\gp2:wd{("D(p]q$EfY@nt bdMjG*CUrgpl#i<9. B'+!?]Ne^&6.&b`MNb5JKP,,=0m$ "1@DI2APǨfL'gB[)qt38 " 0@D9gQq a2ZeSRoؙHn&–S@:8&~%-qY"rN(; WU:C74reL\+? s.=/䢿bQ1@D"=G=g``9l*v Ԙ\~L<,0+=?O!c_矏f͚!33}ŗ_~( n6l0al٢ӑ\\z8tPJ0: W8rDspsI<d~aH&l"pǨQbƍxѴiS=?}Qjx>m<\ǎNJG-܂SO= x7p9`ӦMxzj 2cOğgj*?%UqbNݬd&k`w$D("'XI<"wPÐ!Cpg"??w~ Ř0a\NN+VVX\m&LۍUV%`Y_;NK~ޥK+}9NI|؎Ka6ng5WKEACDV`n֭x'еkW,^3g5\ WPPV\\|^yyy{UTTL9; 6}~bj-s'<(~bON /C՘.`Ȑ!{Obƌw;mʼnge;Ɍ7(ǕX^~2 b:k) I >j@ ײeKK\Ϟ=}v@aa!DB޽[zuu5ۧ'ܹsq;vXPb) 9neKZ'``ɊUcy~-dkB%ܨQyfs=ڷo X˖-^/++êUPTT(**Bii)֬Y>@ Ml<.Uqް;_2'B1)ܭ᫔y ~$#irwʋ"SQ]wu9r$uY/SOᩧ\.̙3ӟеkWtz+ZjN; @p '/O>$0{ls9hժU:~B9yAUgЯ*gCɌ`QMcגȏ꜇5'v%֒±9YJC_ܹs1o+=z4{=dddhy1{l?nӦMã>+UEa{9Bj#}\gXSyL/(=*~w.ۆJN: 'tR].͛yE|O^^^x;N$ @| ޘ3 7*qjp J$Et2Sk 8,} $ "G*=g gsW&<(Քʋ5w԰dSIfYq?DT pEAlS*8q@Nbb}!OsBY~ ?. )6 Y"r*=^K sKZ[/;'?_P @.j"D(\,t] dHM_m%3pNT/|?8)2s.KM!9<d#1XW9ƒil/ykkd.l' k8@g @”Dd5Q_wNV:ng ҥ0N҉PL'IJC'O&sDZ~ "1@D egQ8YMWKQWTd> 0yql!?r3L$+|$"1@Dd#j* K-ПY%rD2MCDVcEW) p#p30OxoK_&yA '+^WrsX9nU-*/72L҉P\Et"'Z"b -JyQ`EJ!qdž3V3`dfc璖~IF),;xKl~. "GQ"<&9qdž3&Y8bp&1q'~fIJ؞˦!"+0@D\">`܌)^g¯wl'k$D(*_ڠz_ "Gag 0#0 l+s`'D(&?c@Y~R%"D(]G_X1'BQ8I: ',CW$In?DS9wQ}1@DB}b(Ǜ )SY¯w̒/]8,7X6qwȥGal"/Qı'g,Z6@Nb0H҉P\^xYaEX,vIxSGD9 k8aLJ~ut=9Awj$D( e'Uvd.Y#c3I'BD)"rJeLHXm&#pc Ň?g$3ǀr 0`Z Wo {t "GHP\WqLN~]m$+pvvIJ 5NRg0 L҉Q`yzH҉PT@I<ʘS%3pva3ɐR3RDd1Q /IJRY[SYÊ0ۅ$шj ϐ7R2jt"'Pg` g`tga` No !"/QXY8 XqjE!|' w@ɉEНX[#I'BQ1xEDVcE_#!1#p3_x 64 )gf{9&"1@D"S9a gd+`P2 /Z5rb&g0jN2(g0 Lb"bË́}+˓t"5!Y6q@N2L҉?j SRvrl%R+CKJ4 9;5%zrb@3J;.K_=1k,4k 7ƴiPRR۷oǔ)S|p NBIvrfOnI:;5a;Iy![ɛwXtSoW_ENNfϞS?~L2X|9vڅ />sOJ,\.Wr΅b3,})w$<(:N9 oޝJJհOH-H~v<J ׋BO?^xwgAϞ=rJ1>6n܈K ]w݅owqPTvYqX\PsrN3w԰dr@l&ypw.Y)()lقVZSN>}:oXf 0a=z@vb +зo_h4iʰaÆ p9 s;1Lr΃ㄊpb8pcJv|SM^CDd5>|8}Ytvwމ1c`(..FZZrssubZ$о.++'Dℊp3_9JNCZ Pw(^q30xEDVcn~ah߾=^ydffv;Sbp53;j`` daNyqN=/Y)(rssѭ[7(,,Dee%JKKu)))jZ$sŁvaB WddLv'0?Rxl+91˲Z5O"t?-[b|Xl͛}vn:޽[{ϒ%K^zE۷Ν;qsENN.R\Cvv6jaĈ'W^ pr f͚$td7u^E7Zq3prǂL$q IMkp =\ݻ-ZѣrJhvcڴiIk`ѢE9s&ШQ#̘1K֏D g HUNWvrlpC$%cf6eۅ*+ }Jm'.qqQ0@ K/E}=## , "}xw>5rGCR3N%<(:C;ĕbbsI$7y.PNb@18^DDD(sp9И3pS5N2Sx.HC^%s "Ga>Dgarg`ryOr3N҉PT 9w8\@OL>H}}"rCtN93pl^r OyYQ'^$Q#"1@D gᄥ3_9W*; grp&KXN򉐁<9 s;abwRbrg͠ug-'#pWGP2φRD(sXvs?yy3hl0S$D(*pإ@>Zr5 "G1TN҉P\'TNr3(g` gQǭN^rOt>ங5"rCr o\$Va3Iݮ3bNI<2).jHǐmCDa5++`S$ /EГs]u5DqekB3kuI¼@3ۆ"rÄ BR3b )f Xd3,rRS\8O)7mr;֤irTMWr* p ,, Y j`f2JjӗH+TU :"J oMq[^R2t"Ux '1 i M0GPJZ\+$] !"0@D΢ye_jᩙXN@s֜A$rc d wiPG*fE6DT_ > LXegDBj 6 %?JN^J>j\;"!" D(\Q,+l0)+N,ɸ6gCJēw'@[huyk6|EQr7"/QSYv'Vޏ5Em,;!:Injx:tX9JU߰sbEN~Ӡ 5x7(5/gCvsJjZJNrO~@ GR` "D(+8[},3f3M\] p斗Yx mWyʼnecrP@Eɥ`"bEs1#,g{Im7‹PRw0P#'-Md -1MkE" h*UtjrIjeu2LF)NT)|<$7HK+rVY  "G ㄊ8a ~ē `U>WrS~@B;X E^QS\d ^\\FDaCzp ',[7rRq52 Mcqm$+|BPM /36DT_ cN9C=pv:Qъ5$d( KSxz^d dԂթa&O}"r |&KFQw@l'&,R@@23~N%l(1{J$˕zM,{8&3tud ~ l'g_Qܴ L+i>uTVhx#bj~鞿[oW_;wbԩ~SLAee%/_ gmݖH\!r0$dwjϑ|X\T >O$'Î$ Ŧ#l*وO""0@Is!L>ѴiS駟C=;3<˗cʕ7ns=`ɸ뮻`TVV&G"+<۱ްdWns$| IB8&7CR(#C@g:p&P2Pz& 4f”)S0ak֬AUU=z]vXb`Ŋ۷/ L4 eeeذa***PVVEWح`HV]{q.V}q3qbEnjl5U*qhN^JKHK3"Q]y}0KXv-V^mxiii=_PPb=;)YtEk—+`N,''p(<<+?$0e:L$/1fKHEDT_@ c\{x瑑Ν;۱cGŽMPoeg:tě=dJ^mr+2 M, ϑ< 5DRV0s\!-} cV` "pk֬ݻ1h x^x^|xGzQPPJ]II ())1f&==ٺYa2E[•ÝJ1*"X?VkkS8Cx:6|4Mj6ԶqZz&^󈨾?~<֭[ZoȐ!>}aٲeڿټy3oߎ"@QQ֭[ݻwkYd ѫWL|J0O-'Vd`JNᩚSj9J|RsFj 2DT_@ פIG\FЬY3K/_=򐝝EEE1b`ĉի.(..-܂Yf!===?%Fh5D C2Xf{G\ArSw3*E,tؓ>U %# a+`XY \t5\?˲ }˛bz&" kcCFI8P y)B!m/SIM>,V %<H1 "Aq3ht.9 E924PM QT$2'RR$Nf[0Ri%5XTR RJ{+zgQ0@Djp0$d Eb^!YgCѨL ꄿbʥ*񰶆t21c@;%#2=Y"r urvl@k/XG+etا |bm%@X5P6bsV3bqmL6bm50=ف"rЄ7RLn,Za9v}mM%eN罇J6f5Dr H\ZnI!IjU,)(=/"r qZ)%lp=GPP@WI.`rCȶcĊJTVRRf58pamvcakz>[*1un%3U "0[B)"pl.|oc7o2 ָ4hT _n%96\j 1)P~y!Pms -f cIAm["r6a^·3`#/5mƲS e'e풝cTRbsxٟA;Ѝ9 \CDaCL)Sǩ.B*\1O{JņQh#J$5-xpG#cvUU5/q1K*9(ۆKDd 1&WxhXu}Ia mJOLI4V%(" wkMQml,)jb $,] s݄~; xϫg"r jl|_-8# X )H:fʜXS`B5TRRtns$EYt5puw$svO2:8malLDd1tEe0o ~k1'UdO ՍY4NIl56JNs$]d#Y#;qϾQ 8p9W3mwY9,1Lk8@(Z{ rB|$#qŲܴvѥ`[IE)61`b6㳟s ?5S.Q;Ӿiݳ W{"a>Z'S^~8,-m''HJ1ݙEf yC&&*@naϑw{̦Yi E),Tbq(yhZnn }O(n;7 %oU:M:MeZ-shjT ?]JAd]c/=mm4B W;k_w4HJxj{FDI@5k,?AϞ=1f<8rHO(6STeҕ@e)T%\Y)'-fى9tWRSUl+)$3ql\\`Gey 2}o~N L3-qWޔcQ0@zl2t gF˖-qcժU>="S|vjo->9)VFnf`RrVҥyDGjPbJ`듊.MSsz  mcqRi ;r۾wњ!DR ܱ > 6mڄ"=POHt*oez &07?}اnwW`KA}Jͯ,hˑ݅T{5wO_31u[ԣ0H/*LSbrϛ^5?Rhܸ1.2|gx뭷P\\n!٧ELTڹJ#`ry {&XD8 4p˗/e]-[b֬YС>C|馛}zD:j'y'r&`k1Սb9oWTĿ|-ߦ=UmT'Fvœ ێrt` VE?Pc,-%s_S?kEQ ni`D4 4P?zѣGcݺuxP\\ cI2x\AT?/WY}.yCԅ)틱qWk#WHUbc[*ga;kZ+=^BExyvma'NƝex_( ^[ /9hRѥA%q>43 }e}t0w{=+?5;9%7'@ǫ>}^߳g.]s=7 gGVUkV@LDn__oNu@A zd\|7ێJk“&x$\?gI|Uq莶+';i'>)`}x~v{w.wۻܬɜg>Aif}܊bLөBuO`~MtmsؖcQr1@ܹ>kfxkI%5ݎĥ* hz-@l˾w/w;yY09־ÕXDܣ -_uSI\zuƒ A_@=v4#U8/,*Pի~-=]Y>=TiMETDh|`^_]ǎ;PVV?O85j؛Ⱦ+BK}x˲->9cne5f圁 ;i+.sՖP ]Br;U5W֙XKt}jne-Nfu?ٟÕr³RՅ~v}N*==ҷ\++xNJ󺓶-P"J 4p_}e,lZ]]9s`Æ I8#/!<( bSt하U?N?u8_%z W'XN'*m. }|BN*^b3^r"ˋĎ>Mw:~la_ʺhovbxf3U.sV띈Õ~{pj4;T i+d@#J%G^s1M DLfE\QWMX6BErbs\IIw'fbamu_` ^fAP6쿻؟(~ oێ\}Vٙ݇,ߜvN.GB\y {zַ#Rw{I zn.}/QaLؑ9II.ڄ2NzGk(Ǽ`}s-tʦYi3uPdgzKOfRY[ٯyj;cS-̃6@%rglW sgzǝ4fn =ُ)G}\II Oֽ~5Xr'xO<mݻ7n6L<P^^K/ L4 ?8 }v̜9~!7n3f`z'Bavbk;X1X*%HI5kk5ʫ\"9;&UZn߁R0k8 -]W!Jy.C+J3jL?X)1iT}D) ?l|FF,Y%K i{/v EQpBzꫯлwo\wuxꫯ"''gԩS*2e |rڵ ^x!|>KΑUzT?ڤ 6W4 -T.1o*n,9+=6kgo3Qw}Y*nm{jHʻmv2s+2/Ie;ʤ{Cj_Wqm\PV^egǘb>}1][h_GՐsm41˖Do޼۷oGQQ֭ݻ,YիWϝG3|l `69{RN`i0]j+v~qD܋wӔ1_NFbNe5+}J\\riA`y {~w:j 6WVԅw2Y<\w|71F,lBL'I9N_W~ؼ8|B׌Ա汹_VuNE5yR ps'|m۶aݺu;w.>#L>999Kq?Ě5kp#FL8z\o/-܂Yf!===?iOk{NLjJQNV+;#dh<[S6m)9 }}=wrO{W_1;kY\qC#Մ'fE%TSM *&@kkS B3jƂg3ny\`J_v**]zvU8mekۈ; 'n&%ݻq{?~.B̛7/Y?% XbaTRT;~cx.M[›X/󌆯$:{h;WGV*'M.Bܪk!*)ݓr\̩|vu>A{,;'~L\.[/~]EF9Hzݡ{eAHLxoڠMB *˫ (x}㥢fݾI05vӬ49' ;잰т5K~c1хjµφ; ϩc T@kмf3SE/4|fӉ5c:q M>(0@D1uPkiZ +UۆT2k iߐ:PoٷB!tyX ^ y.  9)21_`OHS3 F\VfGߍ څy? LJ*Z@kߖ ϱIw@s4-`6F\T`gzTfKGw=߿m.̈́[I(jipQjaCMҹEco&zql|fȜ_׾ 0u` ~UEk ڧ 2'E 1}Gpsk*0de==Ym߁RYfK65{4|B puyT6 ;\G\j:1DpuybwA\Y ;ZH]h2]yd涿ymR DjUm̈́zç2ӂ?@7vWgW{Z9n2笤N(~)j'>Q{W֎U:!&yש-?N*S[ [1L܌vI55ϧm G,?^~ hH@J~^EW5SW|" 1D9[jD&ޅcyn{;\_KM(gVq¾Y5E7~GHrQ)j+qBE뫙c!ʄOvLX?R ^D;ָkkqO.ۗ7 X%tw':X u%hqk6Zy]>K(d ?L 5\6@xg@Dbا'۰38,=^VVZum^X!:EQt BլMwnX{UхlL.ƪLsw c ǜevր*mq l5;\<cTZ۰ޅcT 5̩,lP /e++.V ,tᲵ_;\]@ߛZ>~LQfWWNo 8] ,fWlfP1tStDj*vkE'/oBRW3W_E,t@>$mN U18CR "tyTػ\xT%Y`TwY nPX8Z aƃgGKA߲z,ٹ`P\Kv^zOd~7 ujwj(q_z@SGܱkR5Ii)x&`fƞZRS8%"庯hD"rj-HhBŎ/Q{.fB/`ܢ@(P,yoc03j*ǙϯT ]S,=\a1Sglͺ"\U^hKa%E* [',+@aK@Xݞ]iaնc:j!8z%R׽jRMh5, hSLEU("~C ൯ pfVW-1/̠'QjahaOڒ2TlX%Nq0]8oՕ-kyzCnghs_-s)e0}m%~[j 5E޼]\;Ҋe5h щ)]l+;76$@)|v05𨎝L/cF=o*X9Jadz]jEk6^P⋞X{!1QjbCz-h(ŪЭس/`S-lU_t1+ >. |~k JDQ#4+֟<PbnydP)L"S]^}O]h@}Y{7:\!, |D\ c9\ )ǜPO(g86F\VM_Lh)7Z+*16`_QHmP *bY+ȶ*<|PMm)Q|k=T|ؙLPQ`.ډLri ^"~O2I@sɞIC m(D\ cnM2B7.kIawEl`@\qD]UK_($fmECgڪoq5ŤXqKY>~^q~t~!\zh>sڀV'U%?(jPhP/>)_\6LZx=502qٮ: U?pFM tEm*N<͊wjH;>1 0؛OG4=TDe<@vzs!n-dhbv'NF:V͕QTM_wBEOS{y` MKesuw0P|TMl Zz[N=nNTXS<|BLKUϩeؖs$噃w ;BKTZ{j/|29fUiC T>B8%c0 1@D!+U(ڀQWS*Ԏ%lX[P ;G,?f*r˻i2YIzeSQ PU(ʗWo2Pe[Mlݣ/i,5vHNʹ>wV#j9j 2V+&RD* wcq]AX5uQ0ӛjK_~Աu Q QJaCR`W@WʐR7!^Z 5m& eS*[])7RHLQzC^ hS@?Ŧ_0} jV ȼVQW$wlHOݩ M\evM.k)L"m7i$bڮ1Łd  Tk\-PSP3s AR "P=*J= R\B;6F<\+hm[QW. j{R=rl'*% ^@ƾ%*c u;V4ꤻF`M^4;P1.i<8Y=/OZ"#h5dKM;vG}=#-6?>d݁S@@N3~l{;R ?1&c\ ,b1SUhe`f)3ϔM'Vf;"v5LiQ(Uˆ oIdIB 4Ů<Z Tq^TeGIpJ2UϪڂ.He5Jʂ =WzVl/$ؔՑ~>pG?ZvT`V4|yw;>R Db WkCYk߲|[gEQz~@M2|>z%u Z+(CґL-iaGPM@= 0L_XLXwزn41 gqB;k_{lW ;2m+% Ts*JX Y:ݫ`5Ќ.`sqxt+hJu~ȦQkAbU5pP^0l>/u>hzUVNMaΚhbmۥϻ!X# QhWbO&mv[asI KYag`ޢ/j@Hd%pp?:y2)/?DPSPtCf);yrVc!U˜ @ba 4Xgl'4D"r q0c Ok-VoLoVw0etb&uQ"9?'4{wԽX[ Nؘ3 ~cm0a>s|`0\K Hrw9Kri|Jz&626qbRY}!8ԏ<'jݥ^hK6'TOv*M# '5⹞مWߵN )Ue"J^hҥ5i}"o{pY_/ M !*PR,}$@(^3"J} yky__V*SyϼPw[Fq T׽V>err]ˬ2i@$m沀|S3tɷSzȥ%yN1\O<-l|9NH?3{@Nyz2$h.#@OA]Cr hKJ6' ! >)uY>bѯ:`v$DK*"^Y#2 t ojxy+%^ kX׊NdDe%l㟺iPbӧ)ʶE.s@s&e(\$K{u>L]yu8&J =yaHPmKDD4H'6 cMyoț+:se+b{FJ5.%m&.{FukY٘6ֶ\[@FZ@bW{_GԊXCW!ee/!]mƦcf9ych3֌HQc!+u> R\_^6K{Ive62U$NP'@6$%SlNX/y @D[9E0@<#Zi(4qor7sLvmhӦ :tiӦXf ;;}z-\|ҥ ,]˗/غu+ktÆ /)S"< dg\ݥ>*b׉\EVF]( 55.ϬիONRw;Uӗּ}P'@`2ɶ\F,&j.w {NK/qb>)"̩(bfӬ&Nu=KIpO6y. 0WfTNU>mT, {0!Z%(4qo ^tk͚5(** AeZl `2W e˖]vHMM2drrre)((@NNE:d* 0iMN~ s ex*J(djZDh ~կzb\r[,dF5˶8PLn+e]_ƣCZh.Ӹk{.A5&5qZ4/Pā6W"VT@bkC=^5[F }fQg~=8XxNQ$;{5ISD0*y'TJKK1n8 m۶dff"22ɊeSSS)-#2yd$%%IM;Ҿ#jL)6n0r%lOTv8YЭ))Es;l,no@;S1`)F&n0Ysmʗ ?п2b,3{Z#\.G)7Fi.=jP#.ҽ>\.*,=@4T u97.?jTQU1c`Z'NDvvСCMd5 0ŋo:GXSٌ<, ċIѸ_hjq;>*_6ɷ'$L#SV~fRroW_~ S|7IYP,K_oeU,( qXvmj(N]U?" +N\)y9.۔Fs Kн>#4'E9eir YѾ63TaƎ?GzPXX,ǏGZZ=D? .,HD fmuCi8@e絟8SWQ?]R%X[uQgT M/ŚA+)5΂ʨrcN؈⠤g'k3kX> ~V̲5C;#"ёeܟLzk'lo,A^LNTZU?dXs" =r'Ǝ_Czz.] ""sΕn۱c< @FF6mڄ'NH̞=hZy!?Av^ vuC<\Jjx†%N'jܯj.#nCTS_(6ӛp:hQfJK=-LpKOjb-%2g H)a ]dwF|0U6v:m > ԹP:3b9Am G@&gJ jWQ1c믿Ʒ~dff"33.J$%%;1|Y~;222pE֭[oƆ 0k,F+VGٕ]sЀLb+:B[^33֬ +}ʐy~q@+&B'kty*ڄi[ҫNGQؿzTNPWpO,yB^2sTA6TťrArvpQJ 6l|E" 8@?Dvv6ڵkK{i߸K1j(iii_",, 馛p-矯?ʉ"":ѯԈVhtVrd6_-n0a#6>ڀ}*7861FIqՆ=W-@ ^[Qj5"ִ6*3RfX=ϥu~jƘ-kMJbrX'` se*om`='I?OٟY|z3δ҉sn$,*wV+1eL2Ew bƌvUrtAz/x@YɐE XE&l"Ý@V'[HXHeTS7"`m|ˊMz k2VaB'@@ťb@N)Qm''y^`Id$')cܰF,>Umz~MAtW9I4ep=QN[.CDDv/,Ɯms'bXLW)WLW#ft}@VK)ݞR@o-pE} 6ᳮ!FRbVz8/Ah "#25ɉ}R%0^ì 0Ve&Cꦥ0{?l@Ű 057A_}5#7vfɅA%zۍkk.?܃ P;>%.{1uCx>.n]lSZ|"!~ ZJ?1 J{`1`fN{y6& |h2R:AEy}Q]ctbM,WbDݎmcҶTIXyHvkurs+`AsK 0,uyjroggiI1 9ȢINr8ٻiMe"=e8ά)݆Q eX?B*q%زee8-F yF@s-nϜ煉BqG  bi ^7- D`Q;b6zm~<"0Pi@"˕Xnh$hrS*>qNX&M O~?ae ߕ-/+f| Z4v3r᪀fA3%/`ʍ(pD,J ['s_bo #FgR:FQ4STwʟK}d=/;7"^Nw9 5Czrgǒ7Wp8ӛ$<{jnkPbK@*oZz8pމ|_;tF*&4O۪g~r,nlmI};ܜyO0Ω&_`@DD ʦ\LXfKJKTs+ (9_6I?Es儍Rrv_۪kˉ5Fҫ:r1zFn=/bJ<2- ֩ޯDhc&ڧ6WEj+0_x-XJg9 7^QP8m>dŕ52e3$s@6G>pul=j@읶n(ء3F)u%e/X;:( VbYm%k&ܭtWveȃI2]^>Fn-)3~'Ҷ5's@yz~i@5p] f@{;|BK0U:y.p>ss{_ܜB'((OFpM$HմrRk!G9/dnޞK=.JLT/JkNa`}̬ѧsؘug+*Ʋr -K\wR5W&JJYWY: V1_b%N9Jɘs@:S69> y+ Y8=+b|Iʚ7o߯]^.G+Pe9@Tp}Qa <.'Ng!ATeߣ +/*Яy-^3INeFill=f[2TGCg+ `Rd]=QEdӰT հύt9hㄚ1F:}2+o&L,e_b |°bn0696Y֩aml~e" Eu&FTv)Ŗ:_X @}W W7jX:yflhć``YB=MMs#ꦲvׯNi{=f{_XGrDD=@|IzHgE/&jOOtuuMQHYw;i:vUP Tז'I٠jZjg&Ae2'~W*3 0}PI%ʎ{66iT3pY\Kʗ6To5'l <̾J(QO P?42-AW4$~/Z~#U!C(~7ngEs" vr ྘p/3g)M.dBƥMarX{߉P$ /ȘsFz4;}t*U~Y%8BԳ!%ɜ=Pf@iSﶼOCU-)u={۝ }KN^c^dWo)QX12:%+Ut&`_!9VւyV(h?^9QPP_G> PBPg:>e&c¥߫WX5 M|0jQb` 9)y*i;'2VZ'e b&k+˾"97elbS j(b&q;"C3雎T5^}r9P4|MS<ڬTde$; \xo͞W܇*#ߘECx@DA])`'Bpԯ eIz^ qK*k`O[߿A UmyO{6!l$_r jy͸w6{OEc9޾v Za6EzK ,`6 b/=Au.sn Jx ?OϖyAO9oXJ~`"qsnesQ #-UIW]A-S~n('RmeKn2_P'X/2K?G4[-Fwʳv_xY^\~pb!T5`iz-Ϸld|fƊUi*&esX[^;P~s}j{"j 4q.bz Vw}:׳8y@DsUmw߂ϖCn~bBW26 !BXF(qt*-ʦy 1KUT˿{}'gF1yi0P-8W}os@J w@yl痮lsU&6Qd(Y ▐G |FQXݯӗAj h\+^qk3wx((.~?Ǹ'\9@8@DAA"$rKW\U2oxD5/Xݧ{# 84+=}uѸɒdw#+8 |+a%T]aSfHC1Wڡ½_~v*ѾVM^_v(Ro#5_˜6e":tƝyݦ.܋!o/2\fbs%nl%ЫV*߮ _JEHx]? '  [P :U ZEѯ,ϑeq{~^{د5/ T/tEG3 &vm|gUI]W1(Pޯ*A,V Yn*e ͚j*۽{ؐ6iZ Z3"6Zk_Ը:e94мԝsB/2 l;ʫ3.AA}x?WJ"Y!Qs--=F` " 4}er{Khtl=X# `/XO9BUkpIr4S+KK(SU5} 0 \:dLU#~^͙=~,09wiDz_u~y>b>]wggui-1Xv>n|%r,4|ֲP_}H8( OB2f(ShI:_Sg}gF#˵2},ύh_ǒ ~6 տgUل>{>=nƦct=)0T'໕ GǎO`L,g(@DAWDy@v+~ln"cC[H?=n|%9G`4%D@tG: @𿒺`Od[MP?׫ jKUqz'Z,/Pbs ^|g<&,y-m_ʌ :OWMlIز}kLgSUF;DPczUH!Y)uV ²|z lTWhm0+B)Z7ȱ knpzg+p5d^csU",NyB\RxwDG Yh#CMWi@㕷Duc,?VͪZA<].%ѷ>J?{[l`<\(\\16 p*.nqKn8{ߣ?mob?[)" {CDAE?\}Rf@lWU/$R嵢l 1|>o/3<⦖[VՙMDٯjPZh.2ԩS~A0i$Ԯ]1114hvڥX̙3=z4;αdD(vySPZCYRHHxKV#3'_qh5 ķP#\K3 xxqVE 0P![y R7iq ku~܀\(EMYnjԣ4`P s\۷e6d_WRPMdjCs2?=g=9&ʴt |7X2MefcI3L@ pzMW12ZZ <= +e!O]S=fHղ窪ܓn@ٗg1sK'I~mQ^e({Ͼ`~7+g*GD *wyyyСLykw}SNŊ+!C ?}14zhlٲgƟE{)?*`s-VoP$} *7-% ~߂[[~h6Ez(jHPߕ0MT4UjRnWnj5Tnx96NjJk]q+F~Q O*Vl>7V=9iIіT|H>^M*'%*2_G[﮹.ދmrl8^̓_sQb8\ÇZ;}$KU|BcJ~Q ^wgv2C*)Zv[pgqxC9aZrM=8WR@'s \w¤7k.-]h.cVzR-/+0krYkn( Ι UÆ Ë/+>Ao㩧W\?=*e l۶ 3għ~=zwxwѣI l>,cy%HMDRt)$\q6u2Bv,C^0X2נgN67fBZYPm,H5oZlzvc NW͸Ne ˿?mKB_ADkMÜ}L/w_{_?(VYYq7n2Q.6sq8 r2Bxh4a:kzz2|h/n _-ۏF A俶uH<4#員G}^oD폟ƫ37U'wyǓ#Zc޿{F_MZ<ٞrOc?m nF FccxiV{Nǽ8}AՙDD+Q#-- sEǎ999Xb~@FFft0oYzi^ei9trE)GsnY5p6i^;|D]}?M('n=MBHLKOkwbeϯ_}-t#;6zfٞq!<=;XUg@\Gﲪbh֨V?եkbfMhNUWy(Z‡ /HD *wΝ}a^:4hq_Df͐~uȑ#ZСCqwcԩ(**رcqףNM\CUx%P⊌Hs-c>\f6y< \Z2Ћ2+1qNA;ss&=@"뺣P?Y1x;{zuu3曵 R;ݧwѸ{Ewo)&d]P4+( ~髹ɭki6@l];qz/\OJ׊nZݗ @x2t) "u%mjE l,R;>A",.)9uQN:KlEӔNMn Zd]i^( 'ru?{,FmrиVnŴxS_ZԧBQ UEqIHUy mԹAWH6Jkyy6{^nWY >1js{ZݷA=unYR*?!o0vX 8NF»[Ke$%5EfQzR2Z/<^և kjvw~%m"X3+n-<y9yOi߷(շy-7Nb9p:^_0v49d+ ԻUߋJJ90Ӡ񅉖ձrY^ fzzdx>lTK]z?jɮ& hɬHW-V =_ޯED Y; ;܇f_\x`|"|e:%mCwC'۞Wz@/ޗ{ ȬWO*e0AG, {g1IG7+'/ h]'Qʰ|m掀Oh]ʾ=} ^s+66/g+T7q{K_v܎[YZV/ @b9+oF Gɾ\jR\t eWFQ_ZXh2_cr>xݨw]DcLټB{ p}.DukPa;HK@ IV~Nѧ%*܉%e%sKWz\YD{?CӦMDx瑙|̙3͛7W|O>E9CsIIc .L^!nb%fl:f\kM^:/Ac?m0kk%By) oMqӈ{/1߬S|;xߌ._&3^PĬ-LJu= w1(STiBr t/ۄ)M{`>dms3Sh^?ϸɺH>&/s4]vlFxSI/j|}>S-<I*饓e|SXe4f>=H>=P !u`qh?7k/_ɜ&8@bt͐o:YS~ˈ]S]_2V` qחpːj5 \2|pMZq߭+P-q~Ed10Ѻ}alspkǴ1D3+cQ (q3/Um=>朅2=4]F_fm/S  <LjT{8Y7f*8h**?5:c9aa3rf?r#ϯU&8glǘo*&,~ߞ>W?YnՌѫ3a̷k߮lRA_T\i+аg.E ӱjkxN>\TkN_{ZE;O鮾FιfF)g퍿wک4'ae_@ф阿ý6j߻?^۠zMQ6kڣ"f=nx9N2 7fA!:V=5,FuQhfl\;uZMiq:龞. I^ ޟs,I_&/+]^$8@bRAM0r?83TNf 5ҁz%Ec+#:-Z蕿cζD"jv#ʁۿX`rـ-mQL]W} +)UhoƊ%TEqw'*n7}⦘2hPoxOF#]b8Ág/o\жE5X &Yhj[:s}fdZ PS1n9cC3HTӑ xc'\#γY77][HeϟǤl@7;tihtE@9H4oq6?\?IMJ7Ltl;gh{VWmⱬX隩PX\o/})7vJ>xC]b0GVn,{'fm9۵']xsNE)2KĺV=(&䤆2Mɬ$}-h8t5'nA\Re!?X( Wg*sm_MǼ:y߬UZq_eÊ DFZY"gЙ V Lk*'-Mxw'`ғ`u䀘[)^Mk8+w_6!7_.;iF0fA| 2dV0o~eW雎Yj)6`oc~טh~e}]QMzZs?9M6v#0\[sFYr7tG@jUPOF n)x4Y͙ks&/rg g<>ԷSVX`TgI˪F|ǠqIިТp`[(W *-p;zI8JPwZlr EzCc\ܒldť*k /^ hK&qQ]b՜Q됮W#WLCz%~5BjV ()tK%$JJllRӯu׫ xy7~\s Q$;xVl[m3Tfg 5%C`vNQ\V.ه.m׈ viI{ň@ɦˉ~܀UDVA :D9u'tWk)  tmT=M@b |40&LjW=ԥ{NKsQ&ʓ(Ffuſ'\cpF~yg\x4Y담&zW,GWEa]wʄD!Fn,\(,D܇^z&}_gzd)woQ)8Gj\Ҽ_y'ꓽg~ߌFդX產B ӑ>q'wcۋMN#} eV'(zl(j)M9X*ifTɨ|@kNˢ'幘U7Z|2|` t5"} 4/r?[џ6#?Xj'9JKp)JzAWЙKK0/mS|ķ$|W~֨m{gtD;:1IͼmGrz,O!6 Ri?ǰwDqL9mR^mNQ.wz_`WH8C:M.c<)ZX}ialAO1EYn>qޛk_5 Ydfqz5Z}N9M-Rz7IM]XR Apq+=Ή2@rx/[w_?n@d߃aѹA5۟S#ԯy-<4F_"h`=GѪv""y fT+g.<O6(q({i5i&x t^%pLu=⭰b^<)o^zq-Ĉ-rA۾X 5c8knKn]kznjqƥ\Z?g]Q,Z:Wџ70ft~an@1jWdnW[8#E%M"g x),sZBp(RƇUg5N+V!3'kż'_俶Xv>ޚ-ܫe6̢gb]y%C'çݚI1 =ix4MESF=BeuY^k]yt5&̚?員#CY~we{Nkf4 >fgrZj" JihuΆZ5Yነel\?Y1Vr]!gVFR]i}qL]y}"q&'r įCyT+GSeP7g =}ʤY+uo]A3ֲsೲNUv|w vT4Zo˥ܵ?}ia)K<%F|z׋o^_zFK^"(S]_VUk: ʋ^xv89xDD!F5P_nImhߊz a~WhKRA #Qb @~ tj0q8;ϯk"YYv'b;HR߬8 ْ}Xf=_SFBdfc8;kK&ޘSFn~<ϖV]'QP\ `[Y򊽧qVK{O v{\iq8'MzkX':qL_&Ň Dqƣh,LN֝݃@;ی4l2Qݲ9Le22~f hQ _jh~j^R]wqS$Ǻ&ZN{7tGۻ=3yx.ve/,/幽~<2P,c4>Y?lWR*NИ}'̕"IPY;XHv`)yt>AêCXdu G}WOOkOjiW7)}z=q9Jptn=FMl3Ksۉ5E>(Wu/C_j8HOk'2˓<;m/[ߵ&Fb݁:Nv<ܫ,x1ɮm^-1Y}6 ^&)Z{} .{Y㸙y @tuzZeV;R@D~mWӳ bcO|\މ рM4sK&ߍ5AnA1+\:z:L=lyY\x kaSHtP1Wwg:ФUO m/`#ԯM?8Tوڜ0-&;e36fr R4r ƘIGM]'kdiإ<"P//k,z@VO _/we 8Kj8YNP2jTo{˛F[WQXeSYxx>:=`z"8Z[~_R*,`VR/ 4"ĒVZoՌh zw>?-S])Gzuԯnw/} [x4h.x8 O:|x+v~_9\>~>5ILDXGj8Y4zQv?IoAz8iT3+oaNdhNƱe.P|A" kCH+VӮBI;N۰P2%'.%:_{+|!vDKZ7WW-Br7 :5{I\\7g4qj30,u 2f:gu<>X*bމ8u+nyeKdj5"cwxF/{tcL-YvwGRޟS 4kԹ>{ޖc\>k~Zse|ل^@ZDmĎWGõ]nNc{bMrlĩs~KMV.VEl0jm7toqln~Ju$l9_֓Tq;J@|q[7|sW&ÍDz`2ZOIx4GCa_g_(8(O?]flÜmʀy_Aq ɲ ruZfGͨ*sFߡbs ԕΠsYc~lOndž]׵>~}fz6r/oo~f!)oDD@bmed[yBSt2UE^@Ϲ5]џ6$^8k.ӽQCnA1?7~?) | nWFGBkPq8liF=|dKy_BhWk.'O~TE;ϗi˯V79QN|a >X 긊J$DGYJ4'莧~یWG?!`oW=yR'~݌<YR͞+.L%E'IխQu~" Uy-f}N=uEfҸV<2\QV}T|ӳ}RWדe 5~ɞyh]'Qs9 P+Y,HgyG ~ur9lxf0b"==U\*X*E1yd@\lT|To؜}$x}Cnhp"&,~ɠdU)ݣaG}$nlj7|>-U6ݪCn!6:j YEe1X['9wqSlSmjIqdYmH.\QᥲGfcϛ v Ze~_5"V#0/y^ Z]K>Ju(jqpBQ?U.P s8зy-,zl2D7m"g t (=g<2=7ޡ(_SB)"+?&Kr(Ұ4~\nLmߺ̨.H{.B$俶IeĹ_]1amZJ";AV2Ռftׯ FEzIX@\׭p80etgL{_{.BO{S8['1i%K|ca+#pFRt^40 J'ec@f8٤.PǴd|?Z^߮8vt&,/#Q2k2x,ЦN`z%Dyf\z0Y;4#++Qk@=-NmũaZJ1ij)0?u5x:ibEn tI GwF /2ˊKvrM$K?p5YEDM{G\ė;=e٢} xV&ںSRm_jSY}-k6+\wWufeY=Wtt5}|hK߮U>e<&4}-=D[5jȋޜS,Sc_4W[eEVzm={p@Q.uJJ)D7Q\dTO.'>n՘L.Q#Y((f#\ndߩ<$DZ+%~cxt5׌{7tBӁꏢRkDM5P4SH? |s!^R-ۻzSjyr漫t}|T8k)iaԟuVVDVʷĨ3ָV\<i6+sUմv?MkbzYRYjsv_艚qQxw.)+ۣiJ<԰lyzl.a-6@Wl(-<j^:OƆm H 6ÔN YJ4'5x6r"5b6՝=#ҰZ&vR4HX^>+:LRp<Ǖ ?&{3ø{}} #;$F6ծh_"/RxyweK*x'z6#ީj2=3 hE;7PޯUDrĬq}m^.c^d~rKWu8g6Y=eZ"WG5@(8嶲2 ZkxeT{Eܜm'"yua]kKjB}7qܡo/]fzM&}nr ږùGd=DtDb"pQe(2뤇_K[WQY-# wџXYkEk k:n nZ!$LQ3Nx5]㱡-QZ,)岟UuND*#Qsh:/Jmhggʭ'tŰiW#۷1$֞0Έs[ Ѥ޹#FO|L1`oeTAmoC]lj&x7 e6PVנZxryV4MS#Z֣(V&5o:& ]:Wuie1aXKe K~\O2yk^UƒVA^Mk}*PQXhW[|QCۚԊWF`ӗ 9Xƫp&H䫼,֐6Ro"߼LOZaj bZV{ Rq=0wC[*JTfZVfCCڤT[2<5V z}~h>yz]^j cOX޿σ[1z]_}{w i-|w8!' u,Db:7Oo)wccF(۞*E]չ҅?8j{ITÆjk7&On.vEǺc]=DWtS?#ތ xs`Xښeq{t40=h[z]ݫA~~jbt(빫nyAQ ~YwĶv~i.\׵>_g5kԅ{&Üx뺎W_ׯy唥XӈR9o͌vK9eYIPLŭ5g`ԇz5u9;"c\V2\ Ws4K7}ͮ =K3Z6w:^s' ZaƦLN'c#M]}b.w/27~uT;b[?WW *)-sKeR}m$bܠ8glKW* yU?",'=n sZ=Ko}g}Dťߓ)DUQ%w!"S*'R -ys3s~]^M6hfI׼yVD}5PIt xNOQ;ȤQA#;k+ TuyMkuL9GA=afD{we0*RnA1ޞ >_Y[2MA]kS˘eLTe6 Tp}hޥ}JʹɀY65}`5ˠHYo\)\lhw3@jg;Zpe'w y`-Ջ#4Sz{x۫|܈aska@ W麆AدƊRAc=X}<-,yלL29p?]qbRbIR9Rޯ}Wr}=;h+* :iM.~}EEޗ{bK=g1a\A#°~%,.cuwXhmz zkU^ۺI aW`ЩA5,8;Ա9V=9+/6ʼn~?M5/..҇e/ƫz~Kʉ+uXKES_,s:4PBgl;^{Zw4\ʱJm2H%t02E7cͬÊ'bM}9 zc ߿ж=jv4 Gi6)R %ȶx=O_K'\dI`Clul>P":" 랾s_ ?!v> %q"hCtE ۺ랾Dvb?~X NAX Jqޘe\}|6B^o}Jdyy8~?;_fk'D5ЩȌ/o&Ve~›mŸAͰTv ,Ѓq(DiMOU9ҋs:ҰÜܠN&HelCrl$M)fֈSޯE-:zMZs Puӭpl=N, ֢*Ӓ=-*$S޾,P"#P3},Q2Ϝc?mb[bFY~ً[ @%S@}Ͼ\Yjrdmʋ[kR+t# 'BԀ)ocETiE<ہȿ{5|oczM0fyYw}`ⰖtYkޫޖ:Q<^},S_Xd~ȶ|R 偞x j'DZS.-]="ˣ#4 #J%0}l dTz50ȶmb\n7toӯ*o^թ,۪" Xy VwqS|wE۵&^(űrLufI$qzIxrx+|835.氢jh\ZVM25ŬqWQxxvH!>{6{7vuVO\٩. U~f+I0'E*R.C:''X)a pFOCǗ~O w:pG/e_^2꽺K}v#C^|pck}IX4% _7{Z`ҤV<5QV£CZj<73qR-M Tq!: ԈV s1<b͕VB.P?63Uȳ$Q+! wv%ѩA5l{a(}*xWwvW3Q"j@Kj^?X7|[ݑMj`̀*+6~6̵8@veg!ڢz6BRL,&} hpGuL76M K[#>* gE~,JCۺ"62 o^A_yz/n5b#ݾ=XH ƈ0tji ]YpSoꌘ0|ts}Z`CF:D5㣤1axˍh_ڦi'g|N}N0E+)̨K)ji)^BA42N+ă:R._Mͨ6^Cly~ؼyj<7a#;U En0@bQmP\*9QZ`6eqdS,%NSq|zKW4~b~͟+0DNh79 hqWƸW:œIx׿눒RaN6E;OJ%WԬpA$vVꚵlIմ&Fv0} 2)/}}fl _:^=j1}/]3 %J҉|4jrɁ\ x~w_GY6xX$ᨥGc{ M*NU!#U'QᚩR W}&=Nr 5M_=?k]'Q1oC=`:Ql."Nѵl1t__E:jZ5FE*(7Okp) r__N'M§tEFyfN<}ik<}ik+:֕J(' ́) xh; Fl7CӔxnj>(SܓL5pgt xմ&z5۬ŵ-C\T8V?k&kţqx PzS~Cx?hql[\My۔ѝpׯeFG.X$G9MSfVɣvӶnndr0y9v)^~Pr3įt/[v^MIV4yp`,&2 ucXr|a1JJ$DkQ"qKF#v/+d7K=RsGFPо^2K z,DAmʔ)hԨѣG\W)hL3Z%:]$ /Ѯnޒ7U( T%P?t̨;%{ʶh[K[Z.BOZe;▌ߢ:\`rU;G[C$aҼ5:" Wvg gvMTCU>-jF !8E;O>wld:Oٰ.0:S 4ׁcLj.oSn﹞5Сq9HAɸ%üϼ>+Z%h6 >S=KZk7rj?lЬ挆X?Y8=fkV8f5~u>=w|u^ޞB{53(h}?~ Q8]lQ Qƿwn\V?碋MǢ@X@9{APkcC[b@qp-i5Lڳ^M~NNBLٍ6^f kD;x}liR4x󚎸,r;^+"*j?xE P-6 h\+{O98-#m]qǴHKFne wWڎcA@l*ۻU?-fь=kHok JNBII RSSSS(0\Ը"œHDp Gꦑ,WEk *ZUIRl4T6{nnX۽Q*1PWQOFsgӚ>=61:=(}L^9)3Seb,YjnhT0R\ Nz_|q{76XYnQ5є:3/4Ȋ=,~qT1ᾖJQ eC~J'uAM0E uW&r6&<̉&56" 2&O$_,R|~[7 k7am]0gC-Tn_ݾWtoQK֞NR'#2ܩ.}m4MI0xo8avix--= +K[cD*9}li*pt\!QaxavZYRe'ˆv1nǴ#R"XC[zl^ݔ#"5k",, ǏW~qi׽8q"Ə/IJqx|xS0M2&Uyr@rk}jZ=_WѫB*֓f" {TdF@D;D_+?Xy=:W7_Nj60et^ ;w;wR46˸A|dW]U"|$Zz\%/ris1^jkLl4Y'%,! o*HtsΕn+--ܹs($&&*Q7a2j_dw)HpH,+s"9ʫa8kN'Ԡ~K>f'3< Mȏ &2 _Cژ7dW1k.޾IN-,.c_޷!:Dd3fP?~U뢤[ "A} Ægcx  K"œ(Dt,X> -Rxn/. #*܉/]n~p8p$FgӚ|`OERR?8@Aɓ'1i$dffcǎ9sGc` ~#9޽^-c#+zUH&&2̣9w-)&P* w VYܧYM fن E%~U#ٔnr2jjGU*\(iDDKf0vX;W,*=Ptp?Hpk[7 .m(E.?ߟ;Oᶞْ@ZӉQxvT5]#3'o%V8Bw*<()5_Wtn6b#ê?j:GyjsQP;zch[^ uiX/iqxtHKLZԒ^߽Fvkz97#YlynyG ⦋*~Btf51f " "q*MGYmpu*k!q--"DDA'Q0W#L]js׆(4߿ NբS\| ÜIÂ~;p!-?Ж:Dؔ]45$DG`>:O.""@D^Jbs̈́oDT^8OwSW BN_? R&טMɁ_=WȒVi Ui a6X5 -zp`3kEU~ """""Qq+BDDAۻ{uD|{EM$>U%ty;< %4VkBDDgPkRk<"´Y⊈3lC""~^}E QH Ã7c'vyr TJU$%%!;;:DDDDDDDFpe-zl@ 5 """""""" z@DDDDDDDDDDDDDDDDDDD8ODDDDDDDDD@DDDDDDDDD8@DDDDDDDDD^I1x*DDNxEn!FwoDDj """""""""m """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" ArK/gϞErr2Ĉ#<(..V,`tQQQhڴ)M'""""""""" rWXXk%%%1b tR|嗘6m&M$-o>1 1n8u]5kVyDDDDDDDDDDCWiӦaܸqR_K/ѣG :u*q620qD?^gΜA5p8,[0Aq!֐# cD(p1 KN:*8@Ujժeseddॗ^‰'={6Ѻuki3f(7{lddd>oTT%''۲ΕQbbbH}1U6LjQp" ,cD#< 0b8x JJJ~z_Ν <[7ߌ 6`֬Yxꩧ0fi޽{ca??`I&/~ԩ`߿?GFFp뭷矗ӧ;#zO?Ő-#IDAT!C!"""""""""8@nڴi6m2 6(ֿ[5 QQQxg<=/EXLj DDDDDDDDDDDd/ """""""""" A """""""""" A """""""""" A """""""""" A 1SLAF=z`ʕJDɓѭ[7$$$ %%#GĎ;c̘1Q1j(?~\1b"%%>(,X;wFTT6miӦ#T^y87N9n 5j@LL ڵkիWK I&vڈAk.s9sGFbb"qwܹse6n܈>} ::kV.QE)))O?tĠI&x  /"-Z. uԁo<-[Dtt4ڵk3fUf !=Əgyk׮E0d8qWXp!ƌ˗c(**'-?? ѣꪫKJJ0bbҥ/1m4L4IZf߾}1b cܸq뮻0k֬r{*ʪUG}۹ٳի"""_a֭x7QZ5i^{ .N+V ..C A~~ѣe̞='-Z{G?''FÆ fxgKT^}U|xm6x{Ip".//:t)S4/iҥpwbݺu9r$F͛7'l" ݻwƌ#^RR"ԩSGZj>'v-*#FwqⶫJ=z ܿ@_sk#F(֧G½kHT1(Db͚54htĠAlٲ \3-;;Pzu5kPTTؗZl HҲeЮ];J 2999زe9e?RU0f1cEڵ+SNOۇL=z(dtUZfРAp:XbL߾})-3dرgϞ IT!z쉹sbΝ 6`ɒ%6l_Dv*D,D2N:ŀ "33֊r+--ŸqЫW/mH$''+Kx2999pB Jڵk1ydg޽ѬY3̚5 ?|A|`ff&RRRz^Df„ ѲeKDDDSN7nF s[U%DDDe̘1ؼy3,YRѫB:zgFtttEQ)--E׮]/:u͛7cԩ[+x툂?o~-ڴi#S/"" j 5kDXX?HKK"Ǝ?GzPXX,})--Ms_3Z&11111v9Dš5kp t… "<<ܿPvmnZq[VpA}|0-- 'NP_\\3gxG}Th׮nf=`7QeA"""""""""""  """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" A """""""""" Ax)bfIENDB`pydicom-pydicom-20aa4b7/doc/tutorials/waveforms_assets/waveforms_encode.png000066400000000000000000002600121515706620200274510ustar00rootroot00000000000000PNG  IHDRLRB9tEXtSoftwareMatplotlib version3.3.0, https://matplotlib.org/:Zd pHYsaa?iIDATxwxesfI/$PU:"#ڻeEt-[ܵJi QvQ@\S\p<;L]t:ìFa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y&QGa| y~p(;;[aaaX,^tTm۶}08l%$$x,ot ( $ެ OII&P'ptp %>Lb38(Lϣ0>< (Lϣ0>< (Lϣ0>< (L3Y[tJ j1 I8NU:T\YZEbyN'cfFaޡoHlVbG*.Xh,#(MfDa`ņZWPqqm%Fgn pZNm.֊Z+_QyZZkm?T?6%F>muNxE4Ǐp\euZ(}ڐU#p[Jx?tLIҾUh(H&ESLl58 x>ŠdmFa?v?<#Q0pN.Ь%{v_$b&Djx Z}G]嚽)[_m\ٮ:٬#-[Lٺ ^&LPMMVZ7|Sof̘Ѹf߾}0aF 6hڴi5o޼5|O|PׯW>}4~x_~VMC8HJ/[YKl{j>]Pt=LI4=U24h7Z@[mJ/飷?Cؒ -"**J>.bw_,IڱcwիWkoty);;[qq-^x{ϗn׽ޫ9sh˖-_"͝;W4h 8P3gΔ$9%$$hԩN:;ͯFlޜ#I:#)JO]Wm# 'uYUp*ut2˨ M}m*$]A>;]_lQé> z 4+p  4z*//WjjT[[c6֭zjIիիWƲDƏ)իWG}jjرk>"ue=zqomZQVjIr:z|N&9:O[}}0/K$)!*XݒGt$z.|n ''ޡ~UucLYx 4͛7+44T[gGɑnWdd1┓.9,9~iMII*++UPP9?Z%%%<,.9=A1\]”WZK_X{N^>ؠg$6*EO_WAv&(Yu9 kۡ]0sKV׿Noʐ$=/Ӣ0Aڵ6lؠ5khɺm6ӱN?GBBH>%1:Xޒ3TZ]^[ٛM?Hyyeؐ-?E\[w*b:[5V1LZ5~Y-t,32 us+|WmzmtgY,| nWJJ ~X}O?xԨ$+77?/ WPPZn-v5G_*..n|deeϏ&"_o]z^vXdWimFƤ3t@n69@A=Nuv>]t,_V-Vjo~D[RuN6chF&hC0`hѢvܩLJRSSyf5Y`գG5?}kn׀Yp8hѢ5?' @<mz.Np8MGWi_AECtf֦cy@^.^Dp#ٯk_]ZMSgӱ43?}~s9JLLTii}]-]TSDDnM>]QQQ ԩSKƍ=zk#<=2e$IrfΜ{G_/^?Psi1}t]wu:ug詧Ryy&Mdf诿;MqzdN<]%Uz>`MٚF9ԫ]^tr)YŽVCVweLxKtA߶E9&hryyyku!EDDwޚ7o:,IғO>)ժ.H?~{l={&OTC=Ը&99Ysѝwީ~Z۷+7˔3f(''G}ܹs x7Ţ[G(.,P~Io=@K{}ltc+*οɿj_Vz|.=h+jq t:%%%Pqq1stgn}g*jճ]^@ņq7+-VIҤIz`Bٸd:C3*u7cZZK_$i|WMb8ox]cMbז%5*,1 ẬƲQ)z(K5Iz겾Zņlu7 ˒gu,| '!RL6ړW?Veucվژ>$I~hp"uAvzoՒ5*U[>np"P8IC)*ĮMuӛTUݗ4rupJWם}٨n 3w֫a:^?׃_h;RGJ ՛PhV~PhR+vk;Upjb߶^%-d`R޼ [lWx)6S|$u|| ի}^tZ-W~ 4 u[TS٧KpfI J_5@6EpPt$ƇgO7Kn83YӍ ϖ)Z/բOlIio!H׿j5F\O~6~u0aTXޒ>I;{?u!Iz`[pqzbׅWf{ 'sm?T^[:v Wݏ_Lx@{wN7Il?45w!F9Ճ=(K47^=$IO,إ7We ړWk^]ZO+ם@Xk_&Kh7ϳ@}ANt=%AakL;t$=VU֪F PHXh`X]s854m*2 S\ZZFt' ^eÐ$I]mԢfjvU*us EbZ%}4skUk+=t,^EMn|{Tsl bьzک~ΜRӱp[NS3آ3(,O/_{Bcgz.B5+2 p85rDQ!v GaX=rqo MVEMu*5 z,Y,3WSJlH8?>iuH}mʪL-=`n͑fՋ PBTH o+} ?\zt,=zh6ItӨd n)՟>(:'i4k^I(É; ^+*Į9]V-ߕG4 pn}gN]دnt$`x,fK^\n:nBfIҭ#; ' (Lxm}$I/,۫ٛ 'ҪZ:W֪OBya/Y,ӱ+Ol?MZp"*ISMCgu5 0~קnkOmҶÉ0Դ7hw^5o3 Uur8E#`LiUnx{רgp=qYYP M:Vemn~{טߩE;dkNW\xH,>z Way&zӱhquM}-SlX^v~c &|jѳWSbT +5TW0 ņznG.> fUM/@{l.-ݙ@^tGpcSCagDҵoӷ{ |ȦEM[Ft~ 'BSK 3"}_i:-f+"_O7lKl}GUm^u&9.L^:e{p[D4eպpJh 7 0t)|EY4>gv喩uh[&nte~Ig|Sw}Q%.8t$^ϻmT'FNw~=o]$KuhD0鞳[|O6toʷZ3_v?f^_v?ӑx >fӗSh?5 _-R~It%p"gSfբyzomHj?d#swJ< 770I QDӋvk}É8u}Aŕ>Bwj:Dps6{N+~Pé 3MGe(Lľ>m]ߠҪZӑ8%} d>~td zM`jنANdTBT,hд X,mbO Rfa6ӑ8i2 ]ZNwcZ%}觍YExHwf-9Y4 7 0ד"}ژm:'T\Q; S_;_{ӑFo{Jf.٣؆ +9%I> fZ&_HҔQ)?Y* '9Pp\mH`ʫLGg9N&U(pfH c:oBJtTpqtHs6բ/?ӑvAOT ];kkuaŽern Cao*n}za^ӑ˪[%INa{ `=~iY,{k3p[H =IҽgwUhhм(Lgtɓ viÉ8_ڦuӭ#SLǁҩnlO6)p"~[q]d:@a489Mw$i}1[6E^Gv?>=ŇpydN!`U/X,z肞 Ӧz}eHV|Et>p"x?6G[q0N .N; Ez> /pÙ.\%Uu_m3YV\0`Xo,ӑ>Vt$СD~6uao٬tH皎AYz؊ &p:Dq]%IzrKخвeWCtpI@S.B7,Iz-*3K؊ ;0S0ihPiU| [sZ̪zgM$_VĨ`*cv!lP)Y-Žgh\}9t$}zpR;ENod)Izsug1 ؊ 0S->\$Iz-*1Kjn:ܰ1;9lVMt$s:gي [0_aĆFt[QW$^ 3 =bR|8/6{!] U\V\̢0_!Ϧ_[Z+t$=l)]2Ft1 >"*Į$=xNFUmF(5[q0MXM8Q;w{`dUULhꢋ.Rnn1k2335a+66VӟTWWw̚K PJJx3k,%%%)00P ڵkgoСk*o<] zsA߶%F5uf9Nӑ^WZ!yDGqMoٲe2e;-X@7nyꫯGiٲeօ^|}}&LZJox ͘1q;}4a5J6lдit7j޼yk>M>]>֯_>}hk x?vA:XTG<7p +4kI_롈`Ék,>mZP2 E,[3$Ilf$6!4|jٲe>|w}W_|$iǎ޽V^oy睧lI^x{ϗn׽ޫ9sh˖-_"͝;W4h 8P3gΔ$9%$$hԩN*II"""T\\X+_׾VŔ>t$p{t;7~0 Ӣ#h:;UژUճW3 nkppLK$IiiiرctMZz$iիWcY"IǏWIInڸ槯qtרQZZ1kVƎ۸h ûhb߶r:_le op[nϓ͢.8FM#TZU~txLm*Rh28Јphڴi:tz)IɑnWdd1k┓Ӹe>KkJJJTYYw8jNvWh6d4z5o8Rb 'Y-ׅeZ-ܖ{ogU$5 Ք)Se~Xӑb5mlgIҿTQEDO=:pRm#uqIRi07{j 'x~]%Uu:mt8 mݦٳgkɒ%j߾}USSc*>>qMnn<_Z nZ6k*..n|de1-sݐ$u UaytWPKfCv?ÉM@eV\Ol={l6RSSuWkC=Ը&99Ysт ԧO=zW4~5]v{1͘1C}Ն 4w9hJ76,ҧ?4ʫm[FtTrÉX,N"}9G+TE%I>" '8Nn~AII"""T\\\8i/,۫}CCZtHEaf^\ -sm#_n296T_1LA7N (}L⸸wZhMVysK}e <c(*ĮyezsU87`[nϕբOIYQ@3Y߹ku*1N9=Vcm(qx' 2N 1zpIlW=jS6f)n]㻘4)uNx9fog5PVatˈ)0tǘ C%$8TYSږQ) 4hz>6V=;M*\[tl3N V!vM:;U^]g8"]UjL6h Q44Iϯa6<>ok'!R3~ haĨ`VZ@nI_Wt]o3h>JQdvuL/rXeIfCVp"u(Lt9$I/.߫*É;UQS~]*"_wqM>`ʘt:ή~קthe:j&`9=uzVu;M4-QùU9,jP%EZ/5LWӼ9ZP~Vps x* 0b&t$},6N>u}ڪ"w\7/HgTUmvI;]dDP![w}1gNH&`[Ko쮦-ji?N>D-xWf(Rqed'q709~VN?EL4:pÒվUD@Dh[vDTX^${v7 'ߎ j*XM$wNh*oP ńhq#%y5M][u:m&mg:4 0QbWz~]i: )3vKEq udY-ەo: dVK?VD4(L@M;$驅T\Yk8ේdJ->LH00*!*X 5eRD-xTmS:֙[M#{<Ӂ#zkuv;.6"+L0l9X/6dKrM707gu eVN\[5vp$I}LgI vp";$Im" EanbdZ5=`8_agN>utt p5;CtKtq· bwmuVWqQX,l6ԎÉy;tJW߄Hqb6ntTN8S]tՠJ6 #5W9ңsw8gj<٬=;.9g'F^OgPl:V{$IvVp"h>&#IGT)pW?ye#:xnط$y; F[4ފԭ#R9rAqQU['2" '<ǝcjъZ8++I9m\Jx7[FT~|.9 'VgPqF$q+H26p?O/ڭzMMfGanlҐdņJ6tOWj֒iguQp"L@~,do~>Kt9dX 'Gan,nc;K][uzq^W֪sl.t#ņjdIңvpn-V:F-ܥ'():Xe5z}$T鵕?*;._]eb;tHlɑ"sv7qPYu׸p"S w֡Zq=s<>$ibvf8  zQv*sK>-=Ls}yMbҐdń(RϹm`Z+_~V5l m%x|ˉ})%6p;Yݰ+3[Re8é>ahb '3(LtyJ\Y&ej|٬>9sEL@Kv*,O7h:CahβZr@8*/^IC ܶne)p"nu=pNM;*2n8CaSL&k'IzbS&МV)ò۬t "w֙)U[{L^PV44t0<c:fh|/4 g$]dD,WApN5u=е䑝o8Ea&|rj۶,>cw:1cڴi ;Vw7qaa*+22R7pʎYi& 6LJHH##uMի&yS:D%U i-ݕGgՔQ)>e@(zSOs 4JņIq&hrӧf͚uy=3zfh񪪪j\sUWi֭Z`fϞ˗c%%%7n:t蠴4=_^zqͪUtWn?'jĉڲeK@ mtm{X6 h8{E7^6l{xmy4b>ĉ%.7yo[=}y?qk<]zEi#Gaw ZԾ}c6~-""B ի%IWVdddcY"Icǎj՚5k >,kΝ:rH㚟9Gso1eT~V}qD+v^qɔ%AƺLܘݹw(JrIY.&hQ999c\NNbccyOQQQǬ9k5G9*))9@]=$ v7RaM|Zv:x9S 9Say:хۙn/?""" #'4yd'۴1Hw䙎ޡKnQvVgY,Ҝ͇74oQ\YVKE~6.Q#EKrssznnns;o]] Yssk>s~7>NG еC\S&O0e^PV44tŇkB62<۫SiUƅ鼆V ZTrrhѢƯh͚5JMM$Hiiik/^,áA5Y|jkk,X@]vUV9s~7M[K4o/o=8:^{ˈN dpƺLmՖŦG*$1VD^(LʴamذA 6(33SEӦMw}ڼyZmV'N$u]g}n&]V+Wmݦ/\m۶$]y啲uV}z5}wqΝ\;v_W[Nv[K-"*ĮL$=`LT}v@YjkSL)a'0eƫߦNti" 4u֩_~ׯ$iׯf̘!I{4uTUVVs*005yuMcƌѹ瞫3}?WϞ=[ohy7Qa~ڙ[ٛΡYKHnIAvDcfhю'0eo2]g:5 Rצ&UML0]x)RdYv_VeHy8i&Bt㰆)E{TpNsG겁 1eʷ*WKPnH"^P8t &$Eߥj g1 kbaNXhnj2yfnL'.<_ ]z)݆{yek䴶:8)&M k6g$Kor,Z(4Bay\!I6 %p(L˅aɒg1e%7i4L,d$Lk:x  IRDkCQL֑g=Jϔ v(L32%D%IO1eǽb*jճ%p(LG\74I~ړW2ࣘ.הQ)Zbwg18\VVgHaN @8$ה)>{%D$q 귮^"48e&C0e;L_oaoa~,բe!thQE5g>3%+P ?9˄)%FN2ZkSyM(LL@?-7[rLQ[t-#.mRdZdg6(2ZDqe^_!IcL %+QC2[>[P*:%}Jr}_ Vשk\7< tM-ܭLnuZ.yxGٙ.ѝeH ibqYVo%INt Z&"5)>ˍBQ!v]5$}2a{k~TթSLth&࣮?)@w85%+g8rY-҂mښ͔ TV]WK,%P gɔ 3g!+"_צ&u }8w{*Urכ(Lpfm|XKw囎MpjbELVh%::E4ok*1TeM^^.2*E~6.o;)]ݰ3v3eۚ]e uCL`@JlX~GoΚ:\^Ĩ`]з8(L4!H+63]G' IRDDL::ECړWj8 4z8]IL@|\lX8ad1{ imdq->\zf-k:4f*Z"~MAa-#:njB}Δ t:xvH"0mΒ/6TFA4TeQd4Q%Jz)n|m>X nd^#4kN鹥e}v@%j0]M I<sXiOKIÉc\S&? iשs%wN Nޅ Ij*Xgg[~,RU7c'ҙ)Upee3}KOO0 ѭ:fh|m*2NӋvIذ@ÉS$I;*i;4at 45 @!O[Iҳg.Pgf; 3TS`:pRCDq+QqY,ښ]l: ^60AL8G2yomJ2N=U4L@s0#%6TvMdXQU{f-#.D_bze>qޔ} Ճ;^?n-9ڕ[j8 3 ګ]d4ܙbi2y*,1~l<䆡 3 t٧KbۘUeZ4yD8<Ȯ1.B5ztqߖ]e uCLFa8F.:ޔe{؝ط  ,Kg7WWQS&ܓl!I 7 zИnr88 f[vnϕ":Kǩ[|ʪ qถm~h8(L?k_lV i-t'jN1$VS&ܧҪZÉXNS,r}ֹfp Nޏ&DjX֪w81-$ szQTMcsXgՍ:>no28-KEf-+S#NMl?2yeEʫ '=x$3`8  /AQw$ir}$iΆdn`ջk2MIҚZPvU7`Z ^|omJ %{pJ#ƨWqx0?UtM"]U4᜶Oo6A0ДhKTuCg:wR? Mcbvjj}}8|GbwlV&d:  Y,Mmp"셥{UpjHh t^g- [޼lje3K~߯ Ba8)괶᪨k2eܒ*}u7%%'(6,@i-hG֑L@K0O5kAiڵ#S&oPqeD|KUSZip(qx@85eҽg@˛pvy۪cL4{(L>M>]>֯_>}h3 8zīK\J qezg~ImSdX 'm2 +lq]fK$g@ˣ0{'tM7iҤIѣ^x^3 8VESF>rʪ 'K^vj>B#Ę tðdI%{TpN.9xu 3| ZMM4vƯYV;VW6 \n!*7([KF1]\3"_o2WP&ۘ.s(L T__c~OuuJJJyji<|骬7/xcUʪ->LcǝW פI ܒ=r8bճ]8(L+""񑐐`:v&kTPVf˕VoIrqi2]yM?)rY쇃LQ&j[fSn*>>s񑕕QojrÔɋ)?WIU:ń蜞mL"umjILNL4Uéa[_b+qQv 0@-jТEz Pxx1ܒj}vt^NpML"%Z g&+ߦMlW8TNq>Z}QLi&zӧO/7|S۷oɓU^^I&x?nQҽwN&S5J 5 U%I.f@xq^;tFru6| e]{L3fP߾}a͝;p.֡v8Rٸ.4z<]tN@˺ixGJDV53!9u'vmڿf 4t$+mi؏S&t>\jԅۛŅ$I31ytU9'!Rg6 ot ׾rޔm:/QS KJnIv?>0㖑ghJ_h:/qFY_tY,<Ihn,u祃)M]\ذ]pw7.2H5L=˔ &}W6-t@ ov$iw^m1w蹆?@D|ݭ:jצEpŕzce$%L0fÐ$I;/NLz_nVfaBrP8!o;ILZ:u M I\?4Y!v*ѢyPf.q]qX~˔Q)XrP8rELF):WIj,vT~U*):XSdn<ژU Laf6lu3ih 'cM"U+5+%IJrnxg4]q뼁gf)Y=W;sKICM->\zf-k:Lը]d~߯804wfGf_8Hv?nt8tfJk9zagepPTuG{04[GjŦpc4W LPlx4prN$}r zaadg Y$}]S&e|Q oL6cHRM)?kCWPVfpq'@ah6SFu"ߖJL]:062p85veL2eXgc7먐?É'Bah6)a:gIҬ%{ n~q7rTKPm {|H{ NN_;%FNb4N~N]8Nls 7p2(Lͪ{p'Sz) 6(yZ).FvQvk2ee-UX& I6p(L1_lVFA43 y_з[Nbi}sU+k '`3\7ah".OAahvGjT;e@[`[,LguS׸0V鍕0lƵ?TVa4L:y*%6pL^[OULt6N^V!vÉ"%.LngNْ#I:^m)&Dŕzk~qtW6(VM7c< pitS&/zs{ūK\4tlVvMԾ"]uhiK\u֡N )Ѫs8ҽha{J5g!Im:NM>mձuT0e{"YM &uǘ.e)p-i=r:q=ԣm8lVrMԾ̔ sN\qFb &uFrwRmS/,cerc$1L^m`2|w釵6PvUd:W0S&RNq4Z¬%{pJcŪgq٬S&/-OWeMDZKW|%(L-np(zS&\o8(It 0_;%FpyYÔ ejY4yd8߀,Kj.,K\5dzLNpi._@ap+q+Vg()ZGN MQ i(YKp"'E钋3]ތvFvQ߄HU:²8 }ε]'tԡ*}=S&KDˏNl:Q܎bi+p"d֒=s85skt S>Ibt4DapK;VHU9___ &FVқo7xC3fh\o>M0AF҆ 4m4x㍚7o^>@ӧO׃>׫O>?~yꫯGiٲeօ^|?<&eX~omWN৞][FtQVYuhEUY5S&;yrkBKgXNtx7xCӦMSQQ1_oty);;[qqq^xA{eujΜ9ڲeK]~***ܹs%I 5sLIPBBNOŊѻᆱ/Xcu]WO())QDD[Z"ө_Nk^#QP1O,Sén~&;4e8\?x<V=+^N65R Q&@s&hqWV^I?~JJJu5cǎ=ƏիWKrMjjرkT[[{̚nݺ)11qTWWs,KV?|EL{Tpjd lV15etVNt;%I L,BasLY"⚒UVV@]װsO?GBB¯945Sj띚LH~ק:ƄV0yv# jh._Bar}bcǎc6_ō,ӑ?>KYpJcǪoB8lVKctW2et:|% @É-'宻ѱcǓzx=>>ׄ+((H[f;FMM5c3SZLl.M$Ij8 x ڨK\JL|m|Xvnt@ 0IQn~aORSSyf5~m W=,Z[`RSS%Iv] 8fТE 0@Ǭٹs233,wxeNy׻zh*?2y}*1=SO4LL֡Z \ff6lؠLkÆ ڰa$IƍS=t5hƍ7oxM2E#ru=hǎz;lsO_~Yoo߮ɓ'\&M$EDDnӵdiҤIJMM[/o6CFuQé'293h2OӺu$I6MgϖfSjjj]{z衇_#99Ysт ԧO=zW4~5]v{1͘1C}Ն 4wc'uy颋.O?24ƹrcvN绦K.^bB cZ Wf);MYQL8N;+))QDD9pS]9qzM|ª5YJ 6 3Ֆ%iXoBӑѺ,MjVhH&3.ZrCqt:XG*k'0Y6V9{ Lc\y_@ÉY,lהɇ벴p"{UkbtmRdN0ڷ U:HS4ohۡL10)Jƨ Qhzo_%jH0` c:mڐUL"kۻLVD[2jcfNx:=t$1) c| cņj$Icv`hJpP{%>紶:O[I22tFIDo0xwRXvM٦^Ρ.2 '4.Y-Z#O2 MFqe^\.6m\"P<\D O,إzDw`]TLXKM2|Vr]z\GrnT^]:u m0$ICB;`:*kݒF(~`cRdjmF7xyUz}~@0x?M"IzfnUNx|j g$>MDK Izt.ճ^}"uvxqn)7XUz~k?;tV%&LQh*[xr6St9d0] +tΒUYuDgzqYTԪc]ؿ8Q!v4$Tǹms85kw6f(L^:D5zaOb'/J|.IQ ÒbWzA>N6Tm:Pٛb987ogjY]$I//OWayDgyj.U:?1ROc?op7~ܶ9 8%NSf$}۩{pÉU&jچN.m:1$I۝M]pnۡbmNŊZ6l Fa*VE]wpDgxdN9qe:gxn۬%{TZUk8=5]rMj%DNpW&sf%FN=:o8[QreHt \Կ:ƄHE^^n:ڔ% Ӕm8 WnXٛiCV8r:za?KOOP0É'gO\+)p"}9|MT줨DwFaJۄ%IzND{-Wi(П3^:Remtmf +ICL9 ך~VYv_m3p;u=Ұ g&+.JҎÉSZUg$1~ k g&K5wu7\uNNрtnx9_0p;/اulKOO0(L^mNj=ye(8ۨӓ ][LY~{w͢ebw8/++%IU6.N-^-<_SGw$=`*j 'ëL8LIR5 (6XQQY X.vWP:H5@Bo I!?Y%M29s̼3>swr>u,HQ!>ٳqSz~gcIҳ?$b6@X[Nu րf&Z咽(Yf͎x^YYzZn39| k})8dkκCbPSPj=OUo%Izg^-29`7Q^Cf:~撤%dD^X$%Bճi]j [ܮ:4 R~S/mv4u%IjK Fj>:]Z_dj֣ZĘPP܂j䁭%Iscy&'$8 ]آz7gv@Wi22Eu@j ۈkVWń2‚$Un,zTK%j HyE[vsɖ]/oev@ Dap+j$fazbn$iXjdr"@EZ-zxPZb_(I{IsxPQJ]5J;eɉm:%_M}U֥W>cq*Ί}J)RTFnbv@ Eap;.o)6* zqmr"@e<0F6Evi~Ew4YWPSQNx$i;uir"r\O9jXGc.6;5 J}+j/HRaKݛh`j0 [EM G)مbqJuR.m)?O\E-pٔ,E2$VH=le\WGN"Kݣ9IhW+j &'*azrn$iXj0DP9\Ƣ~=[RdHS9}a.ԌܭGP|\u8YjҩUJ!~&'Tgh%/@uH$驡miprˮIJD~snf(*gTnC馞͎ue-$I$*Ds =6tUHjVHZ3ff͚Sqqqq[nՅ^(oooEEEi{/B111Vv?{0 M:Uחݻw#G*00P3f*u@+ة'%Cvg)ZgBի)#X/}'&d!m9/8Z*11Q.K+h̙z_~jܸ /׻[6fպ4fmڴICСC}1ӧO믿3gjݺuSUX3G-^Xʕ+uwV/@fZ>-UKw |W&j0DncW.?kI59{yEzlі 69 oT/f̘}If̘GyD,c}o(I딟y敽NϞ=ձcG͜9Sa(22Rw~IRvv5k,]ڹsbccauU` 4HGQdd9QPPXa5ôvꝕ G'H@ז+Kv),KKHfG0wW-ޑMC=ep"آ/(~6j3:/ *]vvBBB~^fSVHR'N۷o߿֬Y#IڿRSSˍ R=ƬYFee$WVU֭üEEE)wB }uR2]z=WRCba}"Q}l8/OmO_ݖP%kJg?Qv_jjˍ;sjj꟎} +nWHHH٘36mnQQQ~>v=5tV׎JT0 Mn.i PCEj-%Iߩ"RӥG)vQܨɉdɲX,z;=i0`q&%z!egg>lv$&4&\E27t1%5oQ;Cv ӧm[?P'KԼf4{%媎cva"vOz럎iڴiٿSRRt%W^s_<:淏~tرlLzzzp8,{xyyO+mrW6Ҝuus\#MS39۬znx; }}9EC;5%DfŻ$IƨY@ P$ɺեK}GZofqqqZrJJJ[xZj:uꔍYti-^XqqqhEDDu֕SVV,[L.K=zw$M_B]0IrԴqQӳ?sоaF$=v;LNw/vs`]Ӆ)UtYҨQ#:vRSS˭r7ScƌQBB>3k8qb٘{W ,K/D=_u=H,Ə~Zmۦ[nE:t$u0`_^] ad"tz[dkJV^vɉ[ANTi֣ZʴEa xbٳGK.UÆ U~iAAAZh߯.]ԩSuwի̙w}W:tЗ_~oVm۶-jܸq;խ[7i.+&&F]v  .wSY-z궲Y-%I@q =vtuռّ]O-ڞmr"NMtQ(62Dwd1 k? egg+063w轟AO#_OC国>Av-brdnIQ޲8y;֢}av$Ucp/Udqr $I҃b(KjXz۵=9GV0;@iQLCa_eדW$jv䘜azm-rcTnHZ.4K n-Izi.,09jr Cֹ. 3;Q7\:\F27r1%*W41]6h*qm(v%Xؐ6f9 Ǯh#/6҇*zbn$i-2V:&OU/^AvmwE"_fA-=ڝzz T|Lnuuĩ o2;j?Վ9 SCba_PPPyM!8/V&Qz~&'̬V^t(K3W5;j-ݒǯhopf&T 0$?kLN2[uĩMCtsfGO5W.v$Dr K4M*q6BWu4;JpAzerO{? P#\ݩehgTX4;!0u(@ }ܰL(L$ Q:]'&PLM_$I2$VQ!&'X,=3XiH{_wSdZ av$ Ӯ Ezco=jv$T#'5n&9]E h/IӐ=y]IC/o.CLNQP4]5$Mjg䛜Ձaz-J.TzLO.nV6 _lUvӐB*,qj'tĩPQP&^Rݛ(ȡ79VגY捝A1ԜB=6av$l;hyk;mJfYƍTSz;3qg(}ʐj D_O^Vo;~9`v$hQBf9(Iz 69*׮$E2ّ`3g.CESSPu #[Ka~=ir"!%r$ uI0PPEz7 }[JvSsLNtzݒ䬓j熷g@rk&C.CwQ鹅fGBr8]fe,QAzّ(LB\\}Zĥ?ި"ّPEf>E;a;)uKbѴa"_E7gNٱPE^_Gdˮׯ$O;5BVE^QX&Q#YzVy5.kLM_dv$T5{e%I\VM*7o,բy[?k (tݒmuk&fGR5 #K]O?n;jr"TBl\tMc#Q`.hyC[g0 MjeaMсuKna`OSI_ncy&'Be(,q+-HUm̎y0$c.ր6*q.UPlv$TVRO[YA>[po!+r+j'l> wKWz͎y0$Eӯiu}uR}E.KwS<4:F*fYƍy6nEfثo7fhΊf@-@a=[41]-mv$T)9&tC(H",[o,]mZ}HR$IWQLN@Š0dm"жז֗GLNS17ةɫڲn um$=3~=ir"Gs42 閸ƺgc#Pa(L/n&IV'D; 3W.TP?=pb۫u@eiGu=hFn f90 C|]<o޻|91PPPxmz.j꧔B6k8P}YO4}D{umbr"@o;}=pIX8ޯ/j޺ JAa@5٣RrtϜHV#l${Y DTo[,1]|]a `Ybq$iʐXijr"* PT>MV-O:'p {,Ow7^+;Dj|fGF8DoYVٯʒfGl=}Y!=Jjbv$* T`~}'Y,Ҝu4ԔO2u۬ )tK:>,ٱ1. SCJ^_[;hr"֎z9״-:Zj_=6$VD}%D:<^{sy{̎@3Gc撤)nעTAv)d:7 {!$@_;[{Gkђ?ߢ{3LN޲ J4ڞ~nev,j u]2qlRL#}t딙_ 4 *Aa@ Ƞ&BNnAvS!D7},Ξj`v,j4ŢgnKcTpi_'=Xn:-RLD}[wz{ *Ca@ `ZuiL K\m-OL7;[9]lKV]?O͹ZSP6޼:D+D7N{QT䬓J)T0 4;Uæ7uQp;\?2w.(/KZEPP|=pTW5 B];sR͎r 5:r⤚՜{S 5ݪFvU4t5Qcj'K˒GBY@6:_]'̎Ue59wTXٱ0 5ͪ׮a24fcJ'K_Y҃JVKs詮(С?XmD~nzW o}rGOE PPmVpM]5J.C}ٱj3%1f-xcTPm60i/-WbjBJK_c`* j(բi馞d҃_m4;V}D*Kz)Kjv? Wӥ~UeOzg Q]yjԨU~}|JII)7f֭ (M>w_(&&Fj׮~rS~Q߾}{rc2335rH*88XcƌQ^^^ſi0jSWm%I~]or|Z[N%s)K0ݦna24-'U3tۿPfB|?zE8S Q\r%ϕJ{Ո#Q~Ըqc^?w}lիu 7h̘1ڴiCjecO_]3gԺulȑ#ŋk޼yZrΪE@X,2yq3IғvEIr <Еoy ;55e ۬zqDk,IvSL?QWnC]ѷwV0NT^CUQQ<<<4c =#JMM$io(I딟y敽NϞ=ձcG͜9Sa(22Rw~IRvv5k,]ڹsbccauU` 4HGQdd9QPPA3՗azunjKZ:)d՟aSNQz. 6;80 h\^Z㢦zlVɪ?s?{?^|H𗵉 {.E-CUX҄϶ﶫ2;ZHz<o>]wij;5V0eY7'g몷V)!%Gu<=ueswe7;jOz럎iڴiٿիze˖jݺvZ)""Biii{爈=Ә>~ӱcDz1^p(33g%//?}Pz[%=栶푝~6'/RP?KW5 7; Z{zozq.?pB\Au;e:YT0}xk7E j+LpNBCC߮I[.WEEiʕ*)))xbjJu)trxbIQnLNN֭[W6&..NYYY/l2\.|%P#جMJUvAG %Iw]Lo%) Rsu{,_6Ek4 ;]f>&%& h[⚸P;p  *Զmtj˖-W5`=jРAٸ[jرڰaիqiҤI^/У>E>} Taz*++K\p~mlٲlLff͝;WVUÇ믿.s?kIACڦ﷤HcW%1a&'<)Y' ZtǨ=uU[]ܪgU~C~]lJ$iǯWIӤ* IRfuܰjTJ,Cu@aj0=NNxYL^uLNWq.CWK_jѝ}jܥ-W Tpn覞ue-TSIDK_,٥bK^v=&'cp(L@m'=OOMϻ3$IAztHqg'9]rR]n7jwCF!4 Fռ}=yzo>}JzE ܠƽ88 >00!MOۡ䬓J翞<0F:^9=B$ztHkx2U(lJ.չQӝݯ25s>-ٙVvzzh[v ,NN;5s^XW$Md+;6P 2jOf>eI:G]O]ˢwzg>r KJu W۬&'Вizg徲-EMեq bq  p|XpG3 ]hYqaՠvu}F֤i>#ڃw,>-Cukƺeo?]%髍GN #uuj д}ݔwWijx¦joJ.lCu@aىb}9Y?ܲnQֹ{UzK )9f}1YyEn{5KCט/y4GsҼ):QPRvP? @C;5PToH-Ԛǵfq-ٙigcڻ ӌ88 >tMÚ5ENI͢.MdD*62PBqY-C' m*,q*С"/r(ء" J)}ǵ35Z,jVOqi88 >ICYڑGs3%G:*<@QFܸ$U*-PoNڗÙrUQլz6MCY1/ 5PPg5;0t8v.+Qv*QVlVmxǎ$cÆ ec~GbU#>v WnX۷o}VU}՚5kLL=ْIR||JJJm111jԨ8cj_5]kQXX:u{+55v=z]Zի.]]vIl٢UViئQ6fk׮ec+ժuUyfΖbQpp$kf` 9N?<<\&˥ǫwj۶$)55Ue;+55ՄOqFmذw]&ڷof̘'ֆ K5jTٶ{}kTG'OVNNbbbdt:3hȑ6\T{n+$$5Baa&MnAخ0xcǎ۵j*ú{xby{{.K]vճ>+Iԩo߮3gjԨQ&?\̙6mh?~"##٦())ѵ^+04c f pSՓfSZZZaR*௻{4o<-_\ 6,?""B*7mY||չsgvvXBvٮQԯ__kݺ:$Ie.$)xM˥K*..d1 Cs-[Lҥ<<>> Ҙ1c4qD(00PƍS\\zirz9Ou-5̈́ ԫW/=쳺k~zzw%IEǏO?-Z(::ZSLQddjnx =3jԨڴiM6_m&m5C^^SyfQFg݆[n;̙3URR{G_"##MzWpw]ׯ__#Fƍ5o<9β!!!dPx QFѽ{wcڵfGΉ3>裲1'O4nN:qWG5/47\tEƽ[35jsm۶5w-2Lb^^^e]f$%%s999ƽk4j66mj<#FQQQiTw˗/?Q 8m 7`ѣ\ P϶w˗5aFU4 kGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&QGa p{&Tw.K))) b1;P\EFFj<8EEE> n8Iց&jEEE@ai)LJĔ0Ga p{&QGa p{&QGa p{&QGaܞ0 9\:YTAS'*(v*ȩ"S>jROvxP8UP"ae2 N\@ozbPehwz?kle,QAC.ϟkZԸZEXZyV5oO8]CY|$Ke))-WγRSm"ԮA6TAjCP X 8BM(((H 4;P\.CIiZԺuOi&_| %N%j[r-9[rU,^kC]߭B|+Pq  p|X6),q#p~/ӦMB#:D=UAa:_ےU~.hX.RA)ȡ7[SrCTZԮQSԃ_nclRP=+vv-"_ n[ ᧤tM.A2 $I ՓW,OJ'#:DO mLpOCu@a֨zaaf9 ÐBUm4m}7ӥO6ˋtDtQPMZ8;H.SvhAzXoQ(,q{TXjMtoߖ7y9PPg5顯)9$. ZGlf>!/UO]Vv2;$K^sP//ޥ"Gٚ/}e=5o(+7AOM5S=;=~Cu깨p3fP@,{PcǎUݺuÇ+--k:tHpO?sR5k֬ey뭷ԤIy{{GZ~}g*-OLWߗW#XzGk>,&4nz+Y-җGtۿh߱< SRzmOQW/K$钘0-Gjכ5|j>n * *\Æ s)>>^.R]uUJHH$M0As_|+V(%%EÆ +{U\\իWkٚ5kNZ6fiX={u[? IafYw 8r@#f[RdZжzvHj/ӈ. 2i?&O6)q'/0Aضm奻K|bcc*OOOTIRjjj1999:y222t:8kiӦ)((?PQiۿhL{nh* ͪ[*C[gi<;+E )9穏o{6f_7=lzaD{=5Vo=aoց|:&Z͛n:ԨQcczHeÇ nj ]/:x@ }?{钘0cU[Ƅk޸ ԡa J4f}+:2 CYs@7Nj Pߏ@=5;ZdXtsΞ RRZ|D* *7o.]hڴiС^{5EDDXYYYƧ)""B=~?(իWO6cNR```PF}lVfǪB|]qk|UW0;bK}MSKe h^&!7unBnAYsX RQQt"-]챤$:tHqqq8m۶M;[j Tlll٘߾1_S]t)7riҥectt1RC̎Vcxmz~x{ Z z=&RiYròX;ǓJUx>3N7to$Ð|W7;@`7;jzHTF9s觟~… 1chĉ Q``ƍ8Sԯ_?oӕG}TcǎWAKo|AvmZl>s͟?,ĉ5j(uUݻw׫|=ڔ p6٨;J_K9sx En-?/^_[$)С INxLݪ7u֥1g"~nճWUfWO!˥;43;@Fa [nEGUPPڷo /$+Z>|ԿeϷl7o*..N~~~5j|ɲ1њ?&L^{M 6￯t1M:Uر,Xҿ>٤;i:jPfǪ,&^R~6M1QoWNM+TpݨeefǪ,JV^_G47;@e1 0;P(((H٬gJp4-%E6޽.nkjwe҈. QP% K<阼=`T7n^XkKv%$IԽ}[cpXLtz˭%E6fԙԳ^lV?}Iٱ K7eɇ%޾-@VWKĹ 2[d٬qCg]֚)*՝;fmGuUX4;VaSw'^?.Kn^%f%Ƞ֒7 (M* 0av}Y-kwԀfǪêeJ*AaSwWuL>6}tkwjFYRTSJfثg4 (L'b^4;۸ef./;nŁ*enkVXn Um$Iگ'48G&P г?Ԭ$IӇN z4Guͪ zrn'}viYiӬԳ)eIU9$izD &PE Ћ%I^Nt29ٴ^$izg>P9]tV9]tWأo/Izg>wAT&PE\Go-+Iz6G#aHH=:tq~LwMN@D-ڑ&OUMݣC̎$Mn'z0*dx$uK\s6՘ %IE095Ϝu5_=WT#.m]eHcll#T[&P6:*If¦&'ȠܾJxH1;5]4풤 }[ꪎVX,={u;jVWNAGO Z0JuRw;^ņ̎3Z-z"FZ,$p6IF9]uj]H8OU3naJ)6(X T"n2Ժ~^Vٱ=lzj^z aԇ]ȱ"6kriba_ G)4K;gJ.cT+&P \.C?۬GsTS*?/ٱpA>5"'=OwW8͎@sةN*޹6c,æiweٱ /,Ji[] H8G>u[7xٵ@&~Y.824r8Kniv, dH?+ ڠ0 #^Iեqᯊ;t͢{̎@1}a~ܞ*EE̎pM+Iz~AnI19@@a(`&M4fکɉwjVO\N]y1`ON ^=59ѽ5wI}_lQLsT&PA(НWӥmu̎tm(]-J!MJ:iv$Lzov$_՝<6\x2̎`* yE>W/Vl@r]GYc<~em%*r<_le誎зّPlV^+-H?,'k7Fa24JLUhUvcx{4cdz۵pHT)п>ݤbDepbHme#;æU{22nӇגi[]cv$T_z}GIҿԷ @zmnݗ)?OY6# SCJ^]K099(LݒǮ5;Mo,?O+Kv JQنÚlV޸|<̎*RKo,E?lK Ǻ%i^Znr"CaѮ\=>7AtV̺%ns:ztp陶~L&'n [K&|Y)Y'MNP5(L/(,q9UX҅-} &%)=s6*#H7-i nv UPs6z&0;+-O^zڎZY]Y,MN-[_mc=@p4uKZd7e/]$ۮM4}Aّ* y[SCXW/#d~^v~C'yڬZ3M_zHm/ݭuO[rc'-B|5$Iگ &'\&p/C_m$}q3]ТɉP]ZJÙ&'[;Co,#tݒ[SFK&Ur^&p}IEui\G4;;.lnM(ة>"5GvAb3=?FDAiH@EagҢ$m9@6>:QjKtMd sļi=?Mº%=OU/_A6L͎P)8bzge#:AɉP]5)2hv19gxGoEzdYJ&(%ɉ* br$nQ6DTtigUp ?t"X}]F}K:&'Bu>M1*XMj+SsZI:Y o=2qPX,M^!~JL+w ?4eE?kmVtmy٭yw>^wH`ݾ㚵$i 07j/={u;I;+jÁL{?l;[RJẶ= Y& $=NZ]aT\=5dH?;̎ߒ WB=Q!2$V4}a皜w ,v/0k4%̎.Y]-I6+29jw ]Bm"LNnQU.M|Nّ Ң$Wx=upJ-W4;Mަ%j HّP X,=?|'$MZ͕"5m.C|@Eaxe+,KS T?[2 f 0۔[PǨ`qaّP Y,==}=h>ّ n- >IҳWS/Sqr{Um%IܧGsLNp?nOcY5dg*.T^zx`kI'$9Q`r"enĩ"! @}c p hS:]C_oe P艹 .na&'BmwM׆$D'Kz:f0]O{+4KS`*.Tǯl/6PxrԤq,M%I"ɉ *ܴiԭ[7(,,LCURRR1;v֭+ >\ii>:t,___Q~g~RΝ͛k֬Y[oI&V=~ ϨY TptEfG٣:7 V^C}8Z272+;DfGwi 5 UjN^^8nŊ;v֮]ŋDS~~~٘ &hܹ/b hذae;N L'Nc=7C߿ӫ旁jiaBV*]ɫb njhڰ[-Z fG";GmףCZnæ$Z_ۓMNpn,;vLaaaZbljΜ91b$)11Q[֚5kԳgO2dRRR^̙35i$;vL4iϟwv_,-X@ԣGuMo$r)**Jƍɓ)NNE}yfjܥu_VfG{aaZWZ<=̎s uK+[SC枍͎76M%E電{fD%0A.=($$D۷lLLL5j5kH֬Yvڕ%Կ(!!lo_ӯQ\\rcV[6u4PQ!>{Is͍-ŅIgg-rCTn8psSV][d?k(LP\.Ə޽{mKSSSrcÕZ6eO?gcrrrtIeddtq8"䔻vHJK t6=su;IҿԦC'LNV:y[jږao=8 F]J.490A;vo߮O?(lڴi *EEE 0 =69\ņgPz7a0ަHĩߕNU{khmdr"1*XyE=9/8{Ѽy|r5lذ+++4EDDIKK1Qzd8kC=ÇGdm8pB>6=ve<:8Vu|=~ov@ =:x@ޚدq2VEӆjR<1H0 s=ol2EGG{K.ҥKKJJҡC'IӶm۔ŋ+00Pec~ǜ~ OOOuҥ˥K9///f*(ִvJB }LN穇$dspiƊǯD@yj v &'83 Tc̙*55U'O$i̘18q/_x=Zqqqٳ$_~7߬-[h…zG5vXyyyI.۷O>o?ׄ ʲL8QfϞ;w5z4/,Lbm;7T`;ӎ8 ]mJjLOuR-mv30A1cu~e>l+!Chӧ"""_=n4oP=8 F^vm9/71;{sei=?~ASahYb'<^(LJru J^&'MhB4}Ar KLNg_KҚiGQc4 S >5oJ.{j%)ȡv tcf[⚨i2E3wi袖UqK̎P@~=,IzXX5ݪCb%IVОtEϪZ3M6ESfw8z+IkKw+#D(L*ay;dҐյIّVa:\'&0 #ӥ'%HnXLN=#Dm@:Ң]fDaY#Mken1f˔!iZEQҜ+-Ou|=4oKjcW$}RMN@a)r8;%Iw^T 8?>[ir" 3'^RA&'O&!C Czb0Pk^}@(4Kq qC`~L*(Qнq 1y`=Z?S5;ps&j"t$e79P1zhPro.ۣ'MN0\gAI+beUC`uQN~Hba/@]-rm@ 8@C6%N=cqU0 =5.CdžwzfG*?4S`%gԻ+1 5Σ9t!I!mdZLNT,Ţǯl#Ens64; -OJ]iA͎T8O[3VQJWsP weHE{tّJѶAV:_vbQTpS4&jRD@ܮ7 Qa+ji(LhKw=iꡁqm-iӖ#ٚǢg䫞qJcX4XY,[@UpJϸsaB|MNTEQ/HTEQ6+kKvKJ&'*WQ'&pE-r&jߞqy̎T/l@/9qRYs8JҢ]-rm@8@_+xٵ=9GoI1;p3&jbK OJƲ=*(692NgIi#br"j]Nzaa KT 5+w)С%8@޹b"}Do.cv@%x~A\ԿMGRVDT- 5\}Ӕ!q%܌jCZKgP;%;eZUӦ$| JLN Ieg\5kv Յ-IfT04DIݢ,D9wi>YZP5(L(dj4θ$=4,im9ev@q{6ΒMmav46E ,tWGa0 C~)I3.FjXg~)0LN8%N/( *,D.nuUpE̎ cю4m<%_$߿Vߟ%;͎8? TSwijvtE *ڞmr"PQ9r K@hђ~)er"ߑWkKvK&' uEH@e=:"θ~뮋)S{ ͎]O]OwodvZy_+y,ywV:fvPQN;ʒ9ﹴ=LNT/4u.٥"ɉEzNy$ak[M$I~Lźmr'h~Anأ)#Xkv_*(vcT0;P-y4GnN6;(LTk'5҃[LNTO6& h%IzJ)49\=NMֲX,&':~撤&ir"PQir j]?PWuh`vZ&B]^Y8s0}A.C}[{tqjmt&䭔B^}80Pm9Q٫J& h%3.?cXРIGXɉ&`&j& 1;Py{4򖒤QVAɉ@mCazy.;]kZW 5;P#tibtzL2 C(IkZun:=f ji}t1c J4oQ%dpv) y{X5fh+f>䬓&' jiD4]}u 6;P+;DJ*]P8.M_Pzuɘ mr"feUӥח6;E(LT;kc[-+5҄-eZ<64;7ޔ\8@c{—Y T Պaz7toz~&'j&tm(I dɉTpSg}q3z{4Sn+\e* jeaBΒM.knvFץ-ejLq>pXY'[⚘&+]gH19 (LTNT:wXy#"[z5TU&`Nl$iܥa39P Ґ%I/-b6p(LToI<x JHۏ5t,H n̎ /o)բ?x80P-8]zwi *B8U@hNɉ=h抽}[W1"4 $^Q p>KP-|Dn=51hyj_Fx8>y J,OWwj`vVe-ij;eOq@ FatE^_Zzu?/n.?/ɉˮ/n&Izmn8MND~>X_4VY-&'ju|uci/Lan{(Lu]@o|@egcVJv>^w8Vfث"bj`ݗ4M[gi4N;ﹴ=l&'j'o${W09BZ}@tru P)5wIKv*Q0տPF^B|tm(ڈ. ]Oᩩae{TpK:UqZ})ۮ\ݚbvPQ0Mnaf(ZGP6&^R}:_lr"g ߯,.*Sѧ$ŻTt4`WPVAihHnapkã*3 )$B "vΊ+ۯkwUPAtEE.:){ͮ H343'Ý\asJM.,g+swR֍*t+rvBh>]stf(L[\I&V>na$I-ۣ2É3f΃U8B|u֒swp"N8B:h"]|Ŋfӗ_~Yq˲4i$)((H)))ڵkWmrrr4rH)""BFRaaam6nܨs9GJHHs=?YfΜ$sşƢ4U*)6Tt3*5Vf*p0egKsvaI)c-!tLq:WV3 Թ"uUo>siɚ6mVX 6L5ی9R[lќ9s4k,-ZHGys?}jYh**~9ChΜ9j׮6lXͯs~O@@jp)JRͺ \)kN4V]Gki,. fi+a> ԹB_^ׯ\}ڷol6=믵i&x㍊׈#$I۷umiʕZdƎkF뮻N5jl٢?X&LPc={^|Em߾]OHIII2d._ӧOy<<<\?ճgOM8Q&Mѣkׯf̘ӧk׮O_SNq{)Lgkjϑ"iLђԣi`KWci|s_?+)leYC,??_\O6賵tnR޾,q[Y;uY&ULqZvTitt+#@wZ3 _8W 3*HXw@4\)/Bi=,O;eiL)QnqDQ8%%].M#>ZK2Ld\vU$"pdxX%ņRo-f-(L1GK.= }R ׶lQ-Oˑ :,Iױ"L@m&Θ)s%C.F&1F%S&{,K%WxK0c:ąJo.N3 gDZv\_=]t Nyڞo8 ejesLpl6|=a 3y5%]F ӅdY+Ltɵt NNMT\^76 unKOi#M~sS&_ժ=k]]ͦ{?tN\ :w|$}:7 76&Tt$Mj8 _O\׻b 'gMURQX8QS K0]qCgMvfNa#Z|kkʹIɲ=.`PcS.apsIa1V%Mǔ XKFihK6]cuKPiCo.fPCYz!I=)m POxHYLnw} A-Mpl6q~n`^e- :3e/%0]x:C,˹>x+˲]KB.5{׮;2]x ͦuy+*7DaN:o,K:%$\)`;>]r]f]x!!.LEUS&x5 --g,wWrA9Rd8 ԯiG"=G>vt ql6[{wQ^qD 尤!ILK n9e2)e698)+) TU9, lX"LpuoP6VwbrMWl&LlxXnJd8 ځctIy_賵?p8;E;c.Kgjs 2PӦ.حJ[Gg=79maeM\Ml8 pa8j l8QShs.OЁcLLjlmҘLnӸ7o-NSQYD>QSX*$FO(qԣZD_(UTYLxsSt#5QF!OuSb+˙2P8eYr_3]d~-1yi[l6i̹L^3Y43e0pXJz5oVLިO(IdGzus.jո4L-^"u\3V3 Ha>ZK7l6DL2x~eNuc{Ffoɐ&cZ>v20M%U@a8MuMЀ6L`Pr(բ+zca8P'TO\9NmbB `_z4Q ),ӿW2e70pr2t!.fsS&3VՑ2É,wKbL-ܭ Lt&Nڿ~NSqy:5 vѦp4Rצ*pLpoSʲcf:pEϦTVA>YtpQ8)zoi%v 'ͦqS&.۫cE;Pl<$I7Nv1$iڂ*tN$ '%{TXVP>t.dHhu SQyYn:)wNVpqz%(:4@J3 Vꃠwi#pN8~gVNfb}zzj -%I/ح*LT&N%{TPZ6 4c8\аj@zoqL]*mkB8\u})*_r~)X0 *钱fom39e%*,4NΡ}yr߂}5DIk %+<&G*B-.pauWF!-Ї'卅UQeoH"t. SZvttpP]%Uzsq$t ?c)p"cYY 4խg;L^*S&x ?Ha6 ҥݘ.pbvWӆA:RXg:7ҡ"*tn~- W;2 4g[8QMeUzcatɠu v)ha>\,v i#IZ'짛5$MKŔ #~ӧk(#Tqၺgq{6Q\x24z!ep5o/IWIE:7 נMFFo ?m>;MurhݒTDIJ4mnW: '+ҽf) }I&3eG0?\wPQ]ӻ8g%qhuLp-,MWaYbCu^qT]j:Ba*׫KFHT%N]nRݪbk((;KHrNL8uѡswN Zfm<#Ej집}]ק"Chxt$}|J*Բqg:7viEzV瘎 JFOTHDYzN$yrp}ofW钤[ˇ!.}rJӑ\eY<9]r}rs5 7' Ӎɥ/_kIDAT%9L,)ҡ vKR| PwZ6n8/w|MHk„ zǵvZuUÆ SVg9$U]thTDh<-ut^ut(TѡW8ݮ-[`2ױ"VǮ2m28qxo6ҾbE΄S&_o8#E?ȑ#RLLLcbbSVVZ7OjOWj@ix@]]})W27rXzu_ITD>>̬uffbcc{~a_QvҊGSl:/$"Hh*IzuS&Ҕי[n@?ÉxFtXzcnq)0GWϞ=5wܚΝպy\@kp+mt tj,m(P_/t^'(#pp*(L&L7|Smۦ;SEEE[LG<*Dvk"Ltɍt ӷezTyCN  p"65!B8tp(Lc;ϼvgNS,Ok-Ml6U`NN 0C|RȲ68v5g%(:,plHh SQy^tp(L1ǯڟSl8 wfo>*?nt^fi\{w+p"p"&n :M#U9,M]Ȕ 3esM{4U i@1V(R,k:8 `CHfޯy%pWilmҝ.vVe4WN] `Y-"'1RUXf:7u|K5QiuS`+G YXY}G1p&QOXOYp73LlҘLp->v28MUp7 vdk-,3؝]o7$=4}z}i w)'#Z?WvDqGa\ եiJ*pOeI)c>.t]Wl+gkML뜤w3ENx> l6v=-.7{H_?$I{%\[n2y}A*puӎju@i pup!^T^1{}nU9, jX]F'tmfj_uLcS9.ꬦ g&el6^%/0ڟS$;4pr}4z@KISUɔ ߱fot P(LK1VmR/c:5mnU:,oH=74N>0O{kæpQ.GS5ml8 =(LKm[=e*,49WOv ૿22oD\͆Z3[>vt P(L˹K(B.k:4W9'1R}ZF "})M.[GNx r|65y&[TR^e8W_+I%Shn(Izu^LP~ږ)M3IZQ4{5m#5G`4W:ԳyCkt uKD5ٖi:]S70>&%u Uo,ܭ LowLp^oܹe '?/}@KIk RUQŔ mJ*=v 84@vNLZ&7wX_?(9I  LQ!ڟS/4@={wU]Lv5[׮U{iyZ8 RU4mcuM0j&)W秪)kV_?Ir^ng ս$9LxNJYf8 n\!{X_?d:z/T!s8p1|lZVa/ح*KZEWHqGaBHzN$LoQTV2]t $"HWl*Ize.S&78[KaPqcr E)HȔ >ZWNJ+"*Xw7θݦŻhc8æ.HUEQ2t0nAn;ǹɔy΅xJ9]r ϗ{0exC%xUtI %Sp+7&7WxҲ4)c}|yT.t7c;L}Ljj%}#՗eP觿we2y.LT\^鋜%c.eE΢2<uى Bޒa:ъ:RX K@L,ؑsMp.حJz5o~L. ?r6S&'()Ҵq0]rNf-8Ywt.\B[uvB|=@?nepWKz0]Ǎ2ϔ ֦.ܭJz4P֍L;(L[ g$27) 9K$1]E,' K5ckO"꟨v8_se9Kʘ.1z-y۳)(Meuos0]2 "uS撜g^ZS&t.ТQ./Iz)d{%Iㇰv 4<_T׏[2钦 tYwnmҼYx t'iBtI lt'@a]x Vtt~UVVfѣԺuklԷ~͛7|5\\͞=[ԧOuYzW%IC 7nz!qƚ1c Iվ}{-[L}=#??_SXXZdzj>" J+ts[\^Օq4c>Nǣr;"-ֹ/.P;uVHӑ 8rzl2uܹ,aÆ)??_[l&%% 6L˖-bYfMmvRRRjYf***jmf͚l\7&7WڗS0@ޣ jK.[Ǯ9Zzt^KKiDY! ԻZe322p|ȑ#m~ʯ-eeeϯu`_1$i\炋-.[$IV>vΆ?+>"Hi&IzqqB}yġ gP>>5k|||믿^7x;yy*.46zDKR/B΁\\fӃ;2d~fN)\-ʞMMpP}K]eNҊ_]{pks=op=G*uۘezsQ$iv* ޘ Ö q:[ذ@npz^[EU$\w5Da^(IzǝrN Vs=6\\PP]y gNɁcp^InNL0tۀSjV>_wtm(MNJ+Ԫqz=}Z~f6ऽ.W9ԯUnd:3@RX\vp"e钜{zບ6 }=;{LٙY$=0l:^a4c%DPT 6槪p"u9Rtr%휖+X ]kӏ[3eI kk:zBa+WlBST wT*tIuNBh>Yt%Yg.IgS5@}0_N4}q2J '\yf!IN8 |5֒붕n֊5>PbիyCV8;L\s?8^\-^ k4SӆA*(KM\JeCO}Mtcrs52@}0/6M^^z(p"u,}DvfǦ1](G:Ϛ`NOVBil4Aa7kɲ&˲LGs8,=S}=z7S`É֥]S0Uv²Jss!mo8Fa;$~N=;MjAm<6Nnӣt$XOYM[[G "*X7mn:(L~GBdn>$oa6`PIyhbl8@rXz-+z4U0É ?ǮwiGIG+i<Éӷ$~ږ%M_tA!h;I+sw)p"}j6Shd:Da'm˲ǿ¢pkU߬4SLgSujJ=;{8i9VT~pVC '(LN#$)Gki,߫ \ݦ_IZ7p"{-PPݘt.4ąi칭%9E-(08uY;%I oÉGWSIc_nQZ4c>I|}8$ pFOTbei]﷫R]뚳p1ORXG+Ҥ6˲Kƫo(ӑ0 / IzgfNiGź٤_I>vH @s.;t>>[{@k*G^t. j1tXz,PQФHL]"4W0VY!Bvwi@É: :2#9t[G;2 0OT9 o3К 'N9;u\薳M(LH`1$op"e9΅:?I,c=7ԕ= Oj3 åm;$=qIGrJ:g5J RV㏫v7n9眣@%$$9sΝ;ᆱeY4iU{ݜ9RaaaШQTXXX?8ZM"t0DS|MEU,BWL0&<߹CpQeaIw9mMPNm߾]Col٢^zIӦM#\W^yn6CO?MG{RڪID+?i:'ݦ*jPhj:=t~B}`fg:a7a)}'EPL8Q۶m[˖9:tHV~j-.I̬ucccp_?mj_R9995պgɿ8ׇx{I65^]Gòۤ;4j絕$=?{ J '7rVQ9&8)7VRRގIrA 4H={;#nE9s]vjذa6sέ}sQrr$)11Q׊+jINNVnn֬YSͼyp8ԧO:֥尤?ۨ*HBUfIҍ-!BuթIK+W[Lǁ+3;|rvJ 60A:^4kL/Qk͐뮻N5jl٢?X&LP5{lھ}x ^Zcǎ\L{ѓO>Z6mҍ7ިx1BԾ}{ >\vV\%Khرk_wtQ5 8txWRڑ"Ehж<]^Evߜ76 ^Ʋ,*,TԯH Ԝ9ssiӦQٳ&NI&i5O3fյkW}/թSmx7NGYgB͞=[5|GJJJҐ!Cts0δz"e^iҏNo@/ruO褰@zԭc`+Ic_mQ^q ;n:eǦ".; 4,˲L\Y~~Õz&?Ͳ,J-uD}#θJ.ygm(E]u=LGxҊ*]8yvgʞM]MG8VT^Z#?=IZw18&LfS ?H'/0mnm(Pd%Mx@?={yl5xWHO~MG &t$DkbO}MY,Дy$I_AQ  'x^-"uSr IßoRQY@hvf복dI\E>#&~-ԥiK+7[LǁrXӍ>Zt7 %NM"tXa8PEezM[g&Ǯg.s.Fݦ %t$xN׆ Փ#:fc@ ӗu$l1w5ڙPԳa=$鱯6+p"x=G3zva{ņN66=ʲ>ݨҊ*ӑA;wKN 5'00`6j2=7{8?ۨJnz%R5"6?txJl,KK&.t$@?=U}Ӫ=\"=G>z2.0'"_wiGIPD֎E뱋:QүU#]]=p **4`nn$al8۝9N;ƪza:XjV^Vz 7'00 +>[{P wf׮g"Kq\CtXV}٩Nm< ?/(3VQ=$6*+p"C%7[$IU '+{6U^^Ҋ*ӑFV vKKgŅNQ U0+neY# T9,zVkpvNHͦ쪨m(г7WR le9 ęQ_rM7ڵpg>Xt$jezB}4=55 Wv$d2`Wu0Dͣ%MD"Ą$IvR7~ߚ]IͣB 'KAe}ZH>v^ P@*th֫a:\P~igFte=Iyj#z \iNr$sۨG&.n+aK?4 .Ʋ,=f8VfLG9/#kzoӑb&|^eټ ne:/Babbe%I֊|怾pHv^BLG #՗!}ڞo8\Z嫻Fz+ )NWj*˒&|A#eH=sy _ nXu*2 .`\s_Q 6&.j,2XsKW[LǁaW)e)f+Q,m3 U5.tob:/DaꥫnXwP_?h: zt0O~znLG4j"Izo^۞i8L7[hNxQjm$I|IYE;5}Q$˻(6 Io3 k8uIJ Ѣr7st$ԣمzӍ;RߖQf&.ǮW롸@ei'8%Kܠ#ej@HԹ@?M|Z3[e:IAiFZe{kk:/Ga5{Ǯfjݦ#2wȖ]@?ӑ8#Ą$9aKD8K>٠E k*ū_QsE; '™5g>9b '̺WnB4ڙm5SvM&tmY4?t$׬[rىWDԏG/lQε_bnDse꥟vJr5!l Faf&D(BF%U#WJiG.H2 zck#{ID-Y*n(iم?eY }sbBaf|}4 zM,$x*h+Q`M|7Dk=gz#UjkTPVZ4cu0 j ҫݦ:ojyZ{)"t$*Ippp".O+5P1azmdrhkU M%;/j՞Ép:fا&|u7 5 .;$=m9g8N RÖL5 4  ?QwW]Uf~HVhW%I m1N6ViC_e#O=K/q.K;Go0pc6M^YI.(֨t,NJukTta85H MQ:[3֩a:NA"u,idfw3ӑwQ`_qCOEi\Z$JٲE"f:.%ZvTvH8IG 4U*(T MG?DaGR37Lp8,Fm=yS/Kj&IzwtpBUJ.R|x^gwnW)ѣYCM|6}6Y+,KUn<,?^SM"L $߬d~É{J+45t0O!}"\ .Z/\U5maD-S.#Iz.i6nAt9>ۨٛNVY^eiGnV'ÌD$*ξt%֔y.p"܇f#ս䰤q^E;MB5˲LMԹiXp(L<_i;$=Fٚi8$e{%IO - l6=uYg]9NUn`1 ]> M|mwkt$8%&tUrXk2 &}j$iֺsP+Ép_>v^m**m=o:Wpި3uN0P6MORǨҡQҶH0aúoIZhж}v}Oբ J+u+~t,jh>?IW`89&ǮW^s ᦷWjNX^el:9,ʞM5lc}R0),oСӱ͇$Iw l2E }Qx@?uYj2]r;JiRVVE ;˻n,.[{e-Z#ecyGtaIWJЃۙ Q<*XsJt\ ۰?W[ MKWwe gD}$"HiE-.7ˣٚ[]*w?҉)ZnKĄjj2]2?CMTaY[F=[oΤ }05זCb28T}*t5{W2/-"UPZBseQ~ܒk/Snq%D͛z)t,B 4㶾 TjV.{}3cXW҃mÒToГ:< r^+}*}X%5*phP} t,JۘP}~W?%:oyӱ^_o ?$5,AxECKԬY3*..N7p:Tk7sQ``s̜9SIII TΝwzܲ,M4Iqqq RJJvUk9RaaaШQTXXX?4n&GӮ{4Uę4ӱܖafmleIin 'w$+e *u;+:N*4k٤/'f Ca:7x`}'ڱc>3޽[W\qE:t7o5kO<ӧltR]{5j֭[#FhĈڼys6=&OiӦiŊ ѰaTZZZȑ#e͙3GfҢE4zE|}z.DIғns˲,KiEhs$ILjN\gtX z}A*uNQ~in~{۔!?&_]h:6%p}1b秩SGUFF%I=Km߾]tWHfͪy}[n6m,R||&NOkm6uAVR^$Ig\(>>+<<\yyy _ .,M[gg;wY>vv=e]ڭXWKޮ79io\O\ґ:'!+T7J+GoK42 cpp3*''G}'???IҲe4`D ;vرc5ۤzaÆiٲetedd&<<\}fٲe)K$)%%Ev]+Veeeϯul696+(t4~HM]rF,6=|A{Ml6{ukTZQe:K;^g|5j௏oO,(LpF< QTTۧ汌 ͯ6ѵUddd6駟Vxxx-!!n5=cלZX.i]=Z ]ԧeX?Q]Cv5S׽\Y'F/ݦ8VQ~$t,8(LpRz!l?$Zn~Gotk>˫߿t$Nqd%D]9m^_*=?K/ۣk\c4\_uZGN> }bO6Eez 룵+Pׄ}zG?5 1 ꅯp'N7۴lٲ5jFm۶j߾|r%''+66Vױ5m~jmӭ[mj=Geerrrj( Vݠ%G%I)5 -5wb>l:m;?Xz5դ;Aag-&9=|8'qJJJۯ$5!ɹ6$%''kѢEsQv԰aÚmΝ[y̙dIRbbbcckm+Vl\YfypO>+k+(GKRWk,K3WiIQ.7,Mn/[f>Y}@翲H䘎V^_˧.՞Ŋ ԌÓ(Kx.I[XbVZaÆڽ{{1effj˖- P^^ڵkC͛u뭷꥗^ѣ%IK.3 /=SZv:u$Izg3Sbb{1mܸQ[nU`?_6m***t-W^1cIL W^^K*9S?Q O*(#oOۜݛE+e"&|AsKdIw l{Rz{y%Z,.Y}R,p&q ujӦM?~6lؠ"i&MlqF3FVRF4n8=k̙={M6zt]߿^um۶f;V|v.rMx7_lRn{OM-d&v%I]kW:X.cpp& b ,Kwd;=@)mtU]ZQW wP^$exeWuop:`eY`^=?{ *%oq[\7%{TRQ%I'gsup 8^}UK_?٩J$IB4qh[])Υ&UjƊ}8Me-u} siP7+ts'ezt(&{צoX;o݈Jr8W@a/XYefاWhQ$ks4 MV{uB$"Hw j+{6(ÝҊ*l.]^')6Tk:Peq 8^8yezkq\r%B5S.މF˲vH_;wQA@G`5Fto:%~8WS iclҊ*~ؒe%-ή= Hk0NkNݑ2>>_w@إ-O*tQ-ܙ;k.&ImchֺsKM[ʼn\mHRQ ߞdhlW"9gǧeݛ^ncpp& b WQвGako')bԲQ#Nkx˲#@ wdklړ_;1Rm\=Wӵ4w[V{@_ j!5mcE֟U尔_;Ö -}{@ cԻ^tp 8^TH&ņid+!2H մa(BNJʕSTc:V׹ڛSZ,2X5*J#/_ZE;5o[Ȫ,|ơ[_⯂J+R+աeTf~iBFZG7а11V>  (LwkWTTԹsg^q˲4i$)((H)))ڵk﫪c=DUV?zyPiE/V||l6Z>#G*,,L5j jB>:woԡCj=5 }ǚ0aq]V]vհaÔe:pB .Ԙ1c|r͙3G:tj{7h̙Zp:.`jZJotR~kcǎϖ{mݺU/6lXs=ɓ'kڴiZbBBB4l0Lg}VSNիm۶gs=)Sl> WWTT]^Of9rl٢9sh֬YZhF]_??h...ڵkciڵϵc]r%c ݻ5f̘x駟6 s,I… -˲\Ϛ9sf6۶m$Y˖-38)V6m9sXƏoY5Ӄ>hww8VllܗkX#"pJ.B[oue]f9Ҳ,iI_|Q[n$YV￷l6uzޯʕ+-I޽{-bĄ ˵fgەe˖L9yyyHIҚ5kTQQQkOJJRfƌ /+_=}իJEGG{z7kOOOWFFF:<<\}aKׯΝ;wJ6lؠY$iه-[իfvX3F^^l6"""$_p5GQUUbbbj۷J9Cs>luI!7(##@J?ڵkjժy(--MSNՄ #hժUﯛnf$pE=󕔔$UUUF)Ip{'gdd(::㾾d?[(--Ճ>kVaaaد8Qޘ1cyfϦe?~̙@q:p8ԫW/=Sݻk͚6mn&S'裏>Ҍ3ԱcG_^s٧ TTT誫eY:u8\ TFZgff*66P*ԍ;VfմiӚcccU^^Z۳ÕYFYYYѣ|}}뫅 jULL 5N\\:tPk߾}TC=kF;w 7ܠ{WO?$iهcccUJ䰟å/Kݫ9sLH(L/ﯞ={jܹ59͝;W'Dz,;V_|͛ZS~~~;vh߾}pYC ѦM~[^4rȚg9쳵cǎZܹS͛7$%&&*66~+V_%nQGC4՚5kj7oSq,ٵk~'EEEz%6atMիz_~YEEE[LGNh̘11c+\S6<<\AAA רQ4aEFF*,,LƍSrrk8=BCCk9.$$DQQQ5_{ׯz)]uUZrOӧKl6=jӦc)>>^#F0 _|Yfر֭[[%O=*55t_^j֬ k4m4UTThرko观:..NW\q֮]Yf3dddٯ8Yڔ)Sf͚YV޽˗Iy{wj))).aÆVpp:|0p@k5__}7VN+))ɚ>}zcY111V@@5dkǎ,???~լY3+00jٲ裏Zeee5۰O͟?7KtMe>|Qk4h`YrUPP`hNOOϐϯyk6˲,h\ kGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&QGa z&΃:IENDB`pydicom-pydicom-20aa4b7/examples/000077500000000000000000000000001515706620200170445ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/examples/README.txt000066400000000000000000000001151515706620200205370ustar00rootroot00000000000000.. _general_examples: General examples ---------------- Somewhere to start pydicom-pydicom-20aa4b7/examples/dicomtree.py000066400000000000000000000043371515706620200214000ustar00rootroot00000000000000# Copyright pydicom authors 2019. See LICENSE file for details """ ========================================= Show a dicom file using hierarchical tree ========================================= Show a dicom file using a hierarchical tree in a graphical window. """ from pathlib import Path import sys import tkinter as tk from tkinter import ttk import pydicom print(__doc__) def build_tree( tree: ttk.Treeview, ds: pydicom.Dataset, parent: str | None = None ) -> None: """Build out the tree. Parameters ---------- tree : ttk.Treeview The treeview object. ds : pydicom.dataset.Dataset The dataset object to add to the `tree`. parent : str | None The item ID of the parent item in the tree (if any), default ``None``. """ # For each DataElement in the current Dataset for idx, elem in enumerate(ds): tree_item = tree.insert("", tk.END, text=str(elem)) if parent: tree.move(tree_item, parent, idx) if elem.VR == "SQ": # DataElement is a sequence, containing 0 or more Datasets for seq_idx, seq_item in enumerate(elem.value): tree_seq_item = tree.insert( "", tk.END, text=f"{elem.name} Item {seq_idx + 1}" ) tree.move(tree_seq_item, tree_item, seq_idx) # Recurse into the sequence item(s) build_tree(tree, seq_item, tree_seq_item) if __name__ == "__main__": if len(sys.argv) != 2: print("Please supply the path to a DICOM file: python dicomtree.py path") sys.exit(-1) # Read the supplied DICOM dataset path = Path(sys.argv[1]).resolve(strict=True) ds = pydicom.dcmread(path) # Create the root Tk widget root = tk.Tk() root.geometry("1200x900") root.title(f"DICOM tree viewer - {path.name}") root.rowconfigure(0, weight=1) root.columnconfigure(0, weight=1) # Use a monospaced font s = ttk.Style() s.theme_use("clam") s.configure("Treeview", font=("Courier", 12)) # Create the tree and populate it tree = ttk.Treeview(root) build_tree(tree, ds, None) tree.grid(row=0, column=0, sticky=tk.NSEW) # Start the DICOM tree widget root.mainloop() pydicom-pydicom-20aa4b7/examples/image_processing/000077500000000000000000000000001515706620200223625ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/examples/image_processing/README.txt000066400000000000000000000002551515706620200240620ustar00rootroot00000000000000.. _image_processing_examples: Image processing ---------------- These examples illustrate the image processing available in pydicom which can be applied to DICOM images. pydicom-pydicom-20aa4b7/examples/image_processing/plot_downsize_image.py000066400000000000000000000022741515706620200270030ustar00rootroot00000000000000""" ================================ Downsize MRI image using pydicom ================================ This example shows how to downsize an MR image from :math:`512 \times 512` to :math:`64 \times 64`. The downsizing is performed by taking the central section instead of averagin the pixels. Finally, the image is store as a dicom image. .. note:: This example requires the Numpy library to manipulate the pixel data. """ # authors : Guillaume Lemaitre # license : MIT from pydicom import examples print(__doc__) # FIXME: add a full-sized MR image in the testing data ds = examples.mr # get the pixel information into a numpy array arr = ds.pixel_array print(f"The image has {arr.shape[0]} x {arr.shape[1]} voxels") arr_downsampled = arr[::8, ::8] print( f"The downsampled image has {arr_downsampled.shape[0]} x {arr_downsampled.shape[1]} voxels" ) # copy the data back to the original data set ds.PixelData = arr_downsampled.tobytes() # update the information regarding the shape of the data array ds.Rows, ds.Columns = arr_downsampled.shape # print the image information given in the dataset print("The information of the data set after downsampling: \n") print(ds) pydicom-pydicom-20aa4b7/examples/image_processing/plot_waveforms.py000066400000000000000000000026601515706620200260070ustar00rootroot00000000000000""" ============================= Decode and plot Waveform Data ============================= This example illustrates how to plot waveforms from a Waveform Sequence using matplotlib. """ import numpy as np import matplotlib.pyplot as plt from pydicom import examples from pydicom.waveforms import generate_multiplex ds = examples.waveform # Plot the first channel of each multiplex ch_idx = 0 # We could also use ds.waveform_array() fig, axes = plt.subplots(len(ds.WaveformSequence)) generator = generate_multiplex(ds, as_raw=False) for ax, mplx, arr in zip(axes, ds.WaveformSequence, generator): nr_channels = mplx.NumberOfWaveformChannels nr_samples = mplx.NumberOfWaveformSamples sampling_fq = mplx.SamplingFrequency # in Hz mplx_label = mplx.MultiplexGroupLabel ch_item = mplx.ChannelDefinitionSequence[ch_idx] x = np.arange(0, nr_samples / sampling_fq, 1 / sampling_fq) x_units = "seconds" # ChannelSensitivityUnitsSequence is type 1C, so check it's there if "ChannelSensitivityUnitsSequence" in ch_item: y_units = ch_item.ChannelSensitivityUnitsSequence[0].CodeMeaning else: y_units = "unitless" # Description of the channel source ch_source = ch_item.ChannelSourceSequence[0].CodeMeaning ax.plot(x, arr[..., ch_idx]) ax.set_title(f"{mplx_label}: {ch_source}") ax.set_xlabel(f"({x_units})") ax.set_ylabel(f"({y_units})") fig.tight_layout(pad=1) plt.show() pydicom-pydicom-20aa4b7/examples/image_processing/reslice.py000066400000000000000000000040731515706620200243660ustar00rootroot00000000000000""" ========================================================== Load CT slices and plot axial, sagittal and coronal images ========================================================== This example illustrates loading multiple files, sorting them by slice location, building a 3D image and reslicing it in different planes. .. usage: reslice.py where refers to a set of DICOM image files. Example: python reslice.py "*.dcm". The quotes are needed to protect the glob from your system and leave it for the script. .. note: Uses numpy and matplotlib. Tested using series 2 from here https://www.pcir.org/researchers/54879843_20060101.html """ import pydicom import numpy as np import matplotlib.pyplot as plt import sys import glob # load the DICOM files files = [] print(f"glob: {sys.argv[1]}") for fname in glob.glob(sys.argv[1], recursive=False): print(f"loading: {fname}") files.append(pydicom.dcmread(fname)) print(f"file count: {len(files)}") # skip files with no SliceLocation (eg scout views) slices = [] skipcount = 0 for f in files: if hasattr(f, "SliceLocation"): slices.append(f) else: skipcount = skipcount + 1 print(f"skipped, no SliceLocation: {skipcount}") # ensure they are in the correct order slices = sorted(slices, key=lambda s: s.SliceLocation) # pixel aspects, assuming all slices are the same ps = slices[0].PixelSpacing ss = slices[0].SliceThickness ax_aspect = ps[1] / ps[0] sag_aspect = ps[1] / ss cor_aspect = ss / ps[0] # create 3D array img_shape = list(slices[0].pixel_array.shape) img_shape.append(len(slices)) img3d = np.zeros(img_shape) # fill 3D array with the images from the files for i, s in enumerate(slices): img2d = s.pixel_array img3d[:, :, i] = img2d # plot 3 orthogonal slices a1 = plt.subplot(2, 2, 1) plt.imshow(img3d[:, :, img_shape[2] // 2]) a1.set_aspect(ax_aspect) a2 = plt.subplot(2, 2, 2) plt.imshow(img3d[:, img_shape[1] // 2, :]) a2.set_aspect(sag_aspect) a3 = plt.subplot(2, 2, 3) plt.imshow(img3d[img_shape[0] // 2, :, :].T) a3.set_aspect(cor_aspect) plt.show() pydicom-pydicom-20aa4b7/examples/input_output/000077500000000000000000000000001515706620200216235ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/examples/input_output/README.txt000066400000000000000000000001701515706620200233170ustar00rootroot00000000000000.. _input_output_examples: Input-output ------------ These examples illustrate the use of pydicom to read DICOM data. pydicom-pydicom-20aa4b7/examples/input_output/plot_printing_dataset.py000066400000000000000000000024041515706620200265720ustar00rootroot00000000000000""" ========================================== Format the output of the data set printing ========================================== This example illustrates how to print the data set in your own format. """ # authors : Guillaume Lemaitre # license : MIT from pydicom import examples print(__doc__) def myprint(ds, indent=0): """Go through all items in the dataset and print them with custom format Modelled after Dataset._pretty_str() """ dont_print = ["Pixel Data", "File Meta Information Version"] indent_string = " " * indent next_indent_string = " " * (indent + 1) for elem in ds: if elem.VR == "SQ": # a sequence print(indent_string, elem.name) for sequence_item in elem.value: myprint(sequence_item, indent + 1) print(next_indent_string + "---------") else: if elem.name in dont_print: print("""""") else: repr_value = repr(elem.value) if len(repr_value) > 50: repr_value = repr_value[:50] + "..." print(f"{indent_string} {elem.name} = {repr_value}") ds = examples.mr myprint(ds) pydicom-pydicom-20aa4b7/examples/input_output/plot_read_dicom.py000066400000000000000000000022121515706620200253160ustar00rootroot00000000000000""" ================================== Read a Dataset and plot Pixel Data ================================== This example illustrates how to open a DICOM file, print some dataset information, and show it using matplotlib. """ # authors : Guillaume Lemaitre # license : MIT import matplotlib.pyplot as plt from pydicom import dcmread from pydicom.data import get_testdata_file path = get_testdata_file("CT_small.dcm") ds = dcmread(path) # Normal mode: print() print(f"File path........: {path}") print(f"SOP Class........: {ds.SOPClassUID} ({ds.SOPClassUID.name})") print() pat_name = ds.PatientName print(f"Patient's Name...: {pat_name.family_comma_given()}") print(f"Patient ID.......: {ds.PatientID}") print(f"Modality.........: {ds.Modality}") print(f"Study Date.......: {ds.StudyDate}") print(f"Image size.......: {ds.Rows} x {ds.Columns}") print(f"Pixel Spacing....: {ds.PixelSpacing}") # use .get() if not sure the item exists, and want a default value if missing print(f"Slice location...: {ds.get('SliceLocation', '(missing)')}") # plot the image using matplotlib plt.imshow(ds.pixel_array, cmap=plt.cm.gray) plt.show() pydicom-pydicom-20aa4b7/examples/input_output/plot_read_fileset.py000066400000000000000000000103771515706620200256710ustar00rootroot00000000000000""" ===================== Read a DICOM File-set ===================== This example shows how to read and interact with a DICOM File-set. """ from pathlib import Path from tempfile import TemporaryDirectory from pydicom import examples from pydicom.data import get_testdata_file from pydicom.fileset import FileSet from pydicom.uid import generate_uid path = get_testdata_file("DICOMDIR") # A File-set can be loaded from the path to its DICOMDIR dataset or the # dataset itself fs = FileSet(path) # or fs = FileSet(dcmread(path)) # A summary of the File-set's contents can be seen when printing print(fs) print() # Iterating over the FileSet yields FileInstance objects for instance in fs: # Load the corresponding SOP Instance dataset ds = instance.load() # Do something with each dataset # We can search the File-set patient_ids = fs.find_values("PatientID") for patient_id in patient_ids: # Returns a list of FileInstance, where each one represents an available # SOP Instance with a matching *Patient ID* result = fs.find(PatientID=patient_id) print(f"PatientName={result[0].PatientName}, " f"PatientID={result[0].PatientID}") # Search available studies study_uids = fs.find_values("StudyInstanceUID", instances=result) for study_uid in study_uids: result = fs.find(PatientID=patient_id, StudyInstanceUID=study_uid) print( f" StudyDescription='{result[0].StudyDescription}', " f"StudyDate={result[0].StudyDate}" ) # Search available series series_uids = fs.find_values("SeriesInstanceUID", instances=result) for series_uid in series_uids: result = fs.find( PatientID=patient_id, StudyInstanceUID=study_uid, SeriesInstanceUID=series_uid, ) plural = ["", "s"][len(result) > 1] print( f" Modality={result[0].Modality} - " f"{len(result)} SOP Instance{plural}" ) # Of course you can just get the instances directly if you know what you want series_uid = "1.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118" result = fs.find(SeriesInstanceUID=series_uid) print(f"\nFound {len(result)} instances for SeriesInstanceUID={series_uid}") # We can search the actual stored SOP Instances by using `load=True` # This can be useful as the DICOMDIR's directory records only contain a # limited subset of the available elements, however its less efficient result = fs.find(load=False, PhotometricInterpretation="MONOCHROME1") result_load = fs.find(load=True, PhotometricInterpretation="MONOCHROME1") print( f"Found {len(result)} instances with " f"PhotometricInterpretation='MONOCHROME1' without loading the stored " f"instances and {len(result_load)} instances with loading" ) # We can remove and add instances to the File-set fs.add(examples.ct) fs.add(examples.mr) result = fs.find(StudyDescription="'XR C Spine Comp Min 4 Views'") fs.remove(result) # To edit the elements in the DICOMDIR's File-set Identification Module # (Part 3, Annex F.3.2.1) use the following properties: # (0004,1130) File-set ID fs.ID = "MY FILESET" # Change the File-set's UID fs.UID = generate_uid() # (0004,1141) File-set Descriptor File ID fs.descriptor_file_id = "README" # (0004,1142) Specific Character Set of File-set Descriptor File fs.descriptor_character_set = "ISO_IR 100" # Changes to the File-set are staged until write() is called # Calling write() will update the File-set's directory structure to meet the # semantics used by pydicom File-sets (if required), add/remove instances and # and re-write the DICOMDIR file # We don't do it here because it would overwrite your example data # fs.write() # Alternatively, the File-set can be copied to a new root directory # This will apply any staged changes while leaving the original FileSet # object unchanged tdir = TemporaryDirectory() new_fileset = fs.copy(tdir.name) print(f"\nOriginal File-set still at {fs.path}") root = Path(new_fileset.path) print(f"File-set copied to {root} and contains the following files:") # Note how the original File-set directory layout has been changed to # the structure used by pydicom for p in sorted(root.glob("**/*")): if p.is_file(): print(f" {p.relative_to(root)}") pydicom-pydicom-20aa4b7/examples/input_output/plot_read_rtplan.py000066400000000000000000000016421515706620200255310ustar00rootroot00000000000000""" ====================================== Read RTPLAN DICOM and list information ====================================== Given an RTPLAN DICOM file, list basic info for the beams in it. """ # authors : Darcy Mason # Guillaume Lemaitre # license : MIT import pydicom from pydicom.data import get_testdata_file print(__doc__) def list_beams(ds: pydicom.Dataset) -> str: """Summarizes the RTPLAN beam information in the dataset.""" lines = [f"{'Beam name':^13s} {'Number':^8s} {'Gantry':^8s} {'SSD (cm)':^11s}"] for beam in ds.BeamSequence: cp0 = beam.ControlPointSequence[0] ssd = float(cp0.SourceToSurfaceDistance / 10) lines.append( f"{beam.BeamName:^13s} {beam.BeamNumber:8d} {cp0.GantryAngle:8.1f} {ssd:8.1f}" ) return "\n".join(lines) path = get_testdata_file("rtplan.dcm") ds = pydicom.dcmread(path) print(list_beams(ds)) pydicom-pydicom-20aa4b7/examples/input_output/plot_write_dicom.py000066400000000000000000000030551515706620200255430ustar00rootroot00000000000000""" ================ Write DICOM data ================ This example shows how to write a DICOM file from scratch using pydicom. This example does not produce a DICOM standards compliant file as written, you will have to change UIDs to valid values and add all required DICOM data elements. """ # authors : Darcy Mason, Guillaume Lemaitre # license : MIT import datetime from pathlib import Path import tempfile import pydicom from pydicom.dataset import Dataset, FileMetaDataset from pydicom.uid import UID, ExplicitVRLittleEndian print("Setting dataset values...") ds = Dataset() ds.PatientName = "Test^Firstname" ds.PatientID = "123456" # Set creation date/time dt = datetime.datetime.now() ds.ContentDate = dt.strftime("%Y%m%d") ds.ContentTime = dt.strftime("%H%M%S.%f") # long format with micro seconds print("Setting file meta information...") # Populate required values for file meta information file_meta = FileMetaDataset() file_meta.MediaStorageSOPClassUID = UID("1.2.840.10008.5.1.4.1.1.2") file_meta.MediaStorageSOPInstanceUID = UID("1.2.3") file_meta.ImplementationClassUID = UID("1.2.3.4") file_meta.TransferSyntaxUID = ExplicitVRLittleEndian # Add the file meta information ds.file_meta = file_meta path = Path(tempfile.NamedTemporaryFile(suffix=".dcm").name) print(f"Writing dataset to: {path}") ds.save_as(path, enforce_file_format=True) # reopen the data just for checking print(f"Load dataset from: {path} ...") ds = pydicom.dcmread(path) print(ds) # remove the created file print(f"Deleting file: {path} ...") path.unlink() pydicom-pydicom-20aa4b7/examples/memory_dataset.py000066400000000000000000000047451515706620200224450ustar00rootroot00000000000000# Copyright pydicom authors 2019. See LICENSE file for details """ ====================================== Show working with memory-based dataset ====================================== Show how to write a DICOM dataset into a byte array and to read it back from a byte array. This can be helpful for example if working with datasets saved as blobs in a database. """ from io import BytesIO from pydicom import dcmread, dcmwrite, Dataset from pydicom.filebase import DicomFileLike print(__doc__) usage = "Usage: python memory_dataset.py dicom_filename" def write_dataset_to_bytes(ds: Dataset) -> bytes: # create a buffer with BytesIO() as buffer: # create a DicomFileLike object that has some properties of DataSet memory_dataset = DicomFileLike(buffer) # write the dataset to the DicomFileLike object dcmwrite(memory_dataset, ds) # to read from the object, you have to rewind it memory_dataset.seek(0) # read the contents as bytes return memory_dataset.read() def adapt_dataset_from_bytes(blob: bytes) -> Dataset: # you can just read the dataset from the byte array dataset = dcmread(BytesIO(blob)) # do some interesting stuff dataset.is_little_endian = False dataset.PatientName = "Bond^James" dataset.PatientID = "007" return dataset class DummyDataBase: def __init__(self) -> None: self._blobs: dict[str, bytes] = {} def save(self, name: str, blob: bytes) -> None: self._blobs[name] = blob def load(self, name: str) -> bytes | None: return self._blobs.get(name) if __name__ == "__main__": import sys if len(sys.argv) != 2: print("Please supply a dicom file name:\n") print(usage) sys.exit(-1) file_path = sys.argv[1] db = DummyDataBase() # Convert a dataset to a byte array: # - read the dataset from a file dataset = dcmread(file_path) print(dataset) # - convert the dataset to bytes ds_bytes = write_dataset_to_bytes(dataset) # - save the bytes in some storage db.save("dataset", ds_bytes) # Convert a byte array to a dataset: # - get the bytes from storage read_bytes = db.load("dataset") if read_bytes: # - convert the bytes into a dataset and do something interesting with it read_dataset = adapt_dataset_from_bytes(read_bytes) print(read_dataset) # - you can write your dataset to a file if wanted dcmwrite(file_path + "_new", read_dataset) pydicom-pydicom-20aa4b7/examples/metadata_processing/000077500000000000000000000000001515706620200230605ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/examples/metadata_processing/README.txt000066400000000000000000000002611515706620200245550ustar00rootroot00000000000000.. _metadata_processing_examples: Metadata processing ------------------- These examples illustrates the processing available in pydicom to modify the metadata of DICOM data. pydicom-pydicom-20aa4b7/examples/metadata_processing/plot_add_dict_entries.py000066400000000000000000000047251515706620200277640ustar00rootroot00000000000000""" ========================================= Add items to the private DICOM dictionary ========================================= This examples illustrates how to add private dictionary items to the DICOM dictionary dynamically. This allows you to read private tags not present in pydicom's private dictionary when loading an existing dataset. """ # authors : Darcy Mason and pydicom contributors # license : MIT import io from pydicom import dcmread from pydicom.datadict import add_private_dict_entries from pydicom.dataset import Dataset from pydicom.valuerep import VR print(__doc__) # create a dataset with some private tags for demonstration # we create the dataset with Implicit VR Little Endian transfer syntax, # so that the VR of the private tags will not be saved ds = Dataset() ds.is_implicit_VR = True ds.is_little_endian = True # add private tags by creating a new private block and add elements to it block = ds.private_block(0x1001, "ACME 3.1", create=True) block.add_new(0x01, VR.UL, 42) block.add_new(0x02, VR.SH, "Hello World") block.add_new(0x03, VR.UI, "1.2.3.4.5") # write the dataset into a memory file and read it back # this simulates reading from a normal DICOM file fp = io.BytesIO() ds.save_as(fp) ds = dcmread(fp, force=True) print("Output for unknown private tags:") print(ds) # Creates output: # (1001,0010) Private Creator LO: 'ACME 3.1' # (1001,1001) Private tag data UN: b'*\x00\x00\x00' # (1001,1002) Private tag data UN: b'Hello World ' # (1001,1003) Private tag data UN: b'1.2.3.4.5\x00' # Add the private tags to the private tag dictionary # Define items as (VR, VM, description, is_retired flag) # Leave is_retired flag blank. new_dict_items = { 0x10011001: ("UL", "1", "Test One", ""), 0x10011002: ("SH", "1", "Test Two", ""), 0x10011003: ("UI", "1", "Test Three", ""), } # add the entries to the private dictionary, using the correct private creator string add_private_dict_entries(private_creator="ACME 3.1", new_entries_dict=new_dict_items) # re-read the dataset for the new dictionary entries to be applied ds = dcmread(fp, force=True) print("\nOutput with registered private tags:") print(ds) # Creates output: # (1001,0010) Private Creator LO: 'ACME 3.1' # (1001,1001) [Test One] UL: 42 # (1001,1002) [Test Two] SH: 'Hello World' # (1001,1003) [Test Three] UI: 1.2.3.4.5 pydicom-pydicom-20aa4b7/examples/metadata_processing/plot_anonymize.py000066400000000000000000000046551515706620200265130ustar00rootroot00000000000000""" ==================== Anonymize DICOM data ==================== This example is a starting point to anonymize DICOM data. It shows how to read data and replace tags: person names, patient ID, optionally remove curves and private tags, and write the results in a new file. """ ############################################################################### # Anonymize a single file ############################################################################### # authors : Darcy Mason # Guillaume Lemaitre # license : MIT import tempfile from pydicom import examples ds = examples.mr for keyword in ["PatientID", "PatientBirthDate"]: print(ds.data_element(keyword)) ############################################################################### # We can define a callback function to find all tags corresponding to a person # names inside the dataset. We can also define a callback function to remove # curves tags. def person_names_callback(ds, elem): if elem.VR == "PN": elem.value = "anonymous" def curves_callback(ds, elem): if elem.tag.group & 0xFF00 == 0x5000: del ds[elem.tag] ############################################################################### # We can use the different callback function to iterate through the dataset but # also some other tags such that patient ID, etc. ds.PatientID = "id" ds.walk(person_names_callback) ds.walk(curves_callback) ############################################################################### # pydicom allows to remove private tags using ``remove_private_tags`` method ds.remove_private_tags() ############################################################################### # Data elements of type 3 (optional) can be easily deleted using ``del`` or # ``delattr``. if "OtherPatientIDs" in ds: delattr(ds, "OtherPatientIDs") if "OtherPatientIDsSequence" in ds: del ds.OtherPatientIDsSequence ############################################################################### # For data elements of type 2, this is possible to blank it by assigning a # blank string. tag = "PatientBirthDate" if tag in ds: ds.data_element(tag).value = "19000101" ############################################################################## # Finally, this is possible to store the image for keyword in ["PatientID", "PatientBirthDate"]: print(ds.data_element(keyword)) path = tempfile.NamedTemporaryFile().name ds.save_as(path) pydicom-pydicom-20aa4b7/examples/metadata_processing/plot_sequences.py000066400000000000000000000020471515706620200264660ustar00rootroot00000000000000""" ====================== Working with sequences ====================== This examples illustrates how to work with sequences. """ from pydicom.sequence import Sequence from pydicom.dataset import Dataset # create to toy datasets block_ds1 = Dataset() block_ds1.BlockType = "APERTURE" block_ds1.BlockName = "Block1" block_ds2 = Dataset() block_ds2.BlockType = "APERTURE" block_ds2.BlockName = "Block2" beam = Dataset() # note that you should add beam data elements like BeamName, etc; these are # skipped in this example plan_ds = Dataset() # starting from scratch since we did not read a file plan_ds.BeamSequence = Sequence([beam]) plan_ds.BeamSequence[0].BlockSequence = Sequence([block_ds1, block_ds2]) plan_ds.BeamSequence[0].NumberOfBlocks = 2 beam0 = plan_ds.BeamSequence[0] print(f"Number of blocks: {beam0.BlockSequence}") # create a new data set block_ds3 = Dataset() # add data elements to it as above and don't forget to update Number of Blocks # data element beam0.BlockSequence.append(block_ds3) del plan_ds.BeamSequence[0].BlockSequence[1] pydicom-pydicom-20aa4b7/examples/plot_dicom_difference.py000066400000000000000000000014331515706620200237220ustar00rootroot00000000000000""" ======================================= Analyse differences between DICOM files ======================================= This examples illustrates how to find the differences between two DICOM files. """ # authors : Guillaume Lemaitre # license : MIT import difflib from pydicom import examples print(__doc__) # difflib compare functions require a list of lines, each terminated with # newline character massage the string representation of each dicom dataset # into this form: rep = [] for ds in [examples.mr, examples.ct]: lines = str(ds).split("\n") lines = [line + "\n" for line in lines] # add the newline to end rep.append(lines) diff = difflib.Differ() for line in diff.compare(rep[0], rep[1]): if line[0] != "?": print(line) pydicom-pydicom-20aa4b7/examples/show_charset_name.py000066400000000000000000000023211515706620200231050ustar00rootroot00000000000000""" ============================ Display unicode person names ============================ Very simple app to display unicode person names. """ # authors : Guillaume Lemaitre # license : MIT from pydicom.valuerep import PersonName import tkinter print(__doc__) default_encoding = "iso8859" root = tkinter.Tk() person_names = [ PersonName( # DICOM standard 2008-PS3.5 H.3 p98 b"Yamada^Tarou=\033$B;3ED\033(B^\033$BB@O:" b"\033(B=\033$B$d$^$@\033(B^\033$B$?$m$&\033(B", [default_encoding, "iso2022_jp"], ), # DICOM standard 2008-PS3.5 J.3 p 105 PersonName( b"Wang^XiaoDong=\xcd\xf5\x5e\xd0\xa1\xb6\xab=", [default_encoding, "GB18030"] ), # DICOM standard 2008-PS3.5 J.1 p 104 PersonName( b"Wang^XiaoDong=\xe7\x8e\x8b\x5e\xe5\xb0\x8f\xe6\x9d\xb1=", [default_encoding, "UTF-8"], ), # DICOM standard 2008-PS3.5 I.2 p 101 PersonName( b"Hong^Gildong=\033$)C\373\363^\033$)C\321\316\324\327=" b"\033$)C\310\253^\033$)C\261\346\265\277", [default_encoding, "euc_kr"], ), ] for person_name in person_names: label = tkinter.Label(text=person_name) label.pack() root.mainloop() pydicom-pydicom-20aa4b7/pyproject.toml000066400000000000000000000100331515706620200201370ustar00rootroot00000000000000[build-system] requires = ["flit_core >=3.2,<4"] build-backend = "flit_core.buildapi" [project] authors = [ {name = "Darcy Mason and contributors", email = "darcymason@gmail.com"} ] classifiers=[ "License :: OSI Approved :: MIT License", "Intended Audience :: Developers", "Intended Audience :: Healthcare Industry", "Intended Audience :: Science/Research", "Development Status :: 5 - Production/Stable", "Programming Language :: Python", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Operating System :: OS Independent", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Topic :: Scientific/Engineering :: Physics", "Topic :: Software Development :: Libraries" ] dependencies = [] description = "A pure Python package for reading and writing DICOM data" # dynamic = ["version"] keywords = ["dicom, python, medical, imaging"] license = {text = "MIT"} name = "pydicom" readme = "README.md" requires-python = ">=3.10" version = "3.0.2" [project.optional-dependencies] docs = [ "numpy", "numpydoc", "matplotlib", "pillow", "sphinx", "sphinx_rtd_theme", "sphinx-gallery", "sphinxcontrib-napoleon", "sphinxcontrib-jquery", "sphinx-copybutton" ] dev = [ "black==24.8.0", "mypy==1.11.2", "pydicom-data", "pytest", "pytest-cov", "ruff==0.6.3", "types-requests", "pre-commit", "pyfakefs>=6.1.6", ] basic = ["numpy", "types-pydicom"] pixeldata = [ "numpy", "pillow", # leave out? Better alternatives below "pyjpegls", "pylibjpeg[openjpeg]", "pylibjpeg[rle]", "python-gdcm" ] # Consider libjpeg-turbo (BSD-like license) when 12-bit available # https://github.com/libjpeg-turbo/libjpeg-turbo/issues/199 gpl-license = ["pylibjpeg[libjpeg]"] [project.urls] documentation = "https://pydicom.github.io/pydicom" download = "https://github.com/pydicom/pydicom/archive/main.zip" homepage = "https://github.com/pydicom/pydicom" repository = "https://github.com/pydicom/pydicom" [project.scripts] pydicom = "pydicom.cli.main:main" [project.entry-points.pydicom_subcommands] codify = "pydicom.cli.codify:add_subparser" show = "pydicom.cli.show:add_subparser" [dependency-groups] docs = [ "numpy", "numpydoc", "matplotlib", "pillow", "pydata-sphinx-theme", "sphinx", "sphinx-gallery", "sphinxcontrib-napoleon", "sphinx-copybutton", "sphinx_design", ] dev = [ "pydicom-data", "pyfakefs", "pytest", "pytest-cov", "types-requests", "pre-commit", ] [tool.black] exclude = ".venv|build|/_.*_dict.py$" force-exclude = ".venv|/_.*_dict.py$" # to not do files pre-commit asks for [tool.ruff] src = ["src"] line-length = 214 include = ["src/*.py", "tests/*.py", "doc/*.py"] [tool.ruff.lint] select = [ "UP", "C9", "E", "F", "PERF", "PL", "W", ] ignore = [ "PERF203", "PLC1901", "PLR2004", "PLR5501", "PLW0603", "PLW2901", ] [tool.ruff.lint.mccabe] max-complexity = 36 [tool.ruff.lint.pylint] max-args = 17 max-branches = 43 max-returns = 9 max-statements = 108 [tool.ruff.lint.per-file-ignores] "*/__init__.py" = ["F401"] "src/pydicom/_*_dict.py" = ["E501"] "src/pydicom/config.py" = ["PLW0602"] "src/pydicom/uid.py" = ["E501"] "src/pydicom/sr/_concepts_dict.py" = ["F601"] "tests/*.py" = ["F401"] [tool.mypy] python_version = "3.10" files = "src/" exclude = ["src/pydicom/benchmarks/", "src/pydicom/pixel_data_handlers/pillow_handler.py"] warn_redundant_casts = false warn_unused_ignores = false warn_return_any = true warn_unreachable = false ignore_missing_imports = true disallow_untyped_calls = true disallow_untyped_defs = true disallow_incomplete_defs = true disable_error_code = ["method-assign", "ignore-without-code", "redundant-expr", "truthy-bool"] [[tool.mypy.overrides]] # 2023-06: mypy complains for a line in this file if ignore used or not. # Override unused ignores for that one file module = "pydicom.encoders.base" warn_unused_ignores = false pydicom-pydicom-20aa4b7/src/000077500000000000000000000000001515706620200160155ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/000077500000000000000000000000001515706620200174615ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/__init__.py000066400000000000000000000030331515706620200215710ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """pydicom package -- easily handle DICOM files. See Quick Start below. ----------- Quick Start ----------- 1. A simple program to read a dicom file, modify a value, and write to a new file:: from pydicom.filereader import dcmread dataset = dcmread("file1.dcm") dataset.PatientName = 'anonymous' dataset.save_as("file2.dcm") 2. See the files in the examples directory that came with this package for more examples, including some interactive sessions. 3. Learn the methods of the Dataset class; that is the one you will work with most directly. 4. Questions and comments can be directed to the pydicom google group: https://groups.google.com/g/pydicom 5. Bugs and other issues can be reported in the issue tracker: https://www.github.com/pydicom/pydicom """ from pydicom.dataelem import DataElement from pydicom.dataset import Dataset, FileDataset, FileMetaDataset import pydicom.examples from pydicom.filereader import dcmread from pydicom.filewriter import dcmwrite from pydicom.pixels.utils import pixel_array, iter_pixels from pydicom.sequence import Sequence from ._version import ( __version__, __version_info__, __dicom_version__, __concepts_version__, ) __all__ = [ "DataElement", "Dataset", "FileDataset", "FileMetaDataset", "Sequence", "dcmread", "dcmwrite", "pixel_array", "iter_pixels", "__version__", "__version_info__", "__dicom_version__", "__concepts_version__", ] pydicom-pydicom-20aa4b7/src/pydicom/_dicom_dict.py000066400000000000000000016345511515706620200223070ustar00rootroot00000000000000"""DICOM data dictionary auto-generated by generate_dicom_dict.py""" # Each dict entry is Tag: (VR, VM, Name, Retired, Keyword) DicomDictionary: dict[int, tuple[str, str, str, str, str]] = { 0x00000000: ('UL', '1', "Command Group Length", '', 'CommandGroupLength'), 0x00000001: ('UL', '1', "Command Length to End", 'Retired', 'CommandLengthToEnd'), 0x00000002: ('UI', '1', "Affected SOP Class UID", '', 'AffectedSOPClassUID'), 0x00000003: ('UI', '1', "Requested SOP Class UID", '', 'RequestedSOPClassUID'), 0x00000010: ('SH', '1', "Command Recognition Code", 'Retired', 'CommandRecognitionCode'), 0x00000100: ('US', '1', "Command Field", '', 'CommandField'), 0x00000110: ('US', '1', "Message ID", '', 'MessageID'), 0x00000120: ('US', '1', "Message ID Being Responded To", '', 'MessageIDBeingRespondedTo'), 0x00000200: ('AE', '1', "Initiator", 'Retired', 'Initiator'), 0x00000300: ('AE', '1', "Receiver", 'Retired', 'Receiver'), 0x00000400: ('AE', '1', "Find Location", 'Retired', 'FindLocation'), 0x00000600: ('AE', '1', "Move Destination", '', 'MoveDestination'), 0x00000700: ('US', '1', "Priority", '', 'Priority'), 0x00000800: ('US', '1', "Command Data Set Type", '', 'CommandDataSetType'), 0x00000850: ('US', '1', "Number of Matches", 'Retired', 'NumberOfMatches'), 0x00000860: ('US', '1', "Response Sequence Number", 'Retired', 'ResponseSequenceNumber'), 0x00000900: ('US', '1', "Status", '', 'Status'), 0x00000901: ('AT', '1-n', "Offending Element", '', 'OffendingElement'), 0x00000902: ('LO', '1', "Error Comment", '', 'ErrorComment'), 0x00000903: ('US', '1', "Error ID", '', 'ErrorID'), 0x00001000: ('UI', '1', "Affected SOP Instance UID", '', 'AffectedSOPInstanceUID'), 0x00001001: ('UI', '1', "Requested SOP Instance UID", '', 'RequestedSOPInstanceUID'), 0x00001002: ('US', '1', "Event Type ID", '', 'EventTypeID'), 0x00001005: ('AT', '1-n', "Attribute Identifier List", '', 'AttributeIdentifierList'), 0x00001008: ('US', '1', "Action Type ID", '', 'ActionTypeID'), 0x00001020: ('US', '1', "Number of Remaining Sub-operations", '', 'NumberOfRemainingSuboperations'), 0x00001021: ('US', '1', "Number of Completed Sub-operations", '', 'NumberOfCompletedSuboperations'), 0x00001022: ('US', '1', "Number of Failed Sub-operations", '', 'NumberOfFailedSuboperations'), 0x00001023: ('US', '1', "Number of Warning Sub-operations", '', 'NumberOfWarningSuboperations'), 0x00001030: ('AE', '1', "Move Originator Application Entity Title", '', 'MoveOriginatorApplicationEntityTitle'), 0x00001031: ('US', '1', "Move Originator Message ID", '', 'MoveOriginatorMessageID'), 0x00004000: ('LT', '1', "Dialog Receiver", 'Retired', 'DialogReceiver'), 0x00004010: ('LT', '1', "Terminal Type", 'Retired', 'TerminalType'), 0x00005010: ('SH', '1', "Message Set ID", 'Retired', 'MessageSetID'), 0x00005020: ('SH', '1', "End Message ID", 'Retired', 'EndMessageID'), 0x00005110: ('LT', '1', "Display Format", 'Retired', 'DisplayFormat'), 0x00005120: ('LT', '1', "Page Position ID", 'Retired', 'PagePositionID'), 0x00005130: ('CS', '1', "Text Format ID", 'Retired', 'TextFormatID'), 0x00005140: ('CS', '1', "Normal/Reverse", 'Retired', 'NormalReverse'), 0x00005150: ('CS', '1', "Add Gray Scale", 'Retired', 'AddGrayScale'), 0x00005160: ('CS', '1', "Borders", 'Retired', 'Borders'), 0x00005170: ('IS', '1', "Copies", 'Retired', 'Copies'), 0x00005180: ('CS', '1', "Command Magnification Type", 'Retired', 'CommandMagnificationType'), 0x00005190: ('CS', '1', "Erase", 'Retired', 'Erase'), 0x000051A0: ('CS', '1', "Print", 'Retired', 'Print'), 0x000051B0: ('US', '1-n', "Overlays", 'Retired', 'Overlays'), 0x00020000: ('UL', '1', "File Meta Information Group Length", '', 'FileMetaInformationGroupLength'), 0x00020001: ('OB', '1', "File Meta Information Version", '', 'FileMetaInformationVersion'), 0x00020002: ('UI', '1', "Media Storage SOP Class UID", '', 'MediaStorageSOPClassUID'), 0x00020003: ('UI', '1', "Media Storage SOP Instance UID", '', 'MediaStorageSOPInstanceUID'), 0x00020010: ('UI', '1', "Transfer Syntax UID", '', 'TransferSyntaxUID'), 0x00020012: ('UI', '1', "Implementation Class UID", '', 'ImplementationClassUID'), 0x00020013: ('SH', '1', "Implementation Version Name", '', 'ImplementationVersionName'), 0x00020016: ('AE', '1', "Source Application Entity Title", '', 'SourceApplicationEntityTitle'), 0x00020017: ('AE', '1', "Sending Application Entity Title", '', 'SendingApplicationEntityTitle'), 0x00020018: ('AE', '1', "Receiving Application Entity Title", '', 'ReceivingApplicationEntityTitle'), 0x00020026: ('UR', '1', "Source Presentation Address", '', 'SourcePresentationAddress'), 0x00020027: ('UR', '1', "Sending Presentation Address", '', 'SendingPresentationAddress'), 0x00020028: ('UR', '1', "Receiving Presentation Address", '', 'ReceivingPresentationAddress'), 0x00020031: ('OB', '1', "RTV Meta Information Version", '', 'RTVMetaInformationVersion'), 0x00020032: ('UI', '1', "RTV Communication SOP Class UID", '', 'RTVCommunicationSOPClassUID'), 0x00020033: ('UI', '1', "RTV Communication SOP Instance UID", '', 'RTVCommunicationSOPInstanceUID'), 0x00020035: ('OB', '1', "RTV Source Identifier", '', 'RTVSourceIdentifier'), 0x00020036: ('OB', '1', "RTV Flow Identifier", '', 'RTVFlowIdentifier'), 0x00020037: ('UL', '1', "RTV Flow RTP Sampling Rate", '', 'RTVFlowRTPSamplingRate'), 0x00020038: ('FD', '1', "RTV Flow Actual Frame Duration", '', 'RTVFlowActualFrameDuration'), 0x00020100: ('UI', '1', "Private Information Creator UID", '', 'PrivateInformationCreatorUID'), 0x00020102: ('OB', '1', "Private Information", '', 'PrivateInformation'), 0x00041130: ('CS', '1', "File-set ID", '', 'FileSetID'), 0x00041141: ('CS', '1-8', "File-set Descriptor File ID", '', 'FileSetDescriptorFileID'), 0x00041142: ('CS', '1', "Specific Character Set of File-set Descriptor File", '', 'SpecificCharacterSetOfFileSetDescriptorFile'), 0x00041200: ('UL', '1', "Offset of the First Directory Record of the Root Directory Entity", '', 'OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity'), 0x00041202: ('UL', '1', "Offset of the Last Directory Record of the Root Directory Entity", '', 'OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity'), 0x00041212: ('US', '1', "File-set Consistency Flag", '', 'FileSetConsistencyFlag'), 0x00041220: ('SQ', '1', "Directory Record Sequence", '', 'DirectoryRecordSequence'), 0x00041400: ('UL', '1', "Offset of the Next Directory Record", '', 'OffsetOfTheNextDirectoryRecord'), 0x00041410: ('US', '1', "Record In-use Flag", '', 'RecordInUseFlag'), 0x00041420: ('UL', '1', "Offset of Referenced Lower-Level Directory Entity", '', 'OffsetOfReferencedLowerLevelDirectoryEntity'), 0x00041430: ('CS', '1', "Directory Record Type", '', 'DirectoryRecordType'), 0x00041432: ('UI', '1', "Private Record UID", '', 'PrivateRecordUID'), 0x00041500: ('CS', '1-8', "Referenced File ID", '', 'ReferencedFileID'), 0x00041504: ('UL', '1', "MRDR Directory Record Offset", 'Retired', 'MRDRDirectoryRecordOffset'), 0x00041510: ('UI', '1', "Referenced SOP Class UID in File", '', 'ReferencedSOPClassUIDInFile'), 0x00041511: ('UI', '1', "Referenced SOP Instance UID in File", '', 'ReferencedSOPInstanceUIDInFile'), 0x00041512: ('UI', '1', "Referenced Transfer Syntax UID in File", '', 'ReferencedTransferSyntaxUIDInFile'), 0x0004151A: ('UI', '1-n', "Referenced Related General SOP Class UID in File", '', 'ReferencedRelatedGeneralSOPClassUIDInFile'), 0x00041600: ('UL', '1', "Number of References", 'Retired', 'NumberOfReferences'), 0x00080001: ('UL', '1', "Length to End", 'Retired', 'LengthToEnd'), 0x00080005: ('CS', '1-n', "Specific Character Set", '', 'SpecificCharacterSet'), 0x00080006: ('SQ', '1', "Language Code Sequence", '', 'LanguageCodeSequence'), 0x00080008: ('CS', '2-n', "Image Type", '', 'ImageType'), 0x00080010: ('SH', '1', "Recognition Code", 'Retired', 'RecognitionCode'), 0x00080012: ('DA', '1', "Instance Creation Date", '', 'InstanceCreationDate'), 0x00080013: ('TM', '1', "Instance Creation Time", '', 'InstanceCreationTime'), 0x00080014: ('UI', '1', "Instance Creator UID", '', 'InstanceCreatorUID'), 0x00080015: ('DT', '1', "Instance Coercion DateTime", '', 'InstanceCoercionDateTime'), 0x00080016: ('UI', '1', "SOP Class UID", '', 'SOPClassUID'), 0x00080017: ('UI', '1', "Acquisition UID", '', 'AcquisitionUID'), 0x00080018: ('UI', '1', "SOP Instance UID", '', 'SOPInstanceUID'), 0x00080019: ('UI', '1', "Pyramid UID", '', 'PyramidUID'), 0x0008001A: ('UI', '1-n', "Related General SOP Class UID", '', 'RelatedGeneralSOPClassUID'), 0x0008001B: ('UI', '1', "Original Specialized SOP Class UID", '', 'OriginalSpecializedSOPClassUID'), 0x0008001C: ('CS', '1', "Synthetic Data", '', 'SyntheticData'), 0x00080020: ('DA', '1', "Study Date", '', 'StudyDate'), 0x00080021: ('DA', '1', "Series Date", '', 'SeriesDate'), 0x00080022: ('DA', '1', "Acquisition Date", '', 'AcquisitionDate'), 0x00080023: ('DA', '1', "Content Date", '', 'ContentDate'), 0x00080024: ('DA', '1', "Overlay Date", 'Retired', 'OverlayDate'), 0x00080025: ('DA', '1', "Curve Date", 'Retired', 'CurveDate'), 0x0008002A: ('DT', '1', "Acquisition DateTime", '', 'AcquisitionDateTime'), 0x00080030: ('TM', '1', "Study Time", '', 'StudyTime'), 0x00080031: ('TM', '1', "Series Time", '', 'SeriesTime'), 0x00080032: ('TM', '1', "Acquisition Time", '', 'AcquisitionTime'), 0x00080033: ('TM', '1', "Content Time", '', 'ContentTime'), 0x00080034: ('TM', '1', "Overlay Time", 'Retired', 'OverlayTime'), 0x00080035: ('TM', '1', "Curve Time", 'Retired', 'CurveTime'), 0x00080040: ('US', '1', "Data Set Type", 'Retired', 'DataSetType'), 0x00080041: ('LO', '1', "Data Set Subtype", 'Retired', 'DataSetSubtype'), 0x00080042: ('CS', '1', "Nuclear Medicine Series Type", 'Retired', 'NuclearMedicineSeriesType'), 0x00080050: ('SH', '1', "Accession Number", '', 'AccessionNumber'), 0x00080051: ('SQ', '1', "Issuer of Accession Number Sequence", '', 'IssuerOfAccessionNumberSequence'), 0x00080052: ('CS', '1', "Query/Retrieve Level", '', 'QueryRetrieveLevel'), 0x00080053: ('CS', '1', "Query/Retrieve View", '', 'QueryRetrieveView'), 0x00080054: ('AE', '1-n', "Retrieve AE Title", '', 'RetrieveAETitle'), 0x00080055: ('AE', '1', "Station AE Title", '', 'StationAETitle'), 0x00080056: ('CS', '1', "Instance Availability", '', 'InstanceAvailability'), 0x00080058: ('UI', '1-n', "Failed SOP Instance UID List", '', 'FailedSOPInstanceUIDList'), 0x00080060: ('CS', '1', "Modality", '', 'Modality'), 0x00080061: ('CS', '1-n', "Modalities in Study", '', 'ModalitiesInStudy'), 0x00080062: ('UI', '1-n', "SOP Classes in Study", '', 'SOPClassesInStudy'), 0x00080063: ('SQ', '1', "Anatomic Regions in Study Code Sequence", '', 'AnatomicRegionsInStudyCodeSequence'), 0x00080064: ('CS', '1', "Conversion Type", '', 'ConversionType'), 0x00080068: ('CS', '1', "Presentation Intent Type", '', 'PresentationIntentType'), 0x00080070: ('LO', '1', "Manufacturer", '', 'Manufacturer'), 0x00080080: ('LO', '1', "Institution Name", '', 'InstitutionName'), 0x00080081: ('ST', '1', "Institution Address", '', 'InstitutionAddress'), 0x00080082: ('SQ', '1', "Institution Code Sequence", '', 'InstitutionCodeSequence'), 0x00080090: ('PN', '1', "Referring Physician's Name", '', 'ReferringPhysicianName'), 0x00080092: ('ST', '1', "Referring Physician's Address", '', 'ReferringPhysicianAddress'), 0x00080094: ('SH', '1-n', "Referring Physician's Telephone Numbers", '', 'ReferringPhysicianTelephoneNumbers'), 0x00080096: ('SQ', '1', "Referring Physician Identification Sequence", '', 'ReferringPhysicianIdentificationSequence'), 0x0008009C: ('PN', '1-n', "Consulting Physician's Name", '', 'ConsultingPhysicianName'), 0x0008009D: ('SQ', '1', "Consulting Physician Identification Sequence", '', 'ConsultingPhysicianIdentificationSequence'), 0x00080100: ('SH', '1', "Code Value", '', 'CodeValue'), 0x00080101: ('LO', '1', "Extended Code Value", '', 'ExtendedCodeValue'), 0x00080102: ('SH', '1', "Coding Scheme Designator", '', 'CodingSchemeDesignator'), 0x00080103: ('SH', '1', "Coding Scheme Version", '', 'CodingSchemeVersion'), 0x00080104: ('LO', '1', "Code Meaning", '', 'CodeMeaning'), 0x00080105: ('CS', '1', "Mapping Resource", '', 'MappingResource'), 0x00080106: ('DT', '1', "Context Group Version", '', 'ContextGroupVersion'), 0x00080107: ('DT', '1', "Context Group Local Version", '', 'ContextGroupLocalVersion'), 0x00080108: ('LT', '1', "Extended Code Meaning", '', 'ExtendedCodeMeaning'), 0x00080109: ('SQ', '1', "Coding Scheme Resources Sequence", '', 'CodingSchemeResourcesSequence'), 0x0008010A: ('CS', '1', "Coding Scheme URL Type", '', 'CodingSchemeURLType'), 0x0008010B: ('CS', '1', "Context Group Extension Flag", '', 'ContextGroupExtensionFlag'), 0x0008010C: ('UI', '1', "Coding Scheme UID", '', 'CodingSchemeUID'), 0x0008010D: ('UI', '1', "Context Group Extension Creator UID", '', 'ContextGroupExtensionCreatorUID'), 0x0008010E: ('UR', '1', "Coding Scheme URL", '', 'CodingSchemeURL'), 0x0008010F: ('CS', '1', "Context Identifier", '', 'ContextIdentifier'), 0x00080110: ('SQ', '1', "Coding Scheme Identification Sequence", '', 'CodingSchemeIdentificationSequence'), 0x00080112: ('LO', '1', "Coding Scheme Registry", '', 'CodingSchemeRegistry'), 0x00080114: ('ST', '1', "Coding Scheme External ID", '', 'CodingSchemeExternalID'), 0x00080115: ('ST', '1', "Coding Scheme Name", '', 'CodingSchemeName'), 0x00080116: ('ST', '1', "Coding Scheme Responsible Organization", '', 'CodingSchemeResponsibleOrganization'), 0x00080117: ('UI', '1', "Context UID", '', 'ContextUID'), 0x00080118: ('UI', '1', "Mapping Resource UID", '', 'MappingResourceUID'), 0x00080119: ('UC', '1', "Long Code Value", '', 'LongCodeValue'), 0x00080120: ('UR', '1', "URN Code Value", '', 'URNCodeValue'), 0x00080121: ('SQ', '1', "Equivalent Code Sequence", '', 'EquivalentCodeSequence'), 0x00080122: ('LO', '1', "Mapping Resource Name", '', 'MappingResourceName'), 0x00080123: ('SQ', '1', "Context Group Identification Sequence", '', 'ContextGroupIdentificationSequence'), 0x00080124: ('SQ', '1', "Mapping Resource Identification Sequence", '', 'MappingResourceIdentificationSequence'), 0x00080201: ('SH', '1', "Timezone Offset From UTC", '', 'TimezoneOffsetFromUTC'), 0x00080202: ('OB', '1', "Retired-blank", 'Retired', ''), 0x00080220: ('SQ', '1', "Responsible Group Code Sequence", '', 'ResponsibleGroupCodeSequence'), 0x00080221: ('CS', '1', "Equipment Modality", '', 'EquipmentModality'), 0x00080222: ('LO', '1', "Manufacturer's Related Model Group", '', 'ManufacturerRelatedModelGroup'), 0x00080300: ('SQ', '1', "Private Data Element Characteristics Sequence", '', 'PrivateDataElementCharacteristicsSequence'), 0x00080301: ('US', '1', "Private Group Reference", '', 'PrivateGroupReference'), 0x00080302: ('LO', '1', "Private Creator Reference", '', 'PrivateCreatorReference'), 0x00080303: ('CS', '1', "Block Identifying Information Status", '', 'BlockIdentifyingInformationStatus'), 0x00080304: ('US', '1-n', "Nonidentifying Private Elements", '', 'NonidentifyingPrivateElements'), 0x00080305: ('SQ', '1', "Deidentification Action Sequence", '', 'DeidentificationActionSequence'), 0x00080306: ('US', '1-n', "Identifying Private Elements", '', 'IdentifyingPrivateElements'), 0x00080307: ('CS', '1', "Deidentification Action", '', 'DeidentificationAction'), 0x00080308: ('US', '1', "Private Data Element", '', 'PrivateDataElement'), 0x00080309: ('UL', '1-3', "Private Data Element Value Multiplicity", '', 'PrivateDataElementValueMultiplicity'), 0x0008030A: ('CS', '1', "Private Data Element Value Representation", '', 'PrivateDataElementValueRepresentation'), 0x0008030B: ('UL', '1-2', "Private Data Element Number of Items", '', 'PrivateDataElementNumberOfItems'), 0x0008030C: ('UC', '1', "Private Data Element Name", '', 'PrivateDataElementName'), 0x0008030D: ('UC', '1', "Private Data Element Keyword", '', 'PrivateDataElementKeyword'), 0x0008030E: ('UT', '1', "Private Data Element Description", '', 'PrivateDataElementDescription'), 0x0008030F: ('UT', '1', "Private Data Element Encoding", '', 'PrivateDataElementEncoding'), 0x00080310: ('SQ', '1', "Private Data Element Definition Sequence", '', 'PrivateDataElementDefinitionSequence'), 0x00080400: ('SQ', '1', "Scope of Inventory Sequence", '', 'ScopeOfInventorySequence'), 0x00080401: ('LT', '1', "Inventory Purpose", '', 'InventoryPurpose'), 0x00080402: ('LT', '1', "Inventory Instance Description", '', 'InventoryInstanceDescription'), 0x00080403: ('CS', '1', "Inventory Level", '', 'InventoryLevel'), 0x00080404: ('DT', '1', "Item Inventory DateTime", '', 'ItemInventoryDateTime'), 0x00080405: ('CS', '1', "Removed from Operational Use", '', 'RemovedFromOperationalUse'), 0x00080406: ('SQ', '1', "Reason for Removal Code Sequence", '', 'ReasonForRemovalCodeSequence'), 0x00080407: ('UR', '1', "Stored Instance Base URI", '', 'StoredInstanceBaseURI'), 0x00080408: ('UR', '1', "Folder Access URI", '', 'FolderAccessURI'), 0x00080409: ('UR', '1', "File Access URI", '', 'FileAccessURI'), 0x0008040A: ('CS', '1', "Container File Type", '', 'ContainerFileType'), 0x0008040B: ('UR', '1', "Filename in Container", '', 'FilenameInContainer'), 0x0008040C: ('UV', '1', "File Offset in Container", '', 'FileOffsetInContainer'), 0x0008040D: ('UV', '1', "File Length in Container", '', 'FileLengthInContainer'), 0x0008040E: ('UI', '1', "Stored Instance Transfer Syntax UID", '', 'StoredInstanceTransferSyntaxUID'), 0x0008040F: ('CS', '1-n', "Extended Matching Mechanisms", '', 'ExtendedMatchingMechanisms'), 0x00080410: ('SQ', '1', "Range Matching Sequence", '', 'RangeMatchingSequence'), 0x00080411: ('SQ', '1', "List of UID Matching Sequence", '', 'ListOfUIDMatchingSequence'), 0x00080412: ('SQ', '1', "Empty Value Matching Sequence", '', 'EmptyValueMatchingSequence'), 0x00080413: ('SQ', '1', "General Matching Sequence", '', 'GeneralMatchingSequence'), 0x00080414: ('US', '1', "Requested Status Interval", '', 'RequestedStatusInterval'), 0x00080415: ('CS', '1', "Retain Instances", '', 'RetainInstances'), 0x00080416: ('DT', '1', "Expiration DateTime", '', 'ExpirationDateTime'), 0x00080417: ('CS', '1', "Transaction Status", '', 'TransactionStatus'), 0x00080418: ('LT', '1', "Transaction Status Comment", '', 'TransactionStatusComment'), 0x00080419: ('SQ', '1', "File Set Access Sequence", '', 'FileSetAccessSequence'), 0x0008041A: ('SQ', '1', "File Access Sequence", '', 'FileAccessSequence'), 0x0008041B: ('OB', '1', "Record Key", '', 'RecordKey'), 0x0008041C: ('OB', '1', "Prior Record Key", '', 'PriorRecordKey'), 0x0008041D: ('SQ', '1', "Metadata Sequence", '', 'MetadataSequence'), 0x0008041E: ('SQ', '1', "Updated Metadata Sequence", '', 'UpdatedMetadataSequence'), 0x0008041F: ('DT', '1', "Study Update DateTime", '', 'StudyUpdateDateTime'), 0x00080420: ('SQ', '1', "Inventory Access End Points Sequence", '', 'InventoryAccessEndPointsSequence'), 0x00080421: ('SQ', '1', "Study Access End Points Sequence", '', 'StudyAccessEndPointsSequence'), 0x00080422: ('SQ', '1', "Incorporated Inventory Instance Sequence", '', 'IncorporatedInventoryInstanceSequence'), 0x00080423: ('SQ', '1', "Inventoried Studies Sequence", '', 'InventoriedStudiesSequence'), 0x00080424: ('SQ', '1', "Inventoried Series Sequence", '', 'InventoriedSeriesSequence'), 0x00080425: ('SQ', '1', "Inventoried Instances Sequence", '', 'InventoriedInstancesSequence'), 0x00080426: ('CS', '1', "Inventory Completion Status", '', 'InventoryCompletionStatus'), 0x00080427: ('UL', '1', "Number of Study Records in Instance", '', 'NumberOfStudyRecordsInInstance'), 0x00080428: ('UV', '1', "Total Number of Study Records", '', 'TotalNumberOfStudyRecords'), 0x00080429: ('UV', '1', "Maximum Number of Records", '', 'MaximumNumberOfRecords'), 0x00081000: ('AE', '1', "Network ID", 'Retired', 'NetworkID'), 0x00081010: ('SH', '1', "Station Name", '', 'StationName'), 0x00081030: ('LO', '1', "Study Description", '', 'StudyDescription'), 0x00081032: ('SQ', '1', "Procedure Code Sequence", '', 'ProcedureCodeSequence'), 0x0008103E: ('LO', '1', "Series Description", '', 'SeriesDescription'), 0x0008103F: ('SQ', '1', "Series Description Code Sequence", '', 'SeriesDescriptionCodeSequence'), 0x00081040: ('LO', '1', "Institutional Department Name", '', 'InstitutionalDepartmentName'), 0x00081041: ('SQ', '1', "Institutional Department Type Code Sequence", '', 'InstitutionalDepartmentTypeCodeSequence'), 0x00081048: ('PN', '1-n', "Physician(s) of Record", '', 'PhysiciansOfRecord'), 0x00081049: ('SQ', '1', "Physician(s) of Record Identification Sequence", '', 'PhysiciansOfRecordIdentificationSequence'), 0x00081050: ('PN', '1-n', "Performing Physician's Name", '', 'PerformingPhysicianName'), 0x00081052: ('SQ', '1', "Performing Physician Identification Sequence", '', 'PerformingPhysicianIdentificationSequence'), 0x00081060: ('PN', '1-n', "Name of Physician(s) Reading Study", '', 'NameOfPhysiciansReadingStudy'), 0x00081062: ('SQ', '1', "Physician(s) Reading Study Identification Sequence", '', 'PhysiciansReadingStudyIdentificationSequence'), 0x00081070: ('PN', '1-n', "Operators' Name", '', 'OperatorsName'), 0x00081072: ('SQ', '1', "Operator Identification Sequence", '', 'OperatorIdentificationSequence'), 0x00081080: ('LO', '1-n', "Admitting Diagnoses Description", '', 'AdmittingDiagnosesDescription'), 0x00081084: ('SQ', '1', "Admitting Diagnoses Code Sequence", '', 'AdmittingDiagnosesCodeSequence'), 0x00081088: ('LO', '1', "Pyramid Description", '', 'PyramidDescription'), 0x00081090: ('LO', '1', "Manufacturer's Model Name", '', 'ManufacturerModelName'), 0x00081100: ('SQ', '1', "Referenced Results Sequence", 'Retired', 'ReferencedResultsSequence'), 0x00081110: ('SQ', '1', "Referenced Study Sequence", '', 'ReferencedStudySequence'), 0x00081111: ('SQ', '1', "Referenced Performed Procedure Step Sequence", '', 'ReferencedPerformedProcedureStepSequence'), 0x00081112: ('SQ', '1', "Referenced Instances by SOP Class Sequence", '', 'ReferencedInstancesBySOPClassSequence'), 0x00081115: ('SQ', '1', "Referenced Series Sequence", '', 'ReferencedSeriesSequence'), 0x00081120: ('SQ', '1', "Referenced Patient Sequence", '', 'ReferencedPatientSequence'), 0x00081125: ('SQ', '1', "Referenced Visit Sequence", '', 'ReferencedVisitSequence'), 0x00081130: ('SQ', '1', "Referenced Overlay Sequence", 'Retired', 'ReferencedOverlaySequence'), 0x00081134: ('SQ', '1', "Referenced Stereometric Instance Sequence", '', 'ReferencedStereometricInstanceSequence'), 0x0008113A: ('SQ', '1', "Referenced Waveform Sequence", '', 'ReferencedWaveformSequence'), 0x00081140: ('SQ', '1', "Referenced Image Sequence", '', 'ReferencedImageSequence'), 0x00081145: ('SQ', '1', "Referenced Curve Sequence", 'Retired', 'ReferencedCurveSequence'), 0x0008114A: ('SQ', '1', "Referenced Instance Sequence", '', 'ReferencedInstanceSequence'), 0x0008114B: ('SQ', '1', "Referenced Real World Value Mapping Instance Sequence", '', 'ReferencedRealWorldValueMappingInstanceSequence'), 0x00081150: ('UI', '1', "Referenced SOP Class UID", '', 'ReferencedSOPClassUID'), 0x00081155: ('UI', '1', "Referenced SOP Instance UID", '', 'ReferencedSOPInstanceUID'), 0x00081156: ('SQ', '1', "Definition Source Sequence", '', 'DefinitionSourceSequence'), 0x0008115A: ('UI', '1-n', "SOP Classes Supported", '', 'SOPClassesSupported'), 0x00081160: ('IS', '1-n', "Referenced Frame Number", '', 'ReferencedFrameNumber'), 0x00081161: ('UL', '1-n', "Simple Frame List", '', 'SimpleFrameList'), 0x00081162: ('UL', '3-3n', "Calculated Frame List", '', 'CalculatedFrameList'), 0x00081163: ('FD', '2', "Time Range", '', 'TimeRange'), 0x00081164: ('SQ', '1', "Frame Extraction Sequence", '', 'FrameExtractionSequence'), 0x00081167: ('UI', '1', "Multi-frame Source SOP Instance UID", '', 'MultiFrameSourceSOPInstanceUID'), 0x00081190: ('UR', '1', "Retrieve URL", '', 'RetrieveURL'), 0x00081195: ('UI', '1', "Transaction UID", '', 'TransactionUID'), 0x00081196: ('US', '1', "Warning Reason", '', 'WarningReason'), 0x00081197: ('US', '1', "Failure Reason", '', 'FailureReason'), 0x00081198: ('SQ', '1', "Failed SOP Sequence", '', 'FailedSOPSequence'), 0x00081199: ('SQ', '1', "Referenced SOP Sequence", '', 'ReferencedSOPSequence'), 0x0008119A: ('SQ', '1', "Other Failures Sequence", '', 'OtherFailuresSequence'), 0x0008119B: ('SQ', '1', "Failed Study Sequence", '', 'FailedStudySequence'), 0x00081200: ('SQ', '1', "Studies Containing Other Referenced Instances Sequence", '', 'StudiesContainingOtherReferencedInstancesSequence'), 0x00081250: ('SQ', '1', "Related Series Sequence", '', 'RelatedSeriesSequence'), 0x00082110: ('CS', '1', "Lossy Image Compression (Retired)", 'Retired', 'LossyImageCompressionRetired'), 0x00082111: ('ST', '1', "Derivation Description", '', 'DerivationDescription'), 0x00082112: ('SQ', '1', "Source Image Sequence", '', 'SourceImageSequence'), 0x00082120: ('SH', '1', "Stage Name", '', 'StageName'), 0x00082122: ('IS', '1', "Stage Number", '', 'StageNumber'), 0x00082124: ('IS', '1', "Number of Stages", '', 'NumberOfStages'), 0x00082127: ('SH', '1', "View Name", '', 'ViewName'), 0x00082128: ('IS', '1', "View Number", '', 'ViewNumber'), 0x00082129: ('IS', '1', "Number of Event Timers", '', 'NumberOfEventTimers'), 0x0008212A: ('IS', '1', "Number of Views in Stage", '', 'NumberOfViewsInStage'), 0x00082130: ('DS', '1-n', "Event Elapsed Time(s)", '', 'EventElapsedTimes'), 0x00082132: ('LO', '1-n', "Event Timer Name(s)", '', 'EventTimerNames'), 0x00082133: ('SQ', '1', "Event Timer Sequence", '', 'EventTimerSequence'), 0x00082134: ('FD', '1', "Event Time Offset", '', 'EventTimeOffset'), 0x00082135: ('SQ', '1', "Event Code Sequence", '', 'EventCodeSequence'), 0x00082142: ('IS', '1', "Start Trim", '', 'StartTrim'), 0x00082143: ('IS', '1', "Stop Trim", '', 'StopTrim'), 0x00082144: ('IS', '1', "Recommended Display Frame Rate", '', 'RecommendedDisplayFrameRate'), 0x00082200: ('CS', '1', "Transducer Position", 'Retired', 'TransducerPosition'), 0x00082204: ('CS', '1', "Transducer Orientation", 'Retired', 'TransducerOrientation'), 0x00082208: ('CS', '1', "Anatomic Structure", 'Retired', 'AnatomicStructure'), 0x00082218: ('SQ', '1', "Anatomic Region Sequence", '', 'AnatomicRegionSequence'), 0x00082220: ('SQ', '1', "Anatomic Region Modifier Sequence", '', 'AnatomicRegionModifierSequence'), 0x00082228: ('SQ', '1', "Primary Anatomic Structure Sequence", '', 'PrimaryAnatomicStructureSequence'), 0x00082229: ('SQ', '1', "Anatomic Structure, Space or Region Sequence", 'Retired', 'AnatomicStructureSpaceOrRegionSequence'), 0x00082230: ('SQ', '1', "Primary Anatomic Structure Modifier Sequence", '', 'PrimaryAnatomicStructureModifierSequence'), 0x00082240: ('SQ', '1', "Transducer Position Sequence", 'Retired', 'TransducerPositionSequence'), 0x00082242: ('SQ', '1', "Transducer Position Modifier Sequence", 'Retired', 'TransducerPositionModifierSequence'), 0x00082244: ('SQ', '1', "Transducer Orientation Sequence", 'Retired', 'TransducerOrientationSequence'), 0x00082246: ('SQ', '1', "Transducer Orientation Modifier Sequence", 'Retired', 'TransducerOrientationModifierSequence'), 0x00082251: ('SQ', '1', "Anatomic Structure Space Or Region Code Sequence (Trial)", 'Retired', 'AnatomicStructureSpaceOrRegionCodeSequenceTrial'), 0x00082253: ('SQ', '1', "Anatomic Portal Of Entrance Code Sequence (Trial)", 'Retired', 'AnatomicPortalOfEntranceCodeSequenceTrial'), 0x00082255: ('SQ', '1', "Anatomic Approach Direction Code Sequence (Trial)", 'Retired', 'AnatomicApproachDirectionCodeSequenceTrial'), 0x00082256: ('ST', '1', "Anatomic Perspective Description (Trial)", 'Retired', 'AnatomicPerspectiveDescriptionTrial'), 0x00082257: ('SQ', '1', "Anatomic Perspective Code Sequence (Trial)", 'Retired', 'AnatomicPerspectiveCodeSequenceTrial'), 0x00082258: ('ST', '1', "Anatomic Location Of Examining Instrument Description (Trial)", 'Retired', 'AnatomicLocationOfExaminingInstrumentDescriptionTrial'), 0x00082259: ('SQ', '1', "Anatomic Location Of Examining Instrument Code Sequence (Trial)", 'Retired', 'AnatomicLocationOfExaminingInstrumentCodeSequenceTrial'), 0x0008225A: ('SQ', '1', "Anatomic Structure Space Or Region Modifier Code Sequence (Trial)", 'Retired', 'AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial'), 0x0008225C: ('SQ', '1', "On Axis Background Anatomic Structure Code Sequence (Trial)", 'Retired', 'OnAxisBackgroundAnatomicStructureCodeSequenceTrial'), 0x00083001: ('SQ', '1', "Alternate Representation Sequence", '', 'AlternateRepresentationSequence'), 0x00083002: ('UI', '1-n', "Available Transfer Syntax UID", '', 'AvailableTransferSyntaxUID'), 0x00083010: ('UI', '1-n', "Irradiation Event UID", '', 'IrradiationEventUID'), 0x00083011: ('SQ', '1', "Source Irradiation Event Sequence", '', 'SourceIrradiationEventSequence'), 0x00083012: ('UI', '1', "Radiopharmaceutical Administration Event UID", '', 'RadiopharmaceuticalAdministrationEventUID'), 0x00084000: ('LT', '1', "Identifying Comments", 'Retired', 'IdentifyingComments'), 0x00089007: ('CS', '4-5', "Frame Type", '', 'FrameType'), 0x00089092: ('SQ', '1', "Referenced Image Evidence Sequence", '', 'ReferencedImageEvidenceSequence'), 0x00089121: ('SQ', '1', "Referenced Raw Data Sequence", '', 'ReferencedRawDataSequence'), 0x00089123: ('UI', '1', "Creator-Version UID", '', 'CreatorVersionUID'), 0x00089124: ('SQ', '1', "Derivation Image Sequence", '', 'DerivationImageSequence'), 0x00089154: ('SQ', '1', "Source Image Evidence Sequence", '', 'SourceImageEvidenceSequence'), 0x00089205: ('CS', '1', "Pixel Presentation", '', 'PixelPresentation'), 0x00089206: ('CS', '1', "Volumetric Properties", '', 'VolumetricProperties'), 0x00089207: ('CS', '1', "Volume Based Calculation Technique", '', 'VolumeBasedCalculationTechnique'), 0x00089208: ('CS', '1', "Complex Image Component", '', 'ComplexImageComponent'), 0x00089209: ('CS', '1', "Acquisition Contrast", '', 'AcquisitionContrast'), 0x00089215: ('SQ', '1', "Derivation Code Sequence", '', 'DerivationCodeSequence'), 0x00089237: ('SQ', '1', "Referenced Presentation State Sequence", '', 'ReferencedPresentationStateSequence'), 0x00089410: ('SQ', '1', "Referenced Other Plane Sequence", '', 'ReferencedOtherPlaneSequence'), 0x00089458: ('SQ', '1', "Frame Display Sequence", '', 'FrameDisplaySequence'), 0x00089459: ('FL', '1', "Recommended Display Frame Rate in Float", '', 'RecommendedDisplayFrameRateInFloat'), 0x00089460: ('CS', '1', "Skip Frame Range Flag", '', 'SkipFrameRangeFlag'), 0x00100010: ('PN', '1', "Patient's Name", '', 'PatientName'), 0x00100020: ('LO', '1', "Patient ID", '', 'PatientID'), 0x00100021: ('LO', '1', "Issuer of Patient ID", '', 'IssuerOfPatientID'), 0x00100022: ('CS', '1', "Type of Patient ID", '', 'TypeOfPatientID'), 0x00100024: ('SQ', '1', "Issuer of Patient ID Qualifiers Sequence", '', 'IssuerOfPatientIDQualifiersSequence'), 0x00100026: ('SQ', '1', "Source Patient Group Identification Sequence", '', 'SourcePatientGroupIdentificationSequence'), 0x00100027: ('SQ', '1', "Group of Patients Identification Sequence", '', 'GroupOfPatientsIdentificationSequence'), 0x00100028: ('US', '3', "Subject Relative Position in Image", '', 'SubjectRelativePositionInImage'), 0x00100030: ('DA', '1', "Patient's Birth Date", '', 'PatientBirthDate'), 0x00100032: ('TM', '1', "Patient's Birth Time", '', 'PatientBirthTime'), 0x00100033: ('LO', '1', "Patient's Birth Date in Alternative Calendar", '', 'PatientBirthDateInAlternativeCalendar'), 0x00100034: ('LO', '1', "Patient's Death Date in Alternative Calendar", '', 'PatientDeathDateInAlternativeCalendar'), 0x00100035: ('CS', '1', "Patient's Alternative Calendar", '', 'PatientAlternativeCalendar'), 0x00100040: ('CS', '1', "Patient's Sex", '', 'PatientSex'), 0x00100050: ('SQ', '1', "Patient's Insurance Plan Code Sequence", '', 'PatientInsurancePlanCodeSequence'), 0x00100101: ('SQ', '1', "Patient's Primary Language Code Sequence", '', 'PatientPrimaryLanguageCodeSequence'), 0x00100102: ('SQ', '1', "Patient's Primary Language Modifier Code Sequence", '', 'PatientPrimaryLanguageModifierCodeSequence'), 0x00100200: ('CS', '1', "Quality Control Subject", '', 'QualityControlSubject'), 0x00100201: ('SQ', '1', "Quality Control Subject Type Code Sequence", '', 'QualityControlSubjectTypeCodeSequence'), 0x00100212: ('UC', '1', "Strain Description", '', 'StrainDescription'), 0x00100213: ('LO', '1', "Strain Nomenclature", '', 'StrainNomenclature'), 0x00100214: ('LO', '1', "Strain Stock Number", '', 'StrainStockNumber'), 0x00100215: ('SQ', '1', "Strain Source Registry Code Sequence", '', 'StrainSourceRegistryCodeSequence'), 0x00100216: ('SQ', '1', "Strain Stock Sequence", '', 'StrainStockSequence'), 0x00100217: ('LO', '1', "Strain Source", '', 'StrainSource'), 0x00100218: ('UT', '1', "Strain Additional Information", '', 'StrainAdditionalInformation'), 0x00100219: ('SQ', '1', "Strain Code Sequence", '', 'StrainCodeSequence'), 0x00100221: ('SQ', '1', "Genetic Modifications Sequence", '', 'GeneticModificationsSequence'), 0x00100222: ('UC', '1', "Genetic Modifications Description", '', 'GeneticModificationsDescription'), 0x00100223: ('LO', '1', "Genetic Modifications Nomenclature", '', 'GeneticModificationsNomenclature'), 0x00100229: ('SQ', '1', "Genetic Modifications Code Sequence", '', 'GeneticModificationsCodeSequence'), 0x00101000: ('LO', '1-n', "Other Patient IDs", 'Retired', 'OtherPatientIDs'), 0x00101001: ('PN', '1-n', "Other Patient Names", '', 'OtherPatientNames'), 0x00101002: ('SQ', '1', "Other Patient IDs Sequence", '', 'OtherPatientIDsSequence'), 0x00101005: ('PN', '1', "Patient's Birth Name", '', 'PatientBirthName'), 0x00101010: ('AS', '1', "Patient's Age", '', 'PatientAge'), 0x00101020: ('DS', '1', "Patient's Size", '', 'PatientSize'), 0x00101021: ('SQ', '1', "Patient's Size Code Sequence", '', 'PatientSizeCodeSequence'), 0x00101022: ('DS', '1', "Patient's Body Mass Index", '', 'PatientBodyMassIndex'), 0x00101023: ('DS', '1', "Measured AP Dimension", '', 'MeasuredAPDimension'), 0x00101024: ('DS', '1', "Measured Lateral Dimension", '', 'MeasuredLateralDimension'), 0x00101030: ('DS', '1', "Patient's Weight", '', 'PatientWeight'), 0x00101040: ('LO', '1', "Patient's Address", '', 'PatientAddress'), 0x00101050: ('LO', '1-n', "Insurance Plan Identification", 'Retired', 'InsurancePlanIdentification'), 0x00101060: ('PN', '1', "Patient's Mother's Birth Name", '', 'PatientMotherBirthName'), 0x00101080: ('LO', '1', "Military Rank", '', 'MilitaryRank'), 0x00101081: ('LO', '1', "Branch of Service", '', 'BranchOfService'), 0x00101090: ('LO', '1', "Medical Record Locator", 'Retired', 'MedicalRecordLocator'), 0x00101100: ('SQ', '1', "Referenced Patient Photo Sequence", '', 'ReferencedPatientPhotoSequence'), 0x00102000: ('LO', '1-n', "Medical Alerts", '', 'MedicalAlerts'), 0x00102110: ('LO', '1-n', "Allergies", '', 'Allergies'), 0x00102150: ('LO', '1', "Country of Residence", '', 'CountryOfResidence'), 0x00102152: ('LO', '1', "Region of Residence", '', 'RegionOfResidence'), 0x00102154: ('SH', '1-n', "Patient's Telephone Numbers", '', 'PatientTelephoneNumbers'), 0x00102155: ('LT', '1', "Patient's Telecom Information", '', 'PatientTelecomInformation'), 0x00102160: ('SH', '1', "Ethnic Group", '', 'EthnicGroup'), 0x00102161: ('SQ', '1', "Ethnic Group Code Sequence", '', 'EthnicGroupCodeSequence'), 0x00102180: ('SH', '1', "Occupation", '', 'Occupation'), 0x001021A0: ('CS', '1', "Smoking Status", '', 'SmokingStatus'), 0x001021B0: ('LT', '1', "Additional Patient History", '', 'AdditionalPatientHistory'), 0x001021C0: ('US', '1', "Pregnancy Status", '', 'PregnancyStatus'), 0x001021D0: ('DA', '1', "Last Menstrual Date", '', 'LastMenstrualDate'), 0x001021F0: ('LO', '1', "Patient's Religious Preference", '', 'PatientReligiousPreference'), 0x00102201: ('LO', '1', "Patient Species Description", '', 'PatientSpeciesDescription'), 0x00102202: ('SQ', '1', "Patient Species Code Sequence", '', 'PatientSpeciesCodeSequence'), 0x00102203: ('CS', '1', "Patient's Sex Neutered", '', 'PatientSexNeutered'), 0x00102210: ('CS', '1', "Anatomical Orientation Type", '', 'AnatomicalOrientationType'), 0x00102292: ('LO', '1', "Patient Breed Description", '', 'PatientBreedDescription'), 0x00102293: ('SQ', '1', "Patient Breed Code Sequence", '', 'PatientBreedCodeSequence'), 0x00102294: ('SQ', '1', "Breed Registration Sequence", '', 'BreedRegistrationSequence'), 0x00102295: ('LO', '1', "Breed Registration Number", '', 'BreedRegistrationNumber'), 0x00102296: ('SQ', '1', "Breed Registry Code Sequence", '', 'BreedRegistryCodeSequence'), 0x00102297: ('PN', '1', "Responsible Person", '', 'ResponsiblePerson'), 0x00102298: ('CS', '1', "Responsible Person Role", '', 'ResponsiblePersonRole'), 0x00102299: ('LO', '1', "Responsible Organization", '', 'ResponsibleOrganization'), 0x00104000: ('LT', '1', "Patient Comments", '', 'PatientComments'), 0x00109431: ('FL', '1', "Examined Body Thickness", '', 'ExaminedBodyThickness'), 0x00120010: ('LO', '1', "Clinical Trial Sponsor Name", '', 'ClinicalTrialSponsorName'), 0x00120020: ('LO', '1', "Clinical Trial Protocol ID", '', 'ClinicalTrialProtocolID'), 0x00120021: ('LO', '1', "Clinical Trial Protocol Name", '', 'ClinicalTrialProtocolName'), 0x00120022: ('LO', '1', "Issuer of Clinical Trial Protocol ID", '', 'IssuerOfClinicalTrialProtocolID'), 0x00120023: ('SQ', '1', "Other Clinical Trial Protocol IDs Sequence", '', 'OtherClinicalTrialProtocolIDsSequence'), 0x00120030: ('LO', '1', "Clinical Trial Site ID", '', 'ClinicalTrialSiteID'), 0x00120031: ('LO', '1', "Clinical Trial Site Name", '', 'ClinicalTrialSiteName'), 0x00120032: ('LO', '1', "Issuer of Clinical Trial Site ID", '', 'IssuerOfClinicalTrialSiteID'), 0x00120040: ('LO', '1', "Clinical Trial Subject ID", '', 'ClinicalTrialSubjectID'), 0x00120041: ('LO', '1', "Issuer of Clinical Trial Subject ID", '', 'IssuerOfClinicalTrialSubjectID'), 0x00120042: ('LO', '1', "Clinical Trial Subject Reading ID", '', 'ClinicalTrialSubjectReadingID'), 0x00120043: ('LO', '1', "Issuer of Clinical Trial Subject Reading ID", '', 'IssuerOfClinicalTrialSubjectReadingID'), 0x00120050: ('LO', '1', "Clinical Trial Time Point ID", '', 'ClinicalTrialTimePointID'), 0x00120051: ('ST', '1', "Clinical Trial Time Point Description", '', 'ClinicalTrialTimePointDescription'), 0x00120052: ('FD', '1', "Longitudinal Temporal Offset from Event", '', 'LongitudinalTemporalOffsetFromEvent'), 0x00120053: ('CS', '1', "Longitudinal Temporal Event Type", '', 'LongitudinalTemporalEventType'), 0x00120054: ('SQ', '1', "Clinical Trial Time Point Type Code Sequence", '', 'ClinicalTrialTimePointTypeCodeSequence'), 0x00120055: ('LO', '1', "Issuer of Clinical Trial Time Point ID", '', 'IssuerOfClinicalTrialTimePointID'), 0x00120060: ('LO', '1', "Clinical Trial Coordinating Center Name", '', 'ClinicalTrialCoordinatingCenterName'), 0x00120062: ('CS', '1', "Patient Identity Removed", '', 'PatientIdentityRemoved'), 0x00120063: ('LO', '1-n', "De-identification Method", '', 'DeidentificationMethod'), 0x00120064: ('SQ', '1', "De-identification Method Code Sequence", '', 'DeidentificationMethodCodeSequence'), 0x00120071: ('LO', '1', "Clinical Trial Series ID", '', 'ClinicalTrialSeriesID'), 0x00120072: ('LO', '1', "Clinical Trial Series Description", '', 'ClinicalTrialSeriesDescription'), 0x00120073: ('LO', '1', "Issuer of Clinical Trial Series ID", '', 'IssuerOfClinicalTrialSeriesID'), 0x00120081: ('LO', '1', "Clinical Trial Protocol Ethics Committee Name", '', 'ClinicalTrialProtocolEthicsCommitteeName'), 0x00120082: ('LO', '1', "Clinical Trial Protocol Ethics Committee Approval Number", '', 'ClinicalTrialProtocolEthicsCommitteeApprovalNumber'), 0x00120083: ('SQ', '1', "Consent for Clinical Trial Use Sequence", '', 'ConsentForClinicalTrialUseSequence'), 0x00120084: ('CS', '1', "Distribution Type", '', 'DistributionType'), 0x00120085: ('CS', '1', "Consent for Distribution Flag", '', 'ConsentForDistributionFlag'), 0x00120086: ('DA', '1', "Ethics Committee Approval Effectiveness Start Date", '', 'EthicsCommitteeApprovalEffectivenessStartDate'), 0x00120087: ('DA', '1', "Ethics Committee Approval Effectiveness End Date", '', 'EthicsCommitteeApprovalEffectivenessEndDate'), 0x00140023: ('ST', '1', "CAD File Format", 'Retired', 'CADFileFormat'), 0x00140024: ('ST', '1', "Component Reference System", 'Retired', 'ComponentReferenceSystem'), 0x00140025: ('ST', '1', "Component Manufacturing Procedure", '', 'ComponentManufacturingProcedure'), 0x00140028: ('ST', '1', "Component Manufacturer", '', 'ComponentManufacturer'), 0x00140030: ('DS', '1-n', "Material Thickness", '', 'MaterialThickness'), 0x00140032: ('DS', '1-n', "Material Pipe Diameter", '', 'MaterialPipeDiameter'), 0x00140034: ('DS', '1-n', "Material Isolation Diameter", '', 'MaterialIsolationDiameter'), 0x00140042: ('ST', '1', "Material Grade", '', 'MaterialGrade'), 0x00140044: ('ST', '1', "Material Properties Description", '', 'MaterialPropertiesDescription'), 0x00140045: ('ST', '1', "Material Properties File Format (Retired)", 'Retired', 'MaterialPropertiesFileFormatRetired'), 0x00140046: ('LT', '1', "Material Notes", '', 'MaterialNotes'), 0x00140050: ('CS', '1', "Component Shape", '', 'ComponentShape'), 0x00140052: ('CS', '1', "Curvature Type", '', 'CurvatureType'), 0x00140054: ('DS', '1', "Outer Diameter", '', 'OuterDiameter'), 0x00140056: ('DS', '1', "Inner Diameter", '', 'InnerDiameter'), 0x00140100: ('LO', '1-n', "Component Welder IDs", '', 'ComponentWelderIDs'), 0x00140101: ('CS', '1', "Secondary Approval Status", '', 'SecondaryApprovalStatus'), 0x00140102: ('DA', '1', "Secondary Review Date", '', 'SecondaryReviewDate'), 0x00140103: ('TM', '1', "Secondary Review Time", '', 'SecondaryReviewTime'), 0x00140104: ('PN', '1', "Secondary Reviewer Name", '', 'SecondaryReviewerName'), 0x00140105: ('ST', '1', "Repair ID", '', 'RepairID'), 0x00140106: ('SQ', '1', "Multiple Component Approval Sequence", '', 'MultipleComponentApprovalSequence'), 0x00140107: ('CS', '1-n', "Other Approval Status", '', 'OtherApprovalStatus'), 0x00140108: ('CS', '1-n', "Other Secondary Approval Status", '', 'OtherSecondaryApprovalStatus'), 0x00140200: ('SQ', '1', "Data Element Label Sequence", '', 'DataElementLabelSequence'), 0x00140201: ('SQ', '1', "Data Element Label Item Sequence", '', 'DataElementLabelItemSequence'), 0x00140202: ('AT', '1', "Data Element", '', 'DataElement'), 0x00140203: ('LO', '1', "Data Element Name", '', 'DataElementName'), 0x00140204: ('LO', '1', "Data Element Description", '', 'DataElementDescription'), 0x00140205: ('CS', '1', "Data Element Conditionality", '', 'DataElementConditionality'), 0x00140206: ('IS', '1', "Data Element Minimum Characters", '', 'DataElementMinimumCharacters'), 0x00140207: ('IS', '1', "Data Element Maximum Characters", '', 'DataElementMaximumCharacters'), 0x00141010: ('ST', '1', "Actual Environmental Conditions", '', 'ActualEnvironmentalConditions'), 0x00141020: ('DA', '1', "Expiry Date", '', 'ExpiryDate'), 0x00141040: ('ST', '1', "Environmental Conditions", '', 'EnvironmentalConditions'), 0x00142002: ('SQ', '1', "Evaluator Sequence", '', 'EvaluatorSequence'), 0x00142004: ('IS', '1', "Evaluator Number", '', 'EvaluatorNumber'), 0x00142006: ('PN', '1', "Evaluator Name", '', 'EvaluatorName'), 0x00142008: ('IS', '1', "Evaluation Attempt", '', 'EvaluationAttempt'), 0x00142012: ('SQ', '1', "Indication Sequence", '', 'IndicationSequence'), 0x00142014: ('IS', '1', "Indication Number", '', 'IndicationNumber'), 0x00142016: ('SH', '1', "Indication Label", '', 'IndicationLabel'), 0x00142018: ('ST', '1', "Indication Description", '', 'IndicationDescription'), 0x0014201A: ('CS', '1-n', "Indication Type", '', 'IndicationType'), 0x0014201C: ('CS', '1', "Indication Disposition", '', 'IndicationDisposition'), 0x0014201E: ('SQ', '1', "Indication ROI Sequence", '', 'IndicationROISequence'), 0x00142030: ('SQ', '1', "Indication Physical Property Sequence", '', 'IndicationPhysicalPropertySequence'), 0x00142032: ('SH', '1', "Property Label", '', 'PropertyLabel'), 0x00142202: ('IS', '1', "Coordinate System Number of Axes", '', 'CoordinateSystemNumberOfAxes'), 0x00142204: ('SQ', '1', "Coordinate System Axes Sequence", '', 'CoordinateSystemAxesSequence'), 0x00142206: ('ST', '1', "Coordinate System Axis Description", '', 'CoordinateSystemAxisDescription'), 0x00142208: ('CS', '1', "Coordinate System Data Set Mapping", '', 'CoordinateSystemDataSetMapping'), 0x0014220A: ('IS', '1', "Coordinate System Axis Number", '', 'CoordinateSystemAxisNumber'), 0x0014220C: ('CS', '1', "Coordinate System Axis Type", '', 'CoordinateSystemAxisType'), 0x0014220E: ('CS', '1', "Coordinate System Axis Units", '', 'CoordinateSystemAxisUnits'), 0x00142210: ('OB', '1', "Coordinate System Axis Values", '', 'CoordinateSystemAxisValues'), 0x00142220: ('SQ', '1', "Coordinate System Transform Sequence", '', 'CoordinateSystemTransformSequence'), 0x00142222: ('ST', '1', "Transform Description", '', 'TransformDescription'), 0x00142224: ('IS', '1', "Transform Number of Axes", '', 'TransformNumberOfAxes'), 0x00142226: ('IS', '1-n', "Transform Order of Axes", '', 'TransformOrderOfAxes'), 0x00142228: ('CS', '1', "Transformed Axis Units", '', 'TransformedAxisUnits'), 0x0014222A: ('DS', '1-n', "Coordinate System Transform Rotation and Scale Matrix", '', 'CoordinateSystemTransformRotationAndScaleMatrix'), 0x0014222C: ('DS', '1-n', "Coordinate System Transform Translation Matrix", '', 'CoordinateSystemTransformTranslationMatrix'), 0x00143011: ('DS', '1', "Internal Detector Frame Time", '', 'InternalDetectorFrameTime'), 0x00143012: ('DS', '1', "Number of Frames Integrated", '', 'NumberOfFramesIntegrated'), 0x00143020: ('SQ', '1', "Detector Temperature Sequence", '', 'DetectorTemperatureSequence'), 0x00143022: ('ST', '1', "Sensor Name", '', 'SensorName'), 0x00143024: ('DS', '1', "Horizontal Offset of Sensor", '', 'HorizontalOffsetOfSensor'), 0x00143026: ('DS', '1', "Vertical Offset of Sensor", '', 'VerticalOffsetOfSensor'), 0x00143028: ('DS', '1', "Sensor Temperature", '', 'SensorTemperature'), 0x00143040: ('SQ', '1', "Dark Current Sequence", '', 'DarkCurrentSequence'), 0x00143050: ('OB or OW', '1', "Dark Current Counts", '', 'DarkCurrentCounts'), 0x00143060: ('SQ', '1', "Gain Correction Reference Sequence", '', 'GainCorrectionReferenceSequence'), 0x00143070: ('OB or OW', '1', "Air Counts", '', 'AirCounts'), 0x00143071: ('DS', '1', "KV Used in Gain Calibration", '', 'KVUsedInGainCalibration'), 0x00143072: ('DS', '1', "MA Used in Gain Calibration", '', 'MAUsedInGainCalibration'), 0x00143073: ('DS', '1', "Number of Frames Used for Integration", '', 'NumberOfFramesUsedForIntegration'), 0x00143074: ('LO', '1', "Filter Material Used in Gain Calibration", '', 'FilterMaterialUsedInGainCalibration'), 0x00143075: ('DS', '1', "Filter Thickness Used in Gain Calibration", '', 'FilterThicknessUsedInGainCalibration'), 0x00143076: ('DA', '1', "Date of Gain Calibration", '', 'DateOfGainCalibration'), 0x00143077: ('TM', '1', "Time of Gain Calibration", '', 'TimeOfGainCalibration'), 0x00143080: ('OB', '1', "Bad Pixel Image", '', 'BadPixelImage'), 0x00143099: ('LT', '1', "Calibration Notes", '', 'CalibrationNotes'), 0x00143100: ('LT', '1', "Linearity Correction Technique", '', 'LinearityCorrectionTechnique'), 0x00143101: ('LT', '1', "Beam Hardening Correction Technique", '', 'BeamHardeningCorrectionTechnique'), 0x00144002: ('SQ', '1', "Pulser Equipment Sequence", '', 'PulserEquipmentSequence'), 0x00144004: ('CS', '1', "Pulser Type", '', 'PulserType'), 0x00144006: ('LT', '1', "Pulser Notes", '', 'PulserNotes'), 0x00144008: ('SQ', '1', "Receiver Equipment Sequence", '', 'ReceiverEquipmentSequence'), 0x0014400A: ('CS', '1', "Amplifier Type", '', 'AmplifierType'), 0x0014400C: ('LT', '1', "Receiver Notes", '', 'ReceiverNotes'), 0x0014400E: ('SQ', '1', "Pre-Amplifier Equipment Sequence", '', 'PreAmplifierEquipmentSequence'), 0x0014400F: ('LT', '1', "Pre-Amplifier Notes", '', 'PreAmplifierNotes'), 0x00144010: ('SQ', '1', "Transmit Transducer Sequence", '', 'TransmitTransducerSequence'), 0x00144011: ('SQ', '1', "Receive Transducer Sequence", '', 'ReceiveTransducerSequence'), 0x00144012: ('US', '1', "Number of Elements", '', 'NumberOfElements'), 0x00144013: ('CS', '1', "Element Shape", '', 'ElementShape'), 0x00144014: ('DS', '1', "Element Dimension A", '', 'ElementDimensionA'), 0x00144015: ('DS', '1', "Element Dimension B", '', 'ElementDimensionB'), 0x00144016: ('DS', '1', "Element Pitch A", '', 'ElementPitchA'), 0x00144017: ('DS', '1', "Measured Beam Dimension A", '', 'MeasuredBeamDimensionA'), 0x00144018: ('DS', '1', "Measured Beam Dimension B", '', 'MeasuredBeamDimensionB'), 0x00144019: ('DS', '1', "Location of Measured Beam Diameter", '', 'LocationOfMeasuredBeamDiameter'), 0x0014401A: ('DS', '1', "Nominal Frequency", '', 'NominalFrequency'), 0x0014401B: ('DS', '1', "Measured Center Frequency", '', 'MeasuredCenterFrequency'), 0x0014401C: ('DS', '1', "Measured Bandwidth", '', 'MeasuredBandwidth'), 0x0014401D: ('DS', '1', "Element Pitch B", '', 'ElementPitchB'), 0x00144020: ('SQ', '1', "Pulser Settings Sequence", '', 'PulserSettingsSequence'), 0x00144022: ('DS', '1', "Pulse Width", '', 'PulseWidth'), 0x00144024: ('DS', '1', "Excitation Frequency", '', 'ExcitationFrequency'), 0x00144026: ('CS', '1', "Modulation Type", '', 'ModulationType'), 0x00144028: ('DS', '1', "Damping", '', 'Damping'), 0x00144030: ('SQ', '1', "Receiver Settings Sequence", '', 'ReceiverSettingsSequence'), 0x00144031: ('DS', '1', "Acquired Soundpath Length", '', 'AcquiredSoundpathLength'), 0x00144032: ('CS', '1', "Acquisition Compression Type", '', 'AcquisitionCompressionType'), 0x00144033: ('IS', '1', "Acquisition Sample Size", '', 'AcquisitionSampleSize'), 0x00144034: ('DS', '1', "Rectifier Smoothing", '', 'RectifierSmoothing'), 0x00144035: ('SQ', '1', "DAC Sequence", '', 'DACSequence'), 0x00144036: ('CS', '1', "DAC Type", '', 'DACType'), 0x00144038: ('DS', '1-n', "DAC Gain Points", '', 'DACGainPoints'), 0x0014403A: ('DS', '1-n', "DAC Time Points", '', 'DACTimePoints'), 0x0014403C: ('DS', '1-n', "DAC Amplitude", '', 'DACAmplitude'), 0x00144040: ('SQ', '1', "Pre-Amplifier Settings Sequence", '', 'PreAmplifierSettingsSequence'), 0x00144050: ('SQ', '1', "Transmit Transducer Settings Sequence", '', 'TransmitTransducerSettingsSequence'), 0x00144051: ('SQ', '1', "Receive Transducer Settings Sequence", '', 'ReceiveTransducerSettingsSequence'), 0x00144052: ('DS', '1', "Incident Angle", '', 'IncidentAngle'), 0x00144054: ('ST', '1', "Coupling Technique", '', 'CouplingTechnique'), 0x00144056: ('ST', '1', "Coupling Medium", '', 'CouplingMedium'), 0x00144057: ('DS', '1', "Coupling Velocity", '', 'CouplingVelocity'), 0x00144058: ('DS', '1', "Probe Center Location X", '', 'ProbeCenterLocationX'), 0x00144059: ('DS', '1', "Probe Center Location Z", '', 'ProbeCenterLocationZ'), 0x0014405A: ('DS', '1', "Sound Path Length", '', 'SoundPathLength'), 0x0014405C: ('ST', '1', "Delay Law Identifier", '', 'DelayLawIdentifier'), 0x00144060: ('SQ', '1', "Gate Settings Sequence", '', 'GateSettingsSequence'), 0x00144062: ('DS', '1', "Gate Threshold", '', 'GateThreshold'), 0x00144064: ('DS', '1', "Velocity of Sound", '', 'VelocityOfSound'), 0x00144070: ('SQ', '1', "Calibration Settings Sequence", '', 'CalibrationSettingsSequence'), 0x00144072: ('ST', '1', "Calibration Procedure", '', 'CalibrationProcedure'), 0x00144074: ('SH', '1', "Procedure Version", '', 'ProcedureVersion'), 0x00144076: ('DA', '1', "Procedure Creation Date", '', 'ProcedureCreationDate'), 0x00144078: ('DA', '1', "Procedure Expiration Date", '', 'ProcedureExpirationDate'), 0x0014407A: ('DA', '1', "Procedure Last Modified Date", '', 'ProcedureLastModifiedDate'), 0x0014407C: ('TM', '1-n', "Calibration Time", '', 'CalibrationTime'), 0x0014407E: ('DA', '1-n', "Calibration Date", '', 'CalibrationDate'), 0x00144080: ('SQ', '1', "Probe Drive Equipment Sequence", '', 'ProbeDriveEquipmentSequence'), 0x00144081: ('CS', '1', "Drive Type", '', 'DriveType'), 0x00144082: ('LT', '1', "Probe Drive Notes", '', 'ProbeDriveNotes'), 0x00144083: ('SQ', '1', "Drive Probe Sequence", '', 'DriveProbeSequence'), 0x00144084: ('DS', '1', "Probe Inductance", '', 'ProbeInductance'), 0x00144085: ('DS', '1', "Probe Resistance", '', 'ProbeResistance'), 0x00144086: ('SQ', '1', "Receive Probe Sequence", '', 'ReceiveProbeSequence'), 0x00144087: ('SQ', '1', "Probe Drive Settings Sequence", '', 'ProbeDriveSettingsSequence'), 0x00144088: ('DS', '1', "Bridge Resistors", '', 'BridgeResistors'), 0x00144089: ('DS', '1', "Probe Orientation Angle", '', 'ProbeOrientationAngle'), 0x0014408B: ('DS', '1', "User Selected Gain Y", '', 'UserSelectedGainY'), 0x0014408C: ('DS', '1', "User Selected Phase", '', 'UserSelectedPhase'), 0x0014408D: ('DS', '1', "User Selected Offset X", '', 'UserSelectedOffsetX'), 0x0014408E: ('DS', '1', "User Selected Offset Y", '', 'UserSelectedOffsetY'), 0x00144091: ('SQ', '1', "Channel Settings Sequence", '', 'ChannelSettingsSequence'), 0x00144092: ('DS', '1', "Channel Threshold", '', 'ChannelThreshold'), 0x0014409A: ('SQ', '1', "Scanner Settings Sequence", '', 'ScannerSettingsSequence'), 0x0014409B: ('ST', '1', "Scan Procedure", '', 'ScanProcedure'), 0x0014409C: ('DS', '1', "Translation Rate X", '', 'TranslationRateX'), 0x0014409D: ('DS', '1', "Translation Rate Y", '', 'TranslationRateY'), 0x0014409F: ('DS', '1', "Channel Overlap", '', 'ChannelOverlap'), 0x001440A0: ('LO', '1-n', "Image Quality Indicator Type", '', 'ImageQualityIndicatorType'), 0x001440A1: ('LO', '1-n', "Image Quality Indicator Material", '', 'ImageQualityIndicatorMaterial'), 0x001440A2: ('LO', '1-n', "Image Quality Indicator Size", '', 'ImageQualityIndicatorSize'), 0x00145002: ('IS', '1', "LINAC Energy", '', 'LINACEnergy'), 0x00145004: ('IS', '1', "LINAC Output", '', 'LINACOutput'), 0x00145100: ('US', '1', "Active Aperture", '', 'ActiveAperture'), 0x00145101: ('DS', '1', "Total Aperture", '', 'TotalAperture'), 0x00145102: ('DS', '1', "Aperture Elevation", '', 'ApertureElevation'), 0x00145103: ('DS', '1', "Main Lobe Angle", '', 'MainLobeAngle'), 0x00145104: ('DS', '1', "Main Roof Angle", '', 'MainRoofAngle'), 0x00145105: ('CS', '1', "Connector Type", '', 'ConnectorType'), 0x00145106: ('SH', '1', "Wedge Model Number", '', 'WedgeModelNumber'), 0x00145107: ('DS', '1', "Wedge Angle Float", '', 'WedgeAngleFloat'), 0x00145108: ('DS', '1', "Wedge Roof Angle", '', 'WedgeRoofAngle'), 0x00145109: ('CS', '1', "Wedge Element 1 Position", '', 'WedgeElement1Position'), 0x0014510A: ('DS', '1', "Wedge Material Velocity", '', 'WedgeMaterialVelocity'), 0x0014510B: ('SH', '1', "Wedge Material", '', 'WedgeMaterial'), 0x0014510C: ('DS', '1', "Wedge Offset Z", '', 'WedgeOffsetZ'), 0x0014510D: ('DS', '1', "Wedge Origin Offset X", '', 'WedgeOriginOffsetX'), 0x0014510E: ('DS', '1', "Wedge Time Delay", '', 'WedgeTimeDelay'), 0x0014510F: ('SH', '1', "Wedge Name", '', 'WedgeName'), 0x00145110: ('SH', '1', "Wedge Manufacturer Name", '', 'WedgeManufacturerName'), 0x00145111: ('LO', '1', "Wedge Description", '', 'WedgeDescription'), 0x00145112: ('DS', '1', "Nominal Beam Angle", '', 'NominalBeamAngle'), 0x00145113: ('DS', '1', "Wedge Offset X", '', 'WedgeOffsetX'), 0x00145114: ('DS', '1', "Wedge Offset Y", '', 'WedgeOffsetY'), 0x00145115: ('DS', '1', "Wedge Total Length", '', 'WedgeTotalLength'), 0x00145116: ('DS', '1', "Wedge In Contact Length", '', 'WedgeInContactLength'), 0x00145117: ('DS', '1', "Wedge Front Gap", '', 'WedgeFrontGap'), 0x00145118: ('DS', '1', "Wedge Total Height", '', 'WedgeTotalHeight'), 0x00145119: ('DS', '1', "Wedge Front Height", '', 'WedgeFrontHeight'), 0x0014511A: ('DS', '1', "Wedge Rear Height", '', 'WedgeRearHeight'), 0x0014511B: ('DS', '1', "Wedge Total Width", '', 'WedgeTotalWidth'), 0x0014511C: ('DS', '1', "Wedge In Contact Width", '', 'WedgeInContactWidth'), 0x0014511D: ('DS', '1', "Wedge Chamfer Height", '', 'WedgeChamferHeight'), 0x0014511E: ('CS', '1', "Wedge Curve", '', 'WedgeCurve'), 0x0014511F: ('DS', '1', "Radius Along the Wedge", '', 'RadiusAlongWedge'), 0x00160001: ('DS', '1', "White Point", '', 'WhitePoint'), 0x00160002: ('DS', '3', "Primary Chromaticities", '', 'PrimaryChromaticities'), 0x00160003: ('UT', '1', "Battery Level", '', 'BatteryLevel'), 0x00160004: ('DS', '1', "Exposure Time in Seconds", '', 'ExposureTimeInSeconds'), 0x00160005: ('DS', '1', "F-Number", '', 'FNumber'), 0x00160006: ('IS', '1', "OECF Rows", '', 'OECFRows'), 0x00160007: ('IS', '1', "OECF Columns", '', 'OECFColumns'), 0x00160008: ('UC', '1-n', "OECF Column Names", '', 'OECFColumnNames'), 0x00160009: ('DS', '1-n', "OECF Values", '', 'OECFValues'), 0x0016000A: ('IS', '1', "Spatial Frequency Response Rows", '', 'SpatialFrequencyResponseRows'), 0x0016000B: ('IS', '1', "Spatial Frequency Response Columns", '', 'SpatialFrequencyResponseColumns'), 0x0016000C: ('UC', '1-n', "Spatial Frequency Response Column Names", '', 'SpatialFrequencyResponseColumnNames'), 0x0016000D: ('DS', '1-n', "Spatial Frequency Response Values", '', 'SpatialFrequencyResponseValues'), 0x0016000E: ('IS', '1', "Color Filter Array Pattern Rows", '', 'ColorFilterArrayPatternRows'), 0x0016000F: ('IS', '1', "Color Filter Array Pattern Columns", '', 'ColorFilterArrayPatternColumns'), 0x00160010: ('DS', '1-n', "Color Filter Array Pattern Values", '', 'ColorFilterArrayPatternValues'), 0x00160011: ('US', '1', "Flash Firing Status", '', 'FlashFiringStatus'), 0x00160012: ('US', '1', "Flash Return Status", '', 'FlashReturnStatus'), 0x00160013: ('US', '1', "Flash Mode", '', 'FlashMode'), 0x00160014: ('US', '1', "Flash Function Present", '', 'FlashFunctionPresent'), 0x00160015: ('US', '1', "Flash Red Eye Mode", '', 'FlashRedEyeMode'), 0x00160016: ('US', '1', "Exposure Program", '', 'ExposureProgram'), 0x00160017: ('UT', '1', "Spectral Sensitivity", '', 'SpectralSensitivity'), 0x00160018: ('IS', '1', "Photographic Sensitivity", '', 'PhotographicSensitivity'), 0x00160019: ('IS', '1', "Self Timer Mode", '', 'SelfTimerMode'), 0x0016001A: ('US', '1', "Sensitivity Type", '', 'SensitivityType'), 0x0016001B: ('IS', '1', "Standard Output Sensitivity", '', 'StandardOutputSensitivity'), 0x0016001C: ('IS', '1', "Recommended Exposure Index", '', 'RecommendedExposureIndex'), 0x0016001D: ('IS', '1', "ISO Speed", '', 'ISOSpeed'), 0x0016001E: ('IS', '1', "ISO Speed Latitude yyy", '', 'ISOSpeedLatitudeyyy'), 0x0016001F: ('IS', '1', "ISO Speed Latitude zzz", '', 'ISOSpeedLatitudezzz'), 0x00160020: ('UT', '1', "EXIF Version", '', 'EXIFVersion'), 0x00160021: ('DS', '1', "Shutter Speed Value", '', 'ShutterSpeedValue'), 0x00160022: ('DS', '1', "Aperture Value", '', 'ApertureValue'), 0x00160023: ('DS', '1', "Brightness Value", '', 'BrightnessValue'), 0x00160024: ('DS', '1', "Exposure Bias Value", '', 'ExposureBiasValue'), 0x00160025: ('DS', '1', "Max Aperture Value", '', 'MaxApertureValue'), 0x00160026: ('DS', '1', "Subject Distance", '', 'SubjectDistance'), 0x00160027: ('US', '1', "Metering Mode", '', 'MeteringMode'), 0x00160028: ('US', '1', "Light Source", '', 'LightSource'), 0x00160029: ('DS', '1', "Focal Length", '', 'FocalLength'), 0x0016002A: ('IS', '2-4', "Subject Area", '', 'SubjectArea'), 0x0016002B: ('OB', '1', "Maker Note", '', 'MakerNote'), 0x00160030: ('DS', '1', "Temperature", '', 'Temperature'), 0x00160031: ('DS', '1', "Humidity", '', 'Humidity'), 0x00160032: ('DS', '1', "Pressure", '', 'Pressure'), 0x00160033: ('DS', '1', "Water Depth", '', 'WaterDepth'), 0x00160034: ('DS', '1', "Acceleration", '', 'Acceleration'), 0x00160035: ('DS', '1', "Camera Elevation Angle", '', 'CameraElevationAngle'), 0x00160036: ('DS', '1-2', "Flash Energy", '', 'FlashEnergy'), 0x00160037: ('IS', '2', "Subject Location", '', 'SubjectLocation'), 0x00160038: ('DS', '1', "Photographic Exposure Index", '', 'PhotographicExposureIndex'), 0x00160039: ('US', '1', "Sensing Method", '', 'SensingMethod'), 0x0016003A: ('US', '1', "File Source", '', 'FileSource'), 0x0016003B: ('US', '1', "Scene Type", '', 'SceneType'), 0x00160041: ('US', '1', "Custom Rendered", '', 'CustomRendered'), 0x00160042: ('US', '1', "Exposure Mode", '', 'ExposureMode'), 0x00160043: ('US', '1', "White Balance", '', 'WhiteBalance'), 0x00160044: ('DS', '1', "Digital Zoom Ratio", '', 'DigitalZoomRatio'), 0x00160045: ('IS', '1', "Focal Length In 35mm Film", '', 'FocalLengthIn35mmFilm'), 0x00160046: ('US', '1', "Scene Capture Type", '', 'SceneCaptureType'), 0x00160047: ('US', '1', "Gain Control", '', 'GainControl'), 0x00160048: ('US', '1', "Contrast", '', 'Contrast'), 0x00160049: ('US', '1', "Saturation", '', 'Saturation'), 0x0016004A: ('US', '1', "Sharpness", '', 'Sharpness'), 0x0016004B: ('OB', '1', "Device Setting Description", '', 'DeviceSettingDescription'), 0x0016004C: ('US', '1', "Subject Distance Range", '', 'SubjectDistanceRange'), 0x0016004D: ('UT', '1', "Camera Owner Name", '', 'CameraOwnerName'), 0x0016004E: ('DS', '4', "Lens Specification", '', 'LensSpecification'), 0x0016004F: ('UT', '1', "Lens Make", '', 'LensMake'), 0x00160050: ('UT', '1', "Lens Model", '', 'LensModel'), 0x00160051: ('UT', '1', "Lens Serial Number", '', 'LensSerialNumber'), 0x00160061: ('CS', '1', "Interoperability Index", '', 'InteroperabilityIndex'), 0x00160062: ('OB', '1', "Interoperability Version", '', 'InteroperabilityVersion'), 0x00160070: ('OB', '1', "GPS Version ID", '', 'GPSVersionID'), 0x00160071: ('CS', '1', "GPS Latitude Ref", '', 'GPSLatitudeRef'), 0x00160072: ('DS', '3', "GPS Latitude", '', 'GPSLatitude'), 0x00160073: ('CS', '1', "GPS Longitude Ref", '', 'GPSLongitudeRef'), 0x00160074: ('DS', '3', "GPS Longitude", '', 'GPSLongitude'), 0x00160075: ('US', '1', "GPS Altitude Ref", '', 'GPSAltitudeRef'), 0x00160076: ('DS', '1', "GPS Altitude", '', 'GPSAltitude'), 0x00160077: ('DT', '1', "GPS Time Stamp", '', 'GPSTimeStamp'), 0x00160078: ('UT', '1', "GPS Satellites", '', 'GPSSatellites'), 0x00160079: ('CS', '1', "GPS Status", '', 'GPSStatus'), 0x0016007A: ('CS', '1', "GPS Measure Mode", '', 'GPSMeasureMode'), 0x0016007B: ('DS', '1', "GPS DOP", '', 'GPSDOP'), 0x0016007C: ('CS', '1', "GPS Speed Ref", '', 'GPSSpeedRef'), 0x0016007D: ('DS', '1', "GPS Speed", '', 'GPSSpeed'), 0x0016007E: ('CS', '1', "GPS Track Ref", '', 'GPSTrackRef'), 0x0016007F: ('DS', '1', "GPS Track", '', 'GPSTrack'), 0x00160080: ('CS', '1', "GPS Img Direction Ref", '', 'GPSImgDirectionRef'), 0x00160081: ('DS', '1', "GPS Img Direction", '', 'GPSImgDirection'), 0x00160082: ('UT', '1', "GPS Map Datum", '', 'GPSMapDatum'), 0x00160083: ('CS', '1', "GPS Dest Latitude Ref", '', 'GPSDestLatitudeRef'), 0x00160084: ('DS', '3', "GPS Dest Latitude", '', 'GPSDestLatitude'), 0x00160085: ('CS', '1', "GPS Dest Longitude Ref", '', 'GPSDestLongitudeRef'), 0x00160086: ('DS', '3', "GPS Dest Longitude", '', 'GPSDestLongitude'), 0x00160087: ('CS', '1', "GPS Dest Bearing Ref", '', 'GPSDestBearingRef'), 0x00160088: ('DS', '1', "GPS Dest Bearing", '', 'GPSDestBearing'), 0x00160089: ('CS', '1', "GPS Dest Distance Ref", '', 'GPSDestDistanceRef'), 0x0016008A: ('DS', '1', "GPS Dest Distance", '', 'GPSDestDistance'), 0x0016008B: ('OB', '1', "GPS Processing Method", '', 'GPSProcessingMethod'), 0x0016008C: ('OB', '1', "GPS Area Information", '', 'GPSAreaInformation'), 0x0016008D: ('DT', '1', "GPS Date Stamp", '', 'GPSDateStamp'), 0x0016008E: ('IS', '1', "GPS Differential", '', 'GPSDifferential'), 0x00161001: ('CS', '1', "Light Source Polarization", '', 'LightSourcePolarization'), 0x00161002: ('DS', '1', "Emitter Color Temperature", '', 'EmitterColorTemperature'), 0x00161003: ('CS', '1', "Contact Method", '', 'ContactMethod'), 0x00161004: ('CS', '1-n', "Immersion Media", '', 'ImmersionMedia'), 0x00161005: ('DS', '1', "Optical Magnification Factor", '', 'OpticalMagnificationFactor'), 0x00180010: ('LO', '1', "Contrast/Bolus Agent", '', 'ContrastBolusAgent'), 0x00180012: ('SQ', '1', "Contrast/Bolus Agent Sequence", '', 'ContrastBolusAgentSequence'), 0x00180013: ('FL', '1', "Contrast/Bolus T1 Relaxivity", '', 'ContrastBolusT1Relaxivity'), 0x00180014: ('SQ', '1', "Contrast/Bolus Administration Route Sequence", '', 'ContrastBolusAdministrationRouteSequence'), 0x00180015: ('CS', '1', "Body Part Examined", '', 'BodyPartExamined'), 0x00180020: ('CS', '1-n', "Scanning Sequence", '', 'ScanningSequence'), 0x00180021: ('CS', '1-n', "Sequence Variant", '', 'SequenceVariant'), 0x00180022: ('CS', '1-n', "Scan Options", '', 'ScanOptions'), 0x00180023: ('CS', '1', "MR Acquisition Type", '', 'MRAcquisitionType'), 0x00180024: ('SH', '1', "Sequence Name", '', 'SequenceName'), 0x00180025: ('CS', '1', "Angio Flag", '', 'AngioFlag'), 0x00180026: ('SQ', '1', "Intervention Drug Information Sequence", '', 'InterventionDrugInformationSequence'), 0x00180027: ('TM', '1', "Intervention Drug Stop Time", '', 'InterventionDrugStopTime'), 0x00180028: ('DS', '1', "Intervention Drug Dose", '', 'InterventionDrugDose'), 0x00180029: ('SQ', '1', "Intervention Drug Code Sequence", '', 'InterventionDrugCodeSequence'), 0x0018002A: ('SQ', '1', "Additional Drug Sequence", '', 'AdditionalDrugSequence'), 0x00180030: ('LO', '1-n', "Radionuclide", 'Retired', 'Radionuclide'), 0x00180031: ('LO', '1', "Radiopharmaceutical", '', 'Radiopharmaceutical'), 0x00180032: ('DS', '1', "Energy Window Centerline", 'Retired', 'EnergyWindowCenterline'), 0x00180033: ('DS', '1-n', "Energy Window Total Width", 'Retired', 'EnergyWindowTotalWidth'), 0x00180034: ('LO', '1', "Intervention Drug Name", '', 'InterventionDrugName'), 0x00180035: ('TM', '1', "Intervention Drug Start Time", '', 'InterventionDrugStartTime'), 0x00180036: ('SQ', '1', "Intervention Sequence", '', 'InterventionSequence'), 0x00180037: ('CS', '1', "Therapy Type", 'Retired', 'TherapyType'), 0x00180038: ('CS', '1', "Intervention Status", '', 'InterventionStatus'), 0x00180039: ('CS', '1', "Therapy Description", 'Retired', 'TherapyDescription'), 0x0018003A: ('ST', '1', "Intervention Description", '', 'InterventionDescription'), 0x00180040: ('IS', '1', "Cine Rate", '', 'CineRate'), 0x00180042: ('CS', '1', "Initial Cine Run State", '', 'InitialCineRunState'), 0x00180050: ('DS', '1', "Slice Thickness", '', 'SliceThickness'), 0x00180060: ('DS', '1', "KVP", '', 'KVP'), 0x00180061: ('DS', '1', "", 'Retired', ''), 0x00180070: ('IS', '1', "Counts Accumulated", '', 'CountsAccumulated'), 0x00180071: ('CS', '1', "Acquisition Termination Condition", '', 'AcquisitionTerminationCondition'), 0x00180072: ('DS', '1', "Effective Duration", '', 'EffectiveDuration'), 0x00180073: ('CS', '1', "Acquisition Start Condition", '', 'AcquisitionStartCondition'), 0x00180074: ('IS', '1', "Acquisition Start Condition Data", '', 'AcquisitionStartConditionData'), 0x00180075: ('IS', '1', "Acquisition Termination Condition Data", '', 'AcquisitionTerminationConditionData'), 0x00180080: ('DS', '1', "Repetition Time", '', 'RepetitionTime'), 0x00180081: ('DS', '1', "Echo Time", '', 'EchoTime'), 0x00180082: ('DS', '1', "Inversion Time", '', 'InversionTime'), 0x00180083: ('DS', '1', "Number of Averages", '', 'NumberOfAverages'), 0x00180084: ('DS', '1', "Imaging Frequency", '', 'ImagingFrequency'), 0x00180085: ('SH', '1', "Imaged Nucleus", '', 'ImagedNucleus'), 0x00180086: ('IS', '1-n', "Echo Number(s)", '', 'EchoNumbers'), 0x00180087: ('DS', '1', "Magnetic Field Strength", '', 'MagneticFieldStrength'), 0x00180088: ('DS', '1', "Spacing Between Slices", '', 'SpacingBetweenSlices'), 0x00180089: ('IS', '1', "Number of Phase Encoding Steps", '', 'NumberOfPhaseEncodingSteps'), 0x00180090: ('DS', '1', "Data Collection Diameter", '', 'DataCollectionDiameter'), 0x00180091: ('IS', '1', "Echo Train Length", '', 'EchoTrainLength'), 0x00180093: ('DS', '1', "Percent Sampling", '', 'PercentSampling'), 0x00180094: ('DS', '1', "Percent Phase Field of View", '', 'PercentPhaseFieldOfView'), 0x00180095: ('DS', '1', "Pixel Bandwidth", '', 'PixelBandwidth'), 0x00181000: ('LO', '1', "Device Serial Number", '', 'DeviceSerialNumber'), 0x00181002: ('UI', '1', "Device UID", '', 'DeviceUID'), 0x00181003: ('LO', '1', "Device ID", '', 'DeviceID'), 0x00181004: ('LO', '1', "Plate ID", '', 'PlateID'), 0x00181005: ('LO', '1', "Generator ID", '', 'GeneratorID'), 0x00181006: ('LO', '1', "Grid ID", '', 'GridID'), 0x00181007: ('LO', '1', "Cassette ID", '', 'CassetteID'), 0x00181008: ('LO', '1', "Gantry ID", '', 'GantryID'), 0x00181009: ('UT', '1', "Unique Device Identifier", '', 'UniqueDeviceIdentifier'), 0x0018100A: ('SQ', '1', "UDI Sequence", '', 'UDISequence'), 0x0018100B: ('UI', '1-n', "Manufacturer's Device Class UID", '', 'ManufacturerDeviceClassUID'), 0x00181010: ('LO', '1', "Secondary Capture Device ID", '', 'SecondaryCaptureDeviceID'), 0x00181011: ('LO', '1', "Hardcopy Creation Device ID", 'Retired', 'HardcopyCreationDeviceID'), 0x00181012: ('DA', '1', "Date of Secondary Capture", '', 'DateOfSecondaryCapture'), 0x00181014: ('TM', '1', "Time of Secondary Capture", '', 'TimeOfSecondaryCapture'), 0x00181016: ('LO', '1', "Secondary Capture Device Manufacturer", '', 'SecondaryCaptureDeviceManufacturer'), 0x00181017: ('LO', '1', "Hardcopy Device Manufacturer", 'Retired', 'HardcopyDeviceManufacturer'), 0x00181018: ('LO', '1', "Secondary Capture Device Manufacturer's Model Name", '', 'SecondaryCaptureDeviceManufacturerModelName'), 0x00181019: ('LO', '1-n', "Secondary Capture Device Software Versions", '', 'SecondaryCaptureDeviceSoftwareVersions'), 0x0018101A: ('LO', '1-n', "Hardcopy Device Software Version", 'Retired', 'HardcopyDeviceSoftwareVersion'), 0x0018101B: ('LO', '1', "Hardcopy Device Manufacturer's Model Name", 'Retired', 'HardcopyDeviceManufacturerModelName'), 0x00181020: ('LO', '1-n', "Software Versions", '', 'SoftwareVersions'), 0x00181022: ('SH', '1', "Video Image Format Acquired", '', 'VideoImageFormatAcquired'), 0x00181023: ('LO', '1', "Digital Image Format Acquired", '', 'DigitalImageFormatAcquired'), 0x00181030: ('LO', '1', "Protocol Name", '', 'ProtocolName'), 0x00181040: ('LO', '1', "Contrast/Bolus Route", '', 'ContrastBolusRoute'), 0x00181041: ('DS', '1', "Contrast/Bolus Volume", '', 'ContrastBolusVolume'), 0x00181042: ('TM', '1', "Contrast/Bolus Start Time", '', 'ContrastBolusStartTime'), 0x00181043: ('TM', '1', "Contrast/Bolus Stop Time", '', 'ContrastBolusStopTime'), 0x00181044: ('DS', '1', "Contrast/Bolus Total Dose", '', 'ContrastBolusTotalDose'), 0x00181045: ('IS', '1', "Syringe Counts", '', 'SyringeCounts'), 0x00181046: ('DS', '1-n', "Contrast Flow Rate", '', 'ContrastFlowRate'), 0x00181047: ('DS', '1-n', "Contrast Flow Duration", '', 'ContrastFlowDuration'), 0x00181048: ('CS', '1', "Contrast/Bolus Ingredient", '', 'ContrastBolusIngredient'), 0x00181049: ('DS', '1', "Contrast/Bolus Ingredient Concentration", '', 'ContrastBolusIngredientConcentration'), 0x00181050: ('DS', '1', "Spatial Resolution", '', 'SpatialResolution'), 0x00181060: ('DS', '1', "Trigger Time", '', 'TriggerTime'), 0x00181061: ('LO', '1', "Trigger Source or Type", '', 'TriggerSourceOrType'), 0x00181062: ('IS', '1', "Nominal Interval", '', 'NominalInterval'), 0x00181063: ('DS', '1', "Frame Time", '', 'FrameTime'), 0x00181064: ('LO', '1', "Cardiac Framing Type", '', 'CardiacFramingType'), 0x00181065: ('DS', '1-n', "Frame Time Vector", '', 'FrameTimeVector'), 0x00181066: ('DS', '1', "Frame Delay", '', 'FrameDelay'), 0x00181067: ('DS', '1', "Image Trigger Delay", '', 'ImageTriggerDelay'), 0x00181068: ('DS', '1', "Multiplex Group Time Offset", '', 'MultiplexGroupTimeOffset'), 0x00181069: ('DS', '1', "Trigger Time Offset", '', 'TriggerTimeOffset'), 0x0018106A: ('CS', '1', "Synchronization Trigger", '', 'SynchronizationTrigger'), 0x0018106C: ('US', '2', "Synchronization Channel", '', 'SynchronizationChannel'), 0x0018106E: ('UL', '1', "Trigger Sample Position", '', 'TriggerSamplePosition'), 0x00181070: ('LO', '1', "Radiopharmaceutical Route", '', 'RadiopharmaceuticalRoute'), 0x00181071: ('DS', '1', "Radiopharmaceutical Volume", '', 'RadiopharmaceuticalVolume'), 0x00181072: ('TM', '1', "Radiopharmaceutical Start Time", '', 'RadiopharmaceuticalStartTime'), 0x00181073: ('TM', '1', "Radiopharmaceutical Stop Time", '', 'RadiopharmaceuticalStopTime'), 0x00181074: ('DS', '1', "Radionuclide Total Dose", '', 'RadionuclideTotalDose'), 0x00181075: ('DS', '1', "Radionuclide Half Life", '', 'RadionuclideHalfLife'), 0x00181076: ('DS', '1', "Radionuclide Positron Fraction", '', 'RadionuclidePositronFraction'), 0x00181077: ('DS', '1', "Radiopharmaceutical Specific Activity", '', 'RadiopharmaceuticalSpecificActivity'), 0x00181078: ('DT', '1', "Radiopharmaceutical Start DateTime", '', 'RadiopharmaceuticalStartDateTime'), 0x00181079: ('DT', '1', "Radiopharmaceutical Stop DateTime", '', 'RadiopharmaceuticalStopDateTime'), 0x00181080: ('CS', '1', "Beat Rejection Flag", '', 'BeatRejectionFlag'), 0x00181081: ('IS', '1', "Low R-R Value", '', 'LowRRValue'), 0x00181082: ('IS', '1', "High R-R Value", '', 'HighRRValue'), 0x00181083: ('IS', '1', "Intervals Acquired", '', 'IntervalsAcquired'), 0x00181084: ('IS', '1', "Intervals Rejected", '', 'IntervalsRejected'), 0x00181085: ('LO', '1', "PVC Rejection", '', 'PVCRejection'), 0x00181086: ('IS', '1', "Skip Beats", '', 'SkipBeats'), 0x00181088: ('IS', '1', "Heart Rate", '', 'HeartRate'), 0x00181090: ('IS', '1', "Cardiac Number of Images", '', 'CardiacNumberOfImages'), 0x00181094: ('IS', '1', "Trigger Window", '', 'TriggerWindow'), 0x00181100: ('DS', '1', "Reconstruction Diameter", '', 'ReconstructionDiameter'), 0x00181110: ('DS', '1', "Distance Source to Detector", '', 'DistanceSourceToDetector'), 0x00181111: ('DS', '1', "Distance Source to Patient", '', 'DistanceSourceToPatient'), 0x00181114: ('DS', '1', "Estimated Radiographic Magnification Factor", '', 'EstimatedRadiographicMagnificationFactor'), 0x00181120: ('DS', '1', "Gantry/Detector Tilt", '', 'GantryDetectorTilt'), 0x00181121: ('DS', '1', "Gantry/Detector Slew", '', 'GantryDetectorSlew'), 0x00181130: ('DS', '1', "Table Height", '', 'TableHeight'), 0x00181131: ('DS', '1', "Table Traverse", '', 'TableTraverse'), 0x00181134: ('CS', '1', "Table Motion", '', 'TableMotion'), 0x00181135: ('DS', '1-n', "Table Vertical Increment", '', 'TableVerticalIncrement'), 0x00181136: ('DS', '1-n', "Table Lateral Increment", '', 'TableLateralIncrement'), 0x00181137: ('DS', '1-n', "Table Longitudinal Increment", '', 'TableLongitudinalIncrement'), 0x00181138: ('DS', '1', "Table Angle", '', 'TableAngle'), 0x0018113A: ('CS', '1', "Table Type", '', 'TableType'), 0x00181140: ('CS', '1', "Rotation Direction", '', 'RotationDirection'), 0x00181141: ('DS', '1', "Angular Position", 'Retired', 'AngularPosition'), 0x00181142: ('DS', '1-n', "Radial Position", '', 'RadialPosition'), 0x00181143: ('DS', '1', "Scan Arc", '', 'ScanArc'), 0x00181144: ('DS', '1', "Angular Step", '', 'AngularStep'), 0x00181145: ('DS', '1', "Center of Rotation Offset", '', 'CenterOfRotationOffset'), 0x00181146: ('DS', '1-n', "Rotation Offset", 'Retired', 'RotationOffset'), 0x00181147: ('CS', '1', "Field of View Shape", '', 'FieldOfViewShape'), 0x00181149: ('IS', '1-2', "Field of View Dimension(s)", '', 'FieldOfViewDimensions'), 0x00181150: ('IS', '1', "Exposure Time", '', 'ExposureTime'), 0x00181151: ('IS', '1', "X-Ray Tube Current", '', 'XRayTubeCurrent'), 0x00181152: ('IS', '1', "Exposure", '', 'Exposure'), 0x00181153: ('IS', '1', "Exposure in uAs", '', 'ExposureInuAs'), 0x00181154: ('DS', '1', "Average Pulse Width", '', 'AveragePulseWidth'), 0x00181155: ('CS', '1', "Radiation Setting", '', 'RadiationSetting'), 0x00181156: ('CS', '1', "Rectification Type", '', 'RectificationType'), 0x0018115A: ('CS', '1', "Radiation Mode", '', 'RadiationMode'), 0x0018115E: ('DS', '1', "Image and Fluoroscopy Area Dose Product", '', 'ImageAndFluoroscopyAreaDoseProduct'), 0x00181160: ('SH', '1', "Filter Type", '', 'FilterType'), 0x00181161: ('LO', '1-n', "Type of Filters", '', 'TypeOfFilters'), 0x00181162: ('DS', '1', "Intensifier Size", '', 'IntensifierSize'), 0x00181164: ('DS', '2', "Imager Pixel Spacing", '', 'ImagerPixelSpacing'), 0x00181166: ('CS', '1-n', "Grid", '', 'Grid'), 0x00181170: ('IS', '1', "Generator Power", '', 'GeneratorPower'), 0x00181180: ('SH', '1', "Collimator/grid Name", '', 'CollimatorGridName'), 0x00181181: ('CS', '1', "Collimator Type", '', 'CollimatorType'), 0x00181182: ('IS', '1-2', "Focal Distance", '', 'FocalDistance'), 0x00181183: ('DS', '1-2', "X Focus Center", '', 'XFocusCenter'), 0x00181184: ('DS', '1-2', "Y Focus Center", '', 'YFocusCenter'), 0x00181190: ('DS', '1-n', "Focal Spot(s)", '', 'FocalSpots'), 0x00181191: ('CS', '1', "Anode Target Material", '', 'AnodeTargetMaterial'), 0x001811A0: ('DS', '1', "Body Part Thickness", '', 'BodyPartThickness'), 0x001811A2: ('DS', '1', "Compression Force", '', 'CompressionForce'), 0x001811A3: ('DS', '1', "Compression Pressure", '', 'CompressionPressure'), 0x001811A4: ('LO', '1', "Paddle Description", '', 'PaddleDescription'), 0x001811A5: ('DS', '1', "Compression Contact Area", '', 'CompressionContactArea'), 0x001811B0: ('LO', '1', "Acquisition Mode", '', 'AcquisitionMode'), 0x001811B1: ('LO', '1', "Dose Mode Name", '', 'DoseModeName'), 0x001811B2: ('CS', '1', "Acquired Subtraction Mask Flag", '', 'AcquiredSubtractionMaskFlag'), 0x001811B3: ('CS', '1', "Fluoroscopy Persistence Flag", '', 'FluoroscopyPersistenceFlag'), 0x001811B4: ('CS', '1', "Fluoroscopy Last Image Hold Persistence Flag", '', 'FluoroscopyLastImageHoldPersistenceFlag'), 0x001811B5: ('IS', '1', "Upper Limit Number Of Persistent Fluoroscopy Frames", '', 'UpperLimitNumberOfPersistentFluoroscopyFrames'), 0x001811B6: ('CS', '1', "Contrast/Bolus Auto Injection Trigger Flag", '', 'ContrastBolusAutoInjectionTriggerFlag'), 0x001811B7: ('FD', '1', "Contrast/Bolus Injection Delay", '', 'ContrastBolusInjectionDelay'), 0x001811B8: ('SQ', '1', "XA Acquisition Phase Details Sequence", '', 'XAAcquisitionPhaseDetailsSequence'), 0x001811B9: ('FD', '1', "XA Acquisition Frame Rate", '', 'XAAcquisitionFrameRate'), 0x001811BA: ('SQ', '1', "XA Plane Details Sequence", '', 'XAPlaneDetailsSequence'), 0x001811BB: ('LO', '1', "Acquisition Field of View Label", '', 'AcquisitionFieldOfViewLabel'), 0x001811BC: ('SQ', '1', "X-Ray Filter Details Sequence", '', 'XRayFilterDetailsSequence'), 0x001811BD: ('FD', '1', "XA Acquisition Duration", '', 'XAAcquisitionDuration'), 0x001811BE: ('CS', '1', "Reconstruction Pipeline Type", '', 'ReconstructionPipelineType'), 0x001811BF: ('SQ', '1', "Image Filter Details Sequence", '', 'ImageFilterDetailsSequence'), 0x001811C0: ('CS', '1', "Applied Mask Subtraction Flag", '', 'AppliedMaskSubtractionFlag'), 0x001811C1: ('SQ', '1', "Requested Series Description Code Sequence", '', 'RequestedSeriesDescriptionCodeSequence'), 0x00181200: ('DA', '1-n', "Date of Last Calibration", '', 'DateOfLastCalibration'), 0x00181201: ('TM', '1-n', "Time of Last Calibration", '', 'TimeOfLastCalibration'), 0x00181202: ('DT', '1', "DateTime of Last Calibration", '', 'DateTimeOfLastCalibration'), 0x00181203: ('DT', '1', "Calibration DateTime", '', 'CalibrationDateTime'), 0x00181204: ('DA', '1', "Date of Manufacture", '', 'DateOfManufacture'), 0x00181205: ('DA', '1', "Date of Installation", '', 'DateOfInstallation'), 0x00181210: ('SH', '1-n', "Convolution Kernel", '', 'ConvolutionKernel'), 0x00181240: ('IS', '1-n', "Upper/Lower Pixel Values", 'Retired', 'UpperLowerPixelValues'), 0x00181242: ('IS', '1', "Actual Frame Duration", '', 'ActualFrameDuration'), 0x00181243: ('IS', '1', "Count Rate", '', 'CountRate'), 0x00181244: ('US', '1', "Preferred Playback Sequencing", '', 'PreferredPlaybackSequencing'), 0x00181250: ('SH', '1', "Receive Coil Name", '', 'ReceiveCoilName'), 0x00181251: ('SH', '1', "Transmit Coil Name", '', 'TransmitCoilName'), 0x00181260: ('SH', '1', "Plate Type", '', 'PlateType'), 0x00181261: ('LO', '1', "Phosphor Type", '', 'PhosphorType'), 0x00181271: ('FD', '1', "Water Equivalent Diameter", '', 'WaterEquivalentDiameter'), 0x00181272: ('SQ', '1', "Water Equivalent Diameter Calculation Method Code Sequence", '', 'WaterEquivalentDiameterCalculationMethodCodeSequence'), 0x00181300: ('DS', '1', "Scan Velocity", '', 'ScanVelocity'), 0x00181301: ('CS', '1-n', "Whole Body Technique", '', 'WholeBodyTechnique'), 0x00181302: ('IS', '1', "Scan Length", '', 'ScanLength'), 0x00181310: ('US', '4', "Acquisition Matrix", '', 'AcquisitionMatrix'), 0x00181312: ('CS', '1', "In-plane Phase Encoding Direction", '', 'InPlanePhaseEncodingDirection'), 0x00181314: ('DS', '1', "Flip Angle", '', 'FlipAngle'), 0x00181315: ('CS', '1', "Variable Flip Angle Flag", '', 'VariableFlipAngleFlag'), 0x00181316: ('DS', '1', "SAR", '', 'SAR'), 0x00181318: ('DS', '1', "dB/dt", '', 'dBdt'), 0x00181320: ('FL', '1', "B1rms", '', 'B1rms'), 0x00181400: ('LO', '1', "Acquisition Device Processing Description", '', 'AcquisitionDeviceProcessingDescription'), 0x00181401: ('LO', '1', "Acquisition Device Processing Code", '', 'AcquisitionDeviceProcessingCode'), 0x00181402: ('CS', '1', "Cassette Orientation", '', 'CassetteOrientation'), 0x00181403: ('CS', '1', "Cassette Size", '', 'CassetteSize'), 0x00181404: ('US', '1', "Exposures on Plate", '', 'ExposuresOnPlate'), 0x00181405: ('IS', '1', "Relative X-Ray Exposure", '', 'RelativeXRayExposure'), 0x00181411: ('DS', '1', "Exposure Index", '', 'ExposureIndex'), 0x00181412: ('DS', '1', "Target Exposure Index", '', 'TargetExposureIndex'), 0x00181413: ('DS', '1', "Deviation Index", '', 'DeviationIndex'), 0x00181450: ('DS', '1', "Column Angulation", '', 'ColumnAngulation'), 0x00181460: ('DS', '1', "Tomo Layer Height", '', 'TomoLayerHeight'), 0x00181470: ('DS', '1', "Tomo Angle", '', 'TomoAngle'), 0x00181480: ('DS', '1', "Tomo Time", '', 'TomoTime'), 0x00181490: ('CS', '1', "Tomo Type", '', 'TomoType'), 0x00181491: ('CS', '1', "Tomo Class", '', 'TomoClass'), 0x00181495: ('IS', '1', "Number of Tomosynthesis Source Images", '', 'NumberOfTomosynthesisSourceImages'), 0x00181500: ('CS', '1', "Positioner Motion", '', 'PositionerMotion'), 0x00181508: ('CS', '1', "Positioner Type", '', 'PositionerType'), 0x00181510: ('DS', '1', "Positioner Primary Angle", '', 'PositionerPrimaryAngle'), 0x00181511: ('DS', '1', "Positioner Secondary Angle", '', 'PositionerSecondaryAngle'), 0x00181520: ('DS', '1-n', "Positioner Primary Angle Increment", '', 'PositionerPrimaryAngleIncrement'), 0x00181521: ('DS', '1-n', "Positioner Secondary Angle Increment", '', 'PositionerSecondaryAngleIncrement'), 0x00181530: ('DS', '1', "Detector Primary Angle", '', 'DetectorPrimaryAngle'), 0x00181531: ('DS', '1', "Detector Secondary Angle", '', 'DetectorSecondaryAngle'), 0x00181600: ('CS', '1-3', "Shutter Shape", '', 'ShutterShape'), 0x00181602: ('IS', '1', "Shutter Left Vertical Edge", '', 'ShutterLeftVerticalEdge'), 0x00181604: ('IS', '1', "Shutter Right Vertical Edge", '', 'ShutterRightVerticalEdge'), 0x00181606: ('IS', '1', "Shutter Upper Horizontal Edge", '', 'ShutterUpperHorizontalEdge'), 0x00181608: ('IS', '1', "Shutter Lower Horizontal Edge", '', 'ShutterLowerHorizontalEdge'), 0x00181610: ('IS', '2', "Center of Circular Shutter", '', 'CenterOfCircularShutter'), 0x00181612: ('IS', '1', "Radius of Circular Shutter", '', 'RadiusOfCircularShutter'), 0x00181620: ('IS', '2-2n', "Vertices of the Polygonal Shutter", '', 'VerticesOfThePolygonalShutter'), 0x00181622: ('US', '1', "Shutter Presentation Value", '', 'ShutterPresentationValue'), 0x00181623: ('US', '1', "Shutter Overlay Group", '', 'ShutterOverlayGroup'), 0x00181624: ('US', '3', "Shutter Presentation Color CIELab Value", '', 'ShutterPresentationColorCIELabValue'), 0x00181630: ('CS', '1', "Outline Shape Type", '', 'OutlineShapeType'), 0x00181631: ('FD', '1', "Outline Left Vertical Edge", '', 'OutlineLeftVerticalEdge'), 0x00181632: ('FD', '1', "Outline Right Vertical Edge", '', 'OutlineRightVerticalEdge'), 0x00181633: ('FD', '1', "Outline Upper Horizontal Edge", '', 'OutlineUpperHorizontalEdge'), 0x00181634: ('FD', '1', "Outline Lower Horizontal Edge", '', 'OutlineLowerHorizontalEdge'), 0x00181635: ('FD', '2', "Center of Circular Outline", '', 'CenterOfCircularOutline'), 0x00181636: ('FD', '1', "Diameter of Circular Outline", '', 'DiameterOfCircularOutline'), 0x00181637: ('UL', '1', "Number of Polygonal Vertices", '', 'NumberOfPolygonalVertices'), 0x00181638: ('OF', '1', "Vertices of the Polygonal Outline", '', 'VerticesOfThePolygonalOutline'), 0x00181700: ('CS', '1-3', "Collimator Shape", '', 'CollimatorShape'), 0x00181702: ('IS', '1', "Collimator Left Vertical Edge", '', 'CollimatorLeftVerticalEdge'), 0x00181704: ('IS', '1', "Collimator Right Vertical Edge", '', 'CollimatorRightVerticalEdge'), 0x00181706: ('IS', '1', "Collimator Upper Horizontal Edge", '', 'CollimatorUpperHorizontalEdge'), 0x00181708: ('IS', '1', "Collimator Lower Horizontal Edge", '', 'CollimatorLowerHorizontalEdge'), 0x00181710: ('IS', '2', "Center of Circular Collimator", '', 'CenterOfCircularCollimator'), 0x00181712: ('IS', '1', "Radius of Circular Collimator", '', 'RadiusOfCircularCollimator'), 0x00181720: ('IS', '2-2n', "Vertices of the Polygonal Collimator", '', 'VerticesOfThePolygonalCollimator'), 0x00181800: ('CS', '1', "Acquisition Time Synchronized", '', 'AcquisitionTimeSynchronized'), 0x00181801: ('SH', '1', "Time Source", '', 'TimeSource'), 0x00181802: ('CS', '1', "Time Distribution Protocol", '', 'TimeDistributionProtocol'), 0x00181803: ('LO', '1', "NTP Source Address", '', 'NTPSourceAddress'), 0x00182001: ('IS', '1-n', "Page Number Vector", '', 'PageNumberVector'), 0x00182002: ('SH', '1-n', "Frame Label Vector", '', 'FrameLabelVector'), 0x00182003: ('DS', '1-n', "Frame Primary Angle Vector", '', 'FramePrimaryAngleVector'), 0x00182004: ('DS', '1-n', "Frame Secondary Angle Vector", '', 'FrameSecondaryAngleVector'), 0x00182005: ('DS', '1-n', "Slice Location Vector", '', 'SliceLocationVector'), 0x00182006: ('SH', '1-n', "Display Window Label Vector", '', 'DisplayWindowLabelVector'), 0x00182010: ('DS', '2', "Nominal Scanned Pixel Spacing", '', 'NominalScannedPixelSpacing'), 0x00182020: ('CS', '1', "Digitizing Device Transport Direction", '', 'DigitizingDeviceTransportDirection'), 0x00182030: ('DS', '1', "Rotation of Scanned Film", '', 'RotationOfScannedFilm'), 0x00182041: ('SQ', '1', "Biopsy Target Sequence", '', 'BiopsyTargetSequence'), 0x00182042: ('UI', '1', "Target UID", '', 'TargetUID'), 0x00182043: ('FL', '2', "Localizing Cursor Position", '', 'LocalizingCursorPosition'), 0x00182044: ('FL', '3', "Calculated Target Position", '', 'CalculatedTargetPosition'), 0x00182045: ('SH', '1', "Target Label", '', 'TargetLabel'), 0x00182046: ('FL', '1', "Displayed Z Value", '', 'DisplayedZValue'), 0x00183100: ('CS', '1', "IVUS Acquisition", '', 'IVUSAcquisition'), 0x00183101: ('DS', '1', "IVUS Pullback Rate", '', 'IVUSPullbackRate'), 0x00183102: ('DS', '1', "IVUS Gated Rate", '', 'IVUSGatedRate'), 0x00183103: ('IS', '1', "IVUS Pullback Start Frame Number", '', 'IVUSPullbackStartFrameNumber'), 0x00183104: ('IS', '1', "IVUS Pullback Stop Frame Number", '', 'IVUSPullbackStopFrameNumber'), 0x00183105: ('IS', '1-n', "Lesion Number", '', 'LesionNumber'), 0x00184000: ('LT', '1', "Acquisition Comments", 'Retired', 'AcquisitionComments'), 0x00185000: ('SH', '1-n', "Output Power", '', 'OutputPower'), 0x00185010: ('LO', '1-n', "Transducer Data", '', 'TransducerData'), 0x00185011: ('SQ', '1', "Transducer Identification Sequence", '', 'TransducerIdentificationSequence'), 0x00185012: ('DS', '1', "Focus Depth", '', 'FocusDepth'), 0x00185020: ('LO', '1', "Processing Function", '', 'ProcessingFunction'), 0x00185021: ('LO', '1', "Postprocessing Function", 'Retired', 'PostprocessingFunction'), 0x00185022: ('DS', '1', "Mechanical Index", '', 'MechanicalIndex'), 0x00185024: ('DS', '1', "Bone Thermal Index", '', 'BoneThermalIndex'), 0x00185026: ('DS', '1', "Cranial Thermal Index", '', 'CranialThermalIndex'), 0x00185027: ('DS', '1', "Soft Tissue Thermal Index", '', 'SoftTissueThermalIndex'), 0x00185028: ('DS', '1', "Soft Tissue-focus Thermal Index", '', 'SoftTissueFocusThermalIndex'), 0x00185029: ('DS', '1', "Soft Tissue-surface Thermal Index", '', 'SoftTissueSurfaceThermalIndex'), 0x00185030: ('DS', '1', "Dynamic Range", 'Retired', 'DynamicRange'), 0x00185040: ('DS', '1', "Total Gain", 'Retired', 'TotalGain'), 0x00185050: ('IS', '1', "Depth of Scan Field", '', 'DepthOfScanField'), 0x00185100: ('CS', '1', "Patient Position", '', 'PatientPosition'), 0x00185101: ('CS', '1', "View Position", '', 'ViewPosition'), 0x00185104: ('SQ', '1', "Projection Eponymous Name Code Sequence", '', 'ProjectionEponymousNameCodeSequence'), 0x00185210: ('DS', '6', "Image Transformation Matrix", 'Retired', 'ImageTransformationMatrix'), 0x00185212: ('DS', '3', "Image Translation Vector", 'Retired', 'ImageTranslationVector'), 0x00186000: ('DS', '1', "Sensitivity", '', 'Sensitivity'), 0x00186011: ('SQ', '1', "Sequence of Ultrasound Regions", '', 'SequenceOfUltrasoundRegions'), 0x00186012: ('US', '1', "Region Spatial Format", '', 'RegionSpatialFormat'), 0x00186014: ('US', '1', "Region Data Type", '', 'RegionDataType'), 0x00186016: ('UL', '1', "Region Flags", '', 'RegionFlags'), 0x00186018: ('UL', '1', "Region Location Min X0", '', 'RegionLocationMinX0'), 0x0018601A: ('UL', '1', "Region Location Min Y0", '', 'RegionLocationMinY0'), 0x0018601C: ('UL', '1', "Region Location Max X1", '', 'RegionLocationMaxX1'), 0x0018601E: ('UL', '1', "Region Location Max Y1", '', 'RegionLocationMaxY1'), 0x00186020: ('SL', '1', "Reference Pixel X0", '', 'ReferencePixelX0'), 0x00186022: ('SL', '1', "Reference Pixel Y0", '', 'ReferencePixelY0'), 0x00186024: ('US', '1', "Physical Units X Direction", '', 'PhysicalUnitsXDirection'), 0x00186026: ('US', '1', "Physical Units Y Direction", '', 'PhysicalUnitsYDirection'), 0x00186028: ('FD', '1', "Reference Pixel Physical Value X", '', 'ReferencePixelPhysicalValueX'), 0x0018602A: ('FD', '1', "Reference Pixel Physical Value Y", '', 'ReferencePixelPhysicalValueY'), 0x0018602C: ('FD', '1', "Physical Delta X", '', 'PhysicalDeltaX'), 0x0018602E: ('FD', '1', "Physical Delta Y", '', 'PhysicalDeltaY'), 0x00186030: ('UL', '1', "Transducer Frequency", '', 'TransducerFrequency'), 0x00186031: ('CS', '1', "Transducer Type", '', 'TransducerType'), 0x00186032: ('UL', '1', "Pulse Repetition Frequency", '', 'PulseRepetitionFrequency'), 0x00186034: ('FD', '1', "Doppler Correction Angle", '', 'DopplerCorrectionAngle'), 0x00186036: ('FD', '1', "Steering Angle", '', 'SteeringAngle'), 0x00186038: ('UL', '1', "Doppler Sample Volume X Position (Retired)", 'Retired', 'DopplerSampleVolumeXPositionRetired'), 0x00186039: ('SL', '1', "Doppler Sample Volume X Position", '', 'DopplerSampleVolumeXPosition'), 0x0018603A: ('UL', '1', "Doppler Sample Volume Y Position (Retired)", 'Retired', 'DopplerSampleVolumeYPositionRetired'), 0x0018603B: ('SL', '1', "Doppler Sample Volume Y Position", '', 'DopplerSampleVolumeYPosition'), 0x0018603C: ('UL', '1', "TM-Line Position X0 (Retired)", 'Retired', 'TMLinePositionX0Retired'), 0x0018603D: ('SL', '1', "TM-Line Position X0", '', 'TMLinePositionX0'), 0x0018603E: ('UL', '1', "TM-Line Position Y0 (Retired)", 'Retired', 'TMLinePositionY0Retired'), 0x0018603F: ('SL', '1', "TM-Line Position Y0", '', 'TMLinePositionY0'), 0x00186040: ('UL', '1', "TM-Line Position X1 (Retired)", 'Retired', 'TMLinePositionX1Retired'), 0x00186041: ('SL', '1', "TM-Line Position X1", '', 'TMLinePositionX1'), 0x00186042: ('UL', '1', "TM-Line Position Y1 (Retired)", 'Retired', 'TMLinePositionY1Retired'), 0x00186043: ('SL', '1', "TM-Line Position Y1", '', 'TMLinePositionY1'), 0x00186044: ('US', '1', "Pixel Component Organization", '', 'PixelComponentOrganization'), 0x00186046: ('UL', '1', "Pixel Component Mask", '', 'PixelComponentMask'), 0x00186048: ('UL', '1', "Pixel Component Range Start", '', 'PixelComponentRangeStart'), 0x0018604A: ('UL', '1', "Pixel Component Range Stop", '', 'PixelComponentRangeStop'), 0x0018604C: ('US', '1', "Pixel Component Physical Units", '', 'PixelComponentPhysicalUnits'), 0x0018604E: ('US', '1', "Pixel Component Data Type", '', 'PixelComponentDataType'), 0x00186050: ('UL', '1', "Number of Table Break Points", '', 'NumberOfTableBreakPoints'), 0x00186052: ('UL', '1-n', "Table of X Break Points", '', 'TableOfXBreakPoints'), 0x00186054: ('FD', '1-n', "Table of Y Break Points", '', 'TableOfYBreakPoints'), 0x00186056: ('UL', '1', "Number of Table Entries", '', 'NumberOfTableEntries'), 0x00186058: ('UL', '1-n', "Table of Pixel Values", '', 'TableOfPixelValues'), 0x0018605A: ('FL', '1-n', "Table of Parameter Values", '', 'TableOfParameterValues'), 0x00186060: ('FL', '1-n', "R Wave Time Vector", '', 'RWaveTimeVector'), 0x00186070: ('US', '1', "Active Image Area Overlay Group", '', 'ActiveImageAreaOverlayGroup'), 0x00187000: ('CS', '1', "Detector Conditions Nominal Flag", '', 'DetectorConditionsNominalFlag'), 0x00187001: ('DS', '1', "Detector Temperature", '', 'DetectorTemperature'), 0x00187004: ('CS', '1', "Detector Type", '', 'DetectorType'), 0x00187005: ('CS', '1', "Detector Configuration", '', 'DetectorConfiguration'), 0x00187006: ('LT', '1', "Detector Description", '', 'DetectorDescription'), 0x00187008: ('LT', '1', "Detector Mode", '', 'DetectorMode'), 0x0018700A: ('SH', '1', "Detector ID", '', 'DetectorID'), 0x0018700C: ('DA', '1', "Date of Last Detector Calibration", '', 'DateOfLastDetectorCalibration'), 0x0018700E: ('TM', '1', "Time of Last Detector Calibration", '', 'TimeOfLastDetectorCalibration'), 0x00187010: ('IS', '1', "Exposures on Detector Since Last Calibration", '', 'ExposuresOnDetectorSinceLastCalibration'), 0x00187011: ('IS', '1', "Exposures on Detector Since Manufactured", '', 'ExposuresOnDetectorSinceManufactured'), 0x00187012: ('DS', '1', "Detector Time Since Last Exposure", '', 'DetectorTimeSinceLastExposure'), 0x00187014: ('DS', '1', "Detector Active Time", '', 'DetectorActiveTime'), 0x00187016: ('DS', '1', "Detector Activation Offset From Exposure", '', 'DetectorActivationOffsetFromExposure'), 0x0018701A: ('DS', '2', "Detector Binning", '', 'DetectorBinning'), 0x00187020: ('DS', '2', "Detector Element Physical Size", '', 'DetectorElementPhysicalSize'), 0x00187022: ('DS', '2', "Detector Element Spacing", '', 'DetectorElementSpacing'), 0x00187024: ('CS', '1', "Detector Active Shape", '', 'DetectorActiveShape'), 0x00187026: ('DS', '1-2', "Detector Active Dimension(s)", '', 'DetectorActiveDimensions'), 0x00187028: ('DS', '2', "Detector Active Origin", '', 'DetectorActiveOrigin'), 0x0018702A: ('LO', '1', "Detector Manufacturer Name", '', 'DetectorManufacturerName'), 0x0018702B: ('LO', '1', "Detector Manufacturer's Model Name", '', 'DetectorManufacturerModelName'), 0x00187030: ('DS', '2', "Field of View Origin", '', 'FieldOfViewOrigin'), 0x00187032: ('DS', '1', "Field of View Rotation", '', 'FieldOfViewRotation'), 0x00187034: ('CS', '1', "Field of View Horizontal Flip", '', 'FieldOfViewHorizontalFlip'), 0x00187036: ('FL', '2', "Pixel Data Area Origin Relative To FOV", '', 'PixelDataAreaOriginRelativeToFOV'), 0x00187038: ('FL', '1', "Pixel Data Area Rotation Angle Relative To FOV", '', 'PixelDataAreaRotationAngleRelativeToFOV'), 0x00187040: ('LT', '1', "Grid Absorbing Material", '', 'GridAbsorbingMaterial'), 0x00187041: ('LT', '1', "Grid Spacing Material", '', 'GridSpacingMaterial'), 0x00187042: ('DS', '1', "Grid Thickness", '', 'GridThickness'), 0x00187044: ('DS', '1', "Grid Pitch", '', 'GridPitch'), 0x00187046: ('IS', '2', "Grid Aspect Ratio", '', 'GridAspectRatio'), 0x00187048: ('DS', '1', "Grid Period", '', 'GridPeriod'), 0x0018704C: ('DS', '1', "Grid Focal Distance", '', 'GridFocalDistance'), 0x00187050: ('CS', '1-n', "Filter Material", '', 'FilterMaterial'), 0x00187052: ('DS', '1-n', "Filter Thickness Minimum", '', 'FilterThicknessMinimum'), 0x00187054: ('DS', '1-n', "Filter Thickness Maximum", '', 'FilterThicknessMaximum'), 0x00187056: ('FL', '1-n', "Filter Beam Path Length Minimum", '', 'FilterBeamPathLengthMinimum'), 0x00187058: ('FL', '1-n', "Filter Beam Path Length Maximum", '', 'FilterBeamPathLengthMaximum'), 0x00187060: ('CS', '1', "Exposure Control Mode", '', 'ExposureControlMode'), 0x00187062: ('LT', '1', "Exposure Control Mode Description", '', 'ExposureControlModeDescription'), 0x00187064: ('CS', '1', "Exposure Status", '', 'ExposureStatus'), 0x00187065: ('DS', '1', "Phototimer Setting", '', 'PhototimerSetting'), 0x00188150: ('DS', '1', "Exposure Time in uS", '', 'ExposureTimeInuS'), 0x00188151: ('DS', '1', "X-Ray Tube Current in uA", '', 'XRayTubeCurrentInuA'), 0x00189004: ('CS', '1', "Content Qualification", '', 'ContentQualification'), 0x00189005: ('SH', '1', "Pulse Sequence Name", '', 'PulseSequenceName'), 0x00189006: ('SQ', '1', "MR Imaging Modifier Sequence", '', 'MRImagingModifierSequence'), 0x00189008: ('CS', '1', "Echo Pulse Sequence", '', 'EchoPulseSequence'), 0x00189009: ('CS', '1', "Inversion Recovery", '', 'InversionRecovery'), 0x00189010: ('CS', '1', "Flow Compensation", '', 'FlowCompensation'), 0x00189011: ('CS', '1', "Multiple Spin Echo", '', 'MultipleSpinEcho'), 0x00189012: ('CS', '1', "Multi-planar Excitation", '', 'MultiPlanarExcitation'), 0x00189014: ('CS', '1', "Phase Contrast", '', 'PhaseContrast'), 0x00189015: ('CS', '1', "Time of Flight Contrast", '', 'TimeOfFlightContrast'), 0x00189016: ('CS', '1', "Spoiling", '', 'Spoiling'), 0x00189017: ('CS', '1', "Steady State Pulse Sequence", '', 'SteadyStatePulseSequence'), 0x00189018: ('CS', '1', "Echo Planar Pulse Sequence", '', 'EchoPlanarPulseSequence'), 0x00189019: ('FD', '1', "Tag Angle First Axis", '', 'TagAngleFirstAxis'), 0x00189020: ('CS', '1', "Magnetization Transfer", '', 'MagnetizationTransfer'), 0x00189021: ('CS', '1', "T2 Preparation", '', 'T2Preparation'), 0x00189022: ('CS', '1', "Blood Signal Nulling", '', 'BloodSignalNulling'), 0x00189024: ('CS', '1', "Saturation Recovery", '', 'SaturationRecovery'), 0x00189025: ('CS', '1', "Spectrally Selected Suppression", '', 'SpectrallySelectedSuppression'), 0x00189026: ('CS', '1', "Spectrally Selected Excitation", '', 'SpectrallySelectedExcitation'), 0x00189027: ('CS', '1', "Spatial Pre-saturation", '', 'SpatialPresaturation'), 0x00189028: ('CS', '1', "Tagging", '', 'Tagging'), 0x00189029: ('CS', '1', "Oversampling Phase", '', 'OversamplingPhase'), 0x00189030: ('FD', '1', "Tag Spacing First Dimension", '', 'TagSpacingFirstDimension'), 0x00189032: ('CS', '1', "Geometry of k-Space Traversal", '', 'GeometryOfKSpaceTraversal'), 0x00189033: ('CS', '1', "Segmented k-Space Traversal", '', 'SegmentedKSpaceTraversal'), 0x00189034: ('CS', '1', "Rectilinear Phase Encode Reordering", '', 'RectilinearPhaseEncodeReordering'), 0x00189035: ('FD', '1', "Tag Thickness", '', 'TagThickness'), 0x00189036: ('CS', '1', "Partial Fourier Direction", '', 'PartialFourierDirection'), 0x00189037: ('CS', '1', "Cardiac Synchronization Technique", '', 'CardiacSynchronizationTechnique'), 0x00189041: ('LO', '1', "Receive Coil Manufacturer Name", '', 'ReceiveCoilManufacturerName'), 0x00189042: ('SQ', '1', "MR Receive Coil Sequence", '', 'MRReceiveCoilSequence'), 0x00189043: ('CS', '1', "Receive Coil Type", '', 'ReceiveCoilType'), 0x00189044: ('CS', '1', "Quadrature Receive Coil", '', 'QuadratureReceiveCoil'), 0x00189045: ('SQ', '1', "Multi-Coil Definition Sequence", '', 'MultiCoilDefinitionSequence'), 0x00189046: ('LO', '1', "Multi-Coil Configuration", '', 'MultiCoilConfiguration'), 0x00189047: ('SH', '1', "Multi-Coil Element Name", '', 'MultiCoilElementName'), 0x00189048: ('CS', '1', "Multi-Coil Element Used", '', 'MultiCoilElementUsed'), 0x00189049: ('SQ', '1', "MR Transmit Coil Sequence", '', 'MRTransmitCoilSequence'), 0x00189050: ('LO', '1', "Transmit Coil Manufacturer Name", '', 'TransmitCoilManufacturerName'), 0x00189051: ('CS', '1', "Transmit Coil Type", '', 'TransmitCoilType'), 0x00189052: ('FD', '1-2', "Spectral Width", '', 'SpectralWidth'), 0x00189053: ('FD', '1-2', "Chemical Shift Reference", '', 'ChemicalShiftReference'), 0x00189054: ('CS', '1', "Volume Localization Technique", '', 'VolumeLocalizationTechnique'), 0x00189058: ('US', '1', "MR Acquisition Frequency Encoding Steps", '', 'MRAcquisitionFrequencyEncodingSteps'), 0x00189059: ('CS', '1', "De-coupling", '', 'Decoupling'), 0x00189060: ('CS', '1-2', "De-coupled Nucleus", '', 'DecoupledNucleus'), 0x00189061: ('FD', '1-2', "De-coupling Frequency", '', 'DecouplingFrequency'), 0x00189062: ('CS', '1', "De-coupling Method", '', 'DecouplingMethod'), 0x00189063: ('FD', '1-2', "De-coupling Chemical Shift Reference", '', 'DecouplingChemicalShiftReference'), 0x00189064: ('CS', '1', "k-space Filtering", '', 'KSpaceFiltering'), 0x00189065: ('CS', '1-2', "Time Domain Filtering", '', 'TimeDomainFiltering'), 0x00189066: ('US', '1-2', "Number of Zero Fills", '', 'NumberOfZeroFills'), 0x00189067: ('CS', '1', "Baseline Correction", '', 'BaselineCorrection'), 0x00189069: ('FD', '1', "Parallel Reduction Factor In-plane", '', 'ParallelReductionFactorInPlane'), 0x00189070: ('FD', '1', "Cardiac R-R Interval Specified", '', 'CardiacRRIntervalSpecified'), 0x00189073: ('FD', '1', "Acquisition Duration", '', 'AcquisitionDuration'), 0x00189074: ('DT', '1', "Frame Acquisition DateTime", '', 'FrameAcquisitionDateTime'), 0x00189075: ('CS', '1', "Diffusion Directionality", '', 'DiffusionDirectionality'), 0x00189076: ('SQ', '1', "Diffusion Gradient Direction Sequence", '', 'DiffusionGradientDirectionSequence'), 0x00189077: ('CS', '1', "Parallel Acquisition", '', 'ParallelAcquisition'), 0x00189078: ('CS', '1', "Parallel Acquisition Technique", '', 'ParallelAcquisitionTechnique'), 0x00189079: ('FD', '1-n', "Inversion Times", '', 'InversionTimes'), 0x00189080: ('ST', '1', "Metabolite Map Description", '', 'MetaboliteMapDescription'), 0x00189081: ('CS', '1', "Partial Fourier", '', 'PartialFourier'), 0x00189082: ('FD', '1', "Effective Echo Time", '', 'EffectiveEchoTime'), 0x00189083: ('SQ', '1', "Metabolite Map Code Sequence", '', 'MetaboliteMapCodeSequence'), 0x00189084: ('SQ', '1', "Chemical Shift Sequence", '', 'ChemicalShiftSequence'), 0x00189085: ('CS', '1', "Cardiac Signal Source", '', 'CardiacSignalSource'), 0x00189087: ('FD', '1', "Diffusion b-value", '', 'DiffusionBValue'), 0x00189089: ('FD', '3', "Diffusion Gradient Orientation", '', 'DiffusionGradientOrientation'), 0x00189090: ('FD', '3', "Velocity Encoding Direction", '', 'VelocityEncodingDirection'), 0x00189091: ('FD', '1', "Velocity Encoding Minimum Value", '', 'VelocityEncodingMinimumValue'), 0x00189092: ('SQ', '1', "Velocity Encoding Acquisition Sequence", '', 'VelocityEncodingAcquisitionSequence'), 0x00189093: ('US', '1', "Number of k-Space Trajectories", '', 'NumberOfKSpaceTrajectories'), 0x00189094: ('CS', '1', "Coverage of k-Space", '', 'CoverageOfKSpace'), 0x00189095: ('UL', '1', "Spectroscopy Acquisition Phase Rows", '', 'SpectroscopyAcquisitionPhaseRows'), 0x00189096: ('FD', '1', "Parallel Reduction Factor In-plane (Retired)", 'Retired', 'ParallelReductionFactorInPlaneRetired'), 0x00189098: ('FD', '1-2', "Transmitter Frequency", '', 'TransmitterFrequency'), 0x00189100: ('CS', '1-2', "Resonant Nucleus", '', 'ResonantNucleus'), 0x00189101: ('CS', '1', "Frequency Correction", '', 'FrequencyCorrection'), 0x00189103: ('SQ', '1', "MR Spectroscopy FOV/Geometry Sequence", '', 'MRSpectroscopyFOVGeometrySequence'), 0x00189104: ('FD', '1', "Slab Thickness", '', 'SlabThickness'), 0x00189105: ('FD', '3', "Slab Orientation", '', 'SlabOrientation'), 0x00189106: ('FD', '3', "Mid Slab Position", '', 'MidSlabPosition'), 0x00189107: ('SQ', '1', "MR Spatial Saturation Sequence", '', 'MRSpatialSaturationSequence'), 0x00189112: ('SQ', '1', "MR Timing and Related Parameters Sequence", '', 'MRTimingAndRelatedParametersSequence'), 0x00189114: ('SQ', '1', "MR Echo Sequence", '', 'MREchoSequence'), 0x00189115: ('SQ', '1', "MR Modifier Sequence", '', 'MRModifierSequence'), 0x00189117: ('SQ', '1', "MR Diffusion Sequence", '', 'MRDiffusionSequence'), 0x00189118: ('SQ', '1', "Cardiac Synchronization Sequence", '', 'CardiacSynchronizationSequence'), 0x00189119: ('SQ', '1', "MR Averages Sequence", '', 'MRAveragesSequence'), 0x00189125: ('SQ', '1', "MR FOV/Geometry Sequence", '', 'MRFOVGeometrySequence'), 0x00189126: ('SQ', '1', "Volume Localization Sequence", '', 'VolumeLocalizationSequence'), 0x00189127: ('UL', '1', "Spectroscopy Acquisition Data Columns", '', 'SpectroscopyAcquisitionDataColumns'), 0x00189147: ('CS', '1', "Diffusion Anisotropy Type", '', 'DiffusionAnisotropyType'), 0x00189151: ('DT', '1', "Frame Reference DateTime", '', 'FrameReferenceDateTime'), 0x00189152: ('SQ', '1', "MR Metabolite Map Sequence", '', 'MRMetaboliteMapSequence'), 0x00189155: ('FD', '1', "Parallel Reduction Factor out-of-plane", '', 'ParallelReductionFactorOutOfPlane'), 0x00189159: ('UL', '1', "Spectroscopy Acquisition Out-of-plane Phase Steps", '', 'SpectroscopyAcquisitionOutOfPlanePhaseSteps'), 0x00189166: ('CS', '1', "Bulk Motion Status", 'Retired', 'BulkMotionStatus'), 0x00189168: ('FD', '1', "Parallel Reduction Factor Second In-plane", '', 'ParallelReductionFactorSecondInPlane'), 0x00189169: ('CS', '1', "Cardiac Beat Rejection Technique", '', 'CardiacBeatRejectionTechnique'), 0x00189170: ('CS', '1', "Respiratory Motion Compensation Technique", '', 'RespiratoryMotionCompensationTechnique'), 0x00189171: ('CS', '1', "Respiratory Signal Source", '', 'RespiratorySignalSource'), 0x00189172: ('CS', '1', "Bulk Motion Compensation Technique", '', 'BulkMotionCompensationTechnique'), 0x00189173: ('CS', '1', "Bulk Motion Signal Source", '', 'BulkMotionSignalSource'), 0x00189174: ('CS', '1', "Applicable Safety Standard Agency", '', 'ApplicableSafetyStandardAgency'), 0x00189175: ('LO', '1', "Applicable Safety Standard Description", '', 'ApplicableSafetyStandardDescription'), 0x00189176: ('SQ', '1', "Operating Mode Sequence", '', 'OperatingModeSequence'), 0x00189177: ('CS', '1', "Operating Mode Type", '', 'OperatingModeType'), 0x00189178: ('CS', '1', "Operating Mode", '', 'OperatingMode'), 0x00189179: ('CS', '1', "Specific Absorption Rate Definition", '', 'SpecificAbsorptionRateDefinition'), 0x00189180: ('CS', '1', "Gradient Output Type", '', 'GradientOutputType'), 0x00189181: ('FD', '1', "Specific Absorption Rate Value", '', 'SpecificAbsorptionRateValue'), 0x00189182: ('FD', '1', "Gradient Output", '', 'GradientOutput'), 0x00189183: ('CS', '1', "Flow Compensation Direction", '', 'FlowCompensationDirection'), 0x00189184: ('FD', '1', "Tagging Delay", '', 'TaggingDelay'), 0x00189185: ('ST', '1', "Respiratory Motion Compensation Technique Description", '', 'RespiratoryMotionCompensationTechniqueDescription'), 0x00189186: ('SH', '1', "Respiratory Signal Source ID", '', 'RespiratorySignalSourceID'), 0x00189195: ('FD', '1', "Chemical Shift Minimum Integration Limit in Hz", 'Retired', 'ChemicalShiftMinimumIntegrationLimitInHz'), 0x00189196: ('FD', '1', "Chemical Shift Maximum Integration Limit in Hz", 'Retired', 'ChemicalShiftMaximumIntegrationLimitInHz'), 0x00189197: ('SQ', '1', "MR Velocity Encoding Sequence", '', 'MRVelocityEncodingSequence'), 0x00189198: ('CS', '1', "First Order Phase Correction", '', 'FirstOrderPhaseCorrection'), 0x00189199: ('CS', '1', "Water Referenced Phase Correction", '', 'WaterReferencedPhaseCorrection'), 0x00189200: ('CS', '1', "MR Spectroscopy Acquisition Type", '', 'MRSpectroscopyAcquisitionType'), 0x00189214: ('CS', '1', "Respiratory Cycle Position", '', 'RespiratoryCyclePosition'), 0x00189217: ('FD', '1', "Velocity Encoding Maximum Value", '', 'VelocityEncodingMaximumValue'), 0x00189218: ('FD', '1', "Tag Spacing Second Dimension", '', 'TagSpacingSecondDimension'), 0x00189219: ('SS', '1', "Tag Angle Second Axis", '', 'TagAngleSecondAxis'), 0x00189220: ('FD', '1', "Frame Acquisition Duration", '', 'FrameAcquisitionDuration'), 0x00189226: ('SQ', '1', "MR Image Frame Type Sequence", '', 'MRImageFrameTypeSequence'), 0x00189227: ('SQ', '1', "MR Spectroscopy Frame Type Sequence", '', 'MRSpectroscopyFrameTypeSequence'), 0x00189231: ('US', '1', "MR Acquisition Phase Encoding Steps in-plane", '', 'MRAcquisitionPhaseEncodingStepsInPlane'), 0x00189232: ('US', '1', "MR Acquisition Phase Encoding Steps out-of-plane", '', 'MRAcquisitionPhaseEncodingStepsOutOfPlane'), 0x00189234: ('UL', '1', "Spectroscopy Acquisition Phase Columns", '', 'SpectroscopyAcquisitionPhaseColumns'), 0x00189236: ('CS', '1', "Cardiac Cycle Position", '', 'CardiacCyclePosition'), 0x00189239: ('SQ', '1', "Specific Absorption Rate Sequence", '', 'SpecificAbsorptionRateSequence'), 0x00189240: ('US', '1', "RF Echo Train Length", '', 'RFEchoTrainLength'), 0x00189241: ('US', '1', "Gradient Echo Train Length", '', 'GradientEchoTrainLength'), 0x00189250: ('CS', '1', "Arterial Spin Labeling Contrast", '', 'ArterialSpinLabelingContrast'), 0x00189251: ('SQ', '1', "MR Arterial Spin Labeling Sequence", '', 'MRArterialSpinLabelingSequence'), 0x00189252: ('LO', '1', "ASL Technique Description", '', 'ASLTechniqueDescription'), 0x00189253: ('US', '1', "ASL Slab Number", '', 'ASLSlabNumber'), 0x00189254: ('FD', '1', "ASL Slab Thickness", '', 'ASLSlabThickness'), 0x00189255: ('FD', '3', "ASL Slab Orientation", '', 'ASLSlabOrientation'), 0x00189256: ('FD', '3', "ASL Mid Slab Position", '', 'ASLMidSlabPosition'), 0x00189257: ('CS', '1', "ASL Context", '', 'ASLContext'), 0x00189258: ('UL', '1', "ASL Pulse Train Duration", '', 'ASLPulseTrainDuration'), 0x00189259: ('CS', '1', "ASL Crusher Flag", '', 'ASLCrusherFlag'), 0x0018925A: ('FD', '1', "ASL Crusher Flow Limit", '', 'ASLCrusherFlowLimit'), 0x0018925B: ('LO', '1', "ASL Crusher Description", '', 'ASLCrusherDescription'), 0x0018925C: ('CS', '1', "ASL Bolus Cut-off Flag", '', 'ASLBolusCutoffFlag'), 0x0018925D: ('SQ', '1', "ASL Bolus Cut-off Timing Sequence", '', 'ASLBolusCutoffTimingSequence'), 0x0018925E: ('LO', '1', "ASL Bolus Cut-off Technique", '', 'ASLBolusCutoffTechnique'), 0x0018925F: ('UL', '1', "ASL Bolus Cut-off Delay Time", '', 'ASLBolusCutoffDelayTime'), 0x00189260: ('SQ', '1', "ASL Slab Sequence", '', 'ASLSlabSequence'), 0x00189295: ('FD', '1', "Chemical Shift Minimum Integration Limit in ppm", '', 'ChemicalShiftMinimumIntegrationLimitInppm'), 0x00189296: ('FD', '1', "Chemical Shift Maximum Integration Limit in ppm", '', 'ChemicalShiftMaximumIntegrationLimitInppm'), 0x00189297: ('CS', '1', "Water Reference Acquisition", '', 'WaterReferenceAcquisition'), 0x00189298: ('IS', '1', "Echo Peak Position", '', 'EchoPeakPosition'), 0x00189301: ('SQ', '1', "CT Acquisition Type Sequence", '', 'CTAcquisitionTypeSequence'), 0x00189302: ('CS', '1', "Acquisition Type", '', 'AcquisitionType'), 0x00189303: ('FD', '1', "Tube Angle", '', 'TubeAngle'), 0x00189304: ('SQ', '1', "CT Acquisition Details Sequence", '', 'CTAcquisitionDetailsSequence'), 0x00189305: ('FD', '1', "Revolution Time", '', 'RevolutionTime'), 0x00189306: ('FD', '1', "Single Collimation Width", '', 'SingleCollimationWidth'), 0x00189307: ('FD', '1', "Total Collimation Width", '', 'TotalCollimationWidth'), 0x00189308: ('SQ', '1', "CT Table Dynamics Sequence", '', 'CTTableDynamicsSequence'), 0x00189309: ('FD', '1', "Table Speed", '', 'TableSpeed'), 0x00189310: ('FD', '1', "Table Feed per Rotation", '', 'TableFeedPerRotation'), 0x00189311: ('FD', '1', "Spiral Pitch Factor", '', 'SpiralPitchFactor'), 0x00189312: ('SQ', '1', "CT Geometry Sequence", '', 'CTGeometrySequence'), 0x00189313: ('FD', '3', "Data Collection Center (Patient)", '', 'DataCollectionCenterPatient'), 0x00189314: ('SQ', '1', "CT Reconstruction Sequence", '', 'CTReconstructionSequence'), 0x00189315: ('CS', '1', "Reconstruction Algorithm", '', 'ReconstructionAlgorithm'), 0x00189316: ('CS', '1', "Convolution Kernel Group", '', 'ConvolutionKernelGroup'), 0x00189317: ('FD', '2', "Reconstruction Field of View", '', 'ReconstructionFieldOfView'), 0x00189318: ('FD', '3', "Reconstruction Target Center (Patient)", '', 'ReconstructionTargetCenterPatient'), 0x00189319: ('FD', '1', "Reconstruction Angle", '', 'ReconstructionAngle'), 0x00189320: ('SH', '1', "Image Filter", '', 'ImageFilter'), 0x00189321: ('SQ', '1', "CT Exposure Sequence", '', 'CTExposureSequence'), 0x00189322: ('FD', '2', "Reconstruction Pixel Spacing", '', 'ReconstructionPixelSpacing'), 0x00189323: ('CS', '1-n', "Exposure Modulation Type", '', 'ExposureModulationType'), 0x00189324: ('FD', '1', "Estimated Dose Saving", 'Retired', 'EstimatedDoseSaving'), 0x00189325: ('SQ', '1', "CT X-Ray Details Sequence", '', 'CTXRayDetailsSequence'), 0x00189326: ('SQ', '1', "CT Position Sequence", '', 'CTPositionSequence'), 0x00189327: ('FD', '1', "Table Position", '', 'TablePosition'), 0x00189328: ('FD', '1', "Exposure Time in ms", '', 'ExposureTimeInms'), 0x00189329: ('SQ', '1', "CT Image Frame Type Sequence", '', 'CTImageFrameTypeSequence'), 0x00189330: ('FD', '1', "X-Ray Tube Current in mA", '', 'XRayTubeCurrentInmA'), 0x00189332: ('FD', '1', "Exposure in mAs", '', 'ExposureInmAs'), 0x00189333: ('CS', '1', "Constant Volume Flag", '', 'ConstantVolumeFlag'), 0x00189334: ('CS', '1', "Fluoroscopy Flag", '', 'FluoroscopyFlag'), 0x00189335: ('FD', '1', "Distance Source to Data Collection Center", '', 'DistanceSourceToDataCollectionCenter'), 0x00189337: ('US', '1', "Contrast/Bolus Agent Number", '', 'ContrastBolusAgentNumber'), 0x00189338: ('SQ', '1', "Contrast/Bolus Ingredient Code Sequence", '', 'ContrastBolusIngredientCodeSequence'), 0x00189340: ('SQ', '1', "Contrast Administration Profile Sequence", '', 'ContrastAdministrationProfileSequence'), 0x00189341: ('SQ', '1', "Contrast/Bolus Usage Sequence", '', 'ContrastBolusUsageSequence'), 0x00189342: ('CS', '1', "Contrast/Bolus Agent Administered", '', 'ContrastBolusAgentAdministered'), 0x00189343: ('CS', '1', "Contrast/Bolus Agent Detected", '', 'ContrastBolusAgentDetected'), 0x00189344: ('CS', '1', "Contrast/Bolus Agent Phase", '', 'ContrastBolusAgentPhase'), 0x00189345: ('FD', '1', "CTDIvol", '', 'CTDIvol'), 0x00189346: ('SQ', '1', "CTDI Phantom Type Code Sequence", '', 'CTDIPhantomTypeCodeSequence'), 0x00189351: ('FL', '1', "Calcium Scoring Mass Factor Patient", '', 'CalciumScoringMassFactorPatient'), 0x00189352: ('FL', '3', "Calcium Scoring Mass Factor Device", '', 'CalciumScoringMassFactorDevice'), 0x00189353: ('FL', '1', "Energy Weighting Factor", '', 'EnergyWeightingFactor'), 0x00189360: ('SQ', '1', "CT Additional X-Ray Source Sequence", '', 'CTAdditionalXRaySourceSequence'), 0x00189361: ('CS', '1', "Multi-energy CT Acquisition", '', 'MultienergyCTAcquisition'), 0x00189362: ('SQ', '1', "Multi-energy CT Acquisition Sequence", '', 'MultienergyCTAcquisitionSequence'), 0x00189363: ('SQ', '1', "Multi-energy CT Processing Sequence", '', 'MultienergyCTProcessingSequence'), 0x00189364: ('SQ', '1', "Multi-energy CT Characteristics Sequence", '', 'MultienergyCTCharacteristicsSequence'), 0x00189365: ('SQ', '1', "Multi-energy CT X-Ray Source Sequence", '', 'MultienergyCTXRaySourceSequence'), 0x00189366: ('US', '1', "X-Ray Source Index", '', 'XRaySourceIndex'), 0x00189367: ('UC', '1', "X-Ray Source ID", '', 'XRaySourceID'), 0x00189368: ('CS', '1', "Multi-energy Source Technique", '', 'MultienergySourceTechnique'), 0x00189369: ('DT', '1', "Source Start DateTime", '', 'SourceStartDateTime'), 0x0018936A: ('DT', '1', "Source End DateTime", '', 'SourceEndDateTime'), 0x0018936B: ('US', '1', "Switching Phase Number", '', 'SwitchingPhaseNumber'), 0x0018936C: ('DS', '1', "Switching Phase Nominal Duration", '', 'SwitchingPhaseNominalDuration'), 0x0018936D: ('DS', '1', "Switching Phase Transition Duration", '', 'SwitchingPhaseTransitionDuration'), 0x0018936E: ('DS', '1', "Effective Bin Energy", '', 'EffectiveBinEnergy'), 0x0018936F: ('SQ', '1', "Multi-energy CT X-Ray Detector Sequence", '', 'MultienergyCTXRayDetectorSequence'), 0x00189370: ('US', '1', "X-Ray Detector Index", '', 'XRayDetectorIndex'), 0x00189371: ('UC', '1', "X-Ray Detector ID", '', 'XRayDetectorID'), 0x00189372: ('CS', '1', "Multi-energy Detector Type", '', 'MultienergyDetectorType'), 0x00189373: ('ST', '1', "X-Ray Detector Label", '', 'XRayDetectorLabel'), 0x00189374: ('DS', '1', "Nominal Max Energy", '', 'NominalMaxEnergy'), 0x00189375: ('DS', '1', "Nominal Min Energy", '', 'NominalMinEnergy'), 0x00189376: ('US', '1-n', "Referenced X-Ray Detector Index", '', 'ReferencedXRayDetectorIndex'), 0x00189377: ('US', '1-n', "Referenced X-Ray Source Index", '', 'ReferencedXRaySourceIndex'), 0x00189378: ('US', '1-n', "Referenced Path Index", '', 'ReferencedPathIndex'), 0x00189379: ('SQ', '1', "Multi-energy CT Path Sequence", '', 'MultienergyCTPathSequence'), 0x0018937A: ('US', '1', "Multi-energy CT Path Index", '', 'MultienergyCTPathIndex'), 0x0018937B: ('UT', '1', "Multi-energy Acquisition Description", '', 'MultienergyAcquisitionDescription'), 0x0018937C: ('FD', '1', "Monoenergetic Energy Equivalent", '', 'MonoenergeticEnergyEquivalent'), 0x0018937D: ('SQ', '1', "Material Code Sequence", '', 'MaterialCodeSequence'), 0x0018937E: ('CS', '1', "Decomposition Method", '', 'DecompositionMethod'), 0x0018937F: ('UT', '1', "Decomposition Description", '', 'DecompositionDescription'), 0x00189380: ('SQ', '1', "Decomposition Algorithm Identification Sequence", '', 'DecompositionAlgorithmIdentificationSequence'), 0x00189381: ('SQ', '1', "Decomposition Material Sequence", '', 'DecompositionMaterialSequence'), 0x00189382: ('SQ', '1', "Material Attenuation Sequence", '', 'MaterialAttenuationSequence'), 0x00189383: ('DS', '1', "Photon Energy", '', 'PhotonEnergy'), 0x00189384: ('DS', '1', "X-Ray Mass Attenuation Coefficient", '', 'XRayMassAttenuationCoefficient'), 0x00189401: ('SQ', '1', "Projection Pixel Calibration Sequence", '', 'ProjectionPixelCalibrationSequence'), 0x00189402: ('FL', '1', "Distance Source to Isocenter", '', 'DistanceSourceToIsocenter'), 0x00189403: ('FL', '1', "Distance Object to Table Top", '', 'DistanceObjectToTableTop'), 0x00189404: ('FL', '2', "Object Pixel Spacing in Center of Beam", '', 'ObjectPixelSpacingInCenterOfBeam'), 0x00189405: ('SQ', '1', "Positioner Position Sequence", '', 'PositionerPositionSequence'), 0x00189406: ('SQ', '1', "Table Position Sequence", '', 'TablePositionSequence'), 0x00189407: ('SQ', '1', "Collimator Shape Sequence", '', 'CollimatorShapeSequence'), 0x00189410: ('CS', '1', "Planes in Acquisition", '', 'PlanesInAcquisition'), 0x00189412: ('SQ', '1', "XA/XRF Frame Characteristics Sequence", '', 'XAXRFFrameCharacteristicsSequence'), 0x00189417: ('SQ', '1', "Frame Acquisition Sequence", '', 'FrameAcquisitionSequence'), 0x00189420: ('CS', '1', "X-Ray Receptor Type", '', 'XRayReceptorType'), 0x00189423: ('LO', '1', "Acquisition Protocol Name", '', 'AcquisitionProtocolName'), 0x00189424: ('LT', '1', "Acquisition Protocol Description", '', 'AcquisitionProtocolDescription'), 0x00189425: ('CS', '1', "Contrast/Bolus Ingredient Opaque", '', 'ContrastBolusIngredientOpaque'), 0x00189426: ('FL', '1', "Distance Receptor Plane to Detector Housing", '', 'DistanceReceptorPlaneToDetectorHousing'), 0x00189427: ('CS', '1', "Intensifier Active Shape", '', 'IntensifierActiveShape'), 0x00189428: ('FL', '1-2', "Intensifier Active Dimension(s)", '', 'IntensifierActiveDimensions'), 0x00189429: ('FL', '2', "Physical Detector Size", '', 'PhysicalDetectorSize'), 0x00189430: ('FL', '2', "Position of Isocenter Projection", '', 'PositionOfIsocenterProjection'), 0x00189432: ('SQ', '1', "Field of View Sequence", '', 'FieldOfViewSequence'), 0x00189433: ('LO', '1', "Field of View Description", '', 'FieldOfViewDescription'), 0x00189434: ('SQ', '1', "Exposure Control Sensing Regions Sequence", '', 'ExposureControlSensingRegionsSequence'), 0x00189435: ('CS', '1', "Exposure Control Sensing Region Shape", '', 'ExposureControlSensingRegionShape'), 0x00189436: ('SS', '1', "Exposure Control Sensing Region Left Vertical Edge", '', 'ExposureControlSensingRegionLeftVerticalEdge'), 0x00189437: ('SS', '1', "Exposure Control Sensing Region Right Vertical Edge", '', 'ExposureControlSensingRegionRightVerticalEdge'), 0x00189438: ('SS', '1', "Exposure Control Sensing Region Upper Horizontal Edge", '', 'ExposureControlSensingRegionUpperHorizontalEdge'), 0x00189439: ('SS', '1', "Exposure Control Sensing Region Lower Horizontal Edge", '', 'ExposureControlSensingRegionLowerHorizontalEdge'), 0x00189440: ('SS', '2', "Center of Circular Exposure Control Sensing Region", '', 'CenterOfCircularExposureControlSensingRegion'), 0x00189441: ('US', '1', "Radius of Circular Exposure Control Sensing Region", '', 'RadiusOfCircularExposureControlSensingRegion'), 0x00189442: ('SS', '2-n', "Vertices of the Polygonal Exposure Control Sensing Region", '', 'VerticesOfThePolygonalExposureControlSensingRegion'), 0x00189445: ('OB', '1', "Retired-blank", 'Retired', ''), 0x00189447: ('FL', '1', "Column Angulation (Patient)", '', 'ColumnAngulationPatient'), 0x00189449: ('FL', '1', "Beam Angle", '', 'BeamAngle'), 0x00189451: ('SQ', '1', "Frame Detector Parameters Sequence", '', 'FrameDetectorParametersSequence'), 0x00189452: ('FL', '1', "Calculated Anatomy Thickness", '', 'CalculatedAnatomyThickness'), 0x00189455: ('SQ', '1', "Calibration Sequence", '', 'CalibrationSequence'), 0x00189456: ('SQ', '1', "Object Thickness Sequence", '', 'ObjectThicknessSequence'), 0x00189457: ('CS', '1', "Plane Identification", '', 'PlaneIdentification'), 0x00189461: ('FL', '1-2', "Field of View Dimension(s) in Float", '', 'FieldOfViewDimensionsInFloat'), 0x00189462: ('SQ', '1', "Isocenter Reference System Sequence", '', 'IsocenterReferenceSystemSequence'), 0x00189463: ('FL', '1', "Positioner Isocenter Primary Angle", '', 'PositionerIsocenterPrimaryAngle'), 0x00189464: ('FL', '1', "Positioner Isocenter Secondary Angle", '', 'PositionerIsocenterSecondaryAngle'), 0x00189465: ('FL', '1', "Positioner Isocenter Detector Rotation Angle", '', 'PositionerIsocenterDetectorRotationAngle'), 0x00189466: ('FL', '1', "Table X Position to Isocenter", '', 'TableXPositionToIsocenter'), 0x00189467: ('FL', '1', "Table Y Position to Isocenter", '', 'TableYPositionToIsocenter'), 0x00189468: ('FL', '1', "Table Z Position to Isocenter", '', 'TableZPositionToIsocenter'), 0x00189469: ('FL', '1', "Table Horizontal Rotation Angle", '', 'TableHorizontalRotationAngle'), 0x00189470: ('FL', '1', "Table Head Tilt Angle", '', 'TableHeadTiltAngle'), 0x00189471: ('FL', '1', "Table Cradle Tilt Angle", '', 'TableCradleTiltAngle'), 0x00189472: ('SQ', '1', "Frame Display Shutter Sequence", '', 'FrameDisplayShutterSequence'), 0x00189473: ('FL', '1', "Acquired Image Area Dose Product", '', 'AcquiredImageAreaDoseProduct'), 0x00189474: ('CS', '1', "C-arm Positioner Tabletop Relationship", '', 'CArmPositionerTabletopRelationship'), 0x00189476: ('SQ', '1', "X-Ray Geometry Sequence", '', 'XRayGeometrySequence'), 0x00189477: ('SQ', '1', "Irradiation Event Identification Sequence", '', 'IrradiationEventIdentificationSequence'), 0x00189504: ('SQ', '1', "X-Ray 3D Frame Type Sequence", '', 'XRay3DFrameTypeSequence'), 0x00189506: ('SQ', '1', "Contributing Sources Sequence", '', 'ContributingSourcesSequence'), 0x00189507: ('SQ', '1', "X-Ray 3D Acquisition Sequence", '', 'XRay3DAcquisitionSequence'), 0x00189508: ('FL', '1', "Primary Positioner Scan Arc", '', 'PrimaryPositionerScanArc'), 0x00189509: ('FL', '1', "Secondary Positioner Scan Arc", '', 'SecondaryPositionerScanArc'), 0x00189510: ('FL', '1', "Primary Positioner Scan Start Angle", '', 'PrimaryPositionerScanStartAngle'), 0x00189511: ('FL', '1', "Secondary Positioner Scan Start Angle", '', 'SecondaryPositionerScanStartAngle'), 0x00189514: ('FL', '1', "Primary Positioner Increment", '', 'PrimaryPositionerIncrement'), 0x00189515: ('FL', '1', "Secondary Positioner Increment", '', 'SecondaryPositionerIncrement'), 0x00189516: ('DT', '1', "Start Acquisition DateTime", '', 'StartAcquisitionDateTime'), 0x00189517: ('DT', '1', "End Acquisition DateTime", '', 'EndAcquisitionDateTime'), 0x00189518: ('SS', '1', "Primary Positioner Increment Sign", '', 'PrimaryPositionerIncrementSign'), 0x00189519: ('SS', '1', "Secondary Positioner Increment Sign", '', 'SecondaryPositionerIncrementSign'), 0x00189524: ('LO', '1', "Application Name", '', 'ApplicationName'), 0x00189525: ('LO', '1', "Application Version", '', 'ApplicationVersion'), 0x00189526: ('LO', '1', "Application Manufacturer", '', 'ApplicationManufacturer'), 0x00189527: ('CS', '1', "Algorithm Type", '', 'AlgorithmType'), 0x00189528: ('LO', '1', "Algorithm Description", '', 'AlgorithmDescription'), 0x00189530: ('SQ', '1', "X-Ray 3D Reconstruction Sequence", '', 'XRay3DReconstructionSequence'), 0x00189531: ('LO', '1', "Reconstruction Description", '', 'ReconstructionDescription'), 0x00189538: ('SQ', '1', "Per Projection Acquisition Sequence", '', 'PerProjectionAcquisitionSequence'), 0x00189541: ('SQ', '1', "Detector Position Sequence", '', 'DetectorPositionSequence'), 0x00189542: ('SQ', '1', "X-Ray Acquisition Dose Sequence", '', 'XRayAcquisitionDoseSequence'), 0x00189543: ('FD', '1', "X-Ray Source Isocenter Primary Angle", '', 'XRaySourceIsocenterPrimaryAngle'), 0x00189544: ('FD', '1', "X-Ray Source Isocenter Secondary Angle", '', 'XRaySourceIsocenterSecondaryAngle'), 0x00189545: ('FD', '1', "Breast Support Isocenter Primary Angle", '', 'BreastSupportIsocenterPrimaryAngle'), 0x00189546: ('FD', '1', "Breast Support Isocenter Secondary Angle", '', 'BreastSupportIsocenterSecondaryAngle'), 0x00189547: ('FD', '1', "Breast Support X Position to Isocenter", '', 'BreastSupportXPositionToIsocenter'), 0x00189548: ('FD', '1', "Breast Support Y Position to Isocenter", '', 'BreastSupportYPositionToIsocenter'), 0x00189549: ('FD', '1', "Breast Support Z Position to Isocenter", '', 'BreastSupportZPositionToIsocenter'), 0x00189550: ('FD', '1', "Detector Isocenter Primary Angle", '', 'DetectorIsocenterPrimaryAngle'), 0x00189551: ('FD', '1', "Detector Isocenter Secondary Angle", '', 'DetectorIsocenterSecondaryAngle'), 0x00189552: ('FD', '1', "Detector X Position to Isocenter", '', 'DetectorXPositionToIsocenter'), 0x00189553: ('FD', '1', "Detector Y Position to Isocenter", '', 'DetectorYPositionToIsocenter'), 0x00189554: ('FD', '1', "Detector Z Position to Isocenter", '', 'DetectorZPositionToIsocenter'), 0x00189555: ('SQ', '1', "X-Ray Grid Sequence", '', 'XRayGridSequence'), 0x00189556: ('SQ', '1', "X-Ray Filter Sequence", '', 'XRayFilterSequence'), 0x00189557: ('FD', '3', "Detector Active Area TLHC Position", '', 'DetectorActiveAreaTLHCPosition'), 0x00189558: ('FD', '6', "Detector Active Area Orientation", '', 'DetectorActiveAreaOrientation'), 0x00189559: ('CS', '1', "Positioner Primary Angle Direction", '', 'PositionerPrimaryAngleDirection'), 0x00189601: ('SQ', '1', "Diffusion b-matrix Sequence", '', 'DiffusionBMatrixSequence'), 0x00189602: ('FD', '1', "Diffusion b-value XX", '', 'DiffusionBValueXX'), 0x00189603: ('FD', '1', "Diffusion b-value XY", '', 'DiffusionBValueXY'), 0x00189604: ('FD', '1', "Diffusion b-value XZ", '', 'DiffusionBValueXZ'), 0x00189605: ('FD', '1', "Diffusion b-value YY", '', 'DiffusionBValueYY'), 0x00189606: ('FD', '1', "Diffusion b-value YZ", '', 'DiffusionBValueYZ'), 0x00189607: ('FD', '1', "Diffusion b-value ZZ", '', 'DiffusionBValueZZ'), 0x00189621: ('SQ', '1', "Functional MR Sequence", '', 'FunctionalMRSequence'), 0x00189622: ('CS', '1', "Functional Settling Phase Frames Present", '', 'FunctionalSettlingPhaseFramesPresent'), 0x00189623: ('DT', '1', "Functional Sync Pulse", '', 'FunctionalSyncPulse'), 0x00189624: ('CS', '1', "Settling Phase Frame", '', 'SettlingPhaseFrame'), 0x00189701: ('DT', '1', "Decay Correction DateTime", '', 'DecayCorrectionDateTime'), 0x00189715: ('FD', '1', "Start Density Threshold", '', 'StartDensityThreshold'), 0x00189716: ('FD', '1', "Start Relative Density Difference Threshold", '', 'StartRelativeDensityDifferenceThreshold'), 0x00189717: ('FD', '1', "Start Cardiac Trigger Count Threshold", '', 'StartCardiacTriggerCountThreshold'), 0x00189718: ('FD', '1', "Start Respiratory Trigger Count Threshold", '', 'StartRespiratoryTriggerCountThreshold'), 0x00189719: ('FD', '1', "Termination Counts Threshold", '', 'TerminationCountsThreshold'), 0x00189720: ('FD', '1', "Termination Density Threshold", '', 'TerminationDensityThreshold'), 0x00189721: ('FD', '1', "Termination Relative Density Threshold", '', 'TerminationRelativeDensityThreshold'), 0x00189722: ('FD', '1', "Termination Time Threshold", '', 'TerminationTimeThreshold'), 0x00189723: ('FD', '1', "Termination Cardiac Trigger Count Threshold", '', 'TerminationCardiacTriggerCountThreshold'), 0x00189724: ('FD', '1', "Termination Respiratory Trigger Count Threshold", '', 'TerminationRespiratoryTriggerCountThreshold'), 0x00189725: ('CS', '1', "Detector Geometry", '', 'DetectorGeometry'), 0x00189726: ('FD', '1', "Transverse Detector Separation", '', 'TransverseDetectorSeparation'), 0x00189727: ('FD', '1', "Axial Detector Dimension", '', 'AxialDetectorDimension'), 0x00189729: ('US', '1', "Radiopharmaceutical Agent Number", '', 'RadiopharmaceuticalAgentNumber'), 0x00189732: ('SQ', '1', "PET Frame Acquisition Sequence", '', 'PETFrameAcquisitionSequence'), 0x00189733: ('SQ', '1', "PET Detector Motion Details Sequence", '', 'PETDetectorMotionDetailsSequence'), 0x00189734: ('SQ', '1', "PET Table Dynamics Sequence", '', 'PETTableDynamicsSequence'), 0x00189735: ('SQ', '1', "PET Position Sequence", '', 'PETPositionSequence'), 0x00189736: ('SQ', '1', "PET Frame Correction Factors Sequence", '', 'PETFrameCorrectionFactorsSequence'), 0x00189737: ('SQ', '1', "Radiopharmaceutical Usage Sequence", '', 'RadiopharmaceuticalUsageSequence'), 0x00189738: ('CS', '1', "Attenuation Correction Source", '', 'AttenuationCorrectionSource'), 0x00189739: ('US', '1', "Number of Iterations", '', 'NumberOfIterations'), 0x00189740: ('US', '1', "Number of Subsets", '', 'NumberOfSubsets'), 0x00189749: ('SQ', '1', "PET Reconstruction Sequence", '', 'PETReconstructionSequence'), 0x00189751: ('SQ', '1', "PET Frame Type Sequence", '', 'PETFrameTypeSequence'), 0x00189755: ('CS', '1', "Time of Flight Information Used", '', 'TimeOfFlightInformationUsed'), 0x00189756: ('CS', '1', "Reconstruction Type", '', 'ReconstructionType'), 0x00189758: ('CS', '1', "Decay Corrected", '', 'DecayCorrected'), 0x00189759: ('CS', '1', "Attenuation Corrected", '', 'AttenuationCorrected'), 0x00189760: ('CS', '1', "Scatter Corrected", '', 'ScatterCorrected'), 0x00189761: ('CS', '1', "Dead Time Corrected", '', 'DeadTimeCorrected'), 0x00189762: ('CS', '1', "Gantry Motion Corrected", '', 'GantryMotionCorrected'), 0x00189763: ('CS', '1', "Patient Motion Corrected", '', 'PatientMotionCorrected'), 0x00189764: ('CS', '1', "Count Loss Normalization Corrected", '', 'CountLossNormalizationCorrected'), 0x00189765: ('CS', '1', "Randoms Corrected", '', 'RandomsCorrected'), 0x00189766: ('CS', '1', "Non-uniform Radial Sampling Corrected", '', 'NonUniformRadialSamplingCorrected'), 0x00189767: ('CS', '1', "Sensitivity Calibrated", '', 'SensitivityCalibrated'), 0x00189768: ('CS', '1', "Detector Normalization Correction", '', 'DetectorNormalizationCorrection'), 0x00189769: ('CS', '1', "Iterative Reconstruction Method", '', 'IterativeReconstructionMethod'), 0x00189770: ('CS', '1', "Attenuation Correction Temporal Relationship", '', 'AttenuationCorrectionTemporalRelationship'), 0x00189771: ('SQ', '1', "Patient Physiological State Sequence", '', 'PatientPhysiologicalStateSequence'), 0x00189772: ('SQ', '1', "Patient Physiological State Code Sequence", '', 'PatientPhysiologicalStateCodeSequence'), 0x00189801: ('FD', '1-n', "Depth(s) of Focus", '', 'DepthsOfFocus'), 0x00189803: ('SQ', '1', "Excluded Intervals Sequence", '', 'ExcludedIntervalsSequence'), 0x00189804: ('DT', '1', "Exclusion Start DateTime", '', 'ExclusionStartDateTime'), 0x00189805: ('FD', '1', "Exclusion Duration", '', 'ExclusionDuration'), 0x00189806: ('SQ', '1', "US Image Description Sequence", '', 'USImageDescriptionSequence'), 0x00189807: ('SQ', '1', "Image Data Type Sequence", '', 'ImageDataTypeSequence'), 0x00189808: ('CS', '1', "Data Type", '', 'DataType'), 0x00189809: ('SQ', '1', "Transducer Scan Pattern Code Sequence", '', 'TransducerScanPatternCodeSequence'), 0x0018980B: ('CS', '1', "Aliased Data Type", '', 'AliasedDataType'), 0x0018980C: ('CS', '1', "Position Measuring Device Used", '', 'PositionMeasuringDeviceUsed'), 0x0018980D: ('SQ', '1', "Transducer Geometry Code Sequence", '', 'TransducerGeometryCodeSequence'), 0x0018980E: ('SQ', '1', "Transducer Beam Steering Code Sequence", '', 'TransducerBeamSteeringCodeSequence'), 0x0018980F: ('SQ', '1', "Transducer Application Code Sequence", '', 'TransducerApplicationCodeSequence'), 0x00189810: ('US or SS', '1', "Zero Velocity Pixel Value", '', 'ZeroVelocityPixelValue'), 0x00189821: ('SQ', '1', "Photoacoustic Excitation Characteristics Sequence", '', 'PhotoacousticExcitationCharacteristicsSequence'), 0x00189822: ('FD', '1', "Excitation Spectral Width", '', 'ExcitationSpectralWidth'), 0x00189823: ('FD', '1', "Excitation Energy", '', 'ExcitationEnergy'), 0x00189824: ('FD', '1', "Excitation Pulse Duration", '', 'ExcitationPulseDuration'), 0x00189825: ('SQ', '1', "Excitation Wavelength Sequence", '', 'ExcitationWavelengthSequence'), 0x00189826: ('FD', '1', "Excitation Wavelength", '', 'ExcitationWavelength'), 0x00189828: ('CS', '1', "Illumination Translation Flag", '', 'IlluminationTranslationFlag'), 0x00189829: ('CS', '1', "Acoustic Coupling Medium Flag", '', 'AcousticCouplingMediumFlag'), 0x0018982A: ('SQ', '1', "Acoustic Coupling Medium Code Sequence", '', 'AcousticCouplingMediumCodeSequence'), 0x0018982B: ('FD', '1', "Acoustic Coupling Medium Temperature", '', 'AcousticCouplingMediumTemperature'), 0x0018982C: ('SQ', '1', "Transducer Response Sequence", '', 'TransducerResponseSequence'), 0x0018982D: ('FD', '1', "Center Frequency", '', 'CenterFrequency'), 0x0018982E: ('FD', '1', "Fractional Bandwidth", '', 'FractionalBandwidth'), 0x0018982F: ('FD', '1', "Lower Cutoff Frequency", '', 'LowerCutoffFrequency'), 0x00189830: ('FD', '1', "Upper Cutoff Frequency", '', 'UpperCutoffFrequency'), 0x00189831: ('SQ', '1', "Transducer Technology Sequence", '', 'TransducerTechnologySequence'), 0x00189832: ('SQ', '1', "Sound Speed Correction Mechanism Code Sequence", '', 'SoundSpeedCorrectionMechanismCodeSequence'), 0x00189833: ('FD', '1', "Object Sound Speed", '', 'ObjectSoundSpeed'), 0x00189834: ('FD', '1', "Acoustic Coupling Medium Sound Speed", '', 'AcousticCouplingMediumSoundSpeed'), 0x00189835: ('SQ', '1', "Photoacoustic Image Frame Type Sequence", '', 'PhotoacousticImageFrameTypeSequence'), 0x00189836: ('SQ', '1', "Image Data Type Code Sequence", '', 'ImageDataTypeCodeSequence'), 0x00189900: ('LO', '1', "Reference Location Label", '', 'ReferenceLocationLabel'), 0x00189901: ('UT', '1', "Reference Location Description", '', 'ReferenceLocationDescription'), 0x00189902: ('SQ', '1', "Reference Basis Code Sequence", '', 'ReferenceBasisCodeSequence'), 0x00189903: ('SQ', '1', "Reference Geometry Code Sequence", '', 'ReferenceGeometryCodeSequence'), 0x00189904: ('DS', '1', "Offset Distance", '', 'OffsetDistance'), 0x00189905: ('CS', '1', "Offset Direction", '', 'OffsetDirection'), 0x00189906: ('SQ', '1', "Potential Scheduled Protocol Code Sequence", '', 'PotentialScheduledProtocolCodeSequence'), 0x00189907: ('SQ', '1', "Potential Requested Procedure Code Sequence", '', 'PotentialRequestedProcedureCodeSequence'), 0x00189908: ('UC', '1-n', "Potential Reasons for Procedure", '', 'PotentialReasonsForProcedure'), 0x00189909: ('SQ', '1', "Potential Reasons for Procedure Code Sequence", '', 'PotentialReasonsForProcedureCodeSequence'), 0x0018990A: ('UC', '1-n', "Potential Diagnostic Tasks", '', 'PotentialDiagnosticTasks'), 0x0018990B: ('SQ', '1', "Contraindications Code Sequence", '', 'ContraindicationsCodeSequence'), 0x0018990C: ('SQ', '1', "Referenced Defined Protocol Sequence", '', 'ReferencedDefinedProtocolSequence'), 0x0018990D: ('SQ', '1', "Referenced Performed Protocol Sequence", '', 'ReferencedPerformedProtocolSequence'), 0x0018990E: ('SQ', '1', "Predecessor Protocol Sequence", '', 'PredecessorProtocolSequence'), 0x0018990F: ('UT', '1', "Protocol Planning Information", '', 'ProtocolPlanningInformation'), 0x00189910: ('UT', '1', "Protocol Design Rationale", '', 'ProtocolDesignRationale'), 0x00189911: ('SQ', '1', "Patient Specification Sequence", '', 'PatientSpecificationSequence'), 0x00189912: ('SQ', '1', "Model Specification Sequence", '', 'ModelSpecificationSequence'), 0x00189913: ('SQ', '1', "Parameters Specification Sequence", '', 'ParametersSpecificationSequence'), 0x00189914: ('SQ', '1', "Instruction Sequence", '', 'InstructionSequence'), 0x00189915: ('US', '1', "Instruction Index", '', 'InstructionIndex'), 0x00189916: ('LO', '1', "Instruction Text", '', 'InstructionText'), 0x00189917: ('UT', '1', "Instruction Description", '', 'InstructionDescription'), 0x00189918: ('CS', '1', "Instruction Performed Flag", '', 'InstructionPerformedFlag'), 0x00189919: ('DT', '1', "Instruction Performed DateTime", '', 'InstructionPerformedDateTime'), 0x0018991A: ('UT', '1', "Instruction Performance Comment", '', 'InstructionPerformanceComment'), 0x0018991B: ('SQ', '1', "Patient Positioning Instruction Sequence", '', 'PatientPositioningInstructionSequence'), 0x0018991C: ('SQ', '1', "Positioning Method Code Sequence", '', 'PositioningMethodCodeSequence'), 0x0018991D: ('SQ', '1', "Positioning Landmark Sequence", '', 'PositioningLandmarkSequence'), 0x0018991E: ('UI', '1', "Target Frame of Reference UID", '', 'TargetFrameOfReferenceUID'), 0x0018991F: ('SQ', '1', "Acquisition Protocol Element Specification Sequence", '', 'AcquisitionProtocolElementSpecificationSequence'), 0x00189920: ('SQ', '1', "Acquisition Protocol Element Sequence", '', 'AcquisitionProtocolElementSequence'), 0x00189921: ('US', '1', "Protocol Element Number", '', 'ProtocolElementNumber'), 0x00189922: ('LO', '1', "Protocol Element Name", '', 'ProtocolElementName'), 0x00189923: ('UT', '1', "Protocol Element Characteristics Summary", '', 'ProtocolElementCharacteristicsSummary'), 0x00189924: ('UT', '1', "Protocol Element Purpose", '', 'ProtocolElementPurpose'), 0x00189930: ('CS', '1', "Acquisition Motion", '', 'AcquisitionMotion'), 0x00189931: ('SQ', '1', "Acquisition Start Location Sequence", '', 'AcquisitionStartLocationSequence'), 0x00189932: ('SQ', '1', "Acquisition End Location Sequence", '', 'AcquisitionEndLocationSequence'), 0x00189933: ('SQ', '1', "Reconstruction Protocol Element Specification Sequence", '', 'ReconstructionProtocolElementSpecificationSequence'), 0x00189934: ('SQ', '1', "Reconstruction Protocol Element Sequence", '', 'ReconstructionProtocolElementSequence'), 0x00189935: ('SQ', '1', "Storage Protocol Element Specification Sequence", '', 'StorageProtocolElementSpecificationSequence'), 0x00189936: ('SQ', '1', "Storage Protocol Element Sequence", '', 'StorageProtocolElementSequence'), 0x00189937: ('LO', '1', "Requested Series Description", '', 'RequestedSeriesDescription'), 0x00189938: ('US', '1-n', "Source Acquisition Protocol Element Number", '', 'SourceAcquisitionProtocolElementNumber'), 0x00189939: ('US', '1-n', "Source Acquisition Beam Number", '', 'SourceAcquisitionBeamNumber'), 0x0018993A: ('US', '1-n', "Source Reconstruction Protocol Element Number", '', 'SourceReconstructionProtocolElementNumber'), 0x0018993B: ('SQ', '1', "Reconstruction Start Location Sequence", '', 'ReconstructionStartLocationSequence'), 0x0018993C: ('SQ', '1', "Reconstruction End Location Sequence", '', 'ReconstructionEndLocationSequence'), 0x0018993D: ('SQ', '1', "Reconstruction Algorithm Sequence", '', 'ReconstructionAlgorithmSequence'), 0x0018993E: ('SQ', '1', "Reconstruction Target Center Location Sequence", '', 'ReconstructionTargetCenterLocationSequence'), 0x00189941: ('UT', '1', "Image Filter Description", '', 'ImageFilterDescription'), 0x00189942: ('FD', '1', "CTDIvol Notification Trigger", '', 'CTDIvolNotificationTrigger'), 0x00189943: ('FD', '1', "DLP Notification Trigger", '', 'DLPNotificationTrigger'), 0x00189944: ('CS', '1', "Auto KVP Selection Type", '', 'AutoKVPSelectionType'), 0x00189945: ('FD', '1', "Auto KVP Upper Bound", '', 'AutoKVPUpperBound'), 0x00189946: ('FD', '1', "Auto KVP Lower Bound", '', 'AutoKVPLowerBound'), 0x00189947: ('CS', '1', "Protocol Defined Patient Position", '', 'ProtocolDefinedPatientPosition'), 0x0018A001: ('SQ', '1', "Contributing Equipment Sequence", '', 'ContributingEquipmentSequence'), 0x0018A002: ('DT', '1', "Contribution DateTime", '', 'ContributionDateTime'), 0x0018A003: ('ST', '1', "Contribution Description", '', 'ContributionDescription'), 0x0020000D: ('UI', '1', "Study Instance UID", '', 'StudyInstanceUID'), 0x0020000E: ('UI', '1', "Series Instance UID", '', 'SeriesInstanceUID'), 0x00200010: ('SH', '1', "Study ID", '', 'StudyID'), 0x00200011: ('IS', '1', "Series Number", '', 'SeriesNumber'), 0x00200012: ('IS', '1', "Acquisition Number", '', 'AcquisitionNumber'), 0x00200013: ('IS', '1', "Instance Number", '', 'InstanceNumber'), 0x00200014: ('IS', '1', "Isotope Number", 'Retired', 'IsotopeNumber'), 0x00200015: ('IS', '1', "Phase Number", 'Retired', 'PhaseNumber'), 0x00200016: ('IS', '1', "Interval Number", 'Retired', 'IntervalNumber'), 0x00200017: ('IS', '1', "Time Slot Number", 'Retired', 'TimeSlotNumber'), 0x00200018: ('IS', '1', "Angle Number", 'Retired', 'AngleNumber'), 0x00200019: ('IS', '1', "Item Number", '', 'ItemNumber'), 0x00200020: ('CS', '2', "Patient Orientation", '', 'PatientOrientation'), 0x00200022: ('IS', '1', "Overlay Number", 'Retired', 'OverlayNumber'), 0x00200024: ('IS', '1', "Curve Number", 'Retired', 'CurveNumber'), 0x00200026: ('IS', '1', "LUT Number", 'Retired', 'LUTNumber'), 0x00200027: ('LO', '1', "Pyramid Label", '', 'PyramidLabel'), 0x00200030: ('DS', '3', "Image Position", 'Retired', 'ImagePosition'), 0x00200032: ('DS', '3', "Image Position (Patient)", '', 'ImagePositionPatient'), 0x00200035: ('DS', '6', "Image Orientation", 'Retired', 'ImageOrientation'), 0x00200037: ('DS', '6', "Image Orientation (Patient)", '', 'ImageOrientationPatient'), 0x00200050: ('DS', '1', "Location", 'Retired', 'Location'), 0x00200052: ('UI', '1', "Frame of Reference UID", '', 'FrameOfReferenceUID'), 0x00200060: ('CS', '1', "Laterality", '', 'Laterality'), 0x00200062: ('CS', '1', "Image Laterality", '', 'ImageLaterality'), 0x00200070: ('LO', '1', "Image Geometry Type", 'Retired', 'ImageGeometryType'), 0x00200080: ('CS', '1-n', "Masking Image", 'Retired', 'MaskingImage'), 0x002000AA: ('IS', '1', "Report Number", 'Retired', 'ReportNumber'), 0x00200100: ('IS', '1', "Temporal Position Identifier", '', 'TemporalPositionIdentifier'), 0x00200105: ('IS', '1', "Number of Temporal Positions", '', 'NumberOfTemporalPositions'), 0x00200110: ('DS', '1', "Temporal Resolution", '', 'TemporalResolution'), 0x00200200: ('UI', '1', "Synchronization Frame of Reference UID", '', 'SynchronizationFrameOfReferenceUID'), 0x00200242: ('UI', '1', "SOP Instance UID of Concatenation Source", '', 'SOPInstanceUIDOfConcatenationSource'), 0x00201000: ('IS', '1', "Series in Study", 'Retired', 'SeriesInStudy'), 0x00201001: ('IS', '1', "Acquisitions in Series", 'Retired', 'AcquisitionsInSeries'), 0x00201002: ('IS', '1', "Images in Acquisition", '', 'ImagesInAcquisition'), 0x00201003: ('IS', '1', "Images in Series", 'Retired', 'ImagesInSeries'), 0x00201004: ('IS', '1', "Acquisitions in Study", 'Retired', 'AcquisitionsInStudy'), 0x00201005: ('IS', '1', "Images in Study", 'Retired', 'ImagesInStudy'), 0x00201020: ('LO', '1-n', "Reference", 'Retired', 'Reference'), 0x0020103F: ('LO', '1', "Target Position Reference Indicator", '', 'TargetPositionReferenceIndicator'), 0x00201040: ('LO', '1', "Position Reference Indicator", '', 'PositionReferenceIndicator'), 0x00201041: ('DS', '1', "Slice Location", '', 'SliceLocation'), 0x00201070: ('IS', '1-n', "Other Study Numbers", 'Retired', 'OtherStudyNumbers'), 0x00201200: ('IS', '1', "Number of Patient Related Studies", '', 'NumberOfPatientRelatedStudies'), 0x00201202: ('IS', '1', "Number of Patient Related Series", '', 'NumberOfPatientRelatedSeries'), 0x00201204: ('IS', '1', "Number of Patient Related Instances", '', 'NumberOfPatientRelatedInstances'), 0x00201206: ('IS', '1', "Number of Study Related Series", '', 'NumberOfStudyRelatedSeries'), 0x00201208: ('IS', '1', "Number of Study Related Instances", '', 'NumberOfStudyRelatedInstances'), 0x00201209: ('IS', '1', "Number of Series Related Instances", '', 'NumberOfSeriesRelatedInstances'), 0x00203401: ('CS', '1', "Modifying Device ID", 'Retired', 'ModifyingDeviceID'), 0x00203402: ('CS', '1', "Modified Image ID", 'Retired', 'ModifiedImageID'), 0x00203403: ('DA', '1', "Modified Image Date", 'Retired', 'ModifiedImageDate'), 0x00203404: ('LO', '1', "Modifying Device Manufacturer", 'Retired', 'ModifyingDeviceManufacturer'), 0x00203405: ('TM', '1', "Modified Image Time", 'Retired', 'ModifiedImageTime'), 0x00203406: ('LO', '1', "Modified Image Description", 'Retired', 'ModifiedImageDescription'), 0x00204000: ('LT', '1', "Image Comments", '', 'ImageComments'), 0x00205000: ('AT', '1-n', "Original Image Identification", 'Retired', 'OriginalImageIdentification'), 0x00205002: ('LO', '1-n', "Original Image Identification Nomenclature", 'Retired', 'OriginalImageIdentificationNomenclature'), 0x00209056: ('SH', '1', "Stack ID", '', 'StackID'), 0x00209057: ('UL', '1', "In-Stack Position Number", '', 'InStackPositionNumber'), 0x00209071: ('SQ', '1', "Frame Anatomy Sequence", '', 'FrameAnatomySequence'), 0x00209072: ('CS', '1', "Frame Laterality", '', 'FrameLaterality'), 0x00209111: ('SQ', '1', "Frame Content Sequence", '', 'FrameContentSequence'), 0x00209113: ('SQ', '1', "Plane Position Sequence", '', 'PlanePositionSequence'), 0x00209116: ('SQ', '1', "Plane Orientation Sequence", '', 'PlaneOrientationSequence'), 0x00209128: ('UL', '1', "Temporal Position Index", '', 'TemporalPositionIndex'), 0x00209153: ('FD', '1', "Nominal Cardiac Trigger Delay Time", '', 'NominalCardiacTriggerDelayTime'), 0x00209154: ('FL', '1', "Nominal Cardiac Trigger Time Prior To R-Peak", '', 'NominalCardiacTriggerTimePriorToRPeak'), 0x00209155: ('FL', '1', "Actual Cardiac Trigger Time Prior To R-Peak", '', 'ActualCardiacTriggerTimePriorToRPeak'), 0x00209156: ('US', '1', "Frame Acquisition Number", '', 'FrameAcquisitionNumber'), 0x00209157: ('UL', '1-n', "Dimension Index Values", '', 'DimensionIndexValues'), 0x00209158: ('LT', '1', "Frame Comments", '', 'FrameComments'), 0x00209161: ('UI', '1', "Concatenation UID", '', 'ConcatenationUID'), 0x00209162: ('US', '1', "In-concatenation Number", '', 'InConcatenationNumber'), 0x00209163: ('US', '1', "In-concatenation Total Number", '', 'InConcatenationTotalNumber'), 0x00209164: ('UI', '1', "Dimension Organization UID", '', 'DimensionOrganizationUID'), 0x00209165: ('AT', '1', "Dimension Index Pointer", '', 'DimensionIndexPointer'), 0x00209167: ('AT', '1', "Functional Group Pointer", '', 'FunctionalGroupPointer'), 0x00209170: ('SQ', '1', "Unassigned Shared Converted Attributes Sequence", '', 'UnassignedSharedConvertedAttributesSequence'), 0x00209171: ('SQ', '1', "Unassigned Per-Frame Converted Attributes Sequence", '', 'UnassignedPerFrameConvertedAttributesSequence'), 0x00209172: ('SQ', '1', "Conversion Source Attributes Sequence", '', 'ConversionSourceAttributesSequence'), 0x00209213: ('LO', '1', "Dimension Index Private Creator", '', 'DimensionIndexPrivateCreator'), 0x00209221: ('SQ', '1', "Dimension Organization Sequence", '', 'DimensionOrganizationSequence'), 0x00209222: ('SQ', '1', "Dimension Index Sequence", '', 'DimensionIndexSequence'), 0x00209228: ('UL', '1', "Concatenation Frame Offset Number", '', 'ConcatenationFrameOffsetNumber'), 0x00209238: ('LO', '1', "Functional Group Private Creator", '', 'FunctionalGroupPrivateCreator'), 0x00209241: ('FL', '1', "Nominal Percentage of Cardiac Phase", '', 'NominalPercentageOfCardiacPhase'), 0x00209245: ('FL', '1', "Nominal Percentage of Respiratory Phase", '', 'NominalPercentageOfRespiratoryPhase'), 0x00209246: ('FL', '1', "Starting Respiratory Amplitude", '', 'StartingRespiratoryAmplitude'), 0x00209247: ('CS', '1', "Starting Respiratory Phase", '', 'StartingRespiratoryPhase'), 0x00209248: ('FL', '1', "Ending Respiratory Amplitude", '', 'EndingRespiratoryAmplitude'), 0x00209249: ('CS', '1', "Ending Respiratory Phase", '', 'EndingRespiratoryPhase'), 0x00209250: ('CS', '1', "Respiratory Trigger Type", '', 'RespiratoryTriggerType'), 0x00209251: ('FD', '1', "R-R Interval Time Nominal", '', 'RRIntervalTimeNominal'), 0x00209252: ('FD', '1', "Actual Cardiac Trigger Delay Time", '', 'ActualCardiacTriggerDelayTime'), 0x00209253: ('SQ', '1', "Respiratory Synchronization Sequence", '', 'RespiratorySynchronizationSequence'), 0x00209254: ('FD', '1', "Respiratory Interval Time", '', 'RespiratoryIntervalTime'), 0x00209255: ('FD', '1', "Nominal Respiratory Trigger Delay Time", '', 'NominalRespiratoryTriggerDelayTime'), 0x00209256: ('FD', '1', "Respiratory Trigger Delay Threshold", '', 'RespiratoryTriggerDelayThreshold'), 0x00209257: ('FD', '1', "Actual Respiratory Trigger Delay Time", '', 'ActualRespiratoryTriggerDelayTime'), 0x00209301: ('FD', '3', "Image Position (Volume)", '', 'ImagePositionVolume'), 0x00209302: ('FD', '6', "Image Orientation (Volume)", '', 'ImageOrientationVolume'), 0x00209307: ('CS', '1', "Ultrasound Acquisition Geometry", '', 'UltrasoundAcquisitionGeometry'), 0x00209308: ('FD', '3', "Apex Position", '', 'ApexPosition'), 0x00209309: ('FD', '16', "Volume to Transducer Mapping Matrix", '', 'VolumeToTransducerMappingMatrix'), 0x0020930A: ('FD', '16', "Volume to Table Mapping Matrix", '', 'VolumeToTableMappingMatrix'), 0x0020930B: ('CS', '1', "Volume to Transducer Relationship", '', 'VolumeToTransducerRelationship'), 0x0020930C: ('CS', '1', "Patient Frame of Reference Source", '', 'PatientFrameOfReferenceSource'), 0x0020930D: ('FD', '1', "Temporal Position Time Offset", '', 'TemporalPositionTimeOffset'), 0x0020930E: ('SQ', '1', "Plane Position (Volume) Sequence", '', 'PlanePositionVolumeSequence'), 0x0020930F: ('SQ', '1', "Plane Orientation (Volume) Sequence", '', 'PlaneOrientationVolumeSequence'), 0x00209310: ('SQ', '1', "Temporal Position Sequence", '', 'TemporalPositionSequence'), 0x00209311: ('CS', '1', "Dimension Organization Type", '', 'DimensionOrganizationType'), 0x00209312: ('UI', '1', "Volume Frame of Reference UID", '', 'VolumeFrameOfReferenceUID'), 0x00209313: ('UI', '1', "Table Frame of Reference UID", '', 'TableFrameOfReferenceUID'), 0x00209421: ('LO', '1', "Dimension Description Label", '', 'DimensionDescriptionLabel'), 0x00209450: ('SQ', '1', "Patient Orientation in Frame Sequence", '', 'PatientOrientationInFrameSequence'), 0x00209453: ('LO', '1', "Frame Label", '', 'FrameLabel'), 0x00209518: ('US', '1-n', "Acquisition Index", '', 'AcquisitionIndex'), 0x00209529: ('SQ', '1', "Contributing SOP Instances Reference Sequence", '', 'ContributingSOPInstancesReferenceSequence'), 0x00209536: ('US', '1', "Reconstruction Index", '', 'ReconstructionIndex'), 0x00220001: ('US', '1', "Light Path Filter Pass-Through Wavelength", '', 'LightPathFilterPassThroughWavelength'), 0x00220002: ('US', '2', "Light Path Filter Pass Band", '', 'LightPathFilterPassBand'), 0x00220003: ('US', '1', "Image Path Filter Pass-Through Wavelength", '', 'ImagePathFilterPassThroughWavelength'), 0x00220004: ('US', '2', "Image Path Filter Pass Band", '', 'ImagePathFilterPassBand'), 0x00220005: ('CS', '1', "Patient Eye Movement Commanded", '', 'PatientEyeMovementCommanded'), 0x00220006: ('SQ', '1', "Patient Eye Movement Command Code Sequence", '', 'PatientEyeMovementCommandCodeSequence'), 0x00220007: ('FL', '1', "Spherical Lens Power", '', 'SphericalLensPower'), 0x00220008: ('FL', '1', "Cylinder Lens Power", '', 'CylinderLensPower'), 0x00220009: ('FL', '1', "Cylinder Axis", '', 'CylinderAxis'), 0x0022000A: ('FL', '1', "Emmetropic Magnification", '', 'EmmetropicMagnification'), 0x0022000B: ('FL', '1', "Intra Ocular Pressure", '', 'IntraOcularPressure'), 0x0022000C: ('FL', '1', "Horizontal Field of View", '', 'HorizontalFieldOfView'), 0x0022000D: ('CS', '1', "Pupil Dilated", '', 'PupilDilated'), 0x0022000E: ('FL', '1', "Degree of Dilation", '', 'DegreeOfDilation'), 0x0022000F: ('FD', '1', "Vertex Distance", '', 'VertexDistance'), 0x00220010: ('FL', '1', "Stereo Baseline Angle", '', 'StereoBaselineAngle'), 0x00220011: ('FL', '1', "Stereo Baseline Displacement", '', 'StereoBaselineDisplacement'), 0x00220012: ('FL', '1', "Stereo Horizontal Pixel Offset", '', 'StereoHorizontalPixelOffset'), 0x00220013: ('FL', '1', "Stereo Vertical Pixel Offset", '', 'StereoVerticalPixelOffset'), 0x00220014: ('FL', '1', "Stereo Rotation", '', 'StereoRotation'), 0x00220015: ('SQ', '1', "Acquisition Device Type Code Sequence", '', 'AcquisitionDeviceTypeCodeSequence'), 0x00220016: ('SQ', '1', "Illumination Type Code Sequence", '', 'IlluminationTypeCodeSequence'), 0x00220017: ('SQ', '1', "Light Path Filter Type Stack Code Sequence", '', 'LightPathFilterTypeStackCodeSequence'), 0x00220018: ('SQ', '1', "Image Path Filter Type Stack Code Sequence", '', 'ImagePathFilterTypeStackCodeSequence'), 0x00220019: ('SQ', '1', "Lenses Code Sequence", '', 'LensesCodeSequence'), 0x0022001A: ('SQ', '1', "Channel Description Code Sequence", '', 'ChannelDescriptionCodeSequence'), 0x0022001B: ('SQ', '1', "Refractive State Sequence", '', 'RefractiveStateSequence'), 0x0022001C: ('SQ', '1', "Mydriatic Agent Code Sequence", '', 'MydriaticAgentCodeSequence'), 0x0022001D: ('SQ', '1', "Relative Image Position Code Sequence", '', 'RelativeImagePositionCodeSequence'), 0x0022001E: ('FL', '1', "Camera Angle of View", '', 'CameraAngleOfView'), 0x00220020: ('SQ', '1', "Stereo Pairs Sequence", '', 'StereoPairsSequence'), 0x00220021: ('SQ', '1', "Left Image Sequence", '', 'LeftImageSequence'), 0x00220022: ('SQ', '1', "Right Image Sequence", '', 'RightImageSequence'), 0x00220028: ('CS', '1', "Stereo Pairs Present", '', 'StereoPairsPresent'), 0x00220030: ('FL', '1', "Axial Length of the Eye", '', 'AxialLengthOfTheEye'), 0x00220031: ('SQ', '1', "Ophthalmic Frame Location Sequence", '', 'OphthalmicFrameLocationSequence'), 0x00220032: ('FL', '2-2n', "Reference Coordinates", '', 'ReferenceCoordinates'), 0x00220035: ('FL', '1', "Depth Spatial Resolution", '', 'DepthSpatialResolution'), 0x00220036: ('FL', '1', "Maximum Depth Distortion", '', 'MaximumDepthDistortion'), 0x00220037: ('FL', '1', "Along-scan Spatial Resolution", '', 'AlongScanSpatialResolution'), 0x00220038: ('FL', '1', "Maximum Along-scan Distortion", '', 'MaximumAlongScanDistortion'), 0x00220039: ('CS', '1', "Ophthalmic Image Orientation", '', 'OphthalmicImageOrientation'), 0x00220041: ('FL', '1', "Depth of Transverse Image", '', 'DepthOfTransverseImage'), 0x00220042: ('SQ', '1', "Mydriatic Agent Concentration Units Sequence", '', 'MydriaticAgentConcentrationUnitsSequence'), 0x00220048: ('FL', '1', "Across-scan Spatial Resolution", '', 'AcrossScanSpatialResolution'), 0x00220049: ('FL', '1', "Maximum Across-scan Distortion", '', 'MaximumAcrossScanDistortion'), 0x0022004E: ('DS', '1', "Mydriatic Agent Concentration", '', 'MydriaticAgentConcentration'), 0x00220055: ('FL', '1', "Illumination Wave Length", '', 'IlluminationWaveLength'), 0x00220056: ('FL', '1', "Illumination Power", '', 'IlluminationPower'), 0x00220057: ('FL', '1', "Illumination Bandwidth", '', 'IlluminationBandwidth'), 0x00220058: ('SQ', '1', "Mydriatic Agent Sequence", '', 'MydriaticAgentSequence'), 0x00221007: ('SQ', '1', "Ophthalmic Axial Measurements Right Eye Sequence", '', 'OphthalmicAxialMeasurementsRightEyeSequence'), 0x00221008: ('SQ', '1', "Ophthalmic Axial Measurements Left Eye Sequence", '', 'OphthalmicAxialMeasurementsLeftEyeSequence'), 0x00221009: ('CS', '1', "Ophthalmic Axial Measurements Device Type", '', 'OphthalmicAxialMeasurementsDeviceType'), 0x00221010: ('CS', '1', "Ophthalmic Axial Length Measurements Type", '', 'OphthalmicAxialLengthMeasurementsType'), 0x00221012: ('SQ', '1', "Ophthalmic Axial Length Sequence", '', 'OphthalmicAxialLengthSequence'), 0x00221019: ('FL', '1', "Ophthalmic Axial Length", '', 'OphthalmicAxialLength'), 0x00221024: ('SQ', '1', "Lens Status Code Sequence", '', 'LensStatusCodeSequence'), 0x00221025: ('SQ', '1', "Vitreous Status Code Sequence", '', 'VitreousStatusCodeSequence'), 0x00221028: ('SQ', '1', "IOL Formula Code Sequence", '', 'IOLFormulaCodeSequence'), 0x00221029: ('LO', '1', "IOL Formula Detail", '', 'IOLFormulaDetail'), 0x00221033: ('FL', '1', "Keratometer Index", '', 'KeratometerIndex'), 0x00221035: ('SQ', '1', "Source of Ophthalmic Axial Length Code Sequence", '', 'SourceOfOphthalmicAxialLengthCodeSequence'), 0x00221036: ('SQ', '1', "Source of Corneal Size Data Code Sequence", '', 'SourceOfCornealSizeDataCodeSequence'), 0x00221037: ('FL', '1', "Target Refraction", '', 'TargetRefraction'), 0x00221039: ('CS', '1', "Refractive Procedure Occurred", '', 'RefractiveProcedureOccurred'), 0x00221040: ('SQ', '1', "Refractive Surgery Type Code Sequence", '', 'RefractiveSurgeryTypeCodeSequence'), 0x00221044: ('SQ', '1', "Ophthalmic Ultrasound Method Code Sequence", '', 'OphthalmicUltrasoundMethodCodeSequence'), 0x00221045: ('SQ', '1', "Surgically Induced Astigmatism Sequence", '', 'SurgicallyInducedAstigmatismSequence'), 0x00221046: ('CS', '1', "Type of Optical Correction", '', 'TypeOfOpticalCorrection'), 0x00221047: ('SQ', '1', "Toric IOL Power Sequence", '', 'ToricIOLPowerSequence'), 0x00221048: ('SQ', '1', "Predicted Toric Error Sequence", '', 'PredictedToricErrorSequence'), 0x00221049: ('CS', '1', "Pre-Selected for Implantation", '', 'PreSelectedForImplantation'), 0x0022104A: ('SQ', '1', "Toric IOL Power for Exact Emmetropia Sequence", '', 'ToricIOLPowerForExactEmmetropiaSequence'), 0x0022104B: ('SQ', '1', "Toric IOL Power for Exact Target Refraction Sequence", '', 'ToricIOLPowerForExactTargetRefractionSequence'), 0x00221050: ('SQ', '1', "Ophthalmic Axial Length Measurements Sequence", '', 'OphthalmicAxialLengthMeasurementsSequence'), 0x00221053: ('FL', '1', "IOL Power", '', 'IOLPower'), 0x00221054: ('FL', '1', "Predicted Refractive Error", '', 'PredictedRefractiveError'), 0x00221059: ('FL', '1', "Ophthalmic Axial Length Velocity", '', 'OphthalmicAxialLengthVelocity'), 0x00221065: ('LO', '1', "Lens Status Description", '', 'LensStatusDescription'), 0x00221066: ('LO', '1', "Vitreous Status Description", '', 'VitreousStatusDescription'), 0x00221090: ('SQ', '1', "IOL Power Sequence", '', 'IOLPowerSequence'), 0x00221092: ('SQ', '1', "Lens Constant Sequence", '', 'LensConstantSequence'), 0x00221093: ('LO', '1', "IOL Manufacturer", '', 'IOLManufacturer'), 0x00221094: ('LO', '1', "Lens Constant Description", 'Retired', 'LensConstantDescription'), 0x00221095: ('LO', '1', "Implant Name", '', 'ImplantName'), 0x00221096: ('SQ', '1', "Keratometry Measurement Type Code Sequence", '', 'KeratometryMeasurementTypeCodeSequence'), 0x00221097: ('LO', '1', "Implant Part Number", '', 'ImplantPartNumber'), 0x00221100: ('SQ', '1', "Referenced Ophthalmic Axial Measurements Sequence", '', 'ReferencedOphthalmicAxialMeasurementsSequence'), 0x00221101: ('SQ', '1', "Ophthalmic Axial Length Measurements Segment Name Code Sequence", '', 'OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence'), 0x00221103: ('SQ', '1', "Refractive Error Before Refractive Surgery Code Sequence", '', 'RefractiveErrorBeforeRefractiveSurgeryCodeSequence'), 0x00221121: ('FL', '1', "IOL Power For Exact Emmetropia", '', 'IOLPowerForExactEmmetropia'), 0x00221122: ('FL', '1', "IOL Power For Exact Target Refraction", '', 'IOLPowerForExactTargetRefraction'), 0x00221125: ('SQ', '1', "Anterior Chamber Depth Definition Code Sequence", '', 'AnteriorChamberDepthDefinitionCodeSequence'), 0x00221127: ('SQ', '1', "Lens Thickness Sequence", '', 'LensThicknessSequence'), 0x00221128: ('SQ', '1', "Anterior Chamber Depth Sequence", '', 'AnteriorChamberDepthSequence'), 0x0022112A: ('SQ', '1', "Calculation Comment Sequence", '', 'CalculationCommentSequence'), 0x0022112B: ('CS', '1', "Calculation Comment Type", '', 'CalculationCommentType'), 0x0022112C: ('LT', '1', "Calculation Comment", '', 'CalculationComment'), 0x00221130: ('FL', '1', "Lens Thickness", '', 'LensThickness'), 0x00221131: ('FL', '1', "Anterior Chamber Depth", '', 'AnteriorChamberDepth'), 0x00221132: ('SQ', '1', "Source of Lens Thickness Data Code Sequence", '', 'SourceOfLensThicknessDataCodeSequence'), 0x00221133: ('SQ', '1', "Source of Anterior Chamber Depth Data Code Sequence", '', 'SourceOfAnteriorChamberDepthDataCodeSequence'), 0x00221134: ('SQ', '1', "Source of Refractive Measurements Sequence", '', 'SourceOfRefractiveMeasurementsSequence'), 0x00221135: ('SQ', '1', "Source of Refractive Measurements Code Sequence", '', 'SourceOfRefractiveMeasurementsCodeSequence'), 0x00221140: ('CS', '1', "Ophthalmic Axial Length Measurement Modified", '', 'OphthalmicAxialLengthMeasurementModified'), 0x00221150: ('SQ', '1', "Ophthalmic Axial Length Data Source Code Sequence", '', 'OphthalmicAxialLengthDataSourceCodeSequence'), 0x00221153: ('SQ', '1', "Ophthalmic Axial Length Acquisition Method Code Sequence", 'Retired', 'OphthalmicAxialLengthAcquisitionMethodCodeSequence'), 0x00221155: ('FL', '1', "Signal to Noise Ratio", '', 'SignalToNoiseRatio'), 0x00221159: ('LO', '1', "Ophthalmic Axial Length Data Source Description", '', 'OphthalmicAxialLengthDataSourceDescription'), 0x00221210: ('SQ', '1', "Ophthalmic Axial Length Measurements Total Length Sequence", '', 'OphthalmicAxialLengthMeasurementsTotalLengthSequence'), 0x00221211: ('SQ', '1', "Ophthalmic Axial Length Measurements Segmental Length Sequence", '', 'OphthalmicAxialLengthMeasurementsSegmentalLengthSequence'), 0x00221212: ('SQ', '1', "Ophthalmic Axial Length Measurements Length Summation Sequence", '', 'OphthalmicAxialLengthMeasurementsLengthSummationSequence'), 0x00221220: ('SQ', '1', "Ultrasound Ophthalmic Axial Length Measurements Sequence", '', 'UltrasoundOphthalmicAxialLengthMeasurementsSequence'), 0x00221225: ('SQ', '1', "Optical Ophthalmic Axial Length Measurements Sequence", '', 'OpticalOphthalmicAxialLengthMeasurementsSequence'), 0x00221230: ('SQ', '1', "Ultrasound Selected Ophthalmic Axial Length Sequence", '', 'UltrasoundSelectedOphthalmicAxialLengthSequence'), 0x00221250: ('SQ', '1', "Ophthalmic Axial Length Selection Method Code Sequence", '', 'OphthalmicAxialLengthSelectionMethodCodeSequence'), 0x00221255: ('SQ', '1', "Optical Selected Ophthalmic Axial Length Sequence", '', 'OpticalSelectedOphthalmicAxialLengthSequence'), 0x00221257: ('SQ', '1', "Selected Segmental Ophthalmic Axial Length Sequence", '', 'SelectedSegmentalOphthalmicAxialLengthSequence'), 0x00221260: ('SQ', '1', "Selected Total Ophthalmic Axial Length Sequence", '', 'SelectedTotalOphthalmicAxialLengthSequence'), 0x00221262: ('SQ', '1', "Ophthalmic Axial Length Quality Metric Sequence", '', 'OphthalmicAxialLengthQualityMetricSequence'), 0x00221265: ('SQ', '1', "Ophthalmic Axial Length Quality Metric Type Code Sequence", 'Retired', 'OphthalmicAxialLengthQualityMetricTypeCodeSequence'), 0x00221273: ('LO', '1', "Ophthalmic Axial Length Quality Metric Type Description", 'Retired', 'OphthalmicAxialLengthQualityMetricTypeDescription'), 0x00221300: ('SQ', '1', "Intraocular Lens Calculations Right Eye Sequence", '', 'IntraocularLensCalculationsRightEyeSequence'), 0x00221310: ('SQ', '1', "Intraocular Lens Calculations Left Eye Sequence", '', 'IntraocularLensCalculationsLeftEyeSequence'), 0x00221330: ('SQ', '1', "Referenced Ophthalmic Axial Length Measurement QC Image Sequence", '', 'ReferencedOphthalmicAxialLengthMeasurementQCImageSequence'), 0x00221415: ('CS', '1', "Ophthalmic Mapping Device Type", '', 'OphthalmicMappingDeviceType'), 0x00221420: ('SQ', '1', "Acquisition Method Code Sequence", '', 'AcquisitionMethodCodeSequence'), 0x00221423: ('SQ', '1', "Acquisition Method Algorithm Sequence", '', 'AcquisitionMethodAlgorithmSequence'), 0x00221436: ('SQ', '1', "Ophthalmic Thickness Map Type Code Sequence", '', 'OphthalmicThicknessMapTypeCodeSequence'), 0x00221443: ('SQ', '1', "Ophthalmic Thickness Mapping Normals Sequence", '', 'OphthalmicThicknessMappingNormalsSequence'), 0x00221445: ('SQ', '1', "Retinal Thickness Definition Code Sequence", '', 'RetinalThicknessDefinitionCodeSequence'), 0x00221450: ('SQ', '1', "Pixel Value Mapping to Coded Concept Sequence", '', 'PixelValueMappingToCodedConceptSequence'), 0x00221452: ('US or SS', '1', "Mapped Pixel Value", '', 'MappedPixelValue'), 0x00221454: ('LO', '1', "Pixel Value Mapping Explanation", '', 'PixelValueMappingExplanation'), 0x00221458: ('SQ', '1', "Ophthalmic Thickness Map Quality Threshold Sequence", '', 'OphthalmicThicknessMapQualityThresholdSequence'), 0x00221460: ('FL', '1', "Ophthalmic Thickness Map Threshold Quality Rating", '', 'OphthalmicThicknessMapThresholdQualityRating'), 0x00221463: ('FL', '2', "Anatomic Structure Reference Point", '', 'AnatomicStructureReferencePoint'), 0x00221465: ('SQ', '1', "Registration to Localizer Sequence", '', 'RegistrationToLocalizerSequence'), 0x00221466: ('CS', '1', "Registered Localizer Units", '', 'RegisteredLocalizerUnits'), 0x00221467: ('FL', '2', "Registered Localizer Top Left Hand Corner", '', 'RegisteredLocalizerTopLeftHandCorner'), 0x00221468: ('FL', '2', "Registered Localizer Bottom Right Hand Corner", '', 'RegisteredLocalizerBottomRightHandCorner'), 0x00221470: ('SQ', '1', "Ophthalmic Thickness Map Quality Rating Sequence", '', 'OphthalmicThicknessMapQualityRatingSequence'), 0x00221472: ('SQ', '1', "Relevant OPT Attributes Sequence", '', 'RelevantOPTAttributesSequence'), 0x00221512: ('SQ', '1', "Transformation Method Code Sequence", '', 'TransformationMethodCodeSequence'), 0x00221513: ('SQ', '1', "Transformation Algorithm Sequence", '', 'TransformationAlgorithmSequence'), 0x00221515: ('CS', '1', "Ophthalmic Axial Length Method", '', 'OphthalmicAxialLengthMethod'), 0x00221517: ('FL', '1', "Ophthalmic FOV", '', 'OphthalmicFOV'), 0x00221518: ('SQ', '1', "Two Dimensional to Three Dimensional Map Sequence", '', 'TwoDimensionalToThreeDimensionalMapSequence'), 0x00221525: ('SQ', '1', "Wide Field Ophthalmic Photography Quality Rating Sequence", '', 'WideFieldOphthalmicPhotographyQualityRatingSequence'), 0x00221526: ('SQ', '1', "Wide Field Ophthalmic Photography Quality Threshold Sequence", '', 'WideFieldOphthalmicPhotographyQualityThresholdSequence'), 0x00221527: ('FL', '1', "Wide Field Ophthalmic Photography Threshold Quality Rating", '', 'WideFieldOphthalmicPhotographyThresholdQualityRating'), 0x00221528: ('FL', '1', "X Coordinates Center Pixel View Angle", '', 'XCoordinatesCenterPixelViewAngle'), 0x00221529: ('FL', '1', "Y Coordinates Center Pixel View Angle", '', 'YCoordinatesCenterPixelViewAngle'), 0x00221530: ('UL', '1', "Number of Map Points", '', 'NumberOfMapPoints'), 0x00221531: ('OF', '1', "Two Dimensional to Three Dimensional Map Data", '', 'TwoDimensionalToThreeDimensionalMapData'), 0x00221612: ('SQ', '1', "Derivation Algorithm Sequence", '', 'DerivationAlgorithmSequence'), 0x00221615: ('SQ', '1', "Ophthalmic Image Type Code Sequence", '', 'OphthalmicImageTypeCodeSequence'), 0x00221616: ('LO', '1', "Ophthalmic Image Type Description", '', 'OphthalmicImageTypeDescription'), 0x00221618: ('SQ', '1', "Scan Pattern Type Code Sequence", '', 'ScanPatternTypeCodeSequence'), 0x00221620: ('SQ', '1', "Referenced Surface Mesh Identification Sequence", '', 'ReferencedSurfaceMeshIdentificationSequence'), 0x00221622: ('CS', '1', "Ophthalmic Volumetric Properties Flag", '', 'OphthalmicVolumetricPropertiesFlag'), 0x00221624: ('FL', '1', "Ophthalmic Anatomic Reference Point X-Coordinate", '', 'OphthalmicAnatomicReferencePointXCoordinate'), 0x00221626: ('FL', '1', "Ophthalmic Anatomic Reference Point Y-Coordinate", '', 'OphthalmicAnatomicReferencePointYCoordinate'), 0x00221628: ('SQ', '1', "Ophthalmic En Face Image Quality Rating Sequence", '', 'OphthalmicEnFaceImageQualityRatingSequence'), 0x00221630: ('DS', '1', "Quality Threshold", '', 'QualityThreshold'), 0x00221640: ('SQ', '1', "OCT B-scan Analysis Acquisition Parameters Sequence", '', 'OCTBscanAnalysisAcquisitionParametersSequence'), 0x00221642: ('UL', '1', "Number of B-scans Per Frame", '', 'NumberOfBscansPerFrame'), 0x00221643: ('FL', '1', "B-scan Slab Thickness", '', 'BscanSlabThickness'), 0x00221644: ('FL', '1', "Distance Between B-scan Slabs", '', 'DistanceBetweenBscanSlabs'), 0x00221645: ('FL', '1', "B-scan Cycle Time", '', 'BscanCycleTime'), 0x00221646: ('FL', '1-n', "B-scan Cycle Time Vector", '', 'BscanCycleTimeVector'), 0x00221649: ('FL', '1', "A-scan Rate", '', 'AscanRate'), 0x00221650: ('FL', '1', "B-scan Rate", '', 'BscanRate'), 0x00221658: ('UL', '1', "Surface Mesh Z-Pixel Offset", '', 'SurfaceMeshZPixelOffset'), 0x00240010: ('FL', '1', "Visual Field Horizontal Extent", '', 'VisualFieldHorizontalExtent'), 0x00240011: ('FL', '1', "Visual Field Vertical Extent", '', 'VisualFieldVerticalExtent'), 0x00240012: ('CS', '1', "Visual Field Shape", '', 'VisualFieldShape'), 0x00240016: ('SQ', '1', "Screening Test Mode Code Sequence", '', 'ScreeningTestModeCodeSequence'), 0x00240018: ('FL', '1', "Maximum Stimulus Luminance", '', 'MaximumStimulusLuminance'), 0x00240020: ('FL', '1', "Background Luminance", '', 'BackgroundLuminance'), 0x00240021: ('SQ', '1', "Stimulus Color Code Sequence", '', 'StimulusColorCodeSequence'), 0x00240024: ('SQ', '1', "Background Illumination Color Code Sequence", '', 'BackgroundIlluminationColorCodeSequence'), 0x00240025: ('FL', '1', "Stimulus Area", '', 'StimulusArea'), 0x00240028: ('FL', '1', "Stimulus Presentation Time", '', 'StimulusPresentationTime'), 0x00240032: ('SQ', '1', "Fixation Sequence", '', 'FixationSequence'), 0x00240033: ('SQ', '1', "Fixation Monitoring Code Sequence", '', 'FixationMonitoringCodeSequence'), 0x00240034: ('SQ', '1', "Visual Field Catch Trial Sequence", '', 'VisualFieldCatchTrialSequence'), 0x00240035: ('US', '1', "Fixation Checked Quantity", '', 'FixationCheckedQuantity'), 0x00240036: ('US', '1', "Patient Not Properly Fixated Quantity", '', 'PatientNotProperlyFixatedQuantity'), 0x00240037: ('CS', '1', "Presented Visual Stimuli Data Flag", '', 'PresentedVisualStimuliDataFlag'), 0x00240038: ('US', '1', "Number of Visual Stimuli", '', 'NumberOfVisualStimuli'), 0x00240039: ('CS', '1', "Excessive Fixation Losses Data Flag", '', 'ExcessiveFixationLossesDataFlag'), 0x00240040: ('CS', '1', "Excessive Fixation Losses", '', 'ExcessiveFixationLosses'), 0x00240042: ('US', '1', "Stimuli Retesting Quantity", '', 'StimuliRetestingQuantity'), 0x00240044: ('LT', '1', "Comments on Patient's Performance of Visual Field", '', 'CommentsOnPatientPerformanceOfVisualField'), 0x00240045: ('CS', '1', "False Negatives Estimate Flag", '', 'FalseNegativesEstimateFlag'), 0x00240046: ('FL', '1', "False Negatives Estimate", '', 'FalseNegativesEstimate'), 0x00240048: ('US', '1', "Negative Catch Trials Quantity", '', 'NegativeCatchTrialsQuantity'), 0x00240050: ('US', '1', "False Negatives Quantity", '', 'FalseNegativesQuantity'), 0x00240051: ('CS', '1', "Excessive False Negatives Data Flag", '', 'ExcessiveFalseNegativesDataFlag'), 0x00240052: ('CS', '1', "Excessive False Negatives", '', 'ExcessiveFalseNegatives'), 0x00240053: ('CS', '1', "False Positives Estimate Flag", '', 'FalsePositivesEstimateFlag'), 0x00240054: ('FL', '1', "False Positives Estimate", '', 'FalsePositivesEstimate'), 0x00240055: ('CS', '1', "Catch Trials Data Flag", '', 'CatchTrialsDataFlag'), 0x00240056: ('US', '1', "Positive Catch Trials Quantity", '', 'PositiveCatchTrialsQuantity'), 0x00240057: ('CS', '1', "Test Point Normals Data Flag", '', 'TestPointNormalsDataFlag'), 0x00240058: ('SQ', '1', "Test Point Normals Sequence", '', 'TestPointNormalsSequence'), 0x00240059: ('CS', '1', "Global Deviation Probability Normals Flag", '', 'GlobalDeviationProbabilityNormalsFlag'), 0x00240060: ('US', '1', "False Positives Quantity", '', 'FalsePositivesQuantity'), 0x00240061: ('CS', '1', "Excessive False Positives Data Flag", '', 'ExcessiveFalsePositivesDataFlag'), 0x00240062: ('CS', '1', "Excessive False Positives", '', 'ExcessiveFalsePositives'), 0x00240063: ('CS', '1', "Visual Field Test Normals Flag", '', 'VisualFieldTestNormalsFlag'), 0x00240064: ('SQ', '1', "Results Normals Sequence", '', 'ResultsNormalsSequence'), 0x00240065: ('SQ', '1', "Age Corrected Sensitivity Deviation Algorithm Sequence", '', 'AgeCorrectedSensitivityDeviationAlgorithmSequence'), 0x00240066: ('FL', '1', "Global Deviation From Normal", '', 'GlobalDeviationFromNormal'), 0x00240067: ('SQ', '1', "Generalized Defect Sensitivity Deviation Algorithm Sequence", '', 'GeneralizedDefectSensitivityDeviationAlgorithmSequence'), 0x00240068: ('FL', '1', "Localized Deviation From Normal", '', 'LocalizedDeviationFromNormal'), 0x00240069: ('LO', '1', "Patient Reliability Indicator", '', 'PatientReliabilityIndicator'), 0x00240070: ('FL', '1', "Visual Field Mean Sensitivity", '', 'VisualFieldMeanSensitivity'), 0x00240071: ('FL', '1', "Global Deviation Probability", '', 'GlobalDeviationProbability'), 0x00240072: ('CS', '1', "Local Deviation Probability Normals Flag", '', 'LocalDeviationProbabilityNormalsFlag'), 0x00240073: ('FL', '1', "Localized Deviation Probability", '', 'LocalizedDeviationProbability'), 0x00240074: ('CS', '1', "Short Term Fluctuation Calculated", '', 'ShortTermFluctuationCalculated'), 0x00240075: ('FL', '1', "Short Term Fluctuation", '', 'ShortTermFluctuation'), 0x00240076: ('CS', '1', "Short Term Fluctuation Probability Calculated", '', 'ShortTermFluctuationProbabilityCalculated'), 0x00240077: ('FL', '1', "Short Term Fluctuation Probability", '', 'ShortTermFluctuationProbability'), 0x00240078: ('CS', '1', "Corrected Localized Deviation From Normal Calculated", '', 'CorrectedLocalizedDeviationFromNormalCalculated'), 0x00240079: ('FL', '1', "Corrected Localized Deviation From Normal", '', 'CorrectedLocalizedDeviationFromNormal'), 0x00240080: ('CS', '1', "Corrected Localized Deviation From Normal Probability Calculated", '', 'CorrectedLocalizedDeviationFromNormalProbabilityCalculated'), 0x00240081: ('FL', '1', "Corrected Localized Deviation From Normal Probability", '', 'CorrectedLocalizedDeviationFromNormalProbability'), 0x00240083: ('SQ', '1', "Global Deviation Probability Sequence", '', 'GlobalDeviationProbabilitySequence'), 0x00240085: ('SQ', '1', "Localized Deviation Probability Sequence", '', 'LocalizedDeviationProbabilitySequence'), 0x00240086: ('CS', '1', "Foveal Sensitivity Measured", '', 'FovealSensitivityMeasured'), 0x00240087: ('FL', '1', "Foveal Sensitivity", '', 'FovealSensitivity'), 0x00240088: ('FL', '1', "Visual Field Test Duration", '', 'VisualFieldTestDuration'), 0x00240089: ('SQ', '1', "Visual Field Test Point Sequence", '', 'VisualFieldTestPointSequence'), 0x00240090: ('FL', '1', "Visual Field Test Point X-Coordinate", '', 'VisualFieldTestPointXCoordinate'), 0x00240091: ('FL', '1', "Visual Field Test Point Y-Coordinate", '', 'VisualFieldTestPointYCoordinate'), 0x00240092: ('FL', '1', "Age Corrected Sensitivity Deviation Value", '', 'AgeCorrectedSensitivityDeviationValue'), 0x00240093: ('CS', '1', "Stimulus Results", '', 'StimulusResults'), 0x00240094: ('FL', '1', "Sensitivity Value", '', 'SensitivityValue'), 0x00240095: ('CS', '1', "Retest Stimulus Seen", '', 'RetestStimulusSeen'), 0x00240096: ('FL', '1', "Retest Sensitivity Value", '', 'RetestSensitivityValue'), 0x00240097: ('SQ', '1', "Visual Field Test Point Normals Sequence", '', 'VisualFieldTestPointNormalsSequence'), 0x00240098: ('FL', '1', "Quantified Defect", '', 'QuantifiedDefect'), 0x00240100: ('FL', '1', "Age Corrected Sensitivity Deviation Probability Value", '', 'AgeCorrectedSensitivityDeviationProbabilityValue'), 0x00240102: ('CS', '1', "Generalized Defect Corrected Sensitivity Deviation Flag", '', 'GeneralizedDefectCorrectedSensitivityDeviationFlag'), 0x00240103: ('FL', '1', "Generalized Defect Corrected Sensitivity Deviation Value", '', 'GeneralizedDefectCorrectedSensitivityDeviationValue'), 0x00240104: ('FL', '1', "Generalized Defect Corrected Sensitivity Deviation Probability Value", '', 'GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue'), 0x00240105: ('FL', '1', "Minimum Sensitivity Value", '', 'MinimumSensitivityValue'), 0x00240106: ('CS', '1', "Blind Spot Localized", '', 'BlindSpotLocalized'), 0x00240107: ('FL', '1', "Blind Spot X-Coordinate", '', 'BlindSpotXCoordinate'), 0x00240108: ('FL', '1', "Blind Spot Y-Coordinate", '', 'BlindSpotYCoordinate'), 0x00240110: ('SQ', '1', "Visual Acuity Measurement Sequence", '', 'VisualAcuityMeasurementSequence'), 0x00240112: ('SQ', '1', "Refractive Parameters Used on Patient Sequence", '', 'RefractiveParametersUsedOnPatientSequence'), 0x00240113: ('CS', '1', "Measurement Laterality", '', 'MeasurementLaterality'), 0x00240114: ('SQ', '1', "Ophthalmic Patient Clinical Information Left Eye Sequence", '', 'OphthalmicPatientClinicalInformationLeftEyeSequence'), 0x00240115: ('SQ', '1', "Ophthalmic Patient Clinical Information Right Eye Sequence", '', 'OphthalmicPatientClinicalInformationRightEyeSequence'), 0x00240117: ('CS', '1', "Foveal Point Normative Data Flag", '', 'FovealPointNormativeDataFlag'), 0x00240118: ('FL', '1', "Foveal Point Probability Value", '', 'FovealPointProbabilityValue'), 0x00240120: ('CS', '1', "Screening Baseline Measured", '', 'ScreeningBaselineMeasured'), 0x00240122: ('SQ', '1', "Screening Baseline Measured Sequence", '', 'ScreeningBaselineMeasuredSequence'), 0x00240124: ('CS', '1', "Screening Baseline Type", '', 'ScreeningBaselineType'), 0x00240126: ('FL', '1', "Screening Baseline Value", '', 'ScreeningBaselineValue'), 0x00240202: ('LO', '1', "Algorithm Source", '', 'AlgorithmSource'), 0x00240306: ('LO', '1', "Data Set Name", '', 'DataSetName'), 0x00240307: ('LO', '1', "Data Set Version", '', 'DataSetVersion'), 0x00240308: ('LO', '1', "Data Set Source", '', 'DataSetSource'), 0x00240309: ('LO', '1', "Data Set Description", '', 'DataSetDescription'), 0x00240317: ('SQ', '1', "Visual Field Test Reliability Global Index Sequence", '', 'VisualFieldTestReliabilityGlobalIndexSequence'), 0x00240320: ('SQ', '1', "Visual Field Global Results Index Sequence", '', 'VisualFieldGlobalResultsIndexSequence'), 0x00240325: ('SQ', '1', "Data Observation Sequence", '', 'DataObservationSequence'), 0x00240338: ('CS', '1', "Index Normals Flag", '', 'IndexNormalsFlag'), 0x00240341: ('FL', '1', "Index Probability", '', 'IndexProbability'), 0x00240344: ('SQ', '1', "Index Probability Sequence", '', 'IndexProbabilitySequence'), 0x00280002: ('US', '1', "Samples per Pixel", '', 'SamplesPerPixel'), 0x00280003: ('US', '1', "Samples per Pixel Used", '', 'SamplesPerPixelUsed'), 0x00280004: ('CS', '1', "Photometric Interpretation", '', 'PhotometricInterpretation'), 0x00280005: ('US', '1', "Image Dimensions", 'Retired', 'ImageDimensions'), 0x00280006: ('US', '1', "Planar Configuration", '', 'PlanarConfiguration'), 0x00280008: ('IS', '1', "Number of Frames", '', 'NumberOfFrames'), 0x00280009: ('AT', '1-n', "Frame Increment Pointer", '', 'FrameIncrementPointer'), 0x0028000A: ('AT', '1-n', "Frame Dimension Pointer", '', 'FrameDimensionPointer'), 0x00280010: ('US', '1', "Rows", '', 'Rows'), 0x00280011: ('US', '1', "Columns", '', 'Columns'), 0x00280012: ('US', '1', "Planes", 'Retired', 'Planes'), 0x00280014: ('US', '1', "Ultrasound Color Data Present", '', 'UltrasoundColorDataPresent'), 0x00280020: ('OB', '1', "Retired-blank", 'Retired', ''), 0x00280030: ('DS', '2', "Pixel Spacing", '', 'PixelSpacing'), 0x00280031: ('DS', '2', "Zoom Factor", '', 'ZoomFactor'), 0x00280032: ('DS', '2', "Zoom Center", '', 'ZoomCenter'), 0x00280034: ('IS', '2', "Pixel Aspect Ratio", '', 'PixelAspectRatio'), 0x00280040: ('CS', '1', "Image Format", 'Retired', 'ImageFormat'), 0x00280050: ('LO', '1-n', "Manipulated Image", 'Retired', 'ManipulatedImage'), 0x00280051: ('CS', '1-n', "Corrected Image", '', 'CorrectedImage'), 0x0028005F: ('LO', '1', "Compression Recognition Code", 'Retired', 'CompressionRecognitionCode'), 0x00280060: ('CS', '1', "Compression Code", 'Retired', 'CompressionCode'), 0x00280061: ('SH', '1', "Compression Originator", 'Retired', 'CompressionOriginator'), 0x00280062: ('LO', '1', "Compression Label", 'Retired', 'CompressionLabel'), 0x00280063: ('SH', '1', "Compression Description", 'Retired', 'CompressionDescription'), 0x00280065: ('CS', '1-n', "Compression Sequence", 'Retired', 'CompressionSequence'), 0x00280066: ('AT', '1-n', "Compression Step Pointers", 'Retired', 'CompressionStepPointers'), 0x00280068: ('US', '1', "Repeat Interval", 'Retired', 'RepeatInterval'), 0x00280069: ('US', '1', "Bits Grouped", 'Retired', 'BitsGrouped'), 0x00280070: ('US', '1-n', "Perimeter Table", 'Retired', 'PerimeterTable'), 0x00280071: ('US or SS', '1', "Perimeter Value", 'Retired', 'PerimeterValue'), 0x00280080: ('US', '1', "Predictor Rows", 'Retired', 'PredictorRows'), 0x00280081: ('US', '1', "Predictor Columns", 'Retired', 'PredictorColumns'), 0x00280082: ('US', '1-n', "Predictor Constants", 'Retired', 'PredictorConstants'), 0x00280090: ('CS', '1', "Blocked Pixels", 'Retired', 'BlockedPixels'), 0x00280091: ('US', '1', "Block Rows", 'Retired', 'BlockRows'), 0x00280092: ('US', '1', "Block Columns", 'Retired', 'BlockColumns'), 0x00280093: ('US', '1', "Row Overlap", 'Retired', 'RowOverlap'), 0x00280094: ('US', '1', "Column Overlap", 'Retired', 'ColumnOverlap'), 0x00280100: ('US', '1', "Bits Allocated", '', 'BitsAllocated'), 0x00280101: ('US', '1', "Bits Stored", '', 'BitsStored'), 0x00280102: ('US', '1', "High Bit", '', 'HighBit'), 0x00280103: ('US', '1', "Pixel Representation", '', 'PixelRepresentation'), 0x00280104: ('US or SS', '1', "Smallest Valid Pixel Value", 'Retired', 'SmallestValidPixelValue'), 0x00280105: ('US or SS', '1', "Largest Valid Pixel Value", 'Retired', 'LargestValidPixelValue'), 0x00280106: ('US or SS', '1', "Smallest Image Pixel Value", '', 'SmallestImagePixelValue'), 0x00280107: ('US or SS', '1', "Largest Image Pixel Value", '', 'LargestImagePixelValue'), 0x00280108: ('US or SS', '1', "Smallest Pixel Value in Series", '', 'SmallestPixelValueInSeries'), 0x00280109: ('US or SS', '1', "Largest Pixel Value in Series", '', 'LargestPixelValueInSeries'), 0x00280110: ('US or SS', '1', "Smallest Image Pixel Value in Plane", 'Retired', 'SmallestImagePixelValueInPlane'), 0x00280111: ('US or SS', '1', "Largest Image Pixel Value in Plane", 'Retired', 'LargestImagePixelValueInPlane'), 0x00280120: ('US or SS', '1', "Pixel Padding Value", '', 'PixelPaddingValue'), 0x00280121: ('US or SS', '1', "Pixel Padding Range Limit", '', 'PixelPaddingRangeLimit'), 0x00280122: ('FL', '1', "Float Pixel Padding Value", '', 'FloatPixelPaddingValue'), 0x00280123: ('FD', '1', "Double Float Pixel Padding Value", '', 'DoubleFloatPixelPaddingValue'), 0x00280124: ('FL', '1', "Float Pixel Padding Range Limit", '', 'FloatPixelPaddingRangeLimit'), 0x00280125: ('FD', '1', "Double Float Pixel Padding Range Limit", '', 'DoubleFloatPixelPaddingRangeLimit'), 0x00280200: ('US', '1', "Image Location", 'Retired', 'ImageLocation'), 0x00280300: ('CS', '1', "Quality Control Image", '', 'QualityControlImage'), 0x00280301: ('CS', '1', "Burned In Annotation", '', 'BurnedInAnnotation'), 0x00280302: ('CS', '1', "Recognizable Visual Features", '', 'RecognizableVisualFeatures'), 0x00280303: ('CS', '1', "Longitudinal Temporal Information Modified", '', 'LongitudinalTemporalInformationModified'), 0x00280304: ('UI', '1', "Referenced Color Palette Instance UID", '', 'ReferencedColorPaletteInstanceUID'), 0x00280400: ('LO', '1', "Transform Label", 'Retired', 'TransformLabel'), 0x00280401: ('LO', '1', "Transform Version Number", 'Retired', 'TransformVersionNumber'), 0x00280402: ('US', '1', "Number of Transform Steps", 'Retired', 'NumberOfTransformSteps'), 0x00280403: ('LO', '1-n', "Sequence of Compressed Data", 'Retired', 'SequenceOfCompressedData'), 0x00280404: ('AT', '1-n', "Details of Coefficients", 'Retired', 'DetailsOfCoefficients'), 0x00280700: ('LO', '1', "DCT Label", 'Retired', 'DCTLabel'), 0x00280701: ('CS', '1-n', "Data Block Description", 'Retired', 'DataBlockDescription'), 0x00280702: ('AT', '1-n', "Data Block", 'Retired', 'DataBlock'), 0x00280710: ('US', '1', "Normalization Factor Format", 'Retired', 'NormalizationFactorFormat'), 0x00280720: ('US', '1', "Zonal Map Number Format", 'Retired', 'ZonalMapNumberFormat'), 0x00280721: ('AT', '1-n', "Zonal Map Location", 'Retired', 'ZonalMapLocation'), 0x00280722: ('US', '1', "Zonal Map Format", 'Retired', 'ZonalMapFormat'), 0x00280730: ('US', '1', "Adaptive Map Format", 'Retired', 'AdaptiveMapFormat'), 0x00280740: ('US', '1', "Code Number Format", 'Retired', 'CodeNumberFormat'), 0x00280A02: ('CS', '1', "Pixel Spacing Calibration Type", '', 'PixelSpacingCalibrationType'), 0x00280A04: ('LO', '1', "Pixel Spacing Calibration Description", '', 'PixelSpacingCalibrationDescription'), 0x00281040: ('CS', '1', "Pixel Intensity Relationship", '', 'PixelIntensityRelationship'), 0x00281041: ('SS', '1', "Pixel Intensity Relationship Sign", '', 'PixelIntensityRelationshipSign'), 0x00281050: ('DS', '1-n', "Window Center", '', 'WindowCenter'), 0x00281051: ('DS', '1-n', "Window Width", '', 'WindowWidth'), 0x00281052: ('DS', '1', "Rescale Intercept", '', 'RescaleIntercept'), 0x00281053: ('DS', '1', "Rescale Slope", '', 'RescaleSlope'), 0x00281054: ('LO', '1', "Rescale Type", '', 'RescaleType'), 0x00281055: ('LO', '1-n', "Window Center & Width Explanation", '', 'WindowCenterWidthExplanation'), 0x00281056: ('CS', '1', "VOI LUT Function", '', 'VOILUTFunction'), 0x00281080: ('CS', '1', "Gray Scale", 'Retired', 'GrayScale'), 0x00281090: ('CS', '1', "Recommended Viewing Mode", '', 'RecommendedViewingMode'), 0x00281100: ('US or SS', '3', "Gray Lookup Table Descriptor", 'Retired', 'GrayLookupTableDescriptor'), 0x00281101: ('US or SS', '3', "Red Palette Color Lookup Table Descriptor", '', 'RedPaletteColorLookupTableDescriptor'), 0x00281102: ('US or SS', '3', "Green Palette Color Lookup Table Descriptor", '', 'GreenPaletteColorLookupTableDescriptor'), 0x00281103: ('US or SS', '3', "Blue Palette Color Lookup Table Descriptor", '', 'BluePaletteColorLookupTableDescriptor'), 0x00281104: ('US', '3', "Alpha Palette Color Lookup Table Descriptor", '', 'AlphaPaletteColorLookupTableDescriptor'), 0x00281111: ('US or SS', '4', "Large Red Palette Color Lookup Table Descriptor", 'Retired', 'LargeRedPaletteColorLookupTableDescriptor'), 0x00281112: ('US or SS', '4', "Large Green Palette Color Lookup Table Descriptor", 'Retired', 'LargeGreenPaletteColorLookupTableDescriptor'), 0x00281113: ('US or SS', '4', "Large Blue Palette Color Lookup Table Descriptor", 'Retired', 'LargeBluePaletteColorLookupTableDescriptor'), 0x00281199: ('UI', '1', "Palette Color Lookup Table UID", '', 'PaletteColorLookupTableUID'), 0x00281200: ('US or SS or OW', '1-n', "Gray Lookup Table Data", 'Retired', 'GrayLookupTableData'), 0x00281201: ('OW', '1', "Red Palette Color Lookup Table Data", '', 'RedPaletteColorLookupTableData'), 0x00281202: ('OW', '1', "Green Palette Color Lookup Table Data", '', 'GreenPaletteColorLookupTableData'), 0x00281203: ('OW', '1', "Blue Palette Color Lookup Table Data", '', 'BluePaletteColorLookupTableData'), 0x00281204: ('OW', '1', "Alpha Palette Color Lookup Table Data", '', 'AlphaPaletteColorLookupTableData'), 0x00281211: ('OW', '1', "Large Red Palette Color Lookup Table Data", 'Retired', 'LargeRedPaletteColorLookupTableData'), 0x00281212: ('OW', '1', "Large Green Palette Color Lookup Table Data", 'Retired', 'LargeGreenPaletteColorLookupTableData'), 0x00281213: ('OW', '1', "Large Blue Palette Color Lookup Table Data", 'Retired', 'LargeBluePaletteColorLookupTableData'), 0x00281214: ('UI', '1', "Large Palette Color Lookup Table UID", 'Retired', 'LargePaletteColorLookupTableUID'), 0x00281221: ('OW', '1', "Segmented Red Palette Color Lookup Table Data", '', 'SegmentedRedPaletteColorLookupTableData'), 0x00281222: ('OW', '1', "Segmented Green Palette Color Lookup Table Data", '', 'SegmentedGreenPaletteColorLookupTableData'), 0x00281223: ('OW', '1', "Segmented Blue Palette Color Lookup Table Data", '', 'SegmentedBluePaletteColorLookupTableData'), 0x00281224: ('OW', '1', "Segmented Alpha Palette Color Lookup Table Data", '', 'SegmentedAlphaPaletteColorLookupTableData'), 0x00281230: ('SQ', '1', "Stored Value Color Range Sequence", '', 'StoredValueColorRangeSequence'), 0x00281231: ('FD', '1', "Minimum Stored Value Mapped", '', 'MinimumStoredValueMapped'), 0x00281232: ('FD', '1', "Maximum Stored Value Mapped", '', 'MaximumStoredValueMapped'), 0x00281300: ('CS', '1', "Breast Implant Present", '', 'BreastImplantPresent'), 0x00281350: ('CS', '1', "Partial View", '', 'PartialView'), 0x00281351: ('ST', '1', "Partial View Description", '', 'PartialViewDescription'), 0x00281352: ('SQ', '1', "Partial View Code Sequence", '', 'PartialViewCodeSequence'), 0x0028135A: ('CS', '1', "Spatial Locations Preserved", '', 'SpatialLocationsPreserved'), 0x00281401: ('SQ', '1', "Data Frame Assignment Sequence", '', 'DataFrameAssignmentSequence'), 0x00281402: ('CS', '1', "Data Path Assignment", '', 'DataPathAssignment'), 0x00281403: ('US', '1', "Bits Mapped to Color Lookup Table", '', 'BitsMappedToColorLookupTable'), 0x00281404: ('SQ', '1', "Blending LUT 1 Sequence", '', 'BlendingLUT1Sequence'), 0x00281405: ('CS', '1', "Blending LUT 1 Transfer Function", '', 'BlendingLUT1TransferFunction'), 0x00281406: ('FD', '1', "Blending Weight Constant", '', 'BlendingWeightConstant'), 0x00281407: ('US', '3', "Blending Lookup Table Descriptor", '', 'BlendingLookupTableDescriptor'), 0x00281408: ('OW', '1', "Blending Lookup Table Data", '', 'BlendingLookupTableData'), 0x0028140B: ('SQ', '1', "Enhanced Palette Color Lookup Table Sequence", '', 'EnhancedPaletteColorLookupTableSequence'), 0x0028140C: ('SQ', '1', "Blending LUT 2 Sequence", '', 'BlendingLUT2Sequence'), 0x0028140D: ('CS', '1', "Blending LUT 2 Transfer Function", '', 'BlendingLUT2TransferFunction'), 0x0028140E: ('CS', '1', "Data Path ID", '', 'DataPathID'), 0x0028140F: ('CS', '1', "RGB LUT Transfer Function", '', 'RGBLUTTransferFunction'), 0x00281410: ('CS', '1', "Alpha LUT Transfer Function", '', 'AlphaLUTTransferFunction'), 0x00282000: ('OB', '1', "ICC Profile", '', 'ICCProfile'), 0x00282002: ('CS', '1', "Color Space", '', 'ColorSpace'), 0x00282110: ('CS', '1', "Lossy Image Compression", '', 'LossyImageCompression'), 0x00282112: ('DS', '1-n', "Lossy Image Compression Ratio", '', 'LossyImageCompressionRatio'), 0x00282114: ('CS', '1-n', "Lossy Image Compression Method", '', 'LossyImageCompressionMethod'), 0x00283000: ('SQ', '1', "Modality LUT Sequence", '', 'ModalityLUTSequence'), 0x00283001: ('SQ', '1', "Variable Modality LUT Sequence", '', 'VariableModalityLUTSequence'), 0x00283002: ('US or SS', '3', "LUT Descriptor", '', 'LUTDescriptor'), 0x00283003: ('LO', '1', "LUT Explanation", '', 'LUTExplanation'), 0x00283004: ('LO', '1', "Modality LUT Type", '', 'ModalityLUTType'), 0x00283006: ('US or OW', '1-n', "LUT Data", '', 'LUTData'), 0x00283010: ('SQ', '1', "VOI LUT Sequence", '', 'VOILUTSequence'), 0x00283110: ('SQ', '1', "Softcopy VOI LUT Sequence", '', 'SoftcopyVOILUTSequence'), 0x00284000: ('LT', '1', "Image Presentation Comments", 'Retired', 'ImagePresentationComments'), 0x00285000: ('SQ', '1', "Bi-Plane Acquisition Sequence", 'Retired', 'BiPlaneAcquisitionSequence'), 0x00286010: ('US', '1', "Representative Frame Number", '', 'RepresentativeFrameNumber'), 0x00286020: ('US', '1-n', "Frame Numbers of Interest (FOI)", '', 'FrameNumbersOfInterest'), 0x00286022: ('LO', '1-n', "Frame of Interest Description", '', 'FrameOfInterestDescription'), 0x00286023: ('CS', '1-n', "Frame of Interest Type", '', 'FrameOfInterestType'), 0x00286030: ('US', '1-n', "Mask Pointer(s)", 'Retired', 'MaskPointers'), 0x00286040: ('US', '1-n', "R Wave Pointer", '', 'RWavePointer'), 0x00286100: ('SQ', '1', "Mask Subtraction Sequence", '', 'MaskSubtractionSequence'), 0x00286101: ('CS', '1', "Mask Operation", '', 'MaskOperation'), 0x00286102: ('US', '2-2n', "Applicable Frame Range", '', 'ApplicableFrameRange'), 0x00286110: ('US', '1-n', "Mask Frame Numbers", '', 'MaskFrameNumbers'), 0x00286112: ('US', '1', "Contrast Frame Averaging", '', 'ContrastFrameAveraging'), 0x00286114: ('FL', '2', "Mask Sub-pixel Shift", '', 'MaskSubPixelShift'), 0x00286120: ('SS', '1', "TID Offset", '', 'TIDOffset'), 0x00286190: ('ST', '1', "Mask Operation Explanation", '', 'MaskOperationExplanation'), 0x00287000: ('SQ', '1', "Equipment Administrator Sequence", '', 'EquipmentAdministratorSequence'), 0x00287001: ('US', '1', "Number of Display Subsystems", '', 'NumberOfDisplaySubsystems'), 0x00287002: ('US', '1', "Current Configuration ID", '', 'CurrentConfigurationID'), 0x00287003: ('US', '1', "Display Subsystem ID", '', 'DisplaySubsystemID'), 0x00287004: ('SH', '1', "Display Subsystem Name", '', 'DisplaySubsystemName'), 0x00287005: ('LO', '1', "Display Subsystem Description", '', 'DisplaySubsystemDescription'), 0x00287006: ('CS', '1', "System Status", '', 'SystemStatus'), 0x00287007: ('LO', '1', "System Status Comment", '', 'SystemStatusComment'), 0x00287008: ('SQ', '1', "Target Luminance Characteristics Sequence", '', 'TargetLuminanceCharacteristicsSequence'), 0x00287009: ('US', '1', "Luminance Characteristics ID", '', 'LuminanceCharacteristicsID'), 0x0028700A: ('SQ', '1', "Display Subsystem Configuration Sequence", '', 'DisplaySubsystemConfigurationSequence'), 0x0028700B: ('US', '1', "Configuration ID", '', 'ConfigurationID'), 0x0028700C: ('SH', '1', "Configuration Name", '', 'ConfigurationName'), 0x0028700D: ('LO', '1', "Configuration Description", '', 'ConfigurationDescription'), 0x0028700E: ('US', '1', "Referenced Target Luminance Characteristics ID", '', 'ReferencedTargetLuminanceCharacteristicsID'), 0x0028700F: ('SQ', '1', "QA Results Sequence", '', 'QAResultsSequence'), 0x00287010: ('SQ', '1', "Display Subsystem QA Results Sequence", '', 'DisplaySubsystemQAResultsSequence'), 0x00287011: ('SQ', '1', "Configuration QA Results Sequence", '', 'ConfigurationQAResultsSequence'), 0x00287012: ('SQ', '1', "Measurement Equipment Sequence", '', 'MeasurementEquipmentSequence'), 0x00287013: ('CS', '1-n', "Measurement Functions", '', 'MeasurementFunctions'), 0x00287014: ('CS', '1', "Measurement Equipment Type", '', 'MeasurementEquipmentType'), 0x00287015: ('SQ', '1', "Visual Evaluation Result Sequence", '', 'VisualEvaluationResultSequence'), 0x00287016: ('SQ', '1', "Display Calibration Result Sequence", '', 'DisplayCalibrationResultSequence'), 0x00287017: ('US', '1', "DDL Value", '', 'DDLValue'), 0x00287018: ('FL', '2', "CIExy White Point", '', 'CIExyWhitePoint'), 0x00287019: ('CS', '1', "Display Function Type", '', 'DisplayFunctionType'), 0x0028701A: ('FL', '1', "Gamma Value", '', 'GammaValue'), 0x0028701B: ('US', '1', "Number of Luminance Points", '', 'NumberOfLuminancePoints'), 0x0028701C: ('SQ', '1', "Luminance Response Sequence", '', 'LuminanceResponseSequence'), 0x0028701D: ('FL', '1', "Target Minimum Luminance", '', 'TargetMinimumLuminance'), 0x0028701E: ('FL', '1', "Target Maximum Luminance", '', 'TargetMaximumLuminance'), 0x0028701F: ('FL', '1', "Luminance Value", '', 'LuminanceValue'), 0x00287020: ('LO', '1', "Luminance Response Description", '', 'LuminanceResponseDescription'), 0x00287021: ('CS', '1', "White Point Flag", '', 'WhitePointFlag'), 0x00287022: ('SQ', '1', "Display Device Type Code Sequence", '', 'DisplayDeviceTypeCodeSequence'), 0x00287023: ('SQ', '1', "Display Subsystem Sequence", '', 'DisplaySubsystemSequence'), 0x00287024: ('SQ', '1', "Luminance Result Sequence", '', 'LuminanceResultSequence'), 0x00287025: ('CS', '1', "Ambient Light Value Source", '', 'AmbientLightValueSource'), 0x00287026: ('CS', '1-n', "Measured Characteristics", '', 'MeasuredCharacteristics'), 0x00287027: ('SQ', '1', "Luminance Uniformity Result Sequence", '', 'LuminanceUniformityResultSequence'), 0x00287028: ('SQ', '1', "Visual Evaluation Test Sequence", '', 'VisualEvaluationTestSequence'), 0x00287029: ('CS', '1', "Test Result", '', 'TestResult'), 0x0028702A: ('LO', '1', "Test Result Comment", '', 'TestResultComment'), 0x0028702B: ('CS', '1', "Test Image Validation", '', 'TestImageValidation'), 0x0028702C: ('SQ', '1', "Test Pattern Code Sequence", '', 'TestPatternCodeSequence'), 0x0028702D: ('SQ', '1', "Measurement Pattern Code Sequence", '', 'MeasurementPatternCodeSequence'), 0x0028702E: ('SQ', '1', "Visual Evaluation Method Code Sequence", '', 'VisualEvaluationMethodCodeSequence'), 0x00287FE0: ('UR', '1', "Pixel Data Provider URL", '', 'PixelDataProviderURL'), 0x00289001: ('UL', '1', "Data Point Rows", '', 'DataPointRows'), 0x00289002: ('UL', '1', "Data Point Columns", '', 'DataPointColumns'), 0x00289003: ('CS', '1', "Signal Domain Columns", '', 'SignalDomainColumns'), 0x00289099: ('US', '1', "Largest Monochrome Pixel Value", 'Retired', 'LargestMonochromePixelValue'), 0x00289108: ('CS', '1', "Data Representation", '', 'DataRepresentation'), 0x00289110: ('SQ', '1', "Pixel Measures Sequence", '', 'PixelMeasuresSequence'), 0x00289132: ('SQ', '1', "Frame VOI LUT Sequence", '', 'FrameVOILUTSequence'), 0x00289145: ('SQ', '1', "Pixel Value Transformation Sequence", '', 'PixelValueTransformationSequence'), 0x00289235: ('CS', '1', "Signal Domain Rows", '', 'SignalDomainRows'), 0x00289411: ('FL', '1', "Display Filter Percentage", '', 'DisplayFilterPercentage'), 0x00289415: ('SQ', '1', "Frame Pixel Shift Sequence", '', 'FramePixelShiftSequence'), 0x00289416: ('US', '1', "Subtraction Item ID", '', 'SubtractionItemID'), 0x00289422: ('SQ', '1', "Pixel Intensity Relationship LUT Sequence", '', 'PixelIntensityRelationshipLUTSequence'), 0x00289443: ('SQ', '1', "Frame Pixel Data Properties Sequence", '', 'FramePixelDataPropertiesSequence'), 0x00289444: ('CS', '1', "Geometrical Properties", '', 'GeometricalProperties'), 0x00289445: ('FL', '1', "Geometric Maximum Distortion", '', 'GeometricMaximumDistortion'), 0x00289446: ('CS', '1-n', "Image Processing Applied", '', 'ImageProcessingApplied'), 0x00289454: ('CS', '1', "Mask Selection Mode", '', 'MaskSelectionMode'), 0x00289474: ('CS', '1', "LUT Function", '', 'LUTFunction'), 0x00289478: ('FL', '1', "Mask Visibility Percentage", '', 'MaskVisibilityPercentage'), 0x00289501: ('SQ', '1', "Pixel Shift Sequence", '', 'PixelShiftSequence'), 0x00289502: ('SQ', '1', "Region Pixel Shift Sequence", '', 'RegionPixelShiftSequence'), 0x00289503: ('SS', '2-2n', "Vertices of the Region", '', 'VerticesOfTheRegion'), 0x00289505: ('SQ', '1', "Multi-frame Presentation Sequence", '', 'MultiFramePresentationSequence'), 0x00289506: ('US', '2-2n', "Pixel Shift Frame Range", '', 'PixelShiftFrameRange'), 0x00289507: ('US', '2-2n', "LUT Frame Range", '', 'LUTFrameRange'), 0x00289520: ('DS', '16', "Image to Equipment Mapping Matrix", '', 'ImageToEquipmentMappingMatrix'), 0x00289537: ('CS', '1', "Equipment Coordinate System Identification", '', 'EquipmentCoordinateSystemIdentification'), 0x0032000A: ('CS', '1', "Study Status ID", 'Retired', 'StudyStatusID'), 0x0032000C: ('CS', '1', "Study Priority ID", 'Retired', 'StudyPriorityID'), 0x00320012: ('LO', '1', "Study ID Issuer", 'Retired', 'StudyIDIssuer'), 0x00320032: ('DA', '1', "Study Verified Date", 'Retired', 'StudyVerifiedDate'), 0x00320033: ('TM', '1', "Study Verified Time", 'Retired', 'StudyVerifiedTime'), 0x00320034: ('DA', '1', "Study Read Date", 'Retired', 'StudyReadDate'), 0x00320035: ('TM', '1', "Study Read Time", 'Retired', 'StudyReadTime'), 0x00321000: ('DA', '1', "Scheduled Study Start Date", 'Retired', 'ScheduledStudyStartDate'), 0x00321001: ('TM', '1', "Scheduled Study Start Time", 'Retired', 'ScheduledStudyStartTime'), 0x00321010: ('DA', '1', "Scheduled Study Stop Date", 'Retired', 'ScheduledStudyStopDate'), 0x00321011: ('TM', '1', "Scheduled Study Stop Time", 'Retired', 'ScheduledStudyStopTime'), 0x00321020: ('LO', '1', "Scheduled Study Location", 'Retired', 'ScheduledStudyLocation'), 0x00321021: ('AE', '1-n', "Scheduled Study Location AE Title", 'Retired', 'ScheduledStudyLocationAETitle'), 0x00321030: ('LO', '1', "Reason for Study", 'Retired', 'ReasonForStudy'), 0x00321031: ('SQ', '1', "Requesting Physician Identification Sequence", '', 'RequestingPhysicianIdentificationSequence'), 0x00321032: ('PN', '1', "Requesting Physician", '', 'RequestingPhysician'), 0x00321033: ('LO', '1', "Requesting Service", '', 'RequestingService'), 0x00321034: ('SQ', '1', "Requesting Service Code Sequence", '', 'RequestingServiceCodeSequence'), 0x00321040: ('DA', '1', "Study Arrival Date", 'Retired', 'StudyArrivalDate'), 0x00321041: ('TM', '1', "Study Arrival Time", 'Retired', 'StudyArrivalTime'), 0x00321050: ('DA', '1', "Study Completion Date", 'Retired', 'StudyCompletionDate'), 0x00321051: ('TM', '1', "Study Completion Time", 'Retired', 'StudyCompletionTime'), 0x00321055: ('CS', '1', "Study Component Status ID", 'Retired', 'StudyComponentStatusID'), 0x00321060: ('LO', '1', "Requested Procedure Description", '', 'RequestedProcedureDescription'), 0x00321064: ('SQ', '1', "Requested Procedure Code Sequence", '', 'RequestedProcedureCodeSequence'), 0x00321065: ('SQ', '1', "Requested Laterality Code Sequence", '', 'RequestedLateralityCodeSequence'), 0x00321066: ('UT', '1', "Reason for Visit", '', 'ReasonForVisit'), 0x00321067: ('SQ', '1', "Reason for Visit Code Sequence", '', 'ReasonForVisitCodeSequence'), 0x00321070: ('LO', '1', "Requested Contrast Agent", '', 'RequestedContrastAgent'), 0x00324000: ('LT', '1', "Study Comments", 'Retired', 'StudyComments'), 0x00340001: ('SQ', '1', "Flow Identifier Sequence", '', 'FlowIdentifierSequence'), 0x00340002: ('OB', '1', "Flow Identifier", '', 'FlowIdentifier'), 0x00340003: ('UI', '1', "Flow Transfer Syntax UID", '', 'FlowTransferSyntaxUID'), 0x00340004: ('UL', '1', "Flow RTP Sampling Rate", '', 'FlowRTPSamplingRate'), 0x00340005: ('OB', '1', "Source Identifier", '', 'SourceIdentifier'), 0x00340007: ('OB', '1', "Frame Origin Timestamp", '', 'FrameOriginTimestamp'), 0x00340008: ('CS', '1', "Includes Imaging Subject", '', 'IncludesImagingSubject'), 0x00340009: ('SQ', '1', "Frame Usefulness Group Sequence", '', 'FrameUsefulnessGroupSequence'), 0x0034000A: ('SQ', '1', "Real-Time Bulk Data Flow Sequence", '', 'RealTimeBulkDataFlowSequence'), 0x0034000B: ('SQ', '1', "Camera Position Group Sequence", '', 'CameraPositionGroupSequence'), 0x0034000C: ('CS', '1', "Includes Information", '', 'IncludesInformation'), 0x0034000D: ('SQ', '1', "Time of Frame Group Sequence", '', 'TimeOfFrameGroupSequence'), 0x00380004: ('SQ', '1', "Referenced Patient Alias Sequence", 'Retired', 'ReferencedPatientAliasSequence'), 0x00380008: ('CS', '1', "Visit Status ID", '', 'VisitStatusID'), 0x00380010: ('LO', '1', "Admission ID", '', 'AdmissionID'), 0x00380011: ('LO', '1', "Issuer of Admission ID", 'Retired', 'IssuerOfAdmissionID'), 0x00380014: ('SQ', '1', "Issuer of Admission ID Sequence", '', 'IssuerOfAdmissionIDSequence'), 0x00380016: ('LO', '1', "Route of Admissions", '', 'RouteOfAdmissions'), 0x0038001A: ('DA', '1', "Scheduled Admission Date", 'Retired', 'ScheduledAdmissionDate'), 0x0038001B: ('TM', '1', "Scheduled Admission Time", 'Retired', 'ScheduledAdmissionTime'), 0x0038001C: ('DA', '1', "Scheduled Discharge Date", 'Retired', 'ScheduledDischargeDate'), 0x0038001D: ('TM', '1', "Scheduled Discharge Time", 'Retired', 'ScheduledDischargeTime'), 0x0038001E: ('LO', '1', "Scheduled Patient Institution Residence", 'Retired', 'ScheduledPatientInstitutionResidence'), 0x00380020: ('DA', '1', "Admitting Date", '', 'AdmittingDate'), 0x00380021: ('TM', '1', "Admitting Time", '', 'AdmittingTime'), 0x00380030: ('DA', '1', "Discharge Date", 'Retired', 'DischargeDate'), 0x00380032: ('TM', '1', "Discharge Time", 'Retired', 'DischargeTime'), 0x00380040: ('LO', '1', "Discharge Diagnosis Description", 'Retired', 'DischargeDiagnosisDescription'), 0x00380044: ('SQ', '1', "Discharge Diagnosis Code Sequence", 'Retired', 'DischargeDiagnosisCodeSequence'), 0x00380050: ('LO', '1', "Special Needs", '', 'SpecialNeeds'), 0x00380060: ('LO', '1', "Service Episode ID", '', 'ServiceEpisodeID'), 0x00380061: ('LO', '1', "Issuer of Service Episode ID", 'Retired', 'IssuerOfServiceEpisodeID'), 0x00380062: ('LO', '1', "Service Episode Description", '', 'ServiceEpisodeDescription'), 0x00380064: ('SQ', '1', "Issuer of Service Episode ID Sequence", '', 'IssuerOfServiceEpisodeIDSequence'), 0x00380100: ('SQ', '1', "Pertinent Documents Sequence", '', 'PertinentDocumentsSequence'), 0x00380101: ('SQ', '1', "Pertinent Resources Sequence", '', 'PertinentResourcesSequence'), 0x00380102: ('LO', '1', "Resource Description", '', 'ResourceDescription'), 0x00380300: ('LO', '1', "Current Patient Location", '', 'CurrentPatientLocation'), 0x00380400: ('LO', '1', "Patient's Institution Residence", '', 'PatientInstitutionResidence'), 0x00380500: ('LO', '1', "Patient State", '', 'PatientState'), 0x00380502: ('SQ', '1', "Patient Clinical Trial Participation Sequence", '', 'PatientClinicalTrialParticipationSequence'), 0x00384000: ('LT', '1', "Visit Comments", '', 'VisitComments'), 0x003A0004: ('CS', '1', "Waveform Originality", '', 'WaveformOriginality'), 0x003A0005: ('US', '1', "Number of Waveform Channels", '', 'NumberOfWaveformChannels'), 0x003A0010: ('UL', '1', "Number of Waveform Samples", '', 'NumberOfWaveformSamples'), 0x003A001A: ('DS', '1', "Sampling Frequency", '', 'SamplingFrequency'), 0x003A0020: ('SH', '1', "Multiplex Group Label", '', 'MultiplexGroupLabel'), 0x003A0200: ('SQ', '1', "Channel Definition Sequence", '', 'ChannelDefinitionSequence'), 0x003A0202: ('IS', '1', "Waveform Channel Number", '', 'WaveformChannelNumber'), 0x003A0203: ('SH', '1', "Channel Label", '', 'ChannelLabel'), 0x003A0205: ('CS', '1-n', "Channel Status", '', 'ChannelStatus'), 0x003A0208: ('SQ', '1', "Channel Source Sequence", '', 'ChannelSourceSequence'), 0x003A0209: ('SQ', '1', "Channel Source Modifiers Sequence", '', 'ChannelSourceModifiersSequence'), 0x003A020A: ('SQ', '1', "Source Waveform Sequence", '', 'SourceWaveformSequence'), 0x003A020C: ('LO', '1', "Channel Derivation Description", '', 'ChannelDerivationDescription'), 0x003A0210: ('DS', '1', "Channel Sensitivity", '', 'ChannelSensitivity'), 0x003A0211: ('SQ', '1', "Channel Sensitivity Units Sequence", '', 'ChannelSensitivityUnitsSequence'), 0x003A0212: ('DS', '1', "Channel Sensitivity Correction Factor", '', 'ChannelSensitivityCorrectionFactor'), 0x003A0213: ('DS', '1', "Channel Baseline", '', 'ChannelBaseline'), 0x003A0214: ('DS', '1', "Channel Time Skew", '', 'ChannelTimeSkew'), 0x003A0215: ('DS', '1', "Channel Sample Skew", '', 'ChannelSampleSkew'), 0x003A0218: ('DS', '1', "Channel Offset", '', 'ChannelOffset'), 0x003A021A: ('US', '1', "Waveform Bits Stored", '', 'WaveformBitsStored'), 0x003A0220: ('DS', '1', "Filter Low Frequency", '', 'FilterLowFrequency'), 0x003A0221: ('DS', '1', "Filter High Frequency", '', 'FilterHighFrequency'), 0x003A0222: ('DS', '1', "Notch Filter Frequency", '', 'NotchFilterFrequency'), 0x003A0223: ('DS', '1', "Notch Filter Bandwidth", '', 'NotchFilterBandwidth'), 0x003A0230: ('FL', '1', "Waveform Data Display Scale", '', 'WaveformDataDisplayScale'), 0x003A0231: ('US', '3', "Waveform Display Background CIELab Value", '', 'WaveformDisplayBackgroundCIELabValue'), 0x003A0240: ('SQ', '1', "Waveform Presentation Group Sequence", '', 'WaveformPresentationGroupSequence'), 0x003A0241: ('US', '1', "Presentation Group Number", '', 'PresentationGroupNumber'), 0x003A0242: ('SQ', '1', "Channel Display Sequence", '', 'ChannelDisplaySequence'), 0x003A0244: ('US', '3', "Channel Recommended Display CIELab Value", '', 'ChannelRecommendedDisplayCIELabValue'), 0x003A0245: ('FL', '1', "Channel Position", '', 'ChannelPosition'), 0x003A0246: ('CS', '1', "Display Shading Flag", '', 'DisplayShadingFlag'), 0x003A0247: ('FL', '1', "Fractional Channel Display Scale", '', 'FractionalChannelDisplayScale'), 0x003A0248: ('FL', '1', "Absolute Channel Display Scale", '', 'AbsoluteChannelDisplayScale'), 0x003A0300: ('SQ', '1', "Multiplexed Audio Channels Description Code Sequence", '', 'MultiplexedAudioChannelsDescriptionCodeSequence'), 0x003A0301: ('IS', '1', "Channel Identification Code", '', 'ChannelIdentificationCode'), 0x003A0302: ('CS', '1', "Channel Mode", '', 'ChannelMode'), 0x003A0310: ('UI', '1', "Multiplex Group UID", '', 'MultiplexGroupUID'), 0x003A0311: ('DS', '1', "Powerline Frequency", '', 'PowerlineFrequency'), 0x003A0312: ('SQ', '1', "Channel Impedance Sequence", '', 'ChannelImpedanceSequence'), 0x003A0313: ('DS', '1', "Impedance Value", '', 'ImpedanceValue'), 0x003A0314: ('DT', '1', "Impedance Measurement DateTime", '', 'ImpedanceMeasurementDateTime'), 0x003A0315: ('DS', '1', "Impedance Measurement Frequency", '', 'ImpedanceMeasurementFrequency'), 0x003A0316: ('CS', '1', "Impedance Measurement Current Type", '', 'ImpedanceMeasurementCurrentType'), 0x003A0317: ('CS', '1', "Waveform Amplifier Type", '', 'WaveformAmplifierType'), 0x003A0318: ('SQ', '1', "Filter Low Frequency Characteristics Sequence", '', 'FilterLowFrequencyCharacteristicsSequence'), 0x003A0319: ('SQ', '1', "Filter High Frequency Characteristics Sequence", '', 'FilterHighFrequencyCharacteristicsSequence'), 0x003A0320: ('SQ', '1', "Summarized Filter Lookup Table Sequence", '', 'SummarizedFilterLookupTable'), 0x003A0321: ('SQ', '1', "Notch Filter Characteristics Sequence", '', 'NotchFilterCharacteristicsSequence'), 0x003A0322: ('CS', '1', "Waveform Filter Type", '', 'WaveformFilterType'), 0x003A0323: ('SQ', '1', "Analog Filter Characteristics Sequence", '', 'AnalogFilterCharacteristicsSequence'), 0x003A0324: ('DS', '1', "Analog Filter Roll Off", '', 'AnalogFilterRollOff'), 0x003A0325: ('SQ', '1', "Analog Filter Type Code Sequence", '', 'AnalogFilterType'), 0x003A0326: ('SQ', '1', "Digital Filter Characteristics Sequence", '', 'DigitalFilterCharacteristicsSequence'), 0x003A0327: ('IS', '1', "Digital Filter Order", '', 'DigitalFilterOrder'), 0x003A0328: ('SQ', '1', "Digital Filter Type Code Sequence", '', 'DigitalFilterTypeCodeSequence'), 0x003A0329: ('ST', '1', "Waveform Filter Description", '', 'WaveformFilterDescription'), 0x003A032A: ('SQ', '1', "Filter Lookup Table Sequence", '', 'FilterLookupTableSequence'), 0x003A032B: ('ST', '1', "Filter Lookup Table Description", '', 'FilterLookupTableDescription'), 0x003A032C: ('SQ', '1', "Frequency Encoding Code Sequence", '', 'FrequencyEncodingCodeSequence'), 0x003A032D: ('SQ', '1', "Magnitude Encoding Code Sequence", '', 'MagnitudeEncodingCodeSequence'), 0x003A032E: ('OD', '1', "Filter Lookup Table Data", '', 'FilterLookupTableData'), 0x00400001: ('AE', '1-n', "Scheduled Station AE Title", '', 'ScheduledStationAETitle'), 0x00400002: ('DA', '1', "Scheduled Procedure Step Start Date", '', 'ScheduledProcedureStepStartDate'), 0x00400003: ('TM', '1', "Scheduled Procedure Step Start Time", '', 'ScheduledProcedureStepStartTime'), 0x00400004: ('DA', '1', "Scheduled Procedure Step End Date", '', 'ScheduledProcedureStepEndDate'), 0x00400005: ('TM', '1', "Scheduled Procedure Step End Time", '', 'ScheduledProcedureStepEndTime'), 0x00400006: ('PN', '1', "Scheduled Performing Physician's Name", '', 'ScheduledPerformingPhysicianName'), 0x00400007: ('LO', '1', "Scheduled Procedure Step Description", '', 'ScheduledProcedureStepDescription'), 0x00400008: ('SQ', '1', "Scheduled Protocol Code Sequence", '', 'ScheduledProtocolCodeSequence'), 0x00400009: ('SH', '1', "Scheduled Procedure Step ID", '', 'ScheduledProcedureStepID'), 0x0040000A: ('SQ', '1', "Stage Code Sequence", '', 'StageCodeSequence'), 0x0040000B: ('SQ', '1', "Scheduled Performing Physician Identification Sequence", '', 'ScheduledPerformingPhysicianIdentificationSequence'), 0x00400010: ('SH', '1-n', "Scheduled Station Name", '', 'ScheduledStationName'), 0x00400011: ('SH', '1', "Scheduled Procedure Step Location", '', 'ScheduledProcedureStepLocation'), 0x00400012: ('LO', '1', "Pre-Medication", '', 'PreMedication'), 0x00400020: ('CS', '1', "Scheduled Procedure Step Status", '', 'ScheduledProcedureStepStatus'), 0x00400026: ('SQ', '1', "Order Placer Identifier Sequence", '', 'OrderPlacerIdentifierSequence'), 0x00400027: ('SQ', '1', "Order Filler Identifier Sequence", '', 'OrderFillerIdentifierSequence'), 0x00400031: ('UT', '1', "Local Namespace Entity ID", '', 'LocalNamespaceEntityID'), 0x00400032: ('UT', '1', "Universal Entity ID", '', 'UniversalEntityID'), 0x00400033: ('CS', '1', "Universal Entity ID Type", '', 'UniversalEntityIDType'), 0x00400035: ('CS', '1', "Identifier Type Code", '', 'IdentifierTypeCode'), 0x00400036: ('SQ', '1', "Assigning Facility Sequence", '', 'AssigningFacilitySequence'), 0x00400039: ('SQ', '1', "Assigning Jurisdiction Code Sequence", '', 'AssigningJurisdictionCodeSequence'), 0x0040003A: ('SQ', '1', "Assigning Agency or Department Code Sequence", '', 'AssigningAgencyOrDepartmentCodeSequence'), 0x00400100: ('SQ', '1', "Scheduled Procedure Step Sequence", '', 'ScheduledProcedureStepSequence'), 0x00400220: ('SQ', '1', "Referenced Non-Image Composite SOP Instance Sequence", '', 'ReferencedNonImageCompositeSOPInstanceSequence'), 0x00400241: ('AE', '1', "Performed Station AE Title", '', 'PerformedStationAETitle'), 0x00400242: ('SH', '1', "Performed Station Name", '', 'PerformedStationName'), 0x00400243: ('SH', '1', "Performed Location", '', 'PerformedLocation'), 0x00400244: ('DA', '1', "Performed Procedure Step Start Date", '', 'PerformedProcedureStepStartDate'), 0x00400245: ('TM', '1', "Performed Procedure Step Start Time", '', 'PerformedProcedureStepStartTime'), 0x00400250: ('DA', '1', "Performed Procedure Step End Date", '', 'PerformedProcedureStepEndDate'), 0x00400251: ('TM', '1', "Performed Procedure Step End Time", '', 'PerformedProcedureStepEndTime'), 0x00400252: ('CS', '1', "Performed Procedure Step Status", '', 'PerformedProcedureStepStatus'), 0x00400253: ('SH', '1', "Performed Procedure Step ID", '', 'PerformedProcedureStepID'), 0x00400254: ('LO', '1', "Performed Procedure Step Description", '', 'PerformedProcedureStepDescription'), 0x00400255: ('LO', '1', "Performed Procedure Type Description", '', 'PerformedProcedureTypeDescription'), 0x00400260: ('SQ', '1', "Performed Protocol Code Sequence", '', 'PerformedProtocolCodeSequence'), 0x00400261: ('CS', '1', "Performed Protocol Type", '', 'PerformedProtocolType'), 0x00400270: ('SQ', '1', "Scheduled Step Attributes Sequence", '', 'ScheduledStepAttributesSequence'), 0x00400275: ('SQ', '1', "Request Attributes Sequence", '', 'RequestAttributesSequence'), 0x00400280: ('ST', '1', "Comments on the Performed Procedure Step", '', 'CommentsOnThePerformedProcedureStep'), 0x00400281: ('SQ', '1', "Performed Procedure Step Discontinuation Reason Code Sequence", '', 'PerformedProcedureStepDiscontinuationReasonCodeSequence'), 0x00400293: ('SQ', '1', "Quantity Sequence", '', 'QuantitySequence'), 0x00400294: ('DS', '1', "Quantity", '', 'Quantity'), 0x00400295: ('SQ', '1', "Measuring Units Sequence", '', 'MeasuringUnitsSequence'), 0x00400296: ('SQ', '1', "Billing Item Sequence", '', 'BillingItemSequence'), 0x00400300: ('US', '1', "Total Time of Fluoroscopy", 'Retired', 'TotalTimeOfFluoroscopy'), 0x00400301: ('US', '1', "Total Number of Exposures", 'Retired', 'TotalNumberOfExposures'), 0x00400302: ('US', '1', "Entrance Dose", '', 'EntranceDose'), 0x00400303: ('US', '1-2', "Exposed Area", '', 'ExposedArea'), 0x00400306: ('DS', '1', "Distance Source to Entrance", '', 'DistanceSourceToEntrance'), 0x00400307: ('DS', '1', "Distance Source to Support", 'Retired', 'DistanceSourceToSupport'), 0x0040030E: ('SQ', '1', "Exposure Dose Sequence", 'Retired', 'ExposureDoseSequence'), 0x00400310: ('ST', '1', "Comments on Radiation Dose", '', 'CommentsOnRadiationDose'), 0x00400312: ('DS', '1', "X-Ray Output", '', 'XRayOutput'), 0x00400314: ('DS', '1', "Half Value Layer", '', 'HalfValueLayer'), 0x00400316: ('DS', '1', "Organ Dose", '', 'OrganDose'), 0x00400318: ('CS', '1', "Organ Exposed", '', 'OrganExposed'), 0x00400320: ('SQ', '1', "Billing Procedure Step Sequence", '', 'BillingProcedureStepSequence'), 0x00400321: ('SQ', '1', "Film Consumption Sequence", '', 'FilmConsumptionSequence'), 0x00400324: ('SQ', '1', "Billing Supplies and Devices Sequence", '', 'BillingSuppliesAndDevicesSequence'), 0x00400330: ('SQ', '1', "Referenced Procedure Step Sequence", 'Retired', 'ReferencedProcedureStepSequence'), 0x00400340: ('SQ', '1', "Performed Series Sequence", '', 'PerformedSeriesSequence'), 0x00400400: ('LT', '1', "Comments on the Scheduled Procedure Step", '', 'CommentsOnTheScheduledProcedureStep'), 0x00400440: ('SQ', '1', "Protocol Context Sequence", '', 'ProtocolContextSequence'), 0x00400441: ('SQ', '1', "Content Item Modifier Sequence", '', 'ContentItemModifierSequence'), 0x00400500: ('SQ', '1', "Scheduled Specimen Sequence", '', 'ScheduledSpecimenSequence'), 0x0040050A: ('LO', '1', "Specimen Accession Number", 'Retired', 'SpecimenAccessionNumber'), 0x00400512: ('LO', '1', "Container Identifier", '', 'ContainerIdentifier'), 0x00400513: ('SQ', '1', "Issuer of the Container Identifier Sequence", '', 'IssuerOfTheContainerIdentifierSequence'), 0x00400515: ('SQ', '1', "Alternate Container Identifier Sequence", '', 'AlternateContainerIdentifierSequence'), 0x00400518: ('SQ', '1', "Container Type Code Sequence", '', 'ContainerTypeCodeSequence'), 0x0040051A: ('LO', '1', "Container Description", '', 'ContainerDescription'), 0x00400520: ('SQ', '1', "Container Component Sequence", '', 'ContainerComponentSequence'), 0x00400550: ('SQ', '1', "Specimen Sequence", 'Retired', 'SpecimenSequence'), 0x00400551: ('LO', '1', "Specimen Identifier", '', 'SpecimenIdentifier'), 0x00400552: ('SQ', '1', "Specimen Description Sequence (Trial)", 'Retired', 'SpecimenDescriptionSequenceTrial'), 0x00400553: ('ST', '1', "Specimen Description (Trial)", 'Retired', 'SpecimenDescriptionTrial'), 0x00400554: ('UI', '1', "Specimen UID", '', 'SpecimenUID'), 0x00400555: ('SQ', '1', "Acquisition Context Sequence", '', 'AcquisitionContextSequence'), 0x00400556: ('ST', '1', "Acquisition Context Description", '', 'AcquisitionContextDescription'), 0x00400560: ('SQ', '1', "Specimen Description Sequence", '', 'SpecimenDescriptionSequence'), 0x00400562: ('SQ', '1', "Issuer of the Specimen Identifier Sequence", '', 'IssuerOfTheSpecimenIdentifierSequence'), 0x0040059A: ('SQ', '1', "Specimen Type Code Sequence", '', 'SpecimenTypeCodeSequence'), 0x00400600: ('LO', '1', "Specimen Short Description", '', 'SpecimenShortDescription'), 0x00400602: ('UT', '1', "Specimen Detailed Description", '', 'SpecimenDetailedDescription'), 0x00400610: ('SQ', '1', "Specimen Preparation Sequence", '', 'SpecimenPreparationSequence'), 0x00400612: ('SQ', '1', "Specimen Preparation Step Content Item Sequence", '', 'SpecimenPreparationStepContentItemSequence'), 0x00400620: ('SQ', '1', "Specimen Localization Content Item Sequence", '', 'SpecimenLocalizationContentItemSequence'), 0x004006FA: ('LO', '1', "Slide Identifier", 'Retired', 'SlideIdentifier'), 0x00400710: ('SQ', '1', "Whole Slide Microscopy Image Frame Type Sequence", '', 'WholeSlideMicroscopyImageFrameTypeSequence'), 0x0040071A: ('SQ', '1', "Image Center Point Coordinates Sequence", '', 'ImageCenterPointCoordinatesSequence'), 0x0040072A: ('DS', '1', "X Offset in Slide Coordinate System", '', 'XOffsetInSlideCoordinateSystem'), 0x0040073A: ('DS', '1', "Y Offset in Slide Coordinate System", '', 'YOffsetInSlideCoordinateSystem'), 0x0040074A: ('DS', '1', "Z Offset in Slide Coordinate System", '', 'ZOffsetInSlideCoordinateSystem'), 0x004008D8: ('SQ', '1', "Pixel Spacing Sequence", 'Retired', 'PixelSpacingSequence'), 0x004008DA: ('SQ', '1', "Coordinate System Axis Code Sequence", 'Retired', 'CoordinateSystemAxisCodeSequence'), 0x004008EA: ('SQ', '1', "Measurement Units Code Sequence", '', 'MeasurementUnitsCodeSequence'), 0x004009F8: ('SQ', '1', "Vital Stain Code Sequence (Trial)", 'Retired', 'VitalStainCodeSequenceTrial'), 0x00401001: ('SH', '1', "Requested Procedure ID", '', 'RequestedProcedureID'), 0x00401002: ('LO', '1', "Reason for the Requested Procedure", '', 'ReasonForTheRequestedProcedure'), 0x00401003: ('SH', '1', "Requested Procedure Priority", '', 'RequestedProcedurePriority'), 0x00401004: ('LO', '1', "Patient Transport Arrangements", '', 'PatientTransportArrangements'), 0x00401005: ('LO', '1', "Requested Procedure Location", '', 'RequestedProcedureLocation'), 0x00401006: ('SH', '1', "Placer Order Number / Procedure", 'Retired', 'PlacerOrderNumberProcedure'), 0x00401007: ('SH', '1', "Filler Order Number / Procedure", 'Retired', 'FillerOrderNumberProcedure'), 0x00401008: ('LO', '1', "Confidentiality Code", '', 'ConfidentialityCode'), 0x00401009: ('SH', '1', "Reporting Priority", '', 'ReportingPriority'), 0x0040100A: ('SQ', '1', "Reason for Requested Procedure Code Sequence", '', 'ReasonForRequestedProcedureCodeSequence'), 0x00401010: ('PN', '1-n', "Names of Intended Recipients of Results", '', 'NamesOfIntendedRecipientsOfResults'), 0x00401011: ('SQ', '1', "Intended Recipients of Results Identification Sequence", '', 'IntendedRecipientsOfResultsIdentificationSequence'), 0x00401012: ('SQ', '1', "Reason For Performed Procedure Code Sequence", '', 'ReasonForPerformedProcedureCodeSequence'), 0x00401060: ('LO', '1', "Requested Procedure Description (Trial)", 'Retired', 'RequestedProcedureDescriptionTrial'), 0x00401101: ('SQ', '1', "Person Identification Code Sequence", '', 'PersonIdentificationCodeSequence'), 0x00401102: ('ST', '1', "Person's Address", '', 'PersonAddress'), 0x00401103: ('LO', '1-n', "Person's Telephone Numbers", '', 'PersonTelephoneNumbers'), 0x00401104: ('LT', '1', "Person's Telecom Information", '', 'PersonTelecomInformation'), 0x00401400: ('LT', '1', "Requested Procedure Comments", '', 'RequestedProcedureComments'), 0x00402001: ('LO', '1', "Reason for the Imaging Service Request", 'Retired', 'ReasonForTheImagingServiceRequest'), 0x00402004: ('DA', '1', "Issue Date of Imaging Service Request", '', 'IssueDateOfImagingServiceRequest'), 0x00402005: ('TM', '1', "Issue Time of Imaging Service Request", '', 'IssueTimeOfImagingServiceRequest'), 0x00402006: ('SH', '1', "Placer Order Number / Imaging Service Request (Retired)", 'Retired', 'PlacerOrderNumberImagingServiceRequestRetired'), 0x00402007: ('SH', '1', "Filler Order Number / Imaging Service Request (Retired)", 'Retired', 'FillerOrderNumberImagingServiceRequestRetired'), 0x00402008: ('PN', '1', "Order Entered By", '', 'OrderEnteredBy'), 0x00402009: ('SH', '1', "Order Enterer's Location", '', 'OrderEntererLocation'), 0x00402010: ('SH', '1', "Order Callback Phone Number", '', 'OrderCallbackPhoneNumber'), 0x00402011: ('LT', '1', "Order Callback Telecom Information", '', 'OrderCallbackTelecomInformation'), 0x00402016: ('LO', '1', "Placer Order Number / Imaging Service Request", '', 'PlacerOrderNumberImagingServiceRequest'), 0x00402017: ('LO', '1', "Filler Order Number / Imaging Service Request", '', 'FillerOrderNumberImagingServiceRequest'), 0x00402400: ('LT', '1', "Imaging Service Request Comments", '', 'ImagingServiceRequestComments'), 0x00403001: ('LO', '1', "Confidentiality Constraint on Patient Data Description", '', 'ConfidentialityConstraintOnPatientDataDescription'), 0x00404001: ('CS', '1', "General Purpose Scheduled Procedure Step Status", 'Retired', 'GeneralPurposeScheduledProcedureStepStatus'), 0x00404002: ('CS', '1', "General Purpose Performed Procedure Step Status", 'Retired', 'GeneralPurposePerformedProcedureStepStatus'), 0x00404003: ('CS', '1', "General Purpose Scheduled Procedure Step Priority", 'Retired', 'GeneralPurposeScheduledProcedureStepPriority'), 0x00404004: ('SQ', '1', "Scheduled Processing Applications Code Sequence", 'Retired', 'ScheduledProcessingApplicationsCodeSequence'), 0x00404005: ('DT', '1', "Scheduled Procedure Step Start DateTime", '', 'ScheduledProcedureStepStartDateTime'), 0x00404006: ('CS', '1', "Multiple Copies Flag", 'Retired', 'MultipleCopiesFlag'), 0x00404007: ('SQ', '1', "Performed Processing Applications Code Sequence", 'Retired', 'PerformedProcessingApplicationsCodeSequence'), 0x00404008: ('DT', '1', "Scheduled Procedure Step Expiration DateTime", '', 'ScheduledProcedureStepExpirationDateTime'), 0x00404009: ('SQ', '1', "Human Performer Code Sequence", '', 'HumanPerformerCodeSequence'), 0x00404010: ('DT', '1', "Scheduled Procedure Step Modification DateTime", '', 'ScheduledProcedureStepModificationDateTime'), 0x00404011: ('DT', '1', "Expected Completion DateTime", '', 'ExpectedCompletionDateTime'), 0x00404015: ('SQ', '1', "Resulting General Purpose Performed Procedure Steps Sequence", 'Retired', 'ResultingGeneralPurposePerformedProcedureStepsSequence'), 0x00404016: ('SQ', '1', "Referenced General Purpose Scheduled Procedure Step Sequence", 'Retired', 'ReferencedGeneralPurposeScheduledProcedureStepSequence'), 0x00404018: ('SQ', '1', "Scheduled Workitem Code Sequence", '', 'ScheduledWorkitemCodeSequence'), 0x00404019: ('SQ', '1', "Performed Workitem Code Sequence", '', 'PerformedWorkitemCodeSequence'), 0x00404020: ('CS', '1', "Input Availability Flag", 'Retired', 'InputAvailabilityFlag'), 0x00404021: ('SQ', '1', "Input Information Sequence", '', 'InputInformationSequence'), 0x00404022: ('SQ', '1', "Relevant Information Sequence", 'Retired', 'RelevantInformationSequence'), 0x00404023: ('UI', '1', "Referenced General Purpose Scheduled Procedure Step Transaction UID", 'Retired', 'ReferencedGeneralPurposeScheduledProcedureStepTransactionUID'), 0x00404025: ('SQ', '1', "Scheduled Station Name Code Sequence", '', 'ScheduledStationNameCodeSequence'), 0x00404026: ('SQ', '1', "Scheduled Station Class Code Sequence", '', 'ScheduledStationClassCodeSequence'), 0x00404027: ('SQ', '1', "Scheduled Station Geographic Location Code Sequence", '', 'ScheduledStationGeographicLocationCodeSequence'), 0x00404028: ('SQ', '1', "Performed Station Name Code Sequence", '', 'PerformedStationNameCodeSequence'), 0x00404029: ('SQ', '1', "Performed Station Class Code Sequence", '', 'PerformedStationClassCodeSequence'), 0x00404030: ('SQ', '1', "Performed Station Geographic Location Code Sequence", '', 'PerformedStationGeographicLocationCodeSequence'), 0x00404031: ('SQ', '1', "Requested Subsequent Workitem Code Sequence", 'Retired', 'RequestedSubsequentWorkitemCodeSequence'), 0x00404032: ('SQ', '1', "Non-DICOM Output Code Sequence", 'Retired', 'NonDICOMOutputCodeSequence'), 0x00404033: ('SQ', '1', "Output Information Sequence", '', 'OutputInformationSequence'), 0x00404034: ('SQ', '1', "Scheduled Human Performers Sequence", '', 'ScheduledHumanPerformersSequence'), 0x00404035: ('SQ', '1', "Actual Human Performers Sequence", '', 'ActualHumanPerformersSequence'), 0x00404036: ('LO', '1', "Human Performer's Organization", '', 'HumanPerformerOrganization'), 0x00404037: ('PN', '1', "Human Performer's Name", '', 'HumanPerformerName'), 0x00404040: ('CS', '1', "Raw Data Handling", '', 'RawDataHandling'), 0x00404041: ('CS', '1', "Input Readiness State", '', 'InputReadinessState'), 0x00404050: ('DT', '1', "Performed Procedure Step Start DateTime", '', 'PerformedProcedureStepStartDateTime'), 0x00404051: ('DT', '1', "Performed Procedure Step End DateTime", '', 'PerformedProcedureStepEndDateTime'), 0x00404052: ('DT', '1', "Procedure Step Cancellation DateTime", '', 'ProcedureStepCancellationDateTime'), 0x00404070: ('SQ', '1', "Output Destination Sequence", '', 'OutputDestinationSequence'), 0x00404071: ('SQ', '1', "DICOM Storage Sequence", '', 'DICOMStorageSequence'), 0x00404072: ('SQ', '1', "STOW-RS Storage Sequence", '', 'STOWRSStorageSequence'), 0x00404073: ('UR', '1', "Storage URL", '', 'StorageURL'), 0x00404074: ('SQ', '1', "XDS Storage Sequence", '', 'XDSStorageSequence'), 0x00408302: ('DS', '1', "Entrance Dose in mGy", '', 'EntranceDoseInmGy'), 0x00408303: ('CS', '1', "Entrance Dose Derivation", '', 'EntranceDoseDerivation'), 0x00409092: ('SQ', '1', "Parametric Map Frame Type Sequence", '', 'ParametricMapFrameTypeSequence'), 0x00409094: ('SQ', '1', "Referenced Image Real World Value Mapping Sequence", '', 'ReferencedImageRealWorldValueMappingSequence'), 0x00409096: ('SQ', '1', "Real World Value Mapping Sequence", '', 'RealWorldValueMappingSequence'), 0x00409098: ('SQ', '1', "Pixel Value Mapping Code Sequence", '', 'PixelValueMappingCodeSequence'), 0x00409210: ('SH', '1', "LUT Label", '', 'LUTLabel'), 0x00409211: ('US or SS', '1', "Real World Value Last Value Mapped", '', 'RealWorldValueLastValueMapped'), 0x00409212: ('FD', '1-n', "Real World Value LUT Data", '', 'RealWorldValueLUTData'), 0x00409213: ('FD', '1', "Double Float Real World Value Last Value Mapped", '', 'DoubleFloatRealWorldValueLastValueMapped'), 0x00409214: ('FD', '1', "Double Float Real World Value First Value Mapped", '', 'DoubleFloatRealWorldValueFirstValueMapped'), 0x00409216: ('US or SS', '1', "Real World Value First Value Mapped", '', 'RealWorldValueFirstValueMapped'), 0x00409220: ('SQ', '1', "Quantity Definition Sequence", '', 'QuantityDefinitionSequence'), 0x00409224: ('FD', '1', "Real World Value Intercept", '', 'RealWorldValueIntercept'), 0x00409225: ('FD', '1', "Real World Value Slope", '', 'RealWorldValueSlope'), 0x0040A007: ('CS', '1', "Findings Flag (Trial)", 'Retired', 'FindingsFlagTrial'), 0x0040A010: ('CS', '1', "Relationship Type", '', 'RelationshipType'), 0x0040A020: ('SQ', '1', "Findings Sequence (Trial)", 'Retired', 'FindingsSequenceTrial'), 0x0040A021: ('UI', '1', "Findings Group UID (Trial)", 'Retired', 'FindingsGroupUIDTrial'), 0x0040A022: ('UI', '1', "Referenced Findings Group UID (Trial)", 'Retired', 'ReferencedFindingsGroupUIDTrial'), 0x0040A023: ('DA', '1', "Findings Group Recording Date (Trial)", 'Retired', 'FindingsGroupRecordingDateTrial'), 0x0040A024: ('TM', '1', "Findings Group Recording Time (Trial)", 'Retired', 'FindingsGroupRecordingTimeTrial'), 0x0040A026: ('SQ', '1', "Findings Source Category Code Sequence (Trial)", 'Retired', 'FindingsSourceCategoryCodeSequenceTrial'), 0x0040A027: ('LO', '1', "Verifying Organization", '', 'VerifyingOrganization'), 0x0040A028: ('SQ', '1', "Documenting Organization Identifier Code Sequence (Trial)", 'Retired', 'DocumentingOrganizationIdentifierCodeSequenceTrial'), 0x0040A030: ('DT', '1', "Verification DateTime", '', 'VerificationDateTime'), 0x0040A032: ('DT', '1', "Observation DateTime", '', 'ObservationDateTime'), 0x0040A033: ('DT', '1', "Observation Start DateTime", '', 'ObservationStartDateTime'), 0x0040A040: ('CS', '1', "Value Type", '', 'ValueType'), 0x0040A043: ('SQ', '1', "Concept Name Code Sequence", '', 'ConceptNameCodeSequence'), 0x0040A047: ('LO', '1', "Measurement Precision Description (Trial)", 'Retired', 'MeasurementPrecisionDescriptionTrial'), 0x0040A050: ('CS', '1', "Continuity Of Content", '', 'ContinuityOfContent'), 0x0040A057: ('CS', '1-n', "Urgency or Priority Alerts (Trial)", 'Retired', 'UrgencyOrPriorityAlertsTrial'), 0x0040A060: ('LO', '1', "Sequencing Indicator (Trial)", 'Retired', 'SequencingIndicatorTrial'), 0x0040A066: ('SQ', '1', "Document Identifier Code Sequence (Trial)", 'Retired', 'DocumentIdentifierCodeSequenceTrial'), 0x0040A067: ('PN', '1', "Document Author (Trial)", 'Retired', 'DocumentAuthorTrial'), 0x0040A068: ('SQ', '1', "Document Author Identifier Code Sequence (Trial)", 'Retired', 'DocumentAuthorIdentifierCodeSequenceTrial'), 0x0040A070: ('SQ', '1', "Identifier Code Sequence (Trial)", 'Retired', 'IdentifierCodeSequenceTrial'), 0x0040A073: ('SQ', '1', "Verifying Observer Sequence", '', 'VerifyingObserverSequence'), 0x0040A074: ('OB', '1', "Object Binary Identifier (Trial)", 'Retired', 'ObjectBinaryIdentifierTrial'), 0x0040A075: ('PN', '1', "Verifying Observer Name", '', 'VerifyingObserverName'), 0x0040A076: ('SQ', '1', "Documenting Observer Identifier Code Sequence (Trial)", 'Retired', 'DocumentingObserverIdentifierCodeSequenceTrial'), 0x0040A078: ('SQ', '1', "Author Observer Sequence", '', 'AuthorObserverSequence'), 0x0040A07A: ('SQ', '1', "Participant Sequence", '', 'ParticipantSequence'), 0x0040A07C: ('SQ', '1', "Custodial Organization Sequence", '', 'CustodialOrganizationSequence'), 0x0040A080: ('CS', '1', "Participation Type", '', 'ParticipationType'), 0x0040A082: ('DT', '1', "Participation DateTime", '', 'ParticipationDateTime'), 0x0040A084: ('CS', '1', "Observer Type", '', 'ObserverType'), 0x0040A085: ('SQ', '1', "Procedure Identifier Code Sequence (Trial)", 'Retired', 'ProcedureIdentifierCodeSequenceTrial'), 0x0040A088: ('SQ', '1', "Verifying Observer Identification Code Sequence", '', 'VerifyingObserverIdentificationCodeSequence'), 0x0040A089: ('OB', '1', "Object Directory Binary Identifier (Trial)", 'Retired', 'ObjectDirectoryBinaryIdentifierTrial'), 0x0040A090: ('SQ', '1', "Equivalent CDA Document Sequence", 'Retired', 'EquivalentCDADocumentSequence'), 0x0040A0B0: ('US', '2-2n', "Referenced Waveform Channels", '', 'ReferencedWaveformChannels'), 0x0040A110: ('DA', '1', "Date of Document or Verbal Transaction (Trial)", 'Retired', 'DateOfDocumentOrVerbalTransactionTrial'), 0x0040A112: ('TM', '1', "Time of Document Creation or Verbal Transaction (Trial)", 'Retired', 'TimeOfDocumentCreationOrVerbalTransactionTrial'), 0x0040A120: ('DT', '1', "DateTime", '', 'DateTime'), 0x0040A121: ('DA', '1', "Date", '', 'Date'), 0x0040A122: ('TM', '1', "Time", '', 'Time'), 0x0040A123: ('PN', '1', "Person Name", '', 'PersonName'), 0x0040A124: ('UI', '1', "UID", '', 'UID'), 0x0040A125: ('CS', '2', "Report Status ID (Trial)", 'Retired', 'ReportStatusIDTrial'), 0x0040A130: ('CS', '1', "Temporal Range Type", '', 'TemporalRangeType'), 0x0040A132: ('UL', '1-n', "Referenced Sample Positions", '', 'ReferencedSamplePositions'), 0x0040A136: ('US', '1-n', "Referenced Frame Numbers", 'Retired', 'ReferencedFrameNumbers'), 0x0040A138: ('DS', '1-n', "Referenced Time Offsets", '', 'ReferencedTimeOffsets'), 0x0040A13A: ('DT', '1-n', "Referenced DateTime", '', 'ReferencedDateTime'), 0x0040A160: ('UT', '1', "Text Value", '', 'TextValue'), 0x0040A161: ('FD', '1-n', "Floating Point Value", '', 'FloatingPointValue'), 0x0040A162: ('SL', '1-n', "Rational Numerator Value", '', 'RationalNumeratorValue'), 0x0040A163: ('UL', '1-n', "Rational Denominator Value", '', 'RationalDenominatorValue'), 0x0040A167: ('SQ', '1', "Observation Category Code Sequence (Trial)", 'Retired', 'ObservationCategoryCodeSequenceTrial'), 0x0040A168: ('SQ', '1', "Concept Code Sequence", '', 'ConceptCodeSequence'), 0x0040A16A: ('ST', '1', "Bibliographic Citation (Trial)", 'Retired', 'BibliographicCitationTrial'), 0x0040A170: ('SQ', '1', "Purpose of Reference Code Sequence", '', 'PurposeOfReferenceCodeSequence'), 0x0040A171: ('UI', '1', "Observation UID", '', 'ObservationUID'), 0x0040A172: ('UI', '1', "Referenced Observation UID (Trial)", 'Retired', 'ReferencedObservationUIDTrial'), 0x0040A173: ('CS', '1', "Referenced Observation Class (Trial)", 'Retired', 'ReferencedObservationClassTrial'), 0x0040A174: ('CS', '1', "Referenced Object Observation Class (Trial)", 'Retired', 'ReferencedObjectObservationClassTrial'), 0x0040A180: ('US', '1', "Annotation Group Number", '', 'AnnotationGroupNumber'), 0x0040A192: ('DA', '1', "Observation Date (Trial)", 'Retired', 'ObservationDateTrial'), 0x0040A193: ('TM', '1', "Observation Time (Trial)", 'Retired', 'ObservationTimeTrial'), 0x0040A194: ('CS', '1', "Measurement Automation (Trial)", 'Retired', 'MeasurementAutomationTrial'), 0x0040A195: ('SQ', '1', "Modifier Code Sequence", '', 'ModifierCodeSequence'), 0x0040A224: ('ST', '1', "Identification Description (Trial)", 'Retired', 'IdentificationDescriptionTrial'), 0x0040A290: ('CS', '1', "Coordinates Set Geometric Type (Trial)", 'Retired', 'CoordinatesSetGeometricTypeTrial'), 0x0040A296: ('SQ', '1', "Algorithm Code Sequence (Trial)", 'Retired', 'AlgorithmCodeSequenceTrial'), 0x0040A297: ('ST', '1', "Algorithm Description (Trial)", 'Retired', 'AlgorithmDescriptionTrial'), 0x0040A29A: ('SL', '2-2n', "Pixel Coordinates Set (Trial)", 'Retired', 'PixelCoordinatesSetTrial'), 0x0040A300: ('SQ', '1', "Measured Value Sequence", '', 'MeasuredValueSequence'), 0x0040A301: ('SQ', '1', "Numeric Value Qualifier Code Sequence", '', 'NumericValueQualifierCodeSequence'), 0x0040A307: ('PN', '1', "Current Observer (Trial)", 'Retired', 'CurrentObserverTrial'), 0x0040A30A: ('DS', '1-n', "Numeric Value", '', 'NumericValue'), 0x0040A313: ('SQ', '1', "Referenced Accession Sequence (Trial)", 'Retired', 'ReferencedAccessionSequenceTrial'), 0x0040A33A: ('ST', '1', "Report Status Comment (Trial)", 'Retired', 'ReportStatusCommentTrial'), 0x0040A340: ('SQ', '1', "Procedure Context Sequence (Trial)", 'Retired', 'ProcedureContextSequenceTrial'), 0x0040A352: ('PN', '1', "Verbal Source (Trial)", 'Retired', 'VerbalSourceTrial'), 0x0040A353: ('ST', '1', "Address (Trial)", 'Retired', 'AddressTrial'), 0x0040A354: ('LO', '1', "Telephone Number (Trial)", 'Retired', 'TelephoneNumberTrial'), 0x0040A358: ('SQ', '1', "Verbal Source Identifier Code Sequence (Trial)", 'Retired', 'VerbalSourceIdentifierCodeSequenceTrial'), 0x0040A360: ('SQ', '1', "Predecessor Documents Sequence", '', 'PredecessorDocumentsSequence'), 0x0040A370: ('SQ', '1', "Referenced Request Sequence", '', 'ReferencedRequestSequence'), 0x0040A372: ('SQ', '1', "Performed Procedure Code Sequence", '', 'PerformedProcedureCodeSequence'), 0x0040A375: ('SQ', '1', "Current Requested Procedure Evidence Sequence", '', 'CurrentRequestedProcedureEvidenceSequence'), 0x0040A380: ('SQ', '1', "Report Detail Sequence (Trial)", 'Retired', 'ReportDetailSequenceTrial'), 0x0040A385: ('SQ', '1', "Pertinent Other Evidence Sequence", '', 'PertinentOtherEvidenceSequence'), 0x0040A390: ('SQ', '1', "HL7 Structured Document Reference Sequence", '', 'HL7StructuredDocumentReferenceSequence'), 0x0040A402: ('UI', '1', "Observation Subject UID (Trial)", 'Retired', 'ObservationSubjectUIDTrial'), 0x0040A403: ('CS', '1', "Observation Subject Class (Trial)", 'Retired', 'ObservationSubjectClassTrial'), 0x0040A404: ('SQ', '1', "Observation Subject Type Code Sequence (Trial)", 'Retired', 'ObservationSubjectTypeCodeSequenceTrial'), 0x0040A491: ('CS', '1', "Completion Flag", '', 'CompletionFlag'), 0x0040A492: ('LO', '1', "Completion Flag Description", '', 'CompletionFlagDescription'), 0x0040A493: ('CS', '1', "Verification Flag", '', 'VerificationFlag'), 0x0040A494: ('CS', '1', "Archive Requested", '', 'ArchiveRequested'), 0x0040A496: ('CS', '1', "Preliminary Flag", '', 'PreliminaryFlag'), 0x0040A504: ('SQ', '1', "Content Template Sequence", '', 'ContentTemplateSequence'), 0x0040A525: ('SQ', '1', "Identical Documents Sequence", '', 'IdenticalDocumentsSequence'), 0x0040A600: ('CS', '1', "Observation Subject Context Flag (Trial)", 'Retired', 'ObservationSubjectContextFlagTrial'), 0x0040A601: ('CS', '1', "Observer Context Flag (Trial)", 'Retired', 'ObserverContextFlagTrial'), 0x0040A603: ('CS', '1', "Procedure Context Flag (Trial)", 'Retired', 'ProcedureContextFlagTrial'), 0x0040A730: ('SQ', '1', "Content Sequence", '', 'ContentSequence'), 0x0040A731: ('SQ', '1', "Relationship Sequence (Trial)", 'Retired', 'RelationshipSequenceTrial'), 0x0040A732: ('SQ', '1', "Relationship Type Code Sequence (Trial)", 'Retired', 'RelationshipTypeCodeSequenceTrial'), 0x0040A744: ('SQ', '1', "Language Code Sequence (Trial)", 'Retired', 'LanguageCodeSequenceTrial'), 0x0040A801: ('SQ', '1', "Tabulated Values Sequence", '', 'TabulatedValuesSequence'), 0x0040A802: ('UL', '1', "Number of Table Rows", '', 'NumberOfTableRows'), 0x0040A803: ('UL', '1', "Number of Table Columns", '', 'NumberOfTableColumns'), 0x0040A804: ('UL', '1', "Table Row Number", '', 'TableRowNumber'), 0x0040A805: ('UL', '1', "Table Column Number", '', 'TableColumnNumber'), 0x0040A806: ('SQ', '1', "Table Row Definition Sequence", '', 'TableRowDefinitionSequence'), 0x0040A807: ('SQ', '1', "Table Column Definition Sequence", '', 'TableColumnDefinitionSequence'), 0x0040A808: ('SQ', '1', "Cell Values Sequence", '', 'CellValuesSequence'), 0x0040A992: ('ST', '1', "Uniform Resource Locator (Trial)", 'Retired', 'UniformResourceLocatorTrial'), 0x0040B020: ('SQ', '1', "Waveform Annotation Sequence", '', 'WaveformAnnotationSequence'), 0x0040DB00: ('CS', '1', "Template Identifier", '', 'TemplateIdentifier'), 0x0040DB06: ('DT', '1', "Template Version", 'Retired', 'TemplateVersion'), 0x0040DB07: ('DT', '1', "Template Local Version", 'Retired', 'TemplateLocalVersion'), 0x0040DB0B: ('CS', '1', "Template Extension Flag", 'Retired', 'TemplateExtensionFlag'), 0x0040DB0C: ('UI', '1', "Template Extension Organization UID", 'Retired', 'TemplateExtensionOrganizationUID'), 0x0040DB0D: ('UI', '1', "Template Extension Creator UID", 'Retired', 'TemplateExtensionCreatorUID'), 0x0040DB73: ('UL', '1-n', "Referenced Content Item Identifier", '', 'ReferencedContentItemIdentifier'), 0x0040E001: ('ST', '1', "HL7 Instance Identifier", '', 'HL7InstanceIdentifier'), 0x0040E004: ('DT', '1', "HL7 Document Effective Time", '', 'HL7DocumentEffectiveTime'), 0x0040E006: ('SQ', '1', "HL7 Document Type Code Sequence", '', 'HL7DocumentTypeCodeSequence'), 0x0040E008: ('SQ', '1', "Document Class Code Sequence", '', 'DocumentClassCodeSequence'), 0x0040E010: ('UR', '1', "Retrieve URI", '', 'RetrieveURI'), 0x0040E011: ('UI', '1', "Retrieve Location UID", '', 'RetrieveLocationUID'), 0x0040E020: ('CS', '1', "Type of Instances", '', 'TypeOfInstances'), 0x0040E021: ('SQ', '1', "DICOM Retrieval Sequence", '', 'DICOMRetrievalSequence'), 0x0040E022: ('SQ', '1', "DICOM Media Retrieval Sequence", '', 'DICOMMediaRetrievalSequence'), 0x0040E023: ('SQ', '1', "WADO Retrieval Sequence", '', 'WADORetrievalSequence'), 0x0040E024: ('SQ', '1', "XDS Retrieval Sequence", '', 'XDSRetrievalSequence'), 0x0040E025: ('SQ', '1', "WADO-RS Retrieval Sequence", '', 'WADORSRetrievalSequence'), 0x0040E030: ('UI', '1', "Repository Unique ID", '', 'RepositoryUniqueID'), 0x0040E031: ('UI', '1', "Home Community ID", '', 'HomeCommunityID'), 0x00420010: ('ST', '1', "Document Title", '', 'DocumentTitle'), 0x00420011: ('OB', '1', "Encapsulated Document", '', 'EncapsulatedDocument'), 0x00420012: ('LO', '1', "MIME Type of Encapsulated Document", '', 'MIMETypeOfEncapsulatedDocument'), 0x00420013: ('SQ', '1', "Source Instance Sequence", '', 'SourceInstanceSequence'), 0x00420014: ('LO', '1-n', "List of MIME Types", '', 'ListOfMIMETypes'), 0x00420015: ('UL', '1', "Encapsulated Document Length", '', 'EncapsulatedDocumentLength'), 0x00440001: ('ST', '1', "Product Package Identifier", '', 'ProductPackageIdentifier'), 0x00440002: ('CS', '1', "Substance Administration Approval", '', 'SubstanceAdministrationApproval'), 0x00440003: ('LT', '1', "Approval Status Further Description", '', 'ApprovalStatusFurtherDescription'), 0x00440004: ('DT', '1', "Approval Status DateTime", '', 'ApprovalStatusDateTime'), 0x00440007: ('SQ', '1', "Product Type Code Sequence", '', 'ProductTypeCodeSequence'), 0x00440008: ('LO', '1-n', "Product Name", '', 'ProductName'), 0x00440009: ('LT', '1', "Product Description", '', 'ProductDescription'), 0x0044000A: ('LO', '1', "Product Lot Identifier", '', 'ProductLotIdentifier'), 0x0044000B: ('DT', '1', "Product Expiration DateTime", '', 'ProductExpirationDateTime'), 0x00440010: ('DT', '1', "Substance Administration DateTime", '', 'SubstanceAdministrationDateTime'), 0x00440011: ('LO', '1', "Substance Administration Notes", '', 'SubstanceAdministrationNotes'), 0x00440012: ('LO', '1', "Substance Administration Device ID", '', 'SubstanceAdministrationDeviceID'), 0x00440013: ('SQ', '1', "Product Parameter Sequence", '', 'ProductParameterSequence'), 0x00440019: ('SQ', '1', "Substance Administration Parameter Sequence", '', 'SubstanceAdministrationParameterSequence'), 0x00440100: ('SQ', '1', "Approval Sequence", '', 'ApprovalSequence'), 0x00440101: ('SQ', '1', "Assertion Code Sequence", '', 'AssertionCodeSequence'), 0x00440102: ('UI', '1', "Assertion UID", '', 'AssertionUID'), 0x00440103: ('SQ', '1', "Asserter Identification Sequence", '', 'AsserterIdentificationSequence'), 0x00440104: ('DT', '1', "Assertion DateTime", '', 'AssertionDateTime'), 0x00440105: ('DT', '1', "Assertion Expiration DateTime", '', 'AssertionExpirationDateTime'), 0x00440106: ('UT', '1', "Assertion Comments", '', 'AssertionComments'), 0x00440107: ('SQ', '1', "Related Assertion Sequence", '', 'RelatedAssertionSequence'), 0x00440108: ('UI', '1', "Referenced Assertion UID", '', 'ReferencedAssertionUID'), 0x00440109: ('SQ', '1', "Approval Subject Sequence", '', 'ApprovalSubjectSequence'), 0x0044010A: ('SQ', '1', "Organizational Role Code Sequence", '', 'OrganizationalRoleCodeSequence'), 0x00460012: ('LO', '1', "Lens Description", '', 'LensDescription'), 0x00460014: ('SQ', '1', "Right Lens Sequence", '', 'RightLensSequence'), 0x00460015: ('SQ', '1', "Left Lens Sequence", '', 'LeftLensSequence'), 0x00460016: ('SQ', '1', "Unspecified Laterality Lens Sequence", '', 'UnspecifiedLateralityLensSequence'), 0x00460018: ('SQ', '1', "Cylinder Sequence", '', 'CylinderSequence'), 0x00460028: ('SQ', '1', "Prism Sequence", '', 'PrismSequence'), 0x00460030: ('FD', '1', "Horizontal Prism Power", '', 'HorizontalPrismPower'), 0x00460032: ('CS', '1', "Horizontal Prism Base", '', 'HorizontalPrismBase'), 0x00460034: ('FD', '1', "Vertical Prism Power", '', 'VerticalPrismPower'), 0x00460036: ('CS', '1', "Vertical Prism Base", '', 'VerticalPrismBase'), 0x00460038: ('CS', '1', "Lens Segment Type", '', 'LensSegmentType'), 0x00460040: ('FD', '1', "Optical Transmittance", '', 'OpticalTransmittance'), 0x00460042: ('FD', '1', "Channel Width", '', 'ChannelWidth'), 0x00460044: ('FD', '1', "Pupil Size", '', 'PupilSize'), 0x00460046: ('FD', '1', "Corneal Size", '', 'CornealSize'), 0x00460047: ('SQ', '1', "Corneal Size Sequence", '', 'CornealSizeSequence'), 0x00460050: ('SQ', '1', "Autorefraction Right Eye Sequence", '', 'AutorefractionRightEyeSequence'), 0x00460052: ('SQ', '1', "Autorefraction Left Eye Sequence", '', 'AutorefractionLeftEyeSequence'), 0x00460060: ('FD', '1', "Distance Pupillary Distance", '', 'DistancePupillaryDistance'), 0x00460062: ('FD', '1', "Near Pupillary Distance", '', 'NearPupillaryDistance'), 0x00460063: ('FD', '1', "Intermediate Pupillary Distance", '', 'IntermediatePupillaryDistance'), 0x00460064: ('FD', '1', "Other Pupillary Distance", '', 'OtherPupillaryDistance'), 0x00460070: ('SQ', '1', "Keratometry Right Eye Sequence", '', 'KeratometryRightEyeSequence'), 0x00460071: ('SQ', '1', "Keratometry Left Eye Sequence", '', 'KeratometryLeftEyeSequence'), 0x00460074: ('SQ', '1', "Steep Keratometric Axis Sequence", '', 'SteepKeratometricAxisSequence'), 0x00460075: ('FD', '1', "Radius of Curvature", '', 'RadiusOfCurvature'), 0x00460076: ('FD', '1', "Keratometric Power", '', 'KeratometricPower'), 0x00460077: ('FD', '1', "Keratometric Axis", '', 'KeratometricAxis'), 0x00460080: ('SQ', '1', "Flat Keratometric Axis Sequence", '', 'FlatKeratometricAxisSequence'), 0x00460092: ('CS', '1', "Background Color", '', 'BackgroundColor'), 0x00460094: ('CS', '1', "Optotype", '', 'Optotype'), 0x00460095: ('CS', '1', "Optotype Presentation", '', 'OptotypePresentation'), 0x00460097: ('SQ', '1', "Subjective Refraction Right Eye Sequence", '', 'SubjectiveRefractionRightEyeSequence'), 0x00460098: ('SQ', '1', "Subjective Refraction Left Eye Sequence", '', 'SubjectiveRefractionLeftEyeSequence'), 0x00460100: ('SQ', '1', "Add Near Sequence", '', 'AddNearSequence'), 0x00460101: ('SQ', '1', "Add Intermediate Sequence", '', 'AddIntermediateSequence'), 0x00460102: ('SQ', '1', "Add Other Sequence", '', 'AddOtherSequence'), 0x00460104: ('FD', '1', "Add Power", '', 'AddPower'), 0x00460106: ('FD', '1', "Viewing Distance", '', 'ViewingDistance'), 0x00460110: ('SQ', '1', "Cornea Measurements Sequence", '', 'CorneaMeasurementsSequence'), 0x00460111: ('SQ', '1', "Source of Cornea Measurement Data Code Sequence", '', 'SourceOfCorneaMeasurementDataCodeSequence'), 0x00460112: ('SQ', '1', "Steep Corneal Axis Sequence", '', 'SteepCornealAxisSequence'), 0x00460113: ('SQ', '1', "Flat Corneal Axis Sequence", '', 'FlatCornealAxisSequence'), 0x00460114: ('FD', '1', "Corneal Power", '', 'CornealPower'), 0x00460115: ('FD', '1', "Corneal Axis", '', 'CornealAxis'), 0x00460116: ('SQ', '1', "Cornea Measurement Method Code Sequence", '', 'CorneaMeasurementMethodCodeSequence'), 0x00460117: ('FL', '1', "Refractive Index of Cornea", '', 'RefractiveIndexOfCornea'), 0x00460118: ('FL', '1', "Refractive Index of Aqueous Humor", '', 'RefractiveIndexOfAqueousHumor'), 0x00460121: ('SQ', '1', "Visual Acuity Type Code Sequence", '', 'VisualAcuityTypeCodeSequence'), 0x00460122: ('SQ', '1', "Visual Acuity Right Eye Sequence", '', 'VisualAcuityRightEyeSequence'), 0x00460123: ('SQ', '1', "Visual Acuity Left Eye Sequence", '', 'VisualAcuityLeftEyeSequence'), 0x00460124: ('SQ', '1', "Visual Acuity Both Eyes Open Sequence", '', 'VisualAcuityBothEyesOpenSequence'), 0x00460125: ('CS', '1', "Viewing Distance Type", '', 'ViewingDistanceType'), 0x00460135: ('SS', '2', "Visual Acuity Modifiers", '', 'VisualAcuityModifiers'), 0x00460137: ('FD', '1', "Decimal Visual Acuity", '', 'DecimalVisualAcuity'), 0x00460139: ('LO', '1', "Optotype Detailed Definition", '', 'OptotypeDetailedDefinition'), 0x00460145: ('SQ', '1', "Referenced Refractive Measurements Sequence", '', 'ReferencedRefractiveMeasurementsSequence'), 0x00460146: ('FD', '1', "Sphere Power", '', 'SpherePower'), 0x00460147: ('FD', '1', "Cylinder Power", '', 'CylinderPower'), 0x00460201: ('CS', '1', "Corneal Topography Surface", '', 'CornealTopographySurface'), 0x00460202: ('FL', '2', "Corneal Vertex Location", '', 'CornealVertexLocation'), 0x00460203: ('FL', '1', "Pupil Centroid X-Coordinate", '', 'PupilCentroidXCoordinate'), 0x00460204: ('FL', '1', "Pupil Centroid Y-Coordinate", '', 'PupilCentroidYCoordinate'), 0x00460205: ('FL', '1', "Equivalent Pupil Radius", '', 'EquivalentPupilRadius'), 0x00460207: ('SQ', '1', "Corneal Topography Map Type Code Sequence", '', 'CornealTopographyMapTypeCodeSequence'), 0x00460208: ('IS', '2-2n', "Vertices of the Outline of Pupil", '', 'VerticesOfTheOutlineOfPupil'), 0x00460210: ('SQ', '1', "Corneal Topography Mapping Normals Sequence", '', 'CornealTopographyMappingNormalsSequence'), 0x00460211: ('SQ', '1', "Maximum Corneal Curvature Sequence", '', 'MaximumCornealCurvatureSequence'), 0x00460212: ('FL', '1', "Maximum Corneal Curvature", '', 'MaximumCornealCurvature'), 0x00460213: ('FL', '2', "Maximum Corneal Curvature Location", '', 'MaximumCornealCurvatureLocation'), 0x00460215: ('SQ', '1', "Minimum Keratometric Sequence", '', 'MinimumKeratometricSequence'), 0x00460218: ('SQ', '1', "Simulated Keratometric Cylinder Sequence", '', 'SimulatedKeratometricCylinderSequence'), 0x00460220: ('FL', '1', "Average Corneal Power", '', 'AverageCornealPower'), 0x00460224: ('FL', '1', "Corneal I-S Value", '', 'CornealISValue'), 0x00460227: ('FL', '1', "Analyzed Area", '', 'AnalyzedArea'), 0x00460230: ('FL', '1', "Surface Regularity Index", '', 'SurfaceRegularityIndex'), 0x00460232: ('FL', '1', "Surface Asymmetry Index", '', 'SurfaceAsymmetryIndex'), 0x00460234: ('FL', '1', "Corneal Eccentricity Index", '', 'CornealEccentricityIndex'), 0x00460236: ('FL', '1', "Keratoconus Prediction Index", '', 'KeratoconusPredictionIndex'), 0x00460238: ('FL', '1', "Decimal Potential Visual Acuity", '', 'DecimalPotentialVisualAcuity'), 0x00460242: ('CS', '1', "Corneal Topography Map Quality Evaluation", '', 'CornealTopographyMapQualityEvaluation'), 0x00460244: ('SQ', '1', "Source Image Corneal Processed Data Sequence", '', 'SourceImageCornealProcessedDataSequence'), 0x00460247: ('FL', '3', "Corneal Point Location", '', 'CornealPointLocation'), 0x00460248: ('CS', '1', "Corneal Point Estimated", '', 'CornealPointEstimated'), 0x00460249: ('FL', '1', "Axial Power", '', 'AxialPower'), 0x00460250: ('FL', '1', "Tangential Power", '', 'TangentialPower'), 0x00460251: ('FL', '1', "Refractive Power", '', 'RefractivePower'), 0x00460252: ('FL', '1', "Relative Elevation", '', 'RelativeElevation'), 0x00460253: ('FL', '1', "Corneal Wavefront", '', 'CornealWavefront'), 0x00480001: ('FL', '1', "Imaged Volume Width", '', 'ImagedVolumeWidth'), 0x00480002: ('FL', '1', "Imaged Volume Height", '', 'ImagedVolumeHeight'), 0x00480003: ('FL', '1', "Imaged Volume Depth", '', 'ImagedVolumeDepth'), 0x00480006: ('UL', '1', "Total Pixel Matrix Columns", '', 'TotalPixelMatrixColumns'), 0x00480007: ('UL', '1', "Total Pixel Matrix Rows", '', 'TotalPixelMatrixRows'), 0x00480008: ('SQ', '1', "Total Pixel Matrix Origin Sequence", '', 'TotalPixelMatrixOriginSequence'), 0x00480010: ('CS', '1', "Specimen Label in Image", '', 'SpecimenLabelInImage'), 0x00480011: ('CS', '1', "Focus Method", '', 'FocusMethod'), 0x00480012: ('CS', '1', "Extended Depth of Field", '', 'ExtendedDepthOfField'), 0x00480013: ('US', '1', "Number of Focal Planes", '', 'NumberOfFocalPlanes'), 0x00480014: ('FL', '1', "Distance Between Focal Planes", '', 'DistanceBetweenFocalPlanes'), 0x00480015: ('US', '3', "Recommended Absent Pixel CIELab Value", '', 'RecommendedAbsentPixelCIELabValue'), 0x00480100: ('SQ', '1', "Illuminator Type Code Sequence", '', 'IlluminatorTypeCodeSequence'), 0x00480102: ('DS', '6', "Image Orientation (Slide)", '', 'ImageOrientationSlide'), 0x00480105: ('SQ', '1', "Optical Path Sequence", '', 'OpticalPathSequence'), 0x00480106: ('SH', '1', "Optical Path Identifier", '', 'OpticalPathIdentifier'), 0x00480107: ('ST', '1', "Optical Path Description", '', 'OpticalPathDescription'), 0x00480108: ('SQ', '1', "Illumination Color Code Sequence", '', 'IlluminationColorCodeSequence'), 0x00480110: ('SQ', '1', "Specimen Reference Sequence", '', 'SpecimenReferenceSequence'), 0x00480111: ('DS', '1', "Condenser Lens Power", '', 'CondenserLensPower'), 0x00480112: ('DS', '1', "Objective Lens Power", '', 'ObjectiveLensPower'), 0x00480113: ('DS', '1', "Objective Lens Numerical Aperture", '', 'ObjectiveLensNumericalAperture'), 0x00480114: ('CS', '1', "Confocal Mode", '', 'ConfocalMode'), 0x00480115: ('CS', '1', "Tissue Location", '', 'TissueLocation'), 0x00480116: ('SQ', '1', "Confocal Microscopy Image Frame Type Sequence", '', 'ConfocalMicroscopyImageFrameTypeSequence'), 0x00480117: ('FD', '1', "Image Acquisition Depth", '', 'ImageAcquisitionDepth'), 0x00480120: ('SQ', '1', "Palette Color Lookup Table Sequence", '', 'PaletteColorLookupTableSequence'), 0x00480200: ('SQ', '1', "Referenced Image Navigation Sequence", 'Retired', 'ReferencedImageNavigationSequence'), 0x00480201: ('US', '2', "Top Left Hand Corner of Localizer Area", 'Retired', 'TopLeftHandCornerOfLocalizerArea'), 0x00480202: ('US', '2', "Bottom Right Hand Corner of Localizer Area", 'Retired', 'BottomRightHandCornerOfLocalizerArea'), 0x00480207: ('SQ', '1', "Optical Path Identification Sequence", '', 'OpticalPathIdentificationSequence'), 0x0048021A: ('SQ', '1', "Plane Position (Slide) Sequence", '', 'PlanePositionSlideSequence'), 0x0048021E: ('SL', '1', "Column Position In Total Image Pixel Matrix", '', 'ColumnPositionInTotalImagePixelMatrix'), 0x0048021F: ('SL', '1', "Row Position In Total Image Pixel Matrix", '', 'RowPositionInTotalImagePixelMatrix'), 0x00480301: ('CS', '1', "Pixel Origin Interpretation", '', 'PixelOriginInterpretation'), 0x00480302: ('UL', '1', "Number of Optical Paths", '', 'NumberOfOpticalPaths'), 0x00480303: ('UL', '1', "Total Pixel Matrix Focal Planes", '', 'TotalPixelMatrixFocalPlanes'), 0x00500004: ('CS', '1', "Calibration Image", '', 'CalibrationImage'), 0x00500010: ('SQ', '1', "Device Sequence", '', 'DeviceSequence'), 0x00500012: ('SQ', '1', "Container Component Type Code Sequence", '', 'ContainerComponentTypeCodeSequence'), 0x00500013: ('FD', '1', "Container Component Thickness", '', 'ContainerComponentThickness'), 0x00500014: ('DS', '1', "Device Length", '', 'DeviceLength'), 0x00500015: ('FD', '1', "Container Component Width", '', 'ContainerComponentWidth'), 0x00500016: ('DS', '1', "Device Diameter", '', 'DeviceDiameter'), 0x00500017: ('CS', '1', "Device Diameter Units", '', 'DeviceDiameterUnits'), 0x00500018: ('DS', '1', "Device Volume", '', 'DeviceVolume'), 0x00500019: ('DS', '1', "Inter-Marker Distance", '', 'InterMarkerDistance'), 0x0050001A: ('CS', '1', "Container Component Material", '', 'ContainerComponentMaterial'), 0x0050001B: ('LO', '1', "Container Component ID", '', 'ContainerComponentID'), 0x0050001C: ('FD', '1', "Container Component Length", '', 'ContainerComponentLength'), 0x0050001D: ('FD', '1', "Container Component Diameter", '', 'ContainerComponentDiameter'), 0x0050001E: ('LO', '1', "Container Component Description", '', 'ContainerComponentDescription'), 0x00500020: ('LO', '1', "Device Description", '', 'DeviceDescription'), 0x00500021: ('ST', '1', "Long Device Description", '', 'LongDeviceDescription'), 0x00520001: ('FL', '1', "Contrast/Bolus Ingredient Percent by Volume", '', 'ContrastBolusIngredientPercentByVolume'), 0x00520002: ('FD', '1', "OCT Focal Distance", '', 'OCTFocalDistance'), 0x00520003: ('FD', '1', "Beam Spot Size", '', 'BeamSpotSize'), 0x00520004: ('FD', '1', "Effective Refractive Index", '', 'EffectiveRefractiveIndex'), 0x00520006: ('CS', '1', "OCT Acquisition Domain", '', 'OCTAcquisitionDomain'), 0x00520007: ('FD', '1', "OCT Optical Center Wavelength", '', 'OCTOpticalCenterWavelength'), 0x00520008: ('FD', '1', "Axial Resolution", '', 'AxialResolution'), 0x00520009: ('FD', '1', "Ranging Depth", '', 'RangingDepth'), 0x00520011: ('FD', '1', "A-line Rate", '', 'ALineRate'), 0x00520012: ('US', '1', "A-lines Per Frame", '', 'ALinesPerFrame'), 0x00520013: ('FD', '1', "Catheter Rotational Rate", '', 'CatheterRotationalRate'), 0x00520014: ('FD', '1', "A-line Pixel Spacing", '', 'ALinePixelSpacing'), 0x00520016: ('SQ', '1', "Mode of Percutaneous Access Sequence", '', 'ModeOfPercutaneousAccessSequence'), 0x00520025: ('SQ', '1', "Intravascular OCT Frame Type Sequence", '', 'IntravascularOCTFrameTypeSequence'), 0x00520026: ('CS', '1', "OCT Z Offset Applied", '', 'OCTZOffsetApplied'), 0x00520027: ('SQ', '1', "Intravascular Frame Content Sequence", '', 'IntravascularFrameContentSequence'), 0x00520028: ('FD', '1', "Intravascular Longitudinal Distance", '', 'IntravascularLongitudinalDistance'), 0x00520029: ('SQ', '1', "Intravascular OCT Frame Content Sequence", '', 'IntravascularOCTFrameContentSequence'), 0x00520030: ('SS', '1', "OCT Z Offset Correction", '', 'OCTZOffsetCorrection'), 0x00520031: ('CS', '1', "Catheter Direction of Rotation", '', 'CatheterDirectionOfRotation'), 0x00520033: ('FD', '1', "Seam Line Location", '', 'SeamLineLocation'), 0x00520034: ('FD', '1', "First A-line Location", '', 'FirstALineLocation'), 0x00520036: ('US', '1', "Seam Line Index", '', 'SeamLineIndex'), 0x00520038: ('US', '1', "Number of Padded A-lines", '', 'NumberOfPaddedALines'), 0x00520039: ('CS', '1', "Interpolation Type", '', 'InterpolationType'), 0x0052003A: ('CS', '1', "Refractive Index Applied", '', 'RefractiveIndexApplied'), 0x00540010: ('US', '1-n', "Energy Window Vector", '', 'EnergyWindowVector'), 0x00540011: ('US', '1', "Number of Energy Windows", '', 'NumberOfEnergyWindows'), 0x00540012: ('SQ', '1', "Energy Window Information Sequence", '', 'EnergyWindowInformationSequence'), 0x00540013: ('SQ', '1', "Energy Window Range Sequence", '', 'EnergyWindowRangeSequence'), 0x00540014: ('DS', '1', "Energy Window Lower Limit", '', 'EnergyWindowLowerLimit'), 0x00540015: ('DS', '1', "Energy Window Upper Limit", '', 'EnergyWindowUpperLimit'), 0x00540016: ('SQ', '1', "Radiopharmaceutical Information Sequence", '', 'RadiopharmaceuticalInformationSequence'), 0x00540017: ('IS', '1', "Residual Syringe Counts", '', 'ResidualSyringeCounts'), 0x00540018: ('SH', '1', "Energy Window Name", '', 'EnergyWindowName'), 0x00540020: ('US', '1-n', "Detector Vector", '', 'DetectorVector'), 0x00540021: ('US', '1', "Number of Detectors", '', 'NumberOfDetectors'), 0x00540022: ('SQ', '1', "Detector Information Sequence", '', 'DetectorInformationSequence'), 0x00540030: ('US', '1-n', "Phase Vector", '', 'PhaseVector'), 0x00540031: ('US', '1', "Number of Phases", '', 'NumberOfPhases'), 0x00540032: ('SQ', '1', "Phase Information Sequence", '', 'PhaseInformationSequence'), 0x00540033: ('US', '1', "Number of Frames in Phase", '', 'NumberOfFramesInPhase'), 0x00540036: ('IS', '1', "Phase Delay", '', 'PhaseDelay'), 0x00540038: ('IS', '1', "Pause Between Frames", '', 'PauseBetweenFrames'), 0x00540039: ('CS', '1', "Phase Description", '', 'PhaseDescription'), 0x00540050: ('US', '1-n', "Rotation Vector", '', 'RotationVector'), 0x00540051: ('US', '1', "Number of Rotations", '', 'NumberOfRotations'), 0x00540052: ('SQ', '1', "Rotation Information Sequence", '', 'RotationInformationSequence'), 0x00540053: ('US', '1', "Number of Frames in Rotation", '', 'NumberOfFramesInRotation'), 0x00540060: ('US', '1-n', "R-R Interval Vector", '', 'RRIntervalVector'), 0x00540061: ('US', '1', "Number of R-R Intervals", '', 'NumberOfRRIntervals'), 0x00540062: ('SQ', '1', "Gated Information Sequence", '', 'GatedInformationSequence'), 0x00540063: ('SQ', '1', "Data Information Sequence", '', 'DataInformationSequence'), 0x00540070: ('US', '1-n', "Time Slot Vector", '', 'TimeSlotVector'), 0x00540071: ('US', '1', "Number of Time Slots", '', 'NumberOfTimeSlots'), 0x00540072: ('SQ', '1', "Time Slot Information Sequence", '', 'TimeSlotInformationSequence'), 0x00540073: ('DS', '1', "Time Slot Time", '', 'TimeSlotTime'), 0x00540080: ('US', '1-n', "Slice Vector", '', 'SliceVector'), 0x00540081: ('US', '1', "Number of Slices", '', 'NumberOfSlices'), 0x00540090: ('US', '1-n', "Angular View Vector", '', 'AngularViewVector'), 0x00540100: ('US', '1-n', "Time Slice Vector", '', 'TimeSliceVector'), 0x00540101: ('US', '1', "Number of Time Slices", '', 'NumberOfTimeSlices'), 0x00540200: ('DS', '1', "Start Angle", '', 'StartAngle'), 0x00540202: ('CS', '1', "Type of Detector Motion", '', 'TypeOfDetectorMotion'), 0x00540210: ('IS', '1-n', "Trigger Vector", '', 'TriggerVector'), 0x00540211: ('US', '1', "Number of Triggers in Phase", '', 'NumberOfTriggersInPhase'), 0x00540220: ('SQ', '1', "View Code Sequence", '', 'ViewCodeSequence'), 0x00540222: ('SQ', '1', "View Modifier Code Sequence", '', 'ViewModifierCodeSequence'), 0x00540300: ('SQ', '1', "Radionuclide Code Sequence", '', 'RadionuclideCodeSequence'), 0x00540302: ('SQ', '1', "Administration Route Code Sequence", '', 'AdministrationRouteCodeSequence'), 0x00540304: ('SQ', '1', "Radiopharmaceutical Code Sequence", '', 'RadiopharmaceuticalCodeSequence'), 0x00540306: ('SQ', '1', "Calibration Data Sequence", '', 'CalibrationDataSequence'), 0x00540308: ('US', '1', "Energy Window Number", '', 'EnergyWindowNumber'), 0x00540400: ('SH', '1', "Image ID", '', 'ImageID'), 0x00540410: ('SQ', '1', "Patient Orientation Code Sequence", '', 'PatientOrientationCodeSequence'), 0x00540412: ('SQ', '1', "Patient Orientation Modifier Code Sequence", '', 'PatientOrientationModifierCodeSequence'), 0x00540414: ('SQ', '1', "Patient Gantry Relationship Code Sequence", '', 'PatientGantryRelationshipCodeSequence'), 0x00540500: ('CS', '1', "Slice Progression Direction", '', 'SliceProgressionDirection'), 0x00540501: ('CS', '1', "Scan Progression Direction", '', 'ScanProgressionDirection'), 0x00541000: ('CS', '2', "Series Type", '', 'SeriesType'), 0x00541001: ('CS', '1', "Units", '', 'Units'), 0x00541002: ('CS', '1', "Counts Source", '', 'CountsSource'), 0x00541004: ('CS', '1', "Reprojection Method", '', 'ReprojectionMethod'), 0x00541006: ('CS', '1', "SUV Type", '', 'SUVType'), 0x00541100: ('CS', '1', "Randoms Correction Method", '', 'RandomsCorrectionMethod'), 0x00541101: ('LO', '1', "Attenuation Correction Method", '', 'AttenuationCorrectionMethod'), 0x00541102: ('CS', '1', "Decay Correction", '', 'DecayCorrection'), 0x00541103: ('LO', '1', "Reconstruction Method", '', 'ReconstructionMethod'), 0x00541104: ('LO', '1', "Detector Lines of Response Used", '', 'DetectorLinesOfResponseUsed'), 0x00541105: ('LO', '1', "Scatter Correction Method", '', 'ScatterCorrectionMethod'), 0x00541200: ('DS', '1', "Axial Acceptance", '', 'AxialAcceptance'), 0x00541201: ('IS', '2', "Axial Mash", '', 'AxialMash'), 0x00541202: ('IS', '1', "Transverse Mash", '', 'TransverseMash'), 0x00541203: ('DS', '2', "Detector Element Size", '', 'DetectorElementSize'), 0x00541210: ('DS', '1', "Coincidence Window Width", '', 'CoincidenceWindowWidth'), 0x00541220: ('CS', '1-n', "Secondary Counts Type", '', 'SecondaryCountsType'), 0x00541300: ('DS', '1', "Frame Reference Time", '', 'FrameReferenceTime'), 0x00541310: ('IS', '1', "Primary (Prompts) Counts Accumulated", '', 'PrimaryPromptsCountsAccumulated'), 0x00541311: ('IS', '1-n', "Secondary Counts Accumulated", '', 'SecondaryCountsAccumulated'), 0x00541320: ('DS', '1', "Slice Sensitivity Factor", '', 'SliceSensitivityFactor'), 0x00541321: ('DS', '1', "Decay Factor", '', 'DecayFactor'), 0x00541322: ('DS', '1', "Dose Calibration Factor", '', 'DoseCalibrationFactor'), 0x00541323: ('DS', '1', "Scatter Fraction Factor", '', 'ScatterFractionFactor'), 0x00541324: ('DS', '1', "Dead Time Factor", '', 'DeadTimeFactor'), 0x00541330: ('US', '1', "Image Index", '', 'ImageIndex'), 0x00541400: ('CS', '1-n', "Counts Included", 'Retired', 'CountsIncluded'), 0x00541401: ('CS', '1', "Dead Time Correction Flag", 'Retired', 'DeadTimeCorrectionFlag'), 0x00603000: ('SQ', '1', "Histogram Sequence", '', 'HistogramSequence'), 0x00603002: ('US', '1', "Histogram Number of Bins", '', 'HistogramNumberOfBins'), 0x00603004: ('US or SS', '1', "Histogram First Bin Value", '', 'HistogramFirstBinValue'), 0x00603006: ('US or SS', '1', "Histogram Last Bin Value", '', 'HistogramLastBinValue'), 0x00603008: ('US', '1', "Histogram Bin Width", '', 'HistogramBinWidth'), 0x00603010: ('LO', '1', "Histogram Explanation", '', 'HistogramExplanation'), 0x00603020: ('UL', '1-n', "Histogram Data", '', 'HistogramData'), 0x00620001: ('CS', '1', "Segmentation Type", '', 'SegmentationType'), 0x00620002: ('SQ', '1', "Segment Sequence", '', 'SegmentSequence'), 0x00620003: ('SQ', '1', "Segmented Property Category Code Sequence", '', 'SegmentedPropertyCategoryCodeSequence'), 0x00620004: ('US', '1', "Segment Number", '', 'SegmentNumber'), 0x00620005: ('LO', '1', "Segment Label", '', 'SegmentLabel'), 0x00620006: ('ST', '1', "Segment Description", '', 'SegmentDescription'), 0x00620007: ('SQ', '1', "Segmentation Algorithm Identification Sequence", '', 'SegmentationAlgorithmIdentificationSequence'), 0x00620008: ('CS', '1', "Segment Algorithm Type", '', 'SegmentAlgorithmType'), 0x00620009: ('LO', '1-n', "Segment Algorithm Name", '', 'SegmentAlgorithmName'), 0x0062000A: ('SQ', '1', "Segment Identification Sequence", '', 'SegmentIdentificationSequence'), 0x0062000B: ('US', '1-n', "Referenced Segment Number", '', 'ReferencedSegmentNumber'), 0x0062000C: ('US', '1', "Recommended Display Grayscale Value", '', 'RecommendedDisplayGrayscaleValue'), 0x0062000D: ('US', '3', "Recommended Display CIELab Value", '', 'RecommendedDisplayCIELabValue'), 0x0062000E: ('US', '1', "Maximum Fractional Value", '', 'MaximumFractionalValue'), 0x0062000F: ('SQ', '1', "Segmented Property Type Code Sequence", '', 'SegmentedPropertyTypeCodeSequence'), 0x00620010: ('CS', '1', "Segmentation Fractional Type", '', 'SegmentationFractionalType'), 0x00620011: ('SQ', '1', "Segmented Property Type Modifier Code Sequence", '', 'SegmentedPropertyTypeModifierCodeSequence'), 0x00620012: ('SQ', '1', "Used Segments Sequence", '', 'UsedSegmentsSequence'), 0x00620013: ('CS', '1', "Segments Overlap", '', 'SegmentsOverlap'), 0x00620020: ('UT', '1', "Tracking ID", '', 'TrackingID'), 0x00620021: ('UI', '1', "Tracking UID", '', 'TrackingUID'), 0x00640002: ('SQ', '1', "Deformable Registration Sequence", '', 'DeformableRegistrationSequence'), 0x00640003: ('UI', '1', "Source Frame of Reference UID", '', 'SourceFrameOfReferenceUID'), 0x00640005: ('SQ', '1', "Deformable Registration Grid Sequence", '', 'DeformableRegistrationGridSequence'), 0x00640007: ('UL', '3', "Grid Dimensions", '', 'GridDimensions'), 0x00640008: ('FD', '3', "Grid Resolution", '', 'GridResolution'), 0x00640009: ('OF', '1', "Vector Grid Data", '', 'VectorGridData'), 0x0064000F: ('SQ', '1', "Pre Deformation Matrix Registration Sequence", '', 'PreDeformationMatrixRegistrationSequence'), 0x00640010: ('SQ', '1', "Post Deformation Matrix Registration Sequence", '', 'PostDeformationMatrixRegistrationSequence'), 0x00660001: ('UL', '1', "Number of Surfaces", '', 'NumberOfSurfaces'), 0x00660002: ('SQ', '1', "Surface Sequence", '', 'SurfaceSequence'), 0x00660003: ('UL', '1', "Surface Number", '', 'SurfaceNumber'), 0x00660004: ('LT', '1', "Surface Comments", '', 'SurfaceComments'), 0x00660009: ('CS', '1', "Surface Processing", '', 'SurfaceProcessing'), 0x0066000A: ('FL', '1', "Surface Processing Ratio", '', 'SurfaceProcessingRatio'), 0x0066000B: ('LO', '1', "Surface Processing Description", '', 'SurfaceProcessingDescription'), 0x0066000C: ('FL', '1', "Recommended Presentation Opacity", '', 'RecommendedPresentationOpacity'), 0x0066000D: ('CS', '1', "Recommended Presentation Type", '', 'RecommendedPresentationType'), 0x0066000E: ('CS', '1', "Finite Volume", '', 'FiniteVolume'), 0x00660010: ('CS', '1', "Manifold", '', 'Manifold'), 0x00660011: ('SQ', '1', "Surface Points Sequence", '', 'SurfacePointsSequence'), 0x00660012: ('SQ', '1', "Surface Points Normals Sequence", '', 'SurfacePointsNormalsSequence'), 0x00660013: ('SQ', '1', "Surface Mesh Primitives Sequence", '', 'SurfaceMeshPrimitivesSequence'), 0x00660015: ('UL', '1', "Number of Surface Points", '', 'NumberOfSurfacePoints'), 0x00660016: ('OF', '1', "Point Coordinates Data", '', 'PointCoordinatesData'), 0x00660017: ('FL', '3', "Point Position Accuracy", '', 'PointPositionAccuracy'), 0x00660018: ('FL', '1', "Mean Point Distance", '', 'MeanPointDistance'), 0x00660019: ('FL', '1', "Maximum Point Distance", '', 'MaximumPointDistance'), 0x0066001A: ('FL', '6', "Points Bounding Box Coordinates", '', 'PointsBoundingBoxCoordinates'), 0x0066001B: ('FL', '3', "Axis of Rotation", '', 'AxisOfRotation'), 0x0066001C: ('FL', '3', "Center of Rotation", '', 'CenterOfRotation'), 0x0066001E: ('UL', '1', "Number of Vectors", '', 'NumberOfVectors'), 0x0066001F: ('US', '1', "Vector Dimensionality", '', 'VectorDimensionality'), 0x00660020: ('FL', '1-n', "Vector Accuracy", '', 'VectorAccuracy'), 0x00660021: ('OF', '1', "Vector Coordinate Data", '', 'VectorCoordinateData'), 0x00660022: ('OD', '1', "Double Point Coordinates Data", '', 'DoublePointCoordinatesData'), 0x00660023: ('OW', '1', "Triangle Point Index List", 'Retired', 'TrianglePointIndexList'), 0x00660024: ('OW', '1', "Edge Point Index List", 'Retired', 'EdgePointIndexList'), 0x00660025: ('OW', '1', "Vertex Point Index List", 'Retired', 'VertexPointIndexList'), 0x00660026: ('SQ', '1', "Triangle Strip Sequence", '', 'TriangleStripSequence'), 0x00660027: ('SQ', '1', "Triangle Fan Sequence", '', 'TriangleFanSequence'), 0x00660028: ('SQ', '1', "Line Sequence", '', 'LineSequence'), 0x00660029: ('OW', '1', "Primitive Point Index List", 'Retired', 'PrimitivePointIndexList'), 0x0066002A: ('UL', '1', "Surface Count", '', 'SurfaceCount'), 0x0066002B: ('SQ', '1', "Referenced Surface Sequence", '', 'ReferencedSurfaceSequence'), 0x0066002C: ('UL', '1', "Referenced Surface Number", '', 'ReferencedSurfaceNumber'), 0x0066002D: ('SQ', '1', "Segment Surface Generation Algorithm Identification Sequence", '', 'SegmentSurfaceGenerationAlgorithmIdentificationSequence'), 0x0066002E: ('SQ', '1', "Segment Surface Source Instance Sequence", '', 'SegmentSurfaceSourceInstanceSequence'), 0x0066002F: ('SQ', '1', "Algorithm Family Code Sequence", '', 'AlgorithmFamilyCodeSequence'), 0x00660030: ('SQ', '1', "Algorithm Name Code Sequence", '', 'AlgorithmNameCodeSequence'), 0x00660031: ('LO', '1', "Algorithm Version", '', 'AlgorithmVersion'), 0x00660032: ('LT', '1', "Algorithm Parameters", '', 'AlgorithmParameters'), 0x00660034: ('SQ', '1', "Facet Sequence", '', 'FacetSequence'), 0x00660035: ('SQ', '1', "Surface Processing Algorithm Identification Sequence", '', 'SurfaceProcessingAlgorithmIdentificationSequence'), 0x00660036: ('LO', '1', "Algorithm Name", '', 'AlgorithmName'), 0x00660037: ('FL', '1', "Recommended Point Radius", '', 'RecommendedPointRadius'), 0x00660038: ('FL', '1', "Recommended Line Thickness", '', 'RecommendedLineThickness'), 0x00660040: ('OL', '1', "Long Primitive Point Index List", '', 'LongPrimitivePointIndexList'), 0x00660041: ('OL', '1', "Long Triangle Point Index List", '', 'LongTrianglePointIndexList'), 0x00660042: ('OL', '1', "Long Edge Point Index List", '', 'LongEdgePointIndexList'), 0x00660043: ('OL', '1', "Long Vertex Point Index List", '', 'LongVertexPointIndexList'), 0x00660101: ('SQ', '1', "Track Set Sequence", '', 'TrackSetSequence'), 0x00660102: ('SQ', '1', "Track Sequence", '', 'TrackSequence'), 0x00660103: ('OW', '1', "Recommended Display CIELab Value List", '', 'RecommendedDisplayCIELabValueList'), 0x00660104: ('SQ', '1', "Tracking Algorithm Identification Sequence", '', 'TrackingAlgorithmIdentificationSequence'), 0x00660105: ('UL', '1', "Track Set Number", '', 'TrackSetNumber'), 0x00660106: ('LO', '1', "Track Set Label", '', 'TrackSetLabel'), 0x00660107: ('UT', '1', "Track Set Description", '', 'TrackSetDescription'), 0x00660108: ('SQ', '1', "Track Set Anatomical Type Code Sequence", '', 'TrackSetAnatomicalTypeCodeSequence'), 0x00660121: ('SQ', '1', "Measurements Sequence", '', 'MeasurementsSequence'), 0x00660124: ('SQ', '1', "Track Set Statistics Sequence", '', 'TrackSetStatisticsSequence'), 0x00660125: ('OF', '1', "Floating Point Values", '', 'FloatingPointValues'), 0x00660129: ('OL', '1', "Track Point Index List", '', 'TrackPointIndexList'), 0x00660130: ('SQ', '1', "Track Statistics Sequence", '', 'TrackStatisticsSequence'), 0x00660132: ('SQ', '1', "Measurement Values Sequence", '', 'MeasurementValuesSequence'), 0x00660133: ('SQ', '1', "Diffusion Acquisition Code Sequence", '', 'DiffusionAcquisitionCodeSequence'), 0x00660134: ('SQ', '1', "Diffusion Model Code Sequence", '', 'DiffusionModelCodeSequence'), 0x00686210: ('LO', '1', "Implant Size", '', 'ImplantSize'), 0x00686221: ('LO', '1', "Implant Template Version", '', 'ImplantTemplateVersion'), 0x00686222: ('SQ', '1', "Replaced Implant Template Sequence", '', 'ReplacedImplantTemplateSequence'), 0x00686223: ('CS', '1', "Implant Type", '', 'ImplantType'), 0x00686224: ('SQ', '1', "Derivation Implant Template Sequence", '', 'DerivationImplantTemplateSequence'), 0x00686225: ('SQ', '1', "Original Implant Template Sequence", '', 'OriginalImplantTemplateSequence'), 0x00686226: ('DT', '1', "Effective DateTime", '', 'EffectiveDateTime'), 0x00686230: ('SQ', '1', "Implant Target Anatomy Sequence", '', 'ImplantTargetAnatomySequence'), 0x00686260: ('SQ', '1', "Information From Manufacturer Sequence", '', 'InformationFromManufacturerSequence'), 0x00686265: ('SQ', '1', "Notification From Manufacturer Sequence", '', 'NotificationFromManufacturerSequence'), 0x00686270: ('DT', '1', "Information Issue DateTime", '', 'InformationIssueDateTime'), 0x00686280: ('ST', '1', "Information Summary", '', 'InformationSummary'), 0x006862A0: ('SQ', '1', "Implant Regulatory Disapproval Code Sequence", '', 'ImplantRegulatoryDisapprovalCodeSequence'), 0x006862A5: ('FD', '1', "Overall Template Spatial Tolerance", '', 'OverallTemplateSpatialTolerance'), 0x006862C0: ('SQ', '1', "HPGL Document Sequence", '', 'HPGLDocumentSequence'), 0x006862D0: ('US', '1', "HPGL Document ID", '', 'HPGLDocumentID'), 0x006862D5: ('LO', '1', "HPGL Document Label", '', 'HPGLDocumentLabel'), 0x006862E0: ('SQ', '1', "View Orientation Code Sequence", '', 'ViewOrientationCodeSequence'), 0x006862F0: ('SQ', '1', "View Orientation Modifier Code Sequence", '', 'ViewOrientationModifierCodeSequence'), 0x006862F2: ('FD', '1', "HPGL Document Scaling", '', 'HPGLDocumentScaling'), 0x00686300: ('OB', '1', "HPGL Document", '', 'HPGLDocument'), 0x00686310: ('US', '1', "HPGL Contour Pen Number", '', 'HPGLContourPenNumber'), 0x00686320: ('SQ', '1', "HPGL Pen Sequence", '', 'HPGLPenSequence'), 0x00686330: ('US', '1', "HPGL Pen Number", '', 'HPGLPenNumber'), 0x00686340: ('LO', '1', "HPGL Pen Label", '', 'HPGLPenLabel'), 0x00686345: ('ST', '1', "HPGL Pen Description", '', 'HPGLPenDescription'), 0x00686346: ('FD', '2', "Recommended Rotation Point", '', 'RecommendedRotationPoint'), 0x00686347: ('FD', '4', "Bounding Rectangle", '', 'BoundingRectangle'), 0x00686350: ('US', '1-n', "Implant Template 3D Model Surface Number", '', 'ImplantTemplate3DModelSurfaceNumber'), 0x00686360: ('SQ', '1', "Surface Model Description Sequence", '', 'SurfaceModelDescriptionSequence'), 0x00686380: ('LO', '1', "Surface Model Label", '', 'SurfaceModelLabel'), 0x00686390: ('FD', '1', "Surface Model Scaling Factor", '', 'SurfaceModelScalingFactor'), 0x006863A0: ('SQ', '1', "Materials Code Sequence", '', 'MaterialsCodeSequence'), 0x006863A4: ('SQ', '1', "Coating Materials Code Sequence", '', 'CoatingMaterialsCodeSequence'), 0x006863A8: ('SQ', '1', "Implant Type Code Sequence", '', 'ImplantTypeCodeSequence'), 0x006863AC: ('SQ', '1', "Fixation Method Code Sequence", '', 'FixationMethodCodeSequence'), 0x006863B0: ('SQ', '1', "Mating Feature Sets Sequence", '', 'MatingFeatureSetsSequence'), 0x006863C0: ('US', '1', "Mating Feature Set ID", '', 'MatingFeatureSetID'), 0x006863D0: ('LO', '1', "Mating Feature Set Label", '', 'MatingFeatureSetLabel'), 0x006863E0: ('SQ', '1', "Mating Feature Sequence", '', 'MatingFeatureSequence'), 0x006863F0: ('US', '1', "Mating Feature ID", '', 'MatingFeatureID'), 0x00686400: ('SQ', '1', "Mating Feature Degree of Freedom Sequence", '', 'MatingFeatureDegreeOfFreedomSequence'), 0x00686410: ('US', '1', "Degree of Freedom ID", '', 'DegreeOfFreedomID'), 0x00686420: ('CS', '1', "Degree of Freedom Type", '', 'DegreeOfFreedomType'), 0x00686430: ('SQ', '1', "2D Mating Feature Coordinates Sequence", '', 'TwoDMatingFeatureCoordinatesSequence'), 0x00686440: ('US', '1', "Referenced HPGL Document ID", '', 'ReferencedHPGLDocumentID'), 0x00686450: ('FD', '2', "2D Mating Point", '', 'TwoDMatingPoint'), 0x00686460: ('FD', '4', "2D Mating Axes", '', 'TwoDMatingAxes'), 0x00686470: ('SQ', '1', "2D Degree of Freedom Sequence", '', 'TwoDDegreeOfFreedomSequence'), 0x00686490: ('FD', '3', "3D Degree of Freedom Axis", '', 'ThreeDDegreeOfFreedomAxis'), 0x006864A0: ('FD', '2', "Range of Freedom", '', 'RangeOfFreedom'), 0x006864C0: ('FD', '3', "3D Mating Point", '', 'ThreeDMatingPoint'), 0x006864D0: ('FD', '9', "3D Mating Axes", '', 'ThreeDMatingAxes'), 0x006864F0: ('FD', '3', "2D Degree of Freedom Axis", '', 'TwoDDegreeOfFreedomAxis'), 0x00686500: ('SQ', '1', "Planning Landmark Point Sequence", '', 'PlanningLandmarkPointSequence'), 0x00686510: ('SQ', '1', "Planning Landmark Line Sequence", '', 'PlanningLandmarkLineSequence'), 0x00686520: ('SQ', '1', "Planning Landmark Plane Sequence", '', 'PlanningLandmarkPlaneSequence'), 0x00686530: ('US', '1', "Planning Landmark ID", '', 'PlanningLandmarkID'), 0x00686540: ('LO', '1', "Planning Landmark Description", '', 'PlanningLandmarkDescription'), 0x00686545: ('SQ', '1', "Planning Landmark Identification Code Sequence", '', 'PlanningLandmarkIdentificationCodeSequence'), 0x00686550: ('SQ', '1', "2D Point Coordinates Sequence", '', 'TwoDPointCoordinatesSequence'), 0x00686560: ('FD', '2', "2D Point Coordinates", '', 'TwoDPointCoordinates'), 0x00686590: ('FD', '3', "3D Point Coordinates", '', 'ThreeDPointCoordinates'), 0x006865A0: ('SQ', '1', "2D Line Coordinates Sequence", '', 'TwoDLineCoordinatesSequence'), 0x006865B0: ('FD', '4', "2D Line Coordinates", '', 'TwoDLineCoordinates'), 0x006865D0: ('FD', '6', "3D Line Coordinates", '', 'ThreeDLineCoordinates'), 0x006865E0: ('SQ', '1', "2D Plane Coordinates Sequence", '', 'TwoDPlaneCoordinatesSequence'), 0x006865F0: ('FD', '4', "2D Plane Intersection", '', 'TwoDPlaneIntersection'), 0x00686610: ('FD', '3', "3D Plane Origin", '', 'ThreeDPlaneOrigin'), 0x00686620: ('FD', '3', "3D Plane Normal", '', 'ThreeDPlaneNormal'), 0x00687001: ('CS', '1', "Model Modification", '', 'ModelModification'), 0x00687002: ('CS', '1', "Model Mirroring", '', 'ModelMirroring'), 0x00687003: ('SQ', '1', "Model Usage Code Sequence", '', 'ModelUsageCodeSequence'), 0x00687004: ('UI', '1', "Model Group UID", '', 'ModelGroupUID'), 0x00687005: ('UR', '1', "Relative URI Reference Within Encapsulated Document", '', 'RelativeURIReferenceWithinEncapsulatedDocument'), 0x006A0001: ('CS', '1', "Annotation Coordinate Type", '', 'AnnotationCoordinateType'), 0x006A0002: ('SQ', '1', "Annotation Group Sequence", '', 'AnnotationGroupSequence'), 0x006A0003: ('UI', '1', "Annotation Group UID", '', 'AnnotationGroupUID'), 0x006A0005: ('LO', '1', "Annotation Group Label", '', 'AnnotationGroupLabel'), 0x006A0006: ('UT', '1', "Annotation Group Description", '', 'AnnotationGroupDescription'), 0x006A0007: ('CS', '1', "Annotation Group Generation Type", '', 'AnnotationGroupGenerationType'), 0x006A0008: ('SQ', '1', "Annotation Group Algorithm Identification Sequence", '', 'AnnotationGroupAlgorithmIdentificationSequence'), 0x006A0009: ('SQ', '1', "Annotation Property Category Code Sequence", '', 'AnnotationPropertyCategoryCodeSequence'), 0x006A000A: ('SQ', '1', "Annotation Property Type Code Sequence", '', 'AnnotationPropertyTypeCodeSequence'), 0x006A000B: ('SQ', '1', "Annotation Property Type Modifier Code Sequence", '', 'AnnotationPropertyTypeModifierCodeSequence'), 0x006A000C: ('UL', '1', "Number of Annotations", '', 'NumberOfAnnotations'), 0x006A000D: ('CS', '1', "Annotation Applies to All Optical Paths", '', 'AnnotationAppliesToAllOpticalPaths'), 0x006A000E: ('SH', '1-n', "Referenced Optical Path Identifier", '', 'ReferencedOpticalPathIdentifier'), 0x006A000F: ('CS', '1', "Annotation Applies to All Z Planes", '', 'AnnotationAppliesToAllZPlanes'), 0x006A0010: ('FD', '1-n', "Common Z Coordinate Value", '', 'CommonZCoordinateValue'), 0x006A0011: ('OL', '1', "Annotation Index List", '', 'AnnotationIndexList'), 0x00700001: ('SQ', '1', "Graphic Annotation Sequence", '', 'GraphicAnnotationSequence'), 0x00700002: ('CS', '1', "Graphic Layer", '', 'GraphicLayer'), 0x00700003: ('CS', '1', "Bounding Box Annotation Units", '', 'BoundingBoxAnnotationUnits'), 0x00700004: ('CS', '1', "Anchor Point Annotation Units", '', 'AnchorPointAnnotationUnits'), 0x00700005: ('CS', '1', "Graphic Annotation Units", '', 'GraphicAnnotationUnits'), 0x00700006: ('ST', '1', "Unformatted Text Value", '', 'UnformattedTextValue'), 0x00700008: ('SQ', '1', "Text Object Sequence", '', 'TextObjectSequence'), 0x00700009: ('SQ', '1', "Graphic Object Sequence", '', 'GraphicObjectSequence'), 0x00700010: ('FL', '2', "Bounding Box Top Left Hand Corner", '', 'BoundingBoxTopLeftHandCorner'), 0x00700011: ('FL', '2', "Bounding Box Bottom Right Hand Corner", '', 'BoundingBoxBottomRightHandCorner'), 0x00700012: ('CS', '1', "Bounding Box Text Horizontal Justification", '', 'BoundingBoxTextHorizontalJustification'), 0x00700014: ('FL', '2', "Anchor Point", '', 'AnchorPoint'), 0x00700015: ('CS', '1', "Anchor Point Visibility", '', 'AnchorPointVisibility'), 0x00700020: ('US', '1', "Graphic Dimensions", '', 'GraphicDimensions'), 0x00700021: ('US', '1', "Number of Graphic Points", '', 'NumberOfGraphicPoints'), 0x00700022: ('FL', '2-n', "Graphic Data", '', 'GraphicData'), 0x00700023: ('CS', '1', "Graphic Type", '', 'GraphicType'), 0x00700024: ('CS', '1', "Graphic Filled", '', 'GraphicFilled'), 0x00700040: ('IS', '1', "Image Rotation (Retired)", 'Retired', 'ImageRotationRetired'), 0x00700041: ('CS', '1', "Image Horizontal Flip", '', 'ImageHorizontalFlip'), 0x00700042: ('US', '1', "Image Rotation", '', 'ImageRotation'), 0x00700050: ('US', '2', "Displayed Area Top Left Hand Corner (Trial)", 'Retired', 'DisplayedAreaTopLeftHandCornerTrial'), 0x00700051: ('US', '2', "Displayed Area Bottom Right Hand Corner (Trial)", 'Retired', 'DisplayedAreaBottomRightHandCornerTrial'), 0x00700052: ('SL', '2', "Displayed Area Top Left Hand Corner", '', 'DisplayedAreaTopLeftHandCorner'), 0x00700053: ('SL', '2', "Displayed Area Bottom Right Hand Corner", '', 'DisplayedAreaBottomRightHandCorner'), 0x0070005A: ('SQ', '1', "Displayed Area Selection Sequence", '', 'DisplayedAreaSelectionSequence'), 0x00700060: ('SQ', '1', "Graphic Layer Sequence", '', 'GraphicLayerSequence'), 0x00700062: ('IS', '1', "Graphic Layer Order", '', 'GraphicLayerOrder'), 0x00700066: ('US', '1', "Graphic Layer Recommended Display Grayscale Value", '', 'GraphicLayerRecommendedDisplayGrayscaleValue'), 0x00700067: ('US', '3', "Graphic Layer Recommended Display RGB Value", 'Retired', 'GraphicLayerRecommendedDisplayRGBValue'), 0x00700068: ('LO', '1', "Graphic Layer Description", '', 'GraphicLayerDescription'), 0x00700080: ('CS', '1', "Content Label", '', 'ContentLabel'), 0x00700081: ('LO', '1', "Content Description", '', 'ContentDescription'), 0x00700082: ('DA', '1', "Presentation Creation Date", '', 'PresentationCreationDate'), 0x00700083: ('TM', '1', "Presentation Creation Time", '', 'PresentationCreationTime'), 0x00700084: ('PN', '1', "Content Creator's Name", '', 'ContentCreatorName'), 0x00700086: ('SQ', '1', "Content Creator's Identification Code Sequence", '', 'ContentCreatorIdentificationCodeSequence'), 0x00700087: ('SQ', '1', "Alternate Content Description Sequence", '', 'AlternateContentDescriptionSequence'), 0x00700100: ('CS', '1', "Presentation Size Mode", '', 'PresentationSizeMode'), 0x00700101: ('DS', '2', "Presentation Pixel Spacing", '', 'PresentationPixelSpacing'), 0x00700102: ('IS', '2', "Presentation Pixel Aspect Ratio", '', 'PresentationPixelAspectRatio'), 0x00700103: ('FL', '1', "Presentation Pixel Magnification Ratio", '', 'PresentationPixelMagnificationRatio'), 0x00700207: ('LO', '1', "Graphic Group Label", '', 'GraphicGroupLabel'), 0x00700208: ('ST', '1', "Graphic Group Description", '', 'GraphicGroupDescription'), 0x00700209: ('SQ', '1', "Compound Graphic Sequence", '', 'CompoundGraphicSequence'), 0x00700226: ('UL', '1', "Compound Graphic Instance ID", '', 'CompoundGraphicInstanceID'), 0x00700227: ('LO', '1', "Font Name", '', 'FontName'), 0x00700228: ('CS', '1', "Font Name Type", '', 'FontNameType'), 0x00700229: ('LO', '1', "CSS Font Name", '', 'CSSFontName'), 0x00700230: ('FD', '1', "Rotation Angle", '', 'RotationAngle'), 0x00700231: ('SQ', '1', "Text Style Sequence", '', 'TextStyleSequence'), 0x00700232: ('SQ', '1', "Line Style Sequence", '', 'LineStyleSequence'), 0x00700233: ('SQ', '1', "Fill Style Sequence", '', 'FillStyleSequence'), 0x00700234: ('SQ', '1', "Graphic Group Sequence", '', 'GraphicGroupSequence'), 0x00700241: ('US', '3', "Text Color CIELab Value", '', 'TextColorCIELabValue'), 0x00700242: ('CS', '1', "Horizontal Alignment", '', 'HorizontalAlignment'), 0x00700243: ('CS', '1', "Vertical Alignment", '', 'VerticalAlignment'), 0x00700244: ('CS', '1', "Shadow Style", '', 'ShadowStyle'), 0x00700245: ('FL', '1', "Shadow Offset X", '', 'ShadowOffsetX'), 0x00700246: ('FL', '1', "Shadow Offset Y", '', 'ShadowOffsetY'), 0x00700247: ('US', '3', "Shadow Color CIELab Value", '', 'ShadowColorCIELabValue'), 0x00700248: ('CS', '1', "Underlined", '', 'Underlined'), 0x00700249: ('CS', '1', "Bold", '', 'Bold'), 0x00700250: ('CS', '1', "Italic", '', 'Italic'), 0x00700251: ('US', '3', "Pattern On Color CIELab Value", '', 'PatternOnColorCIELabValue'), 0x00700252: ('US', '3', "Pattern Off Color CIELab Value", '', 'PatternOffColorCIELabValue'), 0x00700253: ('FL', '1', "Line Thickness", '', 'LineThickness'), 0x00700254: ('CS', '1', "Line Dashing Style", '', 'LineDashingStyle'), 0x00700255: ('UL', '1', "Line Pattern", '', 'LinePattern'), 0x00700256: ('OB', '1', "Fill Pattern", '', 'FillPattern'), 0x00700257: ('CS', '1', "Fill Mode", '', 'FillMode'), 0x00700258: ('FL', '1', "Shadow Opacity", '', 'ShadowOpacity'), 0x00700261: ('FL', '1', "Gap Length", '', 'GapLength'), 0x00700262: ('FL', '1', "Diameter of Visibility", '', 'DiameterOfVisibility'), 0x00700273: ('FL', '2', "Rotation Point", '', 'RotationPoint'), 0x00700274: ('CS', '1', "Tick Alignment", '', 'TickAlignment'), 0x00700278: ('CS', '1', "Show Tick Label", '', 'ShowTickLabel'), 0x00700279: ('CS', '1', "Tick Label Alignment", '', 'TickLabelAlignment'), 0x00700282: ('CS', '1', "Compound Graphic Units", '', 'CompoundGraphicUnits'), 0x00700284: ('FL', '1', "Pattern On Opacity", '', 'PatternOnOpacity'), 0x00700285: ('FL', '1', "Pattern Off Opacity", '', 'PatternOffOpacity'), 0x00700287: ('SQ', '1', "Major Ticks Sequence", '', 'MajorTicksSequence'), 0x00700288: ('FL', '1', "Tick Position", '', 'TickPosition'), 0x00700289: ('SH', '1', "Tick Label", '', 'TickLabel'), 0x00700294: ('CS', '1', "Compound Graphic Type", '', 'CompoundGraphicType'), 0x00700295: ('UL', '1', "Graphic Group ID", '', 'GraphicGroupID'), 0x00700306: ('CS', '1', "Shape Type", '', 'ShapeType'), 0x00700308: ('SQ', '1', "Registration Sequence", '', 'RegistrationSequence'), 0x00700309: ('SQ', '1', "Matrix Registration Sequence", '', 'MatrixRegistrationSequence'), 0x0070030A: ('SQ', '1', "Matrix Sequence", '', 'MatrixSequence'), 0x0070030B: ('FD', '16', "Frame of Reference to Displayed Coordinate System Transformation Matrix", '', 'FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix'), 0x0070030C: ('CS', '1', "Frame of Reference Transformation Matrix Type", '', 'FrameOfReferenceTransformationMatrixType'), 0x0070030D: ('SQ', '1', "Registration Type Code Sequence", '', 'RegistrationTypeCodeSequence'), 0x0070030F: ('ST', '1', "Fiducial Description", '', 'FiducialDescription'), 0x00700310: ('SH', '1', "Fiducial Identifier", '', 'FiducialIdentifier'), 0x00700311: ('SQ', '1', "Fiducial Identifier Code Sequence", '', 'FiducialIdentifierCodeSequence'), 0x00700312: ('FD', '1', "Contour Uncertainty Radius", '', 'ContourUncertaintyRadius'), 0x00700314: ('SQ', '1', "Used Fiducials Sequence", '', 'UsedFiducialsSequence'), 0x00700315: ('SQ', '1', "Used RT Structure Set ROI Sequence", '', 'UsedRTStructureSetROISequence'), 0x00700318: ('SQ', '1', "Graphic Coordinates Data Sequence", '', 'GraphicCoordinatesDataSequence'), 0x0070031A: ('UI', '1', "Fiducial UID", '', 'FiducialUID'), 0x0070031B: ('UI', '1', "Referenced Fiducial UID", '', 'ReferencedFiducialUID'), 0x0070031C: ('SQ', '1', "Fiducial Set Sequence", '', 'FiducialSetSequence'), 0x0070031E: ('SQ', '1', "Fiducial Sequence", '', 'FiducialSequence'), 0x0070031F: ('SQ', '1', "Fiducials Property Category Code Sequence", '', 'FiducialsPropertyCategoryCodeSequence'), 0x00700401: ('US', '3', "Graphic Layer Recommended Display CIELab Value", '', 'GraphicLayerRecommendedDisplayCIELabValue'), 0x00700402: ('SQ', '1', "Blending Sequence", '', 'BlendingSequence'), 0x00700403: ('FL', '1', "Relative Opacity", '', 'RelativeOpacity'), 0x00700404: ('SQ', '1', "Referenced Spatial Registration Sequence", '', 'ReferencedSpatialRegistrationSequence'), 0x00700405: ('CS', '1', "Blending Position", '', 'BlendingPosition'), 0x00701101: ('UI', '1', "Presentation Display Collection UID", '', 'PresentationDisplayCollectionUID'), 0x00701102: ('UI', '1', "Presentation Sequence Collection UID", '', 'PresentationSequenceCollectionUID'), 0x00701103: ('US', '1', "Presentation Sequence Position Index", '', 'PresentationSequencePositionIndex'), 0x00701104: ('SQ', '1', "Rendered Image Reference Sequence", '', 'RenderedImageReferenceSequence'), 0x00701201: ('SQ', '1', "Volumetric Presentation State Input Sequence", '', 'VolumetricPresentationStateInputSequence'), 0x00701202: ('CS', '1', "Presentation Input Type", '', 'PresentationInputType'), 0x00701203: ('US', '1', "Input Sequence Position Index", '', 'InputSequencePositionIndex'), 0x00701204: ('CS', '1', "Crop", '', 'Crop'), 0x00701205: ('US', '1-n', "Cropping Specification Index", '', 'CroppingSpecificationIndex'), 0x00701206: ('CS', '1', "Compositing Method", 'Retired', 'CompositingMethod'), 0x00701207: ('US', '1', "Volumetric Presentation Input Number", '', 'VolumetricPresentationInputNumber'), 0x00701208: ('CS', '1', "Image Volume Geometry", '', 'ImageVolumeGeometry'), 0x00701209: ('UI', '1', "Volumetric Presentation Input Set UID", '', 'VolumetricPresentationInputSetUID'), 0x0070120A: ('SQ', '1', "Volumetric Presentation Input Set Sequence", '', 'VolumetricPresentationInputSetSequence'), 0x0070120B: ('CS', '1', "Global Crop", '', 'GlobalCrop'), 0x0070120C: ('US', '1-n', "Global Cropping Specification Index", '', 'GlobalCroppingSpecificationIndex'), 0x0070120D: ('CS', '1', "Rendering Method", '', 'RenderingMethod'), 0x00701301: ('SQ', '1', "Volume Cropping Sequence", '', 'VolumeCroppingSequence'), 0x00701302: ('CS', '1', "Volume Cropping Method", '', 'VolumeCroppingMethod'), 0x00701303: ('FD', '6', "Bounding Box Crop", '', 'BoundingBoxCrop'), 0x00701304: ('SQ', '1', "Oblique Cropping Plane Sequence", '', 'ObliqueCroppingPlaneSequence'), 0x00701305: ('FD', '4', "Plane", '', 'Plane'), 0x00701306: ('FD', '3', "Plane Normal", '', 'PlaneNormal'), 0x00701309: ('US', '1', "Cropping Specification Number", '', 'CroppingSpecificationNumber'), 0x00701501: ('CS', '1', "Multi-Planar Reconstruction Style", '', 'MultiPlanarReconstructionStyle'), 0x00701502: ('CS', '1', "MPR Thickness Type", '', 'MPRThicknessType'), 0x00701503: ('FD', '1', "MPR Slab Thickness", '', 'MPRSlabThickness'), 0x00701505: ('FD', '3', "MPR Top Left Hand Corner", '', 'MPRTopLeftHandCorner'), 0x00701507: ('FD', '3', "MPR View Width Direction", '', 'MPRViewWidthDirection'), 0x00701508: ('FD', '1', "MPR View Width", '', 'MPRViewWidth'), 0x0070150C: ('UL', '1', "Number of Volumetric Curve Points", '', 'NumberOfVolumetricCurvePoints'), 0x0070150D: ('OD', '1', "Volumetric Curve Points", '', 'VolumetricCurvePoints'), 0x00701511: ('FD', '3', "MPR View Height Direction", '', 'MPRViewHeightDirection'), 0x00701512: ('FD', '1', "MPR View Height", '', 'MPRViewHeight'), 0x00701602: ('CS', '1', "Render Projection", '', 'RenderProjection'), 0x00701603: ('FD', '3', "Viewpoint Position", '', 'ViewpointPosition'), 0x00701604: ('FD', '3', "Viewpoint LookAt Point", '', 'ViewpointLookAtPoint'), 0x00701605: ('FD', '3', "Viewpoint Up Direction", '', 'ViewpointUpDirection'), 0x00701606: ('FD', '6', "Render Field of View", '', 'RenderFieldOfView'), 0x00701607: ('FD', '1', "Sampling Step Size", '', 'SamplingStepSize'), 0x00701701: ('CS', '1', "Shading Style", '', 'ShadingStyle'), 0x00701702: ('FD', '1', "Ambient Reflection Intensity", '', 'AmbientReflectionIntensity'), 0x00701703: ('FD', '3', "Light Direction", '', 'LightDirection'), 0x00701704: ('FD', '1', "Diffuse Reflection Intensity", '', 'DiffuseReflectionIntensity'), 0x00701705: ('FD', '1', "Specular Reflection Intensity", '', 'SpecularReflectionIntensity'), 0x00701706: ('FD', '1', "Shininess", '', 'Shininess'), 0x00701801: ('SQ', '1', "Presentation State Classification Component Sequence", '', 'PresentationStateClassificationComponentSequence'), 0x00701802: ('CS', '1', "Component Type", '', 'ComponentType'), 0x00701803: ('SQ', '1', "Component Input Sequence", '', 'ComponentInputSequence'), 0x00701804: ('US', '1', "Volumetric Presentation Input Index", '', 'VolumetricPresentationInputIndex'), 0x00701805: ('SQ', '1', "Presentation State Compositor Component Sequence", '', 'PresentationStateCompositorComponentSequence'), 0x00701806: ('SQ', '1', "Weighting Transfer Function Sequence", '', 'WeightingTransferFunctionSequence'), 0x00701807: ('US', '3', "Weighting Lookup Table Descriptor", 'Retired', 'WeightingLookupTableDescriptor'), 0x00701808: ('OB', '1', "Weighting Lookup Table Data", 'Retired', 'WeightingLookupTableData'), 0x00701901: ('SQ', '1', "Volumetric Annotation Sequence", '', 'VolumetricAnnotationSequence'), 0x00701903: ('SQ', '1', "Referenced Structured Context Sequence", '', 'ReferencedStructuredContextSequence'), 0x00701904: ('UI', '1', "Referenced Content Item", '', 'ReferencedContentItem'), 0x00701905: ('SQ', '1', "Volumetric Presentation Input Annotation Sequence", '', 'VolumetricPresentationInputAnnotationSequence'), 0x00701907: ('CS', '1', "Annotation Clipping", '', 'AnnotationClipping'), 0x00701A01: ('CS', '1', "Presentation Animation Style", '', 'PresentationAnimationStyle'), 0x00701A03: ('FD', '1', "Recommended Animation Rate", '', 'RecommendedAnimationRate'), 0x00701A04: ('SQ', '1', "Animation Curve Sequence", '', 'AnimationCurveSequence'), 0x00701A05: ('FD', '1', "Animation Step Size", '', 'AnimationStepSize'), 0x00701A06: ('FD', '1', "Swivel Range", '', 'SwivelRange'), 0x00701A07: ('OD', '1', "Volumetric Curve Up Directions", '', 'VolumetricCurveUpDirections'), 0x00701A08: ('SQ', '1', "Volume Stream Sequence", '', 'VolumeStreamSequence'), 0x00701A09: ('LO', '1', "RGBA Transfer Function Description", '', 'RGBATransferFunctionDescription'), 0x00701B01: ('SQ', '1', "Advanced Blending Sequence", '', 'AdvancedBlendingSequence'), 0x00701B02: ('US', '1', "Blending Input Number", '', 'BlendingInputNumber'), 0x00701B03: ('SQ', '1', "Blending Display Input Sequence", '', 'BlendingDisplayInputSequence'), 0x00701B04: ('SQ', '1', "Blending Display Sequence", '', 'BlendingDisplaySequence'), 0x00701B06: ('CS', '1', "Blending Mode", '', 'BlendingMode'), 0x00701B07: ('CS', '1', "Time Series Blending", '', 'TimeSeriesBlending'), 0x00701B08: ('CS', '1', "Geometry for Display", '', 'GeometryForDisplay'), 0x00701B11: ('SQ', '1', "Threshold Sequence", '', 'ThresholdSequence'), 0x00701B12: ('SQ', '1', "Threshold Value Sequence", '', 'ThresholdValueSequence'), 0x00701B13: ('CS', '1', "Threshold Type", '', 'ThresholdType'), 0x00701B14: ('FD', '1', "Threshold Value", '', 'ThresholdValue'), 0x00720002: ('SH', '1', "Hanging Protocol Name", '', 'HangingProtocolName'), 0x00720004: ('LO', '1', "Hanging Protocol Description", '', 'HangingProtocolDescription'), 0x00720006: ('CS', '1', "Hanging Protocol Level", '', 'HangingProtocolLevel'), 0x00720008: ('LO', '1', "Hanging Protocol Creator", '', 'HangingProtocolCreator'), 0x0072000A: ('DT', '1', "Hanging Protocol Creation DateTime", '', 'HangingProtocolCreationDateTime'), 0x0072000C: ('SQ', '1', "Hanging Protocol Definition Sequence", '', 'HangingProtocolDefinitionSequence'), 0x0072000E: ('SQ', '1', "Hanging Protocol User Identification Code Sequence", '', 'HangingProtocolUserIdentificationCodeSequence'), 0x00720010: ('LO', '1', "Hanging Protocol User Group Name", '', 'HangingProtocolUserGroupName'), 0x00720012: ('SQ', '1', "Source Hanging Protocol Sequence", '', 'SourceHangingProtocolSequence'), 0x00720014: ('US', '1', "Number of Priors Referenced", '', 'NumberOfPriorsReferenced'), 0x00720020: ('SQ', '1', "Image Sets Sequence", '', 'ImageSetsSequence'), 0x00720022: ('SQ', '1', "Image Set Selector Sequence", '', 'ImageSetSelectorSequence'), 0x00720024: ('CS', '1', "Image Set Selector Usage Flag", '', 'ImageSetSelectorUsageFlag'), 0x00720026: ('AT', '1', "Selector Attribute", '', 'SelectorAttribute'), 0x00720028: ('US', '1', "Selector Value Number", '', 'SelectorValueNumber'), 0x00720030: ('SQ', '1', "Time Based Image Sets Sequence", '', 'TimeBasedImageSetsSequence'), 0x00720032: ('US', '1', "Image Set Number", '', 'ImageSetNumber'), 0x00720034: ('CS', '1', "Image Set Selector Category", '', 'ImageSetSelectorCategory'), 0x00720038: ('US', '2', "Relative Time", '', 'RelativeTime'), 0x0072003A: ('CS', '1', "Relative Time Units", '', 'RelativeTimeUnits'), 0x0072003C: ('SS', '2', "Abstract Prior Value", '', 'AbstractPriorValue'), 0x0072003E: ('SQ', '1', "Abstract Prior Code Sequence", '', 'AbstractPriorCodeSequence'), 0x00720040: ('LO', '1', "Image Set Label", '', 'ImageSetLabel'), 0x00720050: ('CS', '1', "Selector Attribute VR", '', 'SelectorAttributeVR'), 0x00720052: ('AT', '1-n', "Selector Sequence Pointer", '', 'SelectorSequencePointer'), 0x00720054: ('LO', '1-n', "Selector Sequence Pointer Private Creator", '', 'SelectorSequencePointerPrivateCreator'), 0x00720056: ('LO', '1', "Selector Attribute Private Creator", '', 'SelectorAttributePrivateCreator'), 0x0072005E: ('AE', '1-n', "Selector AE Value", '', 'SelectorAEValue'), 0x0072005F: ('AS', '1-n', "Selector AS Value", '', 'SelectorASValue'), 0x00720060: ('AT', '1-n', "Selector AT Value", '', 'SelectorATValue'), 0x00720061: ('DA', '1-n', "Selector DA Value", '', 'SelectorDAValue'), 0x00720062: ('CS', '1-n', "Selector CS Value", '', 'SelectorCSValue'), 0x00720063: ('DT', '1-n', "Selector DT Value", '', 'SelectorDTValue'), 0x00720064: ('IS', '1-n', "Selector IS Value", '', 'SelectorISValue'), 0x00720065: ('OB', '1', "Selector OB Value", '', 'SelectorOBValue'), 0x00720066: ('LO', '1-n', "Selector LO Value", '', 'SelectorLOValue'), 0x00720067: ('OF', '1', "Selector OF Value", '', 'SelectorOFValue'), 0x00720068: ('LT', '1', "Selector LT Value", '', 'SelectorLTValue'), 0x00720069: ('OW', '1', "Selector OW Value", '', 'SelectorOWValue'), 0x0072006A: ('PN', '1-n', "Selector PN Value", '', 'SelectorPNValue'), 0x0072006B: ('TM', '1-n', "Selector TM Value", '', 'SelectorTMValue'), 0x0072006C: ('SH', '1-n', "Selector SH Value", '', 'SelectorSHValue'), 0x0072006D: ('UN', '1', "Selector UN Value", '', 'SelectorUNValue'), 0x0072006E: ('ST', '1', "Selector ST Value", '', 'SelectorSTValue'), 0x0072006F: ('UC', '1-n', "Selector UC Value", '', 'SelectorUCValue'), 0x00720070: ('UT', '1', "Selector UT Value", '', 'SelectorUTValue'), 0x00720071: ('UR', '1', "Selector UR Value", '', 'SelectorURValue'), 0x00720072: ('DS', '1-n', "Selector DS Value", '', 'SelectorDSValue'), 0x00720073: ('OD', '1', "Selector OD Value", '', 'SelectorODValue'), 0x00720074: ('FD', '1-n', "Selector FD Value", '', 'SelectorFDValue'), 0x00720075: ('OL', '1', "Selector OL Value", '', 'SelectorOLValue'), 0x00720076: ('FL', '1-n', "Selector FL Value", '', 'SelectorFLValue'), 0x00720078: ('UL', '1-n', "Selector UL Value", '', 'SelectorULValue'), 0x0072007A: ('US', '1-n', "Selector US Value", '', 'SelectorUSValue'), 0x0072007C: ('SL', '1-n', "Selector SL Value", '', 'SelectorSLValue'), 0x0072007E: ('SS', '1-n', "Selector SS Value", '', 'SelectorSSValue'), 0x0072007F: ('UI', '1-n', "Selector UI Value", '', 'SelectorUIValue'), 0x00720080: ('SQ', '1', "Selector Code Sequence Value", '', 'SelectorCodeSequenceValue'), 0x00720081: ('OV', '1', "Selector OV Value", '', 'SelectorOVValue'), 0x00720082: ('SV', '1-n', "Selector SV Value", '', 'SelectorSVValue'), 0x00720083: ('UV', '1-n', "Selector UV Value", '', 'SelectorUVValue'), 0x00720100: ('US', '1', "Number of Screens", '', 'NumberOfScreens'), 0x00720102: ('SQ', '1', "Nominal Screen Definition Sequence", '', 'NominalScreenDefinitionSequence'), 0x00720104: ('US', '1', "Number of Vertical Pixels", '', 'NumberOfVerticalPixels'), 0x00720106: ('US', '1', "Number of Horizontal Pixels", '', 'NumberOfHorizontalPixels'), 0x00720108: ('FD', '4', "Display Environment Spatial Position", '', 'DisplayEnvironmentSpatialPosition'), 0x0072010A: ('US', '1', "Screen Minimum Grayscale Bit Depth", '', 'ScreenMinimumGrayscaleBitDepth'), 0x0072010C: ('US', '1', "Screen Minimum Color Bit Depth", '', 'ScreenMinimumColorBitDepth'), 0x0072010E: ('US', '1', "Application Maximum Repaint Time", '', 'ApplicationMaximumRepaintTime'), 0x00720200: ('SQ', '1', "Display Sets Sequence", '', 'DisplaySetsSequence'), 0x00720202: ('US', '1', "Display Set Number", '', 'DisplaySetNumber'), 0x00720203: ('LO', '1', "Display Set Label", '', 'DisplaySetLabel'), 0x00720204: ('US', '1', "Display Set Presentation Group", '', 'DisplaySetPresentationGroup'), 0x00720206: ('LO', '1', "Display Set Presentation Group Description", '', 'DisplaySetPresentationGroupDescription'), 0x00720208: ('CS', '1', "Partial Data Display Handling", '', 'PartialDataDisplayHandling'), 0x00720210: ('SQ', '1', "Synchronized Scrolling Sequence", '', 'SynchronizedScrollingSequence'), 0x00720212: ('US', '2-n', "Display Set Scrolling Group", '', 'DisplaySetScrollingGroup'), 0x00720214: ('SQ', '1', "Navigation Indicator Sequence", '', 'NavigationIndicatorSequence'), 0x00720216: ('US', '1', "Navigation Display Set", '', 'NavigationDisplaySet'), 0x00720218: ('US', '1-n', "Reference Display Sets", '', 'ReferenceDisplaySets'), 0x00720300: ('SQ', '1', "Image Boxes Sequence", '', 'ImageBoxesSequence'), 0x00720302: ('US', '1', "Image Box Number", '', 'ImageBoxNumber'), 0x00720304: ('CS', '1', "Image Box Layout Type", '', 'ImageBoxLayoutType'), 0x00720306: ('US', '1', "Image Box Tile Horizontal Dimension", '', 'ImageBoxTileHorizontalDimension'), 0x00720308: ('US', '1', "Image Box Tile Vertical Dimension", '', 'ImageBoxTileVerticalDimension'), 0x00720310: ('CS', '1', "Image Box Scroll Direction", '', 'ImageBoxScrollDirection'), 0x00720312: ('CS', '1', "Image Box Small Scroll Type", '', 'ImageBoxSmallScrollType'), 0x00720314: ('US', '1', "Image Box Small Scroll Amount", '', 'ImageBoxSmallScrollAmount'), 0x00720316: ('CS', '1', "Image Box Large Scroll Type", '', 'ImageBoxLargeScrollType'), 0x00720318: ('US', '1', "Image Box Large Scroll Amount", '', 'ImageBoxLargeScrollAmount'), 0x00720320: ('US', '1', "Image Box Overlap Priority", '', 'ImageBoxOverlapPriority'), 0x00720330: ('FD', '1', "Cine Relative to Real-Time", '', 'CineRelativeToRealTime'), 0x00720400: ('SQ', '1', "Filter Operations Sequence", '', 'FilterOperationsSequence'), 0x00720402: ('CS', '1', "Filter-by Category", '', 'FilterByCategory'), 0x00720404: ('CS', '1', "Filter-by Attribute Presence", '', 'FilterByAttributePresence'), 0x00720406: ('CS', '1', "Filter-by Operator", '', 'FilterByOperator'), 0x00720420: ('US', '3', "Structured Display Background CIELab Value", '', 'StructuredDisplayBackgroundCIELabValue'), 0x00720421: ('US', '3', "Empty Image Box CIELab Value", '', 'EmptyImageBoxCIELabValue'), 0x00720422: ('SQ', '1', "Structured Display Image Box Sequence", '', 'StructuredDisplayImageBoxSequence'), 0x00720424: ('SQ', '1', "Structured Display Text Box Sequence", '', 'StructuredDisplayTextBoxSequence'), 0x00720427: ('SQ', '1', "Referenced First Frame Sequence", '', 'ReferencedFirstFrameSequence'), 0x00720430: ('SQ', '1', "Image Box Synchronization Sequence", '', 'ImageBoxSynchronizationSequence'), 0x00720432: ('US', '2-n', "Synchronized Image Box List", '', 'SynchronizedImageBoxList'), 0x00720434: ('CS', '1', "Type of Synchronization", '', 'TypeOfSynchronization'), 0x00720500: ('CS', '1', "Blending Operation Type", '', 'BlendingOperationType'), 0x00720510: ('CS', '1', "Reformatting Operation Type", '', 'ReformattingOperationType'), 0x00720512: ('FD', '1', "Reformatting Thickness", '', 'ReformattingThickness'), 0x00720514: ('FD', '1', "Reformatting Interval", '', 'ReformattingInterval'), 0x00720516: ('CS', '1', "Reformatting Operation Initial View Direction", '', 'ReformattingOperationInitialViewDirection'), 0x00720520: ('CS', '1-n', "3D Rendering Type", '', 'ThreeDRenderingType'), 0x00720600: ('SQ', '1', "Sorting Operations Sequence", '', 'SortingOperationsSequence'), 0x00720602: ('CS', '1', "Sort-by Category", '', 'SortByCategory'), 0x00720604: ('CS', '1', "Sorting Direction", '', 'SortingDirection'), 0x00720700: ('CS', '2', "Display Set Patient Orientation", '', 'DisplaySetPatientOrientation'), 0x00720702: ('CS', '1', "VOI Type", '', 'VOIType'), 0x00720704: ('CS', '1', "Pseudo-Color Type", '', 'PseudoColorType'), 0x00720705: ('SQ', '1', "Pseudo-Color Palette Instance Reference Sequence", '', 'PseudoColorPaletteInstanceReferenceSequence'), 0x00720706: ('CS', '1', "Show Grayscale Inverted", '', 'ShowGrayscaleInverted'), 0x00720710: ('CS', '1', "Show Image True Size Flag", '', 'ShowImageTrueSizeFlag'), 0x00720712: ('CS', '1', "Show Graphic Annotation Flag", '', 'ShowGraphicAnnotationFlag'), 0x00720714: ('CS', '1', "Show Patient Demographics Flag", '', 'ShowPatientDemographicsFlag'), 0x00720716: ('CS', '1', "Show Acquisition Techniques Flag", '', 'ShowAcquisitionTechniquesFlag'), 0x00720717: ('CS', '1', "Display Set Horizontal Justification", '', 'DisplaySetHorizontalJustification'), 0x00720718: ('CS', '1', "Display Set Vertical Justification", '', 'DisplaySetVerticalJustification'), 0x00740120: ('FD', '1', "Continuation Start Meterset", '', 'ContinuationStartMeterset'), 0x00740121: ('FD', '1', "Continuation End Meterset", '', 'ContinuationEndMeterset'), 0x00741000: ('CS', '1', "Procedure Step State", '', 'ProcedureStepState'), 0x00741002: ('SQ', '1', "Procedure Step Progress Information Sequence", '', 'ProcedureStepProgressInformationSequence'), 0x00741004: ('DS', '1', "Procedure Step Progress", '', 'ProcedureStepProgress'), 0x00741006: ('ST', '1', "Procedure Step Progress Description", '', 'ProcedureStepProgressDescription'), 0x00741007: ('SQ', '1', "Procedure Step Progress Parameters Sequence", '', 'ProcedureStepProgressParametersSequence'), 0x00741008: ('SQ', '1', "Procedure Step Communications URI Sequence", '', 'ProcedureStepCommunicationsURISequence'), 0x0074100A: ('UR', '1', "Contact URI", '', 'ContactURI'), 0x0074100C: ('LO', '1', "Contact Display Name", '', 'ContactDisplayName'), 0x0074100E: ('SQ', '1', "Procedure Step Discontinuation Reason Code Sequence", '', 'ProcedureStepDiscontinuationReasonCodeSequence'), 0x00741020: ('SQ', '1', "Beam Task Sequence", '', 'BeamTaskSequence'), 0x00741022: ('CS', '1', "Beam Task Type", '', 'BeamTaskType'), 0x00741024: ('IS', '1', "Beam Order Index (Trial)", 'Retired', 'BeamOrderIndexTrial'), 0x00741025: ('CS', '1', "Autosequence Flag", '', 'AutosequenceFlag'), 0x00741026: ('FD', '1', "Table Top Vertical Adjusted Position", '', 'TableTopVerticalAdjustedPosition'), 0x00741027: ('FD', '1', "Table Top Longitudinal Adjusted Position", '', 'TableTopLongitudinalAdjustedPosition'), 0x00741028: ('FD', '1', "Table Top Lateral Adjusted Position", '', 'TableTopLateralAdjustedPosition'), 0x0074102A: ('FD', '1', "Patient Support Adjusted Angle", '', 'PatientSupportAdjustedAngle'), 0x0074102B: ('FD', '1', "Table Top Eccentric Adjusted Angle", '', 'TableTopEccentricAdjustedAngle'), 0x0074102C: ('FD', '1', "Table Top Pitch Adjusted Angle", '', 'TableTopPitchAdjustedAngle'), 0x0074102D: ('FD', '1', "Table Top Roll Adjusted Angle", '', 'TableTopRollAdjustedAngle'), 0x00741030: ('SQ', '1', "Delivery Verification Image Sequence", '', 'DeliveryVerificationImageSequence'), 0x00741032: ('CS', '1', "Verification Image Timing", '', 'VerificationImageTiming'), 0x00741034: ('CS', '1', "Double Exposure Flag", '', 'DoubleExposureFlag'), 0x00741036: ('CS', '1', "Double Exposure Ordering", '', 'DoubleExposureOrdering'), 0x00741038: ('DS', '1', "Double Exposure Meterset (Trial)", 'Retired', 'DoubleExposureMetersetTrial'), 0x0074103A: ('DS', '4', "Double Exposure Field Delta (Trial)", 'Retired', 'DoubleExposureFieldDeltaTrial'), 0x00741040: ('SQ', '1', "Related Reference RT Image Sequence", '', 'RelatedReferenceRTImageSequence'), 0x00741042: ('SQ', '1', "General Machine Verification Sequence", '', 'GeneralMachineVerificationSequence'), 0x00741044: ('SQ', '1', "Conventional Machine Verification Sequence", '', 'ConventionalMachineVerificationSequence'), 0x00741046: ('SQ', '1', "Ion Machine Verification Sequence", '', 'IonMachineVerificationSequence'), 0x00741048: ('SQ', '1', "Failed Attributes Sequence", '', 'FailedAttributesSequence'), 0x0074104A: ('SQ', '1', "Overridden Attributes Sequence", '', 'OverriddenAttributesSequence'), 0x0074104C: ('SQ', '1', "Conventional Control Point Verification Sequence", '', 'ConventionalControlPointVerificationSequence'), 0x0074104E: ('SQ', '1', "Ion Control Point Verification Sequence", '', 'IonControlPointVerificationSequence'), 0x00741050: ('SQ', '1', "Attribute Occurrence Sequence", '', 'AttributeOccurrenceSequence'), 0x00741052: ('AT', '1', "Attribute Occurrence Pointer", '', 'AttributeOccurrencePointer'), 0x00741054: ('UL', '1', "Attribute Item Selector", '', 'AttributeItemSelector'), 0x00741056: ('LO', '1', "Attribute Occurrence Private Creator", '', 'AttributeOccurrencePrivateCreator'), 0x00741057: ('IS', '1-n', "Selector Sequence Pointer Items", '', 'SelectorSequencePointerItems'), 0x00741200: ('CS', '1', "Scheduled Procedure Step Priority", '', 'ScheduledProcedureStepPriority'), 0x00741202: ('LO', '1', "Worklist Label", '', 'WorklistLabel'), 0x00741204: ('LO', '1', "Procedure Step Label", '', 'ProcedureStepLabel'), 0x00741210: ('SQ', '1', "Scheduled Processing Parameters Sequence", '', 'ScheduledProcessingParametersSequence'), 0x00741212: ('SQ', '1', "Performed Processing Parameters Sequence", '', 'PerformedProcessingParametersSequence'), 0x00741216: ('SQ', '1', "Unified Procedure Step Performed Procedure Sequence", '', 'UnifiedProcedureStepPerformedProcedureSequence'), 0x00741220: ('SQ', '1', "Related Procedure Step Sequence", 'Retired', 'RelatedProcedureStepSequence'), 0x00741222: ('LO', '1', "Procedure Step Relationship Type", 'Retired', 'ProcedureStepRelationshipType'), 0x00741224: ('SQ', '1', "Replaced Procedure Step Sequence", '', 'ReplacedProcedureStepSequence'), 0x00741230: ('LO', '1', "Deletion Lock", '', 'DeletionLock'), 0x00741234: ('AE', '1', "Receiving AE", '', 'ReceivingAE'), 0x00741236: ('AE', '1', "Requesting AE", '', 'RequestingAE'), 0x00741238: ('LT', '1', "Reason for Cancellation", '', 'ReasonForCancellation'), 0x00741242: ('CS', '1', "SCP Status", '', 'SCPStatus'), 0x00741244: ('CS', '1', "Subscription List Status", '', 'SubscriptionListStatus'), 0x00741246: ('CS', '1', "Unified Procedure Step List Status", '', 'UnifiedProcedureStepListStatus'), 0x00741324: ('UL', '1', "Beam Order Index", '', 'BeamOrderIndex'), 0x00741338: ('FD', '1', "Double Exposure Meterset", '', 'DoubleExposureMeterset'), 0x0074133A: ('FD', '4', "Double Exposure Field Delta", '', 'DoubleExposureFieldDelta'), 0x00741401: ('SQ', '1', "Brachy Task Sequence", '', 'BrachyTaskSequence'), 0x00741402: ('DS', '1', "Continuation Start Total Reference Air Kerma", '', 'ContinuationStartTotalReferenceAirKerma'), 0x00741403: ('DS', '1', "Continuation End Total Reference Air Kerma", '', 'ContinuationEndTotalReferenceAirKerma'), 0x00741404: ('IS', '1', "Continuation Pulse Number", '', 'ContinuationPulseNumber'), 0x00741405: ('SQ', '1', "Channel Delivery Order Sequence", '', 'ChannelDeliveryOrderSequence'), 0x00741406: ('IS', '1', "Referenced Channel Number", '', 'ReferencedChannelNumber'), 0x00741407: ('DS', '1', "Start Cumulative Time Weight", '', 'StartCumulativeTimeWeight'), 0x00741408: ('DS', '1', "End Cumulative Time Weight", '', 'EndCumulativeTimeWeight'), 0x00741409: ('SQ', '1', "Omitted Channel Sequence", '', 'OmittedChannelSequence'), 0x0074140A: ('CS', '1', "Reason for Channel Omission", '', 'ReasonForChannelOmission'), 0x0074140B: ('LO', '1', "Reason for Channel Omission Description", '', 'ReasonForChannelOmissionDescription'), 0x0074140C: ('IS', '1', "Channel Delivery Order Index", '', 'ChannelDeliveryOrderIndex'), 0x0074140D: ('SQ', '1', "Channel Delivery Continuation Sequence", '', 'ChannelDeliveryContinuationSequence'), 0x0074140E: ('SQ', '1', "Omitted Application Setup Sequence", '', 'OmittedApplicationSetupSequence'), 0x00760001: ('LO', '1', "Implant Assembly Template Name", '', 'ImplantAssemblyTemplateName'), 0x00760003: ('LO', '1', "Implant Assembly Template Issuer", '', 'ImplantAssemblyTemplateIssuer'), 0x00760006: ('LO', '1', "Implant Assembly Template Version", '', 'ImplantAssemblyTemplateVersion'), 0x00760008: ('SQ', '1', "Replaced Implant Assembly Template Sequence", '', 'ReplacedImplantAssemblyTemplateSequence'), 0x0076000A: ('CS', '1', "Implant Assembly Template Type", '', 'ImplantAssemblyTemplateType'), 0x0076000C: ('SQ', '1', "Original Implant Assembly Template Sequence", '', 'OriginalImplantAssemblyTemplateSequence'), 0x0076000E: ('SQ', '1', "Derivation Implant Assembly Template Sequence", '', 'DerivationImplantAssemblyTemplateSequence'), 0x00760010: ('SQ', '1', "Implant Assembly Template Target Anatomy Sequence", '', 'ImplantAssemblyTemplateTargetAnatomySequence'), 0x00760020: ('SQ', '1', "Procedure Type Code Sequence", '', 'ProcedureTypeCodeSequence'), 0x00760030: ('LO', '1', "Surgical Technique", '', 'SurgicalTechnique'), 0x00760032: ('SQ', '1', "Component Types Sequence", '', 'ComponentTypesSequence'), 0x00760034: ('SQ', '1', "Component Type Code Sequence", '', 'ComponentTypeCodeSequence'), 0x00760036: ('CS', '1', "Exclusive Component Type", '', 'ExclusiveComponentType'), 0x00760038: ('CS', '1', "Mandatory Component Type", '', 'MandatoryComponentType'), 0x00760040: ('SQ', '1', "Component Sequence", '', 'ComponentSequence'), 0x00760055: ('US', '1', "Component ID", '', 'ComponentID'), 0x00760060: ('SQ', '1', "Component Assembly Sequence", '', 'ComponentAssemblySequence'), 0x00760070: ('US', '1', "Component 1 Referenced ID", '', 'Component1ReferencedID'), 0x00760080: ('US', '1', "Component 1 Referenced Mating Feature Set ID", '', 'Component1ReferencedMatingFeatureSetID'), 0x00760090: ('US', '1', "Component 1 Referenced Mating Feature ID", '', 'Component1ReferencedMatingFeatureID'), 0x007600A0: ('US', '1', "Component 2 Referenced ID", '', 'Component2ReferencedID'), 0x007600B0: ('US', '1', "Component 2 Referenced Mating Feature Set ID", '', 'Component2ReferencedMatingFeatureSetID'), 0x007600C0: ('US', '1', "Component 2 Referenced Mating Feature ID", '', 'Component2ReferencedMatingFeatureID'), 0x00780001: ('LO', '1', "Implant Template Group Name", '', 'ImplantTemplateGroupName'), 0x00780010: ('ST', '1', "Implant Template Group Description", '', 'ImplantTemplateGroupDescription'), 0x00780020: ('LO', '1', "Implant Template Group Issuer", '', 'ImplantTemplateGroupIssuer'), 0x00780024: ('LO', '1', "Implant Template Group Version", '', 'ImplantTemplateGroupVersion'), 0x00780026: ('SQ', '1', "Replaced Implant Template Group Sequence", '', 'ReplacedImplantTemplateGroupSequence'), 0x00780028: ('SQ', '1', "Implant Template Group Target Anatomy Sequence", '', 'ImplantTemplateGroupTargetAnatomySequence'), 0x0078002A: ('SQ', '1', "Implant Template Group Members Sequence", '', 'ImplantTemplateGroupMembersSequence'), 0x0078002E: ('US', '1', "Implant Template Group Member ID", '', 'ImplantTemplateGroupMemberID'), 0x00780050: ('FD', '3', "3D Implant Template Group Member Matching Point", '', 'ThreeDImplantTemplateGroupMemberMatchingPoint'), 0x00780060: ('FD', '9', "3D Implant Template Group Member Matching Axes", '', 'ThreeDImplantTemplateGroupMemberMatchingAxes'), 0x00780070: ('SQ', '1', "Implant Template Group Member Matching 2D Coordinates Sequence", '', 'ImplantTemplateGroupMemberMatching2DCoordinatesSequence'), 0x00780090: ('FD', '2', "2D Implant Template Group Member Matching Point", '', 'TwoDImplantTemplateGroupMemberMatchingPoint'), 0x007800A0: ('FD', '4', "2D Implant Template Group Member Matching Axes", '', 'TwoDImplantTemplateGroupMemberMatchingAxes'), 0x007800B0: ('SQ', '1', "Implant Template Group Variation Dimension Sequence", '', 'ImplantTemplateGroupVariationDimensionSequence'), 0x007800B2: ('LO', '1', "Implant Template Group Variation Dimension Name", '', 'ImplantTemplateGroupVariationDimensionName'), 0x007800B4: ('SQ', '1', "Implant Template Group Variation Dimension Rank Sequence", '', 'ImplantTemplateGroupVariationDimensionRankSequence'), 0x007800B6: ('US', '1', "Referenced Implant Template Group Member ID", '', 'ReferencedImplantTemplateGroupMemberID'), 0x007800B8: ('US', '1', "Implant Template Group Variation Dimension Rank", '', 'ImplantTemplateGroupVariationDimensionRank'), 0x00800001: ('SQ', '1', "Surface Scan Acquisition Type Code Sequence", '', 'SurfaceScanAcquisitionTypeCodeSequence'), 0x00800002: ('SQ', '1', "Surface Scan Mode Code Sequence", '', 'SurfaceScanModeCodeSequence'), 0x00800003: ('SQ', '1', "Registration Method Code Sequence", '', 'RegistrationMethodCodeSequence'), 0x00800004: ('FD', '1', "Shot Duration Time", '', 'ShotDurationTime'), 0x00800005: ('FD', '1', "Shot Offset Time", '', 'ShotOffsetTime'), 0x00800006: ('US', '1-n', "Surface Point Presentation Value Data", '', 'SurfacePointPresentationValueData'), 0x00800007: ('US', '3-3n', "Surface Point Color CIELab Value Data", '', 'SurfacePointColorCIELabValueData'), 0x00800008: ('SQ', '1', "UV Mapping Sequence", '', 'UVMappingSequence'), 0x00800009: ('SH', '1', "Texture Label", '', 'TextureLabel'), 0x00800010: ('OF', '1', "U Value Data", '', 'UValueData'), 0x00800011: ('OF', '1', "V Value Data", '', 'VValueData'), 0x00800012: ('SQ', '1', "Referenced Texture Sequence", '', 'ReferencedTextureSequence'), 0x00800013: ('SQ', '1', "Referenced Surface Data Sequence", '', 'ReferencedSurfaceDataSequence'), 0x00820001: ('CS', '1', "Assessment Summary", '', 'AssessmentSummary'), 0x00820003: ('UT', '1', "Assessment Summary Description", '', 'AssessmentSummaryDescription'), 0x00820004: ('SQ', '1', "Assessed SOP Instance Sequence", '', 'AssessedSOPInstanceSequence'), 0x00820005: ('SQ', '1', "Referenced Comparison SOP Instance Sequence", '', 'ReferencedComparisonSOPInstanceSequence'), 0x00820006: ('UL', '1', "Number of Assessment Observations", '', 'NumberOfAssessmentObservations'), 0x00820007: ('SQ', '1', "Assessment Observations Sequence", '', 'AssessmentObservationsSequence'), 0x00820008: ('CS', '1', "Observation Significance", '', 'ObservationSignificance'), 0x0082000A: ('UT', '1', "Observation Description", '', 'ObservationDescription'), 0x0082000C: ('SQ', '1', "Structured Constraint Observation Sequence", '', 'StructuredConstraintObservationSequence'), 0x00820010: ('SQ', '1', "Assessed Attribute Value Sequence", '', 'AssessedAttributeValueSequence'), 0x00820016: ('LO', '1', "Assessment Set ID", '', 'AssessmentSetID'), 0x00820017: ('SQ', '1', "Assessment Requester Sequence", '', 'AssessmentRequesterSequence'), 0x00820018: ('LO', '1', "Selector Attribute Name", '', 'SelectorAttributeName'), 0x00820019: ('LO', '1', "Selector Attribute Keyword", '', 'SelectorAttributeKeyword'), 0x00820021: ('SQ', '1', "Assessment Type Code Sequence", '', 'AssessmentTypeCodeSequence'), 0x00820022: ('SQ', '1', "Observation Basis Code Sequence", '', 'ObservationBasisCodeSequence'), 0x00820023: ('LO', '1', "Assessment Label", '', 'AssessmentLabel'), 0x00820032: ('CS', '1', "Constraint Type", '', 'ConstraintType'), 0x00820033: ('UT', '1', "Specification Selection Guidance", '', 'SpecificationSelectionGuidance'), 0x00820034: ('SQ', '1', "Constraint Value Sequence", '', 'ConstraintValueSequence'), 0x00820035: ('SQ', '1', "Recommended Default Value Sequence", '', 'RecommendedDefaultValueSequence'), 0x00820036: ('CS', '1', "Constraint Violation Significance", '', 'ConstraintViolationSignificance'), 0x00820037: ('UT', '1', "Constraint Violation Condition", '', 'ConstraintViolationCondition'), 0x00820038: ('CS', '1', "Modifiable Constraint Flag", '', 'ModifiableConstraintFlag'), 0x00880130: ('SH', '1', "Storage Media File-set ID", '', 'StorageMediaFileSetID'), 0x00880140: ('UI', '1', "Storage Media File-set UID", '', 'StorageMediaFileSetUID'), 0x00880200: ('SQ', '1', "Icon Image Sequence", '', 'IconImageSequence'), 0x00880904: ('LO', '1', "Topic Title", 'Retired', 'TopicTitle'), 0x00880906: ('ST', '1', "Topic Subject", 'Retired', 'TopicSubject'), 0x00880910: ('LO', '1', "Topic Author", 'Retired', 'TopicAuthor'), 0x00880912: ('LO', '1-32', "Topic Keywords", 'Retired', 'TopicKeywords'), 0x01000410: ('CS', '1', "SOP Instance Status", '', 'SOPInstanceStatus'), 0x01000420: ('DT', '1', "SOP Authorization DateTime", '', 'SOPAuthorizationDateTime'), 0x01000424: ('LT', '1', "SOP Authorization Comment", '', 'SOPAuthorizationComment'), 0x01000426: ('LO', '1', "Authorization Equipment Certification Number", '', 'AuthorizationEquipmentCertificationNumber'), 0x04000005: ('US', '1', "MAC ID Number", '', 'MACIDNumber'), 0x04000010: ('UI', '1', "MAC Calculation Transfer Syntax UID", '', 'MACCalculationTransferSyntaxUID'), 0x04000015: ('CS', '1', "MAC Algorithm", '', 'MACAlgorithm'), 0x04000020: ('AT', '1-n', "Data Elements Signed", '', 'DataElementsSigned'), 0x04000100: ('UI', '1', "Digital Signature UID", '', 'DigitalSignatureUID'), 0x04000105: ('DT', '1', "Digital Signature DateTime", '', 'DigitalSignatureDateTime'), 0x04000110: ('CS', '1', "Certificate Type", '', 'CertificateType'), 0x04000115: ('OB', '1', "Certificate of Signer", '', 'CertificateOfSigner'), 0x04000120: ('OB', '1', "Signature", '', 'Signature'), 0x04000305: ('CS', '1', "Certified Timestamp Type", '', 'CertifiedTimestampType'), 0x04000310: ('OB', '1', "Certified Timestamp", '', 'CertifiedTimestamp'), 0x04000315: ('FL', '1', "", 'Retired', ''), 0x04000401: ('SQ', '1', "Digital Signature Purpose Code Sequence", '', 'DigitalSignaturePurposeCodeSequence'), 0x04000402: ('SQ', '1', "Referenced Digital Signature Sequence", '', 'ReferencedDigitalSignatureSequence'), 0x04000403: ('SQ', '1', "Referenced SOP Instance MAC Sequence", '', 'ReferencedSOPInstanceMACSequence'), 0x04000404: ('OB', '1', "MAC", '', 'MAC'), 0x04000500: ('SQ', '1', "Encrypted Attributes Sequence", '', 'EncryptedAttributesSequence'), 0x04000510: ('UI', '1', "Encrypted Content Transfer Syntax UID", '', 'EncryptedContentTransferSyntaxUID'), 0x04000520: ('OB', '1', "Encrypted Content", '', 'EncryptedContent'), 0x04000550: ('SQ', '1', "Modified Attributes Sequence", '', 'ModifiedAttributesSequence'), 0x04000551: ('SQ', '1', "Nonconforming Modified Attributes Sequence", '', 'NonconformingModifiedAttributesSequence'), 0x04000552: ('OB', '1', "Nonconforming Data Element Value", '', 'NonconformingDataElementValue'), 0x04000561: ('SQ', '1', "Original Attributes Sequence", '', 'OriginalAttributesSequence'), 0x04000562: ('DT', '1', "Attribute Modification DateTime", '', 'AttributeModificationDateTime'), 0x04000563: ('LO', '1', "Modifying System", '', 'ModifyingSystem'), 0x04000564: ('LO', '1', "Source of Previous Values", '', 'SourceOfPreviousValues'), 0x04000565: ('CS', '1', "Reason for the Attribute Modification", '', 'ReasonForTheAttributeModification'), 0x04000600: ('CS', '1', "Instance Origin Status", '', 'InstanceOriginStatus'), 0x20000010: ('IS', '1', "Number of Copies", '', 'NumberOfCopies'), 0x2000001E: ('SQ', '1', "Printer Configuration Sequence", '', 'PrinterConfigurationSequence'), 0x20000020: ('CS', '1', "Print Priority", '', 'PrintPriority'), 0x20000030: ('CS', '1', "Medium Type", '', 'MediumType'), 0x20000040: ('CS', '1', "Film Destination", '', 'FilmDestination'), 0x20000050: ('LO', '1', "Film Session Label", '', 'FilmSessionLabel'), 0x20000060: ('IS', '1', "Memory Allocation", '', 'MemoryAllocation'), 0x20000061: ('IS', '1', "Maximum Memory Allocation", '', 'MaximumMemoryAllocation'), 0x20000062: ('CS', '1', "Color Image Printing Flag", 'Retired', 'ColorImagePrintingFlag'), 0x20000063: ('CS', '1', "Collation Flag", 'Retired', 'CollationFlag'), 0x20000065: ('CS', '1', "Annotation Flag", 'Retired', 'AnnotationFlag'), 0x20000067: ('CS', '1', "Image Overlay Flag", 'Retired', 'ImageOverlayFlag'), 0x20000069: ('CS', '1', "Presentation LUT Flag", 'Retired', 'PresentationLUTFlag'), 0x2000006A: ('CS', '1', "Image Box Presentation LUT Flag", 'Retired', 'ImageBoxPresentationLUTFlag'), 0x200000A0: ('US', '1', "Memory Bit Depth", '', 'MemoryBitDepth'), 0x200000A1: ('US', '1', "Printing Bit Depth", '', 'PrintingBitDepth'), 0x200000A2: ('SQ', '1', "Media Installed Sequence", '', 'MediaInstalledSequence'), 0x200000A4: ('SQ', '1', "Other Media Available Sequence", '', 'OtherMediaAvailableSequence'), 0x200000A8: ('SQ', '1', "Supported Image Display Formats Sequence", '', 'SupportedImageDisplayFormatsSequence'), 0x20000500: ('SQ', '1', "Referenced Film Box Sequence", '', 'ReferencedFilmBoxSequence'), 0x20000510: ('SQ', '1', "Referenced Stored Print Sequence", 'Retired', 'ReferencedStoredPrintSequence'), 0x20100010: ('ST', '1', "Image Display Format", '', 'ImageDisplayFormat'), 0x20100030: ('CS', '1', "Annotation Display Format ID", '', 'AnnotationDisplayFormatID'), 0x20100040: ('CS', '1', "Film Orientation", '', 'FilmOrientation'), 0x20100050: ('CS', '1', "Film Size ID", '', 'FilmSizeID'), 0x20100052: ('CS', '1', "Printer Resolution ID", '', 'PrinterResolutionID'), 0x20100054: ('CS', '1', "Default Printer Resolution ID", '', 'DefaultPrinterResolutionID'), 0x20100060: ('CS', '1', "Magnification Type", '', 'MagnificationType'), 0x20100080: ('CS', '1', "Smoothing Type", '', 'SmoothingType'), 0x201000A6: ('CS', '1', "Default Magnification Type", '', 'DefaultMagnificationType'), 0x201000A7: ('CS', '1-n', "Other Magnification Types Available", '', 'OtherMagnificationTypesAvailable'), 0x201000A8: ('CS', '1', "Default Smoothing Type", '', 'DefaultSmoothingType'), 0x201000A9: ('CS', '1-n', "Other Smoothing Types Available", '', 'OtherSmoothingTypesAvailable'), 0x20100100: ('CS', '1', "Border Density", '', 'BorderDensity'), 0x20100110: ('CS', '1', "Empty Image Density", '', 'EmptyImageDensity'), 0x20100120: ('US', '1', "Min Density", '', 'MinDensity'), 0x20100130: ('US', '1', "Max Density", '', 'MaxDensity'), 0x20100140: ('CS', '1', "Trim", '', 'Trim'), 0x20100150: ('ST', '1', "Configuration Information", '', 'ConfigurationInformation'), 0x20100152: ('LT', '1', "Configuration Information Description", '', 'ConfigurationInformationDescription'), 0x20100154: ('IS', '1', "Maximum Collated Films", '', 'MaximumCollatedFilms'), 0x2010015E: ('US', '1', "Illumination", '', 'Illumination'), 0x20100160: ('US', '1', "Reflected Ambient Light", '', 'ReflectedAmbientLight'), 0x20100376: ('DS', '2', "Printer Pixel Spacing", '', 'PrinterPixelSpacing'), 0x20100500: ('SQ', '1', "Referenced Film Session Sequence", '', 'ReferencedFilmSessionSequence'), 0x20100510: ('SQ', '1', "Referenced Image Box Sequence", '', 'ReferencedImageBoxSequence'), 0x20100520: ('SQ', '1', "Referenced Basic Annotation Box Sequence", '', 'ReferencedBasicAnnotationBoxSequence'), 0x20200010: ('US', '1', "Image Box Position", '', 'ImageBoxPosition'), 0x20200020: ('CS', '1', "Polarity", '', 'Polarity'), 0x20200030: ('DS', '1', "Requested Image Size", '', 'RequestedImageSize'), 0x20200040: ('CS', '1', "Requested Decimate/Crop Behavior", '', 'RequestedDecimateCropBehavior'), 0x20200050: ('CS', '1', "Requested Resolution ID", '', 'RequestedResolutionID'), 0x202000A0: ('CS', '1', "Requested Image Size Flag", '', 'RequestedImageSizeFlag'), 0x202000A2: ('CS', '1', "Decimate/Crop Result", '', 'DecimateCropResult'), 0x20200110: ('SQ', '1', "Basic Grayscale Image Sequence", '', 'BasicGrayscaleImageSequence'), 0x20200111: ('SQ', '1', "Basic Color Image Sequence", '', 'BasicColorImageSequence'), 0x20200130: ('SQ', '1', "Referenced Image Overlay Box Sequence", 'Retired', 'ReferencedImageOverlayBoxSequence'), 0x20200140: ('SQ', '1', "Referenced VOI LUT Box Sequence", 'Retired', 'ReferencedVOILUTBoxSequence'), 0x20300010: ('US', '1', "Annotation Position", '', 'AnnotationPosition'), 0x20300020: ('LO', '1', "Text String", '', 'TextString'), 0x20400010: ('SQ', '1', "Referenced Overlay Plane Sequence", 'Retired', 'ReferencedOverlayPlaneSequence'), 0x20400011: ('US', '1-99', "Referenced Overlay Plane Groups", 'Retired', 'ReferencedOverlayPlaneGroups'), 0x20400020: ('SQ', '1', "Overlay Pixel Data Sequence", 'Retired', 'OverlayPixelDataSequence'), 0x20400060: ('CS', '1', "Overlay Magnification Type", 'Retired', 'OverlayMagnificationType'), 0x20400070: ('CS', '1', "Overlay Smoothing Type", 'Retired', 'OverlaySmoothingType'), 0x20400072: ('CS', '1', "Overlay or Image Magnification", 'Retired', 'OverlayOrImageMagnification'), 0x20400074: ('US', '1', "Magnify to Number of Columns", 'Retired', 'MagnifyToNumberOfColumns'), 0x20400080: ('CS', '1', "Overlay Foreground Density", 'Retired', 'OverlayForegroundDensity'), 0x20400082: ('CS', '1', "Overlay Background Density", 'Retired', 'OverlayBackgroundDensity'), 0x20400090: ('CS', '1', "Overlay Mode", 'Retired', 'OverlayMode'), 0x20400100: ('CS', '1', "Threshold Density", 'Retired', 'ThresholdDensity'), 0x20400500: ('SQ', '1', "Referenced Image Box Sequence (Retired)", 'Retired', 'ReferencedImageBoxSequenceRetired'), 0x20500010: ('SQ', '1', "Presentation LUT Sequence", '', 'PresentationLUTSequence'), 0x20500020: ('CS', '1', "Presentation LUT Shape", '', 'PresentationLUTShape'), 0x20500500: ('SQ', '1', "Referenced Presentation LUT Sequence", '', 'ReferencedPresentationLUTSequence'), 0x21000010: ('SH', '1', "Print Job ID", 'Retired', 'PrintJobID'), 0x21000020: ('CS', '1', "Execution Status", '', 'ExecutionStatus'), 0x21000030: ('CS', '1', "Execution Status Info", '', 'ExecutionStatusInfo'), 0x21000040: ('DA', '1', "Creation Date", '', 'CreationDate'), 0x21000050: ('TM', '1', "Creation Time", '', 'CreationTime'), 0x21000070: ('AE', '1', "Originator", '', 'Originator'), 0x21000140: ('AE', '1', "Destination AE", '', 'DestinationAE'), 0x21000160: ('SH', '1', "Owner ID", '', 'OwnerID'), 0x21000170: ('IS', '1', "Number of Films", '', 'NumberOfFilms'), 0x21000500: ('SQ', '1', "Referenced Print Job Sequence (Pull Stored Print)", 'Retired', 'ReferencedPrintJobSequencePullStoredPrint'), 0x21100010: ('CS', '1', "Printer Status", '', 'PrinterStatus'), 0x21100020: ('CS', '1', "Printer Status Info", '', 'PrinterStatusInfo'), 0x21100030: ('LO', '1', "Printer Name", '', 'PrinterName'), 0x21100099: ('SH', '1', "Print Queue ID", 'Retired', 'PrintQueueID'), 0x21200010: ('CS', '1', "Queue Status", 'Retired', 'QueueStatus'), 0x21200050: ('SQ', '1', "Print Job Description Sequence", 'Retired', 'PrintJobDescriptionSequence'), 0x21200070: ('SQ', '1', "Referenced Print Job Sequence", 'Retired', 'ReferencedPrintJobSequence'), 0x21300010: ('SQ', '1', "Print Management Capabilities Sequence", 'Retired', 'PrintManagementCapabilitiesSequence'), 0x21300015: ('SQ', '1', "Printer Characteristics Sequence", 'Retired', 'PrinterCharacteristicsSequence'), 0x21300030: ('SQ', '1', "Film Box Content Sequence", 'Retired', 'FilmBoxContentSequence'), 0x21300040: ('SQ', '1', "Image Box Content Sequence", 'Retired', 'ImageBoxContentSequence'), 0x21300050: ('SQ', '1', "Annotation Content Sequence", 'Retired', 'AnnotationContentSequence'), 0x21300060: ('SQ', '1', "Image Overlay Box Content Sequence", 'Retired', 'ImageOverlayBoxContentSequence'), 0x21300080: ('SQ', '1', "Presentation LUT Content Sequence", 'Retired', 'PresentationLUTContentSequence'), 0x213000A0: ('SQ', '1', "Proposed Study Sequence", '', 'ProposedStudySequence'), 0x213000C0: ('SQ', '1', "Original Image Sequence", '', 'OriginalImageSequence'), 0x22000001: ('CS', '1', "Label Using Information Extracted From Instances", '', 'LabelUsingInformationExtractedFromInstances'), 0x22000002: ('UT', '1', "Label Text", '', 'LabelText'), 0x22000003: ('CS', '1', "Label Style Selection", '', 'LabelStyleSelection'), 0x22000004: ('LT', '1', "Media Disposition", '', 'MediaDisposition'), 0x22000005: ('LT', '1', "Barcode Value", '', 'BarcodeValue'), 0x22000006: ('CS', '1', "Barcode Symbology", '', 'BarcodeSymbology'), 0x22000007: ('CS', '1', "Allow Media Splitting", '', 'AllowMediaSplitting'), 0x22000008: ('CS', '1', "Include Non-DICOM Objects", '', 'IncludeNonDICOMObjects'), 0x22000009: ('CS', '1', "Include Display Application", '', 'IncludeDisplayApplication'), 0x2200000A: ('CS', '1', "Preserve Composite Instances After Media Creation", '', 'PreserveCompositeInstancesAfterMediaCreation'), 0x2200000B: ('US', '1', "Total Number of Pieces of Media Created", '', 'TotalNumberOfPiecesOfMediaCreated'), 0x2200000C: ('LO', '1', "Requested Media Application Profile", '', 'RequestedMediaApplicationProfile'), 0x2200000D: ('SQ', '1', "Referenced Storage Media Sequence", '', 'ReferencedStorageMediaSequence'), 0x2200000E: ('AT', '1-n', "Failure Attributes", '', 'FailureAttributes'), 0x2200000F: ('CS', '1', "Allow Lossy Compression", '', 'AllowLossyCompression'), 0x22000020: ('CS', '1', "Request Priority", '', 'RequestPriority'), 0x30020002: ('SH', '1', "RT Image Label", '', 'RTImageLabel'), 0x30020003: ('LO', '1', "RT Image Name", '', 'RTImageName'), 0x30020004: ('ST', '1', "RT Image Description", '', 'RTImageDescription'), 0x3002000A: ('CS', '1', "Reported Values Origin", '', 'ReportedValuesOrigin'), 0x3002000C: ('CS', '1', "RT Image Plane", '', 'RTImagePlane'), 0x3002000D: ('DS', '3', "X-Ray Image Receptor Translation", '', 'XRayImageReceptorTranslation'), 0x3002000E: ('DS', '1', "X-Ray Image Receptor Angle", '', 'XRayImageReceptorAngle'), 0x30020010: ('DS', '6', "RT Image Orientation", '', 'RTImageOrientation'), 0x30020011: ('DS', '2', "Image Plane Pixel Spacing", '', 'ImagePlanePixelSpacing'), 0x30020012: ('DS', '2', "RT Image Position", '', 'RTImagePosition'), 0x30020020: ('SH', '1', "Radiation Machine Name", '', 'RadiationMachineName'), 0x30020022: ('DS', '1', "Radiation Machine SAD", '', 'RadiationMachineSAD'), 0x30020024: ('DS', '1', "Radiation Machine SSD", '', 'RadiationMachineSSD'), 0x30020026: ('DS', '1', "RT Image SID", '', 'RTImageSID'), 0x30020028: ('DS', '1', "Source to Reference Object Distance", '', 'SourceToReferenceObjectDistance'), 0x30020029: ('IS', '1', "Fraction Number", '', 'FractionNumber'), 0x30020030: ('SQ', '1', "Exposure Sequence", '', 'ExposureSequence'), 0x30020032: ('DS', '1', "Meterset Exposure", '', 'MetersetExposure'), 0x30020034: ('DS', '4', "Diaphragm Position", '', 'DiaphragmPosition'), 0x30020040: ('SQ', '1', "Fluence Map Sequence", '', 'FluenceMapSequence'), 0x30020041: ('CS', '1', "Fluence Data Source", '', 'FluenceDataSource'), 0x30020042: ('DS', '1', "Fluence Data Scale", '', 'FluenceDataScale'), 0x30020050: ('SQ', '1', "Primary Fluence Mode Sequence", '', 'PrimaryFluenceModeSequence'), 0x30020051: ('CS', '1', "Fluence Mode", '', 'FluenceMode'), 0x30020052: ('SH', '1', "Fluence Mode ID", '', 'FluenceModeID'), 0x30020100: ('IS', '1', "Selected Frame Number", '', 'SelectedFrameNumber'), 0x30020101: ('SQ', '1', "Selected Frame Functional Groups Sequence", '', 'SelectedFrameFunctionalGroupsSequence'), 0x30020102: ('SQ', '1', "RT Image Frame General Content Sequence", '', 'RTImageFrameGeneralContentSequence'), 0x30020103: ('SQ', '1', "RT Image Frame Context Sequence", '', 'RTImageFrameContextSequence'), 0x30020104: ('SQ', '1', "RT Image Scope Sequence", '', 'RTImageScopeSequence'), 0x30020105: ('CS', '1', "Beam Modifier Coordinates Presence Flag", '', 'BeamModifierCoordinatesPresenceFlag'), 0x30020106: ('FD', '1', "Start Cumulative Meterset", '', 'StartCumulativeMeterset'), 0x30020107: ('FD', '1', "Stop Cumulative Meterset", '', 'StopCumulativeMeterset'), 0x30020108: ('SQ', '1', "RT Acquisition Patient Position Sequence", '', 'RTAcquisitionPatientPositionSequence'), 0x30020109: ('SQ', '1', "RT Image Frame Imaging Device Position Sequence", '', 'RTImageFrameImagingDevicePositionSequence'), 0x3002010A: ('SQ', '1', "RT Image Frame kV Radiation Acquisition Sequence", '', 'RTImageFramekVRadiationAcquisitionSequence'), 0x3002010B: ('SQ', '1', "RT Image Frame MV Radiation Acquisition Sequence", '', 'RTImageFrameMVRadiationAcquisitionSequence'), 0x3002010C: ('SQ', '1', "RT Image Frame Radiation Acquisition Sequence", '', 'RTImageFrameRadiationAcquisitionSequence'), 0x3002010D: ('SQ', '1', "Imaging Source Position Sequence", '', 'ImagingSourcePositionSequence'), 0x3002010E: ('SQ', '1', "Image Receptor Position Sequence", '', 'ImageReceptorPositionSequence'), 0x3002010F: ('FD', '16', "Device Position to Equipment Mapping Matrix", '', 'DevicePositionToEquipmentMappingMatrix'), 0x30020110: ('SQ', '1', "Device Position Parameter Sequence", '', 'DevicePositionParameterSequence'), 0x30020111: ('CS', '1', "Imaging Source Location Specification Type", '', 'ImagingSourceLocationSpecificationType'), 0x30020112: ('SQ', '1', "Imaging Device Location Matrix Sequence", '', 'ImagingDeviceLocationMatrixSequence'), 0x30020113: ('SQ', '1', "Imaging Device Location Parameter Sequence", '', 'ImagingDeviceLocationParameterSequence'), 0x30020114: ('SQ', '1', "Imaging Aperture Sequence", '', 'ImagingApertureSequence'), 0x30020115: ('CS', '1', "Imaging Aperture Specification Type", '', 'ImagingApertureSpecificationType'), 0x30020116: ('US', '1', "Number of Acquisition Devices", '', 'NumberOfAcquisitionDevices'), 0x30020117: ('SQ', '1', "Acquisition Device Sequence", '', 'AcquisitionDeviceSequence'), 0x30020118: ('SQ', '1', "Acquisition Task Sequence", '', 'AcquisitionTaskSequence'), 0x30020119: ('SQ', '1', "Acquisition Task Workitem Code Sequence", '', 'AcquisitionTaskWorkitemCodeSequence'), 0x3002011A: ('SQ', '1', "Acquisition Subtask Sequence", '', 'AcquisitionSubtaskSequence'), 0x3002011B: ('SQ', '1', "Subtask Workitem Code Sequence", '', 'SubtaskWorkitemCodeSequence'), 0x3002011C: ('US', '1', "Acquisition Task Index", '', 'AcquisitionTaskIndex'), 0x3002011D: ('US', '1', "Acquisition Subtask Index", '', 'AcquisitionSubtaskIndex'), 0x3002011E: ('SQ', '1', "Referenced Baseline Parameters RT Radiation Instance Sequence", '', 'ReferencedBaselineParametersRTRadiationInstanceSequence'), 0x3002011F: ('SQ', '1', "Position Acquisition Template Identification Sequence", '', 'PositionAcquisitionTemplateIdentificationSequence'), 0x30020120: ('ST', '1', "Position Acquisition Template ID", '', 'PositionAcquisitionTemplateID'), 0x30020121: ('LO', '1', "Position Acquisition Template Name", '', 'PositionAcquisitionTemplateName'), 0x30020122: ('SQ', '1', "Position Acquisition Template Code Sequence", '', 'PositionAcquisitionTemplateCodeSequence'), 0x30020123: ('LT', '1', "Position Acquisition Template Description", '', 'PositionAcquisitionTemplateDescription'), 0x30020124: ('SQ', '1', "Acquisition Task Applicability Sequence", '', 'AcquisitionTaskApplicabilitySequence'), 0x30020125: ('SQ', '1', "Projection Imaging Acquisition Parameter Sequence", '', 'ProjectionImagingAcquisitionParameterSequence'), 0x30020126: ('SQ', '1', "CT Imaging Acquisition Parameter Sequence", '', 'CTImagingAcquisitionParameterSequence'), 0x30020127: ('SQ', '1', "KV Imaging Generation Parameters Sequence", '', 'KVImagingGenerationParametersSequence'), 0x30020128: ('SQ', '1', "MV Imaging Generation Parameters Sequence", '', 'MVImagingGenerationParametersSequence'), 0x30020129: ('CS', '1', "Acquisition Signal Type", '', 'AcquisitionSignalType'), 0x3002012A: ('CS', '1', "Acquisition Method", '', 'AcquisitionMethod'), 0x3002012B: ('SQ', '1', "Scan Start Position Sequence", '', 'ScanStartPositionSequence'), 0x3002012C: ('SQ', '1', "Scan Stop Position Sequence", '', 'ScanStopPositionSequence'), 0x3002012D: ('FD', '1', "Imaging Source to Beam Modifier Definition Plane Distance", '', 'ImagingSourceToBeamModifierDefinitionPlaneDistance'), 0x3002012E: ('CS', '1', "Scan Arc Type", '', 'ScanArcType'), 0x3002012F: ('CS', '1', "Detector Positioning Type", '', 'DetectorPositioningType'), 0x30020130: ('SQ', '1', "Additional RT Accessory Device Sequence", '', 'AdditionalRTAccessoryDeviceSequence'), 0x30020131: ('SQ', '1', "Device-Specific Acquisition Parameter Sequence", '', 'DeviceSpecificAcquisitionParameterSequence'), 0x30020132: ('SQ', '1', "Referenced Position Reference Instance Sequence", '', 'ReferencedPositionReferenceInstanceSequence'), 0x30020133: ('SQ', '1', "Energy Derivation Code Sequence", '', 'EnergyDerivationCodeSequence'), 0x30020134: ('FD', '1', "Maximum Cumulative Meterset Exposure", '', 'MaximumCumulativeMetersetExposure'), 0x30020135: ('SQ', '1', "Acquisition Initiation Sequence", '', 'AcquisitionInitiationSequence'), 0x30040001: ('CS', '1', "DVH Type", '', 'DVHType'), 0x30040002: ('CS', '1', "Dose Units", '', 'DoseUnits'), 0x30040004: ('CS', '1', "Dose Type", '', 'DoseType'), 0x30040005: ('CS', '1', "Spatial Transform of Dose", '', 'SpatialTransformOfDose'), 0x30040006: ('LO', '1', "Dose Comment", '', 'DoseComment'), 0x30040008: ('DS', '3', "Normalization Point", '', 'NormalizationPoint'), 0x3004000A: ('CS', '1', "Dose Summation Type", '', 'DoseSummationType'), 0x3004000C: ('DS', '2-n', "Grid Frame Offset Vector", '', 'GridFrameOffsetVector'), 0x3004000E: ('DS', '1', "Dose Grid Scaling", '', 'DoseGridScaling'), 0x30040010: ('SQ', '1', "RT Dose ROI Sequence", 'Retired', 'RTDoseROISequence'), 0x30040012: ('DS', '1', "Dose Value", 'Retired', 'DoseValue'), 0x30040014: ('CS', '1-3', "Tissue Heterogeneity Correction", '', 'TissueHeterogeneityCorrection'), 0x30040040: ('DS', '3', "DVH Normalization Point", '', 'DVHNormalizationPoint'), 0x30040042: ('DS', '1', "DVH Normalization Dose Value", '', 'DVHNormalizationDoseValue'), 0x30040050: ('SQ', '1', "DVH Sequence", '', 'DVHSequence'), 0x30040052: ('DS', '1', "DVH Dose Scaling", '', 'DVHDoseScaling'), 0x30040054: ('CS', '1', "DVH Volume Units", '', 'DVHVolumeUnits'), 0x30040056: ('IS', '1', "DVH Number of Bins", '', 'DVHNumberOfBins'), 0x30040058: ('DS', '2-2n', "DVH Data", '', 'DVHData'), 0x30040060: ('SQ', '1', "DVH Referenced ROI Sequence", '', 'DVHReferencedROISequence'), 0x30040062: ('CS', '1', "DVH ROI Contribution Type", '', 'DVHROIContributionType'), 0x30040070: ('DS', '1', "DVH Minimum Dose", '', 'DVHMinimumDose'), 0x30040072: ('DS', '1', "DVH Maximum Dose", '', 'DVHMaximumDose'), 0x30040074: ('DS', '1', "DVH Mean Dose", '', 'DVHMeanDose'), 0x30060002: ('SH', '1', "Structure Set Label", '', 'StructureSetLabel'), 0x30060004: ('LO', '1', "Structure Set Name", '', 'StructureSetName'), 0x30060006: ('ST', '1', "Structure Set Description", '', 'StructureSetDescription'), 0x30060008: ('DA', '1', "Structure Set Date", '', 'StructureSetDate'), 0x30060009: ('TM', '1', "Structure Set Time", '', 'StructureSetTime'), 0x30060010: ('SQ', '1', "Referenced Frame of Reference Sequence", '', 'ReferencedFrameOfReferenceSequence'), 0x30060012: ('SQ', '1', "RT Referenced Study Sequence", '', 'RTReferencedStudySequence'), 0x30060014: ('SQ', '1', "RT Referenced Series Sequence", '', 'RTReferencedSeriesSequence'), 0x30060016: ('SQ', '1', "Contour Image Sequence", '', 'ContourImageSequence'), 0x30060018: ('SQ', '1', "Predecessor Structure Set Sequence", '', 'PredecessorStructureSetSequence'), 0x30060020: ('SQ', '1', "Structure Set ROI Sequence", '', 'StructureSetROISequence'), 0x30060022: ('IS', '1', "ROI Number", '', 'ROINumber'), 0x30060024: ('UI', '1', "Referenced Frame of Reference UID", '', 'ReferencedFrameOfReferenceUID'), 0x30060026: ('LO', '1', "ROI Name", '', 'ROIName'), 0x30060028: ('ST', '1', "ROI Description", '', 'ROIDescription'), 0x3006002A: ('IS', '3', "ROI Display Color", '', 'ROIDisplayColor'), 0x3006002C: ('DS', '1', "ROI Volume", '', 'ROIVolume'), 0x3006002D: ('DT', '1', "ROI DateTime", '', 'ROIDateTime'), 0x3006002E: ('DT', '1', "ROI Observation DateTime", '', 'ROIObservationDateTime'), 0x30060030: ('SQ', '1', "RT Related ROI Sequence", '', 'RTRelatedROISequence'), 0x30060033: ('CS', '1', "RT ROI Relationship", '', 'RTROIRelationship'), 0x30060036: ('CS', '1', "ROI Generation Algorithm", '', 'ROIGenerationAlgorithm'), 0x30060037: ('SQ', '1', "ROI Derivation Algorithm Identification Sequence", '', 'ROIDerivationAlgorithmIdentificationSequence'), 0x30060038: ('LO', '1', "ROI Generation Description", '', 'ROIGenerationDescription'), 0x30060039: ('SQ', '1', "ROI Contour Sequence", '', 'ROIContourSequence'), 0x30060040: ('SQ', '1', "Contour Sequence", '', 'ContourSequence'), 0x30060042: ('CS', '1', "Contour Geometric Type", '', 'ContourGeometricType'), 0x30060044: ('DS', '1', "Contour Slab Thickness", 'Retired', 'ContourSlabThickness'), 0x30060045: ('DS', '3', "Contour Offset Vector", 'Retired', 'ContourOffsetVector'), 0x30060046: ('IS', '1', "Number of Contour Points", '', 'NumberOfContourPoints'), 0x30060048: ('IS', '1', "Contour Number", '', 'ContourNumber'), 0x30060049: ('IS', '1-n', "Attached Contours", 'Retired', 'AttachedContours'), 0x3006004A: ('SQ', '1', "Source Pixel Planes Characteristics Sequence", '', 'SourcePixelPlanesCharacteristicsSequence'), 0x3006004B: ('SQ', '1', "Source Series Sequence", '', 'SourceSeriesSequence'), 0x3006004C: ('SQ', '1', "Source Series Information Sequence", '', 'SourceSeriesInformationSequence'), 0x3006004D: ('SQ', '1', "ROI Creator Sequence", '', 'ROICreatorSequence'), 0x3006004E: ('SQ', '1', "ROI Interpreter Sequence", '', 'ROIInterpreterSequence'), 0x3006004F: ('SQ', '1', "ROI Observation Context Code Sequence", '', 'ROIObservationContextCodeSequence'), 0x30060050: ('DS', '3-3n', "Contour Data", '', 'ContourData'), 0x30060080: ('SQ', '1', "RT ROI Observations Sequence", '', 'RTROIObservationsSequence'), 0x30060082: ('IS', '1', "Observation Number", '', 'ObservationNumber'), 0x30060084: ('IS', '1', "Referenced ROI Number", '', 'ReferencedROINumber'), 0x30060085: ('SH', '1', "ROI Observation Label", 'Retired', 'ROIObservationLabel'), 0x30060086: ('SQ', '1', "RT ROI Identification Code Sequence", '', 'RTROIIdentificationCodeSequence'), 0x30060088: ('ST', '1', "ROI Observation Description", 'Retired', 'ROIObservationDescription'), 0x300600A0: ('SQ', '1', "Related RT ROI Observations Sequence", '', 'RelatedRTROIObservationsSequence'), 0x300600A4: ('CS', '1', "RT ROI Interpreted Type", '', 'RTROIInterpretedType'), 0x300600A6: ('PN', '1', "ROI Interpreter", '', 'ROIInterpreter'), 0x300600B0: ('SQ', '1', "ROI Physical Properties Sequence", '', 'ROIPhysicalPropertiesSequence'), 0x300600B2: ('CS', '1', "ROI Physical Property", '', 'ROIPhysicalProperty'), 0x300600B4: ('DS', '1', "ROI Physical Property Value", '', 'ROIPhysicalPropertyValue'), 0x300600B6: ('SQ', '1', "ROI Elemental Composition Sequence", '', 'ROIElementalCompositionSequence'), 0x300600B7: ('US', '1', "ROI Elemental Composition Atomic Number", '', 'ROIElementalCompositionAtomicNumber'), 0x300600B8: ('FL', '1', "ROI Elemental Composition Atomic Mass Fraction", '', 'ROIElementalCompositionAtomicMassFraction'), 0x300600B9: ('SQ', '1', "Additional RT ROI Identification Code Sequence", 'Retired', 'AdditionalRTROIIdentificationCodeSequence'), 0x300600C0: ('SQ', '1', "Frame of Reference Relationship Sequence", 'Retired', 'FrameOfReferenceRelationshipSequence'), 0x300600C2: ('UI', '1', "Related Frame of Reference UID", 'Retired', 'RelatedFrameOfReferenceUID'), 0x300600C4: ('CS', '1', "Frame of Reference Transformation Type", 'Retired', 'FrameOfReferenceTransformationType'), 0x300600C6: ('DS', '16', "Frame of Reference Transformation Matrix", '', 'FrameOfReferenceTransformationMatrix'), 0x300600C8: ('LO', '1', "Frame of Reference Transformation Comment", '', 'FrameOfReferenceTransformationComment'), 0x300600C9: ('SQ', '1', "Patient Location Coordinates Sequence", '', 'PatientLocationCoordinatesSequence'), 0x300600CA: ('SQ', '1', "Patient Location Coordinates Code Sequence", '', 'PatientLocationCoordinatesCodeSequence'), 0x300600CB: ('SQ', '1', "Patient Support Position Sequence", '', 'PatientSupportPositionSequence'), 0x30080010: ('SQ', '1', "Measured Dose Reference Sequence", '', 'MeasuredDoseReferenceSequence'), 0x30080012: ('ST', '1', "Measured Dose Description", '', 'MeasuredDoseDescription'), 0x30080014: ('CS', '1', "Measured Dose Type", '', 'MeasuredDoseType'), 0x30080016: ('DS', '1', "Measured Dose Value", '', 'MeasuredDoseValue'), 0x30080020: ('SQ', '1', "Treatment Session Beam Sequence", '', 'TreatmentSessionBeamSequence'), 0x30080021: ('SQ', '1', "Treatment Session Ion Beam Sequence", '', 'TreatmentSessionIonBeamSequence'), 0x30080022: ('IS', '1', "Current Fraction Number", '', 'CurrentFractionNumber'), 0x30080024: ('DA', '1', "Treatment Control Point Date", '', 'TreatmentControlPointDate'), 0x30080025: ('TM', '1', "Treatment Control Point Time", '', 'TreatmentControlPointTime'), 0x3008002A: ('CS', '1', "Treatment Termination Status", '', 'TreatmentTerminationStatus'), 0x3008002B: ('SH', '1', "Treatment Termination Code", 'Retired', 'TreatmentTerminationCode'), 0x3008002C: ('CS', '1', "Treatment Verification Status", '', 'TreatmentVerificationStatus'), 0x30080030: ('SQ', '1', "Referenced Treatment Record Sequence", '', 'ReferencedTreatmentRecordSequence'), 0x30080032: ('DS', '1', "Specified Primary Meterset", '', 'SpecifiedPrimaryMeterset'), 0x30080033: ('DS', '1', "Specified Secondary Meterset", '', 'SpecifiedSecondaryMeterset'), 0x30080036: ('DS', '1', "Delivered Primary Meterset", '', 'DeliveredPrimaryMeterset'), 0x30080037: ('DS', '1', "Delivered Secondary Meterset", '', 'DeliveredSecondaryMeterset'), 0x3008003A: ('DS', '1', "Specified Treatment Time", '', 'SpecifiedTreatmentTime'), 0x3008003B: ('DS', '1', "Delivered Treatment Time", '', 'DeliveredTreatmentTime'), 0x30080040: ('SQ', '1', "Control Point Delivery Sequence", '', 'ControlPointDeliverySequence'), 0x30080041: ('SQ', '1', "Ion Control Point Delivery Sequence", '', 'IonControlPointDeliverySequence'), 0x30080042: ('DS', '1', "Specified Meterset", '', 'SpecifiedMeterset'), 0x30080044: ('DS', '1', "Delivered Meterset", '', 'DeliveredMeterset'), 0x30080045: ('FL', '1', "Meterset Rate Set", '', 'MetersetRateSet'), 0x30080046: ('FL', '1', "Meterset Rate Delivered", '', 'MetersetRateDelivered'), 0x30080047: ('FL', '1-n', "Scan Spot Metersets Delivered", '', 'ScanSpotMetersetsDelivered'), 0x30080048: ('DS', '1', "Dose Rate Delivered", '', 'DoseRateDelivered'), 0x30080050: ('SQ', '1', "Treatment Summary Calculated Dose Reference Sequence", '', 'TreatmentSummaryCalculatedDoseReferenceSequence'), 0x30080052: ('DS', '1', "Cumulative Dose to Dose Reference", '', 'CumulativeDoseToDoseReference'), 0x30080054: ('DA', '1', "First Treatment Date", '', 'FirstTreatmentDate'), 0x30080056: ('DA', '1', "Most Recent Treatment Date", '', 'MostRecentTreatmentDate'), 0x3008005A: ('IS', '1', "Number of Fractions Delivered", '', 'NumberOfFractionsDelivered'), 0x30080060: ('SQ', '1', "Override Sequence", '', 'OverrideSequence'), 0x30080061: ('AT', '1', "Parameter Sequence Pointer", '', 'ParameterSequencePointer'), 0x30080062: ('AT', '1', "Override Parameter Pointer", '', 'OverrideParameterPointer'), 0x30080063: ('IS', '1', "Parameter Item Index", '', 'ParameterItemIndex'), 0x30080064: ('IS', '1', "Measured Dose Reference Number", '', 'MeasuredDoseReferenceNumber'), 0x30080065: ('AT', '1', "Parameter Pointer", '', 'ParameterPointer'), 0x30080066: ('ST', '1', "Override Reason", '', 'OverrideReason'), 0x30080067: ('US', '1', "Parameter Value Number", '', 'ParameterValueNumber'), 0x30080068: ('SQ', '1', "Corrected Parameter Sequence", '', 'CorrectedParameterSequence'), 0x3008006A: ('FL', '1', "Correction Value", '', 'CorrectionValue'), 0x30080070: ('SQ', '1', "Calculated Dose Reference Sequence", '', 'CalculatedDoseReferenceSequence'), 0x30080072: ('IS', '1', "Calculated Dose Reference Number", '', 'CalculatedDoseReferenceNumber'), 0x30080074: ('ST', '1', "Calculated Dose Reference Description", '', 'CalculatedDoseReferenceDescription'), 0x30080076: ('DS', '1', "Calculated Dose Reference Dose Value", '', 'CalculatedDoseReferenceDoseValue'), 0x30080078: ('DS', '1', "Start Meterset", '', 'StartMeterset'), 0x3008007A: ('DS', '1', "End Meterset", '', 'EndMeterset'), 0x30080080: ('SQ', '1', "Referenced Measured Dose Reference Sequence", '', 'ReferencedMeasuredDoseReferenceSequence'), 0x30080082: ('IS', '1', "Referenced Measured Dose Reference Number", '', 'ReferencedMeasuredDoseReferenceNumber'), 0x30080090: ('SQ', '1', "Referenced Calculated Dose Reference Sequence", '', 'ReferencedCalculatedDoseReferenceSequence'), 0x30080092: ('IS', '1', "Referenced Calculated Dose Reference Number", '', 'ReferencedCalculatedDoseReferenceNumber'), 0x300800A0: ('SQ', '1', "Beam Limiting Device Leaf Pairs Sequence", '', 'BeamLimitingDeviceLeafPairsSequence'), 0x300800A1: ('SQ', '1', "Enhanced RT Beam Limiting Device Sequence", '', 'EnhancedRTBeamLimitingDeviceSequence'), 0x300800A2: ('SQ', '1', "Enhanced RT Beam Limiting Opening Sequence", '', 'EnhancedRTBeamLimitingOpeningSequence'), 0x300800A3: ('CS', '1', "Enhanced RT Beam Limiting Device Definition Flag", '', 'EnhancedRTBeamLimitingDeviceDefinitionFlag'), 0x300800A4: ('FD', '2-2n', "Parallel RT Beam Delimiter Opening Extents", '', 'ParallelRTBeamDelimiterOpeningExtents'), 0x300800B0: ('SQ', '1', "Recorded Wedge Sequence", '', 'RecordedWedgeSequence'), 0x300800C0: ('SQ', '1', "Recorded Compensator Sequence", '', 'RecordedCompensatorSequence'), 0x300800D0: ('SQ', '1', "Recorded Block Sequence", '', 'RecordedBlockSequence'), 0x300800D1: ('SQ', '1', "Recorded Block Slab Sequence", '', 'RecordedBlockSlabSequence'), 0x300800E0: ('SQ', '1', "Treatment Summary Measured Dose Reference Sequence", '', 'TreatmentSummaryMeasuredDoseReferenceSequence'), 0x300800F0: ('SQ', '1', "Recorded Snout Sequence", '', 'RecordedSnoutSequence'), 0x300800F2: ('SQ', '1', "Recorded Range Shifter Sequence", '', 'RecordedRangeShifterSequence'), 0x300800F4: ('SQ', '1', "Recorded Lateral Spreading Device Sequence", '', 'RecordedLateralSpreadingDeviceSequence'), 0x300800F6: ('SQ', '1', "Recorded Range Modulator Sequence", '', 'RecordedRangeModulatorSequence'), 0x30080100: ('SQ', '1', "Recorded Source Sequence", '', 'RecordedSourceSequence'), 0x30080105: ('LO', '1', "Source Serial Number", '', 'SourceSerialNumber'), 0x30080110: ('SQ', '1', "Treatment Session Application Setup Sequence", '', 'TreatmentSessionApplicationSetupSequence'), 0x30080116: ('CS', '1', "Application Setup Check", '', 'ApplicationSetupCheck'), 0x30080120: ('SQ', '1', "Recorded Brachy Accessory Device Sequence", '', 'RecordedBrachyAccessoryDeviceSequence'), 0x30080122: ('IS', '1', "Referenced Brachy Accessory Device Number", '', 'ReferencedBrachyAccessoryDeviceNumber'), 0x30080130: ('SQ', '1', "Recorded Channel Sequence", '', 'RecordedChannelSequence'), 0x30080132: ('DS', '1', "Specified Channel Total Time", '', 'SpecifiedChannelTotalTime'), 0x30080134: ('DS', '1', "Delivered Channel Total Time", '', 'DeliveredChannelTotalTime'), 0x30080136: ('IS', '1', "Specified Number of Pulses", '', 'SpecifiedNumberOfPulses'), 0x30080138: ('IS', '1', "Delivered Number of Pulses", '', 'DeliveredNumberOfPulses'), 0x3008013A: ('DS', '1', "Specified Pulse Repetition Interval", '', 'SpecifiedPulseRepetitionInterval'), 0x3008013C: ('DS', '1', "Delivered Pulse Repetition Interval", '', 'DeliveredPulseRepetitionInterval'), 0x30080140: ('SQ', '1', "Recorded Source Applicator Sequence", '', 'RecordedSourceApplicatorSequence'), 0x30080142: ('IS', '1', "Referenced Source Applicator Number", '', 'ReferencedSourceApplicatorNumber'), 0x30080150: ('SQ', '1', "Recorded Channel Shield Sequence", '', 'RecordedChannelShieldSequence'), 0x30080152: ('IS', '1', "Referenced Channel Shield Number", '', 'ReferencedChannelShieldNumber'), 0x30080160: ('SQ', '1', "Brachy Control Point Delivered Sequence", '', 'BrachyControlPointDeliveredSequence'), 0x30080162: ('DA', '1', "Safe Position Exit Date", '', 'SafePositionExitDate'), 0x30080164: ('TM', '1', "Safe Position Exit Time", '', 'SafePositionExitTime'), 0x30080166: ('DA', '1', "Safe Position Return Date", '', 'SafePositionReturnDate'), 0x30080168: ('TM', '1', "Safe Position Return Time", '', 'SafePositionReturnTime'), 0x30080171: ('SQ', '1', "Pulse Specific Brachy Control Point Delivered Sequence", '', 'PulseSpecificBrachyControlPointDeliveredSequence'), 0x30080172: ('US', '1', "Pulse Number", '', 'PulseNumber'), 0x30080173: ('SQ', '1', "Brachy Pulse Control Point Delivered Sequence", '', 'BrachyPulseControlPointDeliveredSequence'), 0x30080200: ('CS', '1', "Current Treatment Status", '', 'CurrentTreatmentStatus'), 0x30080202: ('ST', '1', "Treatment Status Comment", '', 'TreatmentStatusComment'), 0x30080220: ('SQ', '1', "Fraction Group Summary Sequence", '', 'FractionGroupSummarySequence'), 0x30080223: ('IS', '1', "Referenced Fraction Number", '', 'ReferencedFractionNumber'), 0x30080224: ('CS', '1', "Fraction Group Type", '', 'FractionGroupType'), 0x30080230: ('CS', '1', "Beam Stopper Position", '', 'BeamStopperPosition'), 0x30080240: ('SQ', '1', "Fraction Status Summary Sequence", '', 'FractionStatusSummarySequence'), 0x30080250: ('DA', '1', "Treatment Date", '', 'TreatmentDate'), 0x30080251: ('TM', '1', "Treatment Time", '', 'TreatmentTime'), 0x300A0002: ('SH', '1', "RT Plan Label", '', 'RTPlanLabel'), 0x300A0003: ('LO', '1', "RT Plan Name", '', 'RTPlanName'), 0x300A0004: ('ST', '1', "RT Plan Description", '', 'RTPlanDescription'), 0x300A0006: ('DA', '1', "RT Plan Date", '', 'RTPlanDate'), 0x300A0007: ('TM', '1', "RT Plan Time", '', 'RTPlanTime'), 0x300A0009: ('LO', '1-n', "Treatment Protocols", '', 'TreatmentProtocols'), 0x300A000A: ('CS', '1', "Plan Intent", '', 'PlanIntent'), 0x300A000B: ('LO', '1-n', "Treatment Sites", 'Retired', 'TreatmentSites'), 0x300A000C: ('CS', '1', "RT Plan Geometry", '', 'RTPlanGeometry'), 0x300A000E: ('ST', '1', "Prescription Description", '', 'PrescriptionDescription'), 0x300A0010: ('SQ', '1', "Dose Reference Sequence", '', 'DoseReferenceSequence'), 0x300A0012: ('IS', '1', "Dose Reference Number", '', 'DoseReferenceNumber'), 0x300A0013: ('UI', '1', "Dose Reference UID", '', 'DoseReferenceUID'), 0x300A0014: ('CS', '1', "Dose Reference Structure Type", '', 'DoseReferenceStructureType'), 0x300A0015: ('CS', '1', "Nominal Beam Energy Unit", '', 'NominalBeamEnergyUnit'), 0x300A0016: ('LO', '1', "Dose Reference Description", '', 'DoseReferenceDescription'), 0x300A0018: ('DS', '3', "Dose Reference Point Coordinates", '', 'DoseReferencePointCoordinates'), 0x300A001A: ('DS', '1', "Nominal Prior Dose", '', 'NominalPriorDose'), 0x300A0020: ('CS', '1', "Dose Reference Type", '', 'DoseReferenceType'), 0x300A0021: ('DS', '1', "Constraint Weight", '', 'ConstraintWeight'), 0x300A0022: ('DS', '1', "Delivery Warning Dose", '', 'DeliveryWarningDose'), 0x300A0023: ('DS', '1', "Delivery Maximum Dose", '', 'DeliveryMaximumDose'), 0x300A0025: ('DS', '1', "Target Minimum Dose", '', 'TargetMinimumDose'), 0x300A0026: ('DS', '1', "Target Prescription Dose", '', 'TargetPrescriptionDose'), 0x300A0027: ('DS', '1', "Target Maximum Dose", '', 'TargetMaximumDose'), 0x300A0028: ('DS', '1', "Target Underdose Volume Fraction", '', 'TargetUnderdoseVolumeFraction'), 0x300A002A: ('DS', '1', "Organ at Risk Full-volume Dose", '', 'OrganAtRiskFullVolumeDose'), 0x300A002B: ('DS', '1', "Organ at Risk Limit Dose", '', 'OrganAtRiskLimitDose'), 0x300A002C: ('DS', '1', "Organ at Risk Maximum Dose", '', 'OrganAtRiskMaximumDose'), 0x300A002D: ('DS', '1', "Organ at Risk Overdose Volume Fraction", '', 'OrganAtRiskOverdoseVolumeFraction'), 0x300A0040: ('SQ', '1', "Tolerance Table Sequence", '', 'ToleranceTableSequence'), 0x300A0042: ('IS', '1', "Tolerance Table Number", '', 'ToleranceTableNumber'), 0x300A0043: ('SH', '1', "Tolerance Table Label", '', 'ToleranceTableLabel'), 0x300A0044: ('DS', '1', "Gantry Angle Tolerance", '', 'GantryAngleTolerance'), 0x300A0046: ('DS', '1', "Beam Limiting Device Angle Tolerance", '', 'BeamLimitingDeviceAngleTolerance'), 0x300A0048: ('SQ', '1', "Beam Limiting Device Tolerance Sequence", '', 'BeamLimitingDeviceToleranceSequence'), 0x300A004A: ('DS', '1', "Beam Limiting Device Position Tolerance", '', 'BeamLimitingDevicePositionTolerance'), 0x300A004B: ('FL', '1', "Snout Position Tolerance", '', 'SnoutPositionTolerance'), 0x300A004C: ('DS', '1', "Patient Support Angle Tolerance", '', 'PatientSupportAngleTolerance'), 0x300A004E: ('DS', '1', "Table Top Eccentric Angle Tolerance", '', 'TableTopEccentricAngleTolerance'), 0x300A004F: ('FL', '1', "Table Top Pitch Angle Tolerance", '', 'TableTopPitchAngleTolerance'), 0x300A0050: ('FL', '1', "Table Top Roll Angle Tolerance", '', 'TableTopRollAngleTolerance'), 0x300A0051: ('DS', '1', "Table Top Vertical Position Tolerance", '', 'TableTopVerticalPositionTolerance'), 0x300A0052: ('DS', '1', "Table Top Longitudinal Position Tolerance", '', 'TableTopLongitudinalPositionTolerance'), 0x300A0053: ('DS', '1', "Table Top Lateral Position Tolerance", '', 'TableTopLateralPositionTolerance'), 0x300A0054: ('UI', '1', "Table Top Position Alignment UID", '', 'TableTopPositionAlignmentUID'), 0x300A0055: ('CS', '1', "RT Plan Relationship", '', 'RTPlanRelationship'), 0x300A0070: ('SQ', '1', "Fraction Group Sequence", '', 'FractionGroupSequence'), 0x300A0071: ('IS', '1', "Fraction Group Number", '', 'FractionGroupNumber'), 0x300A0072: ('LO', '1', "Fraction Group Description", '', 'FractionGroupDescription'), 0x300A0078: ('IS', '1', "Number of Fractions Planned", '', 'NumberOfFractionsPlanned'), 0x300A0079: ('IS', '1', "Number of Fraction Pattern Digits Per Day", '', 'NumberOfFractionPatternDigitsPerDay'), 0x300A007A: ('IS', '1', "Repeat Fraction Cycle Length", '', 'RepeatFractionCycleLength'), 0x300A007B: ('LT', '1', "Fraction Pattern", '', 'FractionPattern'), 0x300A0080: ('IS', '1', "Number of Beams", '', 'NumberOfBeams'), 0x300A0082: ('DS', '3', "Beam Dose Specification Point", 'Retired', 'BeamDoseSpecificationPoint'), 0x300A0083: ('UI', '1', "Referenced Dose Reference UID", '', 'ReferencedDoseReferenceUID'), 0x300A0084: ('DS', '1', "Beam Dose", '', 'BeamDose'), 0x300A0086: ('DS', '1', "Beam Meterset", '', 'BeamMeterset'), 0x300A0088: ('FL', '1', "Beam Dose Point Depth", '', 'BeamDosePointDepth'), 0x300A0089: ('FL', '1', "Beam Dose Point Equivalent Depth", '', 'BeamDosePointEquivalentDepth'), 0x300A008A: ('FL', '1', "Beam Dose Point SSD", '', 'BeamDosePointSSD'), 0x300A008B: ('CS', '1', "Beam Dose Meaning", '', 'BeamDoseMeaning'), 0x300A008C: ('SQ', '1', "Beam Dose Verification Control Point Sequence", '', 'BeamDoseVerificationControlPointSequence'), 0x300A008D: ('FL', '1', "Average Beam Dose Point Depth", 'Retired', 'AverageBeamDosePointDepth'), 0x300A008E: ('FL', '1', "Average Beam Dose Point Equivalent Depth", 'Retired', 'AverageBeamDosePointEquivalentDepth'), 0x300A008F: ('FL', '1', "Average Beam Dose Point SSD", 'Retired', 'AverageBeamDosePointSSD'), 0x300A0090: ('CS', '1', "Beam Dose Type", '', 'BeamDoseType'), 0x300A0091: ('DS', '1', "Alternate Beam Dose", '', 'AlternateBeamDose'), 0x300A0092: ('CS', '1', "Alternate Beam Dose Type", '', 'AlternateBeamDoseType'), 0x300A0093: ('CS', '1', "Depth Value Averaging Flag", '', 'DepthValueAveragingFlag'), 0x300A0094: ('DS', '1', "Beam Dose Point Source to External Contour Distance", '', 'BeamDosePointSourceToExternalContourDistance'), 0x300A00A0: ('IS', '1', "Number of Brachy Application Setups", '', 'NumberOfBrachyApplicationSetups'), 0x300A00A2: ('DS', '3', "Brachy Application Setup Dose Specification Point", '', 'BrachyApplicationSetupDoseSpecificationPoint'), 0x300A00A4: ('DS', '1', "Brachy Application Setup Dose", '', 'BrachyApplicationSetupDose'), 0x300A00B0: ('SQ', '1', "Beam Sequence", '', 'BeamSequence'), 0x300A00B2: ('SH', '1', "Treatment Machine Name", '', 'TreatmentMachineName'), 0x300A00B3: ('CS', '1', "Primary Dosimeter Unit", '', 'PrimaryDosimeterUnit'), 0x300A00B4: ('DS', '1', "Source-Axis Distance", '', 'SourceAxisDistance'), 0x300A00B6: ('SQ', '1', "Beam Limiting Device Sequence", '', 'BeamLimitingDeviceSequence'), 0x300A00B8: ('CS', '1', "RT Beam Limiting Device Type", '', 'RTBeamLimitingDeviceType'), 0x300A00BA: ('DS', '1', "Source to Beam Limiting Device Distance", '', 'SourceToBeamLimitingDeviceDistance'), 0x300A00BB: ('FL', '1', "Isocenter to Beam Limiting Device Distance", '', 'IsocenterToBeamLimitingDeviceDistance'), 0x300A00BC: ('IS', '1', "Number of Leaf/Jaw Pairs", '', 'NumberOfLeafJawPairs'), 0x300A00BE: ('DS', '3-n', "Leaf Position Boundaries", '', 'LeafPositionBoundaries'), 0x300A00C0: ('IS', '1', "Beam Number", '', 'BeamNumber'), 0x300A00C2: ('LO', '1', "Beam Name", '', 'BeamName'), 0x300A00C3: ('ST', '1', "Beam Description", '', 'BeamDescription'), 0x300A00C4: ('CS', '1', "Beam Type", '', 'BeamType'), 0x300A00C5: ('FD', '1', "Beam Delivery Duration Limit", '', 'BeamDeliveryDurationLimit'), 0x300A00C6: ('CS', '1', "Radiation Type", '', 'RadiationType'), 0x300A00C7: ('CS', '1', "High-Dose Technique Type", '', 'HighDoseTechniqueType'), 0x300A00C8: ('IS', '1', "Reference Image Number", '', 'ReferenceImageNumber'), 0x300A00CA: ('SQ', '1', "Planned Verification Image Sequence", '', 'PlannedVerificationImageSequence'), 0x300A00CC: ('LO', '1-n', "Imaging Device-Specific Acquisition Parameters", '', 'ImagingDeviceSpecificAcquisitionParameters'), 0x300A00CE: ('CS', '1', "Treatment Delivery Type", '', 'TreatmentDeliveryType'), 0x300A00D0: ('IS', '1', "Number of Wedges", '', 'NumberOfWedges'), 0x300A00D1: ('SQ', '1', "Wedge Sequence", '', 'WedgeSequence'), 0x300A00D2: ('IS', '1', "Wedge Number", '', 'WedgeNumber'), 0x300A00D3: ('CS', '1', "Wedge Type", '', 'WedgeType'), 0x300A00D4: ('SH', '1', "Wedge ID", '', 'WedgeID'), 0x300A00D5: ('IS', '1', "Wedge Angle", '', 'WedgeAngle'), 0x300A00D6: ('DS', '1', "Wedge Factor", '', 'WedgeFactor'), 0x300A00D7: ('FL', '1', "Total Wedge Tray Water-Equivalent Thickness", '', 'TotalWedgeTrayWaterEquivalentThickness'), 0x300A00D8: ('DS', '1', "Wedge Orientation", '', 'WedgeOrientation'), 0x300A00D9: ('FL', '1', "Isocenter to Wedge Tray Distance", '', 'IsocenterToWedgeTrayDistance'), 0x300A00DA: ('DS', '1', "Source to Wedge Tray Distance", '', 'SourceToWedgeTrayDistance'), 0x300A00DB: ('FL', '1', "Wedge Thin Edge Position", '', 'WedgeThinEdgePosition'), 0x300A00DC: ('SH', '1', "Bolus ID", '', 'BolusID'), 0x300A00DD: ('ST', '1', "Bolus Description", '', 'BolusDescription'), 0x300A00DE: ('DS', '1', "Effective Wedge Angle", '', 'EffectiveWedgeAngle'), 0x300A00E0: ('IS', '1', "Number of Compensators", '', 'NumberOfCompensators'), 0x300A00E1: ('SH', '1', "Material ID", '', 'MaterialID'), 0x300A00E2: ('DS', '1', "Total Compensator Tray Factor", '', 'TotalCompensatorTrayFactor'), 0x300A00E3: ('SQ', '1', "Compensator Sequence", '', 'CompensatorSequence'), 0x300A00E4: ('IS', '1', "Compensator Number", '', 'CompensatorNumber'), 0x300A00E5: ('SH', '1', "Compensator ID", '', 'CompensatorID'), 0x300A00E6: ('DS', '1', "Source to Compensator Tray Distance", '', 'SourceToCompensatorTrayDistance'), 0x300A00E7: ('IS', '1', "Compensator Rows", '', 'CompensatorRows'), 0x300A00E8: ('IS', '1', "Compensator Columns", '', 'CompensatorColumns'), 0x300A00E9: ('DS', '2', "Compensator Pixel Spacing", '', 'CompensatorPixelSpacing'), 0x300A00EA: ('DS', '2', "Compensator Position", '', 'CompensatorPosition'), 0x300A00EB: ('DS', '1-n', "Compensator Transmission Data", '', 'CompensatorTransmissionData'), 0x300A00EC: ('DS', '1-n', "Compensator Thickness Data", '', 'CompensatorThicknessData'), 0x300A00ED: ('IS', '1', "Number of Boli", '', 'NumberOfBoli'), 0x300A00EE: ('CS', '1', "Compensator Type", '', 'CompensatorType'), 0x300A00EF: ('SH', '1', "Compensator Tray ID", '', 'CompensatorTrayID'), 0x300A00F0: ('IS', '1', "Number of Blocks", '', 'NumberOfBlocks'), 0x300A00F2: ('DS', '1', "Total Block Tray Factor", '', 'TotalBlockTrayFactor'), 0x300A00F3: ('FL', '1', "Total Block Tray Water-Equivalent Thickness", '', 'TotalBlockTrayWaterEquivalentThickness'), 0x300A00F4: ('SQ', '1', "Block Sequence", '', 'BlockSequence'), 0x300A00F5: ('SH', '1', "Block Tray ID", '', 'BlockTrayID'), 0x300A00F6: ('DS', '1', "Source to Block Tray Distance", '', 'SourceToBlockTrayDistance'), 0x300A00F7: ('FL', '1', "Isocenter to Block Tray Distance", '', 'IsocenterToBlockTrayDistance'), 0x300A00F8: ('CS', '1', "Block Type", '', 'BlockType'), 0x300A00F9: ('LO', '1', "Accessory Code", '', 'AccessoryCode'), 0x300A00FA: ('CS', '1', "Block Divergence", '', 'BlockDivergence'), 0x300A00FB: ('CS', '1', "Block Mounting Position", '', 'BlockMountingPosition'), 0x300A00FC: ('IS', '1', "Block Number", '', 'BlockNumber'), 0x300A00FE: ('LO', '1', "Block Name", '', 'BlockName'), 0x300A0100: ('DS', '1', "Block Thickness", '', 'BlockThickness'), 0x300A0102: ('DS', '1', "Block Transmission", '', 'BlockTransmission'), 0x300A0104: ('IS', '1', "Block Number of Points", '', 'BlockNumberOfPoints'), 0x300A0106: ('DS', '2-2n', "Block Data", '', 'BlockData'), 0x300A0107: ('SQ', '1', "Applicator Sequence", '', 'ApplicatorSequence'), 0x300A0108: ('SH', '1', "Applicator ID", '', 'ApplicatorID'), 0x300A0109: ('CS', '1', "Applicator Type", '', 'ApplicatorType'), 0x300A010A: ('LO', '1', "Applicator Description", '', 'ApplicatorDescription'), 0x300A010C: ('DS', '1', "Cumulative Dose Reference Coefficient", '', 'CumulativeDoseReferenceCoefficient'), 0x300A010E: ('DS', '1', "Final Cumulative Meterset Weight", '', 'FinalCumulativeMetersetWeight'), 0x300A0110: ('IS', '1', "Number of Control Points", '', 'NumberOfControlPoints'), 0x300A0111: ('SQ', '1', "Control Point Sequence", '', 'ControlPointSequence'), 0x300A0112: ('IS', '1', "Control Point Index", '', 'ControlPointIndex'), 0x300A0114: ('DS', '1', "Nominal Beam Energy", '', 'NominalBeamEnergy'), 0x300A0115: ('DS', '1', "Dose Rate Set", '', 'DoseRateSet'), 0x300A0116: ('SQ', '1', "Wedge Position Sequence", '', 'WedgePositionSequence'), 0x300A0118: ('CS', '1', "Wedge Position", '', 'WedgePosition'), 0x300A011A: ('SQ', '1', "Beam Limiting Device Position Sequence", '', 'BeamLimitingDevicePositionSequence'), 0x300A011C: ('DS', '2-2n', "Leaf/Jaw Positions", '', 'LeafJawPositions'), 0x300A011E: ('DS', '1', "Gantry Angle", '', 'GantryAngle'), 0x300A011F: ('CS', '1', "Gantry Rotation Direction", '', 'GantryRotationDirection'), 0x300A0120: ('DS', '1', "Beam Limiting Device Angle", '', 'BeamLimitingDeviceAngle'), 0x300A0121: ('CS', '1', "Beam Limiting Device Rotation Direction", '', 'BeamLimitingDeviceRotationDirection'), 0x300A0122: ('DS', '1', "Patient Support Angle", '', 'PatientSupportAngle'), 0x300A0123: ('CS', '1', "Patient Support Rotation Direction", '', 'PatientSupportRotationDirection'), 0x300A0124: ('DS', '1', "Table Top Eccentric Axis Distance", '', 'TableTopEccentricAxisDistance'), 0x300A0125: ('DS', '1', "Table Top Eccentric Angle", '', 'TableTopEccentricAngle'), 0x300A0126: ('CS', '1', "Table Top Eccentric Rotation Direction", '', 'TableTopEccentricRotationDirection'), 0x300A0128: ('DS', '1', "Table Top Vertical Position", '', 'TableTopVerticalPosition'), 0x300A0129: ('DS', '1', "Table Top Longitudinal Position", '', 'TableTopLongitudinalPosition'), 0x300A012A: ('DS', '1', "Table Top Lateral Position", '', 'TableTopLateralPosition'), 0x300A012C: ('DS', '3', "Isocenter Position", '', 'IsocenterPosition'), 0x300A012E: ('DS', '3', "Surface Entry Point", '', 'SurfaceEntryPoint'), 0x300A0130: ('DS', '1', "Source to Surface Distance", '', 'SourceToSurfaceDistance'), 0x300A0131: ('FL', '1', "Average Beam Dose Point Source to External Contour Distance", '', 'AverageBeamDosePointSourceToExternalContourDistance'), 0x300A0132: ('FL', '1', "Source to External Contour Distance", '', 'SourceToExternalContourDistance'), 0x300A0133: ('FL', '3', "External Contour Entry Point", '', 'ExternalContourEntryPoint'), 0x300A0134: ('DS', '1', "Cumulative Meterset Weight", '', 'CumulativeMetersetWeight'), 0x300A0140: ('FL', '1', "Table Top Pitch Angle", '', 'TableTopPitchAngle'), 0x300A0142: ('CS', '1', "Table Top Pitch Rotation Direction", '', 'TableTopPitchRotationDirection'), 0x300A0144: ('FL', '1', "Table Top Roll Angle", '', 'TableTopRollAngle'), 0x300A0146: ('CS', '1', "Table Top Roll Rotation Direction", '', 'TableTopRollRotationDirection'), 0x300A0148: ('FL', '1', "Head Fixation Angle", '', 'HeadFixationAngle'), 0x300A014A: ('FL', '1', "Gantry Pitch Angle", '', 'GantryPitchAngle'), 0x300A014C: ('CS', '1', "Gantry Pitch Rotation Direction", '', 'GantryPitchRotationDirection'), 0x300A014E: ('FL', '1', "Gantry Pitch Angle Tolerance", '', 'GantryPitchAngleTolerance'), 0x300A0150: ('CS', '1', "Fixation Eye", '', 'FixationEye'), 0x300A0151: ('DS', '1', "Chair Head Frame Position", '', 'ChairHeadFramePosition'), 0x300A0152: ('DS', '1', "Head Fixation Angle Tolerance", '', 'HeadFixationAngleTolerance'), 0x300A0153: ('DS', '1', "Chair Head Frame Position Tolerance", '', 'ChairHeadFramePositionTolerance'), 0x300A0154: ('DS', '1', "Fixation Light Azimuthal Angle Tolerance", '', 'FixationLightAzimuthalAngleTolerance'), 0x300A0155: ('DS', '1', "Fixation Light Polar Angle Tolerance", '', 'FixationLightPolarAngleTolerance'), 0x300A0180: ('SQ', '1', "Patient Setup Sequence", '', 'PatientSetupSequence'), 0x300A0182: ('IS', '1', "Patient Setup Number", '', 'PatientSetupNumber'), 0x300A0183: ('LO', '1', "Patient Setup Label", '', 'PatientSetupLabel'), 0x300A0184: ('LO', '1', "Patient Additional Position", '', 'PatientAdditionalPosition'), 0x300A0190: ('SQ', '1', "Fixation Device Sequence", '', 'FixationDeviceSequence'), 0x300A0192: ('CS', '1', "Fixation Device Type", '', 'FixationDeviceType'), 0x300A0194: ('SH', '1', "Fixation Device Label", '', 'FixationDeviceLabel'), 0x300A0196: ('ST', '1', "Fixation Device Description", '', 'FixationDeviceDescription'), 0x300A0198: ('SH', '1', "Fixation Device Position", '', 'FixationDevicePosition'), 0x300A0199: ('FL', '1', "Fixation Device Pitch Angle", '', 'FixationDevicePitchAngle'), 0x300A019A: ('FL', '1', "Fixation Device Roll Angle", '', 'FixationDeviceRollAngle'), 0x300A01A0: ('SQ', '1', "Shielding Device Sequence", '', 'ShieldingDeviceSequence'), 0x300A01A2: ('CS', '1', "Shielding Device Type", '', 'ShieldingDeviceType'), 0x300A01A4: ('SH', '1', "Shielding Device Label", '', 'ShieldingDeviceLabel'), 0x300A01A6: ('ST', '1', "Shielding Device Description", '', 'ShieldingDeviceDescription'), 0x300A01A8: ('SH', '1', "Shielding Device Position", '', 'ShieldingDevicePosition'), 0x300A01B0: ('CS', '1', "Setup Technique", '', 'SetupTechnique'), 0x300A01B2: ('ST', '1', "Setup Technique Description", '', 'SetupTechniqueDescription'), 0x300A01B4: ('SQ', '1', "Setup Device Sequence", '', 'SetupDeviceSequence'), 0x300A01B6: ('CS', '1', "Setup Device Type", '', 'SetupDeviceType'), 0x300A01B8: ('SH', '1', "Setup Device Label", '', 'SetupDeviceLabel'), 0x300A01BA: ('ST', '1', "Setup Device Description", '', 'SetupDeviceDescription'), 0x300A01BC: ('DS', '1', "Setup Device Parameter", '', 'SetupDeviceParameter'), 0x300A01D0: ('ST', '1', "Setup Reference Description", '', 'SetupReferenceDescription'), 0x300A01D2: ('DS', '1', "Table Top Vertical Setup Displacement", '', 'TableTopVerticalSetupDisplacement'), 0x300A01D4: ('DS', '1', "Table Top Longitudinal Setup Displacement", '', 'TableTopLongitudinalSetupDisplacement'), 0x300A01D6: ('DS', '1', "Table Top Lateral Setup Displacement", '', 'TableTopLateralSetupDisplacement'), 0x300A0200: ('CS', '1', "Brachy Treatment Technique", '', 'BrachyTreatmentTechnique'), 0x300A0202: ('CS', '1', "Brachy Treatment Type", '', 'BrachyTreatmentType'), 0x300A0206: ('SQ', '1', "Treatment Machine Sequence", '', 'TreatmentMachineSequence'), 0x300A0210: ('SQ', '1', "Source Sequence", '', 'SourceSequence'), 0x300A0212: ('IS', '1', "Source Number", '', 'SourceNumber'), 0x300A0214: ('CS', '1', "Source Type", '', 'SourceType'), 0x300A0216: ('LO', '1', "Source Manufacturer", '', 'SourceManufacturer'), 0x300A0218: ('DS', '1', "Active Source Diameter", '', 'ActiveSourceDiameter'), 0x300A021A: ('DS', '1', "Active Source Length", '', 'ActiveSourceLength'), 0x300A021B: ('SH', '1', "Source Model ID", '', 'SourceModelID'), 0x300A021C: ('LO', '1', "Source Description", '', 'SourceDescription'), 0x300A0222: ('DS', '1', "Source Encapsulation Nominal Thickness", '', 'SourceEncapsulationNominalThickness'), 0x300A0224: ('DS', '1', "Source Encapsulation Nominal Transmission", '', 'SourceEncapsulationNominalTransmission'), 0x300A0226: ('LO', '1', "Source Isotope Name", '', 'SourceIsotopeName'), 0x300A0228: ('DS', '1', "Source Isotope Half Life", '', 'SourceIsotopeHalfLife'), 0x300A0229: ('CS', '1', "Source Strength Units", '', 'SourceStrengthUnits'), 0x300A022A: ('DS', '1', "Reference Air Kerma Rate", '', 'ReferenceAirKermaRate'), 0x300A022B: ('DS', '1', "Source Strength", '', 'SourceStrength'), 0x300A022C: ('DA', '1', "Source Strength Reference Date", '', 'SourceStrengthReferenceDate'), 0x300A022E: ('TM', '1', "Source Strength Reference Time", '', 'SourceStrengthReferenceTime'), 0x300A0230: ('SQ', '1', "Application Setup Sequence", '', 'ApplicationSetupSequence'), 0x300A0232: ('CS', '1', "Application Setup Type", '', 'ApplicationSetupType'), 0x300A0234: ('IS', '1', "Application Setup Number", '', 'ApplicationSetupNumber'), 0x300A0236: ('LO', '1', "Application Setup Name", '', 'ApplicationSetupName'), 0x300A0238: ('LO', '1', "Application Setup Manufacturer", '', 'ApplicationSetupManufacturer'), 0x300A0240: ('IS', '1', "Template Number", '', 'TemplateNumber'), 0x300A0242: ('SH', '1', "Template Type", '', 'TemplateType'), 0x300A0244: ('LO', '1', "Template Name", '', 'TemplateName'), 0x300A0250: ('DS', '1', "Total Reference Air Kerma", '', 'TotalReferenceAirKerma'), 0x300A0260: ('SQ', '1', "Brachy Accessory Device Sequence", '', 'BrachyAccessoryDeviceSequence'), 0x300A0262: ('IS', '1', "Brachy Accessory Device Number", '', 'BrachyAccessoryDeviceNumber'), 0x300A0263: ('SH', '1', "Brachy Accessory Device ID", '', 'BrachyAccessoryDeviceID'), 0x300A0264: ('CS', '1', "Brachy Accessory Device Type", '', 'BrachyAccessoryDeviceType'), 0x300A0266: ('LO', '1', "Brachy Accessory Device Name", '', 'BrachyAccessoryDeviceName'), 0x300A026A: ('DS', '1', "Brachy Accessory Device Nominal Thickness", '', 'BrachyAccessoryDeviceNominalThickness'), 0x300A026C: ('DS', '1', "Brachy Accessory Device Nominal Transmission", '', 'BrachyAccessoryDeviceNominalTransmission'), 0x300A0271: ('DS', '1', "Channel Effective Length", '', 'ChannelEffectiveLength'), 0x300A0272: ('DS', '1', "Channel Inner Length", '', 'ChannelInnerLength'), 0x300A0273: ('SH', '1', "Afterloader Channel ID", '', 'AfterloaderChannelID'), 0x300A0274: ('DS', '1', "Source Applicator Tip Length", '', 'SourceApplicatorTipLength'), 0x300A0280: ('SQ', '1', "Channel Sequence", '', 'ChannelSequence'), 0x300A0282: ('IS', '1', "Channel Number", '', 'ChannelNumber'), 0x300A0284: ('DS', '1', "Channel Length", '', 'ChannelLength'), 0x300A0286: ('DS', '1', "Channel Total Time", '', 'ChannelTotalTime'), 0x300A0288: ('CS', '1', "Source Movement Type", '', 'SourceMovementType'), 0x300A028A: ('IS', '1', "Number of Pulses", '', 'NumberOfPulses'), 0x300A028C: ('DS', '1', "Pulse Repetition Interval", '', 'PulseRepetitionInterval'), 0x300A0290: ('IS', '1', "Source Applicator Number", '', 'SourceApplicatorNumber'), 0x300A0291: ('SH', '1', "Source Applicator ID", '', 'SourceApplicatorID'), 0x300A0292: ('CS', '1', "Source Applicator Type", '', 'SourceApplicatorType'), 0x300A0294: ('LO', '1', "Source Applicator Name", '', 'SourceApplicatorName'), 0x300A0296: ('DS', '1', "Source Applicator Length", '', 'SourceApplicatorLength'), 0x300A0298: ('LO', '1', "Source Applicator Manufacturer", '', 'SourceApplicatorManufacturer'), 0x300A029C: ('DS', '1', "Source Applicator Wall Nominal Thickness", '', 'SourceApplicatorWallNominalThickness'), 0x300A029E: ('DS', '1', "Source Applicator Wall Nominal Transmission", '', 'SourceApplicatorWallNominalTransmission'), 0x300A02A0: ('DS', '1', "Source Applicator Step Size", '', 'SourceApplicatorStepSize'), 0x300A02A1: ('IS', '1', "Applicator Shape Referenced ROI Number", '', 'ApplicatorShapeReferencedROINumber'), 0x300A02A2: ('IS', '1', "Transfer Tube Number", '', 'TransferTubeNumber'), 0x300A02A4: ('DS', '1', "Transfer Tube Length", '', 'TransferTubeLength'), 0x300A02B0: ('SQ', '1', "Channel Shield Sequence", '', 'ChannelShieldSequence'), 0x300A02B2: ('IS', '1', "Channel Shield Number", '', 'ChannelShieldNumber'), 0x300A02B3: ('SH', '1', "Channel Shield ID", '', 'ChannelShieldID'), 0x300A02B4: ('LO', '1', "Channel Shield Name", '', 'ChannelShieldName'), 0x300A02B8: ('DS', '1', "Channel Shield Nominal Thickness", '', 'ChannelShieldNominalThickness'), 0x300A02BA: ('DS', '1', "Channel Shield Nominal Transmission", '', 'ChannelShieldNominalTransmission'), 0x300A02C8: ('DS', '1', "Final Cumulative Time Weight", '', 'FinalCumulativeTimeWeight'), 0x300A02D0: ('SQ', '1', "Brachy Control Point Sequence", '', 'BrachyControlPointSequence'), 0x300A02D2: ('DS', '1', "Control Point Relative Position", '', 'ControlPointRelativePosition'), 0x300A02D4: ('DS', '3', "Control Point 3D Position", '', 'ControlPoint3DPosition'), 0x300A02D6: ('DS', '1', "Cumulative Time Weight", '', 'CumulativeTimeWeight'), 0x300A02E0: ('CS', '1', "Compensator Divergence", '', 'CompensatorDivergence'), 0x300A02E1: ('CS', '1', "Compensator Mounting Position", '', 'CompensatorMountingPosition'), 0x300A02E2: ('DS', '1-n', "Source to Compensator Distance", '', 'SourceToCompensatorDistance'), 0x300A02E3: ('FL', '1', "Total Compensator Tray Water-Equivalent Thickness", '', 'TotalCompensatorTrayWaterEquivalentThickness'), 0x300A02E4: ('FL', '1', "Isocenter to Compensator Tray Distance", '', 'IsocenterToCompensatorTrayDistance'), 0x300A02E5: ('FL', '1', "Compensator Column Offset", '', 'CompensatorColumnOffset'), 0x300A02E6: ('FL', '1-n', "Isocenter to Compensator Distances", '', 'IsocenterToCompensatorDistances'), 0x300A02E7: ('FL', '1', "Compensator Relative Stopping Power Ratio", '', 'CompensatorRelativeStoppingPowerRatio'), 0x300A02E8: ('FL', '1', "Compensator Milling Tool Diameter", '', 'CompensatorMillingToolDiameter'), 0x300A02EA: ('SQ', '1', "Ion Range Compensator Sequence", '', 'IonRangeCompensatorSequence'), 0x300A02EB: ('LT', '1', "Compensator Description", '', 'CompensatorDescription'), 0x300A0302: ('IS', '1', "Radiation Mass Number", '', 'RadiationMassNumber'), 0x300A0304: ('IS', '1', "Radiation Atomic Number", '', 'RadiationAtomicNumber'), 0x300A0306: ('SS', '1', "Radiation Charge State", '', 'RadiationChargeState'), 0x300A0308: ('CS', '1', "Scan Mode", '', 'ScanMode'), 0x300A0309: ('CS', '1', "Modulated Scan Mode Type", '', 'ModulatedScanModeType'), 0x300A030A: ('FL', '2', "Virtual Source-Axis Distances", '', 'VirtualSourceAxisDistances'), 0x300A030C: ('SQ', '1', "Snout Sequence", '', 'SnoutSequence'), 0x300A030D: ('FL', '1', "Snout Position", '', 'SnoutPosition'), 0x300A030F: ('SH', '1', "Snout ID", '', 'SnoutID'), 0x300A0312: ('IS', '1', "Number of Range Shifters", '', 'NumberOfRangeShifters'), 0x300A0314: ('SQ', '1', "Range Shifter Sequence", '', 'RangeShifterSequence'), 0x300A0316: ('IS', '1', "Range Shifter Number", '', 'RangeShifterNumber'), 0x300A0318: ('SH', '1', "Range Shifter ID", '', 'RangeShifterID'), 0x300A0320: ('CS', '1', "Range Shifter Type", '', 'RangeShifterType'), 0x300A0322: ('LO', '1', "Range Shifter Description", '', 'RangeShifterDescription'), 0x300A0330: ('IS', '1', "Number of Lateral Spreading Devices", '', 'NumberOfLateralSpreadingDevices'), 0x300A0332: ('SQ', '1', "Lateral Spreading Device Sequence", '', 'LateralSpreadingDeviceSequence'), 0x300A0334: ('IS', '1', "Lateral Spreading Device Number", '', 'LateralSpreadingDeviceNumber'), 0x300A0336: ('SH', '1', "Lateral Spreading Device ID", '', 'LateralSpreadingDeviceID'), 0x300A0338: ('CS', '1', "Lateral Spreading Device Type", '', 'LateralSpreadingDeviceType'), 0x300A033A: ('LO', '1', "Lateral Spreading Device Description", '', 'LateralSpreadingDeviceDescription'), 0x300A033C: ('FL', '1', "Lateral Spreading Device Water Equivalent Thickness", '', 'LateralSpreadingDeviceWaterEquivalentThickness'), 0x300A0340: ('IS', '1', "Number of Range Modulators", '', 'NumberOfRangeModulators'), 0x300A0342: ('SQ', '1', "Range Modulator Sequence", '', 'RangeModulatorSequence'), 0x300A0344: ('IS', '1', "Range Modulator Number", '', 'RangeModulatorNumber'), 0x300A0346: ('SH', '1', "Range Modulator ID", '', 'RangeModulatorID'), 0x300A0348: ('CS', '1', "Range Modulator Type", '', 'RangeModulatorType'), 0x300A034A: ('LO', '1', "Range Modulator Description", '', 'RangeModulatorDescription'), 0x300A034C: ('SH', '1', "Beam Current Modulation ID", '', 'BeamCurrentModulationID'), 0x300A0350: ('CS', '1', "Patient Support Type", '', 'PatientSupportType'), 0x300A0352: ('SH', '1', "Patient Support ID", '', 'PatientSupportID'), 0x300A0354: ('LO', '1', "Patient Support Accessory Code", '', 'PatientSupportAccessoryCode'), 0x300A0355: ('LO', '1', "Tray Accessory Code", '', 'TrayAccessoryCode'), 0x300A0356: ('FL', '1', "Fixation Light Azimuthal Angle", '', 'FixationLightAzimuthalAngle'), 0x300A0358: ('FL', '1', "Fixation Light Polar Angle", '', 'FixationLightPolarAngle'), 0x300A035A: ('FL', '1', "Meterset Rate", '', 'MetersetRate'), 0x300A0360: ('SQ', '1', "Range Shifter Settings Sequence", '', 'RangeShifterSettingsSequence'), 0x300A0362: ('LO', '1', "Range Shifter Setting", '', 'RangeShifterSetting'), 0x300A0364: ('FL', '1', "Isocenter to Range Shifter Distance", '', 'IsocenterToRangeShifterDistance'), 0x300A0366: ('FL', '1', "Range Shifter Water Equivalent Thickness", '', 'RangeShifterWaterEquivalentThickness'), 0x300A0370: ('SQ', '1', "Lateral Spreading Device Settings Sequence", '', 'LateralSpreadingDeviceSettingsSequence'), 0x300A0372: ('LO', '1', "Lateral Spreading Device Setting", '', 'LateralSpreadingDeviceSetting'), 0x300A0374: ('FL', '1', "Isocenter to Lateral Spreading Device Distance", '', 'IsocenterToLateralSpreadingDeviceDistance'), 0x300A0380: ('SQ', '1', "Range Modulator Settings Sequence", '', 'RangeModulatorSettingsSequence'), 0x300A0382: ('FL', '1', "Range Modulator Gating Start Value", '', 'RangeModulatorGatingStartValue'), 0x300A0384: ('FL', '1', "Range Modulator Gating Stop Value", '', 'RangeModulatorGatingStopValue'), 0x300A0386: ('FL', '1', "Range Modulator Gating Start Water Equivalent Thickness", '', 'RangeModulatorGatingStartWaterEquivalentThickness'), 0x300A0388: ('FL', '1', "Range Modulator Gating Stop Water Equivalent Thickness", '', 'RangeModulatorGatingStopWaterEquivalentThickness'), 0x300A038A: ('FL', '1', "Isocenter to Range Modulator Distance", '', 'IsocenterToRangeModulatorDistance'), 0x300A038F: ('FL', '1-n', "Scan Spot Time Offset", '', 'ScanSpotTimeOffset'), 0x300A0390: ('SH', '1', "Scan Spot Tune ID", '', 'ScanSpotTuneID'), 0x300A0391: ('IS', '1-n', "Scan Spot Prescribed Indices", '', 'ScanSpotPrescribedIndices'), 0x300A0392: ('IS', '1', "Number of Scan Spot Positions", '', 'NumberOfScanSpotPositions'), 0x300A0393: ('CS', '1', "Scan Spot Reordered", '', 'ScanSpotReordered'), 0x300A0394: ('FL', '1-n', "Scan Spot Position Map", '', 'ScanSpotPositionMap'), 0x300A0395: ('CS', '1', "Scan Spot Reordering Allowed", '', 'ScanSpotReorderingAllowed'), 0x300A0396: ('FL', '1-n', "Scan Spot Meterset Weights", '', 'ScanSpotMetersetWeights'), 0x300A0398: ('FL', '2', "Scanning Spot Size", '', 'ScanningSpotSize'), 0x300A0399: ('FL', '2-2n', "Scan Spot Sizes Delivered", '', 'ScanSpotSizesDelivered'), 0x300A039A: ('IS', '1', "Number of Paintings", '', 'NumberOfPaintings'), 0x300A03A0: ('SQ', '1', "Ion Tolerance Table Sequence", '', 'IonToleranceTableSequence'), 0x300A03A2: ('SQ', '1', "Ion Beam Sequence", '', 'IonBeamSequence'), 0x300A03A4: ('SQ', '1', "Ion Beam Limiting Device Sequence", '', 'IonBeamLimitingDeviceSequence'), 0x300A03A6: ('SQ', '1', "Ion Block Sequence", '', 'IonBlockSequence'), 0x300A03A8: ('SQ', '1', "Ion Control Point Sequence", '', 'IonControlPointSequence'), 0x300A03AA: ('SQ', '1', "Ion Wedge Sequence", '', 'IonWedgeSequence'), 0x300A03AC: ('SQ', '1', "Ion Wedge Position Sequence", '', 'IonWedgePositionSequence'), 0x300A0401: ('SQ', '1', "Referenced Setup Image Sequence", '', 'ReferencedSetupImageSequence'), 0x300A0402: ('ST', '1', "Setup Image Comment", '', 'SetupImageComment'), 0x300A0410: ('SQ', '1', "Motion Synchronization Sequence", '', 'MotionSynchronizationSequence'), 0x300A0412: ('FL', '3', "Control Point Orientation", '', 'ControlPointOrientation'), 0x300A0420: ('SQ', '1', "General Accessory Sequence", '', 'GeneralAccessorySequence'), 0x300A0421: ('SH', '1', "General Accessory ID", '', 'GeneralAccessoryID'), 0x300A0422: ('ST', '1', "General Accessory Description", '', 'GeneralAccessoryDescription'), 0x300A0423: ('CS', '1', "General Accessory Type", '', 'GeneralAccessoryType'), 0x300A0424: ('IS', '1', "General Accessory Number", '', 'GeneralAccessoryNumber'), 0x300A0425: ('FL', '1', "Source to General Accessory Distance", '', 'SourceToGeneralAccessoryDistance'), 0x300A0426: ('DS', '1', "Isocenter to General Accessory Distance", '', 'IsocenterToGeneralAccessoryDistance'), 0x300A0431: ('SQ', '1', "Applicator Geometry Sequence", '', 'ApplicatorGeometrySequence'), 0x300A0432: ('CS', '1', "Applicator Aperture Shape", '', 'ApplicatorApertureShape'), 0x300A0433: ('FL', '1', "Applicator Opening", '', 'ApplicatorOpening'), 0x300A0434: ('FL', '1', "Applicator Opening X", '', 'ApplicatorOpeningX'), 0x300A0435: ('FL', '1', "Applicator Opening Y", '', 'ApplicatorOpeningY'), 0x300A0436: ('FL', '1', "Source to Applicator Mounting Position Distance", '', 'SourceToApplicatorMountingPositionDistance'), 0x300A0440: ('IS', '1', "Number of Block Slab Items", '', 'NumberOfBlockSlabItems'), 0x300A0441: ('SQ', '1', "Block Slab Sequence", '', 'BlockSlabSequence'), 0x300A0442: ('DS', '1', "Block Slab Thickness", '', 'BlockSlabThickness'), 0x300A0443: ('US', '1', "Block Slab Number", '', 'BlockSlabNumber'), 0x300A0450: ('SQ', '1', "Device Motion Control Sequence", '', 'DeviceMotionControlSequence'), 0x300A0451: ('CS', '1', "Device Motion Execution Mode", '', 'DeviceMotionExecutionMode'), 0x300A0452: ('CS', '1', "Device Motion Observation Mode", '', 'DeviceMotionObservationMode'), 0x300A0453: ('SQ', '1', "Device Motion Parameter Code Sequence", '', 'DeviceMotionParameterCodeSequence'), 0x300A0501: ('FL', '1', "Distal Depth Fraction", '', 'DistalDepthFraction'), 0x300A0502: ('FL', '1', "Distal Depth", '', 'DistalDepth'), 0x300A0503: ('FL', '2', "Nominal Range Modulation Fractions", '', 'NominalRangeModulationFractions'), 0x300A0504: ('FL', '2', "Nominal Range Modulated Region Depths", '', 'NominalRangeModulatedRegionDepths'), 0x300A0505: ('SQ', '1', "Depth Dose Parameters Sequence", '', 'DepthDoseParametersSequence'), 0x300A0506: ('SQ', '1', "Delivered Depth Dose Parameters Sequence", '', 'DeliveredDepthDoseParametersSequence'), 0x300A0507: ('FL', '1', "Delivered Distal Depth Fraction", '', 'DeliveredDistalDepthFraction'), 0x300A0508: ('FL', '1', "Delivered Distal Depth", '', 'DeliveredDistalDepth'), 0x300A0509: ('FL', '2', "Delivered Nominal Range Modulation Fractions", '', 'DeliveredNominalRangeModulationFractions'), 0x300A0510: ('FL', '2', "Delivered Nominal Range Modulated Region Depths", '', 'DeliveredNominalRangeModulatedRegionDepths'), 0x300A0511: ('CS', '1', "Delivered Reference Dose Definition", '', 'DeliveredReferenceDoseDefinition'), 0x300A0512: ('CS', '1', "Reference Dose Definition", '', 'ReferenceDoseDefinition'), 0x300A0600: ('US', '1', "RT Control Point Index", '', 'RTControlPointIndex'), 0x300A0601: ('US', '1', "Radiation Generation Mode Index", '', 'RadiationGenerationModeIndex'), 0x300A0602: ('US', '1', "Referenced Defined Device Index", '', 'ReferencedDefinedDeviceIndex'), 0x300A0603: ('US', '1', "Radiation Dose Identification Index", '', 'RadiationDoseIdentificationIndex'), 0x300A0604: ('US', '1', "Number of RT Control Points", '', 'NumberOfRTControlPoints'), 0x300A0605: ('US', '1', "Referenced Radiation Generation Mode Index", '', 'ReferencedRadiationGenerationModeIndex'), 0x300A0606: ('US', '1', "Treatment Position Index", '', 'TreatmentPositionIndex'), 0x300A0607: ('US', '1', "Referenced Device Index", '', 'ReferencedDeviceIndex'), 0x300A0608: ('LO', '1', "Treatment Position Group Label", '', 'TreatmentPositionGroupLabel'), 0x300A0609: ('UI', '1', "Treatment Position Group UID", '', 'TreatmentPositionGroupUID'), 0x300A060A: ('SQ', '1', "Treatment Position Group Sequence", '', 'TreatmentPositionGroupSequence'), 0x300A060B: ('US', '1', "Referenced Treatment Position Index", '', 'ReferencedTreatmentPositionIndex'), 0x300A060C: ('US', '1', "Referenced Radiation Dose Identification Index", '', 'ReferencedRadiationDoseIdentificationIndex'), 0x300A060D: ('FD', '1', "RT Accessory Holder Water-Equivalent Thickness", '', 'RTAccessoryHolderWaterEquivalentThickness'), 0x300A060E: ('US', '1', "Referenced RT Accessory Holder Device Index", '', 'ReferencedRTAccessoryHolderDeviceIndex'), 0x300A060F: ('CS', '1', "RT Accessory Holder Slot Existence Flag", '', 'RTAccessoryHolderSlotExistenceFlag'), 0x300A0610: ('SQ', '1', "RT Accessory Holder Slot Sequence", '', 'RTAccessoryHolderSlotSequence'), 0x300A0611: ('LO', '1', "RT Accessory Holder Slot ID", '', 'RTAccessoryHolderSlotID'), 0x300A0612: ('FD', '1', "RT Accessory Holder Slot Distance", '', 'RTAccessoryHolderSlotDistance'), 0x300A0613: ('FD', '1', "RT Accessory Slot Distance", '', 'RTAccessorySlotDistance'), 0x300A0614: ('SQ', '1', "RT Accessory Holder Definition Sequence", '', 'RTAccessoryHolderDefinitionSequence'), 0x300A0615: ('LO', '1', "RT Accessory Device Slot ID", '', 'RTAccessoryDeviceSlotID'), 0x300A0616: ('SQ', '1', "RT Radiation Sequence", '', 'RTRadiationSequence'), 0x300A0617: ('SQ', '1', "Radiation Dose Sequence", '', 'RadiationDoseSequence'), 0x300A0618: ('SQ', '1', "Radiation Dose Identification Sequence", '', 'RadiationDoseIdentificationSequence'), 0x300A0619: ('LO', '1', "Radiation Dose Identification Label", '', 'RadiationDoseIdentificationLabel'), 0x300A061A: ('CS', '1', "Reference Dose Type", '', 'ReferenceDoseType'), 0x300A061B: ('CS', '1', "Primary Dose Value Indicator", '', 'PrimaryDoseValueIndicator'), 0x300A061C: ('SQ', '1', "Dose Values Sequence", '', 'DoseValuesSequence'), 0x300A061D: ('CS', '1-n', "Dose Value Purpose", '', 'DoseValuePurpose'), 0x300A061E: ('FD', '3', "Reference Dose Point Coordinates", '', 'ReferenceDosePointCoordinates'), 0x300A061F: ('SQ', '1', "Radiation Dose Values Parameters Sequence", '', 'RadiationDoseValuesParametersSequence'), 0x300A0620: ('SQ', '1', "Meterset to Dose Mapping Sequence", '', 'MetersetToDoseMappingSequence'), 0x300A0621: ('SQ', '1', "Expected In-Vivo Measurement Values Sequence", '', 'ExpectedInVivoMeasurementValuesSequence'), 0x300A0622: ('US', '1', "Expected In-Vivo Measurement Value Index", '', 'ExpectedInVivoMeasurementValueIndex'), 0x300A0623: ('LO', '1', "Radiation Dose In-Vivo Measurement Label", '', 'RadiationDoseInVivoMeasurementLabel'), 0x300A0624: ('FD', '2', "Radiation Dose Central Axis Displacement", '', 'RadiationDoseCentralAxisDisplacement'), 0x300A0625: ('FD', '1', "Radiation Dose Value", '', 'RadiationDoseValue'), 0x300A0626: ('FD', '1', "Radiation Dose Source to Skin Distance", '', 'RadiationDoseSourceToSkinDistance'), 0x300A0627: ('FD', '3', "Radiation Dose Measurement Point Coordinates", '', 'RadiationDoseMeasurementPointCoordinates'), 0x300A0628: ('FD', '1', "Radiation Dose Source to External Contour Distance", '', 'RadiationDoseSourceToExternalContourDistance'), 0x300A0629: ('SQ', '1', "RT Tolerance Set Sequence", '', 'RTToleranceSetSequence'), 0x300A062A: ('LO', '1', "RT Tolerance Set Label", '', 'RTToleranceSetLabel'), 0x300A062B: ('SQ', '1', "Attribute Tolerance Values Sequence", '', 'AttributeToleranceValuesSequence'), 0x300A062C: ('FD', '1', "Tolerance Value", '', 'ToleranceValue'), 0x300A062D: ('SQ', '1', "Patient Support Position Tolerance Sequence", '', 'PatientSupportPositionToleranceSequence'), 0x300A062E: ('FD', '1', "Treatment Time Limit", '', 'TreatmentTimeLimit'), 0x300A062F: ('SQ', '1', "C-Arm Photon-Electron Control Point Sequence", '', 'CArmPhotonElectronControlPointSequence'), 0x300A0630: ('SQ', '1', "Referenced RT Radiation Sequence", '', 'ReferencedRTRadiationSequence'), 0x300A0631: ('SQ', '1', "Referenced RT Instance Sequence", '', 'ReferencedRTInstanceSequence'), 0x300A0632: ('SQ', '1', "Referenced RT Patient Setup Sequence", 'Retired', 'ReferencedRTPatientSetupSequence'), 0x300A0634: ('FD', '1', "Source to Patient Surface Distance", '', 'SourceToPatientSurfaceDistance'), 0x300A0635: ('SQ', '1', "Treatment Machine Special Mode Code Sequence", '', 'TreatmentMachineSpecialModeCodeSequence'), 0x300A0636: ('US', '1', "Intended Number of Fractions", '', 'IntendedNumberOfFractions'), 0x300A0637: ('CS', '1', "RT Radiation Set Intent", '', 'RTRadiationSetIntent'), 0x300A0638: ('CS', '1', "RT Radiation Physical and Geometric Content Detail Flag", '', 'RTRadiationPhysicalAndGeometricContentDetailFlag'), 0x300A0639: ('CS', '1', "RT Record Flag", '', 'RTRecordFlag'), 0x300A063A: ('SQ', '1', "Treatment Device Identification Sequence", '', 'TreatmentDeviceIdentificationSequence'), 0x300A063B: ('SQ', '1', "Referenced RT Physician Intent Sequence", '', 'ReferencedRTPhysicianIntentSequence'), 0x300A063C: ('FD', '1', "Cumulative Meterset", '', 'CumulativeMeterset'), 0x300A063D: ('FD', '1', "Delivery Rate", '', 'DeliveryRate'), 0x300A063E: ('SQ', '1', "Delivery Rate Unit Sequence", '', 'DeliveryRateUnitSequence'), 0x300A063F: ('SQ', '1', "Treatment Position Sequence", '', 'TreatmentPositionSequence'), 0x300A0640: ('FD', '1', "Radiation Source-Axis Distance", '', 'RadiationSourceAxisDistance'), 0x300A0641: ('US', '1', "Number of RT Beam Limiting Devices", '', 'NumberOfRTBeamLimitingDevices'), 0x300A0642: ('FD', '1', "RT Beam Limiting Device Proximal Distance", '', 'RTBeamLimitingDeviceProximalDistance'), 0x300A0643: ('FD', '1', "RT Beam Limiting Device Distal Distance", '', 'RTBeamLimitingDeviceDistalDistance'), 0x300A0644: ('SQ', '1', "Parallel RT Beam Delimiter Device Orientation Label Code Sequence", '', 'ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence'), 0x300A0645: ('FD', '1', "Beam Modifier Orientation Angle", '', 'BeamModifierOrientationAngle'), 0x300A0646: ('SQ', '1', "Fixed RT Beam Delimiter Device Sequence", '', 'FixedRTBeamDelimiterDeviceSequence'), 0x300A0647: ('SQ', '1', "Parallel RT Beam Delimiter Device Sequence", '', 'ParallelRTBeamDelimiterDeviceSequence'), 0x300A0648: ('US', '1', "Number of Parallel RT Beam Delimiters", '', 'NumberOfParallelRTBeamDelimiters'), 0x300A0649: ('FD', '2-n', "Parallel RT Beam Delimiter Boundaries", '', 'ParallelRTBeamDelimiterBoundaries'), 0x300A064A: ('FD', '2-n', "Parallel RT Beam Delimiter Positions", '', 'ParallelRTBeamDelimiterPositions'), 0x300A064B: ('FD', '2', "RT Beam Limiting Device Offset", '', 'RTBeamLimitingDeviceOffset'), 0x300A064C: ('SQ', '1', "RT Beam Delimiter Geometry Sequence", '', 'RTBeamDelimiterGeometrySequence'), 0x300A064D: ('SQ', '1', "RT Beam Limiting Device Definition Sequence", '', 'RTBeamLimitingDeviceDefinitionSequence'), 0x300A064E: ('CS', '1', "Parallel RT Beam Delimiter Opening Mode", '', 'ParallelRTBeamDelimiterOpeningMode'), 0x300A064F: ('CS', '1-n', "Parallel RT Beam Delimiter Leaf Mounting Side", '', 'ParallelRTBeamDelimiterLeafMountingSide'), 0x300A0650: ('UI', '1', "Patient Setup UID", 'Retired', 'PatientSetupUID'), 0x300A0651: ('SQ', '1', "Wedge Definition Sequence", '', 'WedgeDefinitionSequence'), 0x300A0652: ('FD', '1', "Radiation Beam Wedge Angle", '', 'RadiationBeamWedgeAngle'), 0x300A0653: ('FD', '1', "Radiation Beam Wedge Thin Edge Distance", '', 'RadiationBeamWedgeThinEdgeDistance'), 0x300A0654: ('FD', '1', "Radiation Beam Effective Wedge Angle", '', 'RadiationBeamEffectiveWedgeAngle'), 0x300A0655: ('US', '1', "Number of Wedge Positions", '', 'NumberOfWedgePositions'), 0x300A0656: ('SQ', '1', "RT Beam Limiting Device Opening Sequence", '', 'RTBeamLimitingDeviceOpeningSequence'), 0x300A0657: ('US', '1', "Number of RT Beam Limiting Device Openings", '', 'NumberOfRTBeamLimitingDeviceOpenings'), 0x300A0658: ('SQ', '1', "Radiation Dosimeter Unit Sequence", '', 'RadiationDosimeterUnitSequence'), 0x300A0659: ('SQ', '1', "RT Device Distance Reference Location Code Sequence", '', 'RTDeviceDistanceReferenceLocationCodeSequence'), 0x300A065A: ('SQ', '1', "Radiation Device Configuration and Commissioning Key Sequence", '', 'RadiationDeviceConfigurationAndCommissioningKeySequence'), 0x300A065B: ('SQ', '1', "Patient Support Position Parameter Sequence", '', 'PatientSupportPositionParameterSequence'), 0x300A065C: ('CS', '1', "Patient Support Position Specification Method", '', 'PatientSupportPositionSpecificationMethod'), 0x300A065D: ('SQ', '1', "Patient Support Position Device Parameter Sequence", '', 'PatientSupportPositionDeviceParameterSequence'), 0x300A065E: ('US', '1', "Device Order Index", '', 'DeviceOrderIndex'), 0x300A065F: ('US', '1', "Patient Support Position Parameter Order Index", '', 'PatientSupportPositionParameterOrderIndex'), 0x300A0660: ('SQ', '1', "Patient Support Position Device Tolerance Sequence", '', 'PatientSupportPositionDeviceToleranceSequence'), 0x300A0661: ('US', '1', "Patient Support Position Tolerance Order Index", '', 'PatientSupportPositionToleranceOrderIndex'), 0x300A0662: ('SQ', '1', "Compensator Definition Sequence", '', 'CompensatorDefinitionSequence'), 0x300A0663: ('CS', '1', "Compensator Map Orientation", '', 'CompensatorMapOrientation'), 0x300A0664: ('OF', '1', "Compensator Proximal Thickness Map", '', 'CompensatorProximalThicknessMap'), 0x300A0665: ('OF', '1', "Compensator Distal Thickness Map", '', 'CompensatorDistalThicknessMap'), 0x300A0666: ('FD', '1', "Compensator Base Plane Offset", '', 'CompensatorBasePlaneOffset'), 0x300A0667: ('SQ', '1', "Compensator Shape Fabrication Code Sequence", '', 'CompensatorShapeFabricationCodeSequence'), 0x300A0668: ('SQ', '1', "Compensator Shape Sequence", '', 'CompensatorShapeSequence'), 0x300A0669: ('FD', '1', "Radiation Beam Compensator Milling Tool Diameter", '', 'RadiationBeamCompensatorMillingToolDiameter'), 0x300A066A: ('SQ', '1', "Block Definition Sequence", '', 'BlockDefinitionSequence'), 0x300A066B: ('OF', '1', "Block Edge Data", '', 'BlockEdgeData'), 0x300A066C: ('CS', '1', "Block Orientation", '', 'BlockOrientation'), 0x300A066D: ('FD', '1', "Radiation Beam Block Thickness", '', 'RadiationBeamBlockThickness'), 0x300A066E: ('FD', '1', "Radiation Beam Block Slab Thickness", '', 'RadiationBeamBlockSlabThickness'), 0x300A066F: ('SQ', '1', "Block Edge Data Sequence", '', 'BlockEdgeDataSequence'), 0x300A0670: ('US', '1', "Number of RT Accessory Holders", '', 'NumberOfRTAccessoryHolders'), 0x300A0671: ('SQ', '1', "General Accessory Definition Sequence", '', 'GeneralAccessoryDefinitionSequence'), 0x300A0672: ('US', '1', "Number of General Accessories", '', 'NumberOfGeneralAccessories'), 0x300A0673: ('SQ', '1', "Bolus Definition Sequence", '', 'BolusDefinitionSequence'), 0x300A0674: ('US', '1', "Number of Boluses", '', 'NumberOfBoluses'), 0x300A0675: ('UI', '1', "Equipment Frame of Reference UID", '', 'EquipmentFrameOfReferenceUID'), 0x300A0676: ('ST', '1', "Equipment Frame of Reference Description", '', 'EquipmentFrameOfReferenceDescription'), 0x300A0677: ('SQ', '1', "Equipment Reference Point Coordinates Sequence", '', 'EquipmentReferencePointCoordinatesSequence'), 0x300A0678: ('SQ', '1', "Equipment Reference Point Code Sequence", '', 'EquipmentReferencePointCodeSequence'), 0x300A0679: ('FD', '1', "RT Beam Limiting Device Angle", '', 'RTBeamLimitingDeviceAngle'), 0x300A067A: ('FD', '1', "Source Roll Angle", '', 'SourceRollAngle'), 0x300A067B: ('SQ', '1', "Radiation GenerationMode Sequence", '', 'RadiationGenerationModeSequence'), 0x300A067C: ('SH', '1', "Radiation GenerationMode Label", '', 'RadiationGenerationModeLabel'), 0x300A067D: ('ST', '1', "Radiation GenerationMode Description", '', 'RadiationGenerationModeDescription'), 0x300A067E: ('SQ', '1', "Radiation GenerationMode Machine Code Sequence", '', 'RadiationGenerationModeMachineCodeSequence'), 0x300A067F: ('SQ', '1', "Radiation Type Code Sequence", '', 'RadiationTypeCodeSequence'), 0x300A0680: ('DS', '1', "Nominal Energy", '', 'NominalEnergy'), 0x300A0681: ('DS', '1', "Minimum Nominal Energy", '', 'MinimumNominalEnergy'), 0x300A0682: ('DS', '1', "Maximum Nominal Energy", '', 'MaximumNominalEnergy'), 0x300A0683: ('SQ', '1', "Radiation Fluence Modifier Code Sequence", '', 'RadiationFluenceModifierCodeSequence'), 0x300A0684: ('SQ', '1', "Energy Unit Code Sequence", '', 'EnergyUnitCodeSequence'), 0x300A0685: ('US', '1', "Number of Radiation GenerationModes", '', 'NumberOfRadiationGenerationModes'), 0x300A0686: ('SQ', '1', "Patient Support Devices Sequence", '', 'PatientSupportDevicesSequence'), 0x300A0687: ('US', '1', "Number of Patient Support Devices", '', 'NumberOfPatientSupportDevices'), 0x300A0688: ('FD', '1', "RT Beam Modifier Definition Distance", '', 'RTBeamModifierDefinitionDistance'), 0x300A0689: ('SQ', '1', "Beam Area Limit Sequence", '', 'BeamAreaLimitSequence'), 0x300A068A: ('SQ', '1', "Referenced RT Prescription Sequence", '', 'ReferencedRTPrescriptionSequence'), 0x300A068B: ('CS', '1', "Dose Value Interpretation", '', 'DoseValueInterpretation'), 0x300A0700: ('UI', '1', "Treatment Session UID", '', 'TreatmentSessionUID'), 0x300A0701: ('CS', '1', "RT Radiation Usage", '', 'RTRadiationUsage'), 0x300A0702: ('SQ', '1', "Referenced RT Radiation Set Sequence", '', 'ReferencedRTRadiationSetSequence'), 0x300A0703: ('SQ', '1', "Referenced RT Radiation Record Sequence", '', 'ReferencedRTRadiationRecordSequence'), 0x300A0704: ('US', '1', "RT Radiation Set Delivery Number", '', 'RTRadiationSetDeliveryNumber'), 0x300A0705: ('US', '1', "Clinical Fraction Number", '', 'ClinicalFractionNumber'), 0x300A0706: ('CS', '1', "RT Treatment Fraction Completion Status", '', 'RTTreatmentFractionCompletionStatus'), 0x300A0707: ('CS', '1', "RT Radiation Set Usage", '', 'RTRadiationSetUsage'), 0x300A0708: ('CS', '1', "Treatment Delivery Continuation Flag", '', 'TreatmentDeliveryContinuationFlag'), 0x300A0709: ('CS', '1', "Treatment Record Content Origin", '', 'TreatmentRecordContentOrigin'), 0x300A0714: ('CS', '1', "RT Treatment Termination Status", '', 'RTTreatmentTerminationStatus'), 0x300A0715: ('SQ', '1', "RT Treatment Termination Reason Code Sequence", '', 'RTTreatmentTerminationReasonCodeSequence'), 0x300A0716: ('SQ', '1', "Machine-Specific Treatment Termination Code Sequence", '', 'MachineSpecificTreatmentTerminationCodeSequence'), 0x300A0722: ('SQ', '1', "RT Radiation Salvage Record Control Point Sequence", '', 'RTRadiationSalvageRecordControlPointSequence'), 0x300A0723: ('CS', '1', "Starting Meterset Value Known Flag", '', 'StartingMetersetValueKnownFlag'), 0x300A0730: ('ST', '1', "Treatment Termination Description", '', 'TreatmentTerminationDescription'), 0x300A0731: ('SQ', '1', "Treatment Tolerance Violation Sequence", '', 'TreatmentToleranceViolationSequence'), 0x300A0732: ('CS', '1', "Treatment Tolerance Violation Category", '', 'TreatmentToleranceViolationCategory'), 0x300A0733: ('SQ', '1', "Treatment Tolerance Violation Attribute Sequence", '', 'TreatmentToleranceViolationAttributeSequence'), 0x300A0734: ('ST', '1', "Treatment Tolerance Violation Description", '', 'TreatmentToleranceViolationDescription'), 0x300A0735: ('ST', '1', "Treatment Tolerance Violation Identification", '', 'TreatmentToleranceViolationIdentification'), 0x300A0736: ('DT', '1', "Treatment Tolerance Violation DateTime", '', 'TreatmentToleranceViolationDateTime'), 0x300A073A: ('DT', '1', "Recorded RT Control Point DateTime", '', 'RecordedRTControlPointDateTime'), 0x300A073B: ('US', '1', "Referenced Radiation RT Control Point Index", '', 'ReferencedRadiationRTControlPointIndex'), 0x300A073E: ('SQ', '1', "Alternate Value Sequence", '', 'AlternateValueSequence'), 0x300A073F: ('SQ', '1', "Confirmation Sequence", '', 'ConfirmationSequence'), 0x300A0740: ('SQ', '1', "Interlock Sequence", '', 'InterlockSequence'), 0x300A0741: ('DT', '1', "Interlock DateTime", '', 'InterlockDateTime'), 0x300A0742: ('ST', '1', "Interlock Description", '', 'InterlockDescription'), 0x300A0743: ('SQ', '1', "Interlock Originating Device Sequence", '', 'InterlockOriginatingDeviceSequence'), 0x300A0744: ('SQ', '1', "Interlock Code Sequence", '', 'InterlockCodeSequence'), 0x300A0745: ('SQ', '1', "Interlock Resolution Code Sequence", '', 'InterlockResolutionCodeSequence'), 0x300A0746: ('SQ', '1', "Interlock Resolution User Sequence", '', 'InterlockResolutionUserSequence'), 0x300A0760: ('DT', '1', "Override DateTime", '', 'OverrideDateTime'), 0x300A0761: ('SQ', '1', "Treatment Tolerance Violation Type Code Sequence", '', 'TreatmentToleranceViolationTypeCodeSequence'), 0x300A0762: ('SQ', '1', "Treatment Tolerance Violation Cause Code Sequence", '', 'TreatmentToleranceViolationCauseCodeSequence'), 0x300A0772: ('SQ', '1', "Measured Meterset to Dose Mapping Sequence", '', 'MeasuredMetersetToDoseMappingSequence'), 0x300A0773: ('US', '1', "Referenced Expected In-Vivo Measurement Value Index", '', 'ReferencedExpectedInVivoMeasurementValueIndex'), 0x300A0774: ('SQ', '1', "Dose Measurement Device Code Sequence", '', 'DoseMeasurementDeviceCodeSequence'), 0x300A0780: ('SQ', '1', "Additional Parameter Recording Instance Sequence", '', 'AdditionalParameterRecordingInstanceSequence'), 0x300A0782: ('US', '1', "", 'Retired', ''), 0x300A0783: ('ST', '1', "Interlock Origin Description", '', 'InterlockOriginDescription'), 0x300A0784: ('SQ', '1', "RT Patient Position Scope Sequence", '', 'RTPatientPositionScopeSequence'), 0x300A0785: ('UI', '1', "Referenced Treatment Position Group UID", '', 'ReferencedTreatmentPositionGroupUID'), 0x300A0786: ('US', '1', "Radiation Order Index", '', 'RadiationOrderIndex'), 0x300A0787: ('SQ', '1', "Omitted Radiation Sequence", '', 'OmittedRadiationSequence'), 0x300A0788: ('SQ', '1', "Reason for Omission Code Sequence", '', 'ReasonForOmissionCodeSequence'), 0x300A0789: ('SQ', '1', "RT Delivery Start Patient Position Sequence", '', 'RTDeliveryStartPatientPositionSequence'), 0x300A078A: ('SQ', '1', "RT Treatment Preparation Patient Position Sequence", '', 'RTTreatmentPreparationPatientPositionSequence'), 0x300A078B: ('SQ', '1', "Referenced RT Treatment Preparation Sequence", '', 'ReferencedRTTreatmentPreparationSequence'), 0x300A078C: ('SQ', '1', "Referenced Patient Setup Photo Sequence", '', 'ReferencedPatientSetupPhotoSequence'), 0x300A078D: ('SQ', '1', "Patient Treatment Preparation Method Code Sequence", '', 'PatientTreatmentPreparationMethodCodeSequence'), 0x300A078E: ('LT', '1', "Patient Treatment Preparation Procedure Parameter Description", '', 'PatientTreatmentPreparationProcedureParameterDescription'), 0x300A078F: ('SQ', '1', "Patient Treatment Preparation Device Sequence", '', 'PatientTreatmentPreparationDeviceSequence'), 0x300A0790: ('SQ', '1', "Patient Treatment Preparation Procedure Sequence", '', 'PatientTreatmentPreparationProcedureSequence'), 0x300A0791: ('SQ', '1', "Patient Treatment Preparation Procedure Code Sequence", '', 'PatientTreatmentPreparationProcedureCodeSequence'), 0x300A0792: ('LT', '1', "Patient Treatment Preparation Method Description", '', 'PatientTreatmentPreparationMethodDescription'), 0x300A0793: ('SQ', '1', "Patient Treatment Preparation Procedure Parameter Sequence", '', 'PatientTreatmentPreparationProcedureParameterSequence'), 0x300A0794: ('LT', '1', "Patient Setup Photo Description", '', 'PatientSetupPhotoDescription'), 0x300A0795: ('US', '1', "Patient Treatment Preparation Procedure Index", '', 'PatientTreatmentPreparationProcedureIndex'), 0x300A0796: ('US', '1', "Referenced Patient Setup Procedure Index", '', 'ReferencedPatientSetupProcedureIndex'), 0x300A0797: ('SQ', '1', "RT Radiation Task Sequence", '', 'RTRadiationTaskSequence'), 0x300A0798: ('SQ', '1', "RT Patient Position Displacement Sequence", '', 'RTPatientPositionDisplacementSequence'), 0x300A0799: ('SQ', '1', "RT Patient Position Sequence", '', 'RTPatientPositionSequence'), 0x300A079A: ('LO', '1', "Displacement Reference Label", '', 'DisplacementReferenceLabel'), 0x300A079B: ('FD', '16', "Displacement Matrix", '', 'DisplacementMatrix'), 0x300A079C: ('SQ', '1', "Patient Support Displacement Sequence", '', 'PatientSupportDisplacementSequence'), 0x300A079D: ('SQ', '1', "Displacement Reference Location Code Sequence", '', 'DisplacementReferenceLocationCodeSequence'), 0x300A079E: ('CS', '1', "RT Radiation Set Delivery Usage", '', 'RTRadiationSetDeliveryUsage'), 0x300A079F: ('SQ', '1', "Patient Treatment Preparation Sequence", '', 'PatientTreatmentPreparationSequence'), 0x300A07A0: ('SQ', '1', "Patient to Equipment Relationship Sequence", '', 'PatientToEquipmentRelationshipSequence'), 0x300A07A1: ('SQ', '1', "Imaging Equipment to Treatment Delivery Device Relationship Sequence", '', 'ImagingEquipmentToTreatmentDeliveryDeviceRelationshipSequence'), 0x300C0002: ('SQ', '1', "Referenced RT Plan Sequence", '', 'ReferencedRTPlanSequence'), 0x300C0004: ('SQ', '1', "Referenced Beam Sequence", '', 'ReferencedBeamSequence'), 0x300C0006: ('IS', '1', "Referenced Beam Number", '', 'ReferencedBeamNumber'), 0x300C0007: ('IS', '1', "Referenced Reference Image Number", '', 'ReferencedReferenceImageNumber'), 0x300C0008: ('DS', '1', "Start Cumulative Meterset Weight", '', 'StartCumulativeMetersetWeight'), 0x300C0009: ('DS', '1', "End Cumulative Meterset Weight", '', 'EndCumulativeMetersetWeight'), 0x300C000A: ('SQ', '1', "Referenced Brachy Application Setup Sequence", '', 'ReferencedBrachyApplicationSetupSequence'), 0x300C000C: ('IS', '1', "Referenced Brachy Application Setup Number", '', 'ReferencedBrachyApplicationSetupNumber'), 0x300C000E: ('IS', '1', "Referenced Source Number", '', 'ReferencedSourceNumber'), 0x300C0020: ('SQ', '1', "Referenced Fraction Group Sequence", '', 'ReferencedFractionGroupSequence'), 0x300C0022: ('IS', '1', "Referenced Fraction Group Number", '', 'ReferencedFractionGroupNumber'), 0x300C0040: ('SQ', '1', "Referenced Verification Image Sequence", '', 'ReferencedVerificationImageSequence'), 0x300C0042: ('SQ', '1', "Referenced Reference Image Sequence", '', 'ReferencedReferenceImageSequence'), 0x300C0050: ('SQ', '1', "Referenced Dose Reference Sequence", '', 'ReferencedDoseReferenceSequence'), 0x300C0051: ('IS', '1', "Referenced Dose Reference Number", '', 'ReferencedDoseReferenceNumber'), 0x300C0055: ('SQ', '1', "Brachy Referenced Dose Reference Sequence", '', 'BrachyReferencedDoseReferenceSequence'), 0x300C0060: ('SQ', '1', "Referenced Structure Set Sequence", '', 'ReferencedStructureSetSequence'), 0x300C006A: ('IS', '1', "Referenced Patient Setup Number", '', 'ReferencedPatientSetupNumber'), 0x300C0080: ('SQ', '1', "Referenced Dose Sequence", '', 'ReferencedDoseSequence'), 0x300C00A0: ('IS', '1', "Referenced Tolerance Table Number", '', 'ReferencedToleranceTableNumber'), 0x300C00B0: ('SQ', '1', "Referenced Bolus Sequence", '', 'ReferencedBolusSequence'), 0x300C00C0: ('IS', '1', "Referenced Wedge Number", '', 'ReferencedWedgeNumber'), 0x300C00D0: ('IS', '1', "Referenced Compensator Number", '', 'ReferencedCompensatorNumber'), 0x300C00E0: ('IS', '1', "Referenced Block Number", '', 'ReferencedBlockNumber'), 0x300C00F0: ('IS', '1', "Referenced Control Point Index", '', 'ReferencedControlPointIndex'), 0x300C00F2: ('SQ', '1', "Referenced Control Point Sequence", '', 'ReferencedControlPointSequence'), 0x300C00F4: ('IS', '1', "Referenced Start Control Point Index", '', 'ReferencedStartControlPointIndex'), 0x300C00F6: ('IS', '1', "Referenced Stop Control Point Index", '', 'ReferencedStopControlPointIndex'), 0x300C0100: ('IS', '1', "Referenced Range Shifter Number", '', 'ReferencedRangeShifterNumber'), 0x300C0102: ('IS', '1', "Referenced Lateral Spreading Device Number", '', 'ReferencedLateralSpreadingDeviceNumber'), 0x300C0104: ('IS', '1', "Referenced Range Modulator Number", '', 'ReferencedRangeModulatorNumber'), 0x300C0111: ('SQ', '1', "Omitted Beam Task Sequence", '', 'OmittedBeamTaskSequence'), 0x300C0112: ('CS', '1', "Reason for Omission", '', 'ReasonForOmission'), 0x300C0113: ('LO', '1', "Reason for Omission Description", '', 'ReasonForOmissionDescription'), 0x300C0114: ('SQ', '1', "Prescription Overview Sequence", '', 'PrescriptionOverviewSequence'), 0x300C0115: ('FL', '1', "Total Prescription Dose", '', 'TotalPrescriptionDose'), 0x300C0116: ('SQ', '1', "Plan Overview Sequence", '', 'PlanOverviewSequence'), 0x300C0117: ('US', '1', "Plan Overview Index", '', 'PlanOverviewIndex'), 0x300C0118: ('US', '1', "Referenced Plan Overview Index", '', 'ReferencedPlanOverviewIndex'), 0x300C0119: ('US', '1', "Number of Fractions Included", '', 'NumberOfFractionsIncluded'), 0x300C0120: ('SQ', '1', "Dose Calibration Conditions Sequence", '', 'DoseCalibrationConditionsSequence'), 0x300C0121: ('FD', '1', "Absorbed Dose to Meterset Ratio", '', 'AbsorbedDoseToMetersetRatio'), 0x300C0122: ('FD', '2', "Delineated Radiation Field Size", '', 'DelineatedRadiationFieldSize'), 0x300C0123: ('CS', '1', "Dose Calibration Conditions Verified Flag", '', 'DoseCalibrationConditionsVerifiedFlag'), 0x300C0124: ('FD', '1', "Calibration Reference Point Depth", '', 'CalibrationReferencePointDepth'), 0x300C0125: ('SQ', '1', "Gating Beam Hold Transition Sequence", '', 'GatingBeamHoldTransitionSequence'), 0x300C0126: ('CS', '1', "Beam Hold Transition", '', 'BeamHoldTransition'), 0x300C0127: ('DT', '1', "Beam Hold Transition DateTime", '', 'BeamHoldTransitionDateTime'), 0x300C0128: ('SQ', '1', "Beam Hold Originating Device Sequence", '', 'BeamHoldOriginatingDeviceSequence'), 0x300C0129: ('CS', '1', "Beam Hold Transition Trigger Source", '', 'BeamHoldTransitionTriggerSource'), 0x300E0002: ('CS', '1', "Approval Status", '', 'ApprovalStatus'), 0x300E0004: ('DA', '1', "Review Date", '', 'ReviewDate'), 0x300E0005: ('TM', '1', "Review Time", '', 'ReviewTime'), 0x300E0008: ('PN', '1', "Reviewer Name", '', 'ReviewerName'), 0x30100001: ('SQ', '1', "Radiobiological Dose Effect Sequence", '', 'RadiobiologicalDoseEffectSequence'), 0x30100002: ('CS', '1', "Radiobiological Dose Effect Flag", '', 'RadiobiologicalDoseEffectFlag'), 0x30100003: ('SQ', '1', "Effective Dose Calculation Method Category Code Sequence", '', 'EffectiveDoseCalculationMethodCategoryCodeSequence'), 0x30100004: ('SQ', '1', "Effective Dose Calculation Method Code Sequence", '', 'EffectiveDoseCalculationMethodCodeSequence'), 0x30100005: ('LO', '1', "Effective Dose Calculation Method Description", '', 'EffectiveDoseCalculationMethodDescription'), 0x30100006: ('UI', '1', "Conceptual Volume UID", '', 'ConceptualVolumeUID'), 0x30100007: ('SQ', '1', "Originating SOP Instance Reference Sequence", '', 'OriginatingSOPInstanceReferenceSequence'), 0x30100008: ('SQ', '1', "Conceptual Volume Constituent Sequence", '', 'ConceptualVolumeConstituentSequence'), 0x30100009: ('SQ', '1', "Equivalent Conceptual Volume Instance Reference Sequence", '', 'EquivalentConceptualVolumeInstanceReferenceSequence'), 0x3010000A: ('SQ', '1', "Equivalent Conceptual Volumes Sequence", '', 'EquivalentConceptualVolumesSequence'), 0x3010000B: ('UI', '1', "Referenced Conceptual Volume UID", '', 'ReferencedConceptualVolumeUID'), 0x3010000C: ('UT', '1', "Conceptual Volume Combination Expression", '', 'ConceptualVolumeCombinationExpression'), 0x3010000D: ('US', '1', "Conceptual Volume Constituent Index", '', 'ConceptualVolumeConstituentIndex'), 0x3010000E: ('CS', '1', "Conceptual Volume Combination Flag", '', 'ConceptualVolumeCombinationFlag'), 0x3010000F: ('ST', '1', "Conceptual Volume Combination Description", '', 'ConceptualVolumeCombinationDescription'), 0x30100010: ('CS', '1', "Conceptual Volume Segmentation Defined Flag", '', 'ConceptualVolumeSegmentationDefinedFlag'), 0x30100011: ('SQ', '1', "Conceptual Volume Segmentation Reference Sequence", '', 'ConceptualVolumeSegmentationReferenceSequence'), 0x30100012: ('SQ', '1', "Conceptual Volume Constituent Segmentation Reference Sequence", '', 'ConceptualVolumeConstituentSegmentationReferenceSequence'), 0x30100013: ('UI', '1', "Constituent Conceptual Volume UID", '', 'ConstituentConceptualVolumeUID'), 0x30100014: ('SQ', '1', "Derivation Conceptual Volume Sequence", '', 'DerivationConceptualVolumeSequence'), 0x30100015: ('UI', '1', "Source Conceptual Volume UID", '', 'SourceConceptualVolumeUID'), 0x30100016: ('SQ', '1', "Conceptual Volume Derivation Algorithm Sequence", '', 'ConceptualVolumeDerivationAlgorithmSequence'), 0x30100017: ('ST', '1', "Conceptual Volume Description", '', 'ConceptualVolumeDescription'), 0x30100018: ('SQ', '1', "Source Conceptual Volume Sequence", '', 'SourceConceptualVolumeSequence'), 0x30100019: ('SQ', '1', "Author Identification Sequence", '', 'AuthorIdentificationSequence'), 0x3010001A: ('LO', '1', "Manufacturer's Model Version", '', 'ManufacturerModelVersion'), 0x3010001B: ('UC', '1', "Device Alternate Identifier", '', 'DeviceAlternateIdentifier'), 0x3010001C: ('CS', '1', "Device Alternate Identifier Type", '', 'DeviceAlternateIdentifierType'), 0x3010001D: ('LT', '1', "Device Alternate Identifier Format", '', 'DeviceAlternateIdentifierFormat'), 0x3010001E: ('LO', '1', "Segmentation Creation Template Label", '', 'SegmentationCreationTemplateLabel'), 0x3010001F: ('UI', '1', "Segmentation Template UID", '', 'SegmentationTemplateUID'), 0x30100020: ('US', '1', "Referenced Segment Reference Index", '', 'ReferencedSegmentReferenceIndex'), 0x30100021: ('SQ', '1', "Segment Reference Sequence", '', 'SegmentReferenceSequence'), 0x30100022: ('US', '1', "Segment Reference Index", '', 'SegmentReferenceIndex'), 0x30100023: ('SQ', '1', "Direct Segment Reference Sequence", '', 'DirectSegmentReferenceSequence'), 0x30100024: ('SQ', '1', "Combination Segment Reference Sequence", '', 'CombinationSegmentReferenceSequence'), 0x30100025: ('SQ', '1', "Conceptual Volume Sequence", '', 'ConceptualVolumeSequence'), 0x30100026: ('SQ', '1', "Segmented RT Accessory Device Sequence", '', 'SegmentedRTAccessoryDeviceSequence'), 0x30100027: ('SQ', '1', "Segment Characteristics Sequence", '', 'SegmentCharacteristicsSequence'), 0x30100028: ('SQ', '1', "Related Segment Characteristics Sequence", '', 'RelatedSegmentCharacteristicsSequence'), 0x30100029: ('US', '1', "Segment Characteristics Precedence", '', 'SegmentCharacteristicsPrecedence'), 0x3010002A: ('SQ', '1', "RT Segment Annotation Sequence", '', 'RTSegmentAnnotationSequence'), 0x3010002B: ('SQ', '1', "Segment Annotation Category Code Sequence", '', 'SegmentAnnotationCategoryCodeSequence'), 0x3010002C: ('SQ', '1', "Segment Annotation Type Code Sequence", '', 'SegmentAnnotationTypeCodeSequence'), 0x3010002D: ('LO', '1', "Device Label", '', 'DeviceLabel'), 0x3010002E: ('SQ', '1', "Device Type Code Sequence", '', 'DeviceTypeCodeSequence'), 0x3010002F: ('SQ', '1', "Segment Annotation Type Modifier Code Sequence", '', 'SegmentAnnotationTypeModifierCodeSequence'), 0x30100030: ('SQ', '1', "Patient Equipment Relationship Code Sequence", '', 'PatientEquipmentRelationshipCodeSequence'), 0x30100031: ('UI', '1', "Referenced Fiducials UID", '', 'ReferencedFiducialsUID'), 0x30100032: ('SQ', '1', "Patient Treatment Orientation Sequence", '', 'PatientTreatmentOrientationSequence'), 0x30100033: ('SH', '1', "User Content Label", '', 'UserContentLabel'), 0x30100034: ('LO', '1', "User Content Long Label", '', 'UserContentLongLabel'), 0x30100035: ('SH', '1', "Entity Label", '', 'EntityLabel'), 0x30100036: ('LO', '1', "Entity Name", '', 'EntityName'), 0x30100037: ('ST', '1', "Entity Description", '', 'EntityDescription'), 0x30100038: ('LO', '1', "Entity Long Label", '', 'EntityLongLabel'), 0x30100039: ('US', '1', "Device Index", '', 'DeviceIndex'), 0x3010003A: ('US', '1', "RT Treatment Phase Index", '', 'RTTreatmentPhaseIndex'), 0x3010003B: ('UI', '1', "RT Treatment Phase UID", '', 'RTTreatmentPhaseUID'), 0x3010003C: ('US', '1', "RT Prescription Index", '', 'RTPrescriptionIndex'), 0x3010003D: ('US', '1', "RT Segment Annotation Index", '', 'RTSegmentAnnotationIndex'), 0x3010003E: ('US', '1', "Basis RT Treatment Phase Index", '', 'BasisRTTreatmentPhaseIndex'), 0x3010003F: ('US', '1', "Related RT Treatment Phase Index", '', 'RelatedRTTreatmentPhaseIndex'), 0x30100040: ('US', '1', "Referenced RT Treatment Phase Index", '', 'ReferencedRTTreatmentPhaseIndex'), 0x30100041: ('US', '1', "Referenced RT Prescription Index", '', 'ReferencedRTPrescriptionIndex'), 0x30100042: ('US', '1', "Referenced Parent RT Prescription Index", '', 'ReferencedParentRTPrescriptionIndex'), 0x30100043: ('ST', '1', "Manufacturer's Device Identifier", '', 'ManufacturerDeviceIdentifier'), 0x30100044: ('SQ', '1', "Instance-Level Referenced Performed Procedure Step Sequence", '', 'InstanceLevelReferencedPerformedProcedureStepSequence'), 0x30100045: ('CS', '1', "RT Treatment Phase Intent Presence Flag", '', 'RTTreatmentPhaseIntentPresenceFlag'), 0x30100046: ('CS', '1', "Radiotherapy Treatment Type", '', 'RadiotherapyTreatmentType'), 0x30100047: ('CS', '1-n', "Teletherapy Radiation Type", '', 'TeletherapyRadiationType'), 0x30100048: ('CS', '1-n', "Brachytherapy Source Type", '', 'BrachytherapySourceType'), 0x30100049: ('SQ', '1', "Referenced RT Treatment Phase Sequence", '', 'ReferencedRTTreatmentPhaseSequence'), 0x3010004A: ('SQ', '1', "Referenced Direct Segment Instance Sequence", '', 'ReferencedDirectSegmentInstanceSequence'), 0x3010004B: ('SQ', '1', "Intended RT Treatment Phase Sequence", '', 'IntendedRTTreatmentPhaseSequence'), 0x3010004C: ('DA', '1', "Intended Phase Start Date", '', 'IntendedPhaseStartDate'), 0x3010004D: ('DA', '1', "Intended Phase End Date", '', 'IntendedPhaseEndDate'), 0x3010004E: ('SQ', '1', "RT Treatment Phase Interval Sequence", '', 'RTTreatmentPhaseIntervalSequence'), 0x3010004F: ('CS', '1', "Temporal Relationship Interval Anchor", '', 'TemporalRelationshipIntervalAnchor'), 0x30100050: ('FD', '1', "Minimum Number of Interval Days", '', 'MinimumNumberOfIntervalDays'), 0x30100051: ('FD', '1', "Maximum Number of Interval Days", '', 'MaximumNumberOfIntervalDays'), 0x30100052: ('UI', '1-n', "Pertinent SOP Classes in Study", '', 'PertinentSOPClassesInStudy'), 0x30100053: ('UI', '1-n', "Pertinent SOP Classes in Series", '', 'PertinentSOPClassesInSeries'), 0x30100054: ('LO', '1', "RT Prescription Label", '', 'RTPrescriptionLabel'), 0x30100055: ('SQ', '1', "RT Physician Intent Predecessor Sequence", '', 'RTPhysicianIntentPredecessorSequence'), 0x30100056: ('LO', '1', "RT Treatment Approach Label", '', 'RTTreatmentApproachLabel'), 0x30100057: ('SQ', '1', "RT Physician Intent Sequence", '', 'RTPhysicianIntentSequence'), 0x30100058: ('US', '1', "RT Physician Intent Index", '', 'RTPhysicianIntentIndex'), 0x30100059: ('CS', '1', "RT Treatment Intent Type", '', 'RTTreatmentIntentType'), 0x3010005A: ('UT', '1', "RT Physician Intent Narrative", '', 'RTPhysicianIntentNarrative'), 0x3010005B: ('SQ', '1', "RT Protocol Code Sequence", '', 'RTProtocolCodeSequence'), 0x3010005C: ('ST', '1', "Reason for Superseding", '', 'ReasonForSuperseding'), 0x3010005D: ('SQ', '1', "RT Diagnosis Code Sequence", '', 'RTDiagnosisCodeSequence'), 0x3010005E: ('US', '1', "Referenced RT Physician Intent Index", '', 'ReferencedRTPhysicianIntentIndex'), 0x3010005F: ('SQ', '1', "RT Physician Intent Input Instance Sequence", '', 'RTPhysicianIntentInputInstanceSequence'), 0x30100060: ('SQ', '1', "RT Anatomic Prescription Sequence", '', 'RTAnatomicPrescriptionSequence'), 0x30100061: ('UT', '1', "Prior Treatment Dose Description", '', 'PriorTreatmentDoseDescription'), 0x30100062: ('SQ', '1', "Prior Treatment Reference Sequence", '', 'PriorTreatmentReferenceSequence'), 0x30100063: ('CS', '1', "Dosimetric Objective Evaluation Scope", '', 'DosimetricObjectiveEvaluationScope'), 0x30100064: ('SQ', '1', "Therapeutic Role Category Code Sequence", '', 'TherapeuticRoleCategoryCodeSequence'), 0x30100065: ('SQ', '1', "Therapeutic Role Type Code Sequence", '', 'TherapeuticRoleTypeCodeSequence'), 0x30100066: ('US', '1', "Conceptual Volume Optimization Precedence", '', 'ConceptualVolumeOptimizationPrecedence'), 0x30100067: ('SQ', '1', "Conceptual Volume Category Code Sequence", '', 'ConceptualVolumeCategoryCodeSequence'), 0x30100068: ('CS', '1', "Conceptual Volume Blocking Constraint", '', 'ConceptualVolumeBlockingConstraint'), 0x30100069: ('SQ', '1', "Conceptual Volume Type Code Sequence", '', 'ConceptualVolumeTypeCodeSequence'), 0x3010006A: ('SQ', '1', "Conceptual Volume Type Modifier Code Sequence", '', 'ConceptualVolumeTypeModifierCodeSequence'), 0x3010006B: ('SQ', '1', "RT Prescription Sequence", '', 'RTPrescriptionSequence'), 0x3010006C: ('SQ', '1', "Dosimetric Objective Sequence", '', 'DosimetricObjectiveSequence'), 0x3010006D: ('SQ', '1', "Dosimetric Objective Type Code Sequence", '', 'DosimetricObjectiveTypeCodeSequence'), 0x3010006E: ('UI', '1', "Dosimetric Objective UID", '', 'DosimetricObjectiveUID'), 0x3010006F: ('UI', '1', "Referenced Dosimetric Objective UID", '', 'ReferencedDosimetricObjectiveUID'), 0x30100070: ('SQ', '1', "Dosimetric Objective Parameter Sequence", '', 'DosimetricObjectiveParameterSequence'), 0x30100071: ('SQ', '1', "Referenced Dosimetric Objectives Sequence", '', 'ReferencedDosimetricObjectivesSequence'), 0x30100073: ('CS', '1', "Absolute Dosimetric Objective Flag", '', 'AbsoluteDosimetricObjectiveFlag'), 0x30100074: ('FD', '1', "Dosimetric Objective Weight", '', 'DosimetricObjectiveWeight'), 0x30100075: ('CS', '1', "Dosimetric Objective Purpose", '', 'DosimetricObjectivePurpose'), 0x30100076: ('SQ', '1', "Planning Input Information Sequence", '', 'PlanningInputInformationSequence'), 0x30100077: ('LO', '1', "Treatment Site", '', 'TreatmentSite'), 0x30100078: ('SQ', '1', "Treatment Site Code Sequence", '', 'TreatmentSiteCodeSequence'), 0x30100079: ('SQ', '1', "Fraction Pattern Sequence", '', 'FractionPatternSequence'), 0x3010007A: ('UT', '1', "Treatment Technique Notes", '', 'TreatmentTechniqueNotes'), 0x3010007B: ('UT', '1', "Prescription Notes", '', 'PrescriptionNotes'), 0x3010007C: ('IS', '1', "Number of Interval Fractions", '', 'NumberOfIntervalFractions'), 0x3010007D: ('US', '1', "Number of Fractions", '', 'NumberOfFractions'), 0x3010007E: ('US', '1', "Intended Delivery Duration", '', 'IntendedDeliveryDuration'), 0x3010007F: ('UT', '1', "Fractionation Notes", '', 'FractionationNotes'), 0x30100080: ('SQ', '1', "RT Treatment Technique Code Sequence", '', 'RTTreatmentTechniqueCodeSequence'), 0x30100081: ('SQ', '1', "Prescription Notes Sequence", '', 'PrescriptionNotesSequence'), 0x30100082: ('SQ', '1', "Fraction-Based Relationship Sequence", '', 'FractionBasedRelationshipSequence'), 0x30100083: ('CS', '1', "Fraction-Based Relationship Interval Anchor", '', 'FractionBasedRelationshipIntervalAnchor'), 0x30100084: ('FD', '1', "Minimum Hours between Fractions", '', 'MinimumHoursBetweenFractions'), 0x30100085: ('TM', '1-n', "Intended Fraction Start Time", '', 'IntendedFractionStartTime'), 0x30100086: ('LT', '1', "Intended Start Day of Week", '', 'IntendedStartDayOfWeek'), 0x30100087: ('SQ', '1', "Weekday Fraction Pattern Sequence", '', 'WeekdayFractionPatternSequence'), 0x30100088: ('SQ', '1', "Delivery Time Structure Code Sequence", '', 'DeliveryTimeStructureCodeSequence'), 0x30100089: ('SQ', '1', "Treatment Site Modifier Code Sequence", '', 'TreatmentSiteModifierCodeSequence'), 0x30100090: ('CS', '1', "Robotic Base Location Indicator", 'Retired', 'RoboticBaseLocationIndicator'), 0x30100091: ('SQ', '1', "Robotic Path Node Set Code Sequence", '', 'RoboticPathNodeSetCodeSequence'), 0x30100092: ('UL', '1', "Robotic Node Identifier", '', 'RoboticNodeIdentifier'), 0x30100093: ('FD', '3', "RT Treatment Source Coordinates", '', 'RTTreatmentSourceCoordinates'), 0x30100094: ('FD', '1', "Radiation Source Coordinate SystemYaw Angle", '', 'RadiationSourceCoordinateSystemYawAngle'), 0x30100095: ('FD', '1', "Radiation Source Coordinate SystemRoll Angle", '', 'RadiationSourceCoordinateSystemRollAngle'), 0x30100096: ('FD', '1', "Radiation Source Coordinate System Pitch Angle", '', 'RadiationSourceCoordinateSystemPitchAngle'), 0x30100097: ('SQ', '1', "Robotic Path Control Point Sequence", '', 'RoboticPathControlPointSequence'), 0x30100098: ('SQ', '1', "Tomotherapeutic Control Point Sequence", '', 'TomotherapeuticControlPointSequence'), 0x30100099: ('FD', '1-n', "Tomotherapeutic Leaf Open Durations", '', 'TomotherapeuticLeafOpenDurations'), 0x3010009A: ('FD', '1-n', "Tomotherapeutic Leaf Initial Closed Durations", '', 'TomotherapeuticLeafInitialClosedDurations'), 0x301000A0: ('SQ', '1', "Conceptual Volume Identification Sequence", '', 'ConceptualVolumeIdentificationSequence'), 0x40000010: ('LT', '1', "Arbitrary", 'Retired', 'Arbitrary'), 0x40004000: ('LT', '1', "Text Comments", 'Retired', 'TextComments'), 0x40080040: ('SH', '1', "Results ID", 'Retired', 'ResultsID'), 0x40080042: ('LO', '1', "Results ID Issuer", 'Retired', 'ResultsIDIssuer'), 0x40080050: ('SQ', '1', "Referenced Interpretation Sequence", 'Retired', 'ReferencedInterpretationSequence'), 0x400800FF: ('CS', '1', "Report Production Status (Trial)", 'Retired', 'ReportProductionStatusTrial'), 0x40080100: ('DA', '1', "Interpretation Recorded Date", 'Retired', 'InterpretationRecordedDate'), 0x40080101: ('TM', '1', "Interpretation Recorded Time", 'Retired', 'InterpretationRecordedTime'), 0x40080102: ('PN', '1', "Interpretation Recorder", 'Retired', 'InterpretationRecorder'), 0x40080103: ('LO', '1', "Reference to Recorded Sound", 'Retired', 'ReferenceToRecordedSound'), 0x40080108: ('DA', '1', "Interpretation Transcription Date", 'Retired', 'InterpretationTranscriptionDate'), 0x40080109: ('TM', '1', "Interpretation Transcription Time", 'Retired', 'InterpretationTranscriptionTime'), 0x4008010A: ('PN', '1', "Interpretation Transcriber", 'Retired', 'InterpretationTranscriber'), 0x4008010B: ('ST', '1', "Interpretation Text", 'Retired', 'InterpretationText'), 0x4008010C: ('PN', '1', "Interpretation Author", 'Retired', 'InterpretationAuthor'), 0x40080111: ('SQ', '1', "Interpretation Approver Sequence", 'Retired', 'InterpretationApproverSequence'), 0x40080112: ('DA', '1', "Interpretation Approval Date", 'Retired', 'InterpretationApprovalDate'), 0x40080113: ('TM', '1', "Interpretation Approval Time", 'Retired', 'InterpretationApprovalTime'), 0x40080114: ('PN', '1', "Physician Approving Interpretation", 'Retired', 'PhysicianApprovingInterpretation'), 0x40080115: ('LT', '1', "Interpretation Diagnosis Description", 'Retired', 'InterpretationDiagnosisDescription'), 0x40080117: ('SQ', '1', "Interpretation Diagnosis Code Sequence", 'Retired', 'InterpretationDiagnosisCodeSequence'), 0x40080118: ('SQ', '1', "Results Distribution List Sequence", 'Retired', 'ResultsDistributionListSequence'), 0x40080119: ('PN', '1', "Distribution Name", 'Retired', 'DistributionName'), 0x4008011A: ('LO', '1', "Distribution Address", 'Retired', 'DistributionAddress'), 0x40080200: ('SH', '1', "Interpretation ID", 'Retired', 'InterpretationID'), 0x40080202: ('LO', '1', "Interpretation ID Issuer", 'Retired', 'InterpretationIDIssuer'), 0x40080210: ('CS', '1', "Interpretation Type ID", 'Retired', 'InterpretationTypeID'), 0x40080212: ('CS', '1', "Interpretation Status ID", 'Retired', 'InterpretationStatusID'), 0x40080300: ('ST', '1', "Impressions", 'Retired', 'Impressions'), 0x40084000: ('ST', '1', "Results Comments", 'Retired', 'ResultsComments'), 0x40100001: ('CS', '1', "Low Energy Detectors", '', 'LowEnergyDetectors'), 0x40100002: ('CS', '1', "High Energy Detectors", '', 'HighEnergyDetectors'), 0x40100004: ('SQ', '1', "Detector Geometry Sequence", '', 'DetectorGeometrySequence'), 0x40101001: ('SQ', '1', "Threat ROI Voxel Sequence", '', 'ThreatROIVoxelSequence'), 0x40101004: ('FL', '3', "Threat ROI Base", '', 'ThreatROIBase'), 0x40101005: ('FL', '3', "Threat ROI Extents", '', 'ThreatROIExtents'), 0x40101006: ('OB', '1', "Threat ROI Bitmap", '', 'ThreatROIBitmap'), 0x40101007: ('SH', '1', "Route Segment ID", '', 'RouteSegmentID'), 0x40101008: ('CS', '1', "Gantry Type", '', 'GantryType'), 0x40101009: ('CS', '1', "OOI Owner Type", '', 'OOIOwnerType'), 0x4010100A: ('SQ', '1', "Route Segment Sequence", '', 'RouteSegmentSequence'), 0x40101010: ('US', '1', "Potential Threat Object ID", '', 'PotentialThreatObjectID'), 0x40101011: ('SQ', '1', "Threat Sequence", '', 'ThreatSequence'), 0x40101012: ('CS', '1', "Threat Category", '', 'ThreatCategory'), 0x40101013: ('LT', '1', "Threat Category Description", '', 'ThreatCategoryDescription'), 0x40101014: ('CS', '1', "ATD Ability Assessment", '', 'ATDAbilityAssessment'), 0x40101015: ('CS', '1', "ATD Assessment Flag", '', 'ATDAssessmentFlag'), 0x40101016: ('FL', '1', "ATD Assessment Probability", '', 'ATDAssessmentProbability'), 0x40101017: ('FL', '1', "Mass", '', 'Mass'), 0x40101018: ('FL', '1', "Density", '', 'Density'), 0x40101019: ('FL', '1', "Z Effective", '', 'ZEffective'), 0x4010101A: ('SH', '1', "Boarding Pass ID", '', 'BoardingPassID'), 0x4010101B: ('FL', '3', "Center of Mass", '', 'CenterOfMass'), 0x4010101C: ('FL', '3', "Center of PTO", '', 'CenterOfPTO'), 0x4010101D: ('FL', '6-n', "Bounding Polygon", '', 'BoundingPolygon'), 0x4010101E: ('SH', '1', "Route Segment Start Location ID", '', 'RouteSegmentStartLocationID'), 0x4010101F: ('SH', '1', "Route Segment End Location ID", '', 'RouteSegmentEndLocationID'), 0x40101020: ('CS', '1', "Route Segment Location ID Type", '', 'RouteSegmentLocationIDType'), 0x40101021: ('CS', '1-n', "Abort Reason", '', 'AbortReason'), 0x40101023: ('FL', '1', "Volume of PTO", '', 'VolumeOfPTO'), 0x40101024: ('CS', '1', "Abort Flag", '', 'AbortFlag'), 0x40101025: ('DT', '1', "Route Segment Start Time", '', 'RouteSegmentStartTime'), 0x40101026: ('DT', '1', "Route Segment End Time", '', 'RouteSegmentEndTime'), 0x40101027: ('CS', '1', "TDR Type", '', 'TDRType'), 0x40101028: ('CS', '1', "International Route Segment", '', 'InternationalRouteSegment'), 0x40101029: ('LO', '1-n', "Threat Detection Algorithm and Version", '', 'ThreatDetectionAlgorithmAndVersion'), 0x4010102A: ('SH', '1', "Assigned Location", '', 'AssignedLocation'), 0x4010102B: ('DT', '1', "Alarm Decision Time", '', 'AlarmDecisionTime'), 0x40101031: ('CS', '1', "Alarm Decision", '', 'AlarmDecision'), 0x40101033: ('US', '1', "Number of Total Objects", '', 'NumberOfTotalObjects'), 0x40101034: ('US', '1', "Number of Alarm Objects", '', 'NumberOfAlarmObjects'), 0x40101037: ('SQ', '1', "PTO Representation Sequence", '', 'PTORepresentationSequence'), 0x40101038: ('SQ', '1', "ATD Assessment Sequence", '', 'ATDAssessmentSequence'), 0x40101039: ('CS', '1', "TIP Type", '', 'TIPType'), 0x4010103A: ('CS', '1', "DICOS Version", '', 'DICOSVersion'), 0x40101041: ('DT', '1', "OOI Owner Creation Time", '', 'OOIOwnerCreationTime'), 0x40101042: ('CS', '1', "OOI Type", '', 'OOIType'), 0x40101043: ('FL', '3', "OOI Size", '', 'OOISize'), 0x40101044: ('CS', '1', "Acquisition Status", '', 'AcquisitionStatus'), 0x40101045: ('SQ', '1', "Basis Materials Code Sequence", '', 'BasisMaterialsCodeSequence'), 0x40101046: ('CS', '1', "Phantom Type", '', 'PhantomType'), 0x40101047: ('SQ', '1', "OOI Owner Sequence", '', 'OOIOwnerSequence'), 0x40101048: ('CS', '1', "Scan Type", '', 'ScanType'), 0x40101051: ('LO', '1', "Itinerary ID", '', 'ItineraryID'), 0x40101052: ('SH', '1', "Itinerary ID Type", '', 'ItineraryIDType'), 0x40101053: ('LO', '1', "Itinerary ID Assigning Authority", '', 'ItineraryIDAssigningAuthority'), 0x40101054: ('SH', '1', "Route ID", '', 'RouteID'), 0x40101055: ('SH', '1', "Route ID Assigning Authority", '', 'RouteIDAssigningAuthority'), 0x40101056: ('CS', '1', "Inbound Arrival Type", '', 'InboundArrivalType'), 0x40101058: ('SH', '1', "Carrier ID", '', 'CarrierID'), 0x40101059: ('CS', '1', "Carrier ID Assigning Authority", '', 'CarrierIDAssigningAuthority'), 0x40101060: ('FL', '3', "Source Orientation", '', 'SourceOrientation'), 0x40101061: ('FL', '3', "Source Position", '', 'SourcePosition'), 0x40101062: ('FL', '1', "Belt Height", '', 'BeltHeight'), 0x40101064: ('SQ', '1', "Algorithm Routing Code Sequence", '', 'AlgorithmRoutingCodeSequence'), 0x40101067: ('CS', '1', "Transport Classification", '', 'TransportClassification'), 0x40101068: ('LT', '1', "OOI Type Descriptor", '', 'OOITypeDescriptor'), 0x40101069: ('FL', '1', "Total Processing Time", '', 'TotalProcessingTime'), 0x4010106C: ('OB', '1', "Detector Calibration Data", '', 'DetectorCalibrationData'), 0x4010106D: ('CS', '1', "Additional Screening Performed", '', 'AdditionalScreeningPerformed'), 0x4010106E: ('CS', '1', "Additional Inspection Selection Criteria", '', 'AdditionalInspectionSelectionCriteria'), 0x4010106F: ('SQ', '1', "Additional Inspection Method Sequence", '', 'AdditionalInspectionMethodSequence'), 0x40101070: ('CS', '1', "AIT Device Type", '', 'AITDeviceType'), 0x40101071: ('SQ', '1', "QR Measurements Sequence", '', 'QRMeasurementsSequence'), 0x40101072: ('SQ', '1', "Target Material Sequence", '', 'TargetMaterialSequence'), 0x40101073: ('FD', '1', "SNR Threshold", '', 'SNRThreshold'), 0x40101075: ('DS', '1', "Image Scale Representation", '', 'ImageScaleRepresentation'), 0x40101076: ('SQ', '1', "Referenced PTO Sequence", '', 'ReferencedPTOSequence'), 0x40101077: ('SQ', '1', "Referenced TDR Instance Sequence", '', 'ReferencedTDRInstanceSequence'), 0x40101078: ('ST', '1', "PTO Location Description", '', 'PTOLocationDescription'), 0x40101079: ('SQ', '1', "Anomaly Locator Indicator Sequence", '', 'AnomalyLocatorIndicatorSequence'), 0x4010107A: ('FL', '3', "Anomaly Locator Indicator", '', 'AnomalyLocatorIndicator'), 0x4010107B: ('SQ', '1', "PTO Region Sequence", '', 'PTORegionSequence'), 0x4010107C: ('CS', '1', "Inspection Selection Criteria", '', 'InspectionSelectionCriteria'), 0x4010107D: ('SQ', '1', "Secondary Inspection Method Sequence", '', 'SecondaryInspectionMethodSequence'), 0x4010107E: ('DS', '6', "PRCS to RCS Orientation", '', 'PRCSToRCSOrientation'), 0x4FFE0001: ('SQ', '1', "MAC Parameters Sequence", '', 'MACParametersSequence'), 0x52009229: ('SQ', '1', "Shared Functional Groups Sequence", '', 'SharedFunctionalGroupsSequence'), 0x52009230: ('SQ', '1', "Per-Frame Functional Groups Sequence", '', 'PerFrameFunctionalGroupsSequence'), 0x54000100: ('SQ', '1', "Waveform Sequence", '', 'WaveformSequence'), 0x54000110: ('OB or OW', '1', "Channel Minimum Value", '', 'ChannelMinimumValue'), 0x54000112: ('OB or OW', '1', "Channel Maximum Value", '', 'ChannelMaximumValue'), 0x54001004: ('US', '1', "Waveform Bits Allocated", '', 'WaveformBitsAllocated'), 0x54001006: ('CS', '1', "Waveform Sample Interpretation", '', 'WaveformSampleInterpretation'), 0x5400100A: ('OB or OW', '1', "Waveform Padding Value", '', 'WaveformPaddingValue'), 0x54001010: ('OB or OW', '1', "Waveform Data", '', 'WaveformData'), 0x56000010: ('OF', '1', "First Order Phase Correction Angle", '', 'FirstOrderPhaseCorrectionAngle'), 0x56000020: ('OF', '1', "Spectroscopy Data", '', 'SpectroscopyData'), 0x7FE00001: ('OV', '1', "Extended Offset Table", '', 'ExtendedOffsetTable'), 0x7FE00002: ('OV', '1', "Extended Offset Table Lengths", '', 'ExtendedOffsetTableLengths'), 0x7FE00003: ('UV', '1', "Encapsulated Pixel Data Value Total Length", '', 'EncapsulatedPixelDataValueTotalLength'), 0x7FE00008: ('OF', '1', "Float Pixel Data", '', 'FloatPixelData'), 0x7FE00009: ('OD', '1', "Double Float Pixel Data", '', 'DoubleFloatPixelData'), 0x7FE00010: ('OB or OW', '1', "Pixel Data", '', 'PixelData'), 0x7FE00020: ('OW', '1', "Coefficients SDVN", 'Retired', 'CoefficientsSDVN'), 0x7FE00030: ('OW', '1', "Coefficients SDHN", 'Retired', 'CoefficientsSDHN'), 0x7FE00040: ('OW', '1', "Coefficients SDDN", 'Retired', 'CoefficientsSDDN'), 0xFFFAFFFA: ('SQ', '1', "Digital Signatures Sequence", '', 'DigitalSignaturesSequence'), 0xFFFCFFFC: ('OB', '1', "Data Set Trailing Padding", '', 'DataSetTrailingPadding'), 0xFFFEE000: ('NONE', '1', "Item", '', 'Item'), 0xFFFEE00D: ('NONE', '1', "Item Delimitation Item", '', 'ItemDelimitationItem'), 0xFFFEE0DD: ('NONE', '1', "Sequence Delimitation Item", '', 'SequenceDelimitationItem') } RepeatersDictionary: dict[str, tuple[str, str, str, str, str]] = { '002031xx': ('CS', '1-n', "Source Image IDs", 'Retired', 'SourceImageIDs'), '002804x0': ('US', '1', "Rows For Nth Order Coefficients", 'Retired', 'RowsForNthOrderCoefficients'), '002804x1': ('US', '1', "Columns For Nth Order Coefficients", 'Retired', 'ColumnsForNthOrderCoefficients'), '002804x2': ('LO', '1-n', "Coefficient Coding", 'Retired', 'CoefficientCoding'), '002804x3': ('AT', '1-n', "Coefficient Coding Pointers", 'Retired', 'CoefficientCodingPointers'), '002808x0': ('CS', '1-n', "Code Label", 'Retired', 'CodeLabel'), '002808x2': ('US', '1', "Number of Tables", 'Retired', 'NumberOfTables'), '002808x3': ('AT', '1-n', "Code Table Location", 'Retired', 'CodeTableLocation'), '002808x4': ('US', '1', "Bits For Code Word", 'Retired', 'BitsForCodeWord'), '002808x8': ('AT', '1-n', "Image Data Location", 'Retired', 'ImageDataLocation'), '1000xxx0': ('US', '3', "Escape Triplet", 'Retired', 'EscapeTriplet'), '1000xxx1': ('US', '3', "Run Length Triplet", 'Retired', 'RunLengthTriplet'), '1000xxx2': ('US', '1', "Huffman Table Size", 'Retired', 'HuffmanTableSize'), '1000xxx3': ('US', '3', "Huffman Table Triplet", 'Retired', 'HuffmanTableTriplet'), '1000xxx4': ('US', '1', "Shift Table Size", 'Retired', 'ShiftTableSize'), '1000xxx5': ('US', '3', "Shift Table Triplet", 'Retired', 'ShiftTableTriplet'), '1010xxxx': ('US', '1-n', "Zonal Map", 'Retired', 'ZonalMap'), '50xx0005': ('US', '1', "Curve Dimensions", 'Retired', 'CurveDimensions'), '50xx0010': ('US', '1', "Number of Points", 'Retired', 'NumberOfPoints'), '50xx0020': ('CS', '1', "Type of Data", 'Retired', 'TypeOfData'), '50xx0022': ('LO', '1', "Curve Description", 'Retired', 'CurveDescription'), '50xx0030': ('SH', '1-n', "Axis Units", 'Retired', 'AxisUnits'), '50xx0040': ('SH', '1-n', "Axis Labels", 'Retired', 'AxisLabels'), '50xx0103': ('US', '1', "Data Value Representation", 'Retired', 'DataValueRepresentation'), '50xx0104': ('US', '1-n', "Minimum Coordinate Value", 'Retired', 'MinimumCoordinateValue'), '50xx0105': ('US', '1-n', "Maximum Coordinate Value", 'Retired', 'MaximumCoordinateValue'), '50xx0106': ('SH', '1-n', "Curve Range", 'Retired', 'CurveRange'), '50xx0110': ('US', '1-n', "Curve Data Descriptor", 'Retired', 'CurveDataDescriptor'), '50xx0112': ('US', '1-n', "Coordinate Start Value", 'Retired', 'CoordinateStartValue'), '50xx0114': ('US', '1-n', "Coordinate Step Value", 'Retired', 'CoordinateStepValue'), '50xx1001': ('CS', '1', "Curve Activation Layer", 'Retired', 'CurveActivationLayer'), '50xx2000': ('US', '1', "Audio Type", 'Retired', 'AudioType'), '50xx2002': ('US', '1', "Audio Sample Format", 'Retired', 'AudioSampleFormat'), '50xx2004': ('US', '1', "Number of Channels", 'Retired', 'NumberOfChannels'), '50xx2006': ('UL', '1', "Number of Samples", 'Retired', 'NumberOfSamples'), '50xx2008': ('UL', '1', "Sample Rate", 'Retired', 'SampleRate'), '50xx200A': ('UL', '1', "Total Time", 'Retired', 'TotalTime'), '50xx200C': ('OB or OW', '1', "Audio Sample Data", 'Retired', 'AudioSampleData'), '50xx200E': ('LT', '1', "Audio Comments", 'Retired', 'AudioComments'), '50xx2500': ('LO', '1', "Curve Label", 'Retired', 'CurveLabel'), '50xx2600': ('SQ', '1', "Curve Referenced Overlay Sequence", 'Retired', 'CurveReferencedOverlaySequence'), '50xx2610': ('US', '1', "Curve Referenced Overlay Group", 'Retired', 'CurveReferencedOverlayGroup'), '50xx3000': ('OB or OW', '1', "Curve Data", 'Retired', 'CurveData'), '60xx0010': ('US', '1', "Overlay Rows", '', 'OverlayRows'), '60xx0011': ('US', '1', "Overlay Columns", '', 'OverlayColumns'), '60xx0012': ('US', '1', "Overlay Planes", 'Retired', 'OverlayPlanes'), '60xx0015': ('IS', '1', "Number of Frames in Overlay", '', 'NumberOfFramesInOverlay'), '60xx0022': ('LO', '1', "Overlay Description", '', 'OverlayDescription'), '60xx0040': ('CS', '1', "Overlay Type", '', 'OverlayType'), '60xx0045': ('LO', '1', "Overlay Subtype", '', 'OverlaySubtype'), '60xx0050': ('SS', '2', "Overlay Origin", '', 'OverlayOrigin'), '60xx0051': ('US', '1', "Image Frame Origin", '', 'ImageFrameOrigin'), '60xx0052': ('US', '1', "Overlay Plane Origin", 'Retired', 'OverlayPlaneOrigin'), '60xx0060': ('CS', '1', "Overlay Compression Code", 'Retired', 'OverlayCompressionCode'), '60xx0061': ('SH', '1', "Overlay Compression Originator", 'Retired', 'OverlayCompressionOriginator'), '60xx0062': ('SH', '1', "Overlay Compression Label", 'Retired', 'OverlayCompressionLabel'), '60xx0063': ('CS', '1', "Overlay Compression Description", 'Retired', 'OverlayCompressionDescription'), '60xx0066': ('AT', '1-n', "Overlay Compression Step Pointers", 'Retired', 'OverlayCompressionStepPointers'), '60xx0068': ('US', '1', "Overlay Repeat Interval", 'Retired', 'OverlayRepeatInterval'), '60xx0069': ('US', '1', "Overlay Bits Grouped", 'Retired', 'OverlayBitsGrouped'), '60xx0100': ('US', '1', "Overlay Bits Allocated", '', 'OverlayBitsAllocated'), '60xx0102': ('US', '1', "Overlay Bit Position", '', 'OverlayBitPosition'), '60xx0110': ('CS', '1', "Overlay Format", 'Retired', 'OverlayFormat'), '60xx0200': ('US', '1', "Overlay Location", 'Retired', 'OverlayLocation'), '60xx0800': ('CS', '1-n', "Overlay Code Label", 'Retired', 'OverlayCodeLabel'), '60xx0802': ('US', '1', "Overlay Number of Tables", 'Retired', 'OverlayNumberOfTables'), '60xx0803': ('AT', '1-n', "Overlay Code Table Location", 'Retired', 'OverlayCodeTableLocation'), '60xx0804': ('US', '1', "Overlay Bits For Code Word", 'Retired', 'OverlayBitsForCodeWord'), '60xx1001': ('CS', '1', "Overlay Activation Layer", '', 'OverlayActivationLayer'), '60xx1100': ('US', '1', "Overlay Descriptor - Gray", 'Retired', 'OverlayDescriptorGray'), '60xx1101': ('US', '1', "Overlay Descriptor - Red", 'Retired', 'OverlayDescriptorRed'), '60xx1102': ('US', '1', "Overlay Descriptor - Green", 'Retired', 'OverlayDescriptorGreen'), '60xx1103': ('US', '1', "Overlay Descriptor - Blue", 'Retired', 'OverlayDescriptorBlue'), '60xx1200': ('US', '1-n', "Overlays - Gray", 'Retired', 'OverlaysGray'), '60xx1201': ('US', '1-n', "Overlays - Red", 'Retired', 'OverlaysRed'), '60xx1202': ('US', '1-n', "Overlays - Green", 'Retired', 'OverlaysGreen'), '60xx1203': ('US', '1-n', "Overlays - Blue", 'Retired', 'OverlaysBlue'), '60xx1301': ('IS', '1', "ROI Area", '', 'ROIArea'), '60xx1302': ('DS', '1', "ROI Mean", '', 'ROIMean'), '60xx1303': ('DS', '1', "ROI Standard Deviation", '', 'ROIStandardDeviation'), '60xx1500': ('LO', '1', "Overlay Label", '', 'OverlayLabel'), '60xx3000': ('OB or OW', '1', "Overlay Data", '', 'OverlayData'), '60xx4000': ('LT', '1', "Overlay Comments", 'Retired', 'OverlayComments'), '7Fxx0010': ('OB or OW', '1', "Variable Pixel Data", 'Retired', 'VariablePixelData'), '7Fxx0011': ('US', '1', "Variable Next Data Group", 'Retired', 'VariableNextDataGroup'), '7Fxx0020': ('OW', '1', "Variable Coefficients SDVN", 'Retired', 'VariableCoefficientsSDVN'), '7Fxx0030': ('OW', '1', "Variable Coefficients SDHN", 'Retired', 'VariableCoefficientsSDHN'), '7Fxx0040': ('OW', '1', "Variable Coefficients SDDN", 'Retired', 'VariableCoefficientsSDDN') } pydicom-pydicom-20aa4b7/src/pydicom/_private_dict.py000066400000000000000000022167741515706620200226720ustar00rootroot00000000000000"""DICOM private dictionary auto-generated by generate_private_dict.py. Data generated from GDCM project's private dictionary. The outer dictionary key is the Private Creator name ("owner"), while the inner dictionary key is a map of DICOM tag to (VR, VM, name, is_retired). """ private_dictionaries: dict[str, dict[str, tuple[str, str, str, str]]] = { '1.2.840.113663.1': { '0029xx00': ('US', '1', 'Unknown', ''), '0029xx01': ('US', '1', 'Unknown', ''), }, '1.2.840.113681': { '0019xx10': ('ST', '1', 'CR Image Params Common', ''), '0019xx11': ('ST', '1', 'CR Image IP Params Single', ''), '0019xx12': ('ST', '1', 'CR Image IP Params Left', ''), '0019xx13': ('ST', '1', 'CR Image IP Params Right', ''), }, '1.2.840.113708.794.1.1.2.0': { '0087xx10': ('CS', '1', 'Media Type', ''), '0087xx20': ('CS', '1', 'Media Location', ''), '0087xx30': ('ST', '1', 'Storage File ID', ''), '0087xx40': ('DS', '1', 'Study or Image Size in MB', ''), '0087xx50': ('IS', '1', 'Estimated Retrieve Time', ''), }, '2.16.840.1.114059.1.1.6.1.50.1': { '0029xx20': ('LT', '1', 'Description', ''), '0029xx21': ('ST', '1', 'Orientation', ''), '0029xx22': ('ST', '1', 'Parameter 1', ''), '0029xx23': ('ST', '1', 'Parameter 2', ''), '0029xx24': ('LO', '1', 'Teeth', ''), '0029xx25': ('LO', '1', 'Jaw', ''), '0029xx26': ('LO', '1', 'Quadrant', ''), '0029xx27': ('LO', '1', 'CRC', ''), }, 'A.L.I. Technologies, Inc.': { '3711xx01': ('LO', '1', 'Filename', ''), '3711xx02': ('OB', '1', 'Data Blob of a Visit', ''), '3711xx03': ('US', '1', 'Revision Number', ''), '3711xx04': ('UL', '1', 'Unix Timestamp', ''), '3711xx05': ('IS', '1', 'Bag ID', ''), '3711xx0C': ('UI', '1', 'Original Study UID', ''), '3711xx0D': ('US', '1', 'Overlay Grayscale Value', ''), '3711xx0E': ('CS', '1', 'Anonymization Status', ''), }, 'ACUSON': { '0009xx00': ('IS', '1', 'Unknown', ''), '0009xx01': ('IS', '1', 'Unknown', ''), '0009xx02': ('UN', '1', 'Unknown', ''), '0009xx03': ('UN', '1', 'Unknown', ''), '0009xx04': ('UN', '1', 'Unknown', ''), '0009xx05': ('UN', '1', 'Unknown', ''), '0009xx06': ('UN', '1', 'Unknown', ''), '0009xx07': ('UN', '1', 'Unknown', ''), '0009xx08': ('LT', '1', 'Unknown', ''), '0009xx09': ('LT', '1', 'Unknown', ''), '0009xx0A': ('IS', '1', 'Unknown', ''), '0009xx0B': ('IS', '1', 'Unknown', ''), '0009xx0C': ('IS', '1', 'Unknown', ''), '0009xx0D': ('IS', '1', 'Unknown', ''), '0009xx0E': ('IS', '1', 'Unknown', ''), '0009xx0F': ('UN', '1', 'Unknown', ''), '0009xx10': ('IS', '1', 'Unknown', ''), '0009xx11': ('UN', '1', 'Unknown', ''), '0009xx12': ('IS', '1', 'Unknown', ''), '0009xx13': ('IS', '1', 'Unknown', ''), '0009xx14': ('LT', '1', 'Unknown', ''), '0009xx15': ('UN', '1', 'Unknown', ''), }, 'ACUSON: 1.2.840.11386.1.0': { '7FDFxx00': ('IS', '1', 'Lossy Compression Ratio', ''), '7FDFxx01': ('US', '1', 'Image Format', ''), '7FDFxx02': ('US', '1', 'Acuson Region Type', ''), '7FDFxx0B': ('UL', '1', 'Acuson Image Apex X', ''), '7FDFxx0C': ('UL', '1', 'Acuson Image Apex Y', ''), '7FDFxx0D': ('IS', '1', 'B-Color-On Flag', ''), }, 'ACUSON:1.2.840.113680.1.0:0921': { '0009xx20': ('UN', '1', 'View Name', ''), '0009xx2A': ('UN', '1', 'View List', ''), }, 'ACUSON:1.2.840.113680.1.0:7f10': { '7FDFxx00': ('UN', '1', 'Lossy Compression Ratio', ''), '7FDFxx01': ('UN', '1', 'Image Format', ''), '7FDFxx02': ('UN', '1', 'Acuson Region Type', ''), '7FDFxx0B': ('UN', '1', 'Acuson Image Apex X', ''), '7FDFxx0C': ('UN', '1', 'Acuson Image Apex Y', ''), '7FDFxx0D': ('UN', '1', 'B-Color-On Flag', ''), '7FDFxx0E': ('UN', '1', 'Acuson Mechanical Apex X', ''), '7FDFxx0F': ('UN', '1', 'Acuson Mechanical Apex Y', ''), '7FDFxx10': ('UN', '1', 'Acquisition Type:', ''), '7FDFxx18': ('UN', '1', 'Transformation Matrix Sequence', ''), '7FDFxx20': ('UN', '1', 'Left angle', ''), '7FDFxx22': ('UN', '1', 'Right angle', ''), '7FDFxx24': ('UN', '1', 'Color Map Family', ''), '7FDFxx25': ('UN', '1', 'Full Colormap.', ''), '7FDFxx26': ('UN', '1', 'Color Invert', ''), '7FDFxx27': ('UN', '1', 'Color Baseline', ''), '7FDFxx28': ('UN', '1', 'CD Color Mix Points X1', ''), '7FDFxx29': ('UN', '1', 'CD Color Mix Points Y1', ''), '7FDFxx2A': ('UN', '1', 'CD Color Mix Points X2', ''), '7FDFxx2B': ('UN', '1', 'CD Color Mix Points Y2', ''), '7FDFxx2C': ('UN', '1', 'Color Accent', ''), '7FDFxx30': ('UN', '1', 'Persistence SQ', ''), '7FDFxx31': ('UN', '1', 'Persistence Mode', ''), '7FDFxx32': ('UN', '1', 'Persistence Coefficient Mode', ''), '7FDFxx33': ('UN', '1', 'Alpha coefficient', ''), '7FDFxx34': ('UN', '1', 'Gamma coefficient', ''), '7FDFxx35': ('UN', '1', 'Persistence Time Flag', ''), '7FDFxx36': ('UN', '1', 'Persistence adaptive flag', ''), '7FDFxx37': ('UN', '1', 'Persistence Frame Rate', ''), '7FDFxx38': ('UN', '1', 'Persistence ID', ''), '7FDFxx40': ('UN', '1', 'Observation Date Time SQ', ''), '7FDFxx50': ('UN', '1', 'Capture Type Name', ''), '7FDFxx52': ('UN', '1', 'Capture Type Number', ''), '7FDFxx54': ('UN', '1', 'Number of Capture Types', ''), '7FDFxx60': ('UN', '1', 'CD Steering Angle', ''), '7FDFxx61': ('UN', '1', 'CD PRI', ''), '7FDFxx62': ('UN', '1', 'CD Dynamic Range', ''), '7FDFxx63': ('UN', '1', 'CD Velocity Scale Min', ''), '7FDFxx64': ('UN', '1', 'CD Velocity Scale Max', ''), '7FDFxx65': ('UN', '1', 'CD Color Mode', ''), '7FDFxx66': ('UN', '1', 'CD Frequency', ''), '7FDFxx67': ('UN', '1', 'CD Balance', ''), '7FDFxx68': ('UN', '1', 'CD Delta', ''), '7FDFxx69': ('UN', '1', 'CD Pan Box Min X0', ''), '7FDFxx6A': ('UN', '1', 'CD Pan Box Min Y0', ''), '7FDFxx6B': ('UN', '1', 'CD Pan Box Min X1', ''), '7FDFxx6C': ('UN', '1', 'CD Pan Box Min Y1', ''), '7FDFxx6D': ('UN', '1', 'CPS Map Type', ''), '7FDFxx6E': ('UN', '1', 'CPS Map Data', ''), '7FDFxx6F': ('UN', '1', 'CPS Balance Setting', ''), '7FDFxx70': ('UN', '1', '3DCard Step Angle', ''), '7FDFxx71': ('UN', '1', '3DCard Xdcr Angle', ''), '7FDFxx72': ('UN', '1', 'B-mode Frequency', ''), '7FDFxx73': ('UN', '1', 'B-mode Dynamic Range', ''), '7FDFxx74': ('UN', '1', 'B-mode Frame Rate', ''), '7FDFxx75': ('UN', '1', 'B-mode Space Time', ''), '7FDFxx76': ('UN', '1', 'B-mode Persistence', ''), '7FDFxx77': ('UN', '1', 'B-mode Display Depth Start', ''), '7FDFxx78': ('UN', '1', 'B-mode Display Depth End', ''), '7FDFxx79': ('UN', '1', 'B-mode Res Mode', ''), '7FDFxx7A': ('UN', '1', 'B-mode Preset Application', ''), '7FDFxx7B': ('UN', '1', 'Image Spec Name', ''), '7FDFxx7C': ('UN', '1', 'B Preset Image Look', ''), '7FDFxx7D': ('UN', '1', 'B-mode Post Processing', ''), '7FDFxx7E': ('UN', '1', 'B Edge', ''), '7FDFxx7F': ('UN', '1', 'B Delta', ''), '7FDFxx80': ('UN', '1', 'B-mode 1D Post Processing Curve', ''), '7FDFxx81': ('UN', '1', 'B-mode Delta (ECRI) Map Diagonal', ''), '7FDFxx82': ('UN', '1', 'Bytes Per Timestamp', ''), '7FDFxx83': ('UN', '1', 'Microseconds in unit timestamp', ''), '7FDFxx84': ('UN', '1', 'Start Stopwatch Timestamp', ''), '7FDFxx85': ('UN', '1', 'Acoustic Frame Timestamp', ''), '7FDFxx86': ('UN', '1', 'R-Wave Timestamp', ''), '7FDFxx87': ('UN', '1', 'Last Destruction Timestamp', ''), '7FDFxx88': ('UN', '1', 'Pixels Per Second', ''), '7FDFxx89': ('UN', '1', 'ECG Reference Timestamp', ''), '7FDFxx8A': ('UN', '1', 'ECG Sampling Interval (milliseconds)', ''), '7FDFxx8B': ('UN', '1', 'ECG Sample Count', ''), '7FDFxx8C': ('UN', '1', 'ECG Sample Size', ''), '7FDFxx8D': ('UN', '1', 'ECG Data Value', ''), '7FDFxx8E': ('UN', '1', 'Contrast/Active Image Indicator', ''), '7FDFxx8F': ('UN', '1', 'Live Dual Mode Indicator', ''), '7FDFxx90': ('UN', '1', '3DCard Clipset ID', ''), '7FDFxx91': ('UN', '1', '3DCard HRWave Min', ''), '7FDFxx92': ('UN', '1', '3DCard HRWave Max', ''), '7FDFxx93': ('UN', '1', 'Perspective Capture Type', ''), '7FDFxxF1': ('UN', '1', 'Trigger Mask.', ''), '7FDFxxF2': ('UN', '1', 'Study Directory', ''), '7FDFxxF3': ('UN', '1', 'Last Modify Date', ''), '7FDFxxF4': ('UN', '1', 'Last Modify Time', ''), '7FDFxxF5': ('UN', '1', 'Teaching Study', ''), '7FDFxxF6': ('UN', '1', 'Series Base UID', ''), }, 'ACUSON:1.2.840.113680.1.0:7ffe': { '7FDFxx00': ('UN', '1', 'Data Padding', ''), }, 'ADAC_IMG': { '0019xx02': ('IS', '1', 'Ver200 ADAC Pegasys File Size', ''), '0019xx10': ('LO', '2', 'ADAC Header Signature', ''), '0019xx11': ('US', '1', 'Number of ADAC Headers', ''), '0019xx12': ('IS', '1-n', 'ADAC Header/Image Sizes', ''), '0019xx20': ('OB', '1', 'ADAC Pegasys Headers', ''), '0019xx21': ('US', '1', 'Ver200 Number of ADAC Headers', ''), '0019xx41': ('IS', '1-n', 'Ver200 ADAC Header/Image Size', ''), '0019xx61': ('OB', '1', 'Ver200 ADAC Pegasys Headers', ''), '7043xx00': ('SH', '1', 'Cardiac Stress State', ''), '7043xx10': ('LO', '1', 'Philips NM Private Group', ''), }, 'AEGIS_DICOM_2.00': { '0003xx00': ('US', '1-n', 'Unknown', ''), '0005xx00': ('US', '1-n', 'Unknown', ''), '0009xx00': ('US', '1-n', 'Unknown', ''), '0019xx00': ('US', '1-n', 'Unknown', ''), '0029xx00': ('US', '1-n', 'Unknown', ''), '1369xx00': ('US', '1-n', 'Unknown', ''), }, 'AGFA': { '0009xx10': ('LO', '1', 'Unknown', ''), '0009xx11': ('LO', '1', 'Unknown', ''), '0009xx13': ('LO', '1', 'Unknown', ''), '0009xx14': ('LO', '1', 'Unknown', ''), '0009xx15': ('LO', '1', 'Unknown', ''), '0019xx10': ('SH', '1', 'Private Identification Code', ''), '0019xx11': ('LO', '3', 'Identification Data (Note 2)', ''), '0019xx13': ('LO', '1', 'Sensitometry Name', ''), '0019xx14': ('ST', '3', 'Window/Level List (Note 3)', ''), '0019xx15': ('LO', '1', 'Dose Monitoring List', ''), '0019xx16': ('LO', '3', 'Other Info (Note 5)', ''), '0019xx1A': ('LO', '1', 'Clipped Exposure Deviation', ''), '0019xx1B': ('LO', '1', 'Logarithmic PLT Full Scale', ''), '0019xx60': ('US', '1', 'Total number of series', ''), '0019xx61': ('SH', '1', 'Session Number', ''), '0019xx62': ('SH', '1', 'ID Station name', ''), '0019xx65': ('US', '1', 'Number of images in study to be transmitted (only sent with autoverify: on)', ''), '0019xx70': ('US', '1', 'Total number of images', ''), '0019xx80': ('ST', '1', 'Geometrical Transformations', ''), '0019xx81': ('ST', '1', 'Roam Origin', ''), '0019xx82': ('US', '1', 'Zoom factor', ''), '0019xx93': ('CS', '1', 'Status', ''), }, 'AGFA PACS Archive Mirroring 1.0': { '0031xx00': ('CS', '1', 'Unknown', ''), '0031xx01': ('UL', '1', 'Unknown', ''), }, 'AGFA-AG_HPState': { '0071xx18': ('SQ', '1', 'Unknown', ''), '0071xx19': ('SQ', '1', 'Unknown', ''), '0071xx1A': ('SQ', '1', 'Unknown', ''), '0071xx1C': ('SQ', '1', 'Unknown', ''), '0071xx1E': ('SQ', '1', 'Unknown', ''), '0071xx20': ('FL', '1-n', 'Unknown', ''), '0071xx21': ('FD', '1-n', 'Unknown', ''), '0071xx22': ('FD', '1-n', 'Unknown', ''), '0071xx23': ('FD', '1-n', 'Unknown', ''), '0071xx24': ('FD', '1', 'Unknown', ''), '0073xx23': ('SH', '1', 'Unknown', ''), '0073xx24': ('SQ', '1', 'Unknown', ''), '0073xx28': ('SQ', '1', 'Unknown', ''), '0073xx80': ('FL', '1', 'Unknown', ''), '0075xx10': ('LO', '1', 'Unknown', ''), '0087xx01': ('LO', '1', 'Unknown', ''), '0087xx02': ('LO', '1', 'Unknown', ''), }, 'AGFA_ADC_Compact': { '0019xx05': ('ST', '1', 'Data stream from cassette', ''), '0019xx10': ('LO', '1', 'Private Identification Code', ''), '0019xx30': ('ST', '1', 'Set of destination types', ''), '0019xx40': ('ST', '1', 'Set of destination Ids', ''), '0019xx50': ('ST', '1', 'Set of processing codes', ''), '0019xx60': ('US', '1', 'Number of series in study', ''), '0019xx61': ('US', '1', 'Session Number', ''), '0019xx62': ('SH', '1', 'ID station name', ''), '0019xx70': ('US', '1', 'Number of images in series', ''), '0019xx71': ('US', '1', 'Break condition', ''), '0019xx72': ('US', '1', 'Wait (or Hold) flag', ''), '0019xx73': ('US', '1', 'ScanRes flag', ''), '0019xx74': ('SH', '1', 'Operation code', ''), '0019xx95': ('CS', '1', 'Image quality', ''), }, 'ALOKA:1.2.392.200039.103.2': { '0009xx00': ('SH', '1', 'Unknown', ''), '0009xx04': ('US', '1-n', 'Unknown', ''), '0009xx06': ('US', '1-n', 'Unknown', ''), '0009xx0A': ('SH', '1', 'Unknown', ''), '0009xx20': ('CS', '1', 'Unknown', ''), '0009xx22': ('CS', '1', 'Unknown', ''), '0009xx24': ('CS', '1', 'Unknown', ''), '0009xx26': ('IS', '1', 'Unknown', ''), '0009xx28': ('IS', '1', 'Unknown', ''), '0009xx2A': ('DS', '1', 'Unknown', ''), '0009xx30': ('FD', '1', 'Unknown', ''), '0009xx32': ('DS', '1', 'Unknown', ''), '0009xx34': ('CS', '1', 'Unknown', ''), '0019xx08': ('FD', '1', 'Unknown', ''), '0019xx0C': ('CS', '1', 'Unknown', ''), '0019xx0E': ('DS', '1', 'Unknown', ''), '0019xx18': ('SL', '1', 'Unknown', ''), '0019xx1A': ('SL', '1', 'Unknown', ''), '0019xx40': ('SS', '1', 'Unknown', ''), '0019xx46': ('US', '1', 'Unknown', ''), '0019xx50': ('SL', '1', 'Unknown', ''), '0019xx52': ('DS', '1', 'Unknown', ''), '0019xx54': ('DS', '1', 'Unknown', ''), '0019xx56': ('FD', '1', 'Unknown', ''), }, 'AMI Annotations_01': { '3101xx10': ('SQ', '1', 'AMI Annotation Sequence (RET)', ''), }, 'AMI Annotations_02': { '3101xx20': ('SQ', '1', 'AMI Annotation Sequence (RET)', ''), }, 'AMI ImageContextExt_01': { '3107xxA0': ('CS', '1', 'AMI Window Function (RET)', ''), '3107xxB0': ('DS', '1', 'AMI Window Slope (RET)', ''), }, 'AMI ImageContext_01': { '3109xx10': ('CS', '1', 'AMI Window Invert (RET)', ''), '3109xx20': ('IS', '1', 'AMI Window Center (RET)', ''), '3109xx30': ('IS', '1', 'AMI Window Widith (RET)', ''), '3109xx40': ('CS', '1', 'AMI Pixel Aspect Ratio Swap (RET)', ''), '3109xx50': ('CS', '1', 'AMI Enable Averaging (RET)', ''), '3109xx60': ('CS', '1', 'AMI Quality (RET)', ''), '3109xx70': ('CS', '1', 'AMI Viewport Annotation Level (RET)', ''), '3109xx80': ('CS', '1', 'AMI Show Image Annotation (RET)', ''), '3109xx90': ('CS', '1', 'AMI Show Image Overlay (RET)', ''), }, 'AMI ImageTransform_01': { '3107xx10': ('DS', '1', 'AMI Transformation Matrix (RET)', ''), '3107xx20': ('DS', '1', 'AMI Center Offset (RET)', ''), '3107xx30': ('DS', '1', 'AMI Magnification (RET)', ''), '3107xx40': ('CS', '1', 'AMI Magnification Type (RET)', ''), '3107xx50': ('DS', '1', 'AMI Displayed Area (RET)', ''), '3107xx60': ('DS', '1', 'AMI Calibration Factor (RET)', ''), }, 'AMI Sequence AnnotElements_01': { '3105xx10': ('DS', '1', 'AMI Annotation Element Position', ''), '3105xx20': ('LT', '1', 'AMI Annotation Element Text', ''), }, 'AMI Sequence Annotations_01': { '3103xx10': ('CS', '1', 'AMI Annotation Sequence (RET)', ''), '3103xx20': ('UI', '1', 'AMI Annotation UID (RET)', ''), '3103xx30': ('US', '1', 'AMI Annotation Color (RET)', ''), '3103xx40': ('FD', '1', 'FontSize', ''), '3103xx50': ('CS', '1', 'AMI Annotation Line Style (RET)', ''), '3103xx60': ('SQ', '1', 'AMI Annotation Elements (RET)', ''), '3103xx70': ('SH', '1', 'AMI Annotation Label (RET)', ''), '3103xx80': ('PN', '1', 'AMI Annotation Creator (RET)', ''), '3103xx90': ('PN', '1', 'AMI Annotation Modifiers (RET)', ''), '3103xxA0': ('DA', '1', 'AMI Annotation Creation Date (RET)', ''), '3103xxB0': ('TM', '1', 'AMI Annotation Creation Time (RET)', ''), '3103xxC0': ('DA', '1', 'AMI Annotation Modification Dates (RET)', ''), '3103xxD0': ('TM', '1', 'AMI Annotation Modification Times (RET)', ''), '3103xxE0': ('US', '1', 'AMI Annotation Frame Number (RET)', ''), }, 'AMI Sequence Annotations_02': { '3103xx10': ('CS', '1', 'AMI Annotation Sequence (RET)', ''), '3103xx20': ('UI', '1', 'AMI Annotation UID (RET)', ''), '3103xx30': ('US', '1', 'AMI Annotation Color (RET)', ''), '3103xx50': ('CS', '1', 'AMI Annotation Line Style (RET)', ''), '3103xx60': ('SQ', '1', 'AMI Annotation Elements (RET)', ''), '3103xx70': ('SH', '1', 'AMI Annotation Label (RET)', ''), '3103xx80': ('PN', '1', 'AMI Annotation Creator (RET)', ''), '3103xx90': ('PN', '1', 'AMI Annotation Modifiers (RET)', ''), '3103xxA0': ('DA', '1', 'AMI Annotation Creation Date (RET)', ''), '3103xxB0': ('TM', '1', 'AMI Annotation Creation Time (RET)', ''), '3103xxC0': ('DA', '1', 'AMI Annotation Modification Dates (RET)', ''), '3103xxD0': ('TM', '1', 'AMI Annotation Modification Times (RET)', ''), '3103xxE0': ('US', '1', 'AMI Annotation Frame Number (RET)', ''), }, 'AMI StudyExtensions_01': { '3111xx01': ('UL', '1', 'AMI Last Released Annot Label (RET)', ''), }, 'AMICAS0': { '0023xx01': ('UI', '1', '', ''), '0023xx08': ('US', '1', '', ''), '0023xx10': ('US', '1', '', ''), '0023xx16': ('SL', '1', '', ''), }, 'APEX_PRIVATE': { '0027xx10': ('LO', '1', 'Private Creator', ''), '0027xx11': ('DS', '1', 'Bed Position', ''), }, 'ATL HDI V1.0': { '0009xx00': ('UN', '1', 'Private', ''), '0009xx10': ('UN', '1', 'Private', ''), '0009xx20': ('UN', '1', 'Private', ''), '0009xx30': ('UN', '1', 'Private', ''), '0009xx40': ('UN', '1', 'Private', ''), '0009xx50': ('UN', '1', 'Private', ''), '0009xx60': ('UN', '1', 'Private', ''), '0009xx70': ('UN', '1', 'Private', ''), '0009xx80': ('UN', '1', 'Private', ''), '0009xx90': ('UN', '1', 'Private', ''), '0009xx91': ('UN', '1', 'Private', ''), '0029xx30': ('UN', '1', 'Loop Mode', ''), '0029xx31': ('UN', '1', 'Trigger mode', ''), '0029xx32': ('UN', '1', 'Number of Loops', ''), '0029xx33': ('UN', '1', 'Loop Indexes', ''), '0029xx34': ('UN', '1', 'Loop Heart Rates', ''), '0029xx35': ('UN', '1', 'Medications', ''), }, 'ATL PRIVATE TAGS': { '0029xx30': ('UL', '1', 'Loop Mode', ''), '0029xx31': ('UL', '1', 'Trigger mode', ''), '0029xx32': ('UL', '1', 'Number of Loops', ''), '0029xx33': ('DS', '1-n', 'Loop Indexes', ''), '0029xx34': ('DS', '1-n', 'Loop Heart Rates', ''), '0029xx35': ('LO', '1', 'Medications', ''), }, 'Acuson X500': { '0009xx20': ('UN', '1', '(a)View Name', ''), '0009xx2A': ('UN', '1', 'View List', ''), '0011xx10': ('UN', '1', 'Siemens Medical', ''), '0011xx11': ('UN', '1', 'DIMAQ Software', ''), '0011xx20': ('UN', '1', 'Private Data', ''), '0011xx21': ('UN', '1', 'Private Data', ''), '0013xx10': ('UN', '1', 'Siemens Medical', ''), '0013xx11': ('UN', '1', 'DIMAQ Software', ''), '0013xx20': ('UN', '1', 'Private Data', ''), '0015xx10': ('UN', '1', 'Siemens Medical', ''), '0015xx11': ('UN', '1', 'DIMAQ Software', ''), '0015xx20': ('UN', '1', 'Private Data', ''), '0017xx10': ('UN', '1', 'Siemens Medical', ''), '0017xx11': ('UN', '1', 'DIMAQ Software', ''), '0017xx20': ('UN', '1', 'Private Data', ''), '0019xx20': ('UN', '1', 'Import Structured', ''), }, 'Agfa ADC NX': { '0019xx09': ('SQ', '1', 'Unknown', ''), '0019xxF5': ('CS', '1', 'Cassette Orientation', ''), '0019xxF6': ('DS', '1', 'Plate Sensitivity', ''), '0019xxF7': ('DS', '1', 'Plate Erasability', ''), '0019xxF8': ('IS', '1', 'Unknown', ''), '0019xxFE': ('CS', '1', 'Unknown', ''), }, 'AgilityRuntime': { '0029xx11': ('CS', '1', 'Unknown', ''), '0029xx12': ('US', '1', 'Unknown', ''), '0029xx13': ('US', '1', 'Unknown', ''), '0029xx14': ('US', '1', 'Unknown', ''), '0029xx1F': ('US', '1', 'Unknown', ''), }, 'Applicare/Centricity Radiology Web/Version 1.0': { '4109xx01': ('SH', '1', 'Mammography Laterality', ''), '4109xx02': ('SH', '1', 'Mammography View Name', ''), '4109xx03': ('SH', '1', 'Mammography View Modifier', ''), }, 'Applicare/Centricity Radiology Web/Version 2.0': { '4111xx01': ('CS', '1', 'Secondary Spine Label', ''), '4111xx02': ('IS', '1', 'Additional tags for Presentation State', ''), }, 'Applicare/Print/Version 5.1': { '4101xx01': ('UL', '1', ' bytes: """Convert a unicode string into JIS X 0201 byte string using shift_jis encodings. shift_jis is a superset of jis_x_0201. So we can regard the encoded value as jis_x_0201 if it is single byte character. Parameters ---------- value : str The unicode string as presented to the user. errors : str The behavior of a character which could not be encoded. If 'strict' is passed, raise an UnicodeEncodeError. If any other value is passed, non ISO IR 14 characters are replaced by the ASCII '?'. Returns ------- bytes The encoded string. If some characters in value could not be encoded to JIS X 0201, and `errors` is not set to 'strict', they are replaced to '?'. Raises ------ UnicodeEncodeError If errors is set to 'strict' and `value` could not be encoded with JIS X 0201. """ encoder_class = codecs.getincrementalencoder("shift_jis") encoder = encoder_class() # If errors is not strict, this function is used as fallback. # In this case, we use only ISO IR 14 to encode given value # without escape sequence. if errors != "strict" or value == "": encoded = b"" for c in value: try: b = encoder.encode(c) except UnicodeEncodeError: b = b"?" if len(b) != 1 or 0x80 <= ord(b): b = b"?" encoded += b return encoded encoded = encoder.encode(value[0]) if len(encoded) != 1: raise UnicodeEncodeError( "shift_jis", value, 0, len(value), "illegal multibyte sequence" ) msb = ord(encoded) & 0x80 # msb is 1 for ISO IR 13, 0 for ISO IR 14 for i, c in enumerate(value[1:], 1): try: b = encoder.encode(c) except UnicodeEncodeError as e: e.start = i e.end = len(value) raise e if len(b) != 1 or ((ord(b) & 0x80) ^ msb) != 0: character_set = "ISO IR 14" if msb == 0 else "ISO IR 13" msg = f"Given character is out of {character_set}" raise UnicodeEncodeError("shift_jis", value, i, len(value), msg) encoded += b return encoded def _encode_to_jis_x_0208(value: str, errors: str = "strict") -> bytes: """Convert a unicode string into JIS X 0208 encoded bytes.""" return _encode_to_given_charset(value, "ISO 2022 IR 87", errors=errors) def _encode_to_jis_x_0212(value: str, errors: str = "strict") -> bytes: """Convert a unicode string into JIS X 0212 encoded bytes.""" return _encode_to_given_charset(value, "ISO 2022 IR 159", errors=errors) def _encode_to_given_charset( value: str, character_set: str, errors: str = "strict" ) -> bytes: """Encode a unicode string using the given character set. The escape sequence which is located at the end of the encoded value has to vary depending on the value 1 of SpecificCharacterSet. So we have to trim it and append the correct escape sequence manually. Parameters ---------- value : text type The unicode string as presented to the user. character_set: str: Character set for result. errors : str The behavior of a character which could not be encoded. This value is passed to errors argument of str.encode(). Returns ------- bytes The encoded string. If some characters in value could not be encoded to given character_set, it depends on the behavior of corresponding python encoder. Raises ------ UnicodeEncodeError If errors is set to 'strict' and `value` could not be encoded with given character_set. """ encoding = python_encoding[character_set] # If errors is not strict, this function is used as fallback. # So keep the tail escape sequence of encoded for backward compatibility. if errors != "strict": return value.encode(encoding, errors=errors) encoder_class = codecs.getincrementalencoder(encoding) encoder = encoder_class() encoded = encoder.encode(value[0]) if not encoded.startswith(ENCODINGS_TO_CODES[encoding]): raise UnicodeEncodeError( encoding, value, 0, len(value), f"Given character is out of {character_set}" ) for i, c in enumerate(value[1:], 1): try: b = encoder.encode(c) except UnicodeEncodeError as e: e.start = i e.end = len(value) raise e if b[:1] == ESC: raise UnicodeEncodeError( encoding, value, i, len(value), f"Given character is out of {character_set}", ) encoded += b return encoded def _get_escape_sequence_for_encoding( encoding: str, encoded: bytes | None = None ) -> bytes: """Return an escape sequence corresponding to the given encoding. If encoding is 'shift_jis', return 'ESC)I' or 'ESC(J' depending on the first byte of encoded. Parameters ---------- encoding : str An encoding is used to specify an escape sequence. encoded : bytes The encoded value is used to choose an escape sequence if encoding is 'shift_jis'. Returns ------- bytes Escape sequence for encoded value. """ ESC_ISO_IR_14 = ESC + b"(J" ESC_ISO_IR_13 = ESC + b")I" if encoding == "shift_jis": if encoded is None: return ESC_ISO_IR_14 first_byte = encoded[0] if 0x80 <= first_byte: return ESC_ISO_IR_13 return ESC_ISO_IR_14 return ENCODINGS_TO_CODES.get(encoding, b"") # These encodings need escape sequence to handle alphanumeric characters. need_tail_escape_sequence_encodings = ("iso2022_jp", "iso2022_jp_2") custom_encoders = { "shift_jis": _encode_to_jis_x_0201, "iso2022_jp": _encode_to_jis_x_0208, "iso2022_jp_2": _encode_to_jis_x_0212, } def decode_bytes(value: bytes, encodings: Sequence[str], delimiters: set[int]) -> str: """Decode an encoded byte `value` into a unicode string using `encodings`. Parameters ---------- value : bytes The encoded byte string in the DICOM element value. encodings : list of str The encodings needed to decode the string as a list of Python encodings, converted from the encodings in (0008,0005) *Specific Character Set*. delimiters : set of int A set of characters or character codes, each of which resets the encoding in `value`. Returns ------- str The decoded unicode string. If the value could not be decoded, and :attr:`~pydicom.config.settings.reading_validation_mode` is not ``RAISE``, a warning is issued, and `value` is decoded using the first encoding with replacement characters, resulting in data loss. Raises ------ UnicodeDecodeError If :attr:`~pydicom.config.settings.reading_validation_mode` is ``RAISE`` and `value` could not be decoded with the given encodings. LookupError If :attr:`~pydicom.config.settings.reading_validation_mode` is ``RAISE`` and the given encodings are invalid. """ # shortcut for the common case - no escape sequences present if ESC not in value: first_encoding = encodings[0] try: return value.decode(first_encoding) except LookupError: if config.settings.reading_validation_mode == config.RAISE: raise # IGNORE is handled as WARN here, as this is # not an optional validation check warn_and_log( f"Unknown encoding '{first_encoding}' - using default " "encoding instead" ) first_encoding = default_encoding return value.decode(first_encoding) except UnicodeError: if config.settings.reading_validation_mode == config.RAISE: raise warn_and_log( "Failed to decode byte string with encoding " f"'{first_encoding}' - using replacement characters in " "decoded string" ) return value.decode(first_encoding, errors="replace") # Each part of the value that starts with an escape sequence is decoded # separately. If it starts with an escape sequence, the # corresponding encoding is used, otherwise (e.g. the first part if it # does not start with an escape sequence) the first encoding. # See PS3.5, 6.1.2.4 and 6.1.2.5 for the use of code extensions. # # The following regex splits the value into these parts, by matching # the substring until the first escape character, and subsequent # substrings starting with an escape character. regex = b"(^[^\x1b]+|[\x1b][^\x1b]*)" fragments: list[bytes] = re.findall(regex, value) # decode each byte string fragment with it's corresponding encoding # and join them all together return "".join( [_decode_fragment(fragment, encodings, delimiters) for fragment in fragments] ) decode_string = decode_bytes def _decode_fragment( byte_str: bytes, encodings: Sequence[str], delimiters: set[int] ) -> str: """Decode a byte string encoded with a single encoding. If `byte_str` starts with an escape sequence, the encoding corresponding to this sequence is used for decoding if present in `encodings`, otherwise the first value in encodings. If a delimiter occurs inside the string, it resets the encoding to the first encoding in case of single-byte encodings. Parameters ---------- byte_str : bytes The encoded string to be decoded. encodings: list of str The list of Python encodings as converted from the values in the Specific Character Set tag. delimiters: set of int A set of characters or character codes, each of which resets the encoding in `byte_str`. Returns ------- str The decoded unicode string. If the value could not be decoded, and :attr:`~pydicom.config.settings.reading_validation_mode` is not set to ``RAISE``, a warning is issued, and the value is decoded using the first encoding with replacement characters, resulting in data loss. Raises ------ UnicodeDecodeError If :attr:`~pydicom.config.settings.reading_validation_mode` is set to ``RAISE`` and `value` could not be decoded with the given encodings. References ---------- * DICOM Standard, Part 5, :dcm:`Sections 6.1.2.4` and :dcm:`6.1.2.5` * DICOM Standard, Part 3, :dcm:`Annex C.12.1.1.2` """ try: if byte_str.startswith(ESC): return _decode_escaped_fragment(byte_str, encodings, delimiters) # no escape sequence - use first encoding return byte_str.decode(encodings[0]) except UnicodeError: if config.settings.reading_validation_mode == config.RAISE: raise warn_and_log( "Failed to decode byte string with encodings: " f"{', '.join(encodings)} - using replacement characters in " "decoded string" ) return byte_str.decode(encodings[0], errors="replace") def _decode_escaped_fragment( byte_str: bytes, encodings: Sequence[str], delimiters: set[int] ) -> str: """Decodes a byte string starting with an escape sequence. See `_decode_fragment` for parameter description and more information. """ # all 4-character escape codes start with one of two character sets seq_length = 4 if byte_str.startswith((b"\x1b$(", b"\x1b$)")) else 3 encoding = CODES_TO_ENCODINGS.get(byte_str[:seq_length], "") if encoding in encodings or encoding == default_encoding: if encoding in handled_encodings: # Python strips the escape sequences for this encoding. # Any delimiters must be handled correctly by `byte_str`. return byte_str.decode(encoding) # Python doesn't know about the escape sequence - # we have to strip it before decoding byte_str = byte_str[seq_length:] # If a delimiter occurs in the string, it resets the encoding. # The following returns the first occurrence of a delimiter in # the byte string, or None if it does not contain any. index = next((idx for idx, ch in enumerate(byte_str) if ch in delimiters), None) if index is not None: # the part of the string after the first delimiter # is decoded with the first encoding return byte_str[:index].decode(encoding) + byte_str[index:].decode( encodings[0] ) # No delimiter - use the encoding defined by the escape code return byte_str.decode(encoding) # unknown escape code - use first encoding msg = "Found unknown escape sequence in encoded string value" if config.settings.reading_validation_mode == config.RAISE: raise ValueError(msg) warn_and_log(f"{msg} - using encoding {encodings[0]}") return byte_str.decode(encodings[0], errors="replace") def encode_string(value: str, encodings: Sequence[str]) -> bytes: """Encode a unicode string `value` into :class:`bytes` using `encodings`. Parameters ---------- value : str The unicode string as presented to the user. encodings : list of str The encodings needed to encode the string as a list of Python encodings, converted from the encodings in (0008,0005) *Specific Character Set*. Returns ------- bytes The encoded string. If `value` could not be encoded with any of the given encodings, and :attr:`~pydicom.config.settings.reading_validation_mode` is not ``RAISE``, a warning is issued, and `value` is encoded using the first encoding with replacement characters, resulting in data loss. Raises ------ UnicodeEncodeError If :attr:`~pydicom.config.settings.writing_validation_mode` is set to ``RAISE`` and `value` could not be encoded with the supplied encodings. """ for i, encoding in enumerate(encodings): try: encoded = _encode_string_impl(value, encoding) if i > 0 and encoding not in handled_encodings: escape_sequence = _get_escape_sequence_for_encoding( encoding, encoded=encoded ) encoded = escape_sequence + encoded if encoding in need_tail_escape_sequence_encodings: encoded += _get_escape_sequence_for_encoding(encodings[0]) return encoded except UnicodeError: continue # if we have more than one encoding, we retry encoding by splitting # `value` into chunks that can be encoded with one of the encodings if len(encodings) > 1: try: return _encode_string_parts(value, encodings) except ValueError: pass # all attempts failed - raise or warn and encode with replacement # characters if config.settings.writing_validation_mode == config.RAISE: # force raising a valid UnicodeEncodeError value.encode(encodings[0]) warn_and_log( f"Failed to encode value with encodings: {', '.join(encodings)} " "- using replacement characters in encoded string" ) return _encode_string_impl(value, encodings[0], errors="replace") def _encode_string_parts(value: str, encodings: Sequence[str]) -> bytes: """Convert a unicode string into a byte string using the given list of encodings. This is invoked if `encode_string` failed to encode `value` with a single encoding. We try instead to use different encodings for different parts of the string, using the encoding that can encode the longest part of the rest of the string as we go along. Parameters ---------- value : str The unicode string as presented to the user. encodings : list of str The encodings needed to encode the string as a list of Python encodings, converted from the encodings in Specific Character Set. Returns ------- bytes The encoded string, including the escape sequences needed to switch between different encodings. Raises ------ ValueError If `value` could not be encoded with the given encodings. """ encoded = bytearray() unencoded_part = value best_encoding = default_encoding while unencoded_part: # find the encoding that can encode the longest part of the rest # of the string still to be encoded max_index = 0 for encoding in encodings: try: _encode_string_impl(unencoded_part, encoding) # if we get here, the whole rest of the value can be encoded best_encoding = encoding max_index = len(unencoded_part) break except (UnicodeDecodeError, UnicodeEncodeError) as err: if err.start > max_index: # err.start is the index of first char we failed to encode max_index = err.start best_encoding = encoding # none of the given encodings can encode the first character - give up if max_index == 0: raise ValueError( "None of the given encodings can encode the first character" ) # encode the part that can be encoded with the found encoding encoded_part = _encode_string_impl(unencoded_part[:max_index], best_encoding) if best_encoding not in handled_encodings: encoded += _get_escape_sequence_for_encoding( best_encoding, encoded=encoded_part ) encoded += encoded_part # set remaining unencoded part of the string and handle that unencoded_part = unencoded_part[max_index:] # unencoded_part is empty - we are done, return the encoded string if best_encoding in need_tail_escape_sequence_encodings: encoded += _get_escape_sequence_for_encoding(encodings[0]) return bytes(encoded) def _encode_string_impl(value: str, encoding: str, errors: str = "strict") -> bytes: """Convert a unicode string into a byte string. If given encoding is in `custom_encoders`, use a corresponding `custom_encoder`. If given encoding is not in `custom_encoders`, use a corresponding python handled encoder. """ if encoding in custom_encoders: return custom_encoders[encoding](value, errors=errors) return value.encode(encoding, errors=errors) # DICOM PS3.5-2008 6.1.1 (p 18) says: # default is ISO-IR 6 G0, equiv to common chr set of ISO 8859 (PS3.5 6.1.2.1) # (0008,0005) value 1 can *replace* the default encoding... # for VRs of SH, LO, ST, LT, PN and UT (PS3.5 6.1.2.3)... # with a single-byte character encoding # if (0008,0005) is multi-valued, then value 1 (or default if blank)... # is used until code extension escape sequence is hit, # which can be at start of string, or after CR/LF, FF, or # in Person Name PN, after ^ or = # NOTE also that 7.5.3 SEQUENCE INHERITANCE states that if (0008,0005) # is not present in a sequence item then it is inherited from its parent. def convert_encodings(encodings: None | str | MutableSequence[str]) -> list[str]: """Convert DICOM `encodings` into corresponding Python encodings. Handles some common spelling mistakes and issues a warning in this case. Handles stand-alone encodings: if they are the first encodings, additional encodings are ignored, if they are not the first encoding, they are ignored. In both cases, a warning is issued. Invalid encodings are replaced with the default encoding with a respective warning issued, if :attr:`~pydicom.config.settings.reading_validation_mode` is ``WARN``, or an exception is raised if it is set to ``RAISE``. Parameters ---------- encodings : str or list of str The encoding or list of encodings as read from (0008,0005) *Specific Character Set*. Returns ------- list of str A :class:`list` of Python encodings corresponding to the DICOM encodings. If an encoding is already a Python encoding, it is returned unchanged. Encodings with common spelling errors are replaced by the correct encoding, and invalid encodings are replaced with the default encoding if :attr:`~pydicom.config.settings.reading_validation_mode` is not set to ``RAISE``. Raises ------ LookupError If `encodings` contains a value that could not be converted and :attr:`~pydicom.config.settings.reading_validation_mode` is ``RAISE``. """ encodings = encodings or [""] if isinstance(encodings, str): encodings = [encodings] else: # If a list if passed, we don't want to modify the list # in place so copy it encodings = encodings[:] if not encodings[0]: encodings[0] = "ISO_IR 6" py_encodings = [] for encoding in encodings: try: py_encodings.append(python_encoding[encoding]) except KeyError: py_encodings.append(_python_encoding_for_corrected_encoding(encoding)) if len(encodings) > 1: py_encodings = _handle_illegal_standalone_encodings(encodings, py_encodings) return py_encodings def _python_encoding_for_corrected_encoding(encoding: str) -> str: """Try to replace the given invalid encoding with a valid encoding by checking for common spelling errors, and return the correct Python encoding for that encoding. Otherwise check if the encoding is already a valid Python encoding, and return that. If both attempts fail, return the default encoding. Issue a warning for the invalid encoding except for the case where it is already converted. """ # standard encodings patched = None if re.match("^ISO[^_]IR", encoding) is not None: patched = "ISO_IR" + encoding[6:] # encodings with code extensions elif re.match("^(?=ISO.2022.IR.)(?!ISO 2022 IR )", encoding) is not None: patched = "ISO 2022 IR " + encoding[12:] if patched: # handle encoding patched for common spelling errors try: py_encoding = python_encoding[patched] _warn_about_invalid_encoding(encoding, patched) return py_encoding except KeyError: _warn_about_invalid_encoding(encoding) return default_encoding # fallback: assume that it is already a python encoding try: codecs.lookup(encoding) return encoding except LookupError: _warn_about_invalid_encoding(encoding) return default_encoding def _warn_about_invalid_encoding( encoding: str, patched_encoding: str | None = None ) -> None: """Issue a warning for the given invalid encoding. If patched_encoding is given, it is mentioned as the replacement encoding, other the default encoding. If no replacement encoding is given, and :attr:`~pydicom.config.settings.reading_validation_mode` is set to ``RAISE``, `LookupError` is raised. """ if patched_encoding is None: if config.settings.reading_validation_mode == config.RAISE: raise LookupError(f"Unknown encoding '{encoding}'") msg = f"Unknown encoding '{encoding}' - using default encoding instead" else: msg = ( f"Incorrect value for Specific Character Set '{encoding}' - " f"assuming '{patched_encoding}'" ) warn_and_log(msg, stacklevel=2) def _handle_illegal_standalone_encodings( encodings: MutableSequence[str], py_encodings: list[str] ) -> list[str]: """Check for stand-alone encodings in multi-valued encodings. If the first encoding is a stand-alone encoding, the rest of the encodings is removed. If any other encoding is a stand-alone encoding, it is removed from the encodings. """ if encodings[0] in STAND_ALONE_ENCODINGS: warn_and_log( ( f"Value '{encodings[0]}' for Specific Character Set does not " f"allow code extensions, ignoring: {', '.join(encodings[1:])}" ), stacklevel=2, ) return py_encodings[:1] for i, encoding in reversed(list(enumerate(encodings[1:]))): if encoding in STAND_ALONE_ENCODINGS: warn_and_log( f"Value '{encoding}' cannot be used as code extension, ignoring it", stacklevel=2, ) del py_encodings[i + 1] return py_encodings def decode_element( elem: "DataElement", dicom_character_set: str | list[str] | None ) -> None: """Apply the DICOM character encoding to a data element Parameters ---------- elem : dataelem.DataElement The :class:`DataElement` instance containing an encoded byte string value to decode. dicom_character_set : str or list of str or None The value of (0008,0005) *Specific Character Set*, which may be a single value, a multiple value (code extension), or may also be ``''`` or ``None``, in which case ``'ISO_IR 6'`` will be used. """ if elem.is_empty: return if not dicom_character_set: dicom_character_set = ["ISO_IR 6"] encodings = convert_encodings(dicom_character_set) # decode the string value to unicode # PN is special case as may have 3 components with different chr sets if elem.VR == VR.PN: if elem.VM == 1: # elem.value: PersonName | bytes elem.value = cast(PersonName, elem.value).decode(encodings) else: # elem.value: Iterable[PersonName | bytes] elem.value = [cast(PersonName, vv).decode(encodings) for vv in elem.value] elif elem.VR in CUSTOMIZABLE_CHARSET_VR: # You can't re-decode unicode (string literals in py3) if elem.VM == 1: if isinstance(elem.value, str): # already decoded return elem.value = decode_bytes(elem.value, encodings, TEXT_VR_DELIMS) else: output = list() for value in elem.value: if isinstance(value, str): output.append(value) else: output.append(decode_bytes(value, encodings, TEXT_VR_DELIMS)) elem.value = output pydicom-pydicom-20aa4b7/src/pydicom/cli/000077500000000000000000000000001515706620200202305ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/cli/__init__.py000066400000000000000000000000001515706620200223270ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/cli/codify.py000066400000000000000000000017331515706620200220630ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Pydicom command line interface program for codify""" import argparse import pydicom.util.codify default_exclude_size = 100 def add_subparser(subparsers: argparse._SubParsersAction) -> None: codify_parser = subparsers.add_parser( "codify", description=( "Read a DICOM file and produce the pydicom (Python) " "code which can create that file" ), epilog=( "Binary data (e.g. pixels) larger than --exclude-size " f"(default {default_exclude_size} bytes) is not included. " "A dummy line with a syntax error is produced. " "Private data elements are not included by default." ), ) # Codify existed before as a stand-alone before, re-use it here pydicom.util.codify.set_parser_arguments(codify_parser, default_exclude_size) codify_parser.set_defaults(func=pydicom.util.codify.do_codify) pydicom-pydicom-20aa4b7/src/pydicom/cli/main.py000066400000000000000000000167121515706620200215350ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Pydicom command line interface program Each subcommand is a module within pydicom.cli, which defines an add_subparser(subparsers) function to set argparse attributes, and calls set_defaults(func=callback_function) """ import argparse from importlib.metadata import entry_points import re import sys from typing import cast, Any from collections.abc import Callable from pydicom import dcmread from pydicom.data.data_manager import get_charset_files, get_testdata_file from pydicom.dataset import Dataset subparsers: argparse._SubParsersAction | None = None # Restrict the allowed syntax tightly, since use Python `eval` # on the expression. Do not allow callables, or assignment, for example. re_kywd_or_item = ( r"\w+" # Keyword (\w allows underscore, needed for file_meta) r"(\[(-)?\d+\])?" # Optional [index] or [-index] ) re_file_spec_object = re.compile(re_kywd_or_item + r"(\." + re_kywd_or_item + r")*$") filespec_help = ( "File specification, in format [pydicom::]filename[::element]. " "If `pydicom::` prefix is present, then use the pydicom " "test file with that name. If `element` is given, " "use only that data element within the file. " "Examples: " "path/to/your_file.dcm, " "your_file.dcm::StudyDate, " "pydicom::rtplan.dcm::BeamSequence[0], " "yourplan.dcm::BeamSequence[0].BeamNumber" ) def eval_element(ds: Dataset, element: str) -> Any: try: return eval("ds." + element, {"ds": ds}) except AttributeError: raise argparse.ArgumentTypeError( f"Data element '{element}' is not in the dataset" ) except IndexError as e: raise argparse.ArgumentTypeError(f"'{element}' has an index error: {e}") def filespec_parts(filespec: str) -> tuple[str, str, str]: """Parse the filespec format into prefix, filename, element Format is [prefix::filename::element] Note that ':' can also exist in valid filename, e.g. r'c:\temp\test.dcm' """ *prefix_file, last = filespec.split("::") if not prefix_file: # then only the filename component return "", last, "" prefix = "pydicom" if prefix_file[0] == "pydicom" else "" if prefix: prefix_file.pop(0) # If list empty after pop above, then have pydicom::filename if not prefix_file: return prefix, last, "" return prefix, "".join(prefix_file), last def filespec_parser(filespec: str) -> list[tuple[Dataset, Any]]: """Utility to return a dataset and an optional data element value within it Note: this is used as an argparse 'type' for adding parsing arguments. Parameters ---------- filespec: str A filename with optional `pydicom::` prefix and optional data element, in format: [pydicom::][::] If an element is specified, it must be a path to a data element, sequence item (dataset), or a sequence. Examples: your_file.dcm your_file.dcm::StudyDate pydicom::rtplan.dcm::BeamSequence[0] pydicom::rtplan.dcm::BeamSequence[0].BeamLimitingDeviceSequence Returns ------- List[Tuple[Dataset, Any]] Matching pairs of (dataset, data element value) This usually is a single pair, but a list is returned for future ability to work across multiple files. Note ---- This function is meant to be used in a call to an `argparse` library's `add_argument` call for subparsers, with name="filespec" and `type=filespec_parser`. When used that way, the resulting args.filespec will contain the return values of this function (e.g. use `ds, element_val = args.filespec` after parsing arguments) See the `pydicom.cli.show` module for an example. Raises ------ argparse.ArgumentTypeError If the filename does not exist in local path or in pydicom test files, or if the optional element is not a valid expression, or if the optional element is a valid expression but does not exist within the dataset """ prefix, filename, element = filespec_parts(filespec) # Get the pydicom test filename even without prefix, in case user forgot it try: pydicom_filename = cast(str, get_testdata_file(filename)) except ValueError: # will get this if absolute path passed pydicom_filename = "" # Check if filename is in charset files if not pydicom_filename: try: char_filenames = get_charset_files(filename) if char_filenames: pydicom_filename = char_filenames[0] except NotImplementedError: # will get this if absolute path passed pass if prefix == "pydicom": filename = pydicom_filename # Check element syntax first to avoid unnecessary load of file if element and not re_file_spec_object.match(element): raise argparse.ArgumentTypeError( f"Component '{element}' is not valid syntax for a " "data element, sequence, or sequence item" ) # Read DICOM file try: ds = dcmread(filename, force=True) except FileNotFoundError: extra = ( (f", \nbut 'pydicom::{filename}' test data file is available") if pydicom_filename else "" ) raise argparse.ArgumentTypeError(f"File '{filename}' not found{extra}") except Exception as e: raise argparse.ArgumentTypeError(f"Error reading '{filename}': {e}") if not element: return [(ds, None)] data_elem_val = eval_element(ds, element) return [(ds, data_elem_val)] def help_command(args: argparse.Namespace) -> None: if subparsers is None: print("No subcommands are available") return subcommands: list[str] = list(subparsers.choices.keys()) if args.subcommand and args.subcommand in subcommands: subparsers.choices[args.subcommand].print_help() else: print("Use pydicom help [subcommand] to show help for a subcommand") subcommands.remove("help") print(f"Available subcommands: {', '.join(subcommands)}") SubCommandType = dict[str, Callable[[argparse._SubParsersAction], None]] def get_subcommand_entry_points() -> SubCommandType: subcommands = {} for entry_point in entry_points(group="pydicom_subcommands"): subcommands[entry_point.name] = entry_point.load() return subcommands def main(args: list[str] | None = None) -> None: """Entry point for 'pydicom' command line interface Parameters ---------- args : List[str], optional Command-line arguments to parse. If ``None``, then :attr:`sys.argv` is used. """ global subparsers py_version = sys.version.split()[0] parser = argparse.ArgumentParser( prog="pydicom", description=f"pydicom command line utilities (Python {py_version})", ) subparsers = parser.add_subparsers(help="subcommand help") help_parser = subparsers.add_parser("help", help="display help for subcommands") help_parser.add_argument( "subcommand", nargs="?", help="Subcommand to show help for" ) help_parser.set_defaults(func=help_command) # Get subcommands to register themselves as a subparser subcommands = get_subcommand_entry_points() for subcommand in subcommands.values(): subcommand(subparsers) ns = parser.parse_args(args) if not vars(ns): parser.print_help() else: ns.func(ns) pydicom-pydicom-20aa4b7/src/pydicom/cli/show.py000066400000000000000000000120001515706620200215530ustar00rootroot00000000000000# Copyright 2019 pydicom authors. See LICENSE file for details. """Pydicom command line interface program for `pydicom show`""" import argparse from collections.abc import Callable from pydicom.dataset import Dataset from pydicom.cli.main import filespec_help, filespec_parser def add_subparser(subparsers: argparse._SubParsersAction) -> None: subparser = subparsers.add_parser( "show", description="Display all or part of a DICOM file" ) subparser.add_argument("filespec", help=filespec_help, type=filespec_parser) subparser.add_argument( "-x", "--exclude-private", help="Don't show private data elements", action="store_true", ) subparser.add_argument( "-t", "--top", help="Only show top level", action="store_true" ) subparser.add_argument( "-q", "--quiet", help="Only show basic information", action="store_true", ) subparser.set_defaults(func=do_command) def do_command(args: argparse.Namespace) -> None: if len(args.filespec) != 1: raise NotImplementedError("Show can only work on a single DICOM file input") ds, element_val = args.filespec[0] if not element_val: element_val = ds if args.exclude_private: ds.remove_private_tags() if args.quiet and isinstance(element_val, Dataset): show_quiet(element_val) elif args.top and isinstance(element_val, Dataset): print(element_val.top()) else: print(str(element_val)) def SOPClassname(ds: Dataset) -> str | None: class_uid = ds.get("SOPClassUID") if class_uid is None: return None return f"SOPClassUID: {class_uid.name}" def quiet_rtplan(ds: Dataset) -> str | None: if "BeamSequence" not in ds: return None plan_label = ds.get("RTPlanLabel") plan_name = ds.get("RTPlanName") line = f"Plan Label: {plan_label} " if plan_name: line += f"Plan Name: {plan_name}" lines = [line] if "FractionGroupSequence" in ds: # it should be, is mandatory for fraction_group in ds.FractionGroupSequence: fraction_group_num = fraction_group.get("FractionGroupNumber", "") descr = fraction_group.get("FractionGroupDescription", "") fractions = fraction_group.get("NumberOfFractionsPlanned") fxn_info = f"{fractions} fraction(s) planned" if fractions else "" lines.append(f"Fraction Group {fraction_group_num} {descr} {fxn_info}") num_brachy = fraction_group.get("NumberOfBrachyApplicationSetups") lines.append(f" Brachy Application Setups: {num_brachy}") for refd_beam in fraction_group.ReferencedBeamSequence: ref_num = refd_beam.get("ReferencedBeamNumber") dose = refd_beam.get("BeamDose") mu = refd_beam.get("BeamMeterset") line = f" Beam {ref_num} " if dose or mu: line += f"Dose {dose} Meterset {mu}" lines.append(line) for beam in ds.BeamSequence: beam_num = beam.get("BeamNumber") beam_name = beam.get("BeamName") beam_type = beam.get("BeamType") beam_delivery = beam.get("TreatmentDeliveryType") beam_radtype = beam.get("RadiationType") line = ( f"Beam {beam_num} '{beam_name}' {beam_delivery} " f"{beam_type} {beam_radtype}" ) if beam_type == "STATIC": cp = beam.ControlPointSequence[0] if cp: energy = cp.get("NominalBeamEnergy") gantry = cp.get("GantryAngle") bld = cp.get("BeamLimitingDeviceAngle") couch = cp.get("PatientSupportAngle") line += f" energy {energy} gantry {gantry}, coll {bld}, couch {couch}" wedges = beam.get("NumberOfWedges") comps = beam.get("NumberOfCompensators") boli = beam.get("NumberOfBoli") blocks = beam.get("NumberOfBlocks") line += f" ({wedges} wedges, {comps} comps, {boli} boli, {blocks} blocks)" lines.append(line) return "\n".join(lines) def quiet_image(ds: Dataset) -> str | None: if "SOPClassUID" not in ds or "Image Storage" not in ds.SOPClassUID.name: return None results = [ f"{name}: {ds.get(name, 'N/A')}" for name in [ "BitsStored", "Modality", "Rows", "Columns", "SliceLocation", ] ] return "\n".join(results) # Items to show in quiet mode # Item can be a callable or a DICOM keyword quiet_items: list[Callable[[Dataset], str | None] | str] = [ SOPClassname, "PatientName", "PatientID", # Images "StudyID", "StudyDate", "StudyTime", "StudyDescription", quiet_image, quiet_rtplan, ] def show_quiet(ds: Dataset) -> None: for item in quiet_items: if callable(item): result = item(ds) if result: print(result) else: print(f"{item}: {ds.get(item, 'N/A')}") pydicom-pydicom-20aa4b7/src/pydicom/config.py000066400000000000000000000440241515706620200213040ustar00rootroot00000000000000# Copyright 2008-2023 pydicom authors. See LICENSE file for details. """Pydicom configuration options.""" # doc strings following items are picked up by sphinx for documentation import logging import os from contextlib import contextmanager from typing import Optional, Any, TYPE_CHECKING from collections.abc import Generator have_numpy = True try: import numpy # noqa: F401 except ImportError: have_numpy = False if TYPE_CHECKING: # pragma: no cover from pydicom.dataelem import RawDataElement from typing import Protocol class ElementCallback(Protocol): def __call__( self, raw_elem: "RawDataElement", **kwargs: Any, ) -> "RawDataElement": ... _use_future = False _use_future_env = os.getenv("PYDICOM_FUTURE") # Logging system and debug function to change logging level logger = logging.getLogger("pydicom") logger.addHandler(logging.NullHandler()) debugging: bool def debug(debug_on: bool = True, default_handler: bool = True) -> None: """Turn on/off debugging of DICOM file reading and writing. When debugging is on, file location and details about the elements read at that location are logged to the 'pydicom' logger using Python's :mod:`logging` module. Parameters ---------- debug_on : bool, optional If ``True`` (default) then turn on debugging, ``False`` to turn off. default_handler : bool, optional If ``True`` (default) then use :class:`logging.StreamHandler` as the handler for log messages. """ global logger, debugging if default_handler: handler = logging.StreamHandler() formatter = logging.Formatter("%(message)s") handler.setFormatter(formatter) logger.addHandler(handler) if debug_on: logger.setLevel(logging.DEBUG) debugging = True else: logger.setLevel(logging.WARNING) debugging = False # force level=WARNING, in case logging default is set differently (issue 103) debug(False, False) # Set the type used to hold DS values # default False; was decimal-based in pydicom 0.9.7 use_DS_decimal: bool = False """Set using :func:`DS_decimal` to control if elements with a VR of **DS** are represented as :class:`~decimal.Decimal`. Default ``False``. """ data_element_callback: Optional["ElementCallback"] = None """Set to a callable function to be called from :func:`~pydicom.filereader.dcmread` every time a :class:`~pydicom.dataelem.RawDataElement` has been returned, before it is added to the :class:`~pydicom.dataset.Dataset`. Default ``None``. .. deprecated:: 3.0 ``data_element_callback`` will be removed in v4.0, use :meth:`~pydicom.hooks.Hooks.register_callback` instead. """ data_element_callback_kwargs: dict[str, Any] = {} """Set the keyword arguments passed to :func:`data_element_callback`. Default ``{}``. .. deprecated:: 3.0 ``data_element_callback_kwargs`` will be removed in v4.0, use :meth:`~pydicom.hooks.Hooks.register_kwargs` instead. """ def reset_data_element_callback() -> None: """Reset the :func:`data_element_callback` function to the default. .. deprecated:: 3.0 ``reset_data_element_callback()`` will be removed in v4.0, use :meth:`pydicom.hooks.Hooks.reset` instead. """ global data_element_callback global data_element_callback_kwargs data_element_callback = None data_element_callback_kwargs = {} def DS_numpy(use_numpy: bool = True) -> None: """Set whether multi-valued elements with VR of **DS** will be numpy arrays .. versionadded:: 2.0 Parameters ---------- use_numpy : bool, optional ``True`` (default) to read multi-value **DS** elements as :class:`~numpy.ndarray`, ``False`` to read multi-valued **DS** data elements as type :class:`~python.mulitval.MultiValue` Note: once a value has been accessed, changing this setting will no longer change its type Raises ------ ValueError If :data:`use_DS_decimal` and `use_numpy` are both True. """ global use_DS_numpy if use_DS_decimal and use_numpy: raise ValueError( "Cannot use numpy arrays to read DS elements if `use_DS_decimal` is True" ) use_DS_numpy = use_numpy def DS_decimal(use_Decimal_boolean: bool = True) -> None: """Set DS class to be derived from :class:`decimal.Decimal` or :class:`float`. If this function is never called, the default in *pydicom* >= 0.9.8 is for DS to be based on :class:`float`. Parameters ---------- use_Decimal_boolean : bool, optional ``True`` (default) to derive :class:`~pydicom.valuerep.DS` from :class:`decimal.Decimal`, ``False`` to derive it from :class:`float`. Raises ------ ValueError If `use_Decimal_boolean` and :data:`use_DS_numpy` are both ``True``. """ global use_DS_decimal use_DS_decimal = use_Decimal_boolean if use_DS_decimal and use_DS_numpy: raise ValueError("Cannot set use_DS_decimal True if use_DS_numpy is True") import pydicom.valuerep if use_DS_decimal: pydicom.valuerep.DSclass = pydicom.valuerep.DSdecimal else: pydicom.valuerep.DSclass = pydicom.valuerep.DSfloat # Configuration flags use_DS_numpy = False """Set using the function :func:`DS_numpy` to control whether arrays of VR **DS** are returned as numpy arrays. Default: ``False``. .. versionadded:: 2.0 """ use_IS_numpy = False """Set to False to avoid IS values being returned as numpy ndarray objects. Default: ``False``. .. versionadded:: 2.0 """ allow_DS_float = False """Set to ``True`` to allow :class:`~pydicom.valuerep.DSdecimal` instances to be created using :class:`floats`; otherwise, they must be explicitly converted to :class:`str`, with the user explicitly setting the precision of digits and rounding. Default ``False``. """ enforce_valid_values = False """Deprecated. Use :attr:`Settings.reading_validation_mode` instead. """ # Constants used to define how data element values shall be validated IGNORE = 0 """If one of the validation modes is set to this value, no value validation will be performed. """ WARN = 1 """If one of the validation modes is set to this value, a warning is issued if a value validation error occurs. """ RAISE = 2 """If one of the validation modes is set to this value, an exception is raised if a value validation error occurs. """ class Settings: """Collection of several configuration values. Accessed via the singleton :attr:`settings`. .. versionadded:: 2.3 """ def __init__(self) -> None: self._reading_validation_mode: int | None = None # in future version, writing invalid values will raise by default, # currently the default value depends on enforce_valid_values self._writing_validation_mode: int | None = RAISE if _use_future else None self._infer_sq_for_un_vr: bool = True # Chunk size to use when reading from buffered DataElement values self._buffered_read_size = 8192 @property def buffered_read_size(self) -> int: """Get or set the chunk size when reading from buffered :class:`~pydicom.dataelem.DataElement` values. Parameters ---------- size : int The chunk size to use, must be greater than 0 (default 8192). """ return self._buffered_read_size @buffered_read_size.setter def buffered_read_size(self, size: int) -> None: if size <= 0: raise ValueError("The read size must be greater than 0") self._buffered_read_size = size @property def reading_validation_mode(self) -> int: """Defines behavior of validation while reading values, compared with the DICOM standard, e.g. that DS strings are not longer than 16 characters and contain only allowed characters. * :attr:`WARN` will emit a warning in the case of an invalid value (default) * :attr:`RAISE` will raise an error instead * :attr:`IGNORE` will bypass the validation (with the exception of some encoding errors). """ # upwards compatibility if self._reading_validation_mode is None: return RAISE if enforce_valid_values else WARN return self._reading_validation_mode @reading_validation_mode.setter def reading_validation_mode(self, value: int) -> None: self._reading_validation_mode = value @property def writing_validation_mode(self) -> int: """Defines behavior for value validation while writing a value. See :attr:`Settings.reading_validation_mode`. """ if self._writing_validation_mode is None: return RAISE if enforce_valid_values else WARN return self._writing_validation_mode @writing_validation_mode.setter def writing_validation_mode(self, value: int) -> None: self._writing_validation_mode = value @property def infer_sq_for_un_vr(self) -> bool: """If ``True``, and the VR of a known data element is encoded as **UN** in an explicit encoding for an undefined length data element, the VR is changed to SQ per PS 3.5, section 6.2.2. Can be set to ``False`` where the content of the tag shown as **UN** is not DICOM conformant and would lead to a failure if accessing it. """ return self._infer_sq_for_un_vr @infer_sq_for_un_vr.setter def infer_sq_for_un_vr(self, value: bool) -> None: self._infer_sq_for_un_vr = value settings = Settings() """The global configuration object of type :class:`Settings` to access some of the settings. More settings may move here in later versions. .. versionadded:: 2.3 """ @contextmanager def disable_value_validation() -> Generator: """Context manager to temporarily disable value validation both for reading and writing. Can be used for performance reasons if the values are known to be valid. """ reading_mode = settings._reading_validation_mode writing_mode = settings._writing_validation_mode try: settings.reading_validation_mode = IGNORE settings.writing_validation_mode = IGNORE yield finally: settings._reading_validation_mode = reading_mode settings._writing_validation_mode = writing_mode @contextmanager def strict_reading() -> Generator: """Context manager to temporarily enably strict value validation for reading.""" original_reading_mode = settings._reading_validation_mode try: settings.reading_validation_mode = RAISE yield finally: settings._reading_validation_mode = original_reading_mode convert_wrong_length_to_UN = False """Convert a field VR to "UN" and return bytes if bytes length is invalid. Default ``False``. """ datetime_conversion = False """Set to ``True`` to convert the value(s) of elements with a VR of DA, DT and TM to :class:`datetime.date`, :class:`datetime.datetime` and :class:`datetime.time` respectively. Note that when datetime conversion is enabled then range matching in C-GET/C-FIND/C-MOVE queries is not possible anymore. So if you need range matching we recommend to do the conversion manually. Default ``False`` References ---------- * :dcm:`Range Matching` """ use_none_as_empty_text_VR_value = False """ If ``True``, the value of a decoded empty data element with a text VR is ``None``, otherwise (the default), it is is an empty string. For all other VRs the behavior does not change - the value is en empty list for VR **SQ** and ``None`` for all other VRs. Note that the default of this value may change to ``True`` in a later version. """ replace_un_with_known_vr = True """ If ``True``, and the VR of a known data element is encoded as **UN** in an explicit encoding, the VR is changed to the known value. Can be set to ``False`` where the content of the tag shown as **UN** is not DICOM conformant and would lead to a failure if accessing it. .. versionadded:: 2.0 """ show_file_meta = True """ If ``True`` (default), the 'str' and 'repr' methods of :class:`~pydicom.dataset.Dataset` begin with a separate section displaying the file meta information data elements .. versionadded:: 2.0 """ import pydicom.pixel_data_handlers.numpy_handler as np_handler # noqa import pydicom.pixel_data_handlers.rle_handler as rle_handler # noqa import pydicom.pixel_data_handlers.pillow_handler as pillow_handler # noqa import pydicom.pixel_data_handlers.jpeg_ls_handler as jpegls_handler # noqa import pydicom.pixel_data_handlers.gdcm_handler as gdcm_handler # noqa import pydicom.pixel_data_handlers.pylibjpeg_handler as pylibjpeg_handler # noqa pixel_data_handlers = [ np_handler, gdcm_handler, pillow_handler, jpegls_handler, pylibjpeg_handler, rle_handler, ] """Handlers for converting (7FE0,0010) *Pixel Data*. .. currentmodule:: pydicom.dataset This is an ordered list of *Pixel Data* handlers that the :meth:`~Dataset.convert_pixel_data` method will use to try to extract a correctly sized numpy array from the *Pixel Data* element. Handlers shall have four methods: def supports_transfer_syntax(transfer_syntax: UID) Return ``True`` if the handler supports the transfer syntax indicated in :class:`Dataset` `ds`, ``False`` otherwise. def is_available(): Return ``True`` if the handler's dependencies are installed, ``False`` otherwise. def get_pixeldata(ds): Return a correctly sized 1D :class:`numpy.ndarray` derived from the *Pixel Data* in :class:`Dataset` `ds` or raise an exception. Reshaping the returned array to the correct dimensions is handled automatically. def needs_to_convert_to_RGB(ds): Return ``True`` if the *Pixel Data* in the :class:`Dataset` `ds` needs to be converted to the RGB colourspace, ``False`` otherwise. The first handler that both announces that it supports the transfer syntax and does not raise an exception, either in getting the data or when the data is reshaped to the correct dimensions, is the handler that will provide the data. If they all fail only the last exception is raised. If none raise an exception, but they all refuse to support the transfer syntax, then this fact is announced in a :class:`NotImplementedError` exception. """ APPLY_J2K_CORRECTIONS = True """Use the information within JPEG 2000 data to correct the returned pixel data .. versionadded:: 2.1 If ``True`` (default), then for handlers that support JPEG 2000 pixel data, use the component precision and sign to correct the returned ndarray when using the pixel data handlers. If ``False`` then only rely on the element values within the dataset when applying corrections. """ assume_implicit_vr_switch = True """If invalid VR encountered, assume file switched to implicit VR .. versionadded:: 2.2 If ``True`` (default), when reading an explicit VR file, if a VR is encountered that is not a valid two bytes within A-Z, then assume the original writer switched to implicit VR. This has been seen in particular in some sequences. This does not test that the VR is a valid DICOM VR, just that it has valid characters. """ INVALID_KEYWORD_BEHAVIOR = "WARN" """Control the behavior when setting a :class:`~pydicom.dataset.Dataset` attribute that's not a known element keyword. .. versionadded:: 2.1 If ``"WARN"`` (default), then warn when an element value is set using ``Dataset.__setattr__()`` and the keyword is camel case but doesn't match a known DICOM element keyword. If ``"RAISE"`` then raise a :class:`ValueError` exception. If ``"IGNORE"`` then neither warn nor raise. Examples -------- >>> from pydicom import config >>> config.INVALID_KEYWORD_BEHAVIOR = "WARN" >>> ds = Dataset() >>> ds.PatientName = "Citizen^Jan" # OK >>> ds.PatientsName = "Citizen^Jan" ../pydicom/dataset.py:1895: UserWarning: Camel case attribute 'PatientsName' used which is not in the element keyword data dictionary """ INVALID_KEY_BEHAVIOR = "WARN" """Control the behavior when invalid keys are used with :meth:`~pydicom.dataset.Dataset.__contains__` (e.g. ``'invalid' in ds``). .. versionadded:: 2.1 Invalid keys are objects that cannot be converted to a :class:`~pydicom.tag.BaseTag`, such as unknown element keywords or invalid element tags like ``0x100100010``. If ``"WARN"`` (default), then warn when an invalid key is used, if ``"RAISE"`` then raise a :class:`ValueError` exception. If ``"IGNORE"`` then neither warn nor raise. Examples -------- >>> from pydicom import config >>> config.INVALID_KEY_BEHAVIOR = "RAISE" >>> ds = Dataset() >>> 'PatientName' in ds # OK False >>> 'PatientsName' in ds Traceback (most recent call last): File "", line 1, in File ".../pydicom/dataset.py", line 494, in __contains__ raise ValueError(msg) from exc ValueError: Invalid value used with the 'in' operator: must be an element tag as a 2-tuple or int, or an element keyword """ if _use_future_env: if _use_future_env.lower() in ["true", "yes", "on", "1"]: _use_future = True elif _use_future_env.lower() in ["false", "no", "off", "0"]: _use_future = False else: raise ValueError( "Unknown setting for environment variable " "PYDICOM_FUTURE. Use True or False." ) def future_behavior(enable_future: bool = True) -> None: """Imitate the behavior for the next major version of *pydicom*. .. versionadded:: 2.1 This can be used to ensure your code is "future-proof" for known upcoming changes in the next major version of *pydicom*. Typically, deprecations become errors, and default values of config flags may change. Parameters ---------- enable_future: bool Set ``True`` (default) to emulate future pydicom behavior, ``False`` to reset to current pydicom behavior. See also -------- :attr:`INVALID_KEYWORD_BEHAVIOR` :attr:`INVALID_KEY_BEHAVIOR` """ global _use_future, INVALID_KEYWORD_BEHAVIOR if enable_future: _use_future = True INVALID_KEYWORD_BEHAVIOR = "RAISE" settings._writing_validation_mode = RAISE else: _use_future = False INVALID_KEYWORD_BEHAVIOR = "WARN" settings._writing_validation_mode = None if _use_future: future_behavior() pydicom-pydicom-20aa4b7/src/pydicom/data/000077500000000000000000000000001515706620200203725ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/__init__.py000066400000000000000000000006501515706620200225040ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """pydicom data manager""" from .data_manager import ( get_charset_files, get_testdata_file, get_testdata_files, get_palette_files, DATA_ROOT, external_data_sources, fetch_data_files, ) __all__ = [ "fetch_data_files", "get_charset_files", "get_palette_files", "get_testdata_files", "get_testdata_file", ] pydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/000077500000000000000000000000001515706620200232055ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/FileInfo.txt000066400000000000000000000035211515706620200254420ustar00rootroot00000000000000Filename Character Sets "Patient's Name" -------- -------------- '--------------' chrArab.dcm ISO_IR 127 '\xe2\xc8\xc7\xe6\xea^\xe4\xe6\xd2\xc7\xd1' chrFren.dcm ISO_IR 100 'Buc^J\xe9r\xf4me' chrFrenMulti.dcm ISO_IR 100 'Buc^J\xe9r\xf4me' chrGerm.dcm ISO_IR 100 '\xc4neas^R\xfcdiger' chrGreek.dcm ISO_IR 126 '\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2' chrH31.dcm ['', 'ISO 2022 IR 87'] 'Yamada^Tarou=\x1b$B;3ED\x1b(B^\x1b$BB@O:\x1b(B=\x1b$B$d$^$@\x1b(B^\x1b$B$?$m$&\x1b(B' chrH32.dcm ['ISO 2022 IR 13', 'ISO 2022 IR 87'] '\xd4\xcf\xc0\xde^\xc0\xdb\xb3=\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J=\x1b$B$d$^$@\x1b(J^\x1b$B$?$m$&\x1b(J' chrHbrw.dcm ISO_IR 138 '\xf9\xf8\xe5\xef^\xe3\xe1\xe5\xf8\xe4' chrI2.dcm ['', 'ISO 2022 IR 149'] 'Hong^Gildong=\x1b$)C\xfb\xf3^\x1b$)C\xd1\xce\xd4\xd7=\x1b$)C\xc8\xab^\x1b$)C\xb1\xe6\xb5\xbf' chrRuss.dcm ISO_IR 144 '\xbb\xee\xdace\xdc\xd1yp\xd3' chrX1.dcm ISO_IR 192 'Wang^XiaoDong=\xe7\x8e\x8b^\xe5\xb0\x8f\xe6\x9d\xb1=' chrX2.dcm GB18030 'Wang^XiaoDong=\xcd\xf5^\xd0\xa1\xb6\xab=' Other ===== chrFrenMulti.dcm is a modified version of chrFren.dcm with multi-valued PN and LO for testing decoding chrSQEncoding.dcm is a minimal constructed dataset with a sequence that has another encoding (['ISO 2022 IR 13', 'ISO 2022 IR 87']) than the dataset (ISO_IR 192) chrSQEncoding1.dcm is the same dataset with the encoding ['ISO 2022 IR 13', 'ISO 2022 IR 87'] defined in the dataset, but not in the sequence pydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrArab.dcm000066400000000000000000000035441515706620200252420ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5726.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 127DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5726.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN ^  LOSCSARAB 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5726.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5726.0 SHSCSARAB IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrFren.dcm000066400000000000000000000035421515706620200252650ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5720.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5720.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN Buc^Jrme LOSCSFREN 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5720.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5720.0 SHSCSFREN IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrFrenMulti.dcm000066400000000000000000000036221515706620200262770ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5720.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5720.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN Buc^Jrme LOSCSFREN 0DA@CSLO eggs\spam PNBuc^Jrme\Buc^Jrme UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5720.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5720.0 SHSCSFREN IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrGerm.dcm000066400000000000000000000035461515706620200252710ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5723.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5723.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PNneas^Rdiger  LOSCSGERM 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5723.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5723.0 SHSCSGERM IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrGreek.dcm000066400000000000000000000035421515706620200254300ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5717.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 126DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5717.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN  LOSCSGREEK0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5717.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5717.0 SHSCSGREEK IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrH31.dcm000066400000000000000000000036361515706620200247320ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5702.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS\ISO 2022 IR 87 DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5702.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN<Yamada^Tarou=$B;3ED(B^$BB@O:(B=$B$d$^$@(B^$B$?$m$&(B LO H31EXAMPLE0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5702.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5702.0 SH H31EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrH32.dcm000066400000000000000000000036501515706620200247270ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5705.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSISO 2022 IR 13\ISO 2022 IR 87 DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5705.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN8^۳=$B;3ED(J^$BB@O:(J=$B$d$^$@(J^$B$?$m$&(J LO H32EXAMPLE0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5705.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5705.0 SH H32EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrHbrw.dcm000066400000000000000000000035421515706620200252750ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5732.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 138DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5732.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN ^ LOSCSHBRW 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5732.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5732.0 SHSCSHBRW IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrI2.dcm000066400000000000000000000036161515706620200246470ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5708.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS\ISO 2022 IR 149DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5708.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN,Hong^Gildong=$)C^$)C=$)Cȫ^$)C浿 LO I2EXAMPLE 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5708.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5708.0 SH I2EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrJapMulti.dcm000066400000000000000000000035761515706620200261270ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17461UI1.2.840.10008.1.2.1UI1.2.410.200010.99.3.5SH INFINITT_3.5AEQS-SC1ULCS\ISO 2022 IR 87 CSDERIVED\PRIMARY DA20080504TM104918UI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17462 DA20080504"DA200805040TM1717152TM171715PSH2008050417172310`CSCRpLOAgfa-Gevaert AG PNSHCR250 0LOChest >LO Chest PA PA PPN`PNpPNLOADC_5156ULjPN$B$d$^$@(B^$B$?$m$&(B  LO2008-40DA18000101@CSM PN4$B$d$^$@(B^$B$?$m$&(B\$B$d$^$@(B^$B$?$m$&(B AS DS0 0DS0 !LT $B$?$m$&(B@LTULCSCHEST `DS0 LO1871LOID0VAZ LOc25_1008ADS0 DDS0 RIS0 dDS0.1500\0.1500 DS`SHcode37LO60059 CSPORTRAITCSUSZQCSQCSPA`DS200 ULLOAGFAUNvEC=0.00\LR=0.00\MC=3.50\NR=3.00\MD0=-0.4000\MD1=0.2000\FA=C\FP=0.1000\BALANCE=0\MLMIN=0.5000\MLMAX=2.5000\MFOC=0.5000 UNE25 UN2.8 `UNbUNQS-C1 eUNpUNUNdUN COMPLETED UL UI:1.3.51.0.7.11986030739.15242.20106.39861.48967.23056.44420 UI"1.3.51.5156.11871.20080504.1104919 IS1 IS1 CSL\F `CS @LT(UL(US(CS MONOCHROME1 (US (US (4IS(US(US (US (US(US(US(PDS2048(QDS4096(RDS0 (SDS1 (TLOOD REL(0LOE25 UL CSNORMAL 0UL 0IS 0CS0UL0CSCREATED pydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrJapMultiExplicitIR6.dcm000066400000000000000000000036241515706620200301440ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17461UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 AEQS-SC1ULCSISO 2022 IR 6\ISO 2022 IR 87CSDERIVED\PRIMARY DA20080504TM104918UI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17462 DA20080504"DA200805040TM1717152TM171715PSH2008050417172310`CSCRpLOAgfa-Gevaert AG PNSHCR250 0LOChest >LO Chest PA PA PPN`PNpPNLOADC_5156ULPN$B$d$^$@(B^$B$?$m$&(B  LO2008-40DA18000101@CSM PN4$B$d$^$@(B^$B$?$m$&(B\$B$d$^$@(B^$B$?$m$&(B AS DS0 0DS0 !LT $B$?$m$&(B@LTULCSCHEST `DS0 LO1871LOID0VAZ LOc25_1008ADS0 DDS0 RIS0 dDS0.1500\0.1500 DS`SHcode37LO60059 CSPORTRAITCSUSZQCSQCSPA`DS200 ULLOAGFAUNvEC=0.00\LR=0.00\MC=3.50\NR=3.00\MD0=-0.4000\MD1=0.2000\FA=C\FP=0.1000\BALANCE=0\MLMIN=0.5000\MLMAX=2.5000\MFOC=0.5000 UNE25 UN2.8 `UNbUNQS-C1 eUNpUNUNdUN COMPLETED UL UI:1.3.51.0.7.11986030739.15242.20106.39861.48967.23056.44420 UI"1.3.51.5156.11871.20080504.1104919 IS1 IS1 CSL\F `CS @LT(UL(US(CS MONOCHROME1 (US (US (4IS(US(US (US (US(US(US(PDS2048(QDS4096(RDS0 (SDS1 (TLOOD REL(0LOE25 UL CSNORMAL 0UL 0IS 0CS0UL0CSCREATED pydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrKoreanMulti.dcm000066400000000000000000000035521515706620200266260ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17461UI1.2.840.10008.1.2.1UI1.2.410.200010.99.3.5SH INFINITT_3.5AEQS-SC1ULCS\ISO 2022 IR 149CSDERIVED\PRIMARY DA20080504TM104918UI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17461 DA20080504"DA200805040TM1717152TM171715PSH2008050417172310`CSCRpLOAgfa-Gevaert AG PNSHCR250 0LOChest >LO Chest PA PA PPN`PNpPN$)C(B LOADC_5156ULjPN$)C(B  LO2008-30DA18000101@CSM PN$)C(B\$)C(B AS DS0 0DS0 !LT$)C(B @LTULCSCHEST `DS0 LO1871LOID0VAZ LOc25_1008ADS0 DDS0 RIS0 dDS0.1500\0.1500 DS`SHcode37LO60059 CSPORTRAITCSUSZQCSQCSPA`DS200 ULLOAGFAUNvEC=0.00\LR=0.00\MC=3.50\NR=3.00\MD0=-0.4000\MD1=0.2000\FA=C\FP=0.1000\BALANCE=0\MLMIN=0.5000\MLMAX=2.5000\MFOC=0.5000 UNE25 UN2.8 `UNbUNQS-C1 eUNpUNUNdUN COMPLETED UL UI:1.3.51.0.7.11986030739.15242.20106.39861.48967.23056.44419 UI"1.3.51.5156.11871.20080504.1104918 IS1 IS1 CSL\F `CS @LT(UL(US(CS MONOCHROME1 (US (US (4IS(US(US (US (US(US(US(PDS2048(QDS4096(RDS0 (SDS1 (TLOOD REL(0LOE25 UL CSNORMAL 0UL 0IS 0CS0UL0CSCREATED pydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrRuss.dcm000066400000000000000000000035421515706620200253270ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5729.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 144DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5729.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN ceyp LOSCSRUSS 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5729.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5729.0 SHSCSRUSS IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrSQEncoding.dcm000066400000000000000000000010101515706620200263510ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI41.3.12.2.1107.5.2.30.25663.200903310936104516220362UI1.2.840.10008.1.2.1UI1.3.12.2.1107.5.2SHMR_VB15ACS ISO_IR 192SH Code Value22PNDoctor^Who^^MD2dSQxCSISO 2022 IR 13\ISO 2022 IR 87 SH CodeValue PN8^۳=$B;3ED(B^$BB@O:(B=$B$d$^$@(B^$B$?$m$&(Bpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrSQEncoding1.dcm000066400000000000000000000010101515706620200264320ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI41.3.12.2.1107.5.2.30.25663.200903310936104516220362UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.3SHOFFIS_DCMTK_363 CSISO 2022 IR 13\ISO 2022 IR 87 SH Code Value22PNDoctor^Who^^MD2dSQZRSH CodeValue PN8^۳=$B;3ED(B^$BB@O:(B=$B$d$^$@(B^$B$?$m$&(Bpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrX1.dcm000066400000000000000000000035661515706620200246710ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5711.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 192DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5711.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PNWang^XiaoDong=王^小東=  LO X1EXAMPLE 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5711.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5711.0 SH X1EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/charset_files/chrX2.dcm000066400000000000000000000035601515706620200246640ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5714.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSGB18030 DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5714.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PNWang^XiaoDong=^С= LO X2EXAMPLE 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5714.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5714.0 SH X2EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USOBpydicom-pydicom-20aa4b7/src/pydicom/data/data_manager.py000066400000000000000000000301711515706620200233510ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Management of pydicom's data files. External Data Sources --------------------- *pydicom* can also search third-party data sources for matching data. To do so your project should register its entry points in its `setup.py` file. For example, a project named "mydata" with the interface class ``MyInterface`` should register: .. codeblock: python from setuptools import setup setup( ..., entry_points={ "pydicom.data.external_sources": "mydata = mydata:MyInterface", }, ) The interface class should have, at a minimum, the following two methods: * ``get_path(self, name: str, dtype: int) -> str`` - returns the absolute path to the first file with a filename `name` or raises a ``ValueError`` if no matching file found. * ``get_paths(self, pattern: str, dtype: int) -> List[str]`` - returns a list of absolute paths to filenames matching `pattern`. Where `name` is the name of the filename to search for, `dtype` is an int that indicates the type of data to search for and should be one of the following: * ``0`` - DICOM dataset * ``1`` - Character set file * ``2`` - Palette file * ``3`` - DICOMDIR file * ``4`` - JPEG file And lastly, `pattern` is a str used to filter files against when searching. For a real-life example of an external data source you can look at the `pydicom-data `_ repository. """ from enum import IntEnum import fnmatch import os from pathlib import Path from typing import TYPE_CHECKING from pydicom.data.download import ( data_path_with_download, calculate_file_hash, get_cached_filehash, get_url_map, get_data_dir, ) from pydicom.misc import warn_and_log if TYPE_CHECKING: # pragma: no cover from pydicom import Dataset DATA_ROOT = os.fspath(Path(__file__).parent.resolve()) """The absolute path to the pydicom/data directory.""" class DataTypes(IntEnum): """Constants for data types.""" DATASET = 0 CHARSET = 1 PALETTE = 2 DICOMDIR = 3 JPEG = 4 def _check_data_hash(fpath: str) -> bool: """Return ``True`` if the SHA256 checksum of the file at ``fpath`` is OK. Parameters ---------- fpath : str The absolute path to the file to perform the checksum for. Returns ------- bool ``True`` if the checksum matches those in ``hashes.json``, ``False`` otherwise. Raises ------ pydicom.data.download.NoHashFound If the file is missing from ``hashes.json``. """ p = Path(fpath) ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) return ext_hash == ref_hash def get_external_sources() -> dict: """Return a :class:`dict` of external data source interfaces. Returns ------- dict A dict of ``{'source name': }``. """ from importlib.metadata import entry_points # Prefer pydicom-data as the source sources = { vv.name: vv.load()() for vv in entry_points(group="pydicom.data.external_sources") } out = {} if "pydicom-data" in sources: out["pydicom-data"] = sources["pydicom-data"] out.update(sources) return out _EXTERNAL_DATA_SOURCES: dict | None = None def external_data_sources() -> dict: """Return the available external data sources - loaded once.""" global _EXTERNAL_DATA_SOURCES if _EXTERNAL_DATA_SOURCES is None: _EXTERNAL_DATA_SOURCES = get_external_sources() return _EXTERNAL_DATA_SOURCES def online_test_file_dummy_paths() -> dict[str, str]: """Return a :class:`dict` of dummy paths to the downloadable test files. Returns ------- dict A dict of dummy paths to the test files available via download. """ filenames = list(get_url_map().keys()) test_files_root = os.path.join(DATA_ROOT, "test_files") dummy_path_map = { os.path.join(test_files_root, filename): filename for filename in filenames } return dummy_path_map def fetch_data_files() -> None: """Download missing test files to the local cache.""" cache = get_data_dir() paths = {cache / fname: fname for fname in list(get_url_map().keys())} error = [] for p in paths: # Download missing files or files that don't match the hash try: data_path_with_download(p.name) except Exception: error.append(p.name) if error: raise RuntimeError( f"An error occurred downloading the following files: {', '.join(error)}" ) def get_files( base: str | os.PathLike, pattern: str = "**/*", dtype: int = DataTypes.DATASET ) -> list[str]: """Return all matching file paths from the available data sources. First searches the local *pydicom* data store, then any locally available external sources, and finally the files available in the pydicom/pydicom-data repository. .. versionchanged: 2.1 Added the `dtype` keyword parameter, modified to search locally available external data sources and the pydicom/pydicom-data repository Parameters ---------- base : str or os.PathLike Base directory to recursively search. pattern : str, optional The pattern to pass to :meth:`~pathlib.Path.glob`, default (``'**/*'``). dtype : int, optional The type of data to search for when using an external source, one of: * ``0`` - DICOM dataset * ``1`` - Character set file * ``2`` - Palette file * ``3`` - DICOMDIR file * ``4`` - JPEG file Returns ------- list of str A list of absolute paths to matching files. """ base = Path(base) # Search locally files = [os.fspath(m) for m in base.glob(pattern)] # Search external sources for lib, source in external_data_sources().items(): fpaths = source.get_paths(pattern, dtype) if lib == "pydicom-data": # For pydicom-data, check the hash against hashes.json fpaths = [p for p in fpaths if _check_data_hash(p)] files.extend(fpaths) # Search https://github.com/pydicom/pydicom-data or local cache # To preserve backwards compatibility filter the downloaded files # as if they are stored within DATA_ROOT/test_files/*.dcm dummy_online_file_path_map = online_test_file_dummy_paths() dummy_online_file_path_filtered = fnmatch.filter( dummy_online_file_path_map.keys(), os.path.join(base, pattern) ) download_names = [ os.fspath(dummy_online_file_path_map[dummy_path]) for dummy_path in dummy_online_file_path_filtered ] real_online_file_paths = [] download_error = False for filename in download_names: try: real_online_file_paths.append(os.fspath(data_path_with_download(filename))) except Exception: download_error = True files += real_online_file_paths if download_error: warn_and_log( "One or more download failures occurred, the list of matching " "file paths may be incomplete" ) return files def get_palette_files(pattern: str = "**/*") -> list[str]: """Return a list of absolute paths to palettes with filenames matching `pattern`. Parameters ---------- pattern : str, optional The pattern to pass to :meth:`~pathlib.Path.glob`, default (``'**/*'``). Returns ------- list of str A list of absolute paths to matching files. """ data_path = Path(DATA_ROOT) / "palettes" files = get_files(base=data_path, pattern=pattern, dtype=DataTypes.PALETTE) files = [filename for filename in files if not filename.endswith(".py")] return files def get_testdata_file( name: str, read: bool = False, download: bool = True, ) -> "str | Dataset | None": """Return an absolute path to the first matching dataset with filename `name` that is found in a local or external pydicom datastore. First searches the local *pydicom* data store, then any locally available external sources, and finally the files available in the pydicom/pydicom-data repository. .. versionchanged:: 2.1 Modified to search locally available external data sources and the pydicom/pydicom-data repository .. versionchanged:: 2.2 Added the `read` keyword parameter. .. versionchanged:: 2.3 Added the `download` keyword parameter. Parameters ---------- name : str The full file name (without path) read : bool, optional If ``True`` then use :func:`~pydicom.filereader.dcmread` to read the file and return the corresponding :class:`~pydicom.dataset.FileDataset`. Default ``False``. download : bool, optional If ``True`` (default) download the file if missed locally. Returns ------- str, pydicom.dataset.Dataset or None The absolute path of the file if found, the dataset itself if `read` is ``True``, or ``None`` if the file is not found. Raises ______ ValueError If `name` is an absolute path. """ if os.path.isabs(name): raise ValueError( f"'get_testdata_file' does not support absolute paths, as it only works" f" with internal pydicom test data - did you mean 'dcmread(\"{name}\")'?" ) path = _get_testdata_file(name=name, download=download) if read and path is not None: from pydicom.filereader import dcmread return dcmread(path, force=True) return path def _get_testdata_file(name: str, download: bool = True) -> str | None: # Check pydicom local data_path = Path(DATA_ROOT) / "test_files" matches = [m for m in data_path.rglob(name)] if matches: return os.fspath(matches[0]) # Check external data sources fpath: str | None for lib, source in external_data_sources().items(): try: fpath = source.get_path(name, dtype=DataTypes.DATASET) except ValueError: fpath = None # For pydicom-data, check the hash against hashes.json if lib == "pydicom-data": if fpath and _check_data_hash(fpath): return fpath elif fpath: return fpath # Try online if download: for filename in get_url_map().keys(): if filename != name: continue try: return os.fspath(data_path_with_download(filename)) except Exception: warn_and_log( f"A download failure occurred while attempting to " f"retrieve {name}" ) return None def get_testdata_files(pattern: str = "**/*") -> list[str]: """Return a list of absolute paths to datasets with filenames matching `pattern`. Parameters ---------- pattern : str, optional The pattern to pass to :meth:`~pathlib.Path.glob`, default (``'**/*'``). Returns ------- list of str A list of absolute paths to matching files. Raises ______ ValueError If `pattern` matches an absolute path. """ if os.path.isabs(pattern): raise ValueError( "'get_testdata_files' does not support absolute paths, as it only works" " with internal pydicom test data." ) data_path = Path(DATA_ROOT) / "test_files" files = get_files(base=data_path, pattern=pattern, dtype=DataTypes.DATASET) files = [filename for filename in files if not filename.endswith(".py")] return files def get_charset_files(pattern: str = "**/*") -> list[str]: """Return a list of absolute paths to charsets with filenames matching `pattern`. Parameters ---------- pattern : str, optional The pattern to pass to :meth:`~pathlib.Path.glob`, default (``'**/*'``). Returns ---------- list of str A list of absolute paths to matching files. """ data_path = Path(DATA_ROOT) / "charset_files" files = get_files(base=data_path, pattern=pattern, dtype=DataTypes.CHARSET) files = [filename for filename in files if not filename.endswith(".py")] return files pydicom-pydicom-20aa4b7/src/pydicom/data/download.py000066400000000000000000000177211515706620200225630ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. # Copyright 2018-2019 Cancer Care Associates. # Relicensed under pydicom LICENSE by Simon Biggs. import functools import hashlib import json import os import pathlib from typing import cast import urllib.request import urllib.error try: import requests HAVE_REQUESTS = True except ImportError: HAVE_REQUESTS = False try: import tqdm if HAVE_REQUESTS is False: class DownloadProgressBar(tqdm.tqdm): def update_to( self, b: int = 1, bsize: int = 1, tsize: int | None = None ) -> None: if tsize is not None: self.total = tsize self.update(b * bsize - self.n) USE_PROGRESS_BAR = True except ImportError: USE_PROGRESS_BAR = False from . import retry from pydicom.misc import warn_and_log HERE = pathlib.Path(__file__).resolve().parent _SIMULATE_NETWORK_OUTAGE = False # For testing network outages def calculate_file_hash(fpath: pathlib.Path) -> str: """Return the SHA256 checksum for the file at `fpath`. Parameters ---------- fpath : pathlib.Path The absolute path to the file that is to be checksummed. Returns ------- str The SHA256 checksum of the file. """ BLOCKSIZE = 65536 hasher = hashlib.sha256() with open(fpath, "rb") as f: buf = f.read(BLOCKSIZE) while len(buf) > 0: hasher.update(buf) buf = f.read(BLOCKSIZE) return hasher.hexdigest() def get_config_dir() -> pathlib.Path: """Return the path to the pydicom config directory, creating it if required The config directory will be named ``.pydicom`` and will be created in the local user's home directory. """ config_dir = pathlib.Path.home() / ".pydicom" config_dir.mkdir(exist_ok=True) return config_dir @retry.retry( (urllib.error.HTTPError, urllib.error.URLError), exc_msg=("Installing the `requests` package may help"), ) def download_with_progress(url: str, fpath: pathlib.Path) -> None: """Download the file at `url` to `fpath` with a progress bar. Parameters ---------- url : str The URL to download the file from. fpath : pathlib.Path The absolute path where the file will be written to. """ filename = os.fspath(fpath) if HAVE_REQUESTS: if USE_PROGRESS_BAR: r = requests.get(url, stream=True) total_size_in_bytes = int(r.headers.get("content-length", 0)) with open(fpath, "wb") as file: for data in tqdm.tqdm( r.iter_content(chunk_size=4096), total=total_size_in_bytes, unit="B", unit_scale=True, miniters=1, desc=url.split("/")[-1], ): file.write(data) else: r = requests.get(url) with open(filename, "wb") as f: f.write(r.content) else: if USE_PROGRESS_BAR: with DownloadProgressBar( unit="B", unit_scale=True, miniters=1, desc=url.split("/")[-1] ) as t: urllib.request.urlretrieve(url, filename, reporthook=t.update_to) else: urllib.request.urlretrieve(url, filename) def get_data_dir() -> pathlib.Path: """Return the path to the cache directory, creating it if required.""" data_dir = get_config_dir() / "data" data_dir.mkdir(exist_ok=True) return data_dir @functools.lru_cache def get_url_map() -> dict[str, str]: """Return a dict containing the URL mappings from ``urls.json```.""" with open(HERE / "urls.json") as url_file: return cast(dict[str, str], json.load(url_file)) def get_url(filename: str) -> str: """Return the download URL corresponding to `filename`. The filename:URL mappings are located in the ``urls.json`` file. Parameters ---------- filename : str The filename of the file to get the corresponding URL for. Returns ------- str The download URL corresponding to `filename`. Raises ------ ValueError If `filename` is not in the ``urls.json`` record. """ # Convert filename to lowercase because windows filenames are # case-insensitive urls = {k.lower(): v for k, v in get_url_map().items()} try: return urls[filename.lower()] except KeyError: raise ValueError("The file provided isn't within pydicom's urls.json record.") def data_path_with_download( filename: str, check_hash: bool = True, redownload_on_hash_mismatch: bool = True, url: str | None = None, quiet: bool = True, ) -> pathlib.Path: """Return the absolute path to the cached file with `filename`. If the file isn't available in the cache then it will be downloaded. Parameters ---------- filename : str The filename of the file to return the path to. check_hash : bool, optional ``True`` to perform a SHA256 checksum on the file, ``False`` otherwise. redownload_on_hash_mismatch : bool, optional ``True`` to redownload the file on checksum failure, ``False`` otherwise. url : str, optional The file's corresponding download URL Returns ------- pathlib.Path The absolute path to the file. """ if _SIMULATE_NETWORK_OUTAGE: raise RuntimeError("No network!") filepath = get_data_dir().joinpath(filename) if check_hash and filepath.exists(): try: get_cached_filehash(filename) except NoHashFound: filepath.unlink() # Force a redownload if not filepath.exists(): if url is None: url = get_url(filename) download_with_progress(url, filepath) if check_hash: try: hash_agrees = data_file_hash_check(filename) except NoHashFound: return filepath.resolve() if not hash_agrees: if redownload_on_hash_mismatch: filepath.unlink() return data_path_with_download( filename, redownload_on_hash_mismatch=False ) raise ValueError("The file on disk does not match the recorded hash.") return filepath.resolve() class NoHashFound(KeyError): pass def get_cached_filehash(filename: str) -> str: """Return the SHA256 checksum of a cached file. Parameters ---------- filename : str The filename of the cached file to calculate the checksum for. Returns ------- str The SHA256 checksum of the cached file. """ with open(HERE / "hashes.json") as hash_file: hashes = cast(dict[str, str], json.load(hash_file)) # Convert filenames to lowercase because windows filenames are # case-insensitive hashes = {k.lower(): v for k, v in hashes.items()} try: return hashes[filename.lower()] except KeyError: raise NoHashFound def data_file_hash_check(filename: str) -> bool: """Return ``True`` if the SHA256 checksum of the cached file is correct. Parameters ---------- filename : str The filename of the cached file to check. Returns ------- bool ``True`` if the cached file has the correct checksum, ``False`` otherwise. """ filename = os.fspath(filename) filepath = get_data_dir().joinpath(filename) calculated_filehash = calculate_file_hash(filepath) try: cached_filehash = get_cached_filehash(filename) except NoHashFound: warn_and_log("Hash not found in hashes.json. File will be updated.") with open(HERE / "hashes.json") as hash_file: hashes = json.load(hash_file) hashes[filename] = calculated_filehash with open(HERE / "hashes.json", "w") as hash_file: json.dump(hashes, hash_file, indent=2, sort_keys=True) raise return cached_filehash == calculated_filehash pydicom-pydicom-20aa4b7/src/pydicom/data/hashes.json000066400000000000000000000162511515706620200225450ustar00rootroot00000000000000{ "693_J2KR.dcm": "c392d8bd1f952ed2d9387d5143d34c5a29ac9d74566688169731a50ac6a82aa2", "693_UNCI.dcm": "42d6c33d6666bf569a53951211be6fca2ab04956db43c3f75a9720d976ab128c", "693_UNCR.dcm": "cc4cdd599231922ecf63de2ddacf03d51c4588805c9154c2eef1ff49c23b32be", "JPEG-LL.dcm": "c9d000c75d92b143ce1c0421471a7e9a69c8996d98b2589e533e311615a10079", "JPEG2000_UNC.dcm": "645ff302c7f7ee6c402d74c7c9e3cb5efdb861a828959cc2adc8775a8260688d", "JPGLosslessP14SV1_1s_1f_8b.dcm": "1978d4f058e52d3239fae33f261b3dc74605fdd9f89031fffd57bea6218d0dbf", "MR-SIEMENS-DICOM-WithOverlays.dcm": "094faf56c63bff84c30567e29de0c67d7c5a8ae05cf880ac12175491b6b645d2", "MR2_J2KI.dcm": "8319846e6ad6dc70dbbaf61748b1987a6807fd02db3da24e7989fd5a5ce19e4e", "MR2_J2KR.dcm": "707f0a1b648b79f17b61e241af31fb9edea7fe596681a4bcab6cce890300a9a5", "MR2_UNCI.dcm": "7f79ac33e1ab32e1a8ca10ce62f18e5a2372e78c8a6684af17302b1a0171fc46", "MR2_UNCR.dcm": "c14c7f0c6e25bd4dfbb822fe264e540fc7142bf1c9d15d4c652ec8f5f97fa9e8", "OBXXXX1A.dcm": "164a460bebdc15fbe391ad4bfe4c84672eb2bad57adfe7dad372fd7367b0f63e", "OBXXXX1A_2frame.dcm": "6627f6e46dbf8c16292fb1eaff8807439bcd233dc68099c07f0b83c4093256b1", "OBXXXX1A_expb.dcm": "0cf6b4b04a1f239755fe9aef2b093b3004a290c262ec2567f555212d6c679c83", "OBXXXX1A_expb_2frame.dcm": "2ccd16a61d680e85ad82fe1d60c4c50496a91309aa2fd27157fc9660291d6ba5", "OBXXXX1A_rle.dcm": "aaf57785817dbe35503c6175d677d2efa811f90e931fc5017611ba9ff4c7f92a", "OBXXXX1A_rle_2frame.dcm": "65bee869c507f535edea93a446a26e941fb9cbc3819e4d73395f11eef56d4687", "OT-PAL-8-face.dcm": "d5560470077f77ef6a0a52d22f9f61e803436d2b468a9550a4d12c5675ee0a97", "RG1_J2KI.dcm": "744d01372fdda4e21b507bb7f97329065de961f4f263342079b369b430064d65", "RG1_J2KR.dcm": "7fbfd29360af806770102fd7c4ffcb2a133075bd00920a4bb63460d516f67ac4", "RG1_UNCI.dcm": "3561020824868615a93a51078671b3ff73bb2578c966f76def99b4d982897e75", "RG1_UNCR.dcm": "946f28f48b9fbf360196a9b835c8fce83b0c654bf85a5107663c8a61df02e498", "RG3_J2KI.dcm": "c90c915c0c373eb6d244151f9476b05e50623c303ac20334ca9ce4aab0dddf19", "RG3_J2KR.dcm": "ffde92ba154a7d5ed2ab70b7cd37892772f8bef63fb26f9080327c6a089c205b", "RG3_UNCI.dcm": "9ef0260919de89774da90336ad16c03a5be899a8bb663bbaea52b6d0769bec78", "RG3_UNCR.dcm": "6babfc42dd404213e1758d6dbb93648c248783cc23f593103fff4295c3374dfb", "SC_rgb.dcm": "b0f868d6a689a0ff96c39b459caf1b628eacd74134114ce84549573321231138", "SC_rgb_16bit.dcm": "3dc969768431d1cb2695dcd3f190588b02413798dab8420418d2fbb9cb4d4075", "SC_rgb_16bit_2frame.dcm": "f251a296e1aa5dde37423a9aacba7f31b0b4869328caa6e42bf6b110f007c401", "SC_rgb_2frame.dcm": "9b5c0306679675c688c2044d97878a6a14ce9976ecdf022309e5f6e9ceaffd9c", "SC_rgb_32bit.dcm": "c3dac5c807ab27227c0d36b7cd34bb776103bb08d230ff74e62259eeeef0769a", "SC_rgb_32bit_2frame.dcm": "33f78c27519f23e0410e9c5d24f55380a431255f00ff95e12a26fd45765a7920", "SC_rgb_dcmtk_ebcr_dcmd.dcm": "e183a37c833c78da6c516aed9920527d80d7f1bbaf805a92530024e1aa2e74ff", "SC_rgb_dcmtk_ebcyn1_dcmd.dcm": "a963683216b270b788682dc132a65965406a3100722c2d0c2fd2219a0ea53c66", "SC_rgb_dcmtk_ebcyn2_dcmd.dcm": "2692a16f99b879c742398f3a5b4b9508165d4fe6b056eaa85642ff6bed80ff62", "SC_rgb_dcmtk_ebcynp_dcmd.dcm": "6324aa7eb90e57299087a70ff6875b10f4d17b8e359ee2f20f1eaaf3d0876993", "SC_rgb_dcmtk_ebcys2_dcmd.dcm": "f6334492b38d4494b0e8929c4f6b34e9decba9b2dae4e01749263bf254a8c096", "SC_rgb_dcmtk_ebcys4_dcmd.dcm": "9fb6b7e5dd1f1097ecb23fcd2afafeee9c5233f75680b0922b723f2f1b7b09ab", "SC_rgb_expb.dcm": "e92997e0cf83407693478ca6f2ce44f42f50f73751f11c355ce555ef86dc8e84", "SC_rgb_expb_16bit.dcm": "5e8e2340ba9698deba857f76e0ee007c1acb88de84841519425afe76b5b25c11", "SC_rgb_expb_16bit_2frame.dcm": "fb88f409d21ca9c08672f32f756d0ba0d57de91f8240cf807971085a600e866b", "SC_rgb_expb_2frame.dcm": "b8b9adb32b2c3ce33c3136620a9b00c2440e047574305e76d176e28ad374134f", "SC_rgb_expb_32bit.dcm": "5153bb5df191a2b1ec40f592d433a097523a2979ee2ec22ae47ad2bf823bebd3", "SC_rgb_expb_32bit_2frame.dcm": "cb4e18465d10d4c60afcf8e591b44687ffac8cfd63ab9ca3b6ad45ec25dc2175", "SC_rgb_gdcm2k_uncompressed.dcm": "abf72c420b8bb97a29b93cb5d63a633271b65038d8323e28d71334bc56ef1a2b", "SC_ybr_full_uncompressed.dcm": "3c9f4b2b82a3f88ce5340cb07ce14782dcbb09840938e4489e8c21eac1f02dd6", "US1_J2KI.dcm": "22340375674ff253196ce8a147acf0458bea3f105ff2c6af81f0eb119729605b", "US1_J2KR.dcm": "2427fdc82d90cd4ce8a69b5157eecb37549902dce138ac15c6456a7eae70b83d", "US1_UNCI.dcm": "b7556a5414d5ed6bd0359b8222eda10efcce81762428848d9a3ac6be5b55cb6c", "US1_UNCR.dcm": "af5a66e40cd49d15dfbf7b78c850eba0662bdc7339339c3fa13f123a57e812cb", "bad_sequence.dcm": "0677915e5c3e8c98498eb3d1b726ccf38ba0d8ada657c8ca7fe1b8b9b5890f4f", "color-pl.dcm": "16bfc3134e59d789985efddfc70d924420b16e1c6d1f21c960bb4544c9e9dbf9", "color-px.dcm": "bf10a89f277743ea337b7c4741efa0709a086f0161e1ff2b94cff01e428047e4", "color3d_jpeg_baseline.dcm": "c8798b8abf8ae0a18e8c9952e7c7f75f3cc8465234b1b63f9e3ba3bebb9d5625", "eCT_Supplemental.dcm": "0a4c3aa02d1b0b4826daa5ffe85ef13be83c1433842a9a98b901e075136dd86f", "emri_small.dcm": "151233ec63f64ebb63b979df51aa827cd612a53422c073f6ef341770c7bc9a56", "emri_small_RLE.dcm": "93c19bca3fb6b7202dcd067de8d16cb6b3f7c6e9a0632e474aab81175ee45266", "emri_small_big_endian.dcm": "8e18ed3542bc4df70dc6acda87eab5095b19e2b4c1b7fb72ba457e7c217b1ab7", "emri_small_jpeg_2k_lossless.dcm": "b2b4063359a08ed3b0afa9f4e4f72f84af79e5116515b446d9a30da9dc7f1888", "emri_small_jpeg_2k_lossless_too_short.dcm": "8742a49b7d02dedb11e7926d30900a415c42efeff02a64a0aa0f0873cf6da582", "emri_small_jpeg_ls_lossless.dcm": "24de03c9c0f8b5aa75d7fbcc894f94e612b66702175b4936589a0849ec9f87b4", "explicit_VR-UN.dcm": "28c4a61022d7dbebec97e2f1bbdad0ed097bee2c62727c26a3f3720248c9c6e7", "gdcm-US-ALOKA-16.dcm": "f1a2d5f7c4ffe87dc589b12738084099fe44a436f6980f5d7e96a026ad356d65", "gdcm-US-ALOKA-16_big.dcm": "2a801cbd7bd04ed28b9c14c7a8edb04b43384e38f00574e27c0fab8f4aa62db4", "liver.dcm": "4f8fb316b6df067bdf2ef7bc2385fd571ad5be67e171aed3ed902a71293d9d5c", "liver_expb.dcm": "fe3323f3f4a2166e4c5305a2380a035a66504197f3f01a6e2b50bbd9814721d5", "mlut_18.dcm": "9c65b39df55dc46a4670f76e0ec1093d097206ed46c2d7e23b8051c87ef0228b", "vlut_04.dcm": "64f54c0f490ce3fa2faac0a90a7ca0166caa025f8fdcfbe181906387a7867c27", "HTJ2KLossless_08_RGB.dcm": "38f8e8adf46b928a12f1905df1405bc8a32c10286733c47562c75be84ceae00e", "HTJ2K_08_RGB.dcm": "9a7ae1960f18315c4d58876c2a8333a704e89ca3697edd5b69f600773220eb90", "JLSL_RGB_ILV0.dcm": "f8836a650728f4f1b014a52905e321490f3eefcc0f71ac27fd2c1bd7fc5bbcc4", "JLSL_RGB_ILV1.dcm": "281610d528d8e22bd52e79d17261ef0c238ef8cfc50696a2d9875a933108864e", "JLSL_RGB_ILV2.dcm": "f8d670e9988cbca207d3367d916aff3cb508c076495211a0d132692266e9546d", "JLSN_RGB_ILV0.dcm": "a377750d24bd3413d21faa343662dfff997db9acf65c0b095c5d8a95beb866fa", "JLSL_08_07_0_1F.dcm": "308fb028c8fbdd1e9a93e731978ea4da6b15cb55b40451cf6f21e7c9ba35dd8a", "JLSL_16_15_1_1F.dcm": "61f38f250a7dc82c44529c0face2eeab3ffd02ca8b9dfc756dd818eb252104b6", "parametric_map_float.dcm": "957f34397c26d82f7a90cad7a653ce0f7238f4be6aa9dfa9a33bae5dc2ce7e23", "parametric_map_double_float.dcm": "a41e0b78b05e543a2448e22435858f9ca8d5f94807d7b391b93b4bca80e23a22", "liver_nonbyte_aligned.dcm": "530c6af2a2a0caa6033d99ad407fe1f6e3942c64a8fcfc5649d4d06c26473862" } pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/000077500000000000000000000000001515706620200222135ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/README.md000066400000000000000000000032751515706620200235010ustar00rootroot00000000000000DICOM Well-known Color Palettes http://dicom.nema.org/medical/dicom/current/output/chtml/part06/chapter_B.html +----------------------------+---------------------+------------------+ | (0070,0080) Content Label | SOP Instance UID | Filename | +============================+=====================+==================+ | HOT_IRON | 1.2.840.10008.1.5.1 | hotiron.dcm | +----------------------------+---------------------+------------------+ | PET | 1.2.840.10008.1.5.2 | pet.dcm | +----------------------------+---------------------+------------------+ | HOT_METAL_BLUE | 1.2.840.10008.1.5.3 | hotmetalblue.dcm | +----------------------------+---------------------+------------------+ | PET_20_STEP | 1.2.840.10008.1.5.4 | pet20step.dcm | +----------------------------+---------------------+------------------+ | SPRING | 1.2.840.10008.1.5.5 | spring.dcm | +----------------------------+---------------------+------------------+ | SUMMER | 1.2.840.10008.1.5.6 | summer.dcm | +----------------------------+---------------------+------------------+ | FALL | 1.2.840.10008.1.5.7 | fall.dcm | +----------------------------+---------------------+------------------+ | WINTER | 1.2.840.10008.1.5.8 | winter.dcm | +----------------------------+---------------------+------------------+ * All color palettes have 256 LUT entries, a first mapping of 0, and 8-bit entries * HOT_IRON, PET, HOT_METAL_BLUE, and PET_20_STEP use normal color palette LUT data. * SPRING, SUMMER, FALL and WINTER use segmented color palette LUT data. pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/fall.dcm000066400000000000000000000077561515706620200236350ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.7UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEUI1.5.52.10587658484.2.0.1OB*USUI1.2.840.10008.5.1.4.39.1DA20120702TM 172649.854UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.7 IS1 (US(US(US(UI1.2.840.10008.1.5.7(!OW("OW(#OW( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCSFALL LUTpLOFall LUTpPNPhilips pSQSQSHfrSHRFC3066 LOFrench pLO Automne LUT SQSHdeSHRFC3066 LOGerman pLO Herbst LUT pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/hotiron.dcm000066400000000000000000000112221515706620200243600ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.1UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEDA20120702TM 172646.441UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.1 IS1 (US(US(US(UI1.2.840.10008.1.5.1(OW  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~(OW  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~(OW  $(,048<@DHLPTX\`dhlptx|( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCSHOT_IRONpLOHot IronpPNPixelMed^Publishing pSQSQSHfrSHRFC3066 LOFrench pLOHot Iron SQSHdeSHRFC3066 LOGerman pLOHeisses Eisen pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/hotmetalblue.dcm000066400000000000000000000112501515706620200253640ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.3UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEDA20120702TM 172647.311UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.3 IS1 (US(US(US(UI1.2.840.10008.1.5.3(OW  #&),/2479;>@BEGJLNQSUXZ]`cfilortwz}(OW  "$&()+-/13578:<>@BDFHIKMOQSUWXZ\^`bdfhikmoqsuwxz|~(OW !#%')+-/13579;=?ACEGIKMOQSTVXZ\^`bdfhjlnprtuwy{}¿~ysmga[UOJD>82/,)&#    #&),/258;>ADGJLORUX[^adgjmpsvy|~( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCSHOT_METAL_BLUEpLOHot Metal BluepPNPixelMed^Publishing pSQSQSHfrSHRFC3066 LOFrench pLOHot Metal Blue SQSHdeSHRFC3066 LOGerman pLOHeisses Metallblau pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/pet.dcm000066400000000000000000000111741515706620200234740ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.2UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEDA20120702TM 172649.367UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.2 IS1 (US(US(US(UI1.2.840.10008.1.5.2(OW !#%')+-/13579;=?ACEGIKMOQSUVXZ\^`bdfhjlnprtvxz|~(OW  "$&(*,.02468:<>ACEGIKMOQSUWY[]_acegikmoqsuwy{}~|zxvtrpnljhfdb`^\ZXVTRPNLJHFDB@?=;97531/-+)'%#!   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~(OW !#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}|xtplhd`\XTPLHD@<840,($    $(,048<@DHLPUY]aeimquy}( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCSPET pLOPET pPNPixelMed^Publishing pSQSQSHfrSHRFC3066 LOFrench pLOTEP SQSHdeSHRFC3066 LOGerman pLOPET pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/pet20step.dcm000066400000000000000000000112661515706620200245340ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.4UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLECS ISO_IR 100DA20120702TM 172649.854UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.4 IS1 (US(US(US(UI1.2.840.10008.1.5.4(OW`````````````0000000000000000000000000PPPPPPPPPPPPP`````````````ppppppppppppp00000000000000000000000000PPPPPPPPPPPPP@@@@@@@@@@@@(OW0000000000000000000000000PPPPPPPPPPPPP`````````````ppppppppppppp`````````````а`````````````0000000000000(OWPPPPPPPPPPPPPPPPPPPPPPPPPPpppppppppppp00000000000000000000000000PPPPPPPPPPPPP@@@@@@@@@@@@PPPPPPPPPPPPP`````````````@@@@@@@@@@@@@( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCS PET_20_STEP pLO PET 20 Step pPNPixelMed^Publishing pSQSQSHfrSHRFC3066 LOFrench pLOTEP Vingt tapes SQSHdeSHRFC3066 LOGerman pLOPET 20 Schritte pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/spring.dcm000066400000000000000000000100101515706620200241720ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.5UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEUI1.5.52.10587658484.2.0.1OB*USUI1.2.840.10008.5.1.4.39.1CS ISO_IR 100DA20120702TM 172649.854UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.5 IS1 (US(US(US(UI1.2.840.10008.1.5.5(!OW("OW(#OW( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCS SPRING LUTpLO Spring LUTpPNPhilips pSQSQSHfrSHRFC3066 LOFrench pLOPrintemps LUT SQSHdeSHRFC3066 LOGerman pLO Frhling LUT pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/summer.dcm000066400000000000000000000100041515706620200242030ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.6UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEUI1.5.52.10587658484.2.0.1OB*USUI1.2.840.10008.5.1.4.39.1CS ISO_IR 100DA20120702TM 172649.854UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.6 IS1 (US(US(US(UI1.2.840.10008.1.5.6(!OW("OW(#OW ( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCS SUMMER LUTpLO Summer LUTpPNPhilips pSQSQSHfrSHRFC3066 LOFrench pLOt LUT SQSHdeSHRFC3066 LOGerman pLO Sommer LUT pydicom-pydicom-20aa4b7/src/pydicom/data/palettes/winter.dcm000066400000000000000000000100201515706620200242010ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.8UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.99.2SHPIXELMEDJAVA001 AE OURAETITLEUI1.5.52.10587658484.2.0.1OB*USUI1.2.840.10008.5.1.4.39.1DA20120702TM 172649.854UI1.2.840.10008.5.1.4.39.1UI1.2.840.10008.1.5.8UI1.2.840.10008.1.5.8 IS1 (US(US(US(UI1.2.840.10008.1.5.8(!OW ("OW(#OW( OBH HLinoscnrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmpCS WINTER LUTpLO Winter LUTpPNPhilips pSQSQSHfrSHRFC3066 LOFrench pLO Hiver LUT SQSHdeSHRFC3066 LOGerman pLO Winter LUT pydicom-pydicom-20aa4b7/src/pydicom/data/retry.py000066400000000000000000000037701515706620200221200ustar00rootroot00000000000000from functools import wraps import logging import time from typing import Any from collections.abc import Callable def retry( exc: type[Exception] | tuple[type[Exception], ...], exc_msg: str | None = None, tries: int = 4, delay: int = 3, backoff: int = 2, logger: logging.Logger | None = None, ) -> Callable[[Callable], Any]: """Retry calling the decorated function using an exponential backoff. https://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/ original from: https://wiki.python.org/moin/PythonDecoratorLibrary#Retry Parameters ---------- exc : Exception or Tuple[Exception, ...] The exception to check. may be a tuple of exceptions to check. exc_msg : str, optional The message to be shown if an exception occurs. tries : int, optional The number of times to try (not retry) before giving up, default ``4``. delay : int, optional The initial delay between retries in seconds, default ``3``. backoff : int, optional The backoff multiplier e.g. value of 2 will double the delay each retry, default ``2``. logger : logging.Logger, optional The logger to use. If ``None`` (default), print to stdout. """ def deco_retry(f: Callable) -> Any: @wraps(f) def f_retry(*args: Any, **kwargs: Any) -> Any: mtries, mdelay = tries, delay while mtries > 1: try: return f(*args, **kwargs) except exc as e: msg = f"{e}: retrying in {mdelay} seconds..." if exc_msg: msg += f" {exc_msg}" if logger: logger.warning(msg) else: print(msg) time.sleep(mdelay) mtries -= 1 mdelay *= backoff return f(*args, **kwargs) return f_retry # true decorator return deco_retry pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/000077500000000000000000000000001515706620200225335ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/693_J2KI.dcm000066400000000000000000000070061515706620200243230ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.2.1143.6234428899086018376578420169896863246UI1.2.840.10008.1.2.4.91UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvULHCS ISO_IR 100CSDERIVED \PRIMARY\AXIALDATMUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.2.1143.6234428899086018376578420169896863246 DA#DA0TM3TMPSH`CSCTpLOPN>LO 5/5mm Plain LO!STlossy conversion!SQPUI1.2.840.10008.5.1.4.1.1.2UUI61.2.276.0.7230010.3.1.4.296485376.1.1521713419.1802510@pSQSH121320SHDCM LOUncompressed predecessor SQSH113040SHDCM LOLossy Compression UL8PN CQ500-CT-310 LO CQ500-CT-3100DA@CSbCSYES ULh"CS AXIAL MODEPDS5.000000`DS140 DS 20.000000 DS 320.000000 LO coreload.81 DS 245.000000DS 949.147000DS 541.000000 DS0.0000000DS 185.500000@CSCWPIS2000QIS170 RIS85`SH HEAD FILTER pIS23800 DS0.700000SHSTANDARDQCSHFS FD@FD?FD4@ UL UI61.2.276.0.7230010.3.1.2.296485376.1.1521713414.1800996 UI61.2.276.0.7230010.3.1.3.296485376.1.1521713419.1802493 SH IS2 IS6 IS21 2DS-122.500\-112.400\47.000 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 @LOOM ADS47.000(UL(US(CS MONOCHROME2 (US(US(0DS0.478516\0.478516 (US(US(US (US( SS0(PDS40(QDS100 (RDS-1024 (SDS1 (TLOHU(!CS01(!DS338.687338501292@UL @ SHANONULOW OQ)R \@d*Created by GDCM/OpenJPEG version 2.3.0 \3 jوdBEJ:7ʚ3ce7ҡu@@<\,*enT k 2ޢ@փ`Q00)P2}w$:gTCL|̲璿<I/=zOGt"im u{c +f>,p>zl8 ru '2;Jg 4يf7&DҞW[lXpV*ՁL'c+lZ _G&bÏ h\*aCp]@P'`]{T$$( F{$Q F'GwMѱoO$J4#1”JlՃ }.|k>֡vu {MP/>Kí4yA*i O?8LK>v%hyl*zDׂ6N>Q|+ `m u&uZ[Mvx yNrq;_D! qw#ýzs=%2o`Q Ҷ)MTGM! ,`!3^=O[(_ֳTMw1 :Ѕ*/h<5p/DW~ķ=\_*ּQ yxQavhR~1jMb7ř!1-I:F0orU#Q.01{]-M3zFù@{KR՝sZ2 tdc-:\iu jsGv;,SO.X@pDoȕ>&Fm\u%sD/0/7}::-Gf?.``K.!kVADLX)AB0SDa]j+T5hۦ= wZ'E{$>~j Œp􎟡/lƁu "|(1rpS^ Wpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/CT_small.dcm000066400000000000000000001144461515706620200247300ustar00rootroot00000000000000II*TDICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20040119TM072731UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 DA20040119!DA19970430"DA19970430#DA199704300TM0727301TM1127492TM1129363TM113008PSH`CSCTpLOGE MEDICAL SYSTEMSLOJFK IMAGING CENTERPNSH-0500 SHCT01_OC00LOe+1 LORHAPSODE LO GEMS_IDEN_01 LOGE_GENESIS_FF SHCT01 SH HiSpeed CT/i 'SL,g3 0SH 1SH SH05 ULM": SL,g3PNCompressedSamples^CT1  LO1CT10DA@CSO SQH LOABCD1234"CSTEXT LO1234ABCD"CSTEXTAS000Y0DS0.000000!LTLO GEMS_PATI_01SSLOISOVUE300/100 "CS HELICAL MODEPDS5.000000`DS120 DS5.000000DS 480.000000 LO05@LOIVDS 338.671600DS1099.3100585938 DS 630.000000 DS0.0000000DS 133.699997PIS1601QIS170 RIS170 `SHLARGE BOWTIE FILDS0.700000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 373.750000DS1.016600DS 955.799988SSSSSSSSSSSSLOS DS7.791870LOI DS -320.197968 DS0.000000#DS5.000000$DS 17.784578 %SS&SL'DS1.000000*DS 178.079926+DS 3994.299316 ,SL(.DS -718.079956 /DS 984.0000009SS@SSASSBSSCSSDDS1.000000GSSJSSKSL(RSSWSSXSS^SL_SL`SLaSL(bSLjSSkSSTpSSqSSrDS0.000000sDS0.000000tDS0.000000uDS0.000000vDS0.000000SSDS0.000000SSSSDS0.000000 UI,1.3.6.1.4.1.5962.1.2.1.20040119072730.12322 UI.1.3.6.1.4.1.5962.1.3.1.1.20040119072730.12322 SH1CT1 IS1 IS2 IS1 2DS"-158.135803\-179.035797\-75.699997 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI.1.3.6.1.4.1.5962.1.4.1.1.20040119072730.12322 `CS @LOSN ADS-77.2040634155 @LT Uncompressed!LO GEMS_RELA_01!SS!SH05!UL)/_!US^!SS!SH05!UL2f,!7SS!JLO!SS!SS!FL!FL#LO GEMS_STDY_01#pFD7A#tSL#}SS%LO GEMS_SERS_01%SS%SL,%SL%SS%SL%SL%SL%SH'LO GEMS_IMAG_01'SL'SS'SL'SS'SL'SL' SS'0SH'5SS'@SHI 'AFL{h'BFL333'CFL33A'DFLff'EFL'FFL'GFL'HFL*4'IFL* 3C'JFLff'KFL*4'LFLĢ'MFLff'PFL|'QFLg'RSHL 'SSHA 'TSHI 'USHI (US(CS MONOCHROME2 (US(US(0DS0.661468\0.661468 (US(US(US(US( SS0(RDS-1024 (SDS1 )LO GEMS_IMPS_01)SL)DS0.000000)DS0.000000)SLW)SH) SH) SS)&SS)4SL)5SLCLO GEMS_PARM_01CUSCUS(CSSCSS kCSSCSS(CSSCDS0.095000CDS0.085000\1.102000\0.095000CSS^CSLCSS CSSCSS(CDS2.000000CSLC DS0.000000C!SSC%SS C&US C'SH/1.0:1C(OBPCT01HiSpeed CT/i0505z:=|C)OBCRC*OB(CT01HiSpeed CT/i0505z:=|C+SSC1DS-11.200000\9.700000 C@FLv2CCAFLnECBSLCCSLCDSLCESLCFSLCGSLCHSLCISLCJSSCKSLCLSSCMFLCNFL)AOWFjR9][9  8Tiy~Kz72[XbH  yS   Mmza3_8,NVN8)V`M;  a, Er~i-ATrf5,:,*, `+$7+)'DlW/39T6D,A FF?QH9=5^v?N;-9>D=^VMpi[H %OZ W>h8M'/Zn /vY6 LZ+.E  3&+Et<hA[ve7E|A!!]% ,6 Hpf_ "Bx3{   + 3hM!5QFQJwj0$et]#$c"  n! A  8M,T\ ,i|~oB?+e\0r [;%Nyj6(  )5v7L=4H~#?ap9( B7E3y cmG\R%=xf90-N<[-[k/w}&(OPzvGR!*M?  ~_IP0%/=p` TDsBWH% C%(O@)!  ) LDs;&Ev+Vo|_-   6jtU 13 a^t(/3MjYS /&=f/3 'kF" F5D%)p7+ANqSx'o 1I+3bKOcu`gw< G7@R)`vz{|w>yg%  2x6HIN:16OQlW" !_#aX@:Kwvr}`/ayh/#g4N*A@G2 76I,YmZSP$>U )5* 7U (( #2XMUjq#@Q@ZqwiSw"3@SN3 rbK/y ( x Q! ]{ $06OYyqUM,aj@qz.D&1uy"  {?+ 3?4CI#ble&%'.9Tp 4| 0=|f5H)\wl H4 ?=!""/-NQ'*II^/y$ L!xjjVm K tz\x>}I2#"%3qL$8\;8OE=O2C^t  3u>D5$!+0+71jyvt? . ) ~{4KE( {rJJzvE+%%"+{|O6=j[ aA $?'FBQK\<0LTyV' 7dq40mV `j mr)))=` 8"~V<v#   9=MK..Y8 -X0JJ&|!HJX/W$s %%KN,  /0?*>$$A+ +V* Ha:!%upM/E"0.='2-7 Dr z NH(([2]*!4 33{n5 i,y Ft388:7sj,"g^!k9(  ="y~9L2 H'l# F2(LD3phq/Z$! K7O0dV>.5  /N FvZ-"xfNt%@ $7*LQZ</  V!3;8-@WjvRK8}Ia8+SV4hru64 # .?L"} l5"V4(1,OJ7!&>,)7bd  ,he ;ovWw51hA0%"0T52EC1`kF Xk+!}'<H[v.z rNQ0,$K~7"+#%4,=24 C}lEA*QK rA);fO;   .:JFdexz| 8_K,75B<BfK7"& $ @cA+ \`$ :>H7Zppvy%YFR7MSz*Q_=LYKgyW^-?OM0.` 4 i{ 1Tc{qyH%@lC]PC,$* ;&~SG,#J1F'  (p$Vcdh~qOZhlh90=fH> %Y'702ER[ K! /g#s;xvc\YLOSR:6 i6^/9   //O8sCon2" \63(&v;^rN/  GuQtJJ/<FF)($)3.(;h@(}*$ mub/ZnJ21(! &,5Dh+%$;5>;+*('1-)+C !  omiFm{bP5 ;Mv)!,%!% 3nPY&mO7 c2^]ncXL jH[a{Z+$!*/*3.&%>|X%  " uFjs^VA0{ -@5m{Z<HQA64./98( ( 4:"%$xN  N >#+EMNI?7& ,J(/YCJ4+FI,%62*+6$#00)eog\N)  B N 9U5'"  <TFC-b#('1@=/"   8Lyr\M& r2 jH;<]=  Uz*G[KC! &0)20&74'..:-3Q|diTO@ *E|J% 4' CSIDq_O.55*-+=3'.2..% 6ZfN[JB2  "&HE>s#;O< @L,[7Bq`UM80=)!   ":WYJhpZUN<M1"'?4+$ H! qZ81G#FKOnT?3/#- ' 8ph&/S8   a :[AR'/IH'+Or%<E#(/!T|]auwR  efT6r,$9BRY#3S3 2nb?aAnF?: ".fz'za$?Q7*/Py2ac[|?*!yCv5vlZDA#z#_x f?    ( M2+7Xj 'EHUtY6@<X% -2.?y4,6mx9}{" #yQ%Un%!C``e>~'_8v= Z}>7aLCW:T?]t& o[0PX{fgx-e3Kt~I~JB)8D+YbGiy$5Jhw&O$ v&4!5=S :V ."`[pT[Ozo^s3\P/AZ=]6)@i5 *R}q'mb@vYj 75i^VJH L}gyF%3|V.^GGm8H}J<-( hVCc'Rx3I N}OI  k_n(ctb8}P;  7 s8'Ydlvr  < yU""1,!%-24"x-t'd TzR&Stk;5A.+%=1r\>Qmn~sxk^PophC3n]wH+~*9x ,LU tydmvkJ2$ Z AognhQOY53<7?-D[y2j9  pK:$-@Wxe!ytRde, 0vhp_?_=G3 "-$  $0%($#4JWEb*|n\IaW'&#&2,*F. Q ~n''0F. "   >46)+86ez)  ')    <4SO.%YyFo=8 #&#) A   1,4t}:  )fr,tkz*X gV&#*)6-%!#'!.69=,// ,%#   " .'Rk#!  '8  't2M-A! ) ;KJKNUF38:("B@AD2 ">jNI-5,  &4".<I6TbR<_!J|>!%"*'95+# B:7,',%/*(29C@8BRk#X :06!+)JRC>3!%4<V*|B$xZw\+   "# '+06;-:iiL;.)7TCMC 3'2" (56RG!<_u:2))+ 53''*E?5I2,   )%  *598($%.)!)5%F^?:LGGCI1.#8DIG3</ $,=XyfKV`dC!! ='*B.=AFN:*4 *1& &-991+/5!1=?R_B.& 1:240;2=EI@.>860$#%%-/  -\1.bC2l7 2  *,+  7)"(&$ %5*)29WTYykohj:%5,/"-%$&tQT@    " /&&& "YO:3;0<EUMAH<1.@65;*##" 64;>4(&%,8( "XKOT0(  /HX4PneO*& %A=<+  ''/&4@:45&';RK[[\^LD2*%+# ,NB:SJPYQL8*%-01!-&(!&:41 I~5/-7L8.:CSC.)?@D<F_d[[dL75#8C. #,%.-.4-7SF7,  &,=YWE7DdZDAG#$% )0040/=72*4=OXQ<-- Og+" )>5!&1(4-( %"!  2&!#(DA0#,55>A78)#)( */7BT^T`K9."%! 1 .8EU[dH2(  5:+++<BCRZPDS`XED3%!!*$ $:31:?OaMBR@>JLB2DSA::ERWGJ8 *%'7OR-*6LUTW?>8!D3#"11.9/:FRH' " (1)(>C;8A1150  A7,&%+IFFCE>%<fm]C:92:3!&+1C1/0)$'2*4/(;>)<>7818@G2,&")"21<HE6 +5!%%)- '# NA)*,$&2*(-/*&#34**3+&%2A7&9;4A2(  !>[R2.'"*/7)6Q- 3VXJ94.07@JQA*);:)%,,1-"0+! ,>ORJ:),&%',-  &%9C@10, ":$ 0,%5IS[OL1.TZPRebMJ</@AJW]\[SQB6452  - "&*:8//OQR[]SS!-%/7@8787), ,6885Vca?' ''*45#&#$  %8KQ)&# +04:556@MN;7$5D0 &!#);< "&%"(&%/6E@KJOL!*"$%  ^daaTEK?54% $+GL>/#$2:BEB?725=!1BA@6 '#"&$&," HI>D0#,')/$(1DLFKG)472$*44RPA.<OA 1-0.',62CCR|q_SS>3,)2&8:;< >N/*  # &.3;1 )+%;: A=TQP:&$1 ,</2**0'4&:8;VC%)1548  .('  2(-3  ";KGC&hz4=A-5=STEUWOFJG3* 2- *1EKQQUXbgH441 %(*3>9, =KRB?7 )a!"() 2GN;->HRUOD!*7:2OOKE=/CJI?!$&4?1@~2 *10.6&'+! %89! %7GKFMR3&*,<FLE9:B9OTTVA).+# In<(@C>J,'B@  "  */#*UHG7"' ((   #C,  &+<$%     &"2:O`J?:;6:9?=4##**%).    " %   $:GG@=. 5#& *97;:0>0';BKQ" ( .'!.A=," $$  >:(, 6?J6# (".553+60 ;;<<7 "487;>>NH"$!!18/! H^II>-"*2=A463-.)$$;06=8*!$ ')&#$=JH/5$.' .ImldOE<*'.&#1D\wtUAFXMGVPQTLN_iwrTPBHBB=9;)+ <=?GCGYbqwys\ROK=BM=?8[UM'#DTUcWB%!   .'! $+++.==5&*LZecK77AA?FH 1* $$5D9HMRXTM?.  BK7NU<?LN[WUP?),;-(25!A?'  #"+)"")"!-V\SONLNVSB3*&9.B& *$)88TO7E:*<5) 9)$)! /#-"&<@@N]G(6# &/;NM@-=;22""  !/+"(-29=5%# >C9+5+$*  "3/LMEYLSa?$/@AF87P>=>;$#02  %.B<6:=@ZK>1>G6,7:)B=<9*7PHDDKLIVTXJ:VbfbUWWRDLJC5"')-(#)605,-"/9'*=Rec_]@F6)**7--<0 $M[pa[S4"&%2<>;("*A9CM2(,*+!"&&<JF@@4@G:;40HGDEG>'-/09OZ](/826340-FR?.%<<$)&$/1D.#>8B>.533:)4&z +:9=O@/(6?2!"#1*6>4:J@H7.=ASN[TE::3.E[Z_WXWGCOSC3-'AleaTGNFB<3%2??9/' %-(/4B8&#  0EEEJL84>;=RKJFC=*;@C51/%,&FY_ZXRH>6%$>F][25?! "% 4:IHL7&!<;95, 10 )5*.<4. '$'59*+1?5CIC958@=FTUJ72@0%8+   %*~!4I@R9$ /;C83L;07SQ/+! ',#++)/9-0=!03)?N@1- 24,,C]YQN3 }+2<0/;2*" 1TM& #>@9:?4   "& :64('    50'?NG6$-6>7$#1>70(%$/C?.#14!'()+/6+%4A5+;7ED9@-1*#06,01+;M@;4{}0GFAI@,!(?94NG7. $;QPPK?BE8&%"=JG<1IKD./BLWMHALYS;*}p|xr& 489<$ *272HRGCNQG?:75/10.=NE/0H$0$    )tx ')/9JP:8DPLI@*1'*1-+(1 )BbfWNM>23'#,$5LD@00*G9,;47;A0+07H:74  "%KM6<LL@11M>{|y!0,5BI>2"53/%.87;?7+ "*F[]Q;5six}rpt7CB+ "?OOB3*"/ zpytpu\S`jqo~}}hts{xlp}{y{wdkrqvyq{}wo{qhvhlt`pn~w{pe{ypqtx~}kpxneqtzqq~xOB~ Hpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/ExplVR_BigEnd.dcm000066400000000000000000000360641515706620200256210ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.6.1UI:1.2.840.1136190195280574824680000700.3.0.1.19970424140438UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.1.1SHOFFIS-DCMTK-311 UL4CSORIGINAL\PRIMARY\EPICARDIAL UI1.2.840.10008.5.1.4.1.1.6.1UI:1.2.840.1136190195280574824680000700.3.0.1.19970424140438 DA 1997.04.240TM14:04:38`CSUSpLOG.E. Medical SystemsLOGE MEDICAL SYSTEMSSHmvme87LO LOGIQ 700 !"IS0 !$IS1 !(IS0 !*IS1 ULPN AnonymizedULLO4131101  LOR6.1 UL UI01.2.840.113619.2.21.848.246800003.0.1952805748.3 UI21.2.840.113619.2.21.24680000.700.0.1952805748.3.0 IS0 IS1 (UL\(US(CSRGB (US(US<(USP(US(US(US(USUL8LOB8@DZոۺοźɰѷڬزöģĩ԰̸̺ǖ̾ǜħΦ̭˩Ƿ̲{DZոۺοźɰѷڬزöģĩ԰̸̺ǖ̾ǜħΦ̭˩Ƿ̲{ճ諷¾ƳʾºѾƺշ¯췯ܯƳѺ͕;諭DZոۺοźɰѷڬزöģĩ԰̸̺ǖ̾ǜħΦ̭˩Ƿ̲{pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/ExplVR_BigEndNoMeta.dcm000066400000000000000000000006621515706620200267200ustar00rootroot00000000000000CS ISO_IR 100DA20150529TM161509UI2.16.840.1.114337UI1.2.840.10008.5.1.4.1.1.481.8UI1.2.333.4444.5.6.7.8 DA201505150TM105351PSH`CSRTPLANpLO CMS, Inc. LOXiO  LO5.00.02 UI1.2.333.4444.5.6.7.8.9 UI1.2.333.4444.5.6.7.8.99 SH1234 IS1 IS1 RUI1.2.333.4444.5.6.7.8.9 @LOSN0 DA201505290 TM1615020 CSCURATIVE0 CSPATIENT pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/ExplVR_LitEndNoMeta.dcm000066400000000000000000000006621515706620200267470ustar00rootroot00000000000000CS ISO_IR 100DA20150529TM161509UI2.16.840.1.114337UI1.2.840.10008.5.1.4.1.1.481.8UI1.2.333.4444.5.6.7.8 DA201505150TM105351PSH`CSRTPLANpLO CMS, Inc. LOXiO  LO5.00.02 UI1.2.333.4444.5.6.7.8.9 UI1.2.333.4444.5.6.7.8.99 SH1234 IS1 IS1 RUI1.2.333.4444.5.6.7.8.9 @LOSN 0DA20150529 0TM161502 0 CSCURATIVE 0 CSPATIENT pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/GDCMJ2K_TextGBR.dcm000066400000000000000000000737621515706620200256170ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI81.3.6.1.4.35045.258255395321547846922642016970312704221UI1.2.840.10008.1.2.4.90UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.1.0SH GDCM 2.1.0AEgdcmimg UI1.2.840.10008.5.1.4.1.1.7UI81.3.6.1.4.35045.258255395321547846922642016970312704221 DA20110617#DA201106030TM1052203TM121229 UI81.3.6.1.4.35045.178713654550621507378357964392981662901 UI81.3.6.1.4.35045.144617642844613360096093938825160119849(US(CSYBR_RCT (US(US(US(US(US(US(USOBt jP ftypjp2 jp2 jpxbjpx mrreq@ @ ,:  AvKAqG,ѡE8Tgq;EtPNƩ7~CW%8sjp2hihdr;colr0appl mntrRGB XYZ   acspAPPLappl-appl gXYZchad,dscmHwtpt<rTRCPrXYZ`bXYZtdescocprt8gTRCPbTRCPXYZ (6sf32 B&lmluc nlNL(daDK.nbNO&2enUS&XkoKR~zhCNplPL,svSE&2esES&frFU(jaJP$zhTW>ruRU"TdeDE,vfiFI(itIT(ptBR&Algemeen GBR-profielGenerel GBR-beskrivelseGenerisk GBR-profilGeneric GBR Profile| GBR \ |fn GBR cϏeNUniwersalny profil GBRPerfil GBR GenricoProfil Gnrique VBRN, GBR 000000u( GBR r_icϏ1I89 ?@>D8;L GBRAllgemeines GBR-ProfilYleinen GBR-profiiliProfilo GBR GenericoXYZ RcurvXYZ Zus4XYZ tM=descGeneric GBR ProfileGeneric GBR ProfiletextCopyright 2007 Apple Inc., all rights reserved.res resc  uuid:  AvKAquuidG,ѡE8Tgq;uuidEtPNƩ7~2uuidCW%82nejp2cOQ/R \@@HHPHHPHHPHHPHHP E S1G`w0⿆fÀ8 = V p _'@^ꛀ@3C     O  $ă  % \.NmaO,ٸ# U( lng( lngˀA_iմA_iմ"? w w     DG ڌ ڌYtᏙ@uԀ AF eL.@T.Dx9@@J         ljFR.8~h\|!2 Z.*q)OŕTUTa~(p$w&P.u@={`YTFs5'z x i% '+Uipcc AZp ug007>z,_`怾0@NO8 耀 U     τǟ WxA?*P)τǟ WxA?*o)>PqOȼ?WoOrT ]">@:03 a;)g[#rJ>(e}?Yl'i'jQ" oiC8>gz_P[">p @xGM_zaP[" ѯ8Z - τy(j-i>INx:0ThHa!togbma~0PfӬ4~oa+0@ Yªo}ϸӀ         )*@aRF֭Nv1T͙JMEN>Bpt`D֭Nv1E7ap&+* Ĉ]ۢu7aUoP+k $rRZs\Eo' RBL. dE//0܀ـ      p9+0x a͌42O5%8w 9+0x a͌42O5ّFH?JN5qX+]߸#e2>y`Y/dnaW \3)M+KNqY"g=f|Wn\6w+x&w"H+pudSBqve>RQ}M=7ܛ#:!$i4\Q&i3MS#@28{zB=GTvJrmH|X,7<э||'cl.)ٴIUi[K;8Ul.ncrD׼#.UѽM!FsfP|}}ο ?-hlN*#8At+1PSz2G/"!tx#兞P5^skz^1ed>1nT!=s0iwR[g~.-%\skz^1e,AF^\O&m4o<,AʗS`|CAzh65 R1\ P <(u86Fk S}cb6e`3  WX,Lhg9[" _q:>!tc.ISm~~NU!]]%;)^G5zbbTw1wB.Cj.kQm>kO5z 3OW8"tv")%|dpmNp\ ZzZ1X_e=         m¼9LNg0tD8tK9,gՁ< (IZTQ/}-; 񮏆=zj^ ZCɲ"+ \;Xg._w)ZiY'Ӂ۶}V裢_rz*BR"֑~Djz>礞PnЋfCp@7:tЗ׺f8TۨΉ>9(ѥ4ܸsS. δ)?h:w)n!5quϋ|Cp@7Nx\LȦ#ŀ|/ eI-XxC$FZٖ Ϸ*=ߔ288_c |"f鹩gU+ Èk(đ[}>f鹩^f錷)]tdUQHK&x`^ͼ{GπȋO [p3b Sthf<􏌄X_E.O׵2sRKYP" >}} _ 3GRKrU{-J(:ա.aZd5 f R| Mcc諗CisU5݁AE1sd:SΝ}3B:/<-2.E3eLf2p1{sʠuH775DTc"]:f3GRKrU{-J(:ա.aZd5 f R| Mcc諗CisU5݁AE1sd:SΝ}3B:/<-2.E3eLf2p1{sʠuH775DTc"]:f4C͆OFI[@. ׬ Ot%)G0-0LD⦭afEa-Cs:EKdQ>I?3e6`x4C͆OFI[@. ׬ Ot%)G0-0LD⦭afEa-Cs:EKdQ>I?3e6`xNFɎ ?>7&0 3ib$C4&B[mMW]DXNFɎ ?>7&0 3ib$C4&B[mMW]DX:MY!c]84o ?fÀ'Jzgc%i&9DJ BS_.uÀ'Jzgc%i&9DJ BS_.uOhۖ'߀     !l$B˚%6!ìC"_zb@E_ n%'6 aro6Ds9 pFh@릱p4DBmFclI/6ƽI&`yrZ=V F+! W*2);J+eH> :xʺ>nxR8o)Tv*ɱv3.b*u} W*+?'~Ƥjq6k0D)';,"X1*8HO:^!?ΤM &qY3H m;;zL֛M")Ww;]yGP^7MFvw!dm>b(4Ɯ< j1__cSכq"';ƿF>2A|P4? $+˫9 &Ks'1r O` |;aT Ô!Z+[.Z(И3zc-`ϑ,Z+qGd$}dIމBR8^ n.w0dXCY/dTrU܅E \%BjSwL!ˡ<`G΀ Lz#DL=!+wr MV?!;G.!%BjSwXQ̜zˆ |O40'_9gm2Kh']K6[ʤy4 /(xwv7a~cb$QuPREOHV%u1~<׸Ti[ꛃW|V}'uT0;$BheW>!" 1'/9{ZP?ha#< iy-|aIYE,3>+CyiG< Íı5}MρY,ħGaCL\؜ZKc;9SVg|UDz,X=y| 65uղ'ZKc;9SVg| wYunj2𨔪7ٸDvz(X?9lay -DLY-6k>wϾ{*P{!O:071:i8p'=sĘ(`N9y3T[kx %.\@_uY.)7few) |(r=t j';կ qPՉRQ՚OZŏ?KٌL\lD.س= uue4@x ߎ#JC6 N!j      χMsˊi'[c}UәN^+ K1yiTJr-[vu{h]KJY>\ZIS>SƩbOx7y,ҲJڝ6,Tޭ 1QMy/e^~jXV!>ɒχEsˊi'[c}U5O*M>^(]OXIG5 Q)WʦSXm;0!ooTqEҮ3K҅w6<pL|jXV!>ɒË.fJ /dWFiǦa.Jwf0pKIاwV`>;z|e ĵ rDX7JlkSJ 'OgͧD濽Y/-M"TIlN 0ñJ < ;=a`A BeiU+ݨN#w?U;MHA !41qXlkg3puB#ɗv<8|Ü>87K]lc?lAl LJ9nxkF}"NBsH<\LKH|'Vb wFCcd1حǪσDO)yZ1x'β/u@@`n N5lܛ=6E:@PĨN5TqzU9.ȁ@wKʓ4BC[WsFdr鄈@r`ZF\~gj> wFCcd1حǪ >T4uc3s/Fyh*%3?wY.v~(~LEra)ofLs&1[BmG SfV~^So }\ׇYn;#`AU3Hp#IGY6׾i}yhT$yF3@i&܀xM dː+wϿl$Ɍch:>ф-"tu >T4uc3s/Fyh*%3?wY.v~(~LEra)ofLs&1[BmG SfV~^So }\ׇYn;#`AU3Hp#IGY6׾i}yhT$yF3@i&܀xM dː+wϿl$Ɍch:>ф-"tuKD oD@Ev^,nj$5tzU^UwlG9e1BNfc܁KcyGM6i-%(ZeiW>$:ߔD@?ɠ68n;$ؕ'"fTc~}DKD oD@Ev^,nj$5tzU^UwlG9e1BNfc܁KcyGM6i-%(ZeiW>$:ߔD@?ɠ68n;$ؕ'"fTc~}Dx-RI w 5Z S0eF;g T&E90QgR$aE+6ޭ)pʵ 1/+vn9߼D<@T 'S'7XzA0 _\sA?O5*UEF 1 3l./gPL@.mu(0KTDWE7"!}Y'Kcx-RI w 5Z S0eF;g T&E90QgR$aE+6ޭ)pʵ 1/+vn9߼D<@T 'S'7XzA0 _\sA?O5*UEF 1 3l./gPL@.mu(0KTDWE7"!}Y'Kc@ \I#ÍtOE=~zV[vd{L"V"6 @,$ ʇpHO^`Na/Vr!CW̼!& pvu;,XW_Ý$-ΖHחl+gHs]D~`vޖ+ T?a^,@ZC?%Ō#ҵ{/SI\*y9#jM݉bDyI&Pݧ)p!`$R\P!PZ ς|6@'7KkEH~!lGU"wj,HJzkEp⺎JQ GzX7UGJpl-x"^jo˥_ѻ9cj~Ne t\%#/ô-`(7KkEH~!lGU"K&mEp|E/p##-a) APɴ 6}8AN0Qx $Iăc,&L.^]@n3*M3EH-buIA P ‚(4S9Lմ9OP)X*8v&Aޣtw[Ob XtVJF|WwB./NyJFױz|KәՅ[gvXÍA'Pa j3JBvjOtn0CC548K-%i&5ᇃڦqzןA鳩&/o\6&OYb #(.KO?;S/XĖ1DjGy'H٧wU>d[CP?i,troSÌz6d%ƀkdKt, m E7=-> ewr# Cvr $xTJ %$zIP?WN_MGȾ +uݡu:HbVɦ9]/9 %         Z _,Nz7[rB\r69M}}9b{IAD2k/9U6W X*gὤ:K 2=ޑu!jxH'@x=fx'*t01%zzCP^,No}QR)n'l'b=pо.T^z]?l6m*B&0,XI+ F DD龖4VӀ2 ܭ +Or$O,d8rF!k;Pvhtf9fN3w1=Yӵ9t[4@ⅸ ީ̱; RZZӮKs-Lyƙ 5;i!1vb-C]E⍬óԅh;Fx84o*NRgW?]r`Mn vP,x|*z 0%/<#d=3ۦɑv+eazed(*?j[Ml.}m4Oo#o;gLoAksb◖_i?7(rakGVߵ[/yf$Uk>r `T&=7ӄLf;5[БmBGM'xெhŠxc#ڐ \|ʾ(V2߷^#lZ'DBvU0"; ?Ѭe`LX}N2L,whvJ_]?'"6 Qm1*ӊRϰ[ V"I8-}X%dX3\NWCtqޱ|7]4ŌM UF4hR&+<*<(QxĸbNCHƜ_qY]})p+y%*JX(IDxrt#If_|9+|Q<*YLi[汭6u*4:I}dE)q&J&3{ɸݜ-ƓBQm5+G ͷEʝ ST#.J{O&h WY<ư d}O'JD8W&S|EIczf6ĵB/d(;0WKLMn;\OFP]̀)Aem0[as4Óx51E-47F RٰMVa,NvK5v[Bq*b$+9(v1) | tۂqn|~C1:bKH[ad{YeFXx.Ύ~yVA! [VZuJ]-DPVty%E 8RCvg WZe']N I%]Z+p֯oimPXӨB (R!(ægY |֩=krRTs$ v#28d ?>I=-kvaLLwIv>'T%MM}s2xn] 5lw4oi3Y, =SI֗VG,Or/Z~o-R }nku*1μwOLHx֜i0.pKEk lO]B-Z0'.4%zz\H%_e!eN~e<7ȅ/+.̗`R O Eԉ?w6O Ck]@1& -jtj+Uz9ΉU75R3y.gb G)i);֢u(~]*ŋ#Z4U58!g Q|B\K;Kk6\8={|`$Ii8pp ^0v O`˧ņVBɀtG Fl(l%,+%glru@z#m-p!pNR4EL" >3 dv\"+K 9WK}ր [ }Q=NDbbOz"=9Sh)غ4MD p#܅x>HPpS7`GJYp#]Da      r~ P,MHɿtX$b,(:K 02ۻ0n^pY)n 2s'Bgm$as('hgD`؁]M!ވGG/#4MX7Y@=25޲Quz b)g2[t_wˆ[f98d $2uyC  havk7w2^lNOȪZSA@8"G_3z1LvyEK g,,la:˂$$E\롹x;?UlscW_H-sk CnZ,~:UԮ z$9v /ϮOUS$hsSQA<Ř)m vPbY.QE ʤAo$qeLptȎa#4M2 #vDK =~}=&RO&6Y\ZY+ׄ]~n/jE frէW%oo(AfP$,͇/Qz(i+໱<2q.,Kˆ9COu$˂$$E\롹x;?UlscW_H-sk CnZ,~:UԮ z$# n&mлI%3DrTʤAo$qeLptȎa#4M2 #vDK =~}=&ROiP KAO<* AN .4/jE frէW%oo(AfP$,h::w[ CBCpо3z5d=ߟ^&Twjp>%$=G̅ȖHOCΆdɊݡuXN6;R뱢-v#yHꗶ'd$r~G+tG۩f0vH[y= te> P('Jd+Cڂ>\?7A>AXy޷eaxkas_^0 yVP6ʗp'C(O_Pp#T'fǺPaC*#VB0FSHv߾v3=eٞk@dWs-lTx^bB.y"$ ,Kb<7o |h>2`Xy޷eaxkas_^0 yVP6 Os1Z#W!MǺPaC*#VB0FSHv߾v3=eٞkh][:wArO@.y"$ ,Kbm%8$cVwL&Vi^Zˁ"mګiVhFk=^2a_`hE`h&6 +o7JpύK{ $5$ߞ3<6ē'8ƜU4^oPQ6wKQ 4Wj޷MKk'XF^kx }USzs,! <iMw]Nr QTo~FB@G ~Vm7KSۃ>m%8$cVwL&Vi^Zˁ"mګiVhFk=^2a_`hE`h&6 +o7JpύA@$|g&nL`H f\ăЕ|&dK(y9A}w&<[f9ĖƠ;˔SQ:2Q=.ZkAi*`O$5HGIeںÇ֋>f0H/{ YMYEZϷT)] uB?'ikUi} p vɃ]@*.X!.hƣikQ;(fHn^*$jo0:f0H/{ YMYEZϷT)] uB?'ikUi} p vɃ]@*.X!.hƣikQ;(fHn^*$jo0:vUc Je_T1ul@"TN\r4]$7QRE H1nd Yȓш͒ZmH$ 0.V+QrFu0Id9B^L9@z`'`B]Qf'yi:y U{MF-K;@]8KӧwYxମX&hU@oEq vUc JeWUoV6mm~l a믗^Z@i-̳(dVu*SUS1(,KlS5*d_>0uhHI#)Qf6t 3&t 4RS`A")Kqbz\9WpS]4`w$`qLV#_.7|cc+ S@ =`n43=/C9zxZ4Zo_v]a'q#^%U?&`dV\)\"&;t='8T wiS\d1Rǜ*:ۚ)%*"%pEzCYZ0| 25|g|0#ꔱʀ\q>m+H.Qǩ,ڻdL?«qw6/ԝ:ߕ8 Mc+:u^\!ؤYmdC3H8U:E+JCu]_Xx1WfENYf ԓ!::C5 5^XWS- 'Kk8_ S\Ft9jk{v;*֪8`<He|&o9I:hOJ8ÂF6'6R^ 5qF)~Gz[}6H?3du䋲8KmzE"`ǭHѱ_VfI۱IuM^ݠWL5Y:]8N$8xls]Xs5\\X>.pQ68p¡^F %8hC*w <U620C۩dpA DKʞjV1E<8mE- vZsAKXm/6`KsIWYxz92AMH2͹ j=?B48n@ o.\^r3JCD0ox Mz p;|%G%ƣ b@7ONwLb8<_|63\LlX$%&ߪj)Vå5 ò K`'S$'zi %?(MTܳ$hR -o(W71VAtvCr7ԇD!!P01-=TiX+V|{=i4װ-簓x-0:Ж CU{2\R:SbsN=DjZ$@[F*[o`d ?]΀ ~g›`|)~ &2Ai&tl &5fsd}*\䪟o$#Wΐhw؊j/9@C,:^0yVAv+ iG MCOcV]d@.;5za\mtZeZhb`x` KYMnTSӗH\X.bR=/a[(s$m#2dV%.S )[o2yY>4&!lV(X$>Er[;i" øWPr@qӆc?s1V"-#~[| B"uf\7cv"_t3Z-._ [2a ô$n_Wbҫ?wx/QsnZ[gM^򍥙'wI ~g@@,vc%bRg(6d𺲼|C_- 't?qIiPA&vŇbp2U#Tvf;Q[!Y%b蠞ģ9ۚˬeM"Uv {W"f|Mx^j9 7)ϒR'Nv P`Z϶}!' Kլx)п7* $g\m>9^ $*I|a#.7w7G}uiqar/pV!, k"jX%H3NA0-bҩkV3:^qL"`8yˏ  \t<]HYf}Ù?߬tK ʅU:U;)2 Hgⱃ,f󨺉AGptp /R!%rp0=32qF /FyQCPCƫ? ]c_S6 .~sŧJ;S0P"8/Qh')EtaiuCVW#$r)>bWP/)_HM>W@+0DoK F>VdbY% 5yᅘ4J/_ꆪxC7,SzyCf/tA Q-f|_v$=Z?ObrH5+$B "<[{E^^p=:uY⌙ ᷷HJ6D" IT_pNffV썹1hi 8(?pj\Z:KʍoxqOa{MPq%EѦ{/k6\@QS/-+mHw/`K ˈ$Sj*2J} $+t3ӂ `~Y*;N%Hu:        pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/J2K_pixelrep_mismatch.dcm000066400000000000000000004164261515706620200274200ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI>1.2.392.200036.9123.100.11.15002200303521616157144551003340153UI1.2.840.10008.1.2.4.90UI1.2.276.0.7230010.3.0.3.5.4SHOFFIS_DCMTK_354 CSISO 2022 IR 13\ISO 2022 IR 87 CSORIGINAL\PRIMARY\AXIAL\NORMAL DA20191019TM 093829.09 UI(1.2.392.200036.9123.100.11.12.700006008UI1.2.840.10008.5.1.4.1.1.2UI>1.2.392.200036.9123.100.11.15002200303521616157144551003340153 DA20191019!DA20191019"DA20191019#DA201910190TM 093431.70 1TM 093820.48 2TM 093606.75 3TM 093829.98 PSH`CSCTpLOLOSTPNSH0LO>LOLv2 @LOPPN`PNpPNLOSupria UNHMC UNHMC - CT - ID UN1122820191019HDL10005Supria N 00020000ӂΕa@ ޺ ^޺ 194211150076F 2019101909360675 HFS A H +00032.4-022.0+035.0 0000012002305.0002.000000000B L RLAP7n>7n>05120011 001 0 1 0 1 1 0 0  Lv2 00000000000049000000000000040000000000020000000000072000-00340.0(d((dA 0001N I 4 x] I:\Data\11228\0000000000004900\000000000004\0007.cti  1 0000000000000 UNh 20191019093431702019101909382048 HEAD Lv2 2019101909360675.6255.008 49 +00032.35569-0.126001.2.392.200036.9123.100.11.150022003035216161571445272033398511.2.392.200036.9123.100.11.150022003035216161571445500033401461.2.392.200036.9123.100.11.15002200303521616157144551003340153000000000.000+0000155.00000000000000000000000000000000000000000F2019101909382998001.2.392.200036.9123.100.11.12.700006008.3.2019101909343170.1 6008 000000.00000000000.00000C 2 0186 +00019.0 +043.0007n>7n> @+0000019.000 @O 1.2.840.10008.5.1.4.1.1.2 700006000 0000 L 0  1 8B8D0 0000.00000.0 SERVER @ PN JXD191021006 LO JXD1910210060DA2TM@CSAS076Y DS0DS@LTLOCSHEADPDS5.00`DS120 DS220 LO 700006008  LO00050LO194 ADSBTMCTMFDSDS220  DS-22.0 0DS-340.0@CSCWPIS2000QIS230 RIS460 SH11QCSHFS UN SET WINDOWUN00UN UI>1.2.392.200036.9123.100.11.15002200303521616157144527203339851 UI>1.2.392.200036.9123.100.11.15002200303521616157144550003340146 SH4900 IS4 IS2 IS7 CSL\PF 2DS-110.2153\-98.1898\72.1446 7DS*1.0000\0.0000\0.0000\0.0000\0.9272\-0.3746 RUI<1.2.392.200036.9123.100.11.12.700006008.3.2019101909343170.1 @LO ADS32.3557 @LT(US(CS MONOCHROME2 (US(US(0DS 0.431\0.431 (US(US (US (US(PDS40\40\40(QDS 100\100\200 (RDS0 (SDS1 23LOOBOQ) d#Creator: JasPer Version 1.701.0R \@hppxppxppxppxppx  X(,["=m ff7b}H/+6ӟ-c'@o P ͈'_K_~M>PuhX\w̺/gy#AOlwȊOak mU$=?;?p{~JN05ϳ{Rcwwp¢:"59iاL{IY ֞=0l0-_V夕]ۏkuvTq%\qEbw=^9h`s%H^P|ONvK%z@ j(c_VGtWXFe X%p?M#$#ݣd̖k;qWdǠ3.2d=0w&wX?wu(3k|bg=-8?Mϓ*{z'>3Hr5nPΖ'/g)aekȯĜ09  c㼰>2nD@0I;ajĺ 3'm6PIzn^x>bO48]Ǐ3%7J/;eX<;!Dn4~g7=E2q@ғ-ʪ+5} (BƦ,`>TĊ<`81 fK΄O&?w ܍1ʙ+_Қa:R3<2`l?.HE}xaM f\oۛ~ *VUw݇ JW#+4Fz1T4<NK.z7@e޽V9vow 9TF7"Iɿ'v5!W]WK d{N;21[r1&79|rk'k)ʮ]sv?AzU=>w`wӬX$`A)^G1*،C~_hm+/z/(ue)S%WqP@ʷc%RR?R*C?kfoa7mO8CG^TLpGijs{(GM<5v X9؄⬖$2rlU>$8`m>8'\b ;kD6xЪwޠX*\+,:wޯ?->,t'.A}eЃ/'e>]Qp/=1Ɂ3) PiO(0OBGdt.MJ/2X]g#25{\B+L8{!`]6DMNUrXb\ 5$Ш٭W wZ60*zhC{8Ojf \i[jnc[?RG*J5yqv(h\䦑ri j,;4;Gu/=f"W$X3%h71w LϸD aT!Ha2Hû rŐi:l[0" y[ʪQ-yG]T~_IS`'27(fBDQU@ nP'HM_ | eJSx/D)u;e*G[0yJSW( 9`CXћSpsWnTNG&N6DjQ3WF^Y`%.zv-?]otؚQ8(!_|İѬQP ?Xg4O ?o\\5T‹dx`Le{ZIDG?5Piu :ꥄC𕡷Z?Z}B.l WwNF!^;=|^0_ <FvZIut3jNֹ\(A8eK_iھ8"pNk^8&]w̐ySf]gA1?"/$3'l{>5BS[ bS72f+94F3,ftuV!mF Cd)nnz5.h#4_H2,6}c-ۻQ&Xgɕ#B1v/a= +n*Ntm٤TY|Bu'юOj= 1p|tP ]+owڔG?^r]Ip Wʶ `#A@51@I<ϚEZ9jHq#]9uC SI&_jBxD2F$Jkcݲ" ,=9zѼJ=z4~sL U#7G<^Wq{!] ֗0O6_8A q72 E^(rzeƸ-2JVV1*_vCUf?}&b'7r#`enW:5Bn*q?h kQ^$W # >iNJGk>e}ue4FZp4w*4gr*n (9s$qCh(2 d.,[>:~ ZJGn2ޥO5"eZ>E#i%GcZW:үBndEJT"N}0$ *`+q:BiPيz'{6=Wܛd:2~| $k0l {]Iojĝ YNzJe.b@G<=@UAsyqtU`$B e o@;•1f̖iFL$#|^OxY\hn.,kK!n=L$6H1.9;G[-Xlf(}aDcSY'Lņ~+ ɨl9twjZ2"J~W:VP:9aj=7']S\w/W҉̨ y;l:ʧŘ7RXr QXIqe/-k >(Ts}C .~_EE؏Y'"1(ƽd6 -ECp^aa3/:t]'NRh[(6ʌKs~921 xFs6YQ(TgDz D=%G$ķ=MJ[ƞͺ=o{*IynC\b5Rir2W5riZ -)e&`36ǵTZ{0y/Y^ߙuQ NnP]3*pj+ȼ`^תXvZuL>mZ/2B~ 󠨥}P_o}uѸfF~?}NNTx@dQ6iKz886o NnTxoTJ8G^fY;5j|#t\*E jѝ *p>x;Ke޴ູ䀟jITQ+%__>%Lq@H2?=UO^e('*;b ξåibtj ,懁K1 Mx?w5׭y]p6TSma_%@?n4%pkzuV4mWm)L"Y>QaK~7FC=F0WuC-IYt+d3OJo:Ph^g梼m>*Mu+6Եh"y9/@Opu 8\z 3@U6'> %9]\grc:.)kK^x~5dbp{~))?*}~zLH=uxf8~^xw4hv`bc_` T%0$J' #cd ('}f8!^̫ QU]NrlbKJH\YYa py6o}mǻdlhk_v:wpR4L>PVo!da;XǍ.KViɇY#]g/tEwPN|V)L0" D\Xǀ?{Adlgnl --ݲ 6ѻ{Qܢ*ܙ'nȟ2㌩{*c\vJsfҼd @͕d;182Nl] VH ZCb+͊Mjڜֳ! sY<|p!)K~#x,}}p>Oԏlb#͸e11B*|6I1ϫ~R5$*Y^IeΜJp g/5O)V^WyiŻ3]&Z+i L\8uS ӼU9. q#*[lBQ҈VtS bjQSuob &mDwP s{A$3hCg}7R٩/gOAgQT,|peք(c[ p' ^܍Crvc̮,QFWY&$nhxօxTo/.E@lem\:^!f;% L`*|Ufnܗͭ6Fcq$2]FW3x/H eg9G-P} $Nh"/7Vg)*9=:CGq XuR)JK^Himeas%*l%L.]w;򨠙Oo3Q8DSoAPxAo:kP$^Ҏ-Eo_%^-w:PRR/`s6UW։Z};(5'=Pd歧*%50Z!, B$AYgG.qh{q)-RhʏDUOXj!fPy$M:>>}9 (;0a 4BG ,YV!.D&Y|E8X[Ov]\N2G*hoYqæ57O2*^ޚhuۊ=hr9ilVcЌ:;Yl^k/XW{uv$"ގ/ebX+0=fv)Dz'0B^vM\ER,YI3Qp\[F <~hf ~b!ǏCEXUw)RH䁀/yxfv:Ze_K5OV O)(v06́@#(v:$C:D|pGQHR2xY ~tT;b]*ҢJ .pK;P4y2}Qb;,\!.edc^}E/D##&,|> |GA~@4`xmK~19t(hP3N k2<blD}*/[c4kf9lL3jX0P.} ܓ➗o7Y/,d\Đ@k9S'[Y#l`'J[^](ʬM mE:iwvNTy(dSˎq|_i6)Cqнݣyސfػ/<"S@IZǘX'!d,`8NOTuSH.Qlf q4)Jy Lt7 Zvl\WkF;(6)Eu;HIrln*hK[}8LM[{>}=}+9hR1O&{A[Ck }S' ?Cmɹ"@w9GJը٣-.n A별gΕɕ9>Xm ^6(Zw@~ԫL>fOsYGؚ(h>.Iޫ)rˋQr@xZLӦyVPˑj[K+!lg1%&"`?6# |5| ~gH6zBfVD gII}A7QGJ Ǡ@hk',Y;˸{:\|϶|9~KAW],yL"ѻıҚK=zǕo{KdW_ |fLdN˫lLԊPa$Fv~ ¤=?'o_-Fw?{D a>=SSׇpHBϾ= *.? qS]b{2]qk8PL ~ةZ>OyPO)2bbBO^Yvc,}=5W4qc}0JGC˖%B]hT.;XDXA l13Q˻) x6 p=YI4>\ ^C/s"f܃![f%͜?emHrdc Z*D4lvjX٥):G{ȀpߐhШO*x7*N0Ɇףa7jg'EæOD{߳:$Jb¡o6$S`oos./a1\o)7~g"5Mv2&MjvWz ~eWHZթJE^Y:Wd^AG C^ rpoj.auTk\H%QÜf_pFh* LF/kq } 5|3wBUi 2.B2,rNr)K5`836GpD2ISBPxxh|t+C[Nwts͋a[Д3ޟSJNSA='`QHLmʗF5E&zD;R!P!C^eodDImpjb<%fxf0 :M0M+<6 ?CBCQ, 1 RRк.UtH<nv=?\'`ipͯ:X:Wik3n]q,ĥS|tc}p֬"i~@`t.MpCp^&@][AH6%1V& ;' z-@ǭm4bެyV7iܼt'I*Rs(6 TGu|֞8?9s >7ݵWBd1o>im`"1cܽ(/x4TI< AGAU^ZV` ^V<}DGQm2˲;pXnf]FQlQ2HKV -q(2miC}MˏaR89U @8A)"ԟB:P,4|, Tq{U6` Z_}ѼZ; 7,7NE )1d @ۗېA>5N\1hϔQgn,QʒlF3Tq~`{e֐YfskXH5$vxGt%?@\H |4SOJf?#Hx ,/U 5T}m&vftQ1P ݯH' Y /rm VlW)"!.<][dӫ"'8*ei<$H6i$gNao$KdK9r/gBZq6Y]|~K;3ჯ̿40{ӿ!!) 1XpQ[-[z&wRprxty=B|$! ghEvuoݓ^.j>XWkE{$[ ֗c@ŗ6,֯n('baetֽ#0$Oot<&ZoZځkMm8)qNjuuŭ\(q4Y#oMdUʧ̧V]{nX#3Y :PdZ5{lv[P@=)o,lA^ i`wBqDd!EN73hI==PӗpmGH9)K-C,/Q4{s.woG3^s X`A;=09Ժ7ܔdʟ4g@2v`Ӣu7_kC\f_2pЋ4 |VyD .=G>$EIdqa(3@] 0:Lj㿽1SMńXڅfs} f.4F~B ?RNΎT ; 7j}<4W#~I > XԴKuu73$8 ve*1X9E'&8@ aG~1ڪK[i[Zk+cSav:ɞ^)2 I"ٿ[e01wo7g3W 0."Qg}p ɎSRAoⶋ_b/=}xREgݨl@soe`Hj9D گ}>[C37ڎO4V$a|z!GYFʵsT  ʋOyʬ/_b((ϠY?Zx Z!><|yD'in<+C.q2Hށ Ζ ѽ1E#hz}eU:M#Վ 9ebk%p tq#>;x&8Ex_ 1;9"&$g/`և&"E9Љ|do zxc_ƒrVpXN"@Ky3F6׷Vu%w =x m E;:jVNr[,z!5 | kW5/-aN,Ĕ YEp-$|E`4?~N #' RaH@gV }mh|VwٿNa8I}*M)ydfABl[zUE_b+k1s ] }^e6`a'=~gTū~jBߍ^t Mgd/!FB F;=kMT[ ߟ!Ѕs5@nLyNgA K!״⇘ts;CJOUCI  Y҃Gށ/0-k鈛Q{DZk$s#~@;s1j0o}30L# ҀSQNuap>1(?@³&ݖYIJ@ [[sjJ] R3Hp m愘vARw|ChW Acyv}N'!2u=:$EQ?](@G`)Gk`Yh=i)ocTT%/b~W>86yY3%X: -/KkU|Wq`im-@lm1J"7!? g(V`+$jjt~dbH^ \<ЏP;κb O媐iHR1;ɓ!_&Q'RZe_TW֋0 ͠5yWa2S]uOIfȨ^zAj1b`sQ?'1 H]ӥe# mq2Jv6zQ V%șqE zg([+<}t :_ sm:v׾#OUZ񞨋F%( /aOh =:po6 @x`1;]'"9o pfYw7C@DLhQ@CYz8Q+MN'{9͸u ZWvv{K{XVktotA71d,WɧG{H;$dTNbv.~+dwunS~Ğe=YXYhfNv%Qqo] aujy-{R@C}9UciV)~'0FPAN h\s0!LC|`'VM;@rLy,F5Otb|JV$[.]UeNiDZ kI,J!]sN¦|=LQB7sЀs;uL6L8BLN]V( O`̟#"O6MJxDUSGk b&0(Cd;:^/oaܕh(!4>$EFf˚"NY0}l`Y({Jͅ{Lyk?ePTTL:=jsgʫ~64!ț08lN`v?]D^b#8h܄FXlMnn[2U'Qߗ PKf녁{w_~[ 0@1ENdCƝlrͪt_>(iA|&\2U2nw=Ln䀦*3z?qdZĒKSp]J} >eB0Czn 3ƝL~u{[ C% hm_U 3ߜteKT=4"*hn&R]ULm8Mu rg4J')+ui<1 0ngQskiV9s3&fDŽJ=L"楿:P,j RVoK۴R>`pH>aFf~pߧ\<{PP6jD7܋d\9 AH%A}ZeIpd}i}djO",; h7+_&(W9L F(tBAd%%M 8baBYϷ.̤N*U3mqȒۀע<.8ZN*Om zHux(p6~Q|6֘cEk񟔄aW37K0j|sGE4м t.)M+.dU%`Aq(1ۨ*ȕq)-î9=GFDS6Y!N^Á! rcBM67#I +hUPqP,ͦL<=ݷ:O-XyzNY fIMO Ѩ~cC+ٗGH繪lYցÜ~pdoѥG_B(e, q"f| [ێ쿀+}*Bp3zZ{3WGUѳ e"%`MHΉ>o՚L1m_(J#YFwRm8휱"=Xetr#. SoIx&]닙XP~F|3b ZWQ.k!3bZ EU #u1 7<&ڔ!0o7:!g߸zO95 ')NNaԲ|jvWz4wz=܃/?Enf5ѥ_P\h"uŷ_e!oǿaqDW] }sC²ں_[J[gwvz1 +*BxXMWT9P]KDJ c @CO끋j×ob-A%U~Ń#Fg=퀭jgA&/4oZQt0FF?vVT<.\#y} uɑ4S؋6˯4*~ei:*Hje2P/ f4'ڇ#'2rqhcsL(Ovy|h<оIwd; jbWK>6mYZc%0`wmeo|ʛEX 1guSX9qU oax<KR;b{tk}&B75y*n #YcW"N oUGO Į`|NO &)EYg ܇{(*|b3uaOu@՚Qc%2@coA昉~E0'j!=Q[k5Li$mv2yXl(/OƭAܯ7k]kl߮<ɥ4?Ԝ>A^8өj,I@"LgvhV qvك6;Ȫ68gC-Iɟ %3pEG뼗0r` 3s1}LO= Pn{Z.8!]zbxFGƻwրj'X蘭—r{HS~u*t_bq16pI [96ϥFWZ#J!_ y?gQg +psQ$~%9/\UXٻ9PiGzČyd )b"7O>LD6Dk=e #%AE _vXmmJeW>Zin@l'VB<1q qpNU˜[rm3Ze Q8:qw.+8"1(o:ϫj_TxMB#O[D{P^in\#;l$+k7B{L].ߊ1g墕\ (q-|NpfmEM!, 4JOafюb͚}I93%xrɍ}9Q" '4ph9h ,Ƴu$$dS$V%N#eQq6\5 0,,4&ipP 9VW`ig؎X_&bAꅵpMK 2M8v]҄:ch5tŧz"&!`VI}Wɞd=cS>d$m#'=$qmg$P1L"`?vU?Wvp]`x N;"TN^2+A/0&C g r߅0݇".d7_y}uW_YOk~`u`??V_ x?_sAv'L̷K2$tD@6!~oXrK1}&꟪ !LqR >y$zN#ȓE%.\g' #,a,5}.-ihiT S1I{r3;/ND2 0#-y? Pe鎬xFabyPzÒ1T'o3:V;ӄ&F)d}x_QJnm%,eLS:uDHQ:yZkݨ`ĝlb(mWcAZŵea/!R;jڧlccߞcx]N!N):eiTW&Wd<}t!~eCb%7턳7֙ݴghfe@$xzK,n!Hˮy#98,}x^8OzXItE/>)vk%r!ڊz}/=TS2ݚAAQ^.U=cT t=q0O RgyBa7)xϏc 0a*V7@r"djiRb1,;yɿdU2cp>.pm$zF>p8Vvs>NƀxK!vL| ޴sf5.ϩ @ ]^O&z(\GiQ{ϧYl-2;bX4g'kyr#6LG"@MQM^O -|4etS裚dǞpGk _xu|][Dj3VVZ jU,  wF(u>e.2a:0s=7&~H杛2/2q8Sd\C?#lu:1[vKuu; j>E﹯4졉=}ZDc1noRP w&:Mo6- r0̝im</)Nd"sVI/H~bai!*DzPhXF)e*k1k^V`(c$T f7Z2016zjೆKEޕB k14W-N|]|75-EĈR&aWF3L:~ՠ*. `dkkpX4=DV-1U'ߥj)<i'HN{9Cb %u*jH Naoh)Vd8ܥKߚAWиg/AGN!LYlCf\T7A܋u2_~D Pyg]@ţLyd [Ë.x-q#RC7geծ;4@= {=/h*!|JTb6[kӂT2.~E,bwF=6A1Sjl\%Z+je1ET|Zlzq8(ZB ̶5M.^KzElƢ'܆G9kom[K[ ,$BQ-!$Z= mNjK Mtv+~\_HVt8S%l~SkO*(rm̮ni1U /9d5e 3^a]'wY=|j?ܹ7eOCjѽOL4yZRb! #]GW_#~iˆ(]Z`a(~L(<ɡ)EZXKya>B'z1-UW<,;MգOvdivz]#" c9ۂS?Bi)LZ$h=6ӱQְ(hBzMNrywJXV@O 3%?a0Fo@gmWmt_A,yr:e6(d`m<..n:U?S56g"ObЃAoV0%l2ɾxHdfg #h?GamQT:P¯͵"RȂ@im9?s`LRrERR`K g5P9  `" `u HJI6K"ŋVEf˿]U]ID}6({0$0;%(R3W9e^_tj7U 0nlz4r@}BjB\Δrb5#38jKr~ FC7:us/J)i-Փs}I\fϊIpլ] 8z ב9 3wܿvkX st{ y 'MFpED:oզ+7DvnSRfcw[3n w=HEXЫgڇ&*xp,?k`5 :b.3W3-#,0ULU
H\%,@-`HJJn!\msu=g34X[Hk?;[1=s4tdj̞ޚ͛;$D8'gP~M y~i%rbrU 1dNaQb*;o>Mü؇p˰nCsn%$hLYr7bK|H%Բ',1mhL(墑ڋ~ӜC"?̃5IZ24>ߺOjk(b5=MZP+uWnd>z0ѥ|Kߐ 2\]y# pT?|IJ#}5r*KB]2^J%n\ wdOg*jJrhƻG+⻹S6ō?.тZE 00)`-j"'# ы UP$J oƋ,]jn.gz MD`FV0A.ih֍O6h| x4Bs zwthBqCr>6i TKϊ!Ȧ@Ad@5FSCK9#{QCȮПx˶+BԿA譬՝+V0Ζh?B>gn(0y}n.3P|EK3qh0{y ^w㕮}~4.&JGcQz?DXyp;'5͝;S z\?>8R$%vX" .!KpmD╹ ,^lr\lo)IoG{܇|||1j{LyAu5syycU͏Zä1Mݸ VQKD1v^!&V+iHŅ5 \:PifdbOU/KWsB~2 7e q寧 Dԡ+50>XPvh,bi^'0| nҩw|X7+GQ+-Pqv" 0f<;Q ݄ ޗbbx-aA ؟$ Ao&TM(6glj./Τix Eg^>y*'xKwU'nMXc>t,R qHD]8=@ԚR\# CԑW5GxBGۣX\U3\r}MYBDƄ[AQ/N Nsף6v"zt]t6qa;.r>[?=4]'|:, 2ᄇޱez+ea fUG}ʻ C6cPK*+G$1s D}܆otFzS@ ɾ Zf[º.lYbȜ|ܚ҈w71yMD { d-K'l}EPswP[ X2@q?UD?K tWOOt;A0`D\/_a>x-ť iVZ-)YŇÐpI}u:(v)uqzO1c\۴GNΥW]2D, *uގr5V1WB#Hcy?*?\^IӃs/K mvQp&0qYU>um oT6 yw0:qӎvCFԜ_KUNrJ'[X $h\\2Լ͵H["@yWnB+C`p)0rKx-^Wsц8VReKA : V (eI+ɺ/+[r+8 )nቬ͎73>>}xr F1SiEY/eS~ŀJBnZJ鑤,l|`Ш?FR]z*rZԉZsiM1g txyn.!]U;9[Ђe.0kxT<&f,UPY3;GX.plܩev?85nQE^FSg(wrO`e|q1иnstE|,晱H2p}eGeŢ_pm$VXws۪ɡd7e6I֟\h@IdGWY(/ 4h&N*J}~'%Q2t$7Xq133Æ ]I1 YĄb!wqǾU4^2/~ = }R*CEBd~XAŠZrO0ok߆l?͛ -WN'un;d:X1+7sZRH+gډ9;I1ͺ=u]#Ue˰kЇ@ojj*kwo׳s3 h17CgWT2ewCk댚QԴAJ+]$6 a&PrN'f6VEsJ;pC cs#M*նmm \StNTʝ}#<nb]j#//[[i~ z)?Ff68s82mh])oxPxwU~IM9@NF"zl^5T4(oYXsȲ/E aH'CgL'1Fm B09Uh>@+鍘fvTHQY]cV?[RQ/F`eo%Z|&Qy'K~11z0@00(}n>Rzy=7= M,BW1Epβk0rs@p8jK"097EЗ-.@eZ1dΊxpCh.4{={ydXt}onLb q_sQ SwlcΑEY=. Ad~8==jnw'σ2Y !J BWD&2.TC^5CN46g5NΉ4U{ז]7.]p\DKn$}^oC,xܕX\/JݯkVSMkMJ/!>E8x=Jn sTRL?x:?}l&Tu\hDĄNJzSKZ)cb#o?rjكx.j2߯XZ]~l%h%D45d/T2chMIx|3쎊4[J&?lS0.qt3: "UXD{z4;(qѵrG]{vR~cjxs+ q9.J|?>PyW|#'P͊ Y5SĄأF%nxK4U78+ZKYq䴱Po3*R5.,k!N#5y~Q]]Eu6OR^ G>+ !v ~Dm:ʀw|4dcHMpHOj? 3wQn/ǛQ%,I HȆp 0o-ϩ]lbUvPޭLČ&|'ͣh0\X:[mDkB%.,RV*pzu0҂AC)禂S‘*dGЖxum6i6~_'f;,alSdYK#P@-xYVg P䪩 \~=fɨ xP퍹P=VW9动{fAblwo?T|^G+Quv_ cB k4&̘;[ӗsa* -n)GKQޤ#UlJyVDzdXR1bѓ/EE>p!@'^0M;c4,|A-h2]I)h^J#Q!*הgP?Oܨ${w^XP sf jRP(yS P7i]w+@> " G$Bk=j:pl2wgmTO- VbRUʈ̫n(y-皚o}bISd;A{fRLd`<:,Fwt ڕboɩu´SOaʊޜ*rIqt@|ÓGHå vQ?Eoԣ~78N[)c] NnmzlG1Ua[+z΀g֍0UgvEPq};ȵb D ıQΛd%L餘GJğC;("o[8t-6|ė\bE9onˠ!m&i8W3E'đ2C¾A ~d7H63 Cd*mWy>+4c .NMgb+zHdйT1i_p1 gjk[fsSَM#'~ylHa2"alDV±C.ݮ TaOjY贰z&k4k,֠Fjbax9zd_FiѱːZk2< W~xq3S 2sD[tТ:߫[IXZZMh<}rLiF@3BMpkINXf=PcʶƗ2XJIB?F/ u7hrdٰ8"c qu` GRnhi &>˰q]BOp%0LlcuYgpwqIزR _m٦؎lE VLjhȆx)2? rN?z꾨/4 Ry8H*o6\-j[ZoZT{~A ; zEXdi;o#+.-^] U=w-䘀5blnJ^a0yjA5VݺGybEa lx 7 #෥gW{!:ۯ[%3G\#tUPGmQqSp]DFa,&4ڊ#g;+i^?b]6y\ Q,_b2FcΫ帪0 ٷ_E|[|WQC>.[?SrW|}8Rpa.!COnm5~ _f9l*|Rl`089e/.!0EfOI9Mhk~^җ}Da!]%.MmC ֜ŬX#$k!8^\9lt:EJUY;>#6 64#`Z/Kcg?Հ!-ԼLLvHʷKjden B# { v' _q05E]͘i(Y_O&ͨm\s/4µFZf |~t?DLhj'rs(q]m:`CPl[TE.Ef-:⢸;S"^4Yz͸L E浜:% Ю[twY :941J+D=ضd L $.ץ$5˰QQc>:h D܏e݋O >W``uKAk7Wyá/%amH̰,p9صiԞ\O*0poƑzv2Mwr&HG9{dzf16sUn@SebMglXZdt7}|D(Inzsx4a`m՟'F>s vM N lvfeX~`PWX0h,Zk }^" ^^8n4Lmc1 Ƭw/D'$Tؿž\)(9NCFD#L4Nj[W22&9`CA{\3U^3bw,C29 pbeĻ}*$SRdԴ-61w;')k'ZԚ=UPqnK$V(Ve[U9RGd:8b U2)=MDn7v|;JFHwi):nj\ e{O%/.BQ+TݿNM"Gm@OkF8]֐8ZNpC-tuG3aq+.q VXsBq_8 #jA]l@7A'oRoo`P#gMGX ۵GZ5l; QVyg˩0 ʲ3A4g ~^ ֓>QX.DhW<뙬TOً}%Z?,o@8`O<}IW0n:.v>&,q:A5?| ,޽A޷ T6yJ{!ù||R1NZ{G}dG't󄄓e}]0j{SUtW% ͨҽ&kw*L~^aa&AʍG;)wd"H9b;LAWsQ>gCD{ ;nBƾcMg#eɒ7kBvW $>lØ( ʂ: ,|#r2d`u䎦ErTLyqsWaRj81;&⺣s۔Y2?-Kh#$br% X]US,4r zovZ~ Ԡ<ۡv^O*K):gLlngJ'ǩϭT^$|5+ՈJZv"T!&2FT gGniŤ1M\GYHxm,N;s{q'Z"ʋb.K:j~h1 )-/ףM8P;'n;]ÈڇNMQc n~!25K27ZN9ԭT乤_Z|tJ$&R$) W<ʅ-zn)nLmP\ PH~Ġ$KʣJ6g4ԇ!# NPi)Z9G5LW.Q{4eN1[iO"wyD2{&R7C>B>XI4=Er&4CԌ0SSD:$W̪>!lUA^G}>R D oFNR[M;NAUpKG?^,oShg/d/ }c/O)^.04 Ė҅^<I[OG ݛ'̂d(BXus2!B:$FI:x3$;%9p9`@k(shħX# gQ -Vw栾xdV8/qMf,EMZ}Oij.r,]i*x8Nm*ϲR26ɍfgo6!9dB*y8!-f]Y[X4sGuVe'ˆ0r0NHa`j}xq'p%l)3$t݁k!P@A`elys~vRg6|]1v!2Im^lǧ:B蜗EI]+!OiG5/A]cӷծX"~Ybjļ,"T9G.t<فjVCFvEԎL,Q0ijy_~4!\GTmU.G0X>U*+ {%g^oEGS<c w9Fw_ؗN3U>evZ BL;cNby3N@Ҁ˂E#R ԃ׶$..O\ T?ى>Dh, uL~$kU# ЖIiv5ags(4uPd[% {u/  07,̷ u+farёR A! yg[`}o-8@}-BQ K~lfiVu;}uHw붔 ^E|0Af~s1S@a+ { %XnJ04B-tl4؟o*!o^.>i>`:-&^?ȥᮮ Bݼ/:P/\Ů&wD?'w~#Y"9|" }̠qS8^b9.dAr#&ӦRɧԙ4wn^pb#AY{cspk2Qu`=K*"aXSXLiU+`;ͶJx4Q쭅d Bǡ0 ~,l9e6ơ%"ߚM /Ts5G5FH='FjpƦˋ7^K|tX).q]7-rPVi[0rλCkp,H5@>O [lf|!ݵfVms?QGAum'XzxWz$:V3q了j8kGXz-_SOY}Sѕ=Pf831kbKP2{ Z1bb`u0ʤ_^b{V`37gdw5緾@jmka_Üt\Ocvۦ$sPѶc%U4BЕ:Ym Ӻ.dž<+H.C? iN)DE*s0U jwBkRNQ5/@\BZ @oiҀ(V4]u+g h 8/sҚ$xE g9- 7 c5wwjxbiT@p&4pZO3eIhX7nAX56YKjTs#|{QУŏ?FUMO-'F/^6눾3P:(f|"|- 3[J/t{ܬNTd_3P=K^K+q?Q9[ݜ Wx0 aL2pVb-b*sFS+kR|bD =@(7B00c<˯9n-6C0?T;-km#a+n9yi@ۂr;Xhȫ"#y9XU1}J B6 a a G p/X]oG`>>*4Lh& ܠ6\iaH^<[ _#ӚUsqZyTdXvP59C{ql^_pt m/mFԗӔ<Pe 2:Z ;^p.6%Z,5C~x;+^\I%~*ao7[LeV8ɯ̓64CSVte!RH+Th%0ŭwɋgG бw$xk;CX]`hFYia4-׉˿|XQQ!`-.♵ Uʤ&46"9&[ 98XWb 3 vHL>(ƣr˽ƫ5 Թ1AV`lDao tIXulP.Qxi-.Ib'ExSo7f 2{h/q!e wXa jU{w!ĩDTWE.(i.x!#XXDOr~㊶<Ǧr kdBhNJ!+=rќ#RYIRّ l e;d1W?p!,zDX tM=ZDƋ_re#%Ѧ܆G-K0=Z^#| ,=$2߆ir3 Q45y$?'BDxA+̉بz]MCP*ii^)@Yq!3C!3xԃSP9K \I(h&"E~ms3l'h\?+^ ߵf7 >A 5huXcD .0/\AD6L lȥthVK 9u LOo^ji"ŵhC!>.cKSW*-auWX!'[ htr[6^h<*0diynk` Qb܅96Gm_==M@o]fbGXecd *{1Bl.=Y?SVuZL>g#4a|s48oO݀9ϋXXUSr#F\1Z;z) IajQ[hpF H4=3صDuVڣPMi =QŘ`yT+?{p'Om82?Pr%bC^v&6q(w]>AShe~pP;bC\Y"!Y>/SyئvwW-?L:=qAE'|)41,*#"F#Wb۰4 *22{;, .D9S%]<βEH}L}sC"HZ'ݵ,<™Ci%2ng'*.8/c[_B((sK9İ۞NCCp>>,!"lK8ֽ^c|gdB ,tnRsf0*] شd ٩&xA Gb9mEQl=t{[ <#UxoU{LJ, θ|77+#unDj"yȔh 'ND \A*Ǒe/|"#2@hDTŭ,66] +H;e!bQE$s5399`$N:lާ59'$o;ѭj8c$ޙ!?Y-^KВ'L޼csW:+_ˡU/n z]rHK,Cm< ,%_ćW^S0ެɅuٟ8u;ZzŦg<{ `&ad7unR6s όկ-a0޷e~M]ew=HD,m^1Z `YV<GD"fy.:QUf%Q_Td%)tZ!Mpʼn1auZ=611A'lXE&%6rxqLNB~ Nd&=@2ʋ%#% @BQ!6}qFU'c!O:Xx6U>6:4^bSw|Ẃ4 `vB6?xs'U2VjZS 5>MLa[@/*)DX(ͨ$S-~3nb_'ڱ[nAXWԉ?ayAГ8Bں_?qK6o쒨a`YaU6yZЄm5 j5Z Vy&_ 6PcŪ!VIBRY ,(+$LԲ,l\ % T$Gyie1 KѨ2p0p}Ã2,^du$9ni2Bױ ]擾gOlkP> m?޸g`4±#ЉP## <5R_UKa*hno貞z#@`6cH-.2Ȍule*ː9|P.; J2^SR<s\p$sCk7VmGo_%`Fn+ذFa?зyw8NjE?𞚅Y KK sg`'ބ{H\ۅ_ir!db n}Zod.L}U[ӌ5UnΡ-ZuT3"p=ӢPT(*c .tBrh181 9!28GsUizztC/݇'7ɱz붫[h{p10ɂj2pXÃ\bːVGzaL}1cX7‡5Zˍxi ;]Ei^p ehX1.WW9Vu~(5 Fw<«GxdBua V7x 5 ΰ$sP7ڼ}4(|` )nL#։Jikj'>_tBͅ'A'K*19dRNϹ (,#FKԥ#m>= OC=lAa KXg'dr}>6Rgé #t:b1pR( qV.Jw]#3ue'3նϔlKWR':פNˤʩ߁Ǚ8 QWm" 5IS>8=dE(Z+)\^:18F37{#*̕8;9C,$.Clx AZy}kx3ǙxQmv%|b2 KQ^ Ow Lܕ V#ъ? yLE܋!@3l9MzV *UPijAG 31 FL7>)ě|y^kN5| L (P;n|Awm0,4ABM^(wPVG4e܁&gBaSsEeCB}Vyj4W'-ܣ6DXV0 L"O9=|+b3Z3,%P\5Fqf/  p-5zUhI<09doTz-ӥ .U!R8gRF_@rm \I7Y)|bq{=\xYf(Lic\Ge#+EgP+`VN'nЉ_`N #jl?xdH1YM[d*aE[p],cnFd+V$N'bBVS enzso`GLޞ#fؾtLZ6DeB[*>dɟ8a2Vw|ϝPlz[g}~VmWEsANF]8# ?H9੐m^5ۥ}n{Co!c՛ i~t'_ a =GAּ]Y6\ n˪V tw,#zg ;' Kyْj!̻OsB:TUHօ.H%,28f}6g͍$x tZJ>+SeD夏P>hxN;8ϟc[ JDڝ朕&s&x7?m{/pTPjq_/uH-J6MкͣgJ~] R|P!r9~+RUI(ƧE#"L9ovvHsA1˗JD}FQN<*Ӆ^)"?;P5ޥ]h$T{'L1B5D}J,ΏmdU dhzrf%E:BˢfKt3"t 1 { 8@lQi%WB皑vo+ %<ߛ-\a,ig TKTšSc*>.DF]D`(0,|*nhĂ f?QZ+(/thZ;gʡjU+ӅmHb\e Rvƽ$IYWOeI,xBT"iΓ7;Xͷ@z\_2v:3>Ebn[/ygep)\DB'֟GG$ND{)g7{%0ooU8a~٥=2YQPnuQ6r{9-!9\ނ0 w+=T`׎hD X5#_^ ZdF\NBRVA5DlamO.Jۋ28KFrңtٷ_VEԡlA&4(2.B)k!c !$nOfSp6k޿C%Rx!X Po_Z8ߊ#?C;LV%&X8cvbpWOk#K s9q!f;pwT#J6f\l“,(mF|݌h .Lqw*!ؒi7R@/2J?Pv,k&#zl:R'2Ihbh!̶fKKk"$sH,\scΚ9Sq%PDz(ӘOO'` yjCi {8xȚ䛧0_`Ba7x͠ 7ޖH r9;e]TS?fyU*^7LEǏЦ2*ƤbgtV/U3.ސ$;=fWƱ,6RDCxϙ$%^V2>bx1/ls!n=ކ M}Cቀeh6b RH%ӊ]exyvQ#z}Y0i]1\*$gyURz m!ЯhLgn3li{y֭1db!LjeG-v:2{ 惏-Nq^M pSս#)n^|û5OӲJ1gzwzb#F3'Ob^x{ضr)QR`{YUi!-+^ W{MN\If, gp=t _+ITbh'gI2`K$BWI|7;x* N-U}jc䵶k?}0@! }=FLJBV>űޖƄ"^1;ϡQ=UЉz`W_!3][n }z3ؐWu%\ U4|-4'm,Ӷc-4os;vZ3۹<^R̯ݔX6b=6{P?6mOռ#l={7yv.Oxb+3+9Sؕ Eg6#|&Q}ZRBBjvmK"!{Q*?'l6B)-@\YA.Ii)%\0ik僕4# ܊N Lv yXNwҿi=KY25| &w̙9aȥxQ6ENdN Kb h a؃&5v&P~^]pa= [[pؕc(`EBlAW=g65+><)ZJ#FMwßƺBשf4k+*wsgh&f*vI.T&,Ui:5SZ#-|o]/ ˶w\ĆWm薓S,MLX`.v_Nf7j;c}w\m,TL ?K$OKVӋ9m#eUߊPʃ׀v_!d{ $Dg&ޖMsЀt9衲cfu}YtPsfٶl3A-*=H.⭧r*;Z=s[] PD ~Bmڔ} =욊|aV"$΂Ǟ]^Mv ǹNJ-s>E:{EE;,6 CF`wNj6$8w-!6]baU!2Igp\~&aP݁c52N86/z875@^߾VC [T+Ƈ+*qA,ފg> ~k!d$̜]'fG nt}|ꡐؖ@0OGNUfJ7z_UCqh >2- 08 p*nj=O#p$c.i)kQ'Q74;\Q0J%a-`45"V'tJDX o<[z+rۏnAT1)襄=^yy+ЙN0oTsxi;ŠIXj4a Ex&xl/. f=dHZşCq 'ezBG}Ly*.b"Zηpɷy޾ZL'SdWs{U2 .;JBRН|ﶵY1ʥta Od vjoEԀ*viۯ/ x"5sb'sW A/؉gJҬw **Mq? l#JŖt1jb{ARrhp"u8U*sxē}*Χl? ;E5e ;4kRY`c[t{OWh;,Ы>?)+ B:.Ǣ+QOĠZDuT\4/X (i0b4YK,Z;1~p.l۪x,ƒ5m+/w]pOw,j+>|z@Rlo]FqX௒.dI%s}[i(̍~F(1\8O}jY67 D7ҵ?uLk(, W4*U"UE1"!;9DU l}v SԀ.#ݸ;Ze*i  tلe E]Uyj1U;;Oɩe7Ցl#m@oC'(LpnzW9SxAO QpXʰ RZ)tSm]L5I j\CNgZ$mzyi|=^AWA[y\B<9Ɖj՟4?Zr/([E_.#E]a Uh9'SW~fFq]LJP#I2u׋|Qh^NG eA 8p#RVuS&B]|Rq+mAڞ\= {C~rH>D;Pdݍ/q!7GLoQȕG%Ȓ4)} d*Ԗj"81lZǨoSZvixꮟ7`otl庯-d@ BrƠa6S6D:5tk$O؊z]Zcjki0'F޺r]yfN"r]rG];oW O6LY8wx+%HoTTeȴi]*O e%l:#ױ!K?gYCtORWI dlmy<+)7P?eR3SrGvkw*t2L̴㿞ZlP˛,O9:IB)fu6-@tt\zaWw^_.Ѧ킭dآvɭ wdm 4Zj=:0K<<ײY-.wНMiȝr>2|:O.h`|w7mި|=)p9}KV_#ilw%&n*L]rlGn #Nο A^`l.FƘ|'+|G㹩z/g5-7p!ⴴ ˉ 8R0@ZR v@$Dk| Nj+]i"|eC# Q>:n@C[+4]`K ]ĈD7 ⚅ 'Y$ccp)lrԠ=*gD OŇ,_aRickdp&ӁnT/w0rN9*3 \Km bڭrt pbi+˥  E =S i)P &~xeF#s"&BkjIR Ie HT<4u jS.&*:\@C"G{eNEQGq=ϊ?#NVfLi9cXPSrV3Mp%=et|$nѷCLEi5},0oHkzO$ +J|Z9 i*6C7`#ĞK7Q<(}=m4Էdeު9Q$fOZpZ`pAd1ُݞ/N]6{GBo,wO͸ qR]̼1EE!' -2 ?PVy#1TOv-CrL{ E)J@I$<+^kCKYϼc "[Qq1{^_oc3c +bN"w8gSi5.?[IxbQt}rLQ-agžɻ;9oz6n BxD<ۯ+-UI$-*Wdk0Ǔ)qdp̛I0әi8;~ =ӭAA o7=;f`S;afHwe*1ډ:FrgxV-1no+\^"X'qI)fqK7`,KNjFCA;56MAo<8q֛1>PKaSpUL3HPs g0v-״L+ԝjMDOa7wAA(zoPCI٨n0 )c(f4)ノ*(.C` 1%4!~'k'mIziXt>GxHV[z}~~|xs޳8&Ir-_ԨC1eomd#\M۱68&tE.4*n{; oENQ# ~K+񨊩="Cu5zJ:\4dq=/V~VnTv d=Pp拨V\pߨ`ĩzy>2׿!̷8XzLN$fbHZxO-Z)n)_ݛWrCh;|7 bUEjIUI"c73jU&kw>/T#5/>j4S-/7x 1|>_:s.:c|^jy|Q X~=aYYtJUZѽYH,'yT[(,ZMoJ;E\M3NմS:F+Ԏk0l,Xnv&^0o&|1jUV"{sנfvcH]5e>&p,LQ6i#rL^FhOW ;7/ߠ!Lm7aCh> yTm;/TW:b=ȏ"3.O.{5/% N'T`3b4e;2b-IjNc3+fH"j$mC6̄ؤml oj&c>ZXn`Qi1fO.'V EpN{zI4)$)x"LSdUNw+~9AS\XZ)Y-]R̓$Z{\zǁ9_u G{KA&0xTd;jvegE|`Л`6=~"$lzkWxOiM5^ wrlH^'Eͧf]DǁK dW3sD+v~3hƦoxs3TG-F2[nqxuxm VQFf<z–wzb y Mp>ATېN a@Sqs%C|8V a_H9'E˞4[P/rB ֒(2Yf\b/wd~j>@cLJ-3w@<جAs. =Pיw,tОkb:DtWJys(UiCBƀ#${!0WJbe^\֧rڷzIL @>exu8Gݽ0٨!UJ'᪄Tf01]iǻ֢/Uocd@p /i~T.ˑ W_!^W.] ck'>l榮6(Nq]<Ն{Ρ6sll% }:~Wi)mR̪ QNKq%ZCpQȯR&<L*zel[a(/$7ixʬR:W!tᏐ.jU ߨDo15'ܑY!Cb;HUM6ʏsLi\>$Җ/߄.2d+ǩy면n ((ÑaIiSs@#|T \z6ͼje`dw˫uwq;G` g ƍ^uٖ>v㎷)<`$Y֬)MQ;G؋ȒpwI{h5FopDV(pC^ZM|x( 7$EKY^4j 7٦]Ӌ!diSܛ\'vV+"cLqH$[^k#}gL_C_tH`.q"TD;ة 6AkgYwU5($Hvw&qr/zJKQe-Z٨F=}CP*z 10Q.-%qeeӡCSirs"wWđN`+4GkD&X. A=]u5Vf]>.MH5ǐhʐS t@ *h- Qn> q/zh?` (U{ev"g۷B!‚`c3i PAUT Î Zx~ yKi|S(<7f ٴZb|󑝅ʟfS ೙uy7-b2^ec*em 1OFX\Qoa z A F_Ӥ&]VtkD$tse^Ӎ _bQu$"p.V +MW Aco&'GZ]rC 1⨣ufhhVMWwB\ Wzä0F f}t":op~q){\wh"})gTH/[|Mu۬[ŏwx@eK{'[_c.h(xcf|K` }:w= lR5֢\G@k}9g:>XEEmtV  *Zج)PL|SHe۶5.(,! d]I?6ѺW]<_5q03BC` @&һzeEgب2=+P}خ {-eUmfDW"c/1, 6+4 |:Xxt嚜6LT |[x78@l1.$Lŝ Y| GNc9[k0vn@QO2}^TWl/#|c,'Z?~Cz" /!qdiaF hF; vC d煀ziyjc(Clg/̽~ QB\kfbf:/I%K!s>P͓ȹ8PcJf<!W;87dx BrWu~Ɯʢu~md@;p]A[&\2,' V]3{x[Í1U޲ Zp)@»ca؏yӄb,yt-Lr\jЗƞh]2رcOgʗ=1 rᄸUkR\Χ9~D蹨 rǷ*Vh$ù#h'bf؛ #?bz 7ӣ= O`-y:6JUtz1@^@pƓZ4IAS,o ٹ+R(@گd`1bבt5pĚoUtW_Wdx $p+0 KRhNz\b_ÊhLiC_Ե&Ag'J$b:P,?Rq2!;h*dWN9RRW 6m Va:1oTKpp!wKg%'h }y?e1f^!J!N9iӇΓև3ЇV-Y3CPD)ZK4 OԯOsƬW0tH 69j;:[Hʯ1mXl]=)`˒ϕ]$28OqĖ  MS}j$&~pG5J".3Vr$W{%p&` /.<o6Ԇ[F8I4D2!%$'2djp>U:tK繧\3r"CE+\= T> W `:qcQ@ƷK ŎO\Y:%pYQh붆Pת"w 08e<5 nuKX7 ite 5pW"v8Еr繓^cdl]Cgk?.G@Nzt'Y‡!_I[Jd^@=!)RGj[h.g=y qmݰaB>,v[{Dqg;//yBcb7H@F\RO-9҂ʮk1\) ْK!mGIc33 c} F05=Rbl]ԁ?(Vx^j}koҕH!zm CfJ s6guP_^y1R"{7WR>TAoQ~B0Gu Q+yȦ OYJ6Cɲm~-Ymy#DA!TWr[fxv,:ۊP CGE$Zl1]-!)͝NE5̞*#QM.Ԉv/*b/CNA[;:7^Up@ʎ3H,:N?.dBHhl*uWbkryq,js}F%/}vfb+VxU_䠵5 (r )\/x`Z#^tTT87[C#bYc,Mb/غ7o 6/2!ͲVTP37B! )g9K(i&i$2M<*P=*謨5%r{J GLXA6c mYs%ԭF!-0G[# d;ܭtm71uA ;=$o][u~asD=˾(V2WsITP~PlbfINmo4wiW$asAM`HDJ6KfRtBKx1g\׆>BV;zԴDg ]8id%flV(dII)IvS ].)n@I1甐H>Gz, |Z`d Wk)#Ղjy8]t[&\& ^ 3$(P ]_b OK fk=3bѐayxˋP!)rUӤҶfRp\Q'u;мW ~F b/;qH&_ӓҺmdHW'W&8!OCU$M0" }mXZ+UW|ILP(Hc3Dx%әeeH4gnC%@bZ=,;P(1n a+W q9\ˎ7qj#bUt>Cx0_?#=VE+N+SlpZB#` 5U)x]Xt^+t9:$ۯ\kUѦ+K!#hZDf?1]]DެCr6jb ,rѩz$=Oo`w0w6rr d(.TCz'Ohj5.ߪ(`ݯ=))w[{㨮G+俶MR.c]kt6Ee'Z,s+{kp{m>Č=Ϸ/rʢi k/@kݝ 'l9io?aǤ7 :vQu>m:FlUSnFW2t!iAԴԣTE~{}V9 Cd ©,BU,O Q|5xC?gRJE]M+;{xڅN=iR9r&USKgayac0/LB/ЧN,ȫk5OFqλ(ƉhZSCCpC*BA>+aY+UpWt8Epʹ]v#czA&-++'s?Vp:"6 ~]UF V0/j3 ] IFNjvt-m~obH+gPPOIwg+}oIG`[D~0~߽aQQhQ):?vȠorMgR:Gؽ~3BNę*pQzeA4(K*C=a͛uy{ov42u2Ib<\喔!PR++ au8sV$1[JDR=Nb/ƳS+t QŢTϏn۝_SLx$ץpt\F q,Q!X>T1ea|i ΝB*wSd ;W0}IM6 ~(!NEˆ$gM/s +6 >\ĭA+w~Cp Fr5da38 2`uB!hai[qNnL^8 A>lf,UQ1x>-3-RR=S3Țy>ȞN (z♍>z]eJd9G2HIÄSݾ:~!dF9AF"F^7aƣ2 ̌?-oUEE ܗOArDhmd,*S{ǣ!dkU ^u7^9GS^m(ĚG>]{=\cX[M5a*E[@W2/i&`˥ZWGa `ljqV[@e z5]-(ҙ,c([^Vu9N?dS"oXotu *0{>zB@X@|S6O`!DWrM(~wV=Fn۸ZNK%\:GZl_wE[t)b2#'%+'Xeb&ѷ8,1&5%.C']To/$IbksV=hR\ZLЪ/j; /oJHt/j&͟ ,O~ɨc?>#]z<;hC_E .%ҳ 69AL[QIQ-\dv1܂Y Sp=۪m/(+|YrK.a٧$j?&FOoWM14ٖx\Ӈɼ`&}".5C;j3Rqܝ=$Cހ5-yo38<:;X$|gz( ێ`)@KnL8} +eZpQVOL-WNیY%DbS@hH%m VznG lE”ߒ9)f  .ywXFDZns )0y̶w&SSQܛ;sfrx7$l{8͹h._ΖL#t kNrrJ$Y{1V6P/6h脛zq#К"w #&&Dzl}%R|h2ɧv1~69h]Ћ{f]w*"$3(\ѴjQƘT{H"|E-5!^d 5Mycb2;Wȃ؀"_唞_$!; KYUgՈGi̗8iN< Ğ22Y:c hH'V&W5Z̳UE[@KmdEXSUK 8RI2P@Iłt)=ʺ[4xHK+SK$OX.==rhF䀃4i|(>K r;QD'`<"[+t<,3_-js*,zmCF=fff6"dKxsJEi[^uHAWnT|i?y:7cL] #:0?DxsF b]L]Aa d#1ӝÃ{tzM*WNU`uZP??,[PU >lK ;2a=jKIQXyJ2<VDz`SX=ĮUiwcgygr֨?DO -pmY?[X[0Krd`S#VGM`úQJ]6[nm/NXa}]6hy=9~?n 6J3zrHYeQ>t9J8!S"dKsʨД,;*pLo~Itm+3i({c4u4>]qy 3D﹊MSiF}]W'zn]Q/d[wEӰ 2cZ֘]CPInuU#,]"BgphdM'֭I̓K"L* L+&۞%UGDd+Ldh)K#*(16eF1"t.R EA!'i&Esם M̓ 'joV=bg£2]ȇKǪ˄+<1$0ـ *|.6IAY uċ\9}=`$8>w~-*HJx-8%i;33iMK\'COnUΈ(P}q1Q(f7%p7Vĉ=ҟљ0eca \ XßhIȕ [SJdz,ǧ˦Yyz΋j >{Oh/!/1?1|%nFA$Q 6Gt>݈E}An-30rw,P^3/X̛'t- -NשEr?CԱRXX1_wlUk7l+qDxr}jӲWhOwIhLI ѱ}( P7s+gQ[13[Ve|f^}>q9#LvFs8^={Y=oʨ}ǎ4+%8/JF3OG5:-+*7mnj;󷢊_+Pwfƺ_{N&6!WGH'uoF@E?p)FVujQ/qF6优aKtŝSӪ:3IV$. /|uGV*ݝJVjq"p0sn8gW!,"mX2A2s60I[CLa)ѪaXe?۪~|?ʙxR<3}kVH Lu<7@VKeqHovۛE>W KVUhr$\a9š6Z)PGDWoE0(%D2jN)'_ϵ;F.0 |0b.vyj[" XzmbJRWs]R#Q&raR!Ꮛe)6(L'O) ֆMi߁fFybATv :j ; _R%`A@ Hz3xꖧn֯0BU6Lb04.pTLwi@*]ƐD`4@|tP\ɾ˩ &\&6G\-H10;bl|21oAuctAN%k*P?t)-ӻs-z)咃'rgijد+PMhf{Bjb#'0}oȖG}G鿃" pZy U6$[߆i[$3]1uͥ*G\q_JXG~]&(]ʝ &+ T$(|\8sI`T%r3ɠi>-]I \u^PVM݊a[5g@2 /}dS@ t W#!Ɔ~%2]U ko a?Gb%zXw:8N *]^}y ol]>j]3fBy;qW/% 'wt-cUKgA[}1hi 5 >p>a7\zAA@0$:uG4A_Z14q-s1feۆ@"wF|v)9*@j٧4[F9 /R &.݄V(>7$OA@햺S~#号V}ZxPӼ>Ƒ0M9}zg? ێ|QeJ"vdڄaN[c3N~\b|;rr#JrjS$=Ҝ(}C'sYԗd|s;Q2N>t!ڏ@Z̳M?T\x & SFR"c,R%D_]¦n`E6Pwv^fFVzsv4[\ ZgĆHX!W=i-b̰i˗0m~ZDD8N̤L`Z`E(@qX~<{n GSxgp`C^ %TNg?`N eZ;[)7$(+2xt sIXam ԕRam A\c )i/Bs6 '^vv+dZ'4&a):HAs76u+wl3nAЭ{=RM"^gձƚQ5޻&ܐCQ!3_40Y%]rPk*xHhNb!po>}~'%m] urTK(]v'6{5ɝ,%Zӹ ןײza3 w>Km K0~$|ؓe#>1luB.] e^QzH ԣX'F=UV̍yW,X~p?(NtRpp[Nb< U @UjC-O"FXwtff[tX3 =.i =|laqH|шB>FQ ӝBoh)*[InG4d ےDT5HE7إi7!NLLE4%jzGEEr6)em[ LmVI. mZ" z䗘` }pBj.LE:+ kIrk#%LʕQr <3IdH^ BOps$pNzdcD^^Z_:k6~eO{[ˑcT)!C:! mo4[A1YN@%A"Zlmv! Eg FNtWk`115e}1`tPeGA45fvFS|&ĝOV8Yv[RB[$BQN;IsF:X"_˦dQُnEm.vghy2Jv1Z)r80G})?8N%Ӥ(|@Ͷ,Dy>O#bOhf`{&VOLOGN@"4S O1tYcM&XDY1wUŲ=^!LZpz.ǮXMPA%%/C kt;zIouaG!w>΍Od :: [aRhT Ial/d8nw@ 31+tDb&e KSz֘.-L +hJ.eY-mEo R6fX0Ɏ+8ґ6W+Dzs\m}7*,H37?K ̻CQo;|Fs\'rC 0f376+"{)U-1֫%H~"GVyxc;tS~+(֭m&Iۋgvmט{!FS ]>~/4EnswKkJ)Xz`eE2'_CDpFe<²Ε"r-̟$Ad8 zi@F8Doa{&Þ+j'jRW9^i2>hrQQdQbpd HrXKt#G UXb:ӗ0'Ux&6ןo(6 -v}jDKvTE*p! <E-ONݽkvJk:/,_i86tT @>]H,t*Fm6#ylV|EAqz[P=_-)0fX)`M!b~OjbY~^HB~|#AJxE=$ɮ&s)kF2E0$}p1Jw %Eeo){͗M}"yY w[Qf2[.*-> 6.ǜRf+pOP[|kʃ'iMa9}GHNtn&kLjTQ-5ɕ7gz0ƙ1wbʓ`Yؽ "f{r%Hp:yں6Kf֚RkLE5Ovb(K8f.Qd kv~2`x<ȷ/mD$2 -ǓL6RX f\펻6`@;845CYO{ľt&_5Br\,I}hU>6R=)Hz`22`urd+Y<5vȷbLKel 79O x@.W.7 }Sx N}WB(/^UM$uс)gLgsM RM5h`w~x'AnTr *Kَ@3t(9/[ƣ/eq]B#5-fUV< Y6w!S^dyݑW]8Q~,;5 Vos wG …Kn5y01{ E<۵Tۖ^YoW˜cYmXמ%R{Q\ah#[ԂOkuUꄧ:Heשnkj; ̯h|"Vq{\{J\\ cYpaDPA!$lnRb.e.K>5T @Ay@A}zL@ƌA&ůfO8eMGb)Ql`W߶?{Db[tUxrɛ:H=]Tߞ9m@Z]Fp(s!l$w1ª'y…Z.5 o6mΨT=tw߽. ?&Nv\SrcrzBBF &q1>'9a Im+roB]о7}'QgpE@$ ~+&@&y梿 ?Β*5P-~$\o}rѪ$e?՜8jr.E(ݢ6FHأkUOT/J=BKa(>ɃuuUz=@el5[FO鵶: uai. !FV viO5R>$\Bɐ*y$i4K:%}zXg*,kfH q :CTKܰ6S| GŊ[dte-!8(N TH*p".\\XJ~J 1`@ ?W);g,jzA6C\m'R58#z3MU`I!NJ2eTB%j|dZ>o^{ h̔ӡN0Vj˜ʫ qE -Y3mpdNj>&igҌ-cCXr+0A՘FŒG]O\{)xR~M/j`הKXA{bAp~K>ĒoN7#r5:DOʑK?bѰ&vnSh0zV/'ri^ K`M,UjMVfQa#׿|7fXx%YCd\L'䕕ME i72m2'Nx"0@Զ0hvNCw#őnh8V#مuIf^}_oƯqGt;  9|$Ѕ.x_uxΌO1Q "vu),CHkIzQ܃hZ|!,ZPY4hψ7(MщMpX?kg"a0q i:dw&u"w>)?+E6aWSMf{N!"vA~?kCͺi 9Mb;$E!C %llzB[V峥w9(m+ Og]v'MB!Bj];]0H(-l3'?.PliMj/y3U1h-oihL|NtlB[B@&v }fcMJx}.p7NL)B,ot9Ի1i/M&"}T)kJPOFh3|-oX=-zue8a*0;ȟwp]7!~T(V/_|sJ!bB/!K"mBrdU@1E|b % NpdU5wA &BDH̻5J?I't&4 TއRazdAfdN J":uB|(tAwpa^5CV6@<̔~7q堒 V;*WbgH&Cj\2T_ڱW-︦]Pu?s=D=ݑ:_ki:To "evKG|դJ #rneC9v+Z&@R/i{n!^>k}N1trx]EmÚ 7;Za_(Aœ~{K {{wt{^iq?׫Ui{"Vn~jS';h Oo*6uoOambG'Lh c {5}I`ö4we>n=dN1Sx)ec`M.;Nj1S]Qs'!rE$UT2jaw7LM e QwC15NKLk'X `{[HVi&۶!9UR9؄ kʿfg3_ G P+ԻҪMx/歨$dXMݢg"泶R\=GcU`d7$ot-.Ŗ딽 E~Gq+'9yZٓCBMBziGzN)/j}^xqQ#Fa#̇Z0ZXB ]rJOtR0ޞLE`}c3wmJ 4^oһ9lXbf -Rj!9㕻p؂38E~  NA*;nHSL%$n #5XO[ KR6g\EXmYLǠH߉:lðSX:*Hdaғ]K2taciQۤ|,";-`],(z <cW@ӎcZwߗL; `Ӻ5bd.ԐB'j [)QոsHpZ5~oɇFGU[_%vx|<%n"Lx0ۍ$ *kL=+M8 %{Rb/i(N5>aEed>>! 3.' tF;\Zө$}g~Bh(im֟)S,p[[ nWU&9Dmk28{ d'v6x$;~(Z͆b |Tu?'F/(x'P "Y:J EfLU[Ɋf1T fzn-ISUE2V Kf֕$y0O?: =k\}h2LԸp״<ܛ&G\#2' Z&c2I=3r +J@T5;Z]uQxXp!h iՌs_s>7|tgS:ZǍG5Uf#g[)}ܵtƐ;{n$b0gg{F6.75LI>\_I>5A$q@ v̠J*ueVaP3R~3u&9jء\: )/Ϝ&ˎ]L#L(G*~jq&2?:I ;RvFyXŕ 5bp2)5M[=R4D 5}sY'鬗z:a.RrűtиfALI״mX@ #ގ+K P1hFYNDΫFbR9N YLg~y^3DMPPaF ,<0;Rd*΃!\B}#z< V*Ű?5p "֎0k fziM`k9 dͪ[]b!j+2l}<{^6 [/4*~0'l6OzSjw2fxXsS nP3ouaO.x>+vvyhSL0|Sk eEv#B5̛0?/W9a_)L^!RE$/i!;}f(h螲Ih_w['; \pD{8{VjoE'9N`/YLyeϐD'XH2,3,Dpz2& BucrqQGi6ە__1 ͥݮ m/H2(|,e7ݢoGN)/PZs/r]co+5Jk'/>e1\*lkcOL.GZA6,~z6{+Oarjq9(E"*dCa7;I҇ <(uDgeYRڣ Xw[VƁ43{z ׮8m| iTTw>CHo_Phj++Ǡ [կ5vt?pI,=~C,7:,mK[RXVĩ!).&C.$!Zצ۝/Ӎc vqnR+d3;}N!S5©9c;cbox6PЫ.&;JՒ*of=~׌|,#%" )1$~M HH^'KܜL|ڑ5Yd;,(%71]l݈^\yDPqP_<+3JpPGYѼ62'ⳑ:b˩M>O:Pϛ]{Rh ~D($>S8j&̂3Foe_djI|tЫlpN'pF!1_$ߟEuam̅kKv0')FސYC+3[!t(4vReO'蒋gc-,Φ-w0$y ǭnN]a#ՉڳCXWm*r21ϔ_z(/LW&m_C2-SqHpdh\t@ T:I:cgJQoVMͫu^o!Lc^?`]t<yv뮷59X1TeW$KZknc-'C'I,<3CX+6JLz׃h))'-=ءJJF}*XwcCqPP*;[M&˒_բLcd `=L9Bal ~Z$ ı+XH͖P8n0|@u@[cj=i__7{^\+Fg--bx U7`PGzvЂI൒bf4KHWk2z>UqFi w~ jѐ;ixK|S4uNu"/7f_+hD >UV6~@/%:˶hd*b<4ch al'޺_X03-dl{*gASqĕc&@GKTݦb"eyuU[so.z$Js%`.o\p,SH Mԥ;{ؓ`cٽ|"6SVq >.}U$m@o5ׅ{j̃rAށ6MhA#/bia]{NEL#>C4կ7 Wf$㺔TB!k8EM#lM/Q[DPo+g&C3?#'߲jxꇤ"6RnOasC4" CmA&9ww/ <@3u#y.W-fyhA =c0h@ٛBtD~s)N-4ss*_*1UA$[oi 9yqhͭ#c`9|iJ1Ruļ3Dw$IV #kMMb,iedYcSGْ~-f7Ip38 9.:w i~̲5+دs<~})/~`ONw$M߁Ŀ8Y_a nڄMFhCC:5#5@F< dCr; 㜋%ohۗFӴsX`jn*W԰"d*+Tʵ3-A]1|^n~OcU^N.uzh4}ɅJPD3 g =h% ϋ4G!qтeJ .3U3 \,wN C~u{fzshHX|\QuB4_!UIi۱f"P.5< 6`Yq'0pl s ?xdfa]kYdϝt"'uJbR 9VM ?$;dO be,GkYa0_>}.7h͝[ǎTtjz\6Y]_iq<0|-[N"+("3lshӾKj5GBCf~~h̡ݜ+h' m&YSFSwKcFBEK*lfUQ:4%_^`Oޠ&zbx;TUOb]J):_jnLG:aHf(2/:#զȺ/2l ȯgG@!tlV0SWQCINv!W-CHnjdJ*zIBBOA-ײY>ͯ_]H6 P<󚊾b4M;@(oX|5Tx,\xb`8O!$Q%E]^pF`Xs,R,c=޴V3N;x*^Z$͸=5*]ECbGCw:3&F0ޥ,0bpBiAFv Լ9ք5|bs4#oQk&&xGn0J A{@p}bs|dI/ y'S>Aee!,F-%>]> vH 9m cu0vƦ {\qPPR)iXmR3ц{ڷuϳDj1++LS{=geC{7EIG&g8.O6p~gtsFyMBCWby#bexPqWoIR=UMc5/̒R1Urw_snyẎw>VK&VB#>w^!L97xpZKy|&:Py jV( XdQ^5V,e1>ͺ6ē,p0,#~=MunH. \ŤfALpЁ (lj{ѫ5@umH\M FAi. 'R"J3N$,i:>CNwJ9QӳƎpR@xF|$;ᵘ!uO@݉nrbu'r2$/\ϬfQQ`6O{xBFHe,7b4*.h}.-<}Sڡ#?QOl$j1*rx_=^ A#jr)M1H =JD\cGKB8KA0 @;₱Jfb,VmM/>{[ \C+^-䂃6E`{ɲTSζ;Rl#)ӟ3=iC Q${dyst_{*dJ !JP3l5_uG" _T- 4ԺXRr`3 zgr!kmJ}+u{y!=w[hle,3*&МM䩗Rc*K$Id͈ȴ9\3c?P ew<]m¿%rWA2^+e;#o \8)wAO-9EuA)" Y63ྒ'BcG8BWtFyW<(3gǍ|됔bnB}g9KK)<4rr9m2y~;=t%#vipXN]xX)8ذ"?W.Uϐ%UV;ER r^bP&}7g?vւ>}d28,m>.}m]܁й:=BY.ϊp?"fK-(OOZ= 5"7.um %jC6M!#v1F"}d|g$**'Жjؗ.O :n|dݴ&"*z |ڛ4Nr&Om%YaVR Gk*SQcMӈ&,'mbfl='9@BFcEAyY Xx޻N3(&i4XB(`dYk7euxhř; -z Cg;9C3ɗ1Ž >["}D#[U hI[g8>z*4Nr*p{wqvш_A%v?{$|hiÖ#_w;r)j?9*Yt/ [as&&,Q5FQˑz8 oSiX56%5(Mel=L |m^'A^ɳ&P'FJ,.VBL(ŦCn$/Us4$@-fBOa3AKBl#goy8j,Sv*.wnT \pڰvtP&$NvjG)Ώwă‰t $x™ӻ?X݄ҠjA^D9Vo`ON D?iK_︞Bi(%\iE١0$*% m`4煮i)7byvSPJUR*/{-" \m+6ޘJy*ڋ,JtMpj~a딮Ȟ.+Tu` l#<PXjIּZ8Qpa)NEY1 28[Ӱb?EMyìT%$hl r=h7zw˝*-w5c<$|j  il2.HS]﹟r??C-q7Fa/dEݝCkN7ЃLHz9d{* )CZ!՗#W BaѸG&WE֊\$ Օ ڨbƫCmnFŶLfPBy`X&ѣc-7S n989I,QGm\BF67醢/xQ7u}E]YKcqUGR";3L ;k/ϸ ۵b~3&6 kkMe1cAAo&Z׽Rg}rn߸4dǔ6i8°(ez-3P1Z1)PD&T؍$I|8Y>(.gaAj`}i-oI%T9i}c)SZ߈ps?ψJ`6E! q;[(Cz"qx$Of=Qղ.!2j>(\H O/jqg է-*3"dJ7xa*h.Rm߹w"W11`U9koXl,z`"Ɍ}fqN; Oa\Z`+AJ,'mQϢ&Nδb&IHe أU{y)ysB6{j"hk1As1Q;Xvcɑn}dJHީb T 3e1D*\~ HvTg1a˔6aE0qn#qR_ʏyLc~Cx!/WP\h 9^LgfŇ@^\ܯjI4}z %xɣ Y5#\b p Zר HKkമPZ=E} hAj\%{AfMc BJ ,N*K&tC"v,9':,Rݠ{fwZ8/^zs0_3*!JK-Q@{j 2 ʢ2cztt BdRsfdn}zH VǤf} )F>+nt55>tΞN
    4άJ2uypŔnNO%"v6oݍJqobR l$;x`qCF+`'p568M5P~ydm///P=mK{8/?yFPPA h!^ڽF"ȉ ¢F9bѽ&ANQZK`kҩZFày&~mqi%!Jnxrf[F+R|~BF-L/gw::ˉ9QOjnęcţUԙo 9gb[~WO%f62)_,rWH߷&n1mQ:g6̭cƔ7/?-=P@^Zj#o@muxrU04(W L9-'Wj/vPTtbHsnH-ĕԓ~?nl&%+1?egBώwqprx2f?.V"/Me%:ޏP]"A/vME,bϫqW;CA=0UWzG]^w`?nU!j6F6!>g,QH^uޖuopT1-NEP\1ٶ~I%?|rWwz=夑ҥO ֊`$v6 ọx>)\88` e[4chF1? ҶFY\OMxP5BL|?sü+U=z5-Ϛg*HC;1rZ&kaBfOV Ydű~aQWM G9GrB |N*Ք1Jd0 .tW?^8k|‹`~w iʐG,GÙ}Lh["қE0sϐv*͝RVa, oCi~k̻IݤxF;˼m&vYVֱv:%`4{<[NGv ^gWUm)9FQ&p_5QK˪hw4ڏꝖnG,[9pj-O/98Ùo)iMmV=[[ 5{T cZtE؆Ola"@O rvn?8ձj~qh}J},偅1.;\4#,KvGOUnb{G،AGޅ'k8 #{d]<[N]xQ$Op xOTs}BWR46fUeC )PFXkd/C9L+3T$Q"~(&;sv4lpgu_sĆ9Yh$ U#x{" ''H] 6~F|@)@桢i,#I6G "!QJm-_<01@耴n9<4bl iKJp䷉A *Q2"4?ڣ d&iQSL| v+su8B6uE&9~4nm{`"F¨‘p3⮏!c]W+ \4`&$;]5xiP3y&1Bh;oSzKN"Ю Xx$X!, Mh`/hJݣחp9;Οb՟~2&hzٜC;w"vfҭ_2{]Vޞ P_]c߀i-W}@P+gh'rec%0퐻#hŒ@N[${YdTv/F=wƘRGi1U,nK HmV-x Z"QA>j{lpyU3)aGEQb\bФR{L㗂*f6MFGmᖪH[Ӷu3 >`YwT.؉K3 JLoy2j% =k#CZ^ TaR&NTҎ-wְqqWMYMd Ulk9pC]£*6"q8 GHaa>9{ | DDaw#`G3!%kFd9тR~$3+\ g-&C>? LT*-@xbh4[ 7Zqw?a3tMvɇl{bx >Ho=#{4.bh\@k1N^شQ xR9Gnɋ5ֳ5&$n9qz]z{/e -&WP.L=Y]tz>k];_Nj/vIEt} %Q{efbP|&CP8.J]rH Sq]ht=Gκ+I"w8->77vv/\^s hƿCVXcB']{F ]5:h‘q Ҹ^~`yVY8fG U ~F6Y#7@lB 1{My!X9\Oc4ҐfcӏCuH'` pKcc<r1,L7UAmg|N^M%z##2Tq1{Q1u?EngY13] tӰ/ fL"1)68Y/Q\hߤD1 q`y3,yďNS$Xql5s{U]{neqdAYԑVl$ݔV75THW+ٔj}(gh0߱.A11 Kcu:$eY0?b6YyEָd?T:V3ε⼻"A]b LP=O#r7uER}hm O;Y&^geY6=@fSS .לBt?*&B5P9;xFLBB˝C%Hg#[B-D\5 EGb)к"MI9JOufE.Գ"mV4ߏRp)pM>`eവI%lÑAHV.x'm1>HIK;~|D0}[JM}{Qv'6L9 ?Ҹ@ZdoXFĻ=b6\ #шuoA抾m 7cvUZ r:=POL:?<tp9a(KVRV[Pfr;$b%_tw␬1,/DMDB`x|+?iaA!z;eZ7)X¼0ech7=aΐw V2PY8 j^,+cזcŦB<Ԏ&Ÿ. uAGXPdH3x{Rq5ZfC!+kQ*M Xgr5K0['^?7}.>mȨ*Xڳc%ߴпJg JfcڗRs_OӑOmd궰dٲ“Ai )Y|g>#igbi_l6ŏ^ vs6&@W%6 [6Zumk4G+b`0qNx f__lYLfc"bܴU奼 C}=sP̎N#Z"΄}}9EWzoEs ww'PD/X~pV~\HVM}~vnb;$*j#b%v8r;ngL1D=Hm֑+`q E]=n>q}n;`!|TpwH&b\8O=]kLZjJ Kuɿf@䍠KDt&V$VBÁ4; S]/'*{Bwppv3{e$mxf`|| Y;Lw@XygPB;d8걺xKE툼(S TD1\zP4$)I;%aUww`ZfW#?sK+D.)֭>3rtck;?5qЙX0Azg1Y}>9xI;#+J@nŅ*(h遳6tLP*vbUefGht̡[ R_#Aׁ~{OoV RV{`F"|޴.~rLvN"2(Xs"56Ͷq ]lq/``"d2wېD&E6ρe?+S$S$| ;}Xb+ؓ~*Xp@C(o2 s]W["X,axv]-[LK> L:W\XLl`-pzy"{ G?+پeG }:|L"lb؜;Ȟa_)Q3 j X8N#zW3M] qۓ6b'B³~q\IdALqG@nL(KB zxdf7 *wgn>f۲~˫h,4HK(kP_ oƔ3]w=S@Vâ:OO.Vzcek'耠q:$Wr@)Kp),"Y> .!S툉Җ-O)4[Sz IFO"S>\xr\+KMtϽ QmǮi1KP+{D,[ja  º8J|pĐFemv98r'8;zxy /M# D]_5ǺMEJ+M|+JFZe4b1u,>u$4b6c1Qc\/.?=3$3oRq?,x~W5@`1]'3\H-  y|J;Tt"P +h|fS~<6*XO{@NCrbA-@sum#oUݒ.U)tFMi|~Fw;|1%XiʎLWu K H<9oժyth:XeY~fƒIW Bn1 d>; f4/wz`dȜprrOcoXulCE|+mv0BMy@h@e0Mb%$>;*ZafbRe$u) l49&z${Z+EXl' Ǹzvׯ.nr7ʋօU}DEyHɜUff-XMO0I*G7W ڷĀ C,Krcuf! `|c4[HrG[]e$څ$7}*W,FzJϤޝ=`%@NU(\W硟0xc_87ܫl/&ʃ4l ƿ ngĕUZ:%&u =dX-85~d7}]SP#ڲV#"HD|}NwX8Gy?| f S^c7{s+f^T$iw>`ӕ|b<6VtaVΊ٣fUG=6=ܿ]A±A{R-RvAE^ ^]<"gD:/ђ >WX7{13<¨С s5t%.^?}$.cUT)I-iـVJцHYYn9Pb& 'EH}:0IݭCUg#G"=S8#w >sJ-3Fܾ^OvIһC^xӑ2(|1(YC7RVrZz聼Y+iPVXSVTvw]C ۃ1JȄR=ޞv"^i1 c+@b˱F#rC.tƑ-|BLT/X0L8fL[.]ٯ;TN|.qyVe")R3A-oIJgz <؀i'vUEw>i%PC1g( C*_=aT(mO䋘H!l)tڎj7 edVe2P J|8ĩU_vV*TɃ `r q`>Zo2eJT2^>_6ƥa<(VT"7 m 8$+FAk 3l;e1Q`q'ޓbD0|",4c@ u޸6(+Y+EY}f̖S>'QSM7='{2܇MHo1T#]5j^-e]LAQMZ#ۑ;DU[.nH|t~)qe! ] zǍRI2#`Sjvlk`Y_eʯܱ[xfi)WQ/=:0۳+rU6 ͒! $(퇞yώbq,KOWoh b!R5:gu򦉶ۚ2A.+%snT4nAF8"Ɛ)e@WڌNw6BB.dތp۫•UuVSʉukLvǕBQO8V[n4O/ CIhԘʚ; Pb , ,q Xց7~uL!o+ocX?.w9@mOElΛEƾx׶77$b,#p۩*oIDh8`8yF܏pS]odI@NMVE+Lw. `;DR߱E|nkj:<ˍ4:]]5B_rpauy1eQA/ |$׉"ISE<( !x! Nz3qa\## ԁL{ög(CD%4ou;Fqϔs\=W"{F =-a벪 Ζ\쒶-^^>% )+dS2ZJv9PͬrM[0̏Gekǀ]y-\<&}<>)d,胆S9L C1m8kQ+WZE3!0ujD"5ͼ L"}z#۫),#Vp@ؘ iJ5>M[Ky:#v:FCy&]E4 ,p#<69g\Q{e:"ay Y*z5,S1fƖ, o;fG d)X-.%)sSU5F/'L*{= 8!C_΂76=B? KKc$ 4MADAҟpr|hC͏+jq lxl#:۳a/^ R2WƺV&|!Iv+τV 3iƜ;r DlL-WI2G9 3׏E^?;[7 .l߳'J6<Şa&u9?LuNn--Agy4, K؇Mr_ ;J]#–m;u75_>Nus l[ӊޛI0Bsx@Ֆ &ߥwQҘ-'dUvK"d%\> ;u7m#|i9* |-8*""2IItj8n*r`U 9 LKkN>!کlT=UF{GsA>|j3U \/DbB3$ .d#xmZA)ޫՐj;Uu CynpGإP6Y |PP| r)\Si\ y8C ,Hۃ`%viUtb]jj={8Y0) =:#Hx O맑r+۷I((\u?mk_Z}LJb)pCl$#Ne登C➿=ÐwxFh.ߤ AadXsn'xma~rg bZǵ Ŗӥ4ͦ&g Fs>,sHfPG 6o%*ѸUR%ze4a˭ŢM9;<֜^ʍ@t G:֥CSMǸҘg!BMF]hXbc;N]Ws_KT$87L-L|sX} C?\TvNؿN0z,`hEkd)cC'$~ؗ+Nؚ(I8K4!2eR TY?Z0rR ^qK27Di/xvATrao+vPG|b1pAהirVㄪGs113H'8lXGo#PA?YY~&Đy\4Q˲OyoȇX# jxD:33pcrv9 ' iAϒ >hcJfԴac4vտ#&7XPDn~ cy9 \?\B76^i*-i`) FOp7җ"V[lVH2jL JU$ 䋟 Ȥ"MNxoiTisPxt:uE7lVag:zE*uQ.j(DT<G:ծ'*z)I}MgXsUi8)Fy/{X2Gf`YƊ`Kgz~44);jݔ[|j:9 oB-㍲4c+%ܪEl kDw Dn3fCU=T;4<-dVq4fȱ9"fw` L+A޵q0iJw8&3  z3Ҡ(*{s1w؍!ҢwH*r-ڭw\8G68ÿC'k0]:ȷUNnJ̌=Bz9Ra ++E8XqEd3YƸn?чYi艵 „h9E.(^.:ziM&nuDCRkz R.T#*uBofl_.TD lBOLW4W6ȯޛ4MYUćqy\Ӎ5:Ԛ?ERfzsT#".T5QpR" ӵn6ᶒKin7l{(5;X޽(EiLXSU5E}7֗&#v`όS [ 94$CEhLfvA{6e)n"V͏ZYz7F҇,7x%My^AvtSŝFtn .5R'IC]p{;/~GA<& bTP%[,= a~6K^Zi<,PaP)})y.IszV-U( ? ٣mCrűE )(Afjf 904TG52L/5Aeaf`xcoVbcQL*B .vD덎QW|fz ev3ۅQN -T1zē1`SU 7IEw^n=4D)MJ^=rg 4%ݺE[ <=Gi;Mqf82 @>ݱ&Y0-uH >ߴNW٠0frޱZ#2ӘH1gVhB/8woKCCӭ1 Pjˌ$XJIXf&`:=Ek9?qqNv NԺ! u{gH6{&e{EEXM>я^Dh3 / O_D٣Nt0'YΈy,Ky܅ asPwD;4N<:xؓZA.-i|) O-Y-D f ;Jiz[H Io =*֝O@[8+sra"L/Tu:U$M;0RʀԬ3]O-ww"G8Pv>WYcU Hjf]\y -i:IfiaҋR=M-* fd]OSp0=g^9*eð2_IβGf~wr@5Be8=ͦE п2o4slɵEJvU70mK5d*¶hlcT wp!O9tV*GcץlPQA8b9ceߕ`!yv:+_\C&sҎՕY(e8j"-Q>^ʺu9_,*$hH_m4)xThW5 壘Ž53H! '#CCfH+[4A:MTDN萰|'~p.+Y,}/_*E$oBξyT?|O$sJˠJળǀS.!6.7c߾+ItF"BqWz-xneK2|"}MrҺoragҟ[OaoNVU^cp}6kM \Qk+qe+KMFfa Pn/5Tt.HVOw5 @(@>4"Ww)\zty 5Ih䉮H 1q_sݟbZ\ jC^ Ox6Q_\VTBh v8Li Hn`@%6e+vLœ{v[hB6>1] չ=Ļw|@4$d Xs%ߕjM!~.8LT"d-Au*?ɞfٚ?+d*5v)g|vHb+ߤ[oGW]Z+aǩ뎵8RdޗY AuF ^{:V߭X*]:* 5kxA5{1jkur١d o +0ffuUK[ԛ2j#meöKz5@"ДA@ǞY'%t 's*]f'^``%[!ʤ{y+R^\ |ևSTc̪0п19T_hh5\@_Z-{ìgkPφJZTlizu&!kOzm0/n*]c-]tw{dYr8`e^E%:FKd)MߞoM"^. 2o1v+_-[WDm ̧z g|!3_$3nԘ-CĎEϷ*CQٙƅP66H6lkkiVW\`Ss@<7t^MhLr 9\p7VF1Rդu:BQ1۽z ]Bj/A3gm  F4AT׀B䝦+@(Ң MpfbJͽ"i-9ns ,PTc<'QU^_PCR_~s ].Q0V9ʣiJ[H4e%|4ЙEqEg-~e+=<ϛsIψ86hg|Hx XjyO -~N| "YYzmM~ {ÝVs[6k6^z0'Mg6b]ޫL} N쿜]%^ fB))ԃԵMe\*J"5ի&>fשT:-!G3 +8&c+3,^3ӒԺ(ܿb哊\,_b({/Tz3ˊp+_w Λ*eSgAcփhXx;YĽUWU/xR Imk9  f"^UL2+! fXONK"dIhI[2[C_9ǥ:r6t) y7bai')$q;j;rx~~-yx8Ҳ@=z8M'0uSgg t1e$em\s~?ɻ6 L8"]L<%Uy_Potj۰>3(\'Us? X{( ɽ)6̠ ɮt[ ,\q#.CH\J~ /y&r~+ػ8m3# mH ]"5m7Ey0V9}O {NuZ]ŐYVjCաΡsC&B_LvX3ogw'r/WC}eMRfVj? UfNE|Q:ib}<Z̧Ol{#n؀9eh!L:MiF(9${;U_`Pt6c{ ޘx YiR,)wkӦ +Ie4ݗ8vl(gE=߀]Wl7;rDQ=- "1xnm,FMWsMх}5ۨL<͢&~n2cz|67])75l* ~$m2tYh{AJVlry~fD2C+|7ǐԁ7Lra ǓxsNfdg$+{$dK@h8M,g≾M>31 qtjq-k@ek4eը#{4˼"?ާ 9Dt`4@8PabscDQ溨MA ^K8ūaց#6=}bmwFЪlu |K %Da̸*Y}g4!x.N-:};T$,Cqs,ў֮v]\dOB2 ,Bx:1&˲.*wԳБHo"}bqycŽf,(x?,Sd_ gPwZx(3[yyϦX*)j6iAwH=8Xg, 5u;/gBv$/Yg9ԍܱ4NTo9(8m}^DGw]1l(v_1"/LLܵͰ 4nw+m< %myE !8[{Bj?v4~5=R{@_sj>ekQG 9^ ?*Xwz (0@W^ՑO(^]G}١968G(Cq [:rc3s͞.A~uqAj0=ZdX%[Dm"N3sP#{{*@vh?E‡6Xn}&U~o,7Q ChYp"`:x'tor9#B-U,wEBY' \9NϾn n}A16O g.Z'(@LPݠT4끨0c 8q]9sh)0$hoXP[+ɮ]NxUF7*%g^â$}x2[”-n&piq{t ֈ̴x@ `lڼ3-a'$~Bwe "ɄxK+a'̙& b>!<>W}~H M2BʪjCF*e\yP$³" ڙ.gvq  Ik8dh E}yŅBoY[~L'Ğ}>'aPpw 6*'?wI+hΆ6>f~AJ Ixh8魰*PnP{RQ穮,3Eѓ{X-Qt mڴ$Y4ϗƒ"5n㬔X%☥# ?ƫrQ%=hrC~@Q8ǣX0j@$r2vF>'N{w`ih02`Tj"*oTGʛ xϙ^-jo)jƟY-iC@\ݖn%[ oٹCu5Jh}aIÈ2wq[8!`ԬS;_GQV@4C|r8P2WaT3Q^ZwzP}Y~N@!/mI(O:N_SǷU\ň |&!!NrtU?1l}:0&f-郎!9RS]j6/^Z`-1.8VuiLom%Ȭ҈U1zŷ~[ 3 - V*RuLq49 .3bF@!hN`q|x֚TUWe>GAa85*$ cE=i|J3"*c&ksZPƉ^6O?NݼQY5ه_kΜ>lΏj2d"`*Kmb0MOΐhڢJY]n(eD/)8f*@R m!rO(=dNו=괍c狇f2aqLܣv cm`fgb-!2+=M *6q<Ci MҘeraeH!:y乞_JQi m؈+Up[>xKB{KZ8?LԹ|E4!~OwzLknXgbp0P*.x>AdHlxf%2gb60uq0-Et$}Ĩ`񑗳I({I l"L/xB~WDW8}eв~g5ĝ/WAٙm*< g3)rTofd503M ¬~<0QN>%^W'a:a +ey幏Dž?(q#Ԧx]"׽6p{u'TNj,l2igB\Pr&[0o3$ &ߣG2V} Lg?Rl3۫:?\/:hg;pc_P8iB{nYbp*c]/ZOѫD16(_ܵB6$jw|ҍmFbSW!Ps4)״L`3dVڠ-{ ^U6J(Yq䗆\YSevHHljlC9Mb]7hYi"ʯFͅ&q(hKX?k=ruk S 2bftc#ǝH1ă/wWĉ"!K>5O=CzQw_iպg'6}cxOhΈ0-r%ošY[$7ы%+Cnnm$Ks?ì[tG3FU4S#:G@¸vR=.&f:m:th s(Ռ5^ԑXH:+2zˌ>74<2V<}:2t?gMHdPsK> Op \ALHm$地<Ʋ/B&sQҁ\,4Q M^:i#-{q:,  wDY G?>,^(]oA.lxXci\I f425R-8n~)y;.Gv7'R@*<8`ʴ!=`r`I{npO'&Bd4@s q_eOןp4}L ~ͿytQxT `knJqBzZfT{޾4 9bA&pP8)1fzIdቧwTGL`2z5&Y7"KH!,$Nв lc}Dkxm 0-ȕգLPL"_Bx6T.Ef,|1y7FsC-q͌v*eb\a'*%! Jc^2bڇn$xF(^a9q#SA ,Ӽ Ա@ 8$qE|NnvHosZ?-L a@àί J6.Ayg+k";eg 3nq .銅C_{ ED&< Q %Z&^~-Bb~QggLƒ0o6^_J%v,ipb~%a3 F5IA|JQɀh}T 1IY)$:ޘaJ$Ƈ 00A-OG݇[^춃±C[/[뢡!lEh dS+_*B%pIL|y"k+#,/6Pɭֹ j{}AF4Y4VD@0y!7Ja4nϺVP^\ݟg^jd}XjIܞ=Nso]5F8{dŞ G)J?5gJ"U ^L󡜕Kp*`A8j5/}XxxcjBy`wb({@rS܇,uSy*䙰Frd"êj+DHG}*B]F/KU0X3ҲM,`moފ!|g|$#ZRvXB9W9Y[T!-u3!{v؄c91J \#6f%:~TuEGrd{lKiJ` wz%i{xg~`tKqhj(z6!'|[+3e^#W&GKjn7Cz<]!DِDsȢiak_8݅؉Ɛ'g`|c>e* W0&4UO+f+Q6|e4Suh_9AGiVOWgVEf9d]4k{30JF&jL4–O!4ByFay+gA y,0bi{ #c?22"/g*vSj g\5eZgmfWn_F@5,@C(\ABa3ʜ{UL=Qx@AqF+;C <%e 6UW)d ՟U}tn^kJUy2~_jEU-=eȵ$oIݝ~Ә6lE__r ڬW@N +z--6[ ?F[0w-Edu8AhVJ*0)oU>=Dy@ ~fYu kœ0ɋ9RsAq_dyvU3<o;6u9 p!#$g%*~3) o@hiRp-`I& ҫ9 VLuэ%=FgJĩys9^AvΎW@+S-ޠEØxY j"c*I̷4h2h)'=#vd@/œ aEnz5 FVj+︃Sh\Z_ӣaMo7xKߴ @__6;[ .Ub=ӵޞCyiY]-yСD<8LXBJ`uCF8kw"]_ jt71CRQ$ͰauR//$2tM'(ŷIz>}yg؎]:n`w#SNb\ÁlTD#3*Y%r~ ~>f\R"{-jV63 g PUȋC!;?ҳHgid,eaF7PLydq9%e `%, wVZF`AǠ&]Sk/nOe(Wj@R*D] aEZ;e.j|Tv@hm 7C()fYhR#>ڲy/f$r4U.7+$Րm}&`.^ꪯBi Z,ld+X~9} isңJ`PXpׂ0ܾ?+<~){Et(QB"l}hwCW@wZzzO\ :bs7(Z޸;HN^`NS*2/ǯ@147PF c$5#i9*JL/1#54>D$DiyqWgBjpd}Z y>A²8!Xu c+zDআapVrz Xs ){ӌւ̹Ǝ p >1㜵FfPb H? ?o?tDc٣}r aZL^pLUOu( hkUɃu2DKRD5]Ӭ19:$NI'Tc4-U*WϰYח_ZY#ZoHZzeXΊ 캆JÃGLc)@@7 -%L ̇Idl ;9 Sԇ>_XPyVω@^#X~6ܗC|66#rړ:$Wd!0ęJ wG3Š vbYl;k; 5~B^Ha)%SJ4q2y$app ]p\9ݸ;㿶ZCչC@۸KCxK5*=ߘ.!ߨZlu.^ a*&j9'{W̩T^} ` Gw}'ܱr0!!kACώ7w̗aGh۩I{ʫ-(NƇΣ܇Mn&}CHl\PRk1RGbzz A~^ŲYfʐT=V(~)K׎ wpoPj08dJBj'9c65c<ߤz9NUDVчVSPХ._׃'B7TDv'2V}]b%!-4wAݓRVo~Ywm1fGsj>Il${_6w'&z%٣ dŁ(.1q٫EޙdԺƼkkLz0fVCFT*Ve:?Zz~ ~7~Y7.g*<X3]'lM9\tY2'dMpgLKJ|X߇6[g_?~A8o זiR{!Nb="&-sd5wA4 %)Tt_hFC)uW;сɪĘE$M1s[SFwVZ]cIHM:nU @'F1,[Xu3tO|Ĕ^CW9.2( +=$fY58N;}\gd& :Ӂ Sj&ŷ}t;es׿mmDŽ0+ G[%0W>c33@DOgvnʇYxnɉDqײ`Z7ld|rU0OQ=dI#HʈB,2R׼1U= <]Qе2QKK8Q$6M||6|$ZSAXh_ME]laWdEv<,-izE1B t_ISb7M:clDmLB14iɃH.%|(@wY&ɞ9$֒ҝ CgWms~|w0ײ"frh}t4½"ÇOXuJ _b\PH|HtBɶ$z_yu:5+0 >FSc:֪PǰWnUX4.smEN *mXTT+Y H@ i6ȕtO1`Oz,|4{mhPE>_ߡ(7Ǎ/6-Tg#0ymLӕ@팗~ :މR Kfy<.կ*%!7{ j ) Q'Z߇n<`QUZF%1}dI_'7Ş6\[ ar@Te DXlk[jkBO$[^oj=m7zm`d@)ݻP4C[N~%xO-וa7TtsNk򔙆)AMn"wמ==j|`5Adr)ƻ8=A1(d4@d\p)o{RUlZH`.g =ѿehʆ%DUO aFsCG.أ.Ӏ03+wg9N?WσHrsfR> 2<.4t p2(bc|YdW0.0vIN)hu:^DִCrT.} LP'S{p**5&I%@h=Mf 4G0 aK\y; @yauܑo4ar-"6-ZɛJ1au0o :U |#y$ȐS̗ ?;>k|M #ؙLƀBbkv;g-Һ*% *aIdV;I6S}"al,Xg{e{Hw#Xgq@UjpT(EIJJrGP?mrb/}l7lU:HʃIy䒯.WF~XUq>]pΟBbRY4B`P+SL##![5y_1`p a&X71@aInH4,?d[V4d _pe߫h}FBCjP4S+HV\],z,23 -4NӋ`8>ѥQ!gGtYoβ(ֈ&E/'O ҹiuf#/>KHGCC#hZ#CŇX>+U*F: *}(0Y2aɞ*\[+6s pPq_CkvC@ɿ9rGm8d'imwgLA%'b GE0vo2 2fd~s>2=`eE`^@[})D^c]/ck/axq.C$j&qrj'9_WO9SYІgO %>M UK#l7"jzq&]χu٥q)1?:u~Qo(1nT70 ^G|70PT_9sw/X+lgՌ? DTF~^SȂ7JD onnI*M`-?{T:w:;*ײ3nºf70ѲOTO"tPQ 0D?sC1{^ԳfFvhqפ5 Zz53T1IځíFӁ4D,͟@^ ɚ7T:_Ա7Pnq<4r#]c ΘqlyBGsw hZ94y=|Z(NGk3) kb ՜wYA Eۅ~Ւڠ%piI64zgr=4jrhb'r9PizC,dH泓O uP(nу.%0`I]+ba~$VǦxZNd/%CؖNvz,dfxk<*`o)Vfp5h-n{%7/h8q>uaGo4fzUvazyڈ~1.CΒWcf,D;7 >z65 fQey zBDv~+"{垍$⒁uQnug)VΘVɍVe*barҭ@%Ƅe7v (V*S!%Ew '?X pЈj-C \Q{6N-,s {K(> D;~?P1(G8M+7m }]r㪳7/g/ķI)zuҢ])-G^4[_]I2l=g=9[_ӯsndeTLH]mKxҺmD=mZ gtJhgFM%a%wZ }z)tLT倵nXv֓lᐳZ⦨ix DV 5ԄB3(NGxc'Vg{gFM%a%w!MPͮ`nk ]# Q?k 2yjmw0Ku`]HJ&444t#0pb|CPmw0Ku`]HJ#3--[e>Y?3ˑ0|"[ nMED !#:1wG-.=AI5n+#Ky Q\ȯKaM0`~V ,? ] 2최8rFCt®|OꔠIS0Bm؉ 0Ь *칌_v-BaNG4+S5\Ygwq?=w@ͪ%Hݔ7Я~І۴]JMݕQ^?*x`Ev~tDZnXFyǯN»y_ M5~j!r 2㥵΢3 w- `PB[Q-K|M'RP ĨB9x)Ⱥ^/J@>;%yt IZ=<PF\; ⍸G+¼ l?v,#aXAENJ[/雏-Nڟ[zS2߇7j(4>x:`H$0XaH='Sݑ U X4kЩ '\ Τ$R =W_U8P/W4o(S.V8E%CONds:trl([R@˦<^џ]s xwe[#pYC"5:J2ML(AW7$n<4e6R'.8/6#x~4ZѦi!`R5+KZ*9vA+wjE @$Ȯ ﭅!q,PzC?/Y:b Rl(Q(Ź?PZOF,s* 7&vd 1}X ?vdeoCIDW9%nF)\ӊْp#Bۍa09z1<% cf[ n4vd5BxBI!9?Ȋ3D|}7s~ qZ2Wߠj,kʩs4J܍wSw7๧%|᫐? My͂*;(2%ؽf9?Ȋ3F B6¸r/4vd4IE^ D<1D]3!<>@ 8^E"mve:4#$vp@ZxMw9kw@+X7 S9 ) #Ι9 Yeu-$;eV̕󆙣>S/SL9H4??8먷`%+t.ؐF>58yPxyo{?P̢HLl':r6e*=gRӛR2LTnϰu]6G(̝+wu"edn@XS0z~; 6MX#ra:\=Bm>򱇷uK@~Бi_њMnP/}duBwWLM4j8q>v1r>zCxC sT2z\-Γ8L+$ȑD8Kc(uY8I{HR i+R=ggqN6Qj{䀬ɪ b!5gszlFe'jF-ʞ(H|}a]KGQ|}h .1z鬵AnM,rzQAf~%c͡e!z8UNǺ *]ܯ(7l(!)EY C[K0!-}J=Kf,iw{3`,Xo[`-vÒc&Nhy'Y1, ^y;IwwN 7.gbҹ~ VKWwȽNmgk_9wU@*݇ɀ a U>ޢh` +7}_CF: < #&#_225^/%=F0R(v &_'ӲxF1=sPpK9[o@2L,=ƣѻMN/±ac%c<*&lmݘ w˫}\ NUDY/oPJ݉"*M Ja \Iϲ4 ~,s{(P'ԔaDfj@hP5mBAsB>+pjGY|,;PmV.?NcEKlM5c)5q{px58H{}GCsfꃑߝhj31)TvIo@]f:ߜmV()R8@xu:Ld|R\|vX+ 6hn|x6R&c <*H^5n'wW!UזRHp;OzFdlbMe/^Bbu_+ݢ!#bfm@p$3PdS-W"+oj7=Yj^@Cl({$4 a QƊ ?C`V>-yP"'ۆe⿨,#x=ϣFp Ӹ(Xo"z ֕,?05̾њ`ULVm$ևUʾ18TZ6x:;sBur.`"іfWh}Y Hh3Lڝg7^68qE-RTK fNqݿ1|/0 plٔ|$<1PxfodI*X17K;M@1$@au=vd{`jRdJA8N\3ݸt(uaz)7qר1W8جtVq=֕a 0- ܣ"۝UmFAbGAR`5IgSGo>d47=fI>k-t)䭌b|$نV@KF~[\2Z[ "ђH?Y!춹d8C!춹d6LCmsil$h1eϣ%),(bV r%hf'=aLђF1ElDХƆVGKG6FY̺$-F)R341d+Y'Ґq%(c t-Hd~֧}Vfeĕ"%/'qĀt_uP9 lX jq%J;gJflY-FFkJB_TE͓$?FS|' J|")$$ f59|%40 W R)^R8;t@ݤ(SE\8ǟʔP%(9my| C:踉 Y$#cI 7[o)w< +UmTev%i# eNE`R5<3$ qTK3K7NOE^&lW4 ލ}hcQĊPIrW dE Q}mS7V~N|fh*Gن4Ilp] 'وx;F>Cr]j=L/9dDX3 YFoD{R҂:Aו(/Zݮ8(P *Ѝ$de26)p, v񽩜CAViz6A 0GRQF_VsL4C,Pf*(2QRֺ0+lD@KN\'r˯r;YJ sJ@$8N?] yCFK|#Tnr/ϖ/yU^W ~ /'G5ʩ9R݇LVs3.qɜ;J#c `CWЇ1"HC1f.jۂQ5#0}uS`|ڌ/v\3,@8:nMñ9@39o?>胯~zXĀIG0&jtk}|P: 7d\7y#3UpxwByLTx0a`>|Q=Fɢ.K3[2TqT_tL=︸"Xm"a?;WI-.O#%O[cm>V[MKpƽf_Fmo-dc}"/[*~# Dޟ,Gjӫ@pYrIθ Q]` 6))laMx]>ƽmň_6 xFy*@'o;{!3Ҹ@&-Z[ux|#uLu)d"uL5eU+c6;l.gb?? =^qs!pʒUsk#+ fSE1tt%/1;(4l\V[E&ldr$shTtosVnk؟Tk9ƝsFH q;kzP6C :EX dTGuv TY3--2򌡪ekRP(Ai$Nzaߚ~=+ G6mHn8?jo;F;E;i"9='1?ۅONǯvc*4x8)=,(e΂wYj: ADi>6RMc, N%|PO4ÊgΠ-S =ǡwoUmvrd,,tK²EΜJ ~ 2vQ>O'eC? ñx$$#;/ lbyeٻrc1,>:g1^)0HҲ!"AĮ+l8]W}706uʑJ~cW ot0E 8诧QgABfߏV59a0BS|yMQՄ\R(&,,rJNje1ivO{cy sZd+gLoRmݓ|l'P5Ex&B T0AsQm]QM[[E&Ó(ZW< ekFW~6>noIso?0ypsq] ؍.ócd"eh<}1M l!UBS ; :PJvgcVqd_T??%x+8;~ԓ~蓛%Vg Cÿ-n7? samZLd0Q`Vj~caDO[UƸ嵘f`Qm0Y)3l!Ipts`=*j z%IMH,0A%\{ ML0]5AX/{.8֯ߣaK* 2*ʷ.܃B~G,K}L<=@ymkˮ&@'-C+D~wwCř qS|WESv^s fgL2KN|,JR)ԍk8:MW|4zOB7) 10N뾨,`b,-y,_F˼W,0\_ŘY{URyu_gė}OǕ=>#Q8 [AH@ҥ>8lQtgzہG5ī!Qja}xR!|mg5m^<&ڇڵ0VBy3ҬG-79QzEΦsIUj zf2-+OA:>ʵf щV5Vev,^冚],g@ B"zu+}r֕ګPV$4d93Y6=>{W(BD%'pLʖ߇D~N|>,ioÜt]ʃ,4IPfm9/@X1?)@ك)>t}{(5?|#" A&g-PztBX _ܻoXJ ªq1 151K^Z%}{O=ZUlnGgԕd124BuL(@kE1QS4ҵ>X8Xfkf(i"tWG-+_ɯ"1lbȄ.MA-&~D-laC4`(;ۗ_Wn豖PpH3[PШoKWWݪ+T- g"{lK%J6s| qKV-گZ];7`%OYMCenv>&zDIԺC%]&/WpK* i7ː`מ$F$ga0J JIᕽ0dX%*g߁Q@"wіOXxIcn>YV (J iVVࢱR,ܺI:f,>Xr-M"y } )=K4ŰDhH<|6"*Z'E7,@>S{iaQ5Qw]G Dyޥ_`i+G߄D'd:Pfȴ~A 0[;) mT2D p]j'Y8COa-n8CJC!S턚K#ç+F8# Or3-~|TUq,(ֳ@:ȶ9w{ 0D)Vl)^sxWT|:|8|obneQW Jy@(V޷ ݅,T PN8%#Tmb_|breA~茍ifYMM,.)O OJ+ b)u+Rp>r?ןPQ"Ms'OexIұz*m32\hj9)(!I}JµF՚:h։P̾v6XOL#fګuu7(ɗ'E̜kΨ$WH^K$>Q ^u*C(K,鍐2Lh؅}*ޏcB\L̺Lf=eu#31W|9+6m a5o-:f`; >яԴ(Fٶ6n`v&&,:=L#DjM{> YFZDX DeĸfX?^X&^Xz=av;ns`ѤDf57rƌTᦳ_ {g~ ZI~'LB0-X$֏fа՜[KS6yDٷ2u5ۖ$>{lOНXdޤY%{t\ U0TGyT2Qjewpq luLe72KG~VFo:0h )>9\;% Kѿ e6kIiM ^;Ur8fR=>|n2f[~th`$-rRVzK3]P33W$b@  3ljV~7!aD}RnY 4pLLI! m{cW;4J-k+o~_؞3 F6i%cc-цP%͖,ZcUc4ޣ⌷3j7a{%S-hrx"v1xH=X?PI|.jξ?zp1hffoh*ċQJ4"6uQW/ QHlpk]+=Ki ]X&WwU[9M\.c, ȢB/+Y[@0\@gڪmYf!9YNm$Zb0̌D 5M(K1~Zhm<UΕ< Y՚e費}-ĸ#:Xb][<v/gP(CV#+)+fP@#Q*瞷c0 +_fhBaqau.Gl"DKnr]&->R\5E/ΉiJ1I`;dֻ}&FQy1艵s_<5<]s"H\? "};)JErԞyTIi)cyg t,t_ ˟k0L?07Xeܗ3If1i&a)mm{j/)Qz^yEa+߽,cZJ¾E\}/ϻT{Nj5QnwܜW$J'FpLN`uKkֆp*`$MK!ԋ)d/p@Lq%(Q3')|XsSX>q"!NW&{Od ~F?Еp ,H%n {L[Zժ8u1Jjub/5(WS{wݓ?f)|:jØgߵ )ځ~s7^-SFEd 8c[i쑱JB+g0%v nJ-$$E% r)"΅k&Ycl0D -`XClj9mCOӞ쒤eJz// U(9-"cfmZBf–Te3Yom;AS)E=R=57V"Ȳ,UI.86W[\ky@UffA̺ܲ0>JZ~駊EsX.d ^g}diwK=WZ pa-?sp-{!aH#3T PCOV8mL5Xھ M4Hy+#^+L7qt2@R$Ewk`O+ѡ~pӔHpȔ Qӻ|;m`.4u|A6QHIuY]WVI+nN('֍Up9A.nwo]FMc=qsDcVl %.03D#\o cWeMİd(Ok%n[~aח1V9=nE~O_j M[!d@ْv7gLq: 2&Keʯu"Fj $^c Z?}d :_͆(<ʂVGE*~- tt@׮՜(#~Uvm\N )9SI:=0Ϋz#@t6_FY끋R%IKOf%oI]ֿ#S iWHRx.]w눯QO3Y+ bn^U6ȆbtY*z[_Сrd\Br'oRT݉Lz< o?~'Τt萌l}C;9aٱ+tJ{؞}?Е$n*n VE'/9M緌s`Nosu4yXX:p\rdpX'JԏuqZW}F{4wN_3X.G{g&G u~$HшkGWp`hb>@k Go#B~Fyj1r;[#Ãba:G$pzs" 3Fd{gsux),y\M hǯHv+X#+d([ IXALn:G~td|173Jxhς㙿-_`5g>1,R7k2%$f4B^E"eQegkügmVnmI-N[K8b=ڂ`j+~Ҷ({ U'Jгھw" NѷȦ,UlEҵP&|8*w1lD/61v/|B:-tMz  2קc5ă멮TnTBXe?y>Q@=! [FT٦Bṣa9UmX !T*gkx"cnmPH>E& :u@.^y,)rOMRxڢN^!354ȯl{ߨ Ci/Vbʳ&dW*C6^(~ٗI*h˕VQ݄po#w`2,cڪda)p}{HIMm&D\޸C+N+bݥʧ08?&К6oŌqF?FhG>~_4gx &9Ox72py 4hmE~\ȪzR>c !&tS  _Ǻ?켉 ǜ'J1;Ό`}>QK ^;.o޳_a %d3V|Əqéd-즹P@wVTLHĈPq,=/&wXX Lɿ\XmǸ hR\DfE0Xf1 \TPdW&!7>k/W"BnT  ˶16BJ&aǕz{t URq!$u4xaKLıZ-BI^F''%;[fEAXI=ήtreS 9RJ@6Xn8>c,hz2qZ_sz,`]N"PKZ=Xs`j4a=h8Y/=ev.קrc\ u$ac7dd`X:^ȮtA0I v{$dd`X:^ȮtA0I v['ks։ՒQ``zw"ࢴ lk.UBfz/?7w=h8Y/=ev.קr(@-r{vQmj+A+ 0cPZtdd< Hw6nӰ EͶƻBb]Ņ*)y]D>QߔUQw:3MqGۏ96Q_ٻa6آBO>F`17Z޷]bTdp[tV\A8-OǡqKXa_w0)hOKDw/@d`E7 6GQLO`ؓ/gS/ aAjq>HV9C6"0r}4ϙq#WpT; u>ndr殙%9!G`7y۳s<5'Q|Z4IG[L}y t6!b(^hAQ0X񋃵ha+!oV'dpu=vTbo$OjDs03ɩNd6HqNwrW]|54V7=|Tן 8pcT1F-:TEY3VƝGsZnG*:΄97Ő,شaKh@+X3uw 7m4YxubBTj%qHe|ύ1>-Q1姯Rs9϶Ht1`4r~Zcj> g?r!Lۻ{B_I2nP'_)~&F_QEoL3+I#^2{ (o7lDC܍li/p{.ԇhG:m<3-Z hဃ.o{G9EnSC&),RNi'S'm?@䗡I|f"x)+,1NI6)xD7:,߈ 1 /Do\MFV>WIߓXKU˺蜒.tvq0YٿK1D~" +?Wx9Vޥu٪T5(]Wy}`:&mcdF]8H QbgJcn# :n4ޚOh`] QCe@3 )?Ga:/ɫldGLGPwRHR=̃eYoQ5dY/L!2unNwmC'kME)ACyhY#΋gkn_CBcFb92k,fycga;xX KM(YqxhȇѨ1(hgPĤ6Ǒ"k\{"6އI\OGE 8v &WbMs T%.4ur^g55)Ȣ )iG(p;"46Ma,GY ڸi`GN&>$H(el[H+S!*+"tKpxIaAL_oј%e߳8g  ,:GO) P؅JmAeIGۧ˪3__j'h\\l?\MbEXnsSB}:8Y!RB7u JxX衏vX(PR7=ED%F u؇jsDes WLBQ8T'y85VgQL >BH'EW꜂Gq&l$-/^؊νJQJr4f=ЫJ.bzذgXOl0QnM$1wo;05%IƸ } dxߑq H LR'@PpXq ;XڰD)ımZ+ZZ* 4s_Ľ&t(BUD}y`8&z ?C62͓"xSB*o0C!:9`*&|sõnF54.ά~j^ KB:R6f‚v Zd;=.VM}Y4dرdRH7pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/JPEG-lossy.dcm000066400000000000000000000231641515706620200251220ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.5.20040826185059.5457UI1.2.840.10008.1.2.4.51UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS$DERIVED\PRIMARY\WHOLE BODY\EMISSION DA19970911TM125206UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.5.20040826185059.5457 DA20040826!DA19970806"DA19970806#DA199708060TM1850591TM1229312TM1229313TM122931PSH`CSNMdCSWSD pLOGE Medical SystemsLOSt. John's Memorial PNSH-0400 SHgenieacq0LOWhole Body Bone `PNpPNLOMILLENNIUM MG !STJPEG lossy 76:1 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI.1.3.6.1.4.1.5962.1.1.8.1.1.20040826185059.5457@pSQSH121320SHDCM LOUncompressed predecessor SQSH113040SHDCM LOLossy Compression LO GEMS_GENIE_1 LOWB BONE SL SL UI41.2.840.113619.2.43.16112.2141964.41.61.870888524.19 LO WHOLE BODY !SL "SH #SL $SL` %SL N &SL 'SL *SL ,LO .FD`ff? 0LO WHOLE BODY @LO BERRA,JAMES ASL BDA19970806 CTM122538PNCompressedSamples^NM1  LO8NM10DA@CSM LOPNAS DS0.0000000DS0.000000`!SH!LT@LTLO GEMS_GENIE_1 SL SLy LOTc99m LO WHOLE BODY_ELO WHOLE BODY_ESLSLSLFDk@SLSLSLSL#SL'SL(SL0LO WHOLE BODY_E3LOECOR4LOTc99m 5LOPMT 8SLB:SL;FD?<FD>SL ?SLDFD@EFD@FSLUFD?VFD?LO GEMS_GENIE_1FDz@z@SLSLSLSLFDFDQ@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS5 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LT JPEG lossy(US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US (US (US(US(US(!CS01(!DS76TUSTUST UST!USTSH WHOLE BODY_EOB C  0:*,"0E=IHD=CBLVn]LQhRBC`ahru{|{J\xny{vG !1AQ2aq"3P%&lj<\M2Q gW'7\q+?ysb|q9y+(|#lIGs6,~͓H[q~ txx[fܺwDE%_BjNw,RMS*u:l2FYd,eoZ._cw:#~I|EWi g3p쉌Xe)~ѬhWREn|7%^KRח]9y|,ϖ8yVYgRJ׵%x8ffܜnJRwqy m/V`I<&-~rJ[R{c99Vqˬ2X+6tCVί ''R^Wbn RKn\})c<3STO,Wj.XI穄^*J+1乴'Wܪa7 ٢{:9YhhAY:x7V_N^U'IwJ&I*{Vd)/- K-8ŮU+i]\N`){|xn8$rXXE}J,OY!+/˧a$Ɍ2%'.J46KhyɳZ"-[[ڵ#txiv;%ӵt+Us#^l&eʷّ&xZ-L;42F|6d.[NmҼ"ͤO͔~(3iٛ>*x/挪-eCʿ8-kx8dњRϱ?c9 fi6XUFse:YSkE%#ɒf]m_C^6ҋi=Z9&ڕ$9eMox*,jգ'Bb隽Ky=K&;4H٬]++&ӍfΕ∦"[1ޫ i$v.uS&䓩5D4V)VJ,ɞ# t!ShQ[9=EA1٪Z/Y4Q#:o)++tYgmVuomcثybؿ.kE[1X fI,2]0/=FQ(Z:6IJm(#&`Jn7n{:LlI}4~,NF~tqrɪcd}yc0ZaQ-x*XL*|Bڋ'es:9g9_&N2K?6O%2$}̹5k8#.o_}iZ(V蕒p^͒(Td= T)*nt5h{"23*=Sɯ<Ψ$I%ed²(,vg_`Ӈ7^6fQdxlQtE<βyL}&WGQj!U>%YkQr?P)w--KwԼ7w6ֽ<ɫLϚ)ŷWpR !UЧ\։S( z(K$M{ %V=ȢRʡVeKko躟eXg$}^r\{Q/*og_~/Wv+-d"螄-h8>ȦW %TM]:4uueY:HtF3|ɿh+I;WAE^ r@[:-ȅȲ#]{X8Wu*,rk'5ɽ^az(nnnY3 CV WԾ ~xHvU]Y:,aFVi͢]wjؖLkI$"+'xez |ʶ#9K&f͔EaԲ}K/r5QܔhRDz{"W+ؕ=BݰtLuBXч+c7F.ɑ oR( ͣkfze+²YeGy:8יcz.v-(bx-޿/+J gtp ҤygMcf3a-׹Z#hoؽR}A/sn>#<|^eW#H3DY1&G/Y!JGTem7IܬmD%oo!#N>OCxMWC-X˹,K&;/KIe^F';F~Zؾ^®/d7TE3r+`-k/;4w)e ^,TQRTQF`MgT#Imot]Yzʝ` C=<{r7J7B+%&r3tѵv"AI嗕ARNz9VΎ)>6MȚMlB*ɔe"N )$w y~3M"yf gؤRF2mF籗+9ӍupFY3yLm[)7'/mt-0x2~=ټb.%9 Cy7d)#ه&Z6:R19ɜ f[Z5N[1eZ7Ͱ-y_dz1,/V ]e@Z;6^2a_s)2z7fͷ˩@ [6QY3) oMMQx̦mb͖ܤ!ۏF%EL95} YחlǐmTn$Ϣ37l4оpo6ezu~R%nvtZ()@oưlDv0j@/:#hX2~|̀%l7oD٘:c]LͬQ&@&;:x^4ROg<ݲQxT6Fr &;:迿zg;uA%2h+gWlÑή/MUtF{hNڎiu0f tީa ]2Ǝ` 8:t%y3YO̰reݡ(7G&:4trFRe"GL(8oi89{*4YX)ޙG*єX2nA˱MWg<@ e[X-mdIO$Z &zedFEbY30h-H9\*hʋy#Cv@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/JPEG2000-embedded-sequence-delimiter.dcm000066400000000000000000000063541515706620200315700ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.3.20040826185059.5457UI1.2.840.10008.1.2.4.91UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS$DERIVED\PRIMARY\WHOLE BODY\EMISSION DA19970911TM125206UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.3.20040826185059.5457 DA20040826!DA19970806"DA19970806#DA199708060TM1850591TM1229312TM1229313TM122931PSH`CSNMdCSWSD pLOGE Medical SystemsLOHospital Name 12345 PNSH-0400 SHgenieacq0LOWhole Body Bone `PNpPNLOMILLENNIUM MG !ST&JPEG 2000 irreversible (lossy) 2097:1 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI.1.3.6.1.4.1.5962.1.1.8.1.1.20040826185059.5457@pSQSH121320SHDCM LOUncompressed predecessor SQSH113040SHDCM LOLossy Compression LO GEMS_GENIE_1 LOWB BONE SL SL UI41.2.840.113619.2.43.16112.2141964.41.61.870888524.19 LO WHOLE BODY !SL "SH #SL $SL` %SL N &SL 'SL *SL ,LO .FD`ff? 0LO WHOLE BODY @LO Patient,The ASL BDA19970806 CTM122538PNCompressedSamples^NM1  LO8NM10DA@CSM LOPNAS DS0.0000000DS0.000000`!SH!LT@LTLO GEMS_GENIE_1 SL SLy LOTc99m LO WHOLE BODY_ELO WHOLE BODY_ESLSLSLFDk@SLSLSLSL#SL'SL(SL0LO WHOLE BODY_E3LOECOR4LOTc99m 5LOPMT 8SLB:SL;FD?<FD>SL ?SLDFD@EFD@FSLUFD?VFD?LO GEMS_GENIE_1FDz@z@SLSLSLSLFDFDQ@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS3 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LTJPEG 2000 irreversible (lossy)(US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US(US(US(SS(SS(!CS01(!DS2097TUSTUST UST!USTSH WHOLE BODY_EOBOQ)R \#"wwwvoongLgLgdPPPEWWWadKakadu-2.2 N-68"Z`ۑp#GMߍUn?03p` "@{Ji/F\E,L0.E$=,h,hTƨ9_pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/JPEG2000.dcm000066400000000000000000000063541515706620200242570ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.3.20040826185059.5457UI1.2.840.10008.1.2.4.91UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS$DERIVED\PRIMARY\WHOLE BODY\EMISSION DA19970911TM125206UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.3.20040826185059.5457 DA20040826!DA19970806"DA19970806#DA199708060TM1850591TM1229312TM1229313TM122931PSH`CSNMdCSWSD pLOGE Medical SystemsLOHospital Name 12345 PNSH-0400 SHgenieacq0LOWhole Body Bone `PNpPNLOMILLENNIUM MG !ST&JPEG 2000 irreversible (lossy) 2097:1 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI.1.3.6.1.4.1.5962.1.1.8.1.1.20040826185059.5457@pSQSH121320SHDCM LOUncompressed predecessor SQSH113040SHDCM LOLossy Compression LO GEMS_GENIE_1 LOWB BONE SL SL UI41.2.840.113619.2.43.16112.2141964.41.61.870888524.19 LO WHOLE BODY !SL "SH #SL $SL` %SL N &SL 'SL *SL ,LO .FD`ff? 0LO WHOLE BODY @LO Patient,The ASL BDA19970806 CTM122538PNCompressedSamples^NM1  LO8NM10DA@CSM LOPNAS DS0.0000000DS0.000000`!SH!LT@LTLO GEMS_GENIE_1 SL SLy LOTc99m LO WHOLE BODY_ELO WHOLE BODY_ESLSLSLFDk@SLSLSLSL#SL'SL(SL0LO WHOLE BODY_E3LOECOR4LOTc99m 5LOPMT 8SLB:SL;FD?<FD>SL ?SLDFD@EFD@FSLUFD?VFD?LO GEMS_GENIE_1FDz@z@SLSLSLSLFDFDQ@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS3 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LTJPEG 2000 irreversible (lossy)(US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US(US(US(SS(SS(!CS01(!DS2097TUSTUST UST!USTSH WHOLE BODY_EOBOQ)R \#"wwwvoongLgLgdPPPEWWWadKakadu-2.2 N-68"Z`ۑp#GMߍUn?03p` "@{Ji/F\E,L0.E$=,h,hTƨ9_pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/JPEGLSNearLossless_08.dcm000066400000000000000000000012041515706620200270460ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.86164008115771185238417434208295286685UI1.2.840.10008.1.2.4.81UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 3.0.0 UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.86164008115771185238417434208295286685(US(CS MONOCHROME2 (US-(US (US(US(US(USOB8 - Wq|/@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/JPEGLSNearLossless_16.dcm000066400000000000000000000013421515706620200270500ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.83170309094709282338053441269889264103UI1.2.840.10008.1.2.4.81UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 3.0.0 UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.83170309094709282338053441269889264103(US(CS MONOCHROME2 (US2(US (US(US(US(USOB 2  M"@@  @ p3 !fZ!D@~̢""""LD"""I P A @ A!@|pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/JPGExtended.dcm000066400000000000000000000231641515706620200253270ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.5.20040826185059.5457UI1.2.840.10008.1.2.4.51UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS$DERIVED\PRIMARY\WHOLE BODY\EMISSION DA19970911TM125206UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.5.20040826185059.5457 DA20040826!DA19970806"DA19970806#DA199708060TM1850591TM1229312TM1229313TM122931PSH`CSNMdCSWSD pLOGE Medical SystemsLOSt. John's Memorial PNSH-0400 SHgenieacq0LOWhole Body Bone `PNpPNLOMILLENNIUM MG !STJPEG lossy 76:1 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI.1.3.6.1.4.1.5962.1.1.8.1.1.20040826185059.5457@pSQSH121320SHDCM LOUncompressed predecessor SQSH113040SHDCM LOLossy Compression LO GEMS_GENIE_1 LOWB BONE SL SL UI41.2.840.113619.2.43.16112.2141964.41.61.870888524.19 LO WHOLE BODY !SL "SH #SL $SL` %SL N &SL 'SL *SL ,LO .FD`ff? 0LO WHOLE BODY @LO BERRA,JAMES ASL BDA19970806 CTM122538PNCompressedSamples^NM1  LO8NM10DA@CSM LOPNAS DS0.0000000DS0.000000`!SH!LT@LTLO GEMS_GENIE_1 SL SLy LOTc99m LO WHOLE BODY_ELO WHOLE BODY_ESLSLSLFDk@SLSLSLSL#SL'SL(SL0LO WHOLE BODY_E3LOECOR4LOTc99m 5LOPMT 8SLB:SL;FD?<FD>SL ?SLDFD@EFD@FSLUFD?VFD?LO GEMS_GENIE_1FDz@z@SLSLSLSLFDFDQ@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS5 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LT JPEG lossy(US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US (US (US(US(US(!CS01(!DS76TUSTUST UST!USTSH WHOLE BODY_EOB C  0:*,"0E=IHD=CBLVn]LQhRBC`ahru{|{J\xny{vG !1AQ2aq"3?P%&lj<\M2Q gW'7\q+?ysb|q9y+(|#lIGs6,~͓H[q~ txx[fܺwDE%_BjNw,RMS*u:l2FYd,eoZ._cw:#~I|EWi g3p쉌Xe)~ѬhWREn|7%^KRח]9y|,ϖ8yVYgRJ׵%x8ffܜnJRwqy m/V`I<&-~rJ[R{c99Vqˬ2X+6tCVί ''R^Wbn RKn\})c<3STO,Wj.XI穄^*J+1乴'Wܪa7 ٢{:9YhhAY:x7V_N^U'IwJ&I*{Vd)/- K-8ŮU+i]\N`){|xn8$rXXE}J,OY!+/˧a$Ɍ2%'.J46KhyɳZ"-[[ڵ#txiv;%ӵt+Us#^l&eʷّ&xZ-L;42F|6d.[NmҼ"ͤO͔~(3iٛ>*x/挪-eCʿ8-kx8dњRϱ?c9 fi6XUFse:YSkE%#ɒf]m_C^6ҋi=Z9&ڕ$9eMox*,jգ'Bb隽Ky=K&;4H٬]++&ӍfΕ∦"[1ޫ i$v.uS&䓩5D4V)VJ,ɞ# t!ShQ[9=EA1٪Z/Y4Q#:o)++tYgmVuomcثybؿ.kE[1X fI,2]0/=FQ(Z:6IJm(#&`Jn7n{:LlI}4~,NF~tqrɪcd}yc0ZaQ-x*XL*|Bڋ'es:9g9_&N2K?6O%2$}̹5k8#.o_}iZ(V蕒p^͒(Td= T)*nt5h{"23*=Sɯ<Ψ$I%ed²(,vg_`Ӈ7^6fQdxlQtE<βyL}&WGQj!U>%YkQr?P)w--KwԼ7w6ֽ<ɫLϚ)ŷWpR !UЧ\։S( z(K$M{ %V=ȢRʡVeKko躟eXg$}^r\{Q/*og_~/Wv+-d"螄-h8>ȦW %TM]:4uueY:HtF3|ɿh+I;WAE^ r@[:-ȅȲ#]{X8Wu*,rk'5ɽ^az(nnnY3 CV WԾ ~xHvU]Y:,aFVi͢]wjؖLkI$"+'xez |ʶ#9K&f͔EaԲ}K/r5QܔhRDz{"W+ؕ=BݰtLuBXч+c7F.ɑ oR( ͣkfze+²YeGy:8יcz.v-(bx-޿/+J gtp ҤygMcf3a-׹Z#hoؽR}A/sn>#<|^eW#H3DY1&G/Y!JGTem7IܬmD%oo!#N>OCxMWC-X˹,K&;/KIe^F';F~Zؾ^®/d7TE3r+`-k/;4w)e ^,TQRTQF`MgT#Imot]Yzʝ` C=<{r7J7B+%&r3tѵv"AI嗕ARNz9VΎ)>6MȚMlB*ɔe"N )$w y~3M"yf gؤRF2mF籗+9ӍupFY3yLm[)7'/mt-0x2~=ټb.%9 Cy7d)#ه&Z6:R19ɜ f[Z5N[1eZ7Ͱ-y_dz1,/V ]e@Z;6^2a_s)2z7fͷ˩@ [6QY3) oMMQx̦mb͖ܤ!ۏF%EL95} YחlǐmTn$Ϣ37l4оpo6ezu~R%nvtZ()@oưlDv0j@/:#hX2~|̀%l7oD٘:c]LͬQ&@&;:x^4ROg<ݲQxT6Fr &;:迿zg;uA%2h+gWlÑή/MUtF{hNڎiu0f tީa ]2Ǝ` 8:t%y3YO̰reݡ(7G&:4trFRe"GL(8oi89{*4YX)ޙG*єX2nA˱MWg<@ e[X-mdIO$Z &zedFEbY30h-H9\*hʋy#Cv@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small.dcm000066400000000000000000000231461515706620200247340ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OW 8ag%=il`C1,;Z6?is0+xJQ\ !).0Ht(Hg}SegnsC+=DeL@[xG+I<v>smo *Kc6S~%pTKObz|G.H\b\IRX&e" ,x{.dqVK @L:z1**^Dt^A<1&B\o6.  pmwH2 /0^[VTt }@sT"(KXU%=&<?A% >LOU~CdJ, 5$-CB6# 5@#,2].3+N#$4Ne1] ,M}tZ93'6' !2! 5b.$#.,s |tt|a4&)  22'51(\Eq-y!nGJ80"  0[@'ZMmVX]U#t} [[Oc6R(9* &0,CKolK+|skrvb<*= %;4.ME_ Py-p~rvgWs9Je4(4B;>llJpUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>_yJ6ENn |:(Q  *,$$*1'<jJh-,gJG1$4W\b[-\=Pq,g 7&!p.W_S)O7nz]ODkW*CN"IPaC ,;Q %b))/D  4Trm@D Z2('F}]\f+(=\LM){:! !Qn|g+P+[0OCA}WTuh>(+g)p%qN  ', M\|Z`l i04z9 yXMJAL  m6 5)  2GokB`g{gO:|=vQcFZS:fs )Wk|MV   7%@j% E(wa}hby\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{YFNS: 7hnF    5gw/>SA4Ef spkR=5B5xPN[  Ssg (Ssny_SeFJXb8(%1"n`?yu% 3BM(!h@7FqxQlWr`IF(!"HrC``<0  133[8# ,,<_m|`    0ckUY"B]O37 hp nQ+C9T[l{ 6  D;gSZC6 :>HTtVcT-d!  SpDD&(  (:?O"9VX7 7Wt?L9=,#&7(OM8HXG ]\ZUDiss[xjJ!!$+%#%(l E<0'm6;xQ$nkB(2 # "m ;>nq/M0U~BC3 % % #5A>>I $]<  .:[E-O8PK!   gZE.9{XX<s@-%2'4DQG@EJ\8 !$=Ms0zK<1 HNB ,)/4S)'(-%v%b]jd.92 y`2h #(;bA9,.#akgBN*e''65(*/H56KA$@V[a7S#DH7*BGOR3(TaO1 =CVBe_";.ITN-9EnU & k i9>$ zzSQE">D@,YEkR# 0#"x!%|-=)k5?NWNO(':gRV=E==QOw7ACkK_OOh\$<c?3K'Q?7D^0x146)3k?XQqIX7G.11GV)?)/:>Q _M\]XU_dZJ$(:3#.A?W_U%k0,]Y~B^cBF4)@% ;*_rjK!Q~olxxFbP'#iO>J==23(- QjoTOZ#)P^Z4!TbH33=(NF'GPnY%Mf9<'emH)533 !tX/f5ThD8MWCv@\wG.33n@?m.{M%}E,3e%8*T+8'w0 r~L*LL:'0;757EqJL)b'Z+?FD 5F qy>;GHr cu~E@42n`&5ZyW:>7QAAc=!][O?_wb#|Yb:_O`dAh"wuiKo`SA 2o,[`t%|KoE W''oiV si6- u8i]O: ?S0}my|kU@7  2 ';^bA~G%]4? *MN@UNnJ# #QU4-WAA#a6GijEstn@ aF,;SyxaG<*c6xhlm* sO4&B8zvqX`MR?& ]IdSr*Yi^OB~ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_RLE.dcm000066400000000000000000000171561515706620200254420ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.5UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OB@       ?8ag%=il`C1,;Z6˦?is0+xJQ\ !).0H?t(Hgׁ}SegnsC+=DeL@[xG+I<v>smo *Kc?6S~%àpTKObz|G.H\b\IRX&e" ,x{.dqVK @?L:z1**^Dt^A<1&B\o6. pmwH2 /?0^[VTt }@sT"(KXU%=&<Ƙ?A% >?LOU~CͷdJ, 5$-CB6# 5@#,2].3+N#$?4Ne1] ,M}˞tZ93'6' !2! 5b.$#.?,s |tt|a4&)  22'51(\Eq?-y!nGJ80" 0[@'ZMmVX]U#t}?ƒ ά[[Oc6R(9* &0,CKЊolK+?|skrvb<*= %;4.ME_ Py-?p~rvgWs9Je4(4B;>lܡl©J?pUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>?_yJ6ENn |:(Q  *,$$*1'(+g)p%qN ', M\|Z`l i04z9 ?yXMJAL  m6 5)  2GokB`g{gO:|=v?QcFZS:fs )Wk|MV   7%@j% E(wa}hb۸y?\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{?YFNS: 7ӡhnF   5gw/>̨SA4Ef spk?R=5B5xPN[  Ssg (Ssny_SeFJX?b8(%1"n`?yu% 3BM(!h@7FqxQlWr`?IF(!"HrC``<0  133[8# ,,<Ə_m|?`   0ckUYѡ"B]O37 hp n?Q+C9T[l{ 6  D;gSZ?C6 :>HTtVcT-d! S?pDD&(  (:?Oʹĸ"9VX矰7 7Wt??L9=,#&7(OM8轳հȽHXG ]羒\ZUDiss[?xjJ!!$+%#%(l E<0'm6;ʪxQ$ꪶ?nkB(2 # "m ;>nq/M0U?~BC3 % % #5A>ãζ>I $]< Ժ .:Ȯ?[E-O8PK!   иɷgZE.9{XĝX$ zz?SQE">D@,YEkR# 0#׫٦"x!%|-=)ӳk5??NWNO(':gRV=E==ѶǸQOw7AعCkK?_OOh\$Q _M\]X?ѲU_dZJ$(:3#.A?W_U%ԾկἬڂk0,]Y~B?泗^cBF4)@% ;*_rjKڳʪǺ˺!Q~olxÞxFbP'#?ЛiO>J==23(- QjoT̶O嵵Z#)P?^Z4!TbH33=(NF՘̲Ь'GPբnY%?Mf9<'emH)533 !øɶDzŅtX/f5ThD8M?WCv@\wG.33濦žǨѹn@?mٻ.{M%?}E,3e%8*԰ĢἜT+8'w0ųֿ? r~L*LL:'0;벭֮ϧ757EqJL)b?'Z+?FDڹõ 5F qy>;GH?r cu~E@42˩n`&5ѥZyW:>7Q?AAc=!ືў][O?_wb#|?YbǼ:ШŦǣ_O`dAh"ߔwuiK?o`SA ᶢɩ۾2o,[`t%|Kɟ̓oE W?''oñȳ˸ȵǾiV ׯʡsi?ⶪʦ6- խȻu8i]O:ﵥד ?S0}m?y|kU@ݿ¬˶±7д  2 ᵘ';?^bA气лʥ~G%]4? *󯋥MN@ȩUˎ?NnJ# #ϷڼQU4-WAA#a6GijE׿stn@ ߼aF,;?SyxaG<*Ƕc6׎ײҳxhlm* sO4ӽ&B8?zvqX`MR?&ͻ ]IեdɣS̯r뿫*ǩYi^OB~ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_bigendian.dcm000066400000000000000000000227541515706620200267400ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.3SHOFFIS_DCMTK_363 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OW 8ag%=il`C1,;Z6?is0+xJQ\ !).0Ht(Hg}SegnsC+=DeL@[xG+I<v>smo *Kc6S~%pTKObz|G.H\b\IRX&e" ,x{.dqVK @L:z1**^Dt^A<1&B\o6.  pmwH2 /0^[VTt }@sT"(KXU%=&<?A% >LOU~CdJ, 5$-CB6# 5@#,2].3+N#$4Ne1] ,M}tZ93'6' !2! 5b.$#.,s |tt|a4&)  22'51(\Eq-y!nGJ80"  0[@'ZMmVX]U#t} [[Oc6R(9* &0,CKolK+|skrvb<*= %;4.ME_ Py-p~rvgWs9Je4(4B;>llJpUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>_yJ6ENn |:(Q  *,$$*1'<jJh-,gJG1$4W\b[-\=Pq,g 7&!p.W_S)O7nz]ODkW*CN"IPaC ,;Q %b))/D  4Trm@D Z2('F}]\f+(=\LM){:! !Qn|g+P+[0OCA}WTuh>(+g)p%qN  ', M\|Z`l i04z9 yXMJAL  m6 5)  2GokB`g{gO:|=vQcFZS:fs )Wk|MV   7%@j% E(wa}hby\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{YFNS: 7hnF    5gw/>SA4Ef spkR=5B5xPN[  Ssg (Ssny_SeFJXb8(%1"n`?yu% 3BM(!h@7FqxQlWr`IF(!"HrC``<0  133[8# ,,<_m|`    0ckUY"B]O37 hp nQ+C9T[l{ 6  D;gSZC6 :>HTtVcT-d!  SpDD&(  (:?O"9VX7 7Wt?L9=,#&7(OM8HXG ]\ZUDiss[xjJ!!$+%#%(l E<0'm6;xQ$nkB(2 # "m ;>nq/M0U~BC3 % % #5A>>I $]<  .:[E-O8PK!   gZE.9{XX<s@-%2'4DQG@EJ\8 !$=Ms0zK<1 HNB ,)/4S)'(-%v%b]jd.92 y`2h #(;bA9,.#akgBN*e''65(*/H56KA$@V[a7S#DH7*BGOR3(TaO1 =CVBe_";.ITN-9EnU & k i9>$ zzSQE">D@,YEkR# 0#"x!%|-=)k5?NWNO(':gRV=E==QOw7ACkK_OOh\$<c?3K'Q?7D^0x146)3k?XQqIX7G.11GV)?)/:>Q _M\]XU_dZJ$(:3#.A?W_U%k0,]Y~B^cBF4)@% ;*_rjK!Q~olxxFbP'#iO>J==23(- QjoTOZ#)P^Z4!TbH33=(NF'GPnY%Mf9<'emH)533 !tX/f5ThD8MWCv@\wG.33n@?m.{M%}E,3e%8*T+8'w0 r~L*LL:'0;757EqJL)b'Z+?FD 5F qy>;GHr cu~E@42n`&5ZyW:>7QAAc=!][O?_wb#|Yb:_O`dAh"wuiKo`SA 2o,[`t%|KoE W''oiV si6- u8i]O: ?S0}my|kU@7  2 ';^bA~G%]4? *MN@UNnJ# #QU4-WAA#a6GijEstn@ aF,;SyxaG<*c6xhlm* sO4&B8zvqX`MR?& ]IdSr*Yi^pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_expb.dcm000066400000000000000000000231661515706620200257540ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OW 8ag%=il`C1,;Z6?is0+xJQ\ !).0Ht(Hg}SegnsC+=DeL@[xG+I<v>smo *Kc6S~%pTKObz|G.H\b\IRX&e" ,x{.dqVK @L:z1**^Dt^A<1&B\o6.  pmwH2 /0^[VTt }@sT"(KXU%=&<?A% >LOU~CdJ, 5$-CB6# 5@#,2].3+N#$4Ne1] ,M}tZ93'6' !2! 5b.$#.,s |tt|a4&)  22'51(\Eq-y!nGJ80"  0[@'ZMmVX]U#t} [[Oc6R(9* &0,CKolK+|skrvb<*= %;4.ME_ Py-p~rvgWs9Je4(4B;>llJpUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>_yJ6ENn |:(Q  *,$$*1'<jJh-,gJG1$4W\b[-\=Pq,g 7&!p.W_S)O7nz]ODkW*CN"IPaC ,;Q %b))/D  4Trm@D Z2('F}]\f+(=\LM){:! !Qn|g+P+[0OCA}WTuh>(+g)p%qN  ', M\|Z`l i04z9 yXMJAL  m6 5)  2GokB`g{gO:|=vQcFZS:fs )Wk|MV   7%@j% E(wa}hby\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{YFNS: 7hnF    5gw/>SA4Ef spkR=5B5xPN[  Ssg (Ssny_SeFJXb8(%1"n`?yu% 3BM(!h@7FqxQlWr`IF(!"HrC``<0  133[8# ,,<_m|`    0ckUY"B]O37 hp nQ+C9T[l{ 6  D;gSZC6 :>HTtVcT-d!  SpDD&(  (:?O"9VX7 7Wt?L9=,#&7(OM8HXG ]\ZUDiss[xjJ!!$+%#%(l E<0'm6;xQ$nkB(2 # "m ;>nq/M0U~BC3 % % #5A>>I $]<  .:[E-O8PK!   gZE.9{XX<s@-%2'4DQG@EJ\8 !$=Ms0zK<1 HNB ,)/4S)'(-%v%b]jd.92 y`2h #(;bA9,.#akgBN*e''65(*/H56KA$@V[a7S#DH7*BGOR3(TaO1 =CVBe_";.ITN-9EnU & k i9>$ zzSQE">D@,YEkR# 0#"x!%|-=)k5?NWNO(':gRV=E==QOw7ACkK_OOh\$<c?3K'Q?7D^0x146)3k?XQqIX7G.11GV)?)/:>Q _M\]XU_dZJ$(:3#.A?W_U%k0,]Y~B^cBF4)@% ;*_rjK!Q~olxxFbP'#iO>J==23(- QjoTOZ#)P^Z4!TbH33=(NF'GPnY%Mf9<'emH)533 !tX/f5ThD8MWCv@\wG.33n@?m.{M%}E,3e%8*T+8'w0 r~L*LL:'0;757EqJL)b'Z+?FD 5F qy>;GHr cu~E@42n`&5ZyW:>7QAAc=!][O?_wb#|Yb:_O`dAh"wuiKo`SA 2o,[`t%|KoE W''oiV si6- u8i]O: ?S0}my|kU@7  2 ';^bA~G%]4? *MN@UNnJ# #QU4-WAA#a6GijEstn@ aF,;SyxaG<*c6xhlm* sO4&B8zvqX`MR?& ]IdSr*Yi^OB~ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_implicit.dcm000066400000000000000000000227461515706620200266330ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2UI1.2.276.0.7230010.3.0.3.6.3SHOFFIS_DCMTK_363 AECLUNIE1 DERIVED\SECONDARY\OTHER 200408261854341.3.6.1.4.1.5962.31.2.840.10008.5.1.4.1.1.4.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 20040826!"018505912P`MRp TOSHIBA_MEC TOSHIBA -0400  000000000 `----p----MRT50H1 CompressedSamples^MR1  4MR10@F  080.0000  SE!NONE"#3DP0.8000 4000.0000 240.00001.0000 63.92433900 H 1 -0000200  V3.51*P25 90QHFS *1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 ,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 4MR1 1 0 1 2-83.9063\-91.2000\6.6406 7*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 R,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 ` @ A0.0000 @ Uncompressed(( MONOCHROME2 (@(@(00.3125\0.3125 (((((((P600 (Q1600 8ag%=il`C1,;Z6?is0+xJQ\ !).0Ht(Hg}SegnsC+=DeL@[xG+I<v>smo *Kc6S~%pTKObz|G.H\b\IRX&e" ,x{.dqVK @L:z1**^Dt^A<1&B\o6.  pmwH2 /0^[VTt }@sT"(KXU%=&<?A% >LOU~CdJ, 5$-CB6# 5@#,2].3+N#$4Ne1] ,M}tZ93'6' !2! 5b.$#.,s |tt|a4&)  22'51(\Eq-y!nGJ80"  0[@'ZMmVX]U#t} [[Oc6R(9* &0,CKolK+|skrvb<*= %;4.ME_ Py-p~rvgWs9Je4(4B;>llJpUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>_yJ6ENn |:(Q  *,$$*1'<jJh-,gJG1$4W\b[-\=Pq,g 7&!p.W_S)O7nz]ODkW*CN"IPaC ,;Q %b))/D  4Trm@D Z2('F}]\f+(=\LM){:! !Qn|g+P+[0OCA}WTuh>(+g)p%qN  ', M\|Z`l i04z9 yXMJAL  m6 5)  2GokB`g{gO:|=vQcFZS:fs )Wk|MV   7%@j% E(wa}hby\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{YFNS: 7hnF    5gw/>SA4Ef spkR=5B5xPN[  Ssg (Ssny_SeFJXb8(%1"n`?yu% 3BM(!h@7FqxQlWr`IF(!"HrC``<0  133[8# ,,<_m|`    0ckUY"B]O37 hp nQ+C9T[l{ 6  D;gSZC6 :>HTtVcT-d!  SpDD&(  (:?O"9VX7 7Wt?L9=,#&7(OM8HXG ]\ZUDiss[xjJ!!$+%#%(l E<0'm6;xQ$nkB(2 # "m ;>nq/M0U~BC3 % % #5A>>I $]<  .:[E-O8PK!   gZE.9{XX<s@-%2'4DQG@EJ\8 !$=Ms0zK<1 HNB ,)/4S)'(-%v%b]jd.92 y`2h #(;bA9,.#akgBN*e''65(*/H56KA$@V[a7S#DH7*BGOR3(TaO1 =CVBe_";.ITN-9EnU & k i9>$ zzSQE">D@,YEkR# 0#"x!%|-=)k5?NWNO(':gRV=E==QOw7ACkK_OOh\$<c?3K'Q?7D^0x146)3k?XQqIX7G.11GV)?)/:>Q _M\]XU_dZJ$(:3#.A?W_U%k0,]Y~B^cBF4)@% ;*_rjK!Q~olxxFbP'#iO>J==23(- QjoTOZ#)P^Z4!TbH33=(NF'GPnY%Mf9<'emH)533 !tX/f5ThD8MWCv@\wG.33n@?m.{M%}E,3e%8*T+8'w0 r~L*LL:'0;757EqJL)b'Z+?FD 5F qy>;GHr cu~E@42n`&5ZyW:>7QAAc=!][O?_wb#|Yb:_O`dAh"wuiKo`SA 2o,[`t%|KoE W''oiV si6- u8i]O: ?S0}my|kU@7  2 ';^bA~G%]4? *MN@UNnJ# #QU4-WAA#a6GijEstn@ aF,;SyxaG<*c6xhlm* sO4&B8zvqX`MR?& ]IdSr*Yi^pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_jp2klossless.dcm000066400000000000000000000135701515706620200274520ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.4.90UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.2.4SH GDCM 2.2.4AEgdcmconvCSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OWOQ)@@@@R \@d(Created by GDCM/OpenJPEG version 2.0 ^~П ?Ph@q i VOo?Qx1~2N@M\\ˊt^ +O|{|DEnj=S6`*yWo2j?UBT)rL3<KLec@[;K?ڷҿDSo(IFÕb/FMX"% h:0Rp00d4G `M`~:wgٚ;I fJnj db$>VcUؽǤ&* o(_L2)`mV_H֒HS&i1)7O=h]Vmc w?0\me#\xYPP/Z1lsMbhZ(U[:kPz;"ܥJҵC'#2ˠo-]?L`lBJ# >C||\ l7hǕyulRM^|)?^ y@'o"2q$WϨQи¤*7ڵAd7N:6:H"mCBڒ~Z"(ԑNc[`y!x@G8ӹʴ#=x%"P3Xn:՝Bf: qY a3fb["{%j!<}lߍr@ £ ˢ&p6d A Xui)vK,JO3NfGi^c]v1?'Ore_>t! }+e'I5p,g)*9ppI$ }6sf(oBM/Ҏ֎Ξ~mJLMfwJ^;vO.19Kl ?CyP4vsVk=Lo^94;LH%:a&Z cgg2rS=4nFdӨߌo \'?jABkBU3<#̢W]8VQۣҢVb}NSR7otwJFЌ\Myj)|UC*U%*wq(*ZXG_&w>9~5ePs?*GwZ2iDN)eYdiBAJ1iV!L"J8z~On6CưQ_TVJGvtE$NSHЀZ$h02 >&RVE>Tc|}ShzI],wVpCdr`lPtleVD|$tޛ2?͐ ]_&XC&nFER&3Y߉&z,.]s#T `̋nLV4)|['LvP$cD@A^M?f3ȋW+hL+>18 Zhxv ߩfqڻd}5zJ2Kڄ^1"!;7 W#X:u2C?ȁeR)@mZ6 *K.:[>ݱt>-MU@6X$t\n,J=(x]?-@̹31jQӯ Jo''F8DcY5kOZ6#`ʟQud+2UbjCv>+Ƶ RD) #'SU# uN=FJU O{1<3E @VenA uHV-F[;k%DFBg }U$_t,VĿv}Oq͑5TbACigp >31;6g gN!~8G!DmWm{f֍_ 4k>gJMv#AN# Ѐm: s|KPҡJϟ]ؼ]i[cܮ@ݳ8:+Asr PS? T0=[$oID! *@QN1ipy@]L *CxLh``n߶ EmSߗ\#ӑIT`_$uf1cЧPU j~pꕓ\=hhLjG9fD *s U?D١v^}^*u+ARo 謖.f-'!<0՘ ``Iv2`5uJpJ;$~Wȏ&7 k & 3NlbCOICj~'˼;'GEQ>ib̓u`UGfcxMǼwꃐ I=/#!/w&;S'v'6:ڴG4jbvTШD2Sտm'>y,-if~Z{R+IƬ%BuG5zOlС+7ف6J\ ́>PJ)%P4dCf͑6W.qtLh:ֳM%\lawNy:FSųlCWB^/*MsTI3jVzPyjgw:`baM *SBUM Q-쎮!:ɋa$ꮐF2TBq<թ|%;a<osWsJu^f)D܊g)zd-GSZx`5=ٞqwwa[k%/(|D| x6Nͅ/cG› ߼uH+0O>gVrq݁bsA]% 5>T4@<m"ݜxT0cuT }QW.A1Rɗ\28xc٭I)T&98S\E鼮"qx+AY]ߑ@MfݢO! W7w1{i0{'L2קf+IT K䋺q)N,{!$a4RU\hǜcjQYDH=11nV/\-<\ܽ1Y }FՐ  |eC^BEENVa Y3ekտ<}s 2!X%ZD??|VohTBDU,ŏxsJ&VմQ=8Tͮo <Vg#rdm_0Kuw4 LX][ X@3׹ |<1c<8 rN7./sˬBOB~ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_jpeg_ls_lossless.dcm000066400000000000000000000137541515706620200303720ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.4.80UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.2.4SH GDCM 2.2.4AEgdcmconvCSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OWN @@ C@8㳱Yޚ!hI$,:xn(Eh̞Ϊ8 D*if;J&29Yg9>3B"*&kačvz޸@kcd4ކSCa BH`0F;nj7aq7Py'L7p& 0tse\7ErMtH/pDP!RKF!  GkGBPa3`GgpZK|E1<*svO-hk0CE0hDh"$]Đ@p~Y:`l 1Ba, 6p&#Dmsb bkC:O<BL V*@adƐ+@9r#F{qf*'( jBU˄o=y ʊVƲ b5c08]'\Ȕ,t l"a:ݠ .N\. cptz8n`FeH)-TCDLC( IP?C6*t6ɒZDarHF$x >Aŵ@H^m:-CIibI xLbhWfQxյ",YTWă؍EP9}m܅J8AZQORA)fUGPtPx\!;0DȦDΛ.D = BzH <[Z!] Yڅ]5%UA0*l%ĥ TbI!ak|*4GmEZ Pgi+G տSaL,TS";sDOѵ;+IٴE NK'h2W]eygH^_g(j9RO r0CX*H $DD܍L.J^*NO!AII'Sx‰K)F#)-CE=-3 ę篣5F֓#;f!NTET&@|N,)XbSA -Ie KEj9c5!I-`l*8U!_4z рхܗcBhM'$U8Wd%-!SoG!hQ;DuwG99>{!}j*￳tm,DTl|L5LluX*ܩ~Kc"n&Uܦ $g$Gk)W^+1SKn }p*ʞ;vxY^q7%p)reo3tP#'9cTXt֏pjCTu5fJRf-KB@(Ag]u4ᔀv̅e BHtuwJ@LX& c{jʨh轩D*35xHnkk4?/nNv^iտKGbNk_I (JC܄E2'ㅣ4x b<##~I1RdMucmY2'YLjN`E2V6>#o!֖sZiM*fLwUSd(L '6E @>4^;HXNa[' ECVC_۷Sɻ(S0^=9E3qVeJJ)lض5s"dޜ&Tv\0´Ղ*g^}y!X_d-J$Ir0d*,7`"n5OaFf$բn 66c;dKd3 9*dZ6D \kON. B1 5{S16,Kʣ}r߮ dmpgP~HW5FC(g1)G $:lpJ!RhQdgXN&1YL+RUTut2SXe$PN׵ƱЋR;@)נldX/524)]D"Ϗ"T۱"cnop)hS7wg1!vHo0QxQ;PN>B& ]Hw{l"ثB=d*bnœ,Zt!ڈ:ǫw6ϩ6InK+es'Q$Ɣp%pCjFZFb25"GTҵ_WmZ.R]K;'S}FƹVkʡC7\gniΡ"jTc~ɯЏ!ㇺl lWʻ C T;ϐ\ 䭛>jjh2'THLBv:݌;/"ǂ2p!g^,mqMDOǝSN-&Ƴ5[$ޭDsb&'ˆ+˜d˛iЉV v8mVr2E>x΅*,62mIl쎥vS̗]iYpDJ;~y+LuK YC‰v2ۄ槝踛1:wfb6qk.)x f{ w%O)Ҭ:/VlmPPd;NL֧I$-!=B\B.Š)2gvp~ EA&syl"QɆ|\kԽPS#_;R!,,3nis˴@송4"u nj,`m:J t=74XO=x#(|pGl]MCީ7Q?/Nڠc+|ՇfrlÛa0 y׊$v3=pJ&b$Q+@ިNhYRP'ŭU=RPs^dƾV?jC<|jK^f->{$>~FFDՅ j(Tl-"PGoUnke^-/凒t4V]nז Ҕ y d;(BsD5 >D4ɝ}acW^{|/CB 5fERbIb_,bSoqX'%TltpU8 NH!ЙE:+E\xqsH[xtSy `ӮÏP?&H3:w= UK7ԥV]sQi_ɭgT{ Ե ]OE;Hu|fn Է)jbJVj~S:)n%U\~v}u:Zz(BbW(DUXv\V5M;(MNJ[CxbKk|00ɱYp&~B4H4wA/ߢ`tVCҫĭg$X(}g 'PU32{ :ȻR4PoSVdᠥ:6p !gG49†(J,ElEgG>\r-;HHW XxeNlPBϹ8Vd8$!q bV<!/óFjqe&  ,LCa Pvk:|0B i..<ݙx}&)bstRr{ $T H-qj:ԲQOY{e>`^Y:qz-[E{LeV$u Ԓ + Hdta8vU76Ɖ$SZQ?bnwɼ83`alyݣtxA4DʱSSW-yƩH&꧓\H.89.賛'&HauL&b%< F$! K,TY1 "5Dܾ5g*5Xkc^" E)@VѪAHkkua -.F&<5ea\`& M9TIU#D1AfpWiڷʂZڛ[L;_D6yJmD(Jԑ IEF LӺBXǓlo9AV0вbv)JHS/}I[L1-SŰv&2"Peɻb?Ғ JPOB~ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_small_padded.dcm000066400000000000000000000233461515706620200262370ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OW 8ag%=il`C1,;Z6?is0+xJQ\ !).0Ht(Hg}SegnsC+=DeL@[xG+I<v>smo *Kc6S~%pTKObz|G.H\b\IRX&e" ,x{.dqVK @L:z1**^Dt^A<1&B\o6.  pmwH2 /0^[VTt }@sT"(KXU%=&<?A% >LOU~CdJ, 5$-CB6# 5@#,2].3+N#$4Ne1] ,M}tZ93'6' !2! 5b.$#.,s |tt|a4&)  22'51(\Eq-y!nGJ80"  0[@'ZMmVX]U#t} [[Oc6R(9* &0,CKolK+|skrvb<*= %;4.ME_ Py-p~rvgWs9Je4(4B;>llJpUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>_yJ6ENn |:(Q  *,$$*1'<jJh-,gJG1$4W\b[-\=Pq,g 7&!p.W_S)O7nz]ODkW*CN"IPaC ,;Q %b))/D  4Trm@D Z2('F}]\f+(=\LM){:! !Qn|g+P+[0OCA}WTuh>(+g)p%qN  ', M\|Z`l i04z9 yXMJAL  m6 5)  2GokB`g{gO:|=vQcFZS:fs )Wk|MV   7%@j% E(wa}hby\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{YFNS: 7hnF    5gw/>SA4Ef spkR=5B5xPN[  Ssg (Ssny_SeFJXb8(%1"n`?yu% 3BM(!h@7FqxQlWr`IF(!"HrC``<0  133[8# ,,<_m|`    0ckUY"B]O37 hp nQ+C9T[l{ 6  D;gSZC6 :>HTtVcT-d!  SpDD&(  (:?O"9VX7 7Wt?L9=,#&7(OM8HXG ]\ZUDiss[xjJ!!$+%#%(l E<0'm6;xQ$nkB(2 # "m ;>nq/M0U~BC3 % % #5A>>I $]<  .:[E-O8PK!   gZE.9{XX<s@-%2'4DQG@EJ\8 !$=Ms0zK<1 HNB ,)/4S)'(-%v%b]jd.92 y`2h #(;bA9,.#akgBN*e''65(*/H56KA$@V[a7S#DH7*BGOR3(TaO1 =CVBe_";.ITN-9EnU & k i9>$ zzSQE">D@,YEkR# 0#"x!%|-=)k5?NWNO(':gRV=E==QOw7ACkK_OOh\$<c?3K'Q?7D^0x146)3k?XQqIX7G.11GV)?)/:>Q _M\]XU_dZJ$(:3#.A?W_U%k0,]Y~B^cBF4)@% ;*_rjK!Q~olxxFbP'#iO>J==23(- QjoTOZ#)P^Z4!TbH33=(NF'GPnY%Mf9<'emH)533 !tX/f5ThD8MWCv@\wG.33n@?m.{M%}E,3e%8*T+8'w0 r~L*LL:'0;757EqJL)b'Z+?FD 5F qy>;GHr cu~E@42n`&5ZyW:>7QAAc=!][O?_wb#|Yb:_O`dAh"wuiKo`SA 2o,[`t%|KoE W''oiV si6- u8i]O: ?S0}my|kU@7  2 ';^bA~G%]4? *MN@UNnJ# #QU4-WAA#a6GijEstn@ aF,;SyxaG<*c6xhlm* sO4&B8zvqX`MR?& ]IdSr*Yi^OB~ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/MR_truncated.dcm000066400000000000000000000226361515706620200256200ustar00rootroot00000000000000II*DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000DS 4000.0000 DS240.0000DS1.0000DS 63.92433900 SHH IS1 ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS(PDS600 (QDS1600OW 8ag%=il`C1,;Z6?is0+xJQ\ !).0Ht(Hg}SegnsC+=DeL@[xG+I<v>smo *Kc6S~%pTKObz|G.H\b\IRX&e" ,x{.dqVK @L:z1**^Dt^A<1&B\o6.  pmwH2 /0^[VTt }@sT"(KXU%=&<?A% >LOU~CdJ, 5$-CB6# 5@#,2].3+N#$4Ne1] ,M}tZ93'6' !2! 5b.$#.,s |tt|a4&)  22'51(\Eq-y!nGJ80"  0[@'ZMmVX]U#t} [[Oc6R(9* &0,CKolK+|skrvb<*= %;4.ME_ Py-p~rvgWs9Je4(4B;>llJpUQjVY] wM5$ ,L:-;ZoV^)MK-'+9Q>_yJ6ENn |:(Q  *,$$*1'<jJh-,gJG1$4W\b[-\=Pq,g 7&!p.W_S)O7nz]ODkW*CN"IPaC ,;Q %b))/D  4Trm@D Z2('F}]\f+(=\LM){:! !Qn|g+P+[0OCA}WTuh>(+g)p%qN  ', M\|Z`l i04z9 yXMJAL  m6 5)  2GokB`g{gO:|=vQcFZS:fs )Wk|MV   7%@j% E(wa}hby\ZD^5-r"cK  . (gsCwHI8YC@W+Q"{YFNS: 7hnF    5gw/>SA4Ef spkR=5B5xPN[  Ssg (Ssny_SeFJXb8(%1"n`?yu% 3BM(!h@7FqxQlWr`IF(!"HrC``<0  133[8# ,,<_m|`    0ckUY"B]O37 hp nQ+C9T[l{ 6  D;gSZC6 :>HTtVcT-d!  SpDD&(  (:?O"9VX7 7Wt?L9=,#&7(OM8HXG ]\ZUDiss[xjJ!!$+%#%(l E<0'm6;xQ$nkB(2 # "m ;>nq/M0U~BC3 % % #5A>>I $]<  .:[E-O8PK!   gZE.9{XX<s@-%2'4DQG@EJ\8 !$=Ms0zK<1 HNB ,)/4S)'(-%v%b]jd.92 y`2h #(;bA9,.#akgBN*e''65(*/H56KA$@V[a7S#DH7*BGOR3(TaO1 =CVBe_";.ITN-9EnU & k i9>$ zzSQE">D@,YEkR# 0#"x!%|-=)k5?NWNO(':gRV=E==QOw7ACkK_OOh\$<c?3K'Q?7D^0x146)3k?XQqIX7G.11GV)?)/:>Q _M\]XU_dZJ$(:3#.A?W_U%k0,]Y~B^cBF4)@% ;*_rjK!Q~olxxFbP'#iO>J==23(- QjoTOZ#)P^Z4!TbH33=(NF'GPnY%Mf9<'emH)533 !tX/f5ThD8MWCv@\wG.33n@?m.{M%}E,3e%8*T+8'w0 r~L*LL:'0;757EqJL)b'Z+?FD 5F qy>;GHr cu~E@42n`&5ZyW:>7QAAc=!][O?_wb#|Yb:_O`dAh"wuiKo`SA 2o,[`t%|KoE W''oiV si6- u8i]O: ?S0}my|kU@7  2 ';^bA~G%]4? *MN@UNnJ# #QU4-WAA#a6GijEstn@ aF,;SyxaG<*c6xhlm* sO4&B8zvqX`MR?& ]Ipydicom-pydicom-20aa4b7/src/pydicom/data/test_files/README.txt000066400000000000000000000371001515706620200242320ustar00rootroot00000000000000Test Files used for testing pydicom 2020-06 Many files were moved to an external data store, and are downloaded as needed. ----------------------------------- I obtained images to test the pydicom code, and revised them as follow: * images were often downsized to keep the total file size quite small (typically <50K-ish). I wanted unittests for the code where I could run a number of tests quickly, and with files I could include in the source (and binary) distributions without bloating them too much * In some cases, the original files have been binary edited to replace anything that looks like a real patient name I believe there is no restriction on using any of these files in this manner. First, which transfer syntax the files are: ExplVR_BigEnd.dcm : Expl VR Big Endian ExplVR_BigEndNoMeta.dcm : Expl VR Big Endian MR_small_bigendian.dcm : Expl VR Big Endian color-pl.dcm : Expl VR Little Endian color-px.dcm : Expl VR Little Endian CT_small.dcm : Expl VR Little Endian ExplVR_LitEndNoMeta.dcm : Expl VR Little Endian image_dfl.dcm : Expl VR Little Endian JPEG-LL.dcm : Expl VR Little Endian JPEG-lossy.dcm : Expl VR Little Endian JPEG2000.dcm : Expl VR Little Endian liver.dcm : Expl VR Little Endian MR_small.dcm : Expl VR Little Endian OBXXXX1A.dcm : Expl VR Little Endian reportsi.dcm : Expl VR Little Endian test-SR.dcm : Expl VR Little Endian explicit_VR-UN.dcm : Expl VR Little Endian UN_sequence.dcm : Expl VR Little Endian MR_small_implicit.dcm : Impl VR Little Endian nested_priv_SQ.dcm : Impl VR Little Endian no_meta_group_length.dcm: Impl VR Little Endian OT-PAL-8-face.dcm : Impl VR Little Endian priv_SQ.dcm : Impl VR Little Endian rtdose.dcm : Impl VR Little Endian rtplan.dcm : Impl VR Little Endian rtplan_truncated.dcm : Impl VR Little Endian rtstruct.dcm : Impl VR Little Endian 693_*.dcm * Regression datasets for issue #693 * JPEG2000, JPEG2000Lossless and uncompressed versions * Mismatch between BitsStored and sample bit depth bad_sequence.dcm * Anonymized test dataset for issue #1067, provided by @sylvainKritter * JPEGLossless:Non-hierarchical-1stOrderPrediction * contains invalid sequence (encoded as Implicit Little Endian) with VR "UN" CT_small.dcm * CT image, Explicit VR, LittleEndian * Downsized to 128x128 from 'CT1_UNC', ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ eCT_Supplemental.dcm * Original filename CT0012 * Taken from ftp://medical.nema.org/medical/dicom/Multiframe/CT/nemamfct.images.tar.bz2 * 2 frames, 16 bits allocated/stored, MONOCHROME2 * Enhanced CT with supplemental (at IV 1024) 16-bit palette colour LUT data GDCMJ2K_TextGBR.dcm (from GDCM) * JPEG 2000 Lossless transfer syntax * Contains non-conformant Pixel Data with a JP2 header * unsigned 8-bit, 3 samples/px, YBR_RCT Photometric Interpretation J2K_pixelrep_mismatch.dcm * Dataset from issue 1149 * J2K data is unsigned, Pixel Representation 1 * Bits Stored is 13 MR_small.dcm * MR image, Explicit VR, LittleEndian * Downsized to 64x64 from 'MR1_UNC', ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ * Explicit VR big endian version created using DCMTK's dcmconv for PR #714 MR_small_implicit.dcm * The same dataset as MR_small, saved with Implicit VR using dcmodify MR_small_bigendian.dcm * The same dataset as MR_small, saved as Big Endian using dcmodify MR2_*.dcm * JPEG2000, JPEG2000Lossless and uncompressed versions * unsigned 16-bit/12-bit with rescale and windowing * From ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04 JPGExtended.dcm * 1.2.840.10008.1.2.4.51 - JPEG Extended * Fixed version of JPEG-lossy.dcm JPGLosslessP14SV1_1s_1f_8b.dcm * 1.2.840.10008.1.2.4.70 - JPEG Lossless, Process 14, Selection Value 1 * 1 sample/px, 1 frame, 8-bits stored, monochrome2 JPEG2000.dcm and JPEG2000_UNC.dcm (uncompressed version) * JPEG 2000 small image * to test JPEG transfer syntax, eventually JPEG decompression * Edited 'NM1_J2KI' from ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04 image_dfl.dcm * Compressed (using "deflate" zlib compression) after FileMeta * 'image_dfl' from http://www.dclunie.com/images/compressed/ gdcm-US-ALOKA-16.dcm (from GDCM) * Little endian implicit * Segmented 16-bit Palette Color LUT Data * Modified to remove original patient name and ID from Pixel Data gdcm-US-ALOKA-16_big.dcm (from GDCM) * Big endian implicit version of gdcm-US-ALOKA-16.dcm * Converted to big endian using DCMTK's dcmodify +tb ExplVR_BigEnd.dcm * Big Endian test image * Also is Samples Per Pixel of 3 (RGB) * Downsized to 60x80 from 'US-RGB-8-epicard' at http://www.barre.nom.fr/medical/samples/ JPEG-LL.dcm * NM1_JPLL from ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ * Transfer Syntax 1.2.840.10008.1.2.4.70: JPEG Lossless Default Process 14 [Selection Value 1] JPEG-lossy.dcm * NM1_JPLY from ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ * 1.2.840.10008.1.2.4.51 Default Transfer Syntax for Lossy JPEG 12-bit * GDCM prints when reading this file: "Unsupported JPEG data precision 12" and "Invalid SOS parameters for sequential JPEG", although it does appear to be read properly JPEG2000-embedded-sequence-delimiter.dcm * A copy of JPEG2000.dcm, with 4 of the encoded pixel data bytes replaced with the Sequence Delimiter * Almost certainly not a valid JPEG anymore, but the DICOM structure is valid * Used to reproduce #1140. liver.dcm * The DICOM SEG example was generated using the dcmqi library: https://github.com/qiicr/dcmqi * Provided by Andrey Fedorov (@fedorov) * Explicit VR big endian versions created using DCMTK's dcmconv and a script used to fix the pixel data for PR #714 * Single frame versions created using a script for PR #714 mlut_18.dcm * Modality LUT Sequence * One of the IHE (https://wiki.ihe.net/index.php/Main_Page) MESA display test images no_meta.dcm * Same as CT_small.dcm with no File Meta Information header UN_sequence.dcm * Contains only one private sequence with VR UN * Provided by @naterichman to reproduce issue #1312 Created by a commercial radiotherapy treatment planning system and modified: rtplan.dcm Implicit VR, Little Endian rtdose.dcm Implicit VR, Little Endian * Explicit VR big endian version created using DCMTK's dcmconv and the pixel data corrected using script for PR #714 * Single frame version created using a script for PR #714 * RLE encoded versions created using GDCM's gdcmconv for PR #708 chr*.dcm * Character set files for testing (0008,0005) Specific Character Set * from http://www.dclunie.com/images/charset/SCS* * downsized to 32x32 since pixel data is irrelevant for these (test pattern only) empty_charset_LEI.dcm * Dataset with empty Specific Character Set, regression dataset for #1038 * provided by @micjuel test-SR.dcm * from ftp://ftp.dcmtk.org/pub/dicom/offis/software/dscope/dscope360/support/srdoc103.zip, file "test.dcm" * Structured Reporting example, many levels of nesting priv_SQ.dcm * a file with an undefined length SQ item in a private tag. * minimal data elements kept from example files in issues 91, 97, 98 OBXXXX1A.dcm * a file with a Photometric Interpretation of PALETTE COLOR * used to check if to pixel_array is interpreted correctly for such a case * taken from https://github.com/pydicom/pydicom/issues/205#issuecomment-103329677 * supposedly from a Philips machine * Explicit VR big endian version created using DCMTK's dcmconv * 2 frame version created using a script for PR #714 * RLE encoded versions created using GDCM's gdcmconv for PR #708 OT-PAL-8-face.dcm * a file with a Photometric Interpretation of PALETTE COLOR * used to check if to pixel_array is interpreted correctly for such a case * taken from http://www.barre.nom.fr/medical/samples/ RG1_*.dcm * JPEG2000, JPEG2000Lossless and uncompressed versions * unsigned 16-bit/15-bit with windowing * From ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04 RG3_*.dcm * JPEG2000, JPEG2000Lossless and uncompressed versions * unsigned 16-bit/10-bit with windowing * From ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04 SC_rgb*.dcm * 16 and 32 bit versions created using a script for PR #714 * Explicit VR big endian version created using DCMTK's dcmconv and the pixel data corrected using script for PR #714 * 2 frame versions created using a script for PR #714 * RLE encoded versions created using GDCM's gdcmconv for PR #708 SC_rgb_small_odd*.dcm * 3x3 pixel version added for PR #601 * Big Endian version added for PR #1687 SC_jpeg_no_color_transform.dcm * 8-bit baseline JPEG compressed in RGB color space without transformation into YCbCr color space * Individual tile of a TCGA whole slide image in Aperio SVS format obtained from TCIA * Created for PR #878 using DCMTK's img2cdm script with the value of the Photometric Interpretation element patched SC_jpeg_no_color_transform_2.dcm * 8-bit baseline JPEG compressed in RGB color space without transformation into YCbCr color space * Individual tile of a TCGA whole slide image in Aperio SVS format obtained from TCIA with APP14 marker segment included in JPEG header * Created for PR #878 using DCMTK's img2cdm script with the value of the Photometric Interpretation element patched SC_ybr_full_uncompressed.dcm * Uncompressed version of SC_rgb_dcmtk_+eb+cy+n2.dcm using gdcmconv * PhotometricInterpretation is YBR_FULL SC_ybr_full_422_uncompressed.dcm * Uncompressed version of SC_rgb_dcmtk_+eb+cy+n2.dcm using gdcmconv * Converted to YBR_FULL_422 using a script by @scaramallion * PhotometricInterpretation is YBR_FULL_422 US1_*.dcm * JPEG2000, JPEG2000Lossless and uncompressed versions * unsigned 3 channel 8-bit/8-bit * From ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04 vlut_04.dcm * VOI LUT Sequence * One of the IHE (https://wiki.ihe.net/index.php/Main_Page) MESA display test images zipMR.gz * a gzipped version of MR_small.dcm * used for checking that deferred read reopens as zip again (issue 103) explicit_VR-UN.dcm * taken from test data in issue #968 * original image taken from https://www.cancerimagingarchive.net, (freely available de-identified datasets) * image was compressed using "gdcmconv --j2k " * almost all tags have VR "UN" due to gdcmconv issue == Examples Datasets == * examples_jpeg2k.dcm: identical to US1_J2KR.dcm * examples_overlay.dcm: MR-SIEMENS-DICOM-WithOverlays.dcm with cropped Pixel Data and Overlay Data * examples_palette.dcm: OBXXXX1A.dcm with cropped Pixel Data * examples_rgb_color.dcm: US1_UNCR.dcm with cropped Pixel Data * examples_ybr_color.dcm: color3d_jpeg_baseline.dcm with reduced frames and rescaled Pixel Data == DICOMDIR tests == dicomdirtests files were from https://www.pcir.org, freely available image sets. They were downsized to 16x16 images to keep them very small so they could be added to the source distribution without bloating it. For the same reason, many were removed, leaving only samples of the studies, series, and images. For the subdirectories ending in "N" (e.g. CT2N, CT5N), the name indicates the number of images inside the folder, i.e. CT2N has two images, CT5N has five. This was a memory-aid for use in unit tests. Below is the hierarchy of Patient, Study, Series, Images that comes from a straight read of the dicomdirtests DICOMDIR file. The DICOMDIR file itself was created using the dcmtk program dcmgpdir. It complained about different Specific Character Set in some of the files, so some with 2022 IR6 were set to ISO_IR 100. Patient: 77654033: Doe^Archibald Study 2: 20010101: XR C Spine Comp Min 4 Views Series 1: CR: (1 image) ['./77654033/CR1/6154'] Series 2: CR: (1 image) ['./77654033/CR2/6247'] Series 3: CR: (1 image) ['./77654033/CR3/6278'] Study 2: 19950903: CT, HEAD/BRAIN WO CONTRAST Series 2: CT: (4 images) ['./77654033/CT2/17106', './77654033/CT2/17136', './77654033/CT2/17166', './77654033/CT2/17196'] Patient: 98890234: Doe^Peter Study 2: 20010101: Series 4: CT: (2 images) ['./98892001/CT2N/6293', './98892001/CT2N/6924'] Series 5: CT: (5 images) ['./98892001/CT5N/2062', './98892001/CT5N/2392', './98892001/CT5N/2693', './98892001/CT5N/3023', './98892001/CT5N/3353'] Study 428: 20030505: Carotids Series 1: MR: (1 image) ['./98892003/MR1/15820'] Series 2: MR: (1 image) ['./98892003/MR2/15970'] Study 134: 20030505: Brain Series 1: MR: (1 image) ['./98892003/MR1/4919'] Series 2: MR: (3 images) ['./98892003/MR2/4950', './98892003/MR2/5011', './98892003/MR2/4981'] Study 2: 20030505: Brain-MRA Series 1: MR: (1 image) ['./98892003/MR1/5641'] Series 2: MR: (3 images) ['./98892003/MR2/6935', './98892003/MR2/6605', './98892003/MR2/6273'] Series 700: MR: (7 images) ['./98892003/MR700/4558', './98892003/MR700/4528', './98892003/MR700/4588', './98892003/MR700/4467', './98892003/MR700/4618', './98892003/MR700/4678', './98892003/MR700/4648'] == Overlay Data == MR-SIEMENS-DICOM-WithOverlays.dcm (from GDCM) * Little Endian Explicit VR * Single frame, single channel Pixel Data * Single frame Overlay Data in group 0x6000 * Icon Image Sequence * 8-bit Palette Color LUT == ICC Profiles == * crayons.icc ICC profile from https://github.com/mm2/Little-CMS (MIT License) == Licenses == The datasets from GDCM (github.com/malaterre/GDCM) are used under the following license: Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2016 Mathieu Malaterre Copyright (c) 1993-2005 CREATIS (CREATIS = Centre de Recherche et d'Applications en Traitement de l'Image) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither name of Mathieu Malaterre, or CREATIS, nor the names of any contributors (CNRS, INSERM, UCB, Universite Lyon I), may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_jpeg_no_color_transform.dcm000066400000000000000000000103341515706620200305200ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI21.2.276.0.7230010.3.1.4.0.35989.1606514566.150781UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.5SHOFFIS_DCMTK_365 CS ISO_IR 100UI1.2.840.10008.5.1.4.1.1.7UI21.2.276.0.7230010.3.1.4.0.35989.1606514566.150781 DA0TMPSHdCSWSD PNPN LO0DA@CS UI21.2.276.0.7230010.3.1.2.0.35989.1606514566.150780 UI21.2.276.0.7230010.3.1.3.0.35989.1606514566.150779 SH IS IS CS(US(CSRGB (US(US(US(US(US(US(US(!CS01(!CS ISO_10918_1 OB C        }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?5Z5(Z((9(((((>v((((((((((((((4QEsFFqތ:QEQEQEQS֊((((((((((((((((((((4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE(=(RQE-Q(((i]AO((((((((((=hh((((((((((((((((((((QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE((}h4sj((srO$QEQEQEQEQEQEQEQ3Fh((J;E袊(((((@=hO_z02HQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQGEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQH3yH3–Z((((( EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE((‘Pe2}OPnv 2IN#2˰ r}xQER()h>QE(((=(((QEQEQEQEQEQEQEPhoJ19?J((((R()EQEw=@ڐzQE-QEQEQEQEQEQEQEQEQEQEf(((((ҀAQs@z{EZ(ORE}(Z((((((((((((((((((((ў(QJ(QEQEPh(((((>QEQEQEh((((((((((4);QG4QEQڏҊ)MRQE-QEPFF3qHy8Z((((((((((4QEQEQEQEQEQEQHh(@(Z(QEQGZ>Q(((4QEQEQEQEQEQEQEQEQEQEP(((8##֊)(((QEP((((((((((((w((((>}(9EU[6P9829S,u-Nq!1+*Jqi7 aHʣxsW*ɢ;(QEQEQEQEQEQEQEQEQEQEQEQEQEQEv:EQEQEQEQG֊((EQKEQEJ((((GZ(((((3EQEQEQEQEQ;EQEQEQEQEQEPz) QP$@=:9֊ZZ()(((h(((4QEQEQEQEQEwE- $b6 bX---QEQEQ@((EQIEQAJ(HrĂr=NX䓓ǵ---Ph fE(((((( QEQEQEGj91EQEQGJ(4A8c8)h((((4QEQEQEQEQEQGJ((((((((QEQEf((;gR>}(Z(EQEQEQE('ҊLRQEQE(((QEQEQEQEQEQG4QGҊ(((Rfi3KE-QEQEfRh((((Z(撏’Z((((((((((( %R(EPhzQ뎴QEQGz)&sёږ(QE%PiMbZ((((=袊(QEQEQEQEQEQGNQEQIEQE(ރJ((((Ph((EQEQEQEQEQEQEQEQƊ(9ёAQEQ(()(=(((EQ׭QEQGҌEQEQEQEQEQEQEQE{QEQEQU주0d%YG!]gs[>;g/L*BUkkvy,ʐr3l}bU (KMV[cp~m>Zj69LKEt )EQERuږZ(($? I'? d'QEEP(((((>QEQEQQE-QEQEёEQ@@EIIEEh0J(>}h(=:FGZB8QEQEQEtEQEQEQEQEQEQEQEQHh((IE%-( RQEޏRQQIEQEQK@((((EQEQEQEQEQEpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_jpeg_no_color_transform_2.dcm000066400000000000000000000103261515706620200307420ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.98830244104132507426674272067370279168UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.5SHOFFIS_DCMTK_365 CS ISO_IR 100UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.98830244104132507426674272067370279168 DA#DA202107170TMPSHdCSWSD PNPN LO0DA@CS UI@1.2.826.0.1.3680043.8.498.32735210998394320925122197129876886444 UI@1.2.826.0.1.3680043.8.498.13012310880988753011051759601908007359 SH IS IS CS(US(CSRGB (US(US(US(US(US(US(US(!CS01(!CS ISO_10918_1 OBJ AdobeeC    #%$""!&+7/&)4)!"0A149;>>>%.DIC; }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((RE%REQEQEQEQEQERQE-QEQEQEQEQEQEQEQEQEQEQEQIE%-QERQEQERKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQIIE"l `>fɤsKK֖;QKKEQEQEQE%QIEQIEQEQE%REQEQEQEQEQEQEQEQEQE%RE%REQEQEQEQEQEQE&9&9'zZZZ((w^)m>R4QEQEQEREQEQEQERQE-QEQEQEQEQEQERRQKKEQEQEQEQEQEQE tQEQEQEQEQEQEQEQEQEQEQIIE--QEQEQEQEQEQEQEQIIE--QEQIdgқsdgSih((((((((((():Rt(((((((()R7㚏O3xv>RRQFyREQEQEQEQEQEQERE RgBN2))iih((((((@r2)dRREQEQERRQE-RQKKEQEQEQEQERQE-QEQEQEQEQEQEQEQEQEQEQE%%RKIEQE- 52[i (B(Z()((((((yD1 qQ\L y d3*+)̛@n$cyX"`H"ժ('l`tV8ސO(Z((((J( (()(((ZJ(ZZ((()CVʮXdԄ0zP)@(((((((((((JJ((Z)hJ*b ?-Vme/)y;(PMrfoAS!b2*evWq0ڝOQE ֑:\98-:(((((((((((((((J)(4QEQEqIEQEƍY1G`r) rE:KKKEQEQEQEQEQE 6{RӇNiiih) !8E--QE%%QERQE-QE%%RKEQEQEQIEQE-RQE-QEQERfZZ((())3E--QE%'֒(((((()hZZ((((((b94@ɤHOwE--襥T Md OUH@${SԴQEQEQEQE%%bIqjbA\b>KIIE--QEQEREb)h)Fr ;j4cd?N)YsRS((((((((((((J)ԑdԴu--QKEQEQE%M֒[rFܹ(#4QEQEQIEQER`R`dZ)ih((((((Z(()0RKEQERKERE%REQIE%RIEQEQEQKEQEQEQEQEQEQEQEQERQE-QEQKE-RRQKKEQEQIEQIER)(((((((((((('t%---QERRQ@u9PGSJ)ih(3)ih((())(()9JNQEQERwE--QEQEQEQEQEQEQE%QIEQKKEQE%RE%QERqHA#(Z)h(Z(((((((((J(())()ih(Z()()h(Z((((((((((((());ERE%REQIEQE-QERKIE%-QERRQKKEQEQEQEQEQEQE%'z)ih((J))h(RE%RE%REQEQEQKEQEQEQEQIHs %5#wˏJjF~\vvNO~)u%%QEQEQEQEQEQERRQKKE%QIފZ((Z)((()h)h(((((((Z((((()(J)ih(Z((()()()j@A;RRIEQEQEQEQEQEQKEQEQEQE%%QIEQE--QE%%QEQKE%QIE--QEQIERQKKE1p{o(G p饀`9 wC edbkeZmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9edSv[M/pM@h,wVM7x~Շtr<quaaxw]X}7@^,VM7x~Շtr<quaZ7dgk>AvNvv `<>X"+SE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ `<>KiSE+d-s*B<+6<+-s*<+-s*<+-s*<+-s*<+-s*<+`~͉eB\ؖT+p 6% !sbYP'\ؖT+p͉eB@ sbYP6% ~͉eB\ؖT+p 6% !sbYP'\ؖT+p@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+n2.dcm000066400000000000000000000060221515706620200272040ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5846.1512159596.457896UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5846.1512159596.457896 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STVLossy compression with JPEG baseline, IJG quality factor 90, compression ratio 21.521 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSYBR_FULL(US(USd(USd(0DS1.0\1.0 (US(US(US(US(!CS01(!DS21.521(!CS ISO_10918_1 OBrJFIFC     C   dd! ( UVcf + SdQRae ?΀S5 dI*׼@D{YQof+У@D{ dI*׼Tu~jWG%ZȒUx70ԮBJ1$^Qoa\>"2$k c"IV⣫LR} 8D dI*׼@D{GW龙ppȒUx_fQIϻD鹳G^qg?٣8ϻC>9QׇF}sq76h&?3ϻAGq5w}s ͚<sf(k'ed/'q"qh$f!ۆ_N2w Ȱwz3 HC ed`fţnY;;p7"3GQ#12wvnEјgFbed/'p܋w0-D;pX;qh$f]@U79Ohݓ jWG h s؟ ѻ';;]ppѻ';;] s؟ jWGh s؟ ѻ';;]ppѻ';;] s؟ jWGh s؟ ѻ';;]ppѻ';;]ԮB(`<>Xnl2nX}4yE[}5xQV5x `<>GU`<>XnlnX}4yE[}sf(w3d-s*B<+YZT%pyeBW!kYP \yeBWZT%p \!kYPZT%pyeBW!kYP@ 6% !sbYP\ؖT+p͉eB!sbYP6% ͉eB\ؖT+p6% !sbYP\ؖT+p͉eB!sbYPT?pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+np.dcm000066400000000000000000000061041515706620200273030ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5841.1512159572.899535UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5841.1512159572.899535 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STVLossy compression with JPEG baseline, IJG quality factor 90, compression ratio 20.833 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CS YBR_FULL_422(US(USd(USd(0DS1.0\1.0 (US(US(US(US(!CS01(!DS20.833(!CS ISO_10918_1 OBJFIFC     C   dd" ( UVcf - QRTce ?1$^J*'ki :+`1$^JӢ8 m/b iJ1$^m:#:+`1$^JӢ8 m/b iJ1$^m:#:+`1$^JӢ8 m/b iJtG-uW1ϻGt;p!ۆ_N}k])\Zmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9 wC edbkeZmi{^>9edSv[M/pM@h,wVM7x~Շtr<quaaxw]X}7@^,VM7x~Շtr<quaZ7dgk>AvNvv `<>X"+SE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ ѻ';;]nKiSE'-s؟ `<>KiSE+d-s*B<+6<+-s*<+-s*<+-s*<+-s*<+-s*<+`~͉eB\ؖT+p 6% !sbYP'\ؖT+p͉eB@ sbYP6% ~͉eB\ؖT+p 6% !sbYP'\ؖT+p@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+s2.dcm000066400000000000000000000060261515706620200272150ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5845.1512159590.949379UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5845.1512159590.949379 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STVLossy compression with JPEG baseline, IJG quality factor 90, compression ratio 21.521 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CS YBR_FULL_422(US(USd(USd(0DS1.0\1.0 (US(US(US(US(!CS01(!DS21.521(!CS ISO_10918_1 OBrJFIFC     C   dd! ( UVcf + SdQRae ?΀S5 dI*׼@D{YQof+У@D{ dI*׼Tu~jWG%ZȒUx70ԮBJ1$^Qoa\>"2$k c"IV⣫LR} 8D dI*׼@D{GW龙ppȒUx_fQIϻD鹳G^qg?٣8ϻC>9QׇF}sq76h&?3ϻAGq5w}s ͚<sf(k'ed/'q"qh$f!ۆ_N2w Ȱwz3 HC ed`fţnY;;p7"3GQ#12wvnEјgFbed/'p܋w0-D;pX;qh$f]@U79Ohݓ jWG h s؟ ѻ';;]ppѻ';;] s؟ jWGh s؟ ѻ';;]ppѻ';;] s؟ jWGh s؟ ѻ';;]ppѻ';;]ԮB(`<>Xnl2nX}4yE[}5xQV5x `<>GU`<>XnlnX}4yE[}sf(w3d-s*B<+YZT%pyeBW!kYP \yeBWZT%p \!kYPZT%pyeBW!kYP@ 6% !sbYP\ؖT+p͉eB!sbYP6% ͉eB\ؖT+p6% !sbYP\ؖT+p͉eB!sbYPT?pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_dcmtk_+eb+cy+s4.dcm000066400000000000000000000065341515706620200272230ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5844.1512159582.459743UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5844.1512159582.459743 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STVLossy compression with JPEG baseline, IJG quality factor 90, compression ratio 17.401 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSYBR_FULL(US(USd(USd(0DS1.0\1.0 (US(US(US(US(!CS01(!DS17.401(!CS ISO_10918_1 OBJFIFC     C   dd ( UVcf + SdQRae ?΄02$kzʎ}35\>"2$k*:M5+У@D{GW龙ppȒUx70ԮBJ_fQ c"IV⣫LR} 8D dI*׼Tu~jWG%Z}3 J(1$^Qoa\>"2$k*:M5+У@D{GW龙ppȒUx70ԮBJ_fQI:nl9ׇF}s ͚<4yG^q76h&?3nlMxg?٣8ϻAGq5wsf(k#>9QׇF}s ͚<4yG^q76h&?3nlMxC LJ܋w3PYţnY;X;qh$f!ۆ_NFaZ:vnEјgFbed`fţnY;X;qh$f!ۆ_NFaZ:vnEјgFbed`fţnY;X;qh$f!ۆ_NFaZ:vnEјgFbed`fţuB P79Oppmѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppF> ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚<͐,JV} \yeBW!kYPZT%p \yeBW!kYPZT%p \yeBW!kYPZT%p ʅnBIJ[,V.lK* ʅnBIJ[,V.lK* ʅnBIJ[,V.lK* ʅnpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_gdcm_KY.dcm000066400000000000000000000056661515706620200257710ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.2.1143.6875239556533580236016485668630680938UI1.2.840.10008.1.2.4.91UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.6.3SH GDCM 2.6.3AEgdcmconvCS ISO_IR 192CSDERIVED \SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.2.1143.6875239556533580236016485668630680938 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STlossy conversion!SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQSH121320SHDCM LOUncompressed predecessor SQSH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(USd(USd(0DS1.0\1.0 (US(US(US(US(US(US(!CS01(!DS23.6220472440945OBOQ/ddddR \@@HHPHHPHHPHHPHHPd(Created by GDCM/OpenJPEG version 2.0 sS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPx8h{GM$sPnxpG]хXzE8x5)SΫD)( `2ʖPo, n'F%j@ (ZQw/rdRsvUWB"'92͆ Bsh{> (zt| GA wMSa[o$tQ1rzWR +T˒O̒Avǿ)7Ǡ@mh>=F]üaa!ޘU-%Jɑzk0+sjR?`ۆl2T@HV/^Q[>=FťSUoQ;$I/1@>yudb$j+<(1d1q0P*PIUUUO66h$ g=F޲j&uiLjʥ@|fIJ? MK574hTdyu+cbNw8l2T,-hbB_K"U)= "=[ `NcB{ ` kT!mݜ8/'n%@iiF*D[vx# 溔픻C]c>ܘHB`bߛi2N4|_7KN5TZ/z0zH@7dX0Y {< JQBbdaD|&;vsi-+,-` $$M0^HK do0J*&9]|S+@ $W ؀ $$%XBQ߰ D $"& 0yO ~Nw 0yO ~Nh&a߹Jv.a E!#;A9B^0%a ʝa!/nB#0za ԝ!/nB a!/nA;B^pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_jls_lossy_line.dcm000066400000000000000000000021141515706620200274650ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.38415045543282514992782840218948293430UI1.2.840.10008.1.2.4.81UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 3.0.0 UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.38415045543282514992782840218948293430(US(CSRGB (US(USd(USd(US(US(US(USOB SPIFFdd %%dd W~|%@#`_%@ ` 2@!x?|@9@9@9xpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_jls_lossy_sample.dcm000066400000000000000000000021421515706620200300200ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.35129940130895238772240045385911100427UI1.2.840.10008.1.2.4.81UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 3.0.0 UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.35129940130895238772240045385911100427(US(CSRGB (US(USd(USd(US(US(US(USOB SPIFFdd %%dd v@?N18br` 4$$%@ipydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_jpeg.dcm000066400000000000000000000105601515706620200253660ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.13002811185086637637347356263722492924UI1.2.840.10008.1.2.4.50UI1.2.826.0.1.3680043.9.7433.1.1SHhighdicom v0.1.0DERIVED\SECONDARY\OTHER 1.2.840.10008.5.1.4.1.1.7@1.2.826.0.1.3680043.8.498.13002811185086637637347356263722492924 #2020021703030308.056021 P`OTdDIpdebug  0@ @1.2.826.0.1.3680043.8.498.13331179108403236084039838123417806584 @1.2.826.0.1.3680043.8.498.12890021624762486737912713647647328339  1 1 ((RGB ((((((((!01(!10(! ISO_10918_1  AdobeC        }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?5Z5(Z((9(((((>v((((((((((((((4QEsFFqތ:QEQEQEQS֊((((((((((((((((((((4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE(=(RQE-Q(((i]AO((((((((((=hh((((((((((((((((((((QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE((}h4sj((srO$QEQEQEQEQEQEQEQ3Fh((J;E袊(((((@=hO_z02HQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQGEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQH3yH3–Z((((( EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE((‘Pe2}OPnv 2IN#2˰ r}xQER()h>QE(((=(((QEQEQEQEQEQEQEPhoJ19?J((((R()EQEw=@ڐzQE-QEQEQEQEQEQEQEQEQEQEf(((((ҀAQs@z{EZ(ORE}(Z((((((((((((((((((((ў(QJ(QEQEPh(((((>QEQEQEh((((((((((4);QG4QEQڏҊ)MRQE-QEPFF3qHy8Z((((((((((4QEQEQEQEQEQEQHh(@(Z(QEQGZ>Q(((4QEQEQEQEQEQEQEQEQEQEP(((8##֊)(((QEP((((((((((((w((((>}(9EU[6P9829S,u-Nq!1+*Jqi7 aHʣxsW*ɢ;(QEQEQEQEQEQEQEQEQEQEQEQEQEQEv:EQEQEQEQG֊((EQKEQEJ((((GZ(((((3EQEQEQEQEQ;EQEQEQEQEQEPz) QP$@=:9֊ZZ()(((h(((4QEQEQEQEQEwE- $b6 bX---QEQEQ@((EQIEQAJ(HrĂr=NX䓓ǵ---Ph fE(((((( QEQEQEGj91EQEQGJ(4A8c8)h((((4QEQEQEQEQEQGJ((((((((QEQEf((;gR>}(Z(EQEQEQE('ҊLRQEQE(((QEQEQEQEQEQG4QGҊ(((Rfi3KE-QEQEfRh((((Z(撏’Z((((((((((( %R(EPhzQ뎴QEQGz)&sёږ(QE%PiMbZ((((=袊(QEQEQEQEQEQGNQEQIEQE(ރJ((((Ph((EQEQEQEQEQEQEQEQƊ(9ёAQEQ(()(=(((EQ׭QEQGҌEQEQEQEQEQEQEQE{QEQEQU주0d%YG!]gs[>;g/L*BUkkvy,ʐr3l}bU (KMV[cp~m>Zj69LKEt )EQERuږZ(($? I'? d'QEEP(((((>QEQEQQE-QEQEёEQ@@EIIEEh0J(>}h(=:FGZB8QEQEQEtEQEQEQEQEQEQEQEQHh((IE%-( RQEޏRQQIEQEQK@((((EQEQEQEQEQEpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_jpeg_app14_dcmd.dcm000066400000000000000000000103261515706620200273620ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.98830244104132507426674272067370279168UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.5SHOFFIS_DCMTK_365 CS ISO_IR 100UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.98830244104132507426674272067370279168 DA#DA202107170TMPSHdCSWSD PNPN LO0DA@CS UI@1.2.826.0.1.3680043.8.498.32735210998394320925122197129876886444 UI@1.2.826.0.1.3680043.8.498.13012310880988753011051759601908007359 SH IS IS CS(US(CSRGB (US(US(US(US(US(US(US(!CS01(!CS ISO_10918_1 OBJ AdobeeC    #%$""!&+7/&)4)!"0A149;>>>%.DIC; }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((RE%REQEQEQEQEQERQE-QEQEQEQEQEQEQEQEQEQEQEQIE%-QERQEQERKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQIIE"l `>fɤsKK֖;QKKEQEQEQE%QIEQIEQEQE%REQEQEQEQEQEQEQEQEQE%RE%REQEQEQEQEQEQE&9&9'zZZZ((w^)m>R4QEQEQEREQEQEQERQE-QEQEQEQEQEQERRQKKEQEQEQEQEQEQE tQEQEQEQEQEQEQEQEQEQEQIIE--QEQEQEQEQEQEQEQIIE--QEQIdgқsdgSih((((((((((():Rt(((((((()R7㚏O3xv>RRQFyREQEQEQEQEQEQERE RgBN2))iih((((((@r2)dRREQEQERRQE-RQKKEQEQEQEQERQE-QEQEQEQEQEQEQEQEQEQEQE%%RKIEQE- 52[i (B(Z()((((((yD1 qQ\L y d3*+)̛@n$cyX"`H"ժ('l`tV8ސO(Z((((J( (()(((ZJ(ZZ((()CVʮXdԄ0zP)@(((((((((((JJ((Z)hJ*b ?-Vme/)y;(PMrfoAS!b2*evWq0ڝOQE ֑:\98-:(((((((((((((((J)(4QEQEqIEQEƍY1G`r) rE:KKKEQEQEQEQEQE 6{RӇNiiih) !8E--QE%%QERQE-QE%%RKEQEQEQIEQE-RQE-QEQERfZZ((())3E--QE%'֒(((((()hZZ((((((b94@ɤHOwE--襥T Md OUH@${SԴQEQEQEQE%%bIqjbA\b>KIIE--QEQEREb)h)Fr ;j4cd?N)YsRS((((((((((((J)ԑdԴu--QKEQEQE%M֒[rFܹ(#4QEQEQIEQER`R`dZ)ih((((((Z(()0RKEQERKERE%REQIE%RIEQEQEQKEQEQEQEQEQEQEQEQERQE-QEQKE-RRQKKEQEQIEQIER)(((((((((((('t%---QERRQ@u9PGSJ)ih(3)ih((())(()9JNQEQERwE--QEQEQEQEQEQEQE%QIEQKKEQE%RE%QERqHA#(Z)h(Z(((((((((J(())()ih(Z()()h(Z((((((((((((());ERE%REQIEQE-QERKIE%-QERRQKKEQEQEQEQEQEQE%'z)ih((J))h(RE%RE%REQEQEQKEQEQEQEQIHs %5#wˏJjF~\vvNO~)u%%QEQEQEQEQEQERRQKKE%QIފZ((Z)((()h)h(((((((Z((((()(J)ih(Z((()()()j@A;RRIEQEQEQEQEQEQKEQEQEQE%%QIEQE--QE%%QEQKE%QIE--QEQIERQKKE1p{o(G p饀`"2$k*:M5+У@D{GW龙ppȒUx70ԮBJ_fQ c"IV⣫LR} 8D dI*׼Tu~jWG%Z}3 J(1$^Qoa\>"2$k*:M5+У@D{GW龙ppȒUx70ԮBJ_fQI:nl9ׇF}s ͚<4yG^q76h&?3nlMxg?٣8ϻAGq5wsf(k#>9QׇF}s ͚<4yG^q76h&?3nlMxC LJ܋w3PYţnY;X;qh$f!ۆ_NFaZ:vnEјgFbed`fţnY;X;qh$f!ۆ_NFaZ:vnEјgFbed`fţnY;X;qh$f!ۆ_NFaZ:vnEјgFbed`fţuB P79Oppmѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppѻ';;]ppF> ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚ ͚<͐,JV} \yeBW!kYPZT%p \yeBW!kYPZT%p \yeBW!kYPZT%p ʅnBIJ[,V.lK* ʅnBIJ[,V.lK* ʅnBIJ[,V.lK* ʅnpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_jpeg_gdcm.dcm000066400000000000000000000121241515706620200263560ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.4.70UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.6.3SH GDCM 2.6.3AEgdcmconvCS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(USd(USd(0DS1.0\1.0 (US(US(US(US(US(USOBAdobedddRGB RGB '@?4 @@Ppydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_jpeg_lossy_gdcm.dcm000066400000000000000000000115661515706620200276200ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.2.1143.6844246171068686447348170864099716226UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.4SHOFFIS_DCMTK_364 AEgdcmconvCS ISO_IR 192CSDERIVED \SECONDARY\OTHERUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.2.1143.6844246171068686447348170864099716226 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STlossy conversion!SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSYBR_FULL(US(USd(USd(0DS1.0\1.0 (US(US(US(US(US(US(!CS01(!DS9.05250452625226OB CCdd" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?_agw^cY]_kk^SN  \9Y_0D/oQ 1,./55/)`o As㢿agw^cY]_kk^S:Ѓ5pEgEC"]G0D/oQ=??u+j玊??e%{|E溏agw^!{AyOxWB?ß ~?Ku"]GC\ ᫇?+?:+(k^S:Ѓ5pEguP:?:_Ou_O˃ px[u;W?KЙUofL'_ qU <-˺?1ПwGF_W/Bai?v'+ B{=u;b?. g_'o]W?KИZl6nkuP:?:_Ou_O˃ px[tgU*q&VGk2r/'N]W3/.wB\\d UofL'_ qU <-˺?1ПwGF_W/Bai?v'+ B{讫 px[tQW?KИZl6nk}E}ilf{ _U?WGG[5Y?SO E}ų_^ _U?WGG[5Y?SO E}ų_^ _U?WGG[5Y?SO E}ų_^ _U?S÷b#?>+uG;w.37USեy3GDV~ gp?S0?DػdOWODVZWg4p$'Y0S8OػdOQD~T@i_Lեy3GOBx)?S0?DػdOWODVZWg4p$'Y0S8OػdOQD~T@i_Lեy3GOBx)?S0?DػdOWODVZWg4p$'Y0S8OػdOQ_?ZWg4Q gO? $~#-v.CG2ow45E2ow44-v.C_P2ow44-v.C_P2ow44-v.C_P2ow44-v.C_P2ow44-v.C_P2ow44WW24. .oA@W24. .oA@W24. .oA@W24. .oA@W24. .oA@W24. .oA@W24PQEQEQEQEQEQEQEpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_rle.dcm000066400000000000000000000037261515706620200252310ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.5UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvCS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(USd(USd(0DS1.0\1.0 (US(US(US(US(US(USOB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_rle_16bit.dcm000066400000000000000000000050561515706620200262340ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.5UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvCS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(USd(USd(0DS1.0\1.0 (US(US(US(US(US(USOW@`(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_rle_16bit_2frame.dcm000066400000000000000000000074701515706620200274720ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.5UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvCS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(IS2 (USd(USd(0DS1.0\1.0 (US(US(US(US(US(USOW@`(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`(????????????????????????????????????????????????????????????pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_rle_2frame.dcm000066400000000000000000000052101515706620200264530ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.5UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvCS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(IS2 (USd(USd(0DS1.0\1.0 (US(US(US(US(US(USOB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????????????????????????????pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_rle_32bit.dcm000066400000000000000000000072601515706620200262310ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.5UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(USd(USd(0DS1.0\1.0 (US (US (US(USOB @`(H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_rle_32bit_2frame.dcm000066400000000000000000000141461515706620200274660ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116UI1.2.840.10008.1.2.5UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^JamesPN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(IS2 (USd(USd(0DS1.0\1.0 (US (US (US(USOB @`(H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @`(H????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_small_odd.dcm000066400000000000000000000026441515706620200264030ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.1099.1521494048.423534UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.1099.1521494048.423534 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!ST Scaled image!SQrjUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(IS1 (US(US(0DS33.333333\33.333333 (US(US(US(USOW444?W?W?Wpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_small_odd_big_endian.dcm000066400000000000000000000026441515706620200305420ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.1099.1521494048.423534UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.3SHOFFIS_DCMTK_363 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.1099.1521494048.423534 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!ST Scaled image!SQrjUI1.2.840.10008.5.1.4.1.1.7UI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSRGB (US(IS1 (US(US(0DS33.333333\33.333333 (US(US(US(USOW44?4WW??Wpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_rgb_small_odd_jpeg.dcm000066400000000000000000000037741515706620200274150ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.1100.1521494053.974393UI1.2.840.10008.1.2.4.50UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.1100.1521494053.974393 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STfLossy compression with JPEG baseline, IJG quality factor 90, compression ratio 0.084906 [Scaled image]!SQPUI1.2.840.10008.5.1.4.1.1.7UUI61.2.276.0.7230010.3.1.4.8323329.1099.1521494048.423534@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CSYBR_FULL(US(IS1 (US(US(0DS33.333333\33.333333 (US(US(US(US(!CS01(!DS0.084906(!CS ISO_10918_1 OB>JFIFC     C   R RT ?g jv3ӥ.cpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/SC_ybr_full_422_uncompressed.dcm000066400000000000000000000522661515706620200306140ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5846.1512159596.457896UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 AEgdcmconvCS ISO_IR 192CSDERIVED\SECONDARY\OTHER UI1.2.840.10008.5.1.4.1.1.7UI61.2.276.0.7230010.3.1.4.8323329.5846.1512159596.457896 DA20170101#DA*DT0TM1200003TMPSH`CSOTdCSSYN PNMoriarty^James!STVLossy compression with JPEG baseline, IJG quality factor 90, compression ratio 21.521 !SQPUI1.2.840.10008.5.1.4.1.1.7UUI@1.2.826.0.1.3680043.8.498.49043964482360854182530167603505525116@pSQB:SH121320SHDCM LOUncompressed predecessorSQ<4SH113040SHDCM LOLossy Compression PN Lestrade^G LOID1 0DA@CSF AS024YQCS UI@1.2.826.0.1.3680043.8.498.12406831542731051035295345080039845114 UI@1.2.826.0.1.3680043.8.498.16157229083793556332623330502397121062 SH1 IS1 IS1 CS `CS @LT Test Image with 10 rows of (255,0,0), 10 rows of (255,128,128), 10 rows of (0,255,0), 10 rows of (128,255,128), 10 rows of (0,0,255), 10 rows of (128,128,255), 10 rows of (0,0,0), 10 rows of (64,64,64), 10 rows of (192,192,192), 10 rows of (255,255,255), uncompressed (US(CS YBR_FULL_422(US(USd(USd(0DS1.0\1.0 (US(US(US(US(!CS01(!DS21.521(!CS ISO_10918_1 OB NLLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLULLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLWLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRLLRmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlllllllllllllllllllllllllllllllllllllllllllllllllljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlllllllllllllllllllllllllllllllllllllllllllllllllliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiillllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++++++++++++++++++++++++++++++..................................................++++++++++++++++++++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..................................................**************************************************++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++WLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLWLVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnssssssssssssssssssssssssssssssssssssssssssssssssssvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/UN_sequence.dcm000066400000000000000000000012421515706620200254310ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI*2.16.840.1.113786.1.329.501.670121457.163UI1.2.840.10008.1.2.4.70UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.4.4SH GDCM 2.4.4AEGDCMSD UNP1.2.840.10008.5.1.4.1.1.2U61.2.840.113619.2.327.3.185221411.476.1398588726.278.80 41.2.840.113619.2.327.3.185221411.476.1398588726.276 41.2.840.113619.2.327.3.185221411.476.1398588725.795 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/badVR.dcm000066400000000000000000000167021515706620200242240ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.2.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 DA20030903TM150031UI1.2.840.10008.5.1.4.1.1.481.2UI*1.9.999.999.99.9.9999.9999.20030818153516 DA200308050TM115747PSH`CSRTDOSEpLOManufacturer name herePNSH Computer001 LO$Treatment Planning System name here PNLastname^Firstname LOid11111 0DA@CSO PDS LO version 1 UI1.2.999.999.99.9.9999.8888 UI1.2.777.777.77.7.7777.7777 SHS1 IS1 IS 2DS2189.431250000000\199.431250000000\-761.87000000000 7DS21.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 RUI22.22.222.2.222222.2.2222222222222222222222222222.2 @LO(US(CS MONOCHROME2 (IS1A( AT0 (US (US (0DS"10.0000000000000\10.0000000000000 (US (US (US(US0CSRELATIVE0CSPHYSICAL0 CSBEAM0 DS0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0DS 1.0000000e-6 0SQPUI1.2.840.10008.5.1.4.1.1.481.5UUI*1.2.123.456.78.9.0123.4567.89012345678901 0 SQ0( 0SQ 0IS1 0"IS1 OWp`p"p"@0@0(4(4p( ;C??UhY8aP]UI eli e~`x~vH0Hp@X((8  P ,4<84,p@@HXD8Pu } ؈ ؈ 8y @   X ( x! 0- 5 5 5 0- < @ 8 0- 0`p"X,(4@0X,p( 8?C?UP]hYUQM8ail e~xx~~v`HXXp@(8 8 ,88840p@@H@H<Pu ؈  ؈ p     (  x! 1 5 5 5 1 < D @ 5 0``p"X,(4@0p(  @0?C?U8ahYQIIP]ili~`~vvx00@XX8 88 0<8400p@@H@Hp@ } ؈ ؈   X  ( ( H) 5 8 5 5 1 < @ @ 8  H p"p"@08@0$@0;CChY8ahYMAAhY elix`zooxHX@XЧЧ@( PP 4p@<4,0p@XD@HXD ؈ }  (  (  0- 8 8 5 1 5 @ @ D <  x0p"(48@0 p(8?CP]8ahYI(:AU8ail``xv kr`0@@Xp(8P8p@<4)0p@XD@H@H 8y    @  1 < < 5 1 5 @ @ D < `p"88@00   (4?C8a8ahYA@6(:IP]il``xo8g kv`0(@XЧ@Ph p@p@p@,),4XD@H@H؈ } 8y } ( @ ( 5 < < 1 0- 1 8 @ D <  p"88@00 0 H@0;C8a8aP]@6@6X2AhY elH`x8gPcPcrx0((@@Pp@XDp@%)%0p@@H@H 8y 8y 8y  X @ @  8 @ @ 0- 1 0- 5 @ @ @  p"??@0H`X,;CiihYA@6p.>U el0xoPch_oH@Ч0ЧXPPXD@Hp@0)%,p@XD@H  8y Pu  ( @ X ( < D @ 5 1 0- 5 @ @ @ p" CC(40 `X,;CilP]E@6p.>U ei0`rPch_ kH@0X(x8hXD(Lp@0)%,<XDXD `  8y Pu }  @ X ( < H @ 5 1 0- 1 @ @ @ p";8@00 HX,;C e ehYA@6@6>U eiHHxoPcPc kH((@ЧЧXPhp@XDp@,)%,<XDXD؈  8y 8y } ( @ @ ( 8 @ @ 5 1 0- 1 < @ < 8(4@00  @0??8aP]hYE@6(:>hYii``xr8g8g kx0@@XX8h8p@<0)))p@@HXD  8y } }   @ @ ( 5 < < 5 0- 1 1 @ D < Hp"(4(4@0 (4C?P]8ahYMAAEP]iix`xzoor`0X@XЧЧ@ PPP 8<<4,,0p@@HXD }   ( ( ( ( 1 8 < 8 1 5 1 < @ < ``0@08@0p(  $(4?;hY8aP]UMIQP]i e`xzvz`0Hp(Xp@   4<<8444p@XDp@ ؈ ( 0- 8 < 8 8 8 8 < @ 8  @08(4@0X,X,@0(4;8hY8aP]hYUUhYP] e8a``x`H`p(@XppX@(@ 0<<<88<p@p@< } ؈ ؈ ؈ ؈ ؈ @  H) 5 < 8 8 8 8 < < 1 @0(48(4@0@0(4888UP]8aP]hYhYP]8a8a8a~``xxxx```@(XXXX@@X8 ,8p@<<<<<<08y ؈ ؈ ؈  p  ( `% 5 8 8 8 8 8 8 5 1 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/crayons.icc000066400000000000000000000210701515706620200246710ustar00rootroot00000000000000"8lcmsmntrRGB XYZ  acspAPPL-lcms#|i/dE descbcprtl wtptchad,rXYZbXYZgXYZrTRC gTRC bTRC chrm"$mluc enGB(enUSFCrayon ColoursCrayon Colorsmluc enUS XYZ -sf32 J*XYZ o8XYZ $XYZ bcurv  !#$%&()*+-./02345789:;=>?@BCDEGHIJLMNOQRSTUWXYZ\]^_abcdfghiklmnoqrstvwxy{|}~    "#%&()+-.0134689;<>@ACEFHJKMOPRTUWYZ\^`aceghjlnoqsuvxz|~   !#%(*,.1358:<>ACEHJLOQSVXZ]_adfikmpruwy|~   #&),.147:=?BEHKNQTVY\_behknqtwz} "%),/369=@CGJMQTW[^behlosvy} "%)-148<@CGKORVZ^bfimquy} !%)-159>BFJNSW[_chlpty}  $(-16:?CHMQVZ_chmqv{  !&+/49>CHMRW\afkpuz      " ' , 1 7 < A F L Q V [ a f k q v {      $ ) / 4 : ? E J P V [ a f l r w }      $ * / 5 ; A G M S Y _ d j p v |     & , 2 8 > E K Q W ] d j p v }      ! ( . 5 ; B H O U \ b i o v | ")/6=DJQX_flsz  '.5<CJQX_fmt{  '/6=DLSZbipx #*29AHPW_gnv}'.6>FNU]emu} #+3;DLT\dlt| (08AIQZbjs{ #,4=ENW_hpy &/7@IRZclu~ &/8AJS\enw $.7@IR\enw )2;ENXakt~  *3=FPZcmw '0:DNXblu )3=GQ[epz'1;EPZdoy *4>IS^hs}'2<GR\gr|    ) 4 ? J T _ j u !!!!%!0!;!F!Q!\!g!r!~!!!!!!!!!!!""""%"0"<"G"R"^"i"t""""""""""""####*#5#A#L#X#c#o#z###########$$$$($3$?$K$V$b$n$y$$$$$$$$$$$%%%%)%5%A%M%Y%e%p%|%%%%%%%%%%%& &&#&/&;&G&S&_&k&w&&&&&&&&&&&' ''!'-'9'F'R'^'j'v'''''''''''( ((#(/(;(H(T(`(m(y(((((((((())))()4)A)M)Z)g)s)))))))))))* **$*1*>*J*W*d*q*}**********+ ++$+1+>+K+X+e+r++++++++++,,,,(,5,B,O,\,i,v,,,,,,,,,,---!-/-<-I-V-d-q-~---------....,.9.G.T.a.o.|.........////,/:/G/U/b/p/~/////////000"0/0=0K0Y0g0t00000000001 11(161D1R1`1n1|111111111222$222@2N2\2j2y222222222333#313?3M3\3j3x333333333444$434A4O4^4l4{4444444445 55)575F5T5c5r555555555666!606?6N6\6k6z666666666777,7;7I7X7g7v7777777778 88*898H8W8f8u8888888889 99+9:9I9X9g9w99999999::::.:=:M:\:k:{::::::::;;;%;4;D;S;c;r;;;;;;;;;<<<-<=>>'>7>G>W>g>w>>>>>>>>???'?7?G?W?g?x????????@ @@*@:@J@Z@k@{@@@@@@@@AAA/A?AOA`ApAAAAAAAABBB&B6BGBWBhBxBBBBBBBBCCC/C@CQCaCrCCCCCCCCD DD+D;DLD]DnDDDDDDDDEEE(E9EJE[ElE}EEEEEEEFFF(F9FJF[FlF}FFFFFFFGGG)G;GLG]GnGGGGGGGGH HH-H?HPHaHsHHHHHHHHII"I3IEIVIhIzIIIIIIIJJJ*J;JMJ_JqJJJJJJJJKK"K4KFKXKiK{KKKKKKKL LL.L@LRLdLvLLLLLLLMMM+M=MOMaMsMMMMMMMNNN)N;NMN_NrNNNNNNNOOO)O;ONO`OrOOOOOOOPPP+P=PPPbPuPPPPPPPQ QQ/QAQTQgQyQQQQQQQRR"R4RGRZRmRRRRRRRSSS)SUQUeUxUUUUUUUVV%V8VKV_VrVVVVVVVW W W4WGW[WnWWWWWWWX XX1XEXXXlXXXXXXXY YY0YDYXYkYYYYYYYZ ZZ1ZEZYZlZZZZZZZ[ [[3[G[[[o[[[[[[[\\#\7\K\`\t\\\\\\]]])]=]Q]e]z]]]]]]^^^0^D^Y^m^^^^^^^__%_9_N_b_w______```/`D`X`m```````aa'a;aPaeazaaaaaab b b5bIb^bsbbbbbbccc/cDcYcnccccccddd+d@dUdjdddddddee)e>eSehe}eeeeeeff'f=fRfgf}ffffffgg(g=gSghg~gggggghh*h?hUhjhhhhhhiii-iCiXiniiiiiijjj2jHj]jsjjjjjjk k"k8kNkdkzkkkkkkll*l@lVllllllllmmm3mIm_mummmmmmnn'n=nSnjnnnnnnooo3oIo`ovoooooopp*p@pWpmppppppq q"q8qOqfq|qqqqqrrr2rHr_rvrrrrrrss,sCsZsqsssssstt(t?tVtmttttttuu&u=uTukuuuuuuv v$v;vRvjvvvvvvw w$w;wRwjwwwwwwx x%xyVynyyyyyyzz*zBzZzqzzzzz{{{/{G{_{v{{{{{|||5|M|e|}|||||} }$}<}T}l}}}}}}~~-~E~]~u~~~~~7Og)AZrԀ5Nfȁ*C[tւ 9Qj̓0HazĄ݄(AZrօ!:SlІ4Mgˇ0Ib{Lj,F_xĉމ*C]vŠ܊(B[u‹ۋ(B[uŒ܌)B\vÍݍ+D^xƎ-Ga{ɏ1Keΐ6Pkӑ"\{4Sr ,Kj‰¨$CbÁà<[{ĚĹ6UuŔų0PoƏƮ ,KkNJǪ(GgȆȦ$DdɃɣ"Aaʁʡ @_˟˿?^~̞̾>^~͞;?_Οο @`πϠ!BbЂТ$Deхѥ'Gh҈ҩ +LlӍӭ0PqԒԲ5Vw՗ո;\}ֿ֞!Bcׄץ)Jk،ح1Rsٔٵ:[|ڞڿ"Deۆۨ -Noܑܲ8Y{ݜݾ"Deއި /Prߔߵ<^(Jl7Yz$Fh4Vx#Eg4Vy$Fi7Y{(Jm<^ .Qs!Df7Z}+Nq Cf8[~ .Qt$Hk?b6Z} /Rv'Ko!Dh>b9]4X| 0Tx,Pu)Mr'Ko%ImchrmT{L&f\pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/000077500000000000000000000000001515706620200254105ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/000077500000000000000000000000001515706620200263325ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CR1/000077500000000000000000000000001515706620200267175ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CR1/6154000066400000000000000000000043741515706620200272510ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSDERIVED\PRIMARY DA20010101TM055236UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11 DA20010101"DA200101010TM0000002TM000000PSH2 `CSCRpLOAgfa-Gevaert AG PNSH+0000 0LOXR C Spine Comp Min 4 Views >LO Cervical LATLOADC_5146PNDoe^Archibald  LO776540330DA@CSAS047Y!LT@LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSCSPINE`DS0  LOacp_3403ADS0 DDS0 RIS0 dDS0.1000\0.1000 DS`SHcode35LO10090 CSPORTRAITCSUSQCSQCSLL`DS400 LOAGFALO^MC=3\EC=0\LR=2\NR=0\FA=C\FP=0.1\ECNL=3\MD0=-0.3\MD1=0.1\BALANCE=0\MLMIN=0.5\MLMAX=2.5\MFOC=0.5LONK5 LO2.06822395324707`USeUSpUSUSdCS COMPLETED UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 SH2 IS1 IS1 CSL\F `CS @LT^^^^(US(CS MONOCHROME1 (US(US(4IS(US(US (US (US(US(US(PDS1600(QDS2800(RDS200 (SDS0.684 (TLOOD(0LONK5 CSNORMAL 0IS 0CS0CSCREATED OW:#Px=  7=  { j x  ]   %  o $ % K  9 m G 6 V   * h E ?  h ! V S  H f ! B  ! P * % m V V h N V V Y N  _   * 0 0  j   ~ ' S ? -   0 6 x V - v 6 j   f  r  0 0 ~ s Y   % \ Y  \ P  @ 3 < 0  ~ N  V ` r 4 m H K y v  ! f 9 c =  1 r pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CR2/000077500000000000000000000000001515706620200267205ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CR2/6247000066400000000000000000000043721515706620200272530ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSDERIVED\PRIMARY DA20010101TM055314UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7 DA20010101"DA200101010TM0000002TM000009PSH2 `CSCRpLOAgfa-Gevaert AG PNSH+0000 0LOXR C Spine Comp Min 4 Views >LOCervical OBLI 1 LOADC_5146PNDoe^Archibald  LO776540330DA@CSAS047Y!LT@LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSCSPINE`DS0  LOacp_3403ADS0 DDS0 RIS0 dDS0.1000\0.1000 DS`SHcode38LO10090 CSPORTRAITCSUSQCSQCSAP`DS400 LOAGFALO^MC=3\EC=0\LR=2\NR=0\FA=C\FP=0.1\ECNL=3\MD0=-0.3\MD1=0.1\BALANCE=0\MLMIN=0.5\MLMAX=2.5\MFOC=0.5LONK5 LO1.93223989009857`USeUSpUSUSdCS COMPLETED UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 SH2 IS2 IS1 CSL\F `CS @LT^^^^(US(CS MONOCHROME1 (US(US(4IS(US(US (US (US(US(US(PDS1600(QDS2800(RDS200 (SDS0.684 (TLOOD(0LONK5 CSNORMAL 0IS 0CS0CSCREATED OWnc 8D[-g8kn55r X!HH~c[<cnnzP<Dsz8~g PH)vLcL!<  @ cXL8zrnL)_5g1X%@z`rP-)H@Q%Dk__P@@#P!%-DMYoLkkT8L\r~L<[5~r@n- %_[r1zXr! pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CR3/000077500000000000000000000000001515706620200267215ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CR3/6278000066400000000000000000000043721515706620200272600ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSDERIVED\PRIMARY DA20010101TM055404UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9 DA20010101"DA200101010TM0000002TM000017PSH2 `CSCRpLOAgfa-Gevaert AG PNSH+0000 0LOXR C Spine Comp Min 4 Views >LOCervical OBLI 2 LOADC_5146PNDoe^Archibald  LO776540330DA@CSAS047Y!LT@LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSCSPINE`DS0  LOacp_3403ADS0 DDS0 RIS0 dDS0.1000\0.1000 DS`SHcode35LO10090 CSPORTRAITCSUS0QCSQCSAP`DS400 LOAGFALO^MC=3\EC=0\LR=2\NR=0\FA=C\FP=0.1\ECNL=3\MD0=-0.3\MD1=0.1\BALANCE=0\MLMIN=0.5\MLMAX=2.5\MFOC=0.5LONK5 LO1.90687048435211`USeUSpUSUSdCS COMPLETED UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 SH2 IS3 IS1 CSL\F `CS @LT^^^^(US(CS MONOCHROME1 (US(US(4IS(US(US (US (US(US(US(PDS1600(QDS2800(RDS200 (SDS0.684 (TLOOD(0LONK5 CSNORMAL 0IS 0CS0CSCREATED OW , R O   n  f ) @ ; } w L /  8 , @ I C P l t , Y 7 *  V b \ 8 ' S  u Y i # *     _  ~  :  M   7  J ' - jF  ' ' _ tS F :  jF]7 '  4  @f  i  :  $ : b   P : J  F - <! @  `7 7 jfYpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CT2/000077500000000000000000000000001515706620200267225ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CT2/17106000066400000000000000000000073421515706620200273310ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA19950903TM173353UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93 DA19950903!DA19950903"DA19950903#DA199509030TM1730321TM1733012TM1733213TM173353PSH2 `CSCTaCSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LOCT, HEAD/BRAIN WO CONTRAST>LORoutine Brain LOLightSpeed Plus LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT01 SHLightSpeed Plus UIPNDoe^Archibald  LO776540330DA@CSAS042YbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSHEAD"CS AXIAL MODEPDS1.250000`DS140 DS 250.000000 LO"LightSpeedApps14.13_2.8.2L_H2.1M4 0LO1.1 Routine Brain DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 181.199997@CSCWPIS2000QIS210 RIS420 pIS29400 DS1.200000SHSTANDARDQCSHFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 248.669998SSLOI LOS #DS0.000000$DS 10.000000 %SS&SLf'DS2.000000,SL.DS0.000000/DS 984.0000009SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 SH2 IS2 IS4 IS18 2DS"-125.000000\-128.100006\-99.480003 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.4 @LOOM ADS -99.480003!LO GEMS_RELA_01!SS!5SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL'CFLffF@'DFL'EFL'FFL'GFL?'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS30(QDS100 (RDS-1024 (SDS1 2 CS QCSUCCESS 2 CS20LO DIAGNOSTICS 23LO177 @DDA19950903@ETM173032@TLOCT, HEAD/BRAIN WO CONT@SHCLO GEMS_PARM_01CUSdCSScCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS0.000000\3.100000 C@FLIACAFLQCCBSLCCSLCDSLCESLCFSLCMFLCNFL@ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESSESSESSESSESSESSE!SSE"SS 1 LO 1 LOOWLMH0]aSOe4HD#DBfF;4L<&6$v[zdWS[]\h)]fOEGFJSYURZk\lPA<=BEEKQNLMoUF:7:@?@BGIGM^SG:<>7316CIFPgVF9794.+0>Vi\@325249Ei}?2447JlAV|U7;@`2N7A+\`8@8Cq8418z-!pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CT2/17136000066400000000000000000000073441515706620200273360ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA19950903TM174023UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94 DA19950903!DA19950903"DA19950903#DA199509030TM1730321TM1733012TM1735223TM174023PSH2 `CSCTaCSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LOCT, HEAD/BRAIN WO CONTRAST>LORoutine Brain LOLightSpeed Plus LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT01 SHLightSpeed Plus UIPNDoe^Archibald  LO776540330DA@CSAS042YbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSHEAD"CS AXIAL MODEPDS1.250000`DS140 DS 250.000000 LO"LightSpeedApps14.13_2.8.2L_H2.1M4 0LO1.1 Routine Brain DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 181.199997@CSCWPIS2000QIS210 RIS420 pIS29400 DS1.200000SHSTANDARDQCSHFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 248.669998SSLOI LOS #DS0.000000$DS 131.000000%SS&SLf'DS2.000000,SL.DS0.000000/DS 984.0000009SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 SH2 IS2 IS44 IS180 2DS"-125.000000\-128.100006\103.019997 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.4 @LOOM ADS 103.019997!LO GEMS_RELA_01!SS!5SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL'CFLffF@'DFL= B'EFL'FFL'GFL?'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS30(QDS100 (RDS-1024 (SDS1 2 CS QCSUCCESS 2 CS20LO DIAGNOSTICS 23LO177 @DDA19950903@ETM173032@TLOCT, HEAD/BRAIN WO CONT@SHCLO GEMS_PARM_01CUSdCSScCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS0.000000\3.100000 C@FL7bBCAFLQCCBSLCCSLCDSLCESLCFSLCMFLCNFL@ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESSESSESSESSESSESSE!SSE"SS 1 LO 1 LOOW!lB D W/F yzDv= D7wU/n PCEmU }a{)u_Q )0.eYN.eRU cVMwm-s`OmZnd's]T?M_MyHqt8og>&V(m4],  s{P]&P .{jG% E)pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CT2/17166000066400000000000000000000073441515706620200273410ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA19950903TM174025UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95 DA19950903!DA19950903"DA19950903#DA199509030TM1730321TM1733012TM1735253TM174025PSH2 `CSCTaCSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LOCT, HEAD/BRAIN WO CONTRAST>LORoutine Brain LOLightSpeed Plus LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT01 SHLightSpeed Plus UIPNDoe^Archibald  LO776540330DA@CSAS042YbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSHEAD"CS AXIAL MODEPDS1.250000`DS140 DS 250.000000 LO"LightSpeedApps14.13_2.8.2L_H2.1M4 0LO1.1 Routine Brain DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 181.199997@CSCWPIS2000QIS210 RIS420 pIS29400 DS1.200000SHSTANDARDQCSHFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 248.669998SSLOI LOS #DS0.000000$DS 134.000000%SS&SLf'DS2.000000,SL.DS0.000000/DS 984.0000009SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 SH2 IS2 IS45 IS181 2DS"-125.000000\-128.100006\104.269997 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.4 @LOOM ADS 104.269997!LO GEMS_RELA_01!SS!5SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL'CFLffF@'DFL=B'EFL'FFL'GFL?'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS30(QDS100 (RDS-1024 (SDS1 2 CS QCSUCCESS 2 CS20LO DIAGNOSTICS 23LO177 @DDA19950903@ETM173032@TLOCT, HEAD/BRAIN WO CONT@SHCLO GEMS_PARM_01CUSdCSScCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS0.000000\3.100000 C@FL|mCCAFLQCCBSLCCSLCDSLCESLCFSLCMFLCNFL@ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESSESSESSESSESSESSE!SSE"SS 1 LO 1 LOOW I Z \ k = h t  Q p s ~ s c ~ | s t i M G z A v z < o z  5 i } ~ # U w ~ v w  @ a m n o v z ~ 3 K V b g b k r r { ( ? D I M _ c W ` r e  6 P Q M U ^ | pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/77654033/CT2/17196000066400000000000000000000073441515706620200273440ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA19950903TM174028UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96 DA19950903!DA19950903"DA19950903#DA199509030TM1730321TM1733012TM1735253TM174028PSH2 `CSCTaCSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LOCT, HEAD/BRAIN WO CONTRAST>LORoutine Brain LOLightSpeed Plus LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT01 SHLightSpeed Plus UIPNDoe^Archibald  LO776540330DA@CSAS042YbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\no pet demographics\keep dates\dcdtchg change dates CSHEAD"CS AXIAL MODEPDS1.250000`DS140 DS 250.000000 LO"LightSpeedApps14.13_2.8.2L_H2.1M4 0LO1.1 Routine Brain DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 181.199997@CSCWPIS2000QIS210 RIS420 pIS29400 DS1.200000SHSTANDARDQCSHFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 248.669998SSLOI LOS #DS0.000000$DS 134.000000%SS&SLf'DS2.000000,SL.DS0.000000/DS 984.0000009SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 SH2 IS2 IS45 IS182 2DS"-125.000000\-128.100006\105.519997 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.4 @LOOM ADS 105.519997!LO GEMS_RELA_01!SS!5SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL'CFLffF@'DFL= B'EFL'FFL'GFL?'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS30(QDS100 (RDS-1024 (SDS1 2 CS QCSUCCESS 2 CS20LO DIAGNOSTICS 23LO177 @DDA19950903@ETM173032@TLOCT, HEAD/BRAIN WO CONT@SHCLO GEMS_PARM_01CUSdCSScCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS0.000000\3.100000 C@FL|mCCAFLQCCBSLCCSLCDSLCESLCFSLCMFLCNFL@ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESSESSESSESSESSESSE!SSE"SS 1 LO 1 LOOWnB '69\ $6 [ w t c=.5UbXb  4 D < rRSjY oY^!-[z Es'Bf9 q  (>#8)E~Adw  0bn`zx/kK!b'@<5Y:n>Q#73EXPF =l?`Z(fbvi|2pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/000077500000000000000000000000001515706620200263345ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT2N/000077500000000000000000000000001515706620200270425ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT2N/6293000066400000000000000000000075201515706620200273740ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\LOCALIZERDA20010101TM001546UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0015072TM0015383TM001546PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOScout LOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS SCOUT MODEPDS 650.181824`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DSDS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS518 QIS40RIS263 `SH BODY FILTER pIS4800DS0.700000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOS LOI #DS0.000000$DS0.000000%SS&SLZ'DS0.000000,SL#.DS0.000000/DS 550.0000009SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 SH2 IS4 IS1 IS1 2DS0.000000\265.000000\50.000000 7DS80.000000\-1.000000\0.000000\0.000000\0.000000\-1.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS 50.000000 !LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL'CFL'DFL'EFL'FFL'GFL'PFLHB'QFL (US(CS MONOCHROME2 (US(US(0DS0.545455\0.596847 (US(US(US(US(PDS50(QDS500 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS0.000000\0.000000 C@FLOBCAFL(CBSLCCSLCDSLCESLCFSLCMFLCNFL\@ELOGEMS_HELIOS_01ESSEFLESSESSECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESSESSESSESSESSESSE!SSE"SSE1CS59E2FL?ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS55IFL,a_BICS51ICS63IFL)@IUSICS00I CS00I STI CS01 I FLD= w=?33@W@G@{@R@= w=?33@W@G@{@R@X9@OW                           $  #     #            !   pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT2N/6924000066400000000000000000000075041515706620200273770ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\LOCALIZERDA20010101TM001627UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0015072TM0016203TM001627PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOScout LOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS SCOUT MODEPDS 650.181824`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DSDS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS518 QIS10RIS65`SH BODY FILTER pIS1200DS0.700000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOS LOI #DS0.000000$DS0.000000%SS&SL'DS0.000000,SL#.DS0.000000/DS 550.0000009SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 SH2 IS4 IS2 IS2 2DS-265.000000\0.000000\50.000000 7DS61.000000\0.000000\0.000000\0.000000\0.000000\-1.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS 50.000000 !LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL'CFL'DFL'EFL'FFL'GFL'PFLHB'QFL (US(CS MONOCHROME2 (US(US(0DS0.545455\0.596847 (US(US(US(US(PDS50(QDS500 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS0.000000\0.000000 C@FLى]=CAFL(CBSLCCSLCDSLCESLCFSLCMFLCNFL\@ELOGEMS_HELIOS_01ESSEFLESSESSECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESSESSESSESSESSESSE!SSE"SSE1CS57E2FL?ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS55IFL,a_BICS51ICS63IFL)@IUSICS00I CS00I STI CS01 I FL<̾{.??p5@Gy@{@\@̾{.??p5@Gy@{@\@j@OWcfsstaZimpufsecKhuzaqW~YMh}~x|WkCeexXzq[J]dw{k^s~V\b_m`nsr|a|XTyph^k~cshtrYfmtvah|ryivmU_pli_keghv}pb`~oS[ru~wrgfgWY`q}gSkl``p|n_RdVPL{rvyjX[\^whi|fTAWb~{siit{wTL]mztl}aewpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT5N/000077500000000000000000000000001515706620200270455ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT5N/2062000066400000000000000000000075401515706620200273670ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20010101TM002753UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0027042TM0027443TM002753PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOSmartScore - Gated 0.5 secLOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS CINE MODE PDS2.500000`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS326 QIS300 RIS98`SH BODY FILTER pIS36000 DS1.200000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOS LOS #DS0.000000$DS 1520.163452 %SS&SL'DS0.500000,SL(.DS0.000000/DS 1640.000000 9SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 SH2 IS5 IS1 IS6 2DS -72.199997\-143.000000\8.762500 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS8.762500!LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL33S'CFLA'DFL33 A'EFL'FFL'GFL'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS40(QDS400 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS-52.799999\18.000000C@FLdCCAFLjWrCCBSLCCSLCDSLCESLCFSLCMFLCNFL>ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESS ESSESSESSESSESSE!SSE"SSE1CS76E2FL*V>E3CS70ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS58IFLusBICS55ICS69IFLzqv@IUSICS00I CS00I STInVivo Research 3500 CT I CS01 I FL\¾\¾OWYU;Y5^ @O A@17 r Ecg ,* RC!$%I C 2w1 '&`#!\.]X 2I'pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT5N/2392000066400000000000000000000075401515706620200273750ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20010101TM002753UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0027042TM0027443TM002753PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOSmartScore - Gated 0.5 secLOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS CINE MODE PDS2.500000`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS326 QIS300 RIS98`SH BODY FILTER pIS36000 DS1.200000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOS LOS #DS0.000000$DS 1520.163452 %SS&SL'DS0.500000,SL(.DS0.000000/DS 1640.000000 9SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 SH2 IS5 IS1 IS7 2DS -72.199997\-143.000000\6.262500 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS6.262500!LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL33S'CFLA'DFLff@'EFL'FFL'GFL'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS40(QDS400 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS-52.799999\18.000000C@FLdCCAFLjWrCCBSLCCSLCDSLCESLCFSLCMFLCNFL>ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESS ESSESSESSESSESSE!SSE"SSE1CS76E2FL*V>E3CS70ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS58IFLusBICS55ICS69IFLzqv@IUSICS00I CS00I STInVivo Research 3500 CT I CS01 I FL\¾\¾OWP"h^9 J @/) 'w)%K-7/(j=~5OU4w>w1:7EDu&i$10-#Wc-26) BQ5;88' KB #&""J0 8b  Hqpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT5N/2693000066400000000000000000000075401515706620200274010ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20010101TM002753UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0027042TM0027443TM002753PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOSmartScore - Gated 0.5 secLOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS CINE MODE PDS2.500000`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS326 QIS300 RIS98`SH BODY FILTER pIS36000 DS1.200000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOS LOS #DS0.000000$DS 1520.163452 %SS&SL'DS0.500000,SL(.DS0.000000/DS 1640.000000 9SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 SH2 IS5 IS1 IS8 2DS -72.199997\-143.000000\3.762500 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS3.762500!LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL33S'CFLA'DFLp@'EFL'FFL'GFL'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS40(QDS400 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS-52.799999\18.000000C@FLdCCAFLjWrCCBSLCCSLCDSLCESLCFSLCMFLCNFL>ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESS ESSESSESSESSESSE!SSE"SSE1CS76E2FL*V>E3CS70ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS58IFLusBICS55ICS69IFLzqv@IUSICS00I CS00I STInVivo Research 3500 CT I CS01 I FL\¾\¾OW<nP  "O&/$  Y9)!29)7:BA,(0 %+8/*)'(  ",u/7+ I?G6&'B@@@A2_KE=5#&C/(" -5-r]2:2+s3 -@:4$  fpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT5N/3023000066400000000000000000000075401515706620200273650ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20010101TM002755UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0027042TM0027453TM002755PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOSmartScore - Gated 0.5 secLOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS CINE MODE PDS2.500000`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS326 QIS300 RIS98`SH BODY FILTER pIS36000 DS1.200000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOI LOI #DS0.000000$DS 1521.163452 %SS&SL'DS0.500000,SL(.DS0.000000/DS 1640.000000 9SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 SH2 IS5 IS2 IS9 2DS -72.199997\-143.000000\1.262500 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS1.262500!LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL33S'CFLA'DFL?'EFL'FFL'GFL'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS40(QDS400 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS-52.799999\18.000000C@FLwJBCAFLjWrCCBSLCCSLCDSLCESLCFSLCMFLCNFL>ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESS ESSESSESSESSESSE!SSE"SSE1CS68E2FL*V>E3CS70ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS58IFLusBICS55ICS69IFLzqv@IUSICS00I CS00I STInVivo Research 3500 CT I CS01 I FLffffOW ~z{z}imzjix&  $/$  2,   #"   ,pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892001/CT5N/3353000066400000000000000000000075421515706620200273750ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20010101TM002755UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16 DA20010101!DA20010101"DA20010101#DA200101010TM0000001TM0027042TM0027453TM002755PSH2 `CSCTpLOGE MEDICAL SYSTEMSPNSH+0000 0LO>LOSmartScore - Gated 0.5 secLOLightSpeed Ultra LO GEMS_IDEN_01 LOCT_LIGHTSPEED SHCT99 SHLightSpeed Ultr UIPN Doe^Peter  LO988902340DA@CSM AS043Y!LTbCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates "CS CINE MODE PDS2.500000`DS120 DS 500.000000 LOLightSpeedApps308I.2_H3.1M5 DS 250.000000DS 949.075012DS 541.000000 DS0.0000000DS 166.300003@CSCWPIS326 QIS300 RIS98`SH BODY FILTER pIS36000 DS1.200000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 389.750000DS1.023900DS 1021.820007 SSLOI LOI #DS0.000000$DS 1521.163452 %SS&SL'DS0.500000,SL(.DS0.000000/DS 1640.000000 9SSBSSCSSGSSRSSjSS UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 SH2 IS5 IS2 IS10 2DS -72.199997\-143.000000\-1.237500 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.4 @LOSN ADS -1.237500 !LO GEMS_RELA_01!SS!5SS!6SS!SS!FL!FL#LO GEMS_STDY_01'LO GEMS_IMAG_01'SS'SL'SL'SL' SS'5SS'BFL33S'CFLA'DFLhf'EFL'FFL'GFL'PFL'QFL(US(CS MONOCHROME2 (US(US(0DS0.488281\0.488281 (US(US(US(US( SS0(PDS40(QDS400 (RDS-1024 (SDS1 @DDA20010101@ETM000000CLO GEMS_PARM_01CUSCSScccCSSCDS0.000000CSLC!SSC%SS C&USC'SHC(OB00C+SSC1DS-52.799999\18.000000C@FLwJBCAFLjWrCCBSLCCSLCDSLCESLCFSLCMFLCNFL>ELOGEMS_HELIOS_01ESSEFLESSESS ECSOUT OF GANTRY EFLESSE SSE FLE FLE SSE SSEFLEFLESSESSESSESS ESSESSESSESSESSE!SSE"SSE1CS68E2FL*V>E3CS70ILOGEMS_CT_CARDIAC_001 ISQILOGEMS_CT_CARDIAC_001 ICS58IFLusBICS55ICS69IFLzqv@IUSICS00I CS00I STInVivo Research 3500 CT I CS01 I FLffffOW~}nyudmrvgrxop~ut|| $&),! pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/000077500000000000000000000000001515706620200263365ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR1/000077500000000000000000000000001515706620200267355ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR1/15820000066400000000000000000000044401515706620200273410ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020525UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476 DA20030505!DA20030505#DA200305050TM0507431TM0508143TM050829PSH428 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LOCarotids>LOFAST LOCALIZERLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS"CS#CSPDS 1.000000e+01DS16DS 3.700000e+00DS1 DS 6.36978e+01 DS1.5 IS1 DS100  LOVIA5.20LOFAST LOCALIZERUSDS20QCSHFS UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 SH428 IS1 IS2 IS1 2DS(0.000000e+00\-1.750000e+02\1.750000e+02 7DSJ0.00000e+00\1.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 IS1 IS1 DS3116 IS1 @LOCarotids ADS0.000000(US(CS MONOCHROME2 (US(US(0DS1.367188e+00\1.367188e+00 (US(US(US(US(PDS243 (QDS798 OW7SZK)Qk]76FQ[R#!T_R="mZWO,*Xl_7qa`N$!.8-?1^J  9\Eg5&10 H{iT<QO< '!=Z]L4 j$(45;?8,* $.3/+6BFCA>",81(.<CGMI$(3(%5EOI6"/' *<R^L  ,6( 1DUYLi $45(!->A<:BIv +-%#+259AFpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR1/4919000066400000000000000000000044401515706620200272700ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020353UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135 DA20030505!DA20030505#DA200305050TM0251091TM0251413TM025153PSH134 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LOBrain >LOFAST LOCALIZERLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CS#CSPDS 1.000000e+01DS10DS 3.700000e+00DS1 DS 6.36978e+01 DS1.5 IS1 DS100  LOVIA5.20LOFAST LOCALIZERUSDS20QCSHFS UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 SH134 IS1 IS2 IS1 2DS(0.000000e+00\-1.750000e+02\1.750000e+02 7DSJ0.00000e+00\1.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 IS1 IS1 DS2340 IS1 @LOBrain ADS0.000000(US(CS MONOCHROME2 (US(US(0DS1.367188e+00\1.367188e+00 (US(US(US(US(PDS349 (QDS829 OW[@/q,   !m  p`: "4i pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR1/5641000066400000000000000000000044321515706620200272620ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020321UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16 DA20030505!DA20030505#DA200305050TM0453571TM0454403TM045455PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOFAST LOCALIZERLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CS#CSPDS 1.000000e+01DS10DS 3.700000e+00DS1 DS 6.36978e+01 DS1.5 IS1 DS100  LOVIA5.20LOFAST LOCALIZERUSDS20QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 SH2 IS1 IS2 IS1 2DS(0.000000e+00\-1.750000e+02\1.750000e+02 7DSJ0.00000e+00\1.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS1 IS1 DS2340 IS1 @LO Brain-MRA ADS0.000000(US(CS MONOCHROME2 (US(US(0DS1.367188e+00\1.367188e+00 (US(US(US(US(PDS282 (QDS782 OW+Lrg Ct|*OqY[+4Mm|~~TT2:/Bg~|oju'A`}}wnf sN`czRG}txDWobMQp|uqtbchnt4^~]MV\Zf}jj[dhae}*SXhoiwKMSipc]j{%da\p~~YqX[wpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/000077500000000000000000000000001515706620200267365ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/15970000066400000000000000000000044401515706620200273500ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020526UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482 DA20030505!DA20030505#DA200305050TM0507431TM0509303TM050946PSH428 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LOCarotids>LOFAST LOCALIZERLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS"CS#CSPDS 1.000000e+01DS16DS 3.700000e+00DS1 DS 6.36978e+01 DS1.5 IS1 DS100  LOVIA5.20LOFAST LOCALIZERUSDS20QCSHFS UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 SH428 IS2 IS3 IS1 2DS(0.000000e+00\-1.750000e+02\1.750000e+02 7DSJ0.00000e+00\1.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 IS1 IS1 DS3116 IS1 @LOCarotids ADS0.000000(US(CS MONOCHROME2 (US(US(0DS1.367188e+00\1.367188e+00 (US(US(US(US(PDS303 (QDS971 OW24 60 /'- 1!2< 7M<,4#"( <- }g;  }Og'  g~2q#q 7f'pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/4950000066400000000000000000000044641515706620200272720ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020353UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137 DA20030505!DA20030505#DA200305050TM0251091TM0253123TM025351PSH134 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LOBrain >LOT/S/C RF FAST PILOT LO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC#CSPDS 1.000000e+01DS30DS 1.250000e+01DS2 DS 6.36977e+01 DS1.5 IS1 DS100  LOVIA5.20LOT/S/C RF FAST PILOT USDS30QCSHFS UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 SH134 IS2 IS5 IS1 2DS(-1.535926e+02\2.089260e+00\1.681641e+02 7DSL1.00000e+00\-0.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 IS1 IS1 DS32040 IS3 @LOBrain ADS -2.089260 (US(CS MONOCHROME2 (US(US(0DS1.171875e+00\1.171875e+00 (US(US(US(US(PDS378 (QDS919 OW~vI*qma~L+&hzxU2lznQ|oien{}vy~pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/4981000066400000000000000000000044621515706620200272740ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020353UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138 DA20030505!DA20030505#DA200305050TM0251091TM0253123TM025351PSH134 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LOBrain >LOT/S/C RF FAST PILOT LO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC#CSPDS 1.000000e+01DS30DS 1.250000e+01DS2 DS 6.36977e+01 DS1.5 IS1 DS100  LOVIA5.20LOT/S/C RF FAST PILOT USDS30QCSHFS UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 SH134 IS2 IS5 IS3 2DS(-1.500000e+02\-1.493036e+02\1.875000e+01 7DSJ1.00000e+00\-0.00000e+00\-0.00000e+00\-0.00000e+00\1.00000e+00\0.00000e+00 RUI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 IS1 IS1 DS32040 IS3 @LOBrain ADS -18.750000(US(CS MONOCHROME2 (US(US(0DS1.171875e+00\1.171875e+00 (US(US(US(US(PDS446 (QDS752 OWT<pbS&;@\A]{Bltpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/5011000066400000000000000000000044621515706620200272550ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020354UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139 DA20030505!DA20030505#DA200305050TM0251091TM0253123TM025351PSH134 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LOBrain >LOT/S/C RF FAST PILOT LO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC#CSPDS 1.000000e+01DS30DS 1.250000e+01DS2 DS 6.36977e+01 DS1.5 IS1 DS100  LOVIA5.20LOT/S/C RF FAST PILOT USDS30QCSHFS UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 SH134 IS2 IS5 IS2 2DS(-6.964260e-01\-1.494141e+02\1.681641e+02 7DSJ0.00000e+00\1.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 IS1 IS1 DS32040 IS3 @LOBrain ADS -0.696426 (US(CS MONOCHROME2 (US(US(0DS1.171875e+00\1.171875e+00 (US(US(US(US(PDS388 (QDS836 OWiS? @gN`C;'+fk4`epfOLO+D[61=>DJOU\YJN{CL^pmzOu\+j5d1(=  A0I#N25uCTpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/6273000066400000000000000000000044541515706620200272710ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020321UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18 DA20030505!DA20030505#DA200305050TM0453571TM0455533TM045637PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOT/S/C RF FAST PILOT LO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC#CSPDS 1.000000e+01DS30DS 1.250000e+01DS2 DS 6.36977e+01 DS1.5 IS1 DS100  LOVIA5.20LOT/S/C RF FAST PILOT USDS30QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 SH2 IS2 IS5 IS3 2DS(-1.500000e+02\-1.461786e+02\1.187500e+01 7DSJ1.00000e+00\-0.00000e+00\-0.00000e+00\-0.00000e+00\1.00000e+00\0.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS1 IS1 DS32040 IS3 @LO Brain-MRA ADS -11.875000(US(CS MONOCHROME2 (US(US(0DS1.171875e+00\1.171875e+00 (US(US(US(US(PDS359 (QDS762 OWb[Y_~yRus_V]bnd_{=0cklk`hdluvj(jyx}qcr}szi/;zxturO-Uyv||{gFetit`KZp~uNesWou~qaj{vmp}spw^xk/n|<|txSlTypydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/6605000066400000000000000000000044541515706620200272700ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020321UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19 DA20030505!DA20030505#DA200305050TM0453571TM0455533TM045637PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOT/S/C RF FAST PILOT LO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC#CSPDS 1.000000e+01DS30DS 1.250000e+01DS2 DS 6.36977e+01 DS1.5 IS1 DS100  LOVIA5.20LOT/S/C RF FAST PILOT USDS30QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 SH2 IS2 IS5 IS2 2DS(-6.964260e-01\-1.462891e+02\1.612891e+02 7DSJ0.00000e+00\1.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS1 IS1 DS32040 IS3 @LO Brain-MRA ADS -0.696426 (US(CS MONOCHROME2 (US(US(0DS1.171875e+00\1.171875e+00 (US(US(US(US(PDS325 (QDS761 OWTK:'+;@.(#"D"AZJB:1f]"-:ELXa]Xe}c1Qpxsrnhjlgbbz[nlOJhzy~qmuH]`QDUfnt|rin)RP;VX[r~x||qxBag\O]tzwFik]Zk{y?iR 6`tpn{CqWn}]CPvsYlPPf~1=E`nkiqpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR2/6935000066400000000000000000000044561515706620200273000ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\OTHERDA20040624TM020321UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20 DA20030505!DA20030505#DA200305050TM0453571TM0455533TM045637PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOT/S/C RF FAST PILOT LO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC#CSPDS 1.000000e+01DS30DS 1.250000e+01DS2 DS 6.36977e+01 DS1.5 IS1 DS100  LOVIA5.20LOT/S/C RF FAST PILOT USDS30QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 SH2 IS2 IS5 IS1 2DS(-1.535926e+02\5.214260e+00\1.612891e+02 7DSL1.00000e+00\-0.00000e+00\-0.00000e+00\-0.00000e+00\0.00000e+00\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS1 IS1 DS32040 IS3 @LO Brain-MRA ADS -5.214260 (US(CS MONOCHROME2 (US(US(0DS1.171875e+00\1.171875e+00 (US(US(US(US(PDS283 (QDS757 OW~j\aV3tlqmaV8 %-ekjlxw\?;BGKKA/(\^VYnzrmr{qcxfl{h>2FJJTsjihdbcidMEjtM]VhqpqpkmstmgjqNB_neqwhddUTbu}sql_ywt}[IXKW|ug[Yflqi\S>8Zv}qsvprynUHHT\ej\lsjiojaWF?YuwmsyogPTKI[q_NW]OFMRNYq{vnqv`ky}d[PNcq\CUpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/000077500000000000000000000000001515706620200271035ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4467000066400000000000000000000044561515706620200274430ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020349UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS4 2DS(-7.863148e+01\-7.291145e+01\9.889108e+01 7DSJ6.53996e-01\7.56504e-01\3.77102e-03\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS 12.300450 (US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OW@>?B@8<@>>=;??CDF?<?:9;<89:=>>;9L?>EC8;9945=C><2NICGD9<=889=C>:;PKDC>>A@9=;@A=:;MKEH=?B@><>DD:86HHED<=<:9@=BC>8;?@><=;:7:=;==?<:B;;4;;719=:94>9@>>8:><99?@==8?@<>C?<>=8?C?><9@A><DFA<93AB==7:@A@:<ADC;3;;;@<9?C@BD>CF;8569@>8:AHFGABC=<759<:28@IA:<=>75425<7:930pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4528000066400000000000000000000044541515706620200274370ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020349UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS2 2DS(-1.091489e+02\-2.554486e+01\9.922289e+01 7DSJ9.59171e-01\2.82838e-01\4.52936e-04\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS6.991924(US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OWrWONYcdbjrxwtnjeV=99;AIQYdjhc`\ZO@>5447>JRXXQMKLVC?9=<8;BDHE?<8:fB@<?@:87:>;::79t=@<;;:69@C76871PCEC?<:;??<99:5_EHG@;=@=<<8;88hCHG@7>?;697759PJG?:>><586553iGB=9A@>879632RFA:=@:8:=:94hHB;@@:9;>?=9,|NB:=<88:=@BDB`?:972746<GHM/~O942/413256pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4558000066400000000000000000000044541515706620200274420ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020349UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS1 2DS(-1.132319e+02\2.623722e+00\9.940138e+01 7DSJ1.00000e+00\1.15227e-03\-1.33196e-03\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS3.363983(US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OWBM\t/@B1 ]iu!DN7q}zon}CQ;pw{ugYWg0I< gki`MBCJq"K<Z^UH@?B?]IHFHFIDAFHT=I*>FHGBKOOHv1I9;EJHDORREa(IA;CCBDMOI@RHL'AEEFJFF?:?v ?Q9@BBFIE87:=\3SE=CHCGA:<99PCIHJJGD=<=<@Dv3KPOJEA=:8:BAW%NOJD?@<>;9;?NIpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4588000066400000000000000000000044561515706620200274470ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020350UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS3 2DS(-9.729537e+01\-5.142206e+01\9.904807e+01 7DSJ8.40635e-01\5.41610e-01\2.20114e-03\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS 10.053422 (US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OWQ]`aPJNSOHIB=<@AKS\]QIJW]YDB9<@AAGTUPC@WehL?9;>D@ACC@79APUC<=ADH=;C@<9=:<=:;?FNG999668@=<9;<BIVP::;877>:<:;<;@NQC?;9265:8;;96:CJHA:81126<<<95:9@79;;5539>>:96>@?79=<789>@@58:>D?<<<<78=AA=8?B<C;@=9968<;>:9<=:87A@<776<CE?;<95;:=987:6<CIC<<68:;26877:==<=?;>=6;pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4618000066400000000000000000000044561515706620200274410ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020350UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS5 2DS(-5.466930e+01\-8.827211e+01\9.876465e+01 7DSJ4.14374e-01\9.10111e-01\5.03539e-03\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS 13.550971 (US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OW>B;=BD<AE?B;@@B<:=:9::9B@=:@A9;57:92397>BE:C=527;<779<<>FH9A<989E>:>BB@=EB8=<<<6I?B85:8;A>788411G<=98=:<>>A;:965?=;;<?>>==E;9:97<:;@>?>?CAC:5B?9;=?=<<<>FEK:<A=58BC;<C<=GGM;?9726AC6>H@<BDI:>26/9<B@=C0:ADO;2::);7>H@9/6=BQC7<7"708HF0-*4;OE59.13;8711354*(-1'pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4648000066400000000000000000000044561515706620200274440ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020350UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS7 2DS(1.112873e+00\-9.622680e+01\9.864109e+01 7DSJ-1.43447e-01\9.89657e-01\6.27094e-03\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS 12.746182 (US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OW;=ECLRLHWVLPPAD;6>E;=<>=@>8529=4>?@4;7B:85420>;4:9>8>7>874246?78=6?=;;:4325::87@@65>*3:9&@A5=3:A>/AE677?E>1ED448;D;0351807pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/98892003/MR700/4678000066400000000000000000000044561515706620200274470ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CS"DERIVED\SECONDARY\PROJECTION IMAGEDA20040624TM020350UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125 DA20030505!DA20030505#DA200305050TM0453571TM0457473TM050656PSH2 `CSMRpLOPhilips Medical Systems, Inc. PNSH+0000 0LO Brain-MRA >LOANGIO Projected from CLO Eclipse 1.5TPN Doe^Peter  LO988902340DA@CSM AS045Y0DS 81.632700 bCSYES cLOdcanon\no identifiers\keep descriptions\keep manufacturer\keep retired\keep private\no uids\keep pet demographics\keep dates\dcdtchg change dates LO CSGR!CSSS\SP "CSFC\SP #CSPDS 1.200000e+00DS30DS 6.000000e+00DS1 DS 6.36977e+01 DS1.5 IS1 DS89.8438  LOVIA5.20LOANGIO Projected from CUS@DS35QCSHFS UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 SH2 IS700 IS6 IS6 2DS(-2.735009e+01\-9.625959e+01\9.867900e+01 7DSJ1.41182e-01\9.89985e-01\5.89183e-03\-1.33901e-03\6.14239e-03\-1.00000e+00 RUI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 IS12 @LO Brain-MRA ADS 13.703672 (US(CS MONOCHROME2 (US(US(0DS3.906250e-01\3.906250e-01 (US(US(US(US(PDS149 (QDS359 OWZTINQG<@>?@9:8==<?78@569<9?084=>5?82;45=;1:/47F<7?;379;<88<65=G9:<=53:>9=A=DA>B=5=::20+3*+8><A96,1&*!8;9C;60,"0669@710('966(#86+*"52)0"pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR000066400000000000000000000255541515706620200265400ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 0CS PYDICOM_TESTULUL6 US SQ)jUL6 US UL0CSPATIENT CS ISO_IR 100PNDoe^Archibald  LO77654033ULUS UL0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LOXR C Spine Comp Min 4 Views UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 SH2 |ULBUS ULX0CSSERIES`CSCR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 IS1 ULUS UL0CSIMAGE CS77654033\CR1\6154 UI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 IS2 ULUS UL0CSIMAGE CS77654033\CR2\6247 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL.0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 IS3 ULUS UL0CSIMAGE CS77654033\CR3\6278 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 ULUS UL0CSSTUDY CS ISO_IR 100 DA199509030TM173032PSH2 0LOCT, HEAD/BRAIN WO CONTRAST UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 SH2 |ULUS ULp0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 IS2 UL` US UL0CSIMAGE CS77654033\CT2\17106UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS18ULR US UL0CSIMAGE CS77654033\CT2\17136UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS180 ULD US UL0CSIMAGE CS77654033\CT2\17166UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS181 ULUS UL0CSIMAGE CS77654033\CT2\17196UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS182 fULUS UL 0CSPATIENT CS ISO_IR 100PN Doe^Peter  LO98890234ULUS UL` 0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LO UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 SH2 |ULUS UL 0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 IS4 ULUS UL0CSIMAGE CS98892001\CT2N\6293UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS1 ULUS UL0CSIMAGE CS98892001\CT2N\6924UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS2 |ULUS ULP0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 IS5 UL@US UL0CSIMAGE CS98892001\CT5N\2062UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS6 UL0US UL0CSIMAGE CS98892001\CT5N\2392UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS7 UL US UL0CSIMAGE CS98892001\CT5N\2693UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS8 ULUS UL0CSIMAGE CS98892001\CT5N\3023UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS9 ULUS UL0CSIMAGE CS98892001\CT5N\3353UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS10ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM050743PSH428 0LOCarotids UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 SH428 ~ULBUS ULP0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 IS1 ULUS UL0CSIMAGE CS98892003\MR1\15820UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 IS2 ULUS UL0CSIMAGE CS98892003\MR2\15970UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULVUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM025109PSH134 0LOBrain UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 SH134 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 IS1 ULUS UL0CSIMAGE CS98892003\MR1\4919 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 IS2 ULrUS UL0CSIMAGE CS98892003\MR2\4950 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULdUS UL0CSIMAGE CS98892003\MR2\5011 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\4981 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM045357PSH2 0LO Brain-MRA UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 SH2 |UL US UL0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 IS1 ULUS UL0CSIMAGE CS98892003\MR1\5641 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 |UL#US UL!0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 IS2 UL"US UL0CSIMAGE CS98892003\MR2\6935 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 UL"US UL0CSIMAGE CS98892003\MR2\6605 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\6273 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS ULl$0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 IS700 ULl%US UL0CSIMAGE CS98892003\MR700\4558 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS1 ULl&US UL0CSIMAGE CS98892003\MR700\4528 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS2 ULl'US UL0CSIMAGE CS98892003\MR700\4588 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS3 ULl(US UL0CSIMAGE CS98892003\MR700\4467 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS4 ULl)US UL0CSIMAGE CS98892003\MR700\4618 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS5 ULl*US UL0CSIMAGE CS98892003\MR700\4678 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS6 ULUS UL0CSIMAGE CS98892003\MR700\4648 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS7 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR-bigEnd000066400000000000000000000255541515706620200277260ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.3SHOFFIS_DCMTK_363 0CS PYDICOM_TESTULUL 6US SQ)jUL 6US UL0CSPATIENT CS ISO_IR 100PNDoe^Archibald  LO77654033ULUS UL0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LOXR C Spine Comp Min 4 Views UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 SH2 |ULBUS ULX0CSSERIES`CSCR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 IS1 ULUS UL0CSIMAGE CS77654033\CR1\6154 UI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 IS2 ULUS UL0CSIMAGE CS77654033\CR2\6247 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL.0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 IS3 ULUS UL0CSIMAGE CS77654033\CR3\6278 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 ULUS UL0CSSTUDY CS ISO_IR 100 DA199509030TM173032PSH2 0LOCT, HEAD/BRAIN WO CONTRAST UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 SH2 |ULUS ULp0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 IS2 UL `US UL0CSIMAGE CS77654033\CT2\17106UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS18UL RUS UL0CSIMAGE CS77654033\CT2\17136UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS180 UL DUS UL0CSIMAGE CS77654033\CT2\17166UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS181 ULUS UL0CSIMAGE CS77654033\CT2\17196UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS182 fULUS UL 0CSPATIENT CS ISO_IR 100PN Doe^Peter  LO98890234ULUS UL `0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LO UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 SH2 |ULUS UL 0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 IS4 ULUS UL0CSIMAGE CS98892001\CT2N\6293UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS1 ULUS UL0CSIMAGE CS98892001\CT2N\6924UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS2 |ULUS ULP0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 IS5 UL@US UL0CSIMAGE CS98892001\CT5N\2062UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS6 UL0US UL0CSIMAGE CS98892001\CT5N\2392UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS7 UL US UL0CSIMAGE CS98892001\CT5N\2693UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS8 ULUS UL0CSIMAGE CS98892001\CT5N\3023UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS9 ULUS UL0CSIMAGE CS98892001\CT5N\3353UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS10ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM050743PSH428 0LOCarotids UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 SH428 ~ULBUS ULP0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 IS1 ULUS UL0CSIMAGE CS98892003\MR1\15820UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 IS2 ULUS UL0CSIMAGE CS98892003\MR2\15970UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULVUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM025109PSH134 0LOBrain UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 SH134 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 IS1 ULUS UL0CSIMAGE CS98892003\MR1\4919 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 IS2 ULrUS UL0CSIMAGE CS98892003\MR2\4950 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULdUS UL0CSIMAGE CS98892003\MR2\5011 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\4981 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM045357PSH2 0LO Brain-MRA UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 SH2 |UL US UL0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 IS1 ULUS UL0CSIMAGE CS98892003\MR1\5641 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 |UL#US UL!0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 IS2 UL"US UL0CSIMAGE CS98892003\MR2\6935 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 UL"US UL0CSIMAGE CS98892003\MR2\6605 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\6273 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS UL$l0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 IS700 UL%lUS UL0CSIMAGE CS98892003\MR700\4558 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS1 UL&lUS UL0CSIMAGE CS98892003\MR700\4528 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS2 UL'lUS UL0CSIMAGE CS98892003\MR700\4588 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS3 UL(lUS UL0CSIMAGE CS98892003\MR700\4467 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS4 UL)lUS UL0CSIMAGE CS98892003\MR700\4618 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS5 UL*lUS UL0CSIMAGE CS98892003\MR700\4678 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS6 ULUS UL0CSIMAGE CS98892003\MR700\4648 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS7 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR-empty.dcm000066400000000000000000000006141515706620200304240ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 0CS PYDICOM_TESTULULUS SQpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR-implicit000066400000000000000000000255461515706620200303510ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 0 PYDICOM_TEST0  )j0  0PATIENT  ISO_IR 100Doe^Archibald  77654033 0STUDY  ISO_IR 100 200101010000000P2 0XR C Spine Comp Min 4 Views .1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 2 |< R0SERIES`CR 01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 1  0IMAGE 77654033\CR1\6154 1.2.840.10008.5.1.4.1.1.101.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.111.2.840.10008.1.2.1DERIVED\PRIMARY 1 z 0SERIES`CR .1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 2  0IMAGE 77654033\CR2\6247 1.2.840.10008.5.1.4.1.1.1.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.71.2.840.10008.1.2.1DERIVED\PRIMARY 1 z (0SERIES`CR .1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 3  0IMAGE 77654033\CR3\6278 1.2.840.10008.5.1.4.1.1.1.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.91.2.840.10008.1.2.1DERIVED\PRIMARY 1  0STUDY  ISO_IR 100 199509030173032P2 0CT, HEAD/BRAIN WO CONTRAST 01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 2 | j0SERIES`CT 01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 2 Z  0IMAGE 77654033\CT2\171061.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.931.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 18L  0IMAGE 77654033\CT2\171361.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.941.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 180 >  0IMAGE 77654033\CT2\171661.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.951.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 181  0IMAGE 77654033\CT2\171961.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.961.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 182 f  0PATIENT  ISO_IR 100 Doe^Peter  98890234 Z 0STUDY  ISO_IR 100 200101010000000P2 0 01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 2 |  0SERIES`CT 01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 4  0IMAGE 98892001\CT2N\62931.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.31.2.840.10008.1.2.1ORIGINAL\PRIMARY\LOCALIZER 1  0IMAGE 98892001\CT2N\69241.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.51.2.840.10008.1.2.1ORIGINAL\PRIMARY\LOCALIZER 2 | J0SERIES`CT 01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 5 : 0IMAGE 98892001\CT5N\20621.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.121.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 6 * 0IMAGE 98892001\CT5N\23921.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.131.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 7  0IMAGE 98892001\CT5N\26931.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.141.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 8   0IMAGE 98892001\CT5N\30231.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.151.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 9  0IMAGE 98892001\CT5N\33531.2.840.10008.5.1.4.1.1.201.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.161.2.840.10008.1.2.1ORIGINAL\PRIMARY\AXIAL 10 0STUDY  ISO_IR 100 200305050050743P428 0Carotids 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 428 ~< J0SERIES`MR 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 1  0IMAGE 98892003\MR1\158201.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.4761.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 1 ~ 0SERIES`MR 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 2  0IMAGE 98892003\MR2\159701.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.4821.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 1 P |0STUDY  ISO_IR 100 200305050025109P134 0Brain 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 134 ~ 0SERIES`MR 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 1  0IMAGE 98892003\MR1\4919 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1351.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 1 ~ z0SERIES`MR 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 2 l 0IMAGE 98892003\MR2\4950 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1371.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 1 ^ 0IMAGE 98892003\MR2\5011 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1391.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 2  0IMAGE 98892003\MR2\4981 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1381.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 3  0STUDY  ISO_IR 100 200305050045357P2 0 Brain-MRA 01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 2 |  0SERIES`MR 01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 1  0IMAGE 98892003\MR1\5641 1.2.840.10008.5.1.4.1.1.401.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.161.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 1 |# !0SERIES`MR 01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 2 ! 0IMAGE 98892003\MR2\6935 1.2.840.10008.5.1.4.1.1.401.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.201.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 1 " 0IMAGE 98892003\MR2\6605 1.2.840.10008.5.1.4.1.1.401.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.191.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 2  0IMAGE 98892003\MR2\6273 1.2.840.10008.5.1.4.1.1.401.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.181.2.840.10008.1.2.1ORIGINAL\PRIMARY\OTHER 3  f$0SERIES`MR 21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 700 f% 0IMAGE 98892003\MR700\4558 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1211.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 1 f& 0IMAGE 98892003\MR700\4528 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1201.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 2 f' 0IMAGE 98892003\MR700\4588 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1221.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 3 f( 0IMAGE 98892003\MR700\4467 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1191.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 4 f) 0IMAGE 98892003\MR700\4618 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1231.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 5 f* 0IMAGE 98892003\MR700\4678 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1251.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 6  0IMAGE 98892003\MR700\4648 1.2.840.10008.5.1.4.1.1.421.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1241.2.840.10008.1.2.1"DERIVED\SECONDARY\PROJECTION IMAGE 7 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR-nooffset000066400000000000000000000255241515706620200303560ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 0CS PYDICOM_TESTULUL6 US SQ)jUL6 US UL0CSPATIENT CS ISO_IR 100PNDoe^Archibald  LO77654033ULUS UL0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LOXR C Spine Comp Min 4 Views UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 SH2 |ULBUS ULX0CSSERIES`CSCR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 IS1 ULUS UL0CSIMAGE CS77654033\CR1\6154 UI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 IS2 ULUS UL0CSIMAGE CS77654033\CR2\6247 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL.0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 IS3 ULUS UL0CSIMAGE CS77654033\CR3\6278 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 ULUS UL0CSSTUDY CS ISO_IR 100 DA199509030TM173032PSH2 0LOCT, HEAD/BRAIN WO CONTRAST UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 SH2 |ULUS ULp0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 IS2 UL` US UL0CSIMAGE CS77654033\CT2\17106UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS18ULR US UL0CSIMAGE CS77654033\CT2\17136UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS180 ULD US UL0CSIMAGE CS77654033\CT2\17166UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS181 ULUS UL0CSIMAGE CS77654033\CT2\17196UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS182 fULUS UL 0CSPATIENT CS ISO_IR 100PN Doe^Peter  LO98890234ULUS UL` 0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LO UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 SH2 |ULUS UL 0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 IS4 ULUS UL0CSIMAGE CS98892001\CT2N\6293UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS1 ULUS UL0CSIMAGE CS98892001\CT2N\6924UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS2 |ULUS ULP0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 IS5 UL@US UL0CSIMAGE CS98892001\CT5N\2062UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS6 UL0US UL0CSIMAGE CS98892001\CT5N\2392UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS7 UL US UL0CSIMAGE CS98892001\CT5N\2693UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS8 ULUS UL0CSIMAGE CS98892001\CT5N\3023UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS9 ULUS UL0CSIMAGE CS98892001\CT5N\3353UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS10ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM050743PSH428 0LOCarotids UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 SH428 ~ULBUS ULP0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 IS1 ULUS UL0CSIMAGE CS98892003\MR1\15820UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 IS2 ULUS UL0CSIMAGE CS98892003\MR2\15970UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULVUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM025109PSH134 0LOBrain UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 SH134 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 IS1 ULUS UL0CSIMAGE CS98892003\MR1\4919 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 IS2 ULrUS UL0CSIMAGE CS98892003\MR2\4950 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULdUS UL0CSIMAGE CS98892003\MR2\5011 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\4981 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM045357PSH2 0LO Brain-MRA UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 SH2 |UL US UL0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 IS1 ULUS UL0CSIMAGE CS98892003\MR1\5641 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 |UL#US UL!0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 IS2 UL"US UL0CSIMAGE CS98892003\MR2\6935 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 UL"US UL0CSIMAGE CS98892003\MR2\6605 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\6273 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS ULl$0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 IS700 ULl%US UL0CSIMAGE CS98892003\MR700\4558 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS1 ULl&US UL0CSIMAGE CS98892003\MR700\4528 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS2 ULl'US UL0CSIMAGE CS98892003\MR700\4588 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS3 ULl(US UL0CSIMAGE CS98892003\MR700\4467 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS4 ULl)US UL0CSIMAGE CS98892003\MR700\4618 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS5 ULl*US UL0CSIMAGE CS98892003\MR700\4678 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS6 US0CSIMAGE CS98892003\MR700\4648 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS7 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR-nopatient000066400000000000000000000255541515706620200305370ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 0CS PYDICOM_TESTULUL6 US SQ)ULUS UL0CSIMAGE CS77654033\CR1\6154 UI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 |ULBUS UL0CSSERIES`CSCR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 IS1 ULUS ULv0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LOXR C Spine Comp Min 4 Views UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 SH2 jUL6 US UL0CSUNKNOWN CS ISO_IR 100PNDoe^Archibald  LO77654033zULUS UL0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 IS2 ULUS UL0CSIMAGE CS77654033\CR2\6247 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL.0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 IS3 ULUS UL0CSIMAGE CS77654033\CR3\6278 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 ULUS UL0CSSTUDY CS ISO_IR 100 DA199509030TM173032PSH2 0LOCT, HEAD/BRAIN WO CONTRAST UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 SH2 |ULUS ULp0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 IS2 UL` US UL0CSIMAGE CS77654033\CT2\17106UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS18ULR US UL0CSIMAGE CS77654033\CT2\17136UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS180 ULD US UL0CSIMAGE CS77654033\CT2\17166UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS181 ULUS UL0CSIMAGE CS77654033\CT2\17196UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS182 fULUS UL 0CSUNKNOWN CS ISO_IR 100PN Doe^Peter  LO98890234ULUS UL` 0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LO UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 SH2 |ULUS UL 0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 IS4 ULUS UL0CSIMAGE CS98892001\CT2N\6293UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS1 ULUS UL0CSIMAGE CS98892001\CT2N\6924UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS2 |ULUS ULP0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 IS5 UL@US UL0CSIMAGE CS98892001\CT5N\2062UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS6 UL0US UL0CSIMAGE CS98892001\CT5N\2392UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS7 UL US UL0CSIMAGE CS98892001\CT5N\2693UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS8 ULUS UL0CSIMAGE CS98892001\CT5N\3023UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS9 ULUS UL0CSIMAGE CS98892001\CT5N\3353UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS10ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM050743PSH428 0LOCarotids UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 SH428 ~ULBUS ULP0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 IS1 ULUS UL0CSIMAGE CS98892003\MR1\15820UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 IS2 ULUS UL0CSIMAGE CS98892003\MR2\15970UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULVUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM025109PSH134 0LOBrain UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 SH134 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 IS1 ULUS UL0CSIMAGE CS98892003\MR1\4919 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 IS2 ULrUS UL0CSIMAGE CS98892003\MR2\4950 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULdUS UL0CSIMAGE CS98892003\MR2\5011 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\4981 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM045357PSH2 0LO Brain-MRA UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 SH2 |UL US UL0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 IS1 ULUS UL0CSIMAGE CS98892003\MR1\5641 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 |UL#US UL!0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 IS2 UL"US UL0CSIMAGE CS98892003\MR2\6935 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 UL"US UL0CSIMAGE CS98892003\MR2\6605 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\6273 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS ULl$0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 IS700 ULl%US UL0CSIMAGE CS98892003\MR700\4558 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS1 ULl&US UL0CSIMAGE CS98892003\MR700\4528 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS2 ULl'US UL0CSIMAGE CS98892003\MR700\4588 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS3 ULl(US UL0CSIMAGE CS98892003\MR700\4467 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS4 ULl)US UL0CSIMAGE CS98892003\MR700\4618 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS5 ULl*US UL0CSIMAGE CS98892003\MR700\4678 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS6 ULUS UL0CSIMAGE CS98892003\MR700\4648 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS7 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/DICOMDIR-reordered000066400000000000000000000255541515706620200305110ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI01.2.276.0.7230010.3.1.4.0.31906.1359940846.78187UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 0CS PYDICOM_TESTULUL6 US SQ)ULUS UL0CSIMAGE CS77654033\CR1\6154 UI1.2.840.10008.5.1.4.1.1.1UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 |ULBUS UL0CSSERIES`CSCR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.10 IS1 ULUS ULv0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LOXR C Spine Comp Min 4 Views UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.1 SH2 jUL6 US UL0CSPATIENT CS ISO_IR 100PNDoe^Archibald  LO77654033zULUS UL0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.6 IS2 ULUS UL0CSIMAGE CS77654033\CR2\6247 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.7UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 zULUS UL.0CSSERIES`CSCR UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.8 IS3 ULUS UL0CSIMAGE CS77654033\CR3\6278 UI1.2.840.10008.5.1.4.1.1.1UI.1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.9UI1.2.840.10008.1.2.1CSDERIVED\PRIMARY IS1 ULUS UL0CSSTUDY CS ISO_IR 100 DA199509030TM173032PSH2 0LOCT, HEAD/BRAIN WO CONTRAST UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.1 SH2 |ULUS ULp0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.2 IS2 UL` US UL0CSIMAGE CS77654033\CT2\17106UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.93UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS18ULR US UL0CSIMAGE CS77654033\CT2\17136UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.94UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS180 ULD US UL0CSIMAGE CS77654033\CT2\17166UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.95UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS181 ULUS UL0CSIMAGE CS77654033\CT2\17196UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1196530851.28319.0.96UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS182 fULUS UL 0CSPATIENT CS ISO_IR 100PN Doe^Peter  LO98890234ULUS UL` 0CSSTUDY CS ISO_IR 100 DA200101010TM000000PSH2 0LO UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.1 SH2 |ULUS UL 0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.2 IS4 ULUS UL0CSIMAGE CS98892001\CT2N\6293UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.3UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS1 ULUS UL0CSIMAGE CS98892001\CT2N\6924UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.5UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\LOCALIZER IS2 |ULUS ULP0CSSERIES`CSCT UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.6 IS5 UL@US UL0CSIMAGE CS98892001\CT5N\2062UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.12UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS6 UL0US UL0CSIMAGE CS98892001\CT5N\2392UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.13UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS7 UL US UL0CSIMAGE CS98892001\CT5N\2693UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.14UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS8 ULUS UL0CSIMAGE CS98892001\CT5N\3023UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.15UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS9 ULUS UL0CSIMAGE CS98892001\CT5N\3353UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.0.0.0.1194734704.16302.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\AXIAL IS10ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM050743PSH428 0LOCarotids UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.427 SH428 ~ULBUS ULP0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.475 IS1 ULUS UL0CSIMAGE CS98892003\MR1\15820UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.476UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.481 IS2 ULUS UL0CSIMAGE CS98892003\MR2\15970UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.482UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULVUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM025109PSH134 0LOBrain UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.133 SH134 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.134 IS1 ULUS UL0CSIMAGE CS98892003\MR1\4919 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.135UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ~ULUS UL0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.136 IS2 ULrUS UL0CSIMAGE CS98892003\MR2\4950 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.137UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 ULdUS UL0CSIMAGE CS98892003\MR2\5011 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.139UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\4981 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.138UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS UL0CSSTUDY CS ISO_IR 100 DA200305050TM045357PSH2 0LO Brain-MRA UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.1 SH2 |UL US UL0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.15 IS1 ULUS UL0CSIMAGE CS98892003\MR1\5641 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.16UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 |UL#US UL!0CSSERIES`CSMR UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.17 IS2 UL"US UL0CSIMAGE CS98892003\MR2\6935 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.20UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS1 UL"US UL0CSIMAGE CS98892003\MR2\6605 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.19UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS2 ULUS UL0CSIMAGE CS98892003\MR2\6273 UI1.2.840.10008.5.1.4.1.1.4UI01.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.18UI1.2.840.10008.1.2.1CSORIGINAL\PRIMARY\OTHER IS3 ULUS ULl$0CSSERIES`CSMR UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118 IS700 ULl%US UL0CSIMAGE CS98892003\MR700\4558 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.121UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS1 ULl&US UL0CSIMAGE CS98892003\MR700\4528 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.120UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS2 ULl'US UL0CSIMAGE CS98892003\MR700\4588 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.122UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS3 ULl(US UL0CSIMAGE CS98892003\MR700\4467 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.119UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS4 ULl)US UL0CSIMAGE CS98892003\MR700\4618 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.123UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS5 ULl*US UL0CSIMAGE CS98892003\MR700\4678 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.125UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS6 ULUS UL0CSIMAGE CS98892003\MR700\4648 UI1.2.840.10008.5.1.4.1.1.4UI21.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.124UI1.2.840.10008.1.2.1CS"DERIVED\SECONDARY\PROJECTION IMAGE IS7 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/README.txt000066400000000000000000000013171515706620200271100ustar00rootroot00000000000000In this directory are different variant of a DICOMDIR file representing the 3 patient directories. DICOMDIR: created using dcmmkdir from DCMTK DICOMDIR-bigEnd: created from DICOMDIR using dcmodify by changing the transfer syntax to Explicit Big Endian DICOMDIR-implicit: Created from DICOMDIR using pydicom's `FileSet.write(force_implicit=True)` DICOMDIR-nooffset: created from DICOMDIR by removing some of the 0-offset tags DICOMDIR-reordered: created from DICOMDIR by reordering the first 4 entries (IMAGE - SERIES - STUDY - PATIENT instead of PATIENT - STUDY - SERIES - IMAGE) and adapting the offsets DICOMDIR-nopatient: created from DICOMDIR by changing the type of the patient records to an invalid type pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/000077500000000000000000000000001515706620200271005ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/DICOMDIR000066400000000000000000000314121515706620200302160ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.1.3.10UI@1.2.826.0.1.3680043.8.498.13310337561057916028308220465916918503UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 0CS TINY ALPHAACSREADMEULULUS SQd1VULUS UL0CSPATIENT PN Citizen^Jan  LO12345678ULUS UL0CSSTUDY  DA202009130TM161900PSH1 0LOTesting File-set UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 SH1 ULUS ULb0CSSERIES`CSCT UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 IS1 ULVUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000000 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66612287766462461480665815941164330386UI1.2.840.10008.1.2.1 IS0 ULJUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000001 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12115047524926768403560502639836072073UI1.2.840.10008.1.2.1 IS1 UL>US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000002 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66784929072918207642476454008796697940UI1.2.840.10008.1.2.1 IS2 UL2US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000003 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13645236810443943660637618904613983143UI1.2.840.10008.1.2.1 IS3 UL&US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000004 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.76699626803877342870633945329828164171UI1.2.840.10008.1.2.1 IS4 UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000005 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66184547011989428728594036538908638913UI1.2.840.10008.1.2.1 IS5 UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000006 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.87588134382883584301846823719395292338UI1.2.840.10008.1.2.1 IS6 UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000007 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.96164889035342102974383231052483829728UI1.2.840.10008.1.2.1 IS7 UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000008 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.15963657941914299447645217965265746821UI1.2.840.10008.1.2.1 IS8 UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000009 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.90131455877146331258883580955673040933UI1.2.840.10008.1.2.1 IS9 UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000A UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12485250834083961181543719171663851904UI1.2.840.10008.1.2.1 IS10ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000B UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.87027502293230770293211770740093636699UI1.2.840.10008.1.2.1 IS11ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000C UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10800150351622048886755954724419596215UI1.2.840.10008.1.2.1 IS12ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000D UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.83281926972984671902912092385162201948UI1.2.840.10008.1.2.1 IS13ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000E UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11939377878867610971829787083653117076UI1.2.840.10008.1.2.1 IS14ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000F UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.55521114374581643470209736703601954532UI1.2.840.10008.1.2.1 IS15ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000G UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.96703606685483616320139580904886281824UI1.2.840.10008.1.2.1 IS16ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000H UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11309425163096254442905166557685025111UI1.2.840.10008.1.2.1 IS17UL~US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000I UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.65571441292133590309670822077466268819UI1.2.840.10008.1.2.1 IS18ULrUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000J UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.20370980342571381824237338387568385641UI1.2.840.10008.1.2.1 IS19ULfUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000K UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13319206239967620167264246541208249833UI1.2.840.10008.1.2.1 IS20ULZUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000L UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10738145364554773522322457810382463149UI1.2.840.10008.1.2.1 IS21ULNUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000M UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.56625845182139220002996408592182404907UI1.2.840.10008.1.2.1 IS22ULBUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000N UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.47917998001550771134946207538353991229UI1.2.840.10008.1.2.1 IS23UL6US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000O UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.27000547446331316903269126658207160710UI1.2.840.10008.1.2.1 IS24UL*US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000P UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.63908878371301978095878659770391705640UI1.2.840.10008.1.2.1 IS25ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000Q UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.63106908961231877751487467768370171459UI1.2.840.10008.1.2.1 IS26ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000R UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.98006281511413859490237866176692537067UI1.2.840.10008.1.2.1 IS27ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000S UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.24576939568253585098408167173698553075UI1.2.840.10008.1.2.1 IS28ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000T UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.90025468666899431500228730282509773148UI1.2.840.10008.1.2.1 IS29UL US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000U UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.61289740851772074382610546644533136426UI1.2.840.10008.1.2.1 IS30UL!US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000V UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10339284764105332144091992388207826472UI1.2.840.10008.1.2.1 IS31UL"US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000W UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13132512333524895825885936226340099200UI1.2.840.10008.1.2.1 IS32UL#US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000X UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.31364613324058946746776339091270395463UI1.2.840.10008.1.2.1 IS33UL$US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000Y UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.33438145735846696020160722778137296005UI1.2.840.10008.1.2.1 IS34UL%US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00000Z UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.58965241363386990426392503840207597063UI1.2.840.10008.1.2.1 IS35UL&US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000010 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.59920294709453045915752722025901733948UI1.2.840.10008.1.2.1 IS36UL'US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000011 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.30314430588013977344239544548072887164UI1.2.840.10008.1.2.1 IS37UL(US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000012 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11016773328518770417618065149789555568UI1.2.840.10008.1.2.1 IS38UL)US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000013 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.14954972048006757686711404500323822614UI1.2.840.10008.1.2.1 IS39ULv*US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000014 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12005726531596389485789246831081529041UI1.2.840.10008.1.2.1 IS40ULj+US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000015 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13080662425590703283940223552838983096UI1.2.840.10008.1.2.1 IS41UL^,US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000016 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.97244803667620709009471838100346935122UI1.2.840.10008.1.2.1 IS42ULR-US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000017 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.39564379742709048966673364461319745782UI1.2.840.10008.1.2.1 IS43ULF.US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000018 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.74872050809901865940725431980043045793UI1.2.840.10008.1.2.1 IS44UL:/US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM000019 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11282187586766061312398412557996347495UI1.2.840.10008.1.2.1 IS45UL.0US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00001A UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.22410342304752760132016235320686689336UI1.2.840.10008.1.2.1 IS46UL"1US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00001B UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.48216821017189966433743019685870898315UI1.2.840.10008.1.2.1 IS47UL2US UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00001C UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.26999560216637566655190145402282271551UI1.2.840.10008.1.2.1 IS48ULUS UL0CSIMAGE CS$PT000000\ST000000\SE000000\IM00001D UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11794136111743664474225727064668760656UI1.2.840.10008.1.2.1 IS49pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/000077500000000000000000000000001515706620200300635ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/000077500000000000000000000000001515706620200310515ustar00rootroot00000000000000SE000000/000077500000000000000000000000001515706620200317415ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000IM000000000066400000000000000000000013441515706620200326330ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66612287766462461480665815941164330386UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66612287766462461480665815941164330386 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS0 IM000001000066400000000000000000000013441515706620200326340ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12115047524926768403560502639836072073UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12115047524926768403560502639836072073 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS1 IM000002000066400000000000000000000013441515706620200326350ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66784929072918207642476454008796697940UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66784929072918207642476454008796697940 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS2 IM000003000066400000000000000000000013441515706620200326360ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13645236810443943660637618904613983143UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13645236810443943660637618904613983143 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS3 IM000004000066400000000000000000000013441515706620200326370ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.76699626803877342870633945329828164171UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.76699626803877342870633945329828164171 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS4 IM000005000066400000000000000000000013441515706620200326400ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66184547011989428728594036538908638913UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.66184547011989428728594036538908638913 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS5 IM000006000066400000000000000000000013441515706620200326410ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.87588134382883584301846823719395292338UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.87588134382883584301846823719395292338 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS6 IM000007000066400000000000000000000013441515706620200326420ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.96164889035342102974383231052483829728UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.96164889035342102974383231052483829728 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS7 IM000008000066400000000000000000000013441515706620200326430ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.15963657941914299447645217965265746821UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.15963657941914299447645217965265746821 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS8 IM000009000066400000000000000000000013441515706620200326440ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.90131455877146331258883580955673040933UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.90131455877146331258883580955673040933 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS9 IM00000A000066400000000000000000000013441515706620200326540ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12485250834083961181543719171663851904UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12485250834083961181543719171663851904 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS10IM00000B000066400000000000000000000013441515706620200326550ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.87027502293230770293211770740093636699UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.87027502293230770293211770740093636699 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS11IM00000C000066400000000000000000000013441515706620200326560ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10800150351622048886755954724419596215UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10800150351622048886755954724419596215 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS12IM00000D000066400000000000000000000013441515706620200326570ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.83281926972984671902912092385162201948UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.83281926972984671902912092385162201948 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS13IM00000E000066400000000000000000000013441515706620200326600ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11939377878867610971829787083653117076UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11939377878867610971829787083653117076 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS14IM00000F000066400000000000000000000013441515706620200326610ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.55521114374581643470209736703601954532UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.55521114374581643470209736703601954532 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS15IM00000G000066400000000000000000000013441515706620200326620ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.96703606685483616320139580904886281824UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.96703606685483616320139580904886281824 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS16IM00000H000066400000000000000000000013441515706620200326630ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11309425163096254442905166557685025111UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11309425163096254442905166557685025111 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS17IM00000I000066400000000000000000000013441515706620200326640ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.65571441292133590309670822077466268819UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.65571441292133590309670822077466268819 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS18IM00000J000066400000000000000000000013441515706620200326650ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.20370980342571381824237338387568385641UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.20370980342571381824237338387568385641 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS19IM00000K000066400000000000000000000013441515706620200326660ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13319206239967620167264246541208249833UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13319206239967620167264246541208249833 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS20IM00000L000066400000000000000000000013441515706620200326670ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10738145364554773522322457810382463149UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10738145364554773522322457810382463149 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS21IM00000M000066400000000000000000000013441515706620200326700ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.56625845182139220002996408592182404907UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.56625845182139220002996408592182404907 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS22IM00000N000066400000000000000000000013441515706620200326710ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.47917998001550771134946207538353991229UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.47917998001550771134946207538353991229 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS23IM00000O000066400000000000000000000013441515706620200326720ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.27000547446331316903269126658207160710UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.27000547446331316903269126658207160710 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS24IM00000P000066400000000000000000000013441515706620200326730ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.63908878371301978095878659770391705640UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.63908878371301978095878659770391705640 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS25IM00000Q000066400000000000000000000013441515706620200326740ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.63106908961231877751487467768370171459UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.63106908961231877751487467768370171459 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS26IM00000R000066400000000000000000000013441515706620200326750ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.98006281511413859490237866176692537067UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.98006281511413859490237866176692537067 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS27IM00000S000066400000000000000000000013441515706620200326760ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.24576939568253585098408167173698553075UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.24576939568253585098408167173698553075 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS28IM00000T000066400000000000000000000013441515706620200326770ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.90025468666899431500228730282509773148UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.90025468666899431500228730282509773148 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS29IM00000U000066400000000000000000000013441515706620200327000ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.61289740851772074382610546644533136426UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.61289740851772074382610546644533136426 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS30IM00000V000066400000000000000000000013441515706620200327010ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10339284764105332144091992388207826472UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.10339284764105332144091992388207826472 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS31IM00000W000066400000000000000000000013441515706620200327020ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13132512333524895825885936226340099200UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13132512333524895825885936226340099200 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS32IM00000X000066400000000000000000000013441515706620200327030ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.31364613324058946746776339091270395463UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.31364613324058946746776339091270395463 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS33IM00000Y000066400000000000000000000013441515706620200327040ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.33438145735846696020160722778137296005UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.33438145735846696020160722778137296005 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS34IM00000Z000066400000000000000000000013441515706620200327050ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.58965241363386990426392503840207597063UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.58965241363386990426392503840207597063 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS35IM000010000066400000000000000000000013441515706620200326340ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.59920294709453045915752722025901733948UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.59920294709453045915752722025901733948 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS36IM000011000066400000000000000000000013441515706620200326350ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.30314430588013977344239544548072887164UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.30314430588013977344239544548072887164 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS37IM000012000066400000000000000000000013441515706620200326360ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11016773328518770417618065149789555568UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11016773328518770417618065149789555568 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS38IM000013000066400000000000000000000013441515706620200326370ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.14954972048006757686711404500323822614UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.14954972048006757686711404500323822614 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS39IM000014000066400000000000000000000013441515706620200326400ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12005726531596389485789246831081529041UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.12005726531596389485789246831081529041 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS40IM000015000066400000000000000000000013441515706620200326410ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13080662425590703283940223552838983096UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.13080662425590703283940223552838983096 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS41IM000016000066400000000000000000000013441515706620200326420ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.97244803667620709009471838100346935122UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.97244803667620709009471838100346935122 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS42IM000017000066400000000000000000000013441515706620200326430ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.39564379742709048966673364461319745782UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.39564379742709048966673364461319745782 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS43IM000018000066400000000000000000000013441515706620200326440ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.74872050809901865940725431980043045793UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.74872050809901865940725431980043045793 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS44IM000019000066400000000000000000000013441515706620200326450ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11282187586766061312398412557996347495UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11282187586766061312398412557996347495 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS45IM00001A000066400000000000000000000013441515706620200326550ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.22410342304752760132016235320686689336UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.22410342304752760132016235320686689336 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS46IM00001B000066400000000000000000000013441515706620200326560ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.48216821017189966433743019685870898315UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.48216821017189966433743019685870898315 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS47IM00001C000066400000000000000000000013441515706620200326570ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.26999560216637566655190145402282271551UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.26999560216637566655190145402282271551 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS48IM00001D000066400000000000000000000013441515706620200326600ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/PT000000/ST000000/SE000000DICMULOBUI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11794136111743664474225727064668760656UI1.2.840.10008.1.2.1UI1.2.826.0.1.3680043.8.498.1SHPYDICOM 2.1.0 UI1.2.840.10008.5.1.4.1.1.2UI@1.2.826.0.1.3680043.8.498.11794136111743664474225727064668760656 DA202009130TM161900PSH1 `CSCT0LOTesting File-setPN Citizen^Jan  LO12345678 UI@1.2.826.0.1.3680043.8.498.64108189007039777171766333999874882472 UI@1.2.826.0.1.3680043.8.498.73052100648462801855733330064330327590 SH1 IS1 IS49pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/dicomdirtests/TINY_ALPHA/README000066400000000000000000000022661515706620200277660ustar00rootroot00000000000000"""Tiny testing File-set created using pydicom None of the managed SOP Instances are conformant, but they contain the minimum required to be included in a File-set """ #!/usr/bin/env python from pydicom import Dataset from pydicom.fileset import FileSet from pydicom.uid import ExplicitVRLittleEndian, generate_uid, CTImageStorage # True for alphanumeric filenames, False for numeric use_alphanumeric = True fs = FileSet() if use_alphanumeric: fs.ID = "TINY ALPHA" fs._use_alphanumeric = True else: fs.ID = "TINY NUMERIC" fs.DescriptorFileID = "README" ds = Dataset() ds.file_meta = Dataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.SOPClassUID = CTImageStorage ds.PatientName = "Citizen^Jan" ds.PatientID = "12345678" ds.StudyDate = "20200913" ds.StudyTime = "161900" ds.StudyInstanceUID = generate_uid() ds.StudyDescription = "Testing File-set" ds.StudyID = "1" # SH ds.AccessionNumber = "1" # SH ds.Modality = "CT" ds.SeriesInstanceUID = generate_uid() ds.SeriesNumber = 1 # IS for ii in range(50): ds.InstanceNumber = ii # IS ds.SOPInstanceUID = generate_uid() fs.add(ds) if use_alphanumeric: fs.write("tiny_alpha") else: fs.write("tiny") pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/empty_charset_LEI.dcm000066400000000000000000000004241515706620200265600ustar00rootroot00000000000000DICMULVOBUI1.2.840.10008.1.2UI1.2.3.18.133392880203SHAEORIGINAL\PRIMARY\SINGLE PLANE pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/examples_jpeg2k.dcm000066400000000000000000004542401515706620200263110ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.6.1UI01.3.6.1.4.1.5962.1.1.13.1.2.20040826185059.5457UI1.2.840.10008.1.2.4.90UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSDERIVED\PRIMARY\SMALL PARTS DA20040826TM185840UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.6.1UI01.3.6.1.4.1.5962.1.1.13.1.2.20040826185059.5457 DA200408260TM185059PSH`CSUSpLOG.E. Medical SystemsLOBAPTIST MED CTR PNSH-0400 SHmvme22LO LOGIQ 700 !ST JPEG 2000 reversible (lossless) !SQPUI1.2.840.10008.5.1.4.1.1.6.1UUI01.3.6.1.4.1.5962.1.1.13.1.1.20040826185059.5457@pSQSH121320SHDCM LOUncompressed predecessor "!IS0 $!IS1 (!IS0 *!IS1 PNCompressedSamples^US1  LO13US1 0DA2TM@CSM  DS0.0000000DS0.000000!LTLO4121885  LOR1.0.D UI,1.3.6.1.4.1.5962.1.2.13.20040826185059.5457 UI.1.3.6.1.4.1.5962.1.3.13.1.20040826185059.5457 SH13US1 IS1 IS2 CS @LT JPEG 2000 reversible (lossless) (US(CSYBR_RCT (US(US(US(US(US(US(US(!CS00OBOQ/R \ PXX`XX`XX`XX`XX`dKakadu-2.2 R}E ֘=^+%[lvHCS~ b%' X U:I;\y'ɵވk R 3t\RdW@. qDjmh]ӴYTOPaxPami1Z&cܒόU%bZf?0poo p 'nF_^(INh<:zDue|nEdyR 3&,@-Nz$X|.U2˼e*595IE{Nj 7=+%|d`rR.IMAwNuꒇQ0`=NL P[]F+gAGTحe,Z |ZtW:]k*dpiݿX.滣of{K#~'V,\6܉Y[g4Fyp#6, C1*=n\{+>(ȽDM!m5&(L7Ⱦc٘B8;Q_Vyd ׀WNvQQ|J:W5(Ōa4kfHm#yS"۶) *+u6)bɍn\6 . x (\Ʋi4'pSb`Hf9+v:oÓ4ݚ>T VnX[EOO,y0a :TNٸz6q  |w/%8=D0ɷTZtTծ 2. f&KFW2*-ϕ9_r`3U/7]3$Ǔj>z`t6Oø "?|oK6̳dfn*˼8CQ(Ho JNr٩]?_l8\Ua̧o{P/5vrJEsH߇h]0OdK閆p:#v=5Ll*Hr?#jҠc>iߓݠbw6S ׆70W3K8}<Bћ* HГ({z(>C{F 'nz j@};{s5^h)Wou3: l-0JqI=3}gv]x5RD/JѩNM s/Xb fPYVŐB~$rȳFNcKKAtgy1`wU<}@&qlgwBAaRfB^NHZ&q${$ҶE32/Ւߒ=1͘ܥReL # d_$8ӜNXth%k)rDf*_LiXelL~ؘj"lsI@r¶ NfPC {({lEc3FYٙI%U0*O3) lj-}qy9'se9 ]Z?-5I+nI!6CK5 [91M3X,ժ#ʠ|N(*ikdt;3|J\Y$(ҷC4+Fzg+jьHسxG`SdƮqJzȴkګ6˪-M;SB_iu$UNv'LSI T~F2I X}eLh>2=$2%zӽKc:-t!7SޟW{1vKji'FRXlou0 v寄4>D4g <[7C#Jľ4e^#4m`/-7:lgcSe&$ןj@ Ћ)y b-'^I+*Jȣk1!g=0c s*3L ݢTT։@rv J _uyf}%<3Ҟru٧Ms}j4)M)i)1Q˔NFYeYrÒRlgX&1+7g,D b \t3Eu5+ݫV Ǧ>k#Chʄ:>= 7X0]w(3TwS5*BJ#4(gͲ^զ@/s"Zil^݃dJi%>^:Atx# HԼQL> D^O1N д^R)IFn3: *ص2'"dM}q2_3U|>wP}i(l>0^ݷqƆ5nò'˹C^)dZ5Qr7uGpw> oQ5U$BV3.O@iw+QbOdWaxZ2D[D£LN.oä|~G 贪[9{4`sjC{Y@ B:Ѫ|N2dd8Z?`^|SHoC&H^=؛tw>+1<{T|I"E^|1S̪-F-ib@w I\Z=X l£ bv}ꕖ )*V|'y .Z%I,dju 5rx$Ѽ=YK}Yz1V#B!Wh#&T.(T̀,&0'U|!8̲riui *$kGdTֱ͜/u_,i~HcKX \)f uE[|k $C^!չ@a+Ѽu_8MJق0We^3Lx3;;4r],njD} EWmPll +D3Г8ňuW&0֔!P'0+T+6)03cRGA7x"(}"^!6d{Y4ZQ%g݅ȡ&0vA<_+4Ze&ڷ7G?}\4FF| {tC@tӊpYxU`/#i\N#2*n zb鬑VDݽC̢V2&̺1FHW[JiTJ:m/U4?<ߤ dp5KA/\Ue?qAf҂Ʌ37<.UNQ=VWOϔdqR`se9٫T~Yu IO p.^ ew-.yW^]`8wuՇOj=*c,󇄢P )Sxh oJoh/M6KKkN2Vj?_aW-4')Y2#j6g< >/)Ίc'<3b7oPǿ)*ŮXŮs Z[%w@-.Ǹ(>sL x'h:,$9~Qs>}.kLv]3YѦ"/TNQCWj_9#X*:]#EAԵ}z#2XMTjݚpuɅ&V뵌Hl[څ36o8N&>f20c\!${lD\ܴA?Y"Py9 q%L氛&1p|iY|Zݱ Z Y7KgC.ܮ`Ejp٠}$g/ç?o≂b-\Wozx5Ev#qzU/!V^KH #TK #Y98մuO^XDnuNOxQ@܌Vx\:Wżbrl&e=ᣭn~3` W]-8V5zиTXz]͕oSE.۽p?77m-մ#ce/ObA%Rf+PAL:3nxӆZe1DjԴ }*gQ)32S= o"$;hR^+^-?u~Sj>XKv]|3L C{yu;>b_pMkeZz+C+HbJ5M%01,X^w a]j23lhNrg !'g P$Br ɧ`:J:Xw{)z R]OjQt^ikp `l"ʉGm6bmmTuFIu %YcC #5i9۹'*yu @xh2f $XN-B6Ջ JE:KN5Z B<ȒBX S:<}|"٩]<&=yZ@jPssINA1b%(:|#IwdNNB>K;rRD! W:O"HI;xW ;Yg}xYY-U.*"@=8ZY*[S=p Zf=MH{gB0\QClPkMsFv-3,4v]r>!|U"~4ʦeD+qNLQj:{EN<"GY!"Z>EwҘ/xQD cQq(;ɁIlsGМCP_RL oXC ~$ /J;>{c{D M{W86U^ 2ұ n G8e/|nޔSP< 5\fW|ʠlXgسϛ).qlDu\-~r0ߌ.y\ķt`,&2LqtLO1 dZP2moZT/hHqjH_xwQ2=ec\YSKX 'cPv ]YT;!rNM )\a;4Xg+S 61O7E?kPqNXN iУdr 1 !v<˲%_[ҲHApE4񄰔.-čY.3d`%ό'ZZv|~1Iz\X1E,v&97mN:5 N__XX!G-\2B52g̩Ȇ`Ot-PaOR@̍#W lE>y`fKekJ"HrP5i;Ǖ 63UBDI,r^Z&`\H6 %߷`3Eq6/񁔔VǸm/b]KԸHro+Č cP>`N d>/"feD?EA,W)ljYo##5TTԡO^R-虜i*0Ȝh)pnxvߕ=7gIʒBKcl hfmfLzo3}54?+:f<ֶI+@Mn0T-z0UTdD$8F o+Sy*="c9\:o2fXV %&D. /_-Vm:wLC0`*b? Sc웋$c*gf2%|OD[`>Q:~75d Bn7Uіd@CX Ha\r9zܧ3lOmL<^#BTPJ_:">vog\u #}ҩ@Yw%sЍ bs:u-/5EM+Ro,|h@k ׉F^XRwx=ڰjEgq%٘`/Y~GPsv( 4* Cq33ɱȥk[;n(u|HG0ᙬ! l)g]!4礪ni|qyV_[B( ^Uډ+7\\߷[Ay˸UW q e_SL Lǖ Fj[tz ,@+T_90egEsMD:0mg0Rߖ-APȚ8΋K3>r&kPy!Zh߭oB}3Z2xf4LgMISՁ\;GGFc,s6m(Eyo)B`8( '}UCGXٖ5]+H4VG!g94jr"m> Ugnv`Oŷ,ǷB\%T:2"[ ~4.(-A%W ĈdΙ5GF1aTw@HΪk BdGͲ5OwN#jM+)Fy{L~t jg}pJt=$ "/3Uܡ[l}g pnMfK2k^{F7rbpTt6|O6ܨ2Ԥ3=ˣ?玣aG1IJTl]ý} :*ō|f*VKU!Rl %|uygo4x=^gA! ʄKwkCMp\{+E+ n;K #8'B;Wx=߃-L!kI߬{>.ݝZϨŒ-tPo0AUƨ#*l7]LEΌ/k14-g%vW x?֠yQIz}aj.r]1KȠ U 'w#^#C=L/Mjz .sρɕZc}\׌F$` Q~H6K2{iNt7 t/D-%yMP؏zOԴXm2Dҕ#J!}H q0RBF+)4eݶJP;:urqbsࠈfiъpq7uwE10mX$SxG]QykӦ8]Ylw!U w`퓮CR%n˙`]+RKvmQL `ϓ,V;biPijqk)1̋fS?Hzz*`bp-4{W59`lEIgL݋iC"aRfϯ_Z'N4PD:ЕIdyhQ>(ƾ8ĈrkQԘa kY 7s(>fnGv5E5nA>/*دb^lx$L5"ɇg `QdtU Am-H!P*|5MaZ&lYkD 1$BinapY.fҘuFńԒK}- gwRd-+LZT4m /x94)6cSOsViO}L⟦Xp)izyOL'Vp/bYdhՅ1 -1$#<3ӹ~pv*^䋄 Odf5a6\ 5ByA| SowMAFWm.4F G q8}Xzm@OuU . w%ާOVy-֜C?@~HBgC^nzW1D1m: /dnFKCϚC`dZ\lN~X^H :J>~Vq ѷ οi R~`;޻[yeȩ*cfkK>sL0,JP #xRo"2Ƣ.ZX 9q!Alj`uM=Pɺ(΅D0,ʤTU:ө-.Hݐ&U@1vN2{cN?X@&<Z{J3=d|W^:/䱍L'ߖP fm:k5:Ғrx|3Vt~< 3~ݛo+Wm?s LZPhȇ{֏6mS! v1E+DIZP>5ge0kz=]c6}fHWvRx3fXq||i>8*(.?( w\I~BJd;|1넃s߃a^X !i_.`iIJmC=ƊmQ/yȽo>7 [l-pcEKml~ߦ7w3+m b2ÏČ? ڄ@<ؿy *a8sڧHzvg$ NB&s+1 Q)iuEzi[ *7l4#\aT^MߦFo8bW7* @=v:Sa*=!!56B) Sji U!5Q> j{Hg{PqWDTԇ8Jɥ/nokEk(ўD2L5߂ a,Wo'tg3 l[Xg9ay/Y;d0Υ@<ᣆ6f*d59 @ex#m4: RcXI~#_]AJoML,`(0AaRwEJ9I(M8/BQut!$#9@ytGM&< Lj +L̀rU?9L&F wr+kuś]DQ-B7ҵR9#"n{;t\Dgg?0 Ym(.wkFiBKJ8vw+A\%n/H}& =QBQ|V[ZNYt'1LyD)1ͣQ7)|0wTʄJ!lg@!}QwG#^`2=`Ix[/zBӃ.5 Id?%ljJk5zqd}6B]}gLؓ/hL.*2lD&OѴSmj~MfbJ}vP3ۨI\"̧twûi'<:%q7vhՀ$  3t89 CNx?nPe j#:ʗԢLtyڃabT- Hn}=TvzXKD5Z&ܼ xhn0R O=_կ@;ЧDH4}G&mXC+~ے+b=rC/@^zTTX#-ضK:ݏ? &ɮ^V2n*O 0\z. nA+N{h@-^2L^EFZ8R!V=[~tڐ݂o/V5o-:7t RlT"TO$OhmӞc+y$G^"G/7E?-yˇƢ/\R2FZf7zTiRf%nfVzID@BF@vk"DOXǿQdGC ƉRs,q}m@ݣAn?*TĀz熝y ӳL=;sN’$CǦJ%X+?Bhi\ A Vġ :>(t"+J[?ySToYBs'=z{-AX-iO\]S _: O0lV 2i7 4w+[`$G8$dKe& Caoɂ+)IƮi1xLJ./5 sI(Б@B3 qS'rF+ $njQ(XNnԹ("Hq6uXfy \4_ٛ ރ!t Y8ぎ ?DK6Ot6 Pv>7X4 /7>"X0A: wVkeZԻ=%!Rg_O^sz"v ]k `MwqoL׫ģd{&| -T ?fMڸfrO][5bvB;>`Jzx2lNUcՅf5\7Z$7|nb:Y ὿s1ug[?J _}io +DR!>'_cD@zĄt!QJn1.ZüpWUwЈlxuڱ|p[Z!ū7p)b- WL'$ ʞLnYda(b~t% jTNaGS5O?bT Ue2!H#lʈdh>ZaG& ßY` ƉLa\8ms\&@>?t E7 0|ecbgpj/a9Z2M<ϰ47Ǚzqa73 =<'&f2;pT< /60gPߢ(=S=mf*XamlOy7<8%ō ѰO\?h@8_<͟UuT_?-')S~gO[2ԔT-h_F PeuNf4.U/dnB [ګ=2Vi:uUDJTQ\=wxޖ= * ]{'=29'GK8OYwL>&wWt5wZ"9u}BϨ|~淍 u;1*$Y2FO 5Ĺo"JfE¬[H߿:I7>JǩvdpM>ލ8Ol.2t(Cl=J;r}LT;԰lr+OHv5jgOm n0>^V#leiީpdYڂC~֞0+qpi_zM.@X#PezM"S`R~d.R^S-Z+9z#ɺ )c*QD9t!=.By?}Ǹo- ,'e v m2L<׳$/Ts4>t:~ ɤ.G Iesozn4q;m&ZMALVx\/'QyV#n۫ݦMZ{ǟ>_'.jl7sgYqީŘd c`Q<2: { d݌ *vKTCz3 UK+x G[z,Er|O-og"Dq&lB@t_sDiTgwNK&˃An)0yivl~";\ 0^2K-wP ៉a78-gW6#Yy-H=/=yaJ2Rcq"]`~%/ @~cN~\T DUڱs^#ȃ\uU^/cNDmI`FZͱ [13\)6m!論uߨilQ@uD7lHy-N тG pkȉyBcƲL$5 _<Z.g %|*W2.O Emw.\…$ݙN,~ހVaq=6qA51zZ9D.Odsĵʃ fa 6}6[itqh`-G\j{드vtE'- ݣ[e%8E P+<ZgЭ\ 9Y3Ghc"0n6z=SL[X\߷.M`SkyMJCNV Xo V4 74_Bi%[$*`G!%'nh7/ea_cnxb*Ҫ ZpѼʢ'vZVguhūFnћifo;@K8Oܚ@uWjAʜ@F /y 0~B^UK '_-O5( 伽Dtye+`8z::͈4LR [nA_+Q*~\H j1f)$.l^=YCȂڞS)U}A<%?N5,\o+OP&dZ7)G4I2΀G5u]ILyÃx>'y\cpj*`ƳL[+ '7Kj}i"_+Cjgf#@|`gBv ~ϧ+?K?#v}_3MQ[E>z\d LA= }U h b:s1LNgawìZo47˷e?K U⪀p < *?U(ld $jʒp-G'[][/UB+`@#3t p\ IbE0qbA\ǎTfRjs@> U3^ёJ4ܺ3fH^6 „T luKC"\I5$KPs=~<I)j Rt _<+T5,ufc[d:hi{| 7~N d˗5" 7P[N\CmfH!i31!.v];Tlٮ0fT!"X^+:xn@qPH \O.[w kY|9)sx]#17aQ̣gMQ~&%AKW|i*\σm^߀ E"$aneWWmPf{B:0`fT1б*4o$Ͷ*qMy:}i[eNl2HaԀw%W{[3|s->>J[`zfr0n+iVzg9\Exj?B#2'e[unI0t'{s:(K aLRHw. T!Ѽj!glBI`.O;N9!ݹIE-ۤ~t܁5Z>}[j3\Hh<`! xwy+2jdZcV'iɶWy*4:ej^-yv NzuWV?.No~KDP^'^\KK8߃ȶf+{ ^!>CjyD"Z]x:|,fyzb:/'c:{&i"8<*ãu>=|[f)$A9;|(2y<*ԉw`*y5nߨN9'^0\08ǢT( _>8gAA0O &@}*k6n+K&l"ʹF͸I.>LtlXq@eNk&:/#̵)#Tؠ=]k:Dl4' GsrJ96;x.,s2ǝpfy6i@i8wGV8>E b)K>v&h2821H}hd&j@g!<M9] `F#tq6 Sm *mҌ|UܗJεt}nxq2`AυD,jT\ B~7YE4_,beMJ%7q]lP M[ϛNmt~ž9/R ݅pa H)ᴏ ꤂3k0? O4Uag-?i=Y?Q9E %Qps*D`V~?M r єyFTBʵFnX:{+Gq6a W8$]2B=]\:j OM'Mݼz#N ,b Q.OSl;]=[$w7#yvV Eq6G8VP/zzo0 RzɛWc,hIBWm%zURn($- xBeթ9*rof*Qށ[8|Pg- uiYAv(`]u-˧[u~PY\H֗f~w5TgŻ#BE$cӊzjdZLe9+:XΨ(X˰ uv f 7MRj_LkeM}Hժ݆ڬfpJT|EUl), _Ⱦ~Օ`ːBBn*m0 >\/,.:>} rCv'TtuV %!;דnKhO4ƼB)AB YUm JsfbEŻ(1Lex-i(5ȏaBS#9 ,.vD}f&L32(qOu.= 6 mRa v`6칬K<+Zcj=WTӀ3BTFF}]xA81FO.v$S^1N|,X`/%S&Y׃O4fShDgX* &8bŃ`%>i7viNKg'wN -0ɕzU .`ӸQs#{wlnI73Ψ=ܘ[y!P1GQWB,wUe|h}pE*"Km:G LLVJa%,yu˽6Mɴ>DZT&VZ܈Q4P v5e'abmMc[+GQG掼",dŰ ͷtJ,8h%DAX"%OK`_+[0wiw@󙦱*kS]CǧF-'/KOIi}M u]Ysɑ"66qCR8pX|l1n2M- Ma(ڦ,C~ݡ/P'oRPFd!rnq?ҞT/q o #>\3= ]'k 1WT>} KJ>W _¡ٱK3mPWriߛ IS$85pw|x{XCz$6ݒain NE6:5i#LE’S&h`-p4$DOMGs}^oC*IDMtOf(L>5uzm ^7?䪟qȲD:X6(!Gn{3z>JωFRh\ຩ_k8e#!.s8ٽd.g5܌2}-l0xU8@v8#{+^r <&BqR$N{kOhgGfX{;dxi@؜C'*&Ys4c&AB֋)\U!$0 )ݗ{6[z碠P'Ud4 $Z*O{R.EīEFf\^8a+32)yuj2dSjL49* 4-bw6=Jgo'SeJ^JZ Rn.RXϹh{.Ǒ.r[b' 'yBX=;+P'{&EOc{@gEI+}Q~y+P,Oοݜ\ɫ^mO#a`,Mk[jaIiьK:]M['Ջ0;&?96 ~Ni8/&VC.#3ӂ( i?t#sD5!ĝ$#.$sʸ]EpWˤKqgEեހ/Db폳Z}͞b.D^B| 3.ώOcT?c1MmmA~1f%WEb<6==A|Ps@ -L$bis>L~O%*+*A]%:[SAtIuO5G+X4:й`O,„DʷD tzH6}*bdAZ\I8S%`$i;!/ح-X]{Z'+@;Мh ~[s9q%pAYn7I҃ 'EmI${;P;ǽw3_"sF WrWAC|;'Lwlk*hBv>];\Pz_QBv]Ğ ]޷¦˸EjE]&#!C#ݾ-Rh,9ѯ /mî-?$A@x8LRm0xRTLdwSD9G!_xD8NLs?>2(Y [ aWd[SaYzdk^v#3#FR0Ϧeܣ::Lu^.t= cҷ߾)1ě;u0DY h&Y'i` ]$ukwہ@J4C\) l"hS g&#޸e-JɐQh\ Bin1q՘SNYZeg IӇc~"nkf㾷#QκY\VչR@bjK?PdhU#ͳJT2XX)e0C{ lq"C{$&Y:L3&dž%ȤpS{{q1XUURr}oYU8l#Y`qʗxA]u3Mml-.(NgUXxD9װ~|/ʍn[F&nĪxM2ɹVX̡885ז%}-L$o 1(AѓLZPU:~ >D']T?0L\0v@**{TZqۃVww!GQ;N&Ȇ# 4 e04°؎?WL?oO5!;$6Ϸ?ek62BDPSqoZL_qV v6X.0^ ΄0xOo E~4AYbhȬâت3AoԶ݃>֏pOR #ADh4 R t;c rBPأQy6W7? 4OXB0l] ,j?7=NdT;)o:tAx;mm6?h(z 5#ﯧh3H==~ ~AE]57IȦlyajGP-LBB (^$NwFqafv>\Npbth&wD7YE9/%Lc 8ZcԜF0#gBMi'Yv} $,e51%b/x`Aj8HD|A#;Cӂyk(ЏS,5=Kղ/ &'"IsK`HP 5eHn:.1 F8ԬF`?o4M?#Bķ*ێESůV8%i_~ÊGRb0 @4IyLp zxp V q5jy*⣇^w{f/?h*NR׌(ٗW^{iЕrN-䆷v=7+.443{ L4,nÀ*Dq%凞dGFk )׆|16T ?[!@4S+4sa{];kK\3ԸgyE0D j؜ qՑI/5wp"򴱴w'^g4uB( Kg\~LUv{XTA(i5u4~8I24+@wBrɼGOn0] Z4S$IRN4 IlGsAKz֐FՉ\;\-dn_2et9`WɷgfD&e@:EoӨ;lvnou:Wϣ6v5\0 \Ҕ{_޿Qi|r.`x%]|Z3$ñyv tYAIVv2[9' dv{فzN10!b q 0 6D~heա3CmZStڬx'2LN/3FNTvmZq] VHݒ:.`#dp) ^ |όՓ6O}s`t(} e;)?&aU4׺C>'pP,0k|~ \1KIJ)#~W]ʳ;PMg̈́&P.'M1=-p^ܪ6O3抻E;=c %MaSLàS7j,ta !K2Ŝi`BMnRC%P0k)g"lawU5jx)7arC_36I^~O,JAtGKłw}w;U]of"w+ sR#y$Sh(>T.i(RӜ$`|*D=U6; nב@@ 9D^;W5v]8ߞ&=Q%W<%̳1񩇱l cKnumW1i}9ϲ{t;v#[ҁvjVVn[FVn < =SRd37A8C'C]wP,]Dp,60R͖vnu^P[tz" ybih(6j-G+H;X')fO0\ZR~?btW3Y"qLmD,\OGyR@ bQba _%OJͬ/5onmcAE]u=嘆~$e0^e껭`>tϦ/=sfQNB<)6[){~f4n&q>M>ţu-P 2rв`dZ1 C[vG6bE;k[}8/BD[Ur 't@Ie6+`]J_ͩeDN.ߌuϬRG yĺ(U"\Y|eFƭ4{CO" ww#kF~Ĥ@H-׫'ZZq7w(epʷ%M@E;BJhTKC FDɀld yo+wpGo+Ѡ>ذK\gߙmʫJMzEYp`W%Ȋk%Úkė'&W߈+wX{ JH(P[@[5h'+eBr\8& xp5# mơ'&Z!w%pAa>Z+왖e6kim>u ,dpTA8z 57kXXw˸`RBVŋseQeR mA"3T31 1=׫ֹ)LвxцV~$(oe͝8NIa Zh y?MQo鍙 ̊`KeSh`cTk$;-f X jD$u҆SD #A{>]GH҇-NbϏde]wstA/G[зp> ]e{,/Y_]'alR?^j4̬ 2 _~2Kxm~ m63.2fa'DSPZs3T&4 hzWGyNje櫴Dٷ@5 C-3@~o ۮ/óWa-_qp'ܦuq cQJ,o }?Xf܆a%(_*D'5_w;\bk}Q+ N s5=3h[:H?ӖJC HUkYμ1OЃ"l풐^~JqdʵPN86'SS}*4I  U1aȂ;M%飉wE7V&3K>99H:㿵~czg߮/$r,?|<&n]Y<"0$l$Е ZD@]8gsG6K؃fN~|4 Œ.Q㹔U視o4``t+W zUPc BQ|^^d"#)S١hs9?6f;fV:wvެ{W&A~Sܑ|<ogS|R<̒hXq|6uI_oDj-zX,3Kb$Qo Kv妻fe0e[%Tcus9B߼Ø^1%֐}R/߃&ˋE:ŘGvk=igmKk^]Ɂ@~1V_g[YP]S.eH\n-d)!U?9PfB*ϼ>:L61"ͮmI9#jǷOzyRI2.<+6Y9 \Hj&bL O@9N)Z-LMO ZUcE…6w>YGt@+nR^EΚ҂_|!J~U\sgl9Bt Fq 6퍃{3ϖf.C}mǶyc أJOnӊUr,]Xri^~Q̃} NvȥБaQ\Xo%C)i%U E:9!+9g7z41;D:/9 'ɱj"N=gbc 2Θ5!Dkά,Aom"Qa`ڰu\L^0AC*| /V"Kv~쒝 1~gg)'l~Yxx4#Sɮ=ꔎ ps?n4+dr^lP/,L~ͷ+ޠ#CZJ]u 1rgf4+Mo&__={SDh56>ppzb ܈l֑+MǮܴ($n'0)49\e*Ϋt59K2τ|z CЩj.b3g|!OCAHN3)lSr>(-mW_RR0Xcw-0w,d)Ӭo)}\C,s]G~)(Yd:FWM =! y0w_Y狗Daݾ/J6ɰ5ӈ(j^x 7)&&/.C7vɂdE L CC]GŅjMvW|fϬJjz3\a+X{yߡP0iY#C;St[p߂0& DEzN.f']XVu9?k AJsEqO]pVM;ٹl`7kgʞ;%g([8գY$ʇM1uЀE A78xw 6- E.]jwR&*,ԟ2{j1T?Uy!-G|so! Hy,`:C o}r`2{́Ϯ(0d~޷"]EڔoHҦe֡ˤ]w`gMUu261'v&G -JlޟfΎ:"%]:Dq2GV`IKLw !fd%2w&;twJ.fop|%Dm x$>c{3~;0_"|@mCL-vw/wuoڟD  Mt{S'/cl1r,}a HwD!!MK +q ,}/g% &"2} eS:)a5S*W{i<P RN0*Iew/:˅fCޙ mDaFI: ڞ]䕵'nM2Сc"+ڭho*C1@s!ߔG%dDdYV?5 ^Ry..>kEaRX絔N .<ҳK|q59W&Y8F$w4=DZٽ ,}jhjb(:x%Kؘݠh yKѵqCaUi[EĪ9  |խ4@`g۰` ̎[r47o'<5B4SKֿz.TiM- ;L(dqHsiN1!g0u##g]_YXdHCxTD5Rn!p~??+;eR~֒y+ Ƥ 1{̖gJ>v\ȲOd&bx"u[6L'UFTɠ +'>=L-YRhLrsρJC_YA'C0TןCӪ|:cWD>7RJ"Xo8+hv5Ok; 8)*p{;,-!M#h(EEתOGe1PbKKsj ݱ҃Ͷ ѩ<yQtW?!*u,UʹǞ/Qc{Ā( 72E^򱰽_#s T`Yy6(U07q+pD{Ҫ4e!5Dׇ[<iڵw!}@oR5<|!Se@eŎX^Mgy`׽]/_zG_fGWO~s乘&넂8؝?E<˅2W74 0X<%qOSfѤb_tžF_*<eUXu❙df^> \c\]m ǿy*ڪ03 絚R MK`)y7uZp wg ZHONXh-bv̌6u?(o0zx^BS3Unvp (&4x*O:[ pM-}B, %~k-Mo/glVW!'2\MuڱY*2vBdLcFz~]6dMEv^Џ0ˍ'!FIi0koD:茒0-QX<(ڽAM|G "ū`ᄅi=7gpEziѕ nkd2vQ˂ɱ"y̦@\uioq~?XF##2L~ެ'#%6Vt#xC"t1V9"FrP752p0 6:ȢϸC.`DQdRl3Ue$ֽ*<͠svUٍZgnnn9'leK6ǥH^JHH# 5 麘sZ)eXve%PN DQV=T龿 }Vr0D[ *&((N AY*&-#b;:)7eb|87ilNg C+c֏&H}\y;TO,'C?{!Na@"93#f5wI8|1Zƒ!51li`ȊJ#h3Z9MJWy(}E͡*W 7& T]F##k4LI.]|Pf&o%f+{s!CÉ?2(&4 Sg`ܻFܒdmiC 3ɈMLQkDy$'T4Ip0bh~vW7:W)QkҲ ?h(]<0/9xPNLCdߊKr/080Czz4cQ\Sg9v)sfdǦҹTz71T! 1*fNͤ4_J&R]rЛ|:s-;2V$r?V˖~֯sٻ ? l,a'PD܋\1$3ٳC?̴婑W+W@G k)V:'?2y N#YT6q 8|ba~ٴ>0&3椿 Ay}]]- 6Mw6%Q`:/zxw-)M)pKPZpN I;,. CQ% :k}GϕeP[c"a*CKM{Sұd7`N<ߟՐSe{&Tq_|$I$I$I$IJ픁u]xTiKzDZ_jwyYcsUtƏ?Fx&JUj+4;E} KtME\ݓvkn%[RQi28̘R0p7|rN[x@daﴨk>L`ًɒhvLy]jnrvk4:/?:)=± wDWSB6UDg4q9`(75hs>XZc_/)=z{V6RR? L(bL AҌ|˲5lo գН#FxLZ6-'Mhk:rF>.nO0\9qXKƾX7h[F{ta'xWc O F9ѓFLH #)Cb7!hhsDQФhv"؟E~VxE&3qG`NA.mbyMAȖ i:Ӈh)񆋿VEϙ?oG@e/Sġ@x *sg ]nmxkˉV%5 3ogpN_w ,Ɛu )샹'y>o\41FԻlX#vAx^c2[WOzn^瞠eFGE_ߞ2"EjH5[ ȃxdp:cYƗ)[Ҽt4GLl ӾLƉbazħTSc>ARA>K,a;FEmEldLv~+A&*va֑T 8t|F% %49&S+`ICP*d'6U56<[]nB}sӬUϝF'[1XF@ ^^(\`8+8΀rQn{4;Lhܸ+@N6_tqK!Rb_lgp@5Mlȯ2vmFJ}XSfNf S]B􃇥LR B3E6?ATwR}z`PjwcjT\z@ɦKyp6vֱBwڊV6"-Yt(FK2-vlΏpy悑@E?3&qeUbG3rۀvź`%Ŝ{!r6z)¼hjwv1n7A: D#ċ2# 6|ˋ7ggZ{>JbQ<~i$)ʭb6rak#n۪v4!~ƶz ^m{4tr6~HJ8hy2!gz7Y:ĽͬhZhLؗfVA.6+1h G I*)co+NY|:Q [gpnsR#:ŸU:go\ܴF (PH*cYQ󍴕NPAk!*qIj鈝C;zo!qYOBOےPǧDP{c 6Xx{u2JAq=7vvgyl.4>Wdax0j]Yvv}Hf=zv[#",ȤxKʏ׌u \1p"3sPґjGbmfkZ$(6q@8KkT*Ek@c_{^,, $MT';5џh2*!")x_U<ڇL4l$l#<]HPr!LZ<ٴZ0/85# 臇>!:3[ ]*,m$saN HGcJV%]{΅Z S ڴ0+ `".Ʃ#x# GYw4(?iruw]@߲q\tGA_1?!Q͓_(%tm1ktaR2]fB Q>V}xEk ScO.sS&E;{3.b#(oO"{`8AGWNXxVJAav>5TC4!ф -DvAYXF@[FnM/傏 1Y]U8#rFkR[ϮL.UVyt@Sy\ɴi4|9Sw9qRR0,uُ=W\9SC=]!֑ZS җ}S FV`WVʕ(HR~^< ܘ^H18Ty*t- vGs0-~aC^/8z5V*ɚn=M$>LU-UEaGX)( cd{rvޕC{2rNŠ[TQD_GQW SQI 5\(XČhK2n P:?M'CKiuyʁ&+;]F>_jޕ.7tH/it{r.ZL5}$&DR9ٍmBXළc X8PC'ͺɎ]Ga=2[NSv?NɧK/l\jf1 +MEdڂOa t+hJP?K> ØLH6 6N%hٳJ`FX5 !xso#VU3u;C;ݛF]çjy gO6_8GWu?U6[~HZ mF 9;v5F`3q|WH[RK <[5c>lÒ{e/lv=HVlۘ&j9, 0XO~ \f߸DUp6-pL\_, nb%*v!1BW~gF:W}bmػ"ns0\}ܿN pH[\0^B\Γ+alhj8Vૼ\.*w6>t_Y<7^Œӏ@O<COo *1'NQ`˱HQ. -v|ZasϫX<+>G2mF&/6(Q}" ?S45}?5vϩ$3lX*R~$u&[#!a2oAG9 tLg KZUZbg$JT,R&ٍ7%KG.gt6- Ћ}$xIV۾JB~g=\|=R$ Nt#++q />Gv X:3H&ٍ }a|Hu:|: NxҼ3(kEQ_8@ gscJ:EČjhw@TpFg;GքO!hTI3lL4+y$dV/$"m- ^K܏+S]ЛҌ$)q#KH!z2tjnjQ_ȃ3T>wYu:t$`\*i,͖CM1 q}T{}| q2wWBPE&!P1 ]!8r_&wza8IIuˏ!XS~i^Gv׊en}}p/{hg`1sۑʟ5_3tS Iw3IӏzHRY ){* I7B"z.^ 0bJe : Azz?WlKbDt< 35&$dUB^?Bö\Kr0XE}9W%ѥEP]fc ajG*Z׃Bƶ߮Ovd.f(F1Bm:AEF,|{B_$}NUBV1f<™꠽u\AA9S)ؗ-rL[Hqt&*ۂ zy>AoR2ߒ"dT|ISe.Yo)`-dk߀ v}*hBᎣ#f u6mgEũ*CmdYX9>]”P!DwT!ɜ/T^F lbcRSsThag8Jq 7VY2|"[-~WG^!H6X^&ľk^DXi4>aseK)Cice^$H_* x'?%L@Ky:yN}{N(>Ӑ۫t÷uXq\Շ蟞UI}SCPC;Vx}׷刺 Dܰo%ߡ[QOA{/uxQtMk{\dLަf=mHWejFMg.YE oMBЫTE6b*MRAvmc#uu5/elg^;t ki2~1yQCJVCFNJd.,8:f6:u-/jUzA =kO} oFr 㵮"tPaiF얮S,Y5/aR\d i{UW\N,&'P{$]Gy֌k?F;A'׼w% "}~` k۫k2< ]AsO  yHS̛˕8y EJ`9cwBX!H QAC(PC<ɌۧQ|yV:C;ѣp5 ²PgF"{1R&}TJ2 !.o?ٵ-jZcׯ5@VP2$L!rM90>n ^LW&exRoS,YM4)ZP z>cJ#Ѓϥ3sl|[$6![ءe!Zi>3V7. LD N"/ ?tyE;ڏnܢ[ w$/.CW֟,cņlx{lXM@ns iY*ԉboŵ}Z@[NE#/fnoVabTGxuHLyO NKsPՁ8$mݓՅ,l{b{d5v;I ܐwSCA@C"Lؔ_:"N8tBVr^)I}{}}EK9_3?M7u4[fw7m*?VKN[-cV7\X`@"|_j}č/ġYQ'x)uf b?tP5[A5y ?_թoMCG͚nztcMb}1)Lj6ǀ@DVYlbQ>JlCHQ?rKITR:|!Р_&Kֵ|w2(\U#3 yY1U^+PߎnZyc}Xϭ_K:ion%҂mEλ3$' J3d-p9s o7[9NxܵH:/3(k7BT zj7ViRA{);}n\]%`Y;[ Bt`nŃkv97; ,qvG),HxBCHLTHk,MN0! T7TzOF Wt su\L*Z'١| TݷP#טp+k٨ф'Bm#\0*s< [-AdP zk`B e\i6/u*:w)L8zmrcna,X7f&X-n!g "`%%0T7U9;zTX?J*o% kf^Jb>Nӝ'v#( & nաo;9p+|(\#!Ve Xcfކ*x DZ)Vb4y?~NK#+O-G ]nD1VEv4G3{:B Z{OEC= 7i(R|2.lcLĥ pJ+Eu0ڈ|YNG7E$ I52Yhh8nizn<\ɣYފr)R]L;L<]_d k ^|{> `Z*enCE^I>—L~#\\y&<R{#hF<qz{5a#5\/Prq#[6$b(F޸ET//?I+0/.^kms6/\'%$lM4t c{3~)/$dY/ʧՀiJ nsh=?W߮eJOx굉˲[e7{_3VG7i0p1KF y>&bvH*ORtGŝ%nboܬ숯"N'W:bqo`^u[(aDT6ZR-˴rK|Bfm`yv?wr1{JzDe}tn#lZl2!sw&zj#:"\`ʙ}0Ξ3.OS*n(il$|sK_%| FL3.VYF? Y)LYj,$B'xnm t~24UN*lTZ"+iCI"V\&z9{R%CiݧE.N@7=g>#w'B!~~ =lx2 LPslqRY)q88][e#Kt$==`f3a7 U6C 8pOtK)$Jn%om`ble]*FS%} 2yř / [K{(jwOUnϕf?Xp;{]#|ˁY zh_U7?-> /ep8A0OM[82&IIoQ4blRNkf!~¯3gڡ©neM,!m$F:"Vk?@P0rL>xzp&1@zzBr"E)+%u^3p@`qЉ}4(e3_;g'Z4uWq9 W7ZAۤ4ˆ{TZ\5]UcWYAǖg kG~@ Oa.ʬ Q!6"|0̞=2.X)ǐ~L:gݴc^B1n̥jͅ]I '5WHx|iKwE)e]ghK. i~ԺK:k\?>|\֟gGz_O}Dq򅴠,}xkgU%\B]3oWrD8 F (%쐲Q=x^f>nPMV聀uaf)pB3&`RK?# ޢo{?k} s UvTع*g]L<[Nk¬NIRbzz-C"̥"vAHJSUٞ?ÒXrk$f[-iٝ"d28O6cBtT@\yJ)⾴&lTAQivqd (nƞ::Cˋ'ť?|UDIJ3vBܰ{2Rh\'e;}Ľ;#qCCV׬ABA{jp]M=;9PQi"MD Fz 3JuShgWrjflCk:jӅuჷ3,qFh/ͮ/Tu=i`<&ۻr`f90x`n枖3fhyz|n_;$. Fޮ(+`i\B*pRpdEPP m_+{j3J,M" ܆ߣޣ{L5Ls\y֟-)i#4 "-FdA s& 7_U[Lr{F;RF�A<(*=.\i 982~[yב>u,ԐG#'/Ckؤ~&d]+`O!0S!I7ms?% S/fr IEln@VK$%Me8AW/HYII51+4}-Se1`X!5ޢ^] ŞG(@Yn~{hAaI.; 2}uuJxWP- T3+y%`6>yf߇@ + _:-]{F<|힫}Av2l`%JQ@i */b*z0Q*HĹp4NyK%Z IEq* V%di#xfI`8xF,95Z0'd ?{8|qOdtJ'Q}sR%+Vj 48l~TQ2.xDakV`&PB*BcPw VQG7͆Z0p~.ݺ8SNx=P:e=TJ_f*y wKo*svr-tkN@,!1䠎Z G2gfHFl'lKݷ-i~tW1CIg l1>NɦJٵ[߳66J`q-잶joz6)2oQaVB,ReOKGQKDmN^%ڈ⯭@lbjwJ$Sy7:pgFu!1ҽ[ۋ3J H t d)qݠk \(PWrPX|#pr2v/,GQ؛J+dƮF% 2˛WwФJnUίr$*p \txަ29JS ?puf=T$dC &ſ`q7M;DRct/X<ɕtUqH'_Ұ3=^R\R`9mb&-FJEw&! M& i"r+n2~ɘ]ٕd'{:$?(Hp@=ߤΟ8ۘ!d(B)]Oyjqm )7Ŧo"63Xt!}1H!biXGՅgB&EUσ9~a9_jk-;dcb4c[vd32)3I2:08+ѡCjiFoCpS,?g܊7H]"!ܵE$g3Q49$$# { FO&>-7#"Nn6LjlbFÅ" +119TdS\Em 3ܾfK|e\MH_6u F/W WZ&8! +%NA'ʀpƍDhPc/S†5nIJQfoVK̍zA4סQ ’A0]ZMKZsǃ#,’Mmږx>ƚqS;JRt,pŃ_g(ӷ⓬݇)5ۛv 7S&×=E·Tk!Vb[i[J*x՛ò5+< vdfytu) 1]Ms}69v}yjt<"GvSn'Ŗ"շqc]\CGsDzrQg*VSus a 7ƘDto8@gn[>+39"k>0ۮ}p`$:Te=e=2rKYt]_Ij@-G\&$/,`2gW'cN7=0sz!|;\/)1E 5Q8UaI.`7YCA' t.TG8T]nSI5s²) ,t,$3»gĉ"l.,c'=$7;O:mSp2ʗز@}$7_},6L͕Ȓ~,f[]xfgݒ~]umX r *k|ᧁ+4yLg'+@2((1P:4]j%On ~-乌,]Ѱ^q;\^),GVB}-^C^VlwJ]F(c]9ww#2~ǫ=J5{յ&m`~f|ν>-?p<9,K4;DgO~ng)M"p*%k% ^M.`ъ$D>ƈ+p `- fϜ|"fR@h2$[_{vM%|ID^g5ZJ?h^J X8VkB rm{<%&7 ?*&aD,?sC%-{(m䥧ͳ/9@]V*r/d9e xPG-+B2C:p:"YmH/MG 姬"OL \>hb?m'|AUL_­9$c_A:H.]LpN|Ќ1I,KkM=6.=y$#)z^(ո .Y[a.)ETր Q Щ|^JE wn| +l_5-yKg;b5bmVS?7cͨσ]  T DnlaY֊;@LiʛR؏D)Ed TAttbLMV©Rlcn6.P!uSz *1ɏW/qv']+^]8c愲16\ϡ"js^Re6DC}Kky0w"rN +@ F!͋Ytu؎QbZfã#đCQo;to Ƈ *8mH|WB|h8Ra<葘 r_v޷Xogf VhFyp((̻"]{V֝:-;'JSY0 0]mp=鵶<; !|1L\!睩r~LEΚ:hze>vZ\4i#@Z^=drFBLnԶY!LV^.2k R=RK[Xk&Bwa*?s KyqZ z[>vDU}hŷ}Q%!ce@dk92Z? !N;a^M\:\ р(:&wOW%Y}|߱^n˪cU-0@v~.siźFqnMA7-\sJ1;}], 37^1Vx5J$eu~-0ƁcgNx?DhP oB\׬ w>8>{QoK)F]Ӱ"f&1i^t6,`x3Qq1 d$ ,㏳&^aIO58tܣ2lY! C'@A\+c gOz Xo|0GCVU$rH/uOw..<-:{,Řz $;4^%.vLϒk[ _xC* Yy nȃ#۶y^3CM@0d% wi7iOBhe̺͊."'4.ζ'Lsj4C, &=V h8<;-mP>>pJ($a+Q]sFO/uyYj҄֐e(E*Icm5K/ǙF 물&PLK_-D!; hC X$pT\/veRO؇|.ZҤ@Zj7qYMQZ/g/(9:Ɠ_k )0 7쇉=k?KhFo#cJ0qGDq!)>`n/s}K+2|p3eGG-$?`XS._,5Q/x[3_[ߛt)9`͵Q OUsYKLf QGfp?:w9~A,_D</PخжZ8! 0L-9VT%Z3 a a96R=:!$ h'ػ\_^!4Eɳ `{!ޛ'o⬀]rpv!o}xr%!jjԦTk&M 1n~-͹yUxbM $G]Tlqtn{< fIydcԄeezb6XFq6n]%3X ÉB4{2zea5+ZDh']HQ]P0!!.Z)< 2˖W 2Cr\,Q@7'Г-/K* jm"F^/w4u<~-΁5<:k˜dB&WɼϬD [&[\6S9$6(X[OXM P[$)G]6d|Zco׈r/ƽ)nT%LKAx)x)l+[w i?0)%2"E5J>t+drUYqؼ+htPӆqPZbXx`2ViEdۡ&wBӏ ݤKیKunTq8?*Nf# "l` N/tvRVݲxrSQK:\ө3Rmt^W6/iЄa HlF57rm1Eɠw[]!D|`op̧cfӀ 1 XIòqmnm.a/K k8{m~i4@hɄqo⼅zkF M)0S grgԚ J͞0Q/R_UK aH芦7}tF/f X&MKE *$k6j7Uc2'z`&rIw x (~8֨QM/tzq?L<+rIATvgt}io^s]lNJNiajQtȶqzZy&Uׅ V־M YP_z6U"1@ջ"&OP^Rڪ5!D}ܬ̖%803 {7BwݞP##eBƅZm[&z鿤<w*+U6Sh?%]غT_Sd F}W;tK \(*бYi`G/\ޮU~+J6.hnE2*Fp(cˌ q57仭Ksr,Hh)3VD*tcw]ĤA_=QeaW^JE/i#5P!]{T5Ѷ!Yk43^`z,'9#!,+)my } K}$u+h剺IX`lQa@ͿPrv@@d_~Xil`v}iru_XP xF`ݼBckx&q=l) Cɛ"X /u\Sη|%}W 49,'"V+O8"\LDXo с}6֑U(GOO"*, g'`#Mڛ;>Lr9*u1yДl%oo}LgL>~m=Jg!t;ϗzptqg#>[o꘾ߪr>>}lCڻ_]/y@xOц7Cd=-?D~}W\|'V hZAJU? m^ tMrFl֠:m1Zvюyxn\7OGvCPyȸg-FxLOMޔ6[Wt4 ;Ғ[Sf5-X :Mɠ+%h\.z,Fad=#/R3<ڐ8Z׎"jTc5'Fhl4mz*"*+4hӂIj9Nml"=xP,J+ea^99j3>_B>x>N޺H}ً"3ؚhw5.b{rw6\KR-É i%5;nGB=ϑKlHUn.`ڂaX+ $.65,!MmU(0c)e'}بX Y v.JjV \Ǝx=mWO%b>3Do_;ZU%!M Χ4 ;: G!0TBB(5B4+)6\CuR! m&~dbJq5D{BoR,}4:|'&I>Dt"3Kά#/ZQ]O,k)$!4T2ب#`7#*j3Dvft.bٹ g~u6D5l`R?hZsь+΢R ׬ߥgY;%Xy(tZ4Lܿ#gsִ `cDH=5A$٢! fg0~8TA!*~co}yAXFـ[Wj=+Fiܨٻn0t%wg S>J,bd WvܪF~ p]U]A )%m7܉Pn>L Ϥ:f0JZ a6 vQro跉Ϗ8w:mk@ 4@4ۓ_4oRM "fiG 1b(6?٥OߒwlxB(+0 }JXh;7v4ת~|x,}Y[;>? ۇű SJGd9ڄ§1sGtD;[ó-E!"ƭ^*_|~n_ųkZo1pܚCzl 3MO0~8TA!*~co}yAXFـ[Wj=+Fiܨٻas s';/f~g2u1uQ,g8UEmf;g],X3X}ZwkV_^-p. n,aOY5d:eu#t 1v?\czZ%~x7eK ]1ohG{i1+M`::aņ~i1F^X"JdACv =8:5<\{vhسѽ2z@? ~p Sfƺ#kjUI~vi-osxSm"CKCHþ65$f8ժ3O+,qS Z؏>ű Z1 fX1 %.5_74!k71]7`og4~GVzm䎋Dku5wbD9 ~WW_)*\iĔIH悋Sxd&s}5O*!.Ϫ+W2p V0E1%C;V)5B9jўρ}.QSA}M\l~p Nko9 "f!-+eL#9ZXbC Ո7]Dd0n92 ]\=QY]A4]y.d:gkOy^~FZPu u7]}QY,!ZOu6QisJz7`'pu"PrW-+F hT}*S|kncl<3P7bHj;Zzcg)вߔɄ'D3!O47 )7ZVAdF!o0;+~A^ӦSҔ3rFm&JjP 4n&y/I"+)z} cHwݥqIҰj Gɟh|@(ғK/-xb(dM:Gr`G1dSo`HaG,[7T8r}H;cZE唎( $: (K=XQ'S"?+", gFC]uar j4Rs6`<3ut'[?k-)>b;#`|9T0»aaiO,:/3Q/H1'6/u as aIL# 4,i׊hg=OX UsAؗ`~ 8k釫t-abY`eT"]zIRqwʒ;v= ԢuVqcbG"<(qW\GPœ9~>+Dm@_2C]\Vc\bۧ=T!)_̤l)pSzsGxPRӂ|-q)nr?Gư&v8[Bjl}\DzZFr)1[vlւ6_FF%DSJޜ/=Yc%&h0jCuIq*NeFu%?ʀu3\ e\efqV tW_Vns݈B^ HA3#v}y#~ԣ ti43֙ߑHp(Sϯ,@rvI\`>Ĥ硼e l_t7:KG9uW*+{2)%+|FwCa-XAZ~!'wQi3Qj['>8W7=c@gH[rdvWeLá⚽0Rz}dm==/^bО˾ԕ1$3R\'] 3aM8gjrM$?_<ůJ_.$s_}gxj?ϓf?(v,N*6qPcJ`o,6S(XWdy2c6 pw"oiW`1b?S59ً72Vd:&ƚU~K\-8Ds.Hk[:O<ʂ3~> |s5&PoƲ*8$wm1Th ,oz9>8`Ǜهa"gƚΐroKl/'OY4Asr'oEbJW ;%C6+9Ud+ur$RVŊ 0'?HMUrr=i@3G7«[;:^b &^!CIN!w]GG=Na1g*nbKۑ@4Ի{[-Mc'F|)Tߤ—s1 ? %!0W^˛29<7 '˘x Q=,8/&[F&Jf98f' ;`;v .adrZ(Ň ?x Ũ̄ۓ|7'5nhp:y<֎z-dqSqu6C.-Rsy-ZZP^Ƭ—/! =: ?1+ƕb`#㪊@_ݽm}vG|A= r&RP/A K8[H* ytRpqtd C"ЂW~ʣC}>2<*'Qh:WS lYQBboQ}w e  E b?R->\8a?tό/߸86AkBʿ3wYx/֕phLnIh0B(o }tB;1g݂Pć'z*\ඊ]5FX! ^c:e<>ҿ1UK?vÙ%遟] I>rG9:DŽK;uBw٠p d bi>4)BԮ)cn%l3#f0U̘QI IQp3_xb}l$|=3QeSYd{6ux/ab_)Ԫ3s( R8YX)cOZ6i~rBJ G YϢrz͐,*uqm }I^ &-cB,OD*α*g!oO^ PZ'}Bg%9di B`^ɞE1ޝ I :cM/%&9> κ酜QP6L=o$s9tHT9umi0] אT>Lw#e4m$kюMb:O-uLY>GQMW 6JQ?ѯ.b trͺfx-cs@7;aĶo5gφUYmdqgbwPN5/l:CXjw }-DͲ穯?*|~%k<#V'y1Sà@ cC;0Jv&=_ >9WXYBMo.3Eg[9ܭ9(ڨ$=ٟm>G|FxȢI7[sFtkJז|AP2B$K LoOUbtu|U% |eBEԈ"1 O yoCߌ|$aݩ-u57X0iFj/prMx[9z R;L]߭] ͯe*i!y352E~?٘y~DO=p ƾڷ gZn~7|\_"'O![T=W/{ %I)i+-cxc|FܖVEB=}L?&-D4T>ȋiĒrwl.n"hSEvlli2U{sݾ@7ųu }-LP*-[w<${E| }熌79kG͎`*p 6&򑭫4WMP][%#:sج-žPIvǕ3* |arlILyܿa۲\ިnd5. |e MvHKd Au ؟=U&L0ɀ箕k tc0L0W NNFT$w̽߀ W7L$- }=u܌S YK6|_d4O!h;(-h8{vsmXܢ\j0mUIϽy!BV1ڷW]ǏM1Bh{nw)"nh$2[`f|{a [cdktmTB@ c)'l}'ۼDd1Fqp20Mx ƞޯVIQxYHb\Ҿ.HDf)qy>m UFۨ4mpSU6NW+O]Z^ [2rT[**BU '-cGc)90.:l60'CRU~d`Czt;ɵ %ZMټG­|m}nk꽕ō7No8b: PƸyx:ޥ\z,oZWVH4_TֺS_8 X\Դp^FgDL1 >s^!fxW 6rj~sY e+Bl&{4P-Xp(D$(N#vÖٙ"WDuK#Ӊ-Exz& V' &]ԿPĮs&n#҆r[K'X?GwCyKIJ)m]X\ J /^wմo!M^݅?7Kфp<%K; ͻc-n>9# -sVN*yMh23Lyr\5jD݊rLS `:&*{U-d?g)!fѝ=$$M^8 cyRJi}$#&ɀrO|z뙀^i=#F>gF!ac8JޢWfpRWc lhcC\ivσ]wE:ZK("zk}+boH]90}ii >͇}WyPq9V`J1=ָ}|_~s1ύY4)e\<(c%A^/rr:n U_>MP2`,DUuG a$}[#"+tArn;aqWrczVaVfg7o#wHp,J;^ A"۾^BOl*2{ ؠѨϟQ'> :`gH70H"dqQSJ3-zcF9l#5S=q?>Q{ַ,|::PJvMܟNKNu'2{#n_PP_O͓^TMq~yUʟU#/Ԅ o){?|/(> Q1ڔ _gx|q-l=U(("}ڨSmMySbj(#=Fz0ZM&쫆bm&,>kl\L?߭yE?O w~cgpqL} G݉Puywz5 H%79"J)(RJ-Ӫf],0Y[Xa/LJu *@)~W'8̒]:RD%dwTk n4'[i 2y=?#=TI}'DFiG.XȩdBn%VlBCOD cſEJO4*5&q{1A[%k%"* ÚQ&* (}]x2.7Yw,&c -wQԂm|9Dou"TŞrbđjg3XA`./Q #a[OnKEv9| "A+=a]-?R}[\jֹ+r]*7v~B5$KrvO\E x;L*{vB Fxsy7,rX(#-IlH^(R(a?Cnh@T XH輗qA/V#I+?(@Uc-I\ZSJU~׾3,R)A;.6xG!kMSWaxeڇ@xwNo"rH3߱7jP4,K.55Bbxۏ2d;jxf+Ig0 g% -V >E擆i{;8q !89Y eX!ayF<O6i޹'xC"_l96 p.P4|">KBM:&ddA%YTlZ`UpY;{$Xi@SZe3T-I=*Y@/*BDh#8yy Xh!Rs6]Rtz0=aDKSB/q N0N*q>eD.Z)g}vtRʴ!:[Lx+(C1=d)o'zcE6?A0)ؘqG4QQ(¦=xIh\<;Cqj2 =1Ly^Xmڤ#_\ɞ3d3<*R= FgVbJ{I^*`{ŸUĉ5`. =v.h7= JB=o~l;sNa&ڀaK FAO62%Ps 2*0b dF jΗf.אX}9w+y MAZ^=GͺȧKaj)@937=ݢ\ Sx}VȪÙ7K̑vC}7?)q,ssKYBl փyCXRsbַd9ޥc _ 1Q87f΄p(gv` a*X9- S`txvsL*m(gU^_pH|*vQnMoic<:.itA0[bu"6U,㈂cmRx0kIp)olQUޕy~`g/[m9D?bͤ+%%nԖxuƔ"KU2aN0dKzYD:L8@vh2Hfqj3^X9H-Т6KZe 8q' YH86m*}ߔ;I$X%tV:WjKO>㭮ݥ.XC6RDe5F5t](R ,LN3sփ`xpZq<7+ 1Н8/a92'H|15~BJ/a"ohu+4b7V6(Ȥޟ>Uæ>~fmpS}[y h}VDе)%S1 }/FUmEaj䁐޺n#im;L} 0̯r}@ə"݇ww-Su$ZBb$Wl/]>ze)sNz\.$ux5(.1h3faZTI$&0aӹ%գkeGW_c>\W tQ9O96GRxU11参k_4V=,xo Sk\H+!X6cg3&7 ZE`D_)2 bH2հ5/5hL0R/Ȉvp {%>"nXQz,%C0/B2rj`q1 I`4'xl'cB3ܐ8/|SqH-k5@yS$ :!BM7 b[Pו;A= <(CԽ9o05)y:mQS"\Q7~s[BXi,I`"$zR@?sQBH2[<&Ͷp)~nIYȦy%+R߇6#sx–ك[ r1te"LmFiKېJF9-Rr]?z ChDo )2bSjaBךxȩ݊ӗBz:zKu|J7JY^7zTWV}jdM=:cve\SŲ\DXcGI҂ÒBIO-.P?q@03f^$Cgan YV0XZ`Խr'VR}W䤰 **K1xi;AyTxtO18ov? f!-c(AO&6OiL, hY<#]ҫw܌TdޕW( JMʸF'C9ة]HE^Ou`O^O!0^,I`#뮻7U;vD&xn>x4 ̓1w LFd|'1J*  3,t?oUBY!cC-&}ؑ3d& `B nѥjoBm|ע3sk37 `5_x{y!̓O=eOmzfB ACntnR%P'#{`wt&"iQNȤ91K[JJ0Ź(SI2+ ^( P$R2 >*8\RU9ۉMAĠvn~<F*^-yA}.3w >|KIiUP=k;@]Uxu8/)}>d5^Z˼ ڜ'�#mu^Z4Y(GffnECi7AbAqWea]kՂ4&kgOcx-t,a rNqE0AZ@!u5̋zr)68{s(7:T9OhAcڙ1LuBOEغv : |ȿqv=& +q!x9#$!>dB$ &+(PUOI(:2׏cn))A2dbCQg.XB~Q^"o!TeBtxle&y\d|P"y*DJl\,L D~7!%mEíLAɺN- LB#oP62/*;g_GM;G_Ks{l(~vd^amJ MX17gORhu9K35YEN\\uɒd/pKtb5[f{> SANi|vצ=xe_e gj^B]N̓@ŧ~**|Ћҏ<8fm'$-KuG ;y ӛ/%saj~g&nf쎬Tۿ b7pi]}{{ ^@"gSQBTO#V^gr][2s^Ĝk-3&Om'k U\Cǘ"x$PxZHtaH?Lk5#:z"*!u44;ZM_bTlM~%j@8WhIU4_v E fSyd6JiG nI'| dE8vl] tQªOL]給kC:'A KѵlrSM\hK$6¦gȸD h@֭͐ "Î.zBq*c1%P2% ײvc Ul=gRs6mf[ҘzH;~E~YT+.4V az >S'9hqF:[Qz4c"\lu4` =Q;˘5d0C%6 MvʳP Iͣ`]C4䖁l(9h4BE=׊#ts%pG񞘟ui;, i*jXL>$}J^StLAr麿 wH'l~UM:`H RJ`K ۈW ǭxgFׁQ7ِYB۬F8JjT[y9vhβÊdx}*gbaF]ϞV\~pf ZD#WdW{{"6fuq8_ oz9f~s)X"V)9sKA+3#,ӕW܋Xp BA@)-ҔGxFŢiϽ3ZMy"f Ń=٩!o e?% CtLk>_-q GnO3zn|Hr#Dp`|ZWo3arI{YA6$IF;r{}߁ps>VR N9_DEe RZ ?VmL0,gfAUѓUxҵY}V˪7,"qyAܫn:BUb0^n*JiAw @\s)Xr%{;VuXݐS4m92siV3? یpoǂA$5(--  H[⏈1j'e!9OrbR6 +=?x_q =WSc 84Ìwu0'_s}]ޖW=Rn)Z[P̼H$BHoC^'L4<)n\G!р,7G{+F:qo{8@ *RGSd%a%Z9 qLJT#s(+g3CLix:ͨSU;Q`?rhPD(KYyⱦ2uQ)5`^!b)0~뮿Kmk]Le_6aWh5X+5[g!zVf}+ ډr7rE N~ff;lLvLJ̬ZWV "Lrsk}v@tY)8Nhxx#bٽ4ĩxt/UHmCwIV[}fUkJD|+K:Îk#S)z;,J`鬗[K[a۞Pf)]5~OwKw:Ƕ_ē[}=5Z.}'wޏ K"u`Fxw%%ʥOI=1$.X'FIAY~CEhȜ7^,J~0li fgOF-WP,NVmg>D#̨-gI+ PX&%+N^:/#9+z+`6E+ IY?T#f:BiV &*K VQܸ{ϣs:osAQZǎmA6.@y7\ǾJJcͫ~xVVM+~.7rw(˳aH A87|pŏR>Uu)ٚͷ2@~Z^GZZIDݍFƧH}C޴h: /4zyntx(5F ~y>\=#D"C!&w##7&V)MܧJ) G{rlDȳGic-dݵ.yRU9^iwJub7yFu IH.r ϐd2W j\iLv,]<!Y]47^?l0M M=AXf4/łdQRc>\Cd-#"W.\hĜ*ˠ*RWDO0~5DsOܩ FŸ1gZ YQ'U'6[?2QW4J(@Y.@2LM= rcBD+XME`S }܉s1A__].$۟BG W+wf[9C!~p>ՕfPx|Yw)XܦKʡ챒54fs[pcCRªWhTu*݂B>zMQlV;fv6MwG3t)98 o*wf%[ nvYpH[a >M˓S]1ԍ8HJ"1K/ j3օ]& PQ$ʘ%Qz g0gV@ډ&:%ޜDHb 2!aS ੖qWX}1wb^ۏ !a<Ӈ1OՃN:m/=8׼C|sYF1ww9;1(M5D\>bBGi$@R +p5h.l3QC o`>cE|iq܀S h0@:B]z}S+Xcȓp%]s9ڠMmZîVf Wi赵hUS ){ٸ`3*9=S-W ˬZkԸ*w^9JPR 3HZ'$M^Д&Ǝe5ͰT9j[gKAL䳟F0::A#czqpq<&DO@emwwns@]gɊ]\r{!Ժ=70Fa6Y"7O] - +x^ttb*AH$w }L ԃ&{ѲGZhHDyesR"Dٷź,diZ3̫HKC:Ȗu>e*^rjbj9zx|ZC,k؜z]gC_SEm_c< 4q]OϠBWEJ _W]$`_dlmd^V鲲JBubyЦq%- ֎;'g:6_[&^xG zV<|9'1T2P`t(F͓ El>vL$$)1e6~ eż%N(?)ד(UM_uMe;O֝1KoNww7{F* {/)SL{p⹐U*&$Ff'Jb5ZC^ ɛo_'/yg /8)qD0}g1`ݺЬ*~Xk-1G曁s&}M vsFj5&}Kq8ɼK-%},4IfNM Z?)ٓMKҕX,\wC12Dd=93bhaM5ܫB"q +Ϩ~jҭn=#Yj;ExCGxx94S:%vi $!UWxPiGϰfc>cZt,@K^$KBXԭXXYۀr1Ӏ(SWx:Yyj)-nz[)i% feoCͷI>)~ ]%C_)~M( igRf۵=C/eoQSуZnpae_m^q/QI ظޜbq,לo.IŬ{GKp:AkVG!B% I_蜖#-xݛmƠz;%Br]9T PjE5zI̐,R}]k8ݸ&(abGx_0EZ5Cl,%Qu2Cz<3l^tUp!RQ Oާ@.LW$O6E:']o;jxPeY83'8}ut("2[e$яi9)&)zq2?^&=#y8 !G q>!vfi,3^%A~M3RMH C[Z3 AI8靜G^(#c֨^i'ZyДއ Zm/bf$:^;k쁂kURQNP$ܩPgϙZwB:YD]U@%2۝"c$,w$SLO?aq%_Sַ]/c+\F7l7U+~dX1xL3@3栁x>.؍ptG϶36Ct2AZ8=3n厶)du)ܺV,Wvy8¤D3o}3/(-FwffKն)Iu܄ƶ@bT4i޵39CӅ< n[sh5#lyGyzw cU-- ֦'E- ~t녅$a0~Hy f/'DD"ԅ{lc6=",VE'$K+z$1AoAm#; 8Τ Gt`臭uyc*|JJJΎes0S_.gL}&|)fU1#x4@qG9mYjHlTwO ]FWQ&!|'-҂`rgQ߹yd LA %(Uݰ1Msc?ew\(߈g\0W,^}a ٙ g76$P$M %gtxEoD<)znLOIh~2(red)z e~po3zC06NJm0]LCxHD䵂;=@ud"83٣_8@ PI S#jcY,4Wpo_|~{EPg 74q  ̾9베$qx15za*b݃d2b2\3w;M~Pы_aJ'壩#FvNۆ]qAhVq{ÂvʴS1&'̪PqHz>h|5];)9p#LM[MzR*+[G1j:e(΁$ $ =L@h" 濕-8X?ybZtj+TKWu#JҲvTHUO)+ȤEaչsHr}^ DRklf۵2BqR/i6umv_pxJ :,roГUsdg#Ze0*ߥI3:>]w-Дrcdw@SIp14 Vi)l*8ڎfʒ:8 mCV3EPf#Vtp8pG٭obFHqm^jDλPE:L >tr+Ej%id`\ ._L}-89vmڦ,#KhcE[q(r;r9rC7=XAT\~=(}(Ūb/-3&f.yALz$9=nDUXVQe9N[x+9anWr8?~h<1KMS?oGX1DT5Vvmڦ,#KhcE[q(r;r9rC7=XAT\~=(}(Ūb/-3&f.yALz$9=nDU!bg wAL4ʨv1"ObC$]A*D*@ kDO4^p\sUUaNUJ7>fZѸ$6[2|v!!K^\?s E(qo!;e#~v?ei*(fz-\6O'Z"e <exړn=6$XEQ_Itql*ĥaOFchOW^n:1P?څ +¸ I]}T.>#c("^INo6ji+M1mJl:m(\hI֌A MkO2Pc$U)aw7X٣:y "]F7.~Au8B]ǏvF1iL #OْWպæ[<3oB}hZ$rߤ+|{^3Y)^MCo3g^FO{>;Z.aL6x_pWUXN2 !@+c+:kMKL3bd5$cC=og RU\ӹS'y0c"Ov9rZK9 w > HٟړJb!xDvH2c3։=H:οj?- lX& n?NDvc^ !![FND4-8 4<N}dfԒ =𥨘( ;Zxc#d@,z2!+ϮGT&Ofx4/*&ʠu֕Pz1Qzr D>w܋}:w! iȁ?M*4gǼÄd$5vv!6O?BϞq78l"235q z`Mj< o/IIRGF#4Od #<1fށEƬtVΟTOsaM̖$|T|$ ^)_m酴Php\Hxv4UZ~뼣#%EFR%(5~r>kw*h4Q,OM)Q>5z Zٯc}7?9m4>7@Ot&#p""$.pe5RQa+/Cv)ז1%% [@jnjvj0VK6!Lb%V`p4j:i8`?>u{ #RA뽖~ dt P]RwD.T98S&lyuQ`}96@aQ0:6%=7AhT`L=fW@ UmAnѵHi؂oP/zJrajbT%\Bmh[qGwՍ=nx땢1֚msx/Y_j7Jt<5c!^-e )MQ iaj#ré-KTM+z>^۬?nƬ̴8E=!, nTGR-cZ/R\),ը7ڕ#|ץL=R(?<>o:ޭF}x=$ڏ\묭nMO$t и v|řN&q⶞o4e>\f+yRA(@\:,3HVJSfǵyc|;]]^h;#.ÿ_6v_zq W%擯gڗvw:^L'tQ\ydX眆VXB'oM1ٵ-q ,J䑃P,e̡`Nu } dixeY Ƶ–eΓaJ=: 98!&%BfAP^M[[yA{NZa&*LC=a9Fh P9HLĚU6wףF۹0x`^Yn/IVrY) $+t%v혼YDϕ9/ܷM>HIecͤ4v#CHB2\t{:>VElB9h_!0I2 (\tbV\.aV#fnAG%GeNiM^\&xje7:cPj~6+3Ư_i o6sFjjF|g=!!h$F-ђ0Qayv@rOHS7m, ?Z _Wؓ,}b@QM9!kF C". LKAa CohJӹ 03gϼ30 b8%+~cX)WV<-8 &4Wy>ThJC ]|_i\4.'/)_𳦺LuT>n/1>G{O ˑSp"1MbbW^8X`CvD3+7,pH WnwKvB/H8osY܄n 9SFdOC?Z{\O"^'3;v6=k+u@3.WVK:AbiHf\O+8$ObݰiGjZ+ l1ܳ=JbE`(J1 r yCdֽ$_VAb_/iI'\'趒<jx+[G^*H3/u|Gw<'2L@?bADl #7,.U65h1d+֊C_l A_:EǚGO \y{p(kK&ᰋr bJwlBM/AIqkG,:Ⱦ}n_Jñ'9j#DEu[F i;9 WIRI!]Y/Fᤖ;aD3ZPL~c62 K8Ixzj&|zPVR@m6ˈ# 1^%8]4Rcr2b\EȺMP /T3 n!:f}Xo4F'Sn/;p_`̬ue8Oy3)Xn"qJlnj:;)8x@ CC&ga tW$R)wI^uN IGZF=nwbACH=*J! ~,͇]9.zf0j0E.kE%'̔e+UӁŮ] ۫kT!B_u|;lW &gLZ{Hlsˉ8s1w6<Mĥ&edkVY 'LاHhN@<'ߏᶭyfYSjĖs@> >`/+8յnީeI*gCa4o6W֋?`@qT;{e$kn$l<ߧWmТBgS0?wF}Q,ᶀ#,tsBS#jg n'ŚӖo?{ˬ`gcd%sgNK1M=}5əbc::2I7^{@{ElRM mckHD末Jp Ri=M%+ړvCa >thH4\_VF!]$,G/{wJ"kpmCv?gh8002DYarb[Tpǣ~ |7$Ӫ -,.=nEU"L]Y\v\AV/a\?{&_3}ݏv 5TZTNPՅ?J[8 >ѻ; @l6cj [L;cgLa1 {%ϮZ?6S҄v|&ka׾@>(-0.]@Py^`n.G=bO8l|2Ȝ X{|e,YB\^ѺSƜf\Trq.\Ȑ5pi~0W< 8AԐ}|iV0-HE21*F;lފ崏66H08^}}+uע|;VrՂԚ~XhыoMܔG eVJQ&e3xﱰ,UyUhOI⣂̯Ѱszkíi2Muvv2P 7O̗sEO{ĢN>w=,9:!رBTpd>^^wKC`ԙ{b?̈́7,TIV:D;s~<kڵ0)Lj=M⬣.']5A۷muKv,"_9m}|۬-[c>PJvhm\{N6Nw?ugqg\E?`c-vVH\ȫxz^;5ߢޚW)Xaޢ j˻Eh,͆:ˉYS}B0LMkp^C*]&cM&!CJUM$;!l@8t@ۘ6SɘWv>R`vvp&,Ϟ@6pbND`ʠ m1 .S'| &g}-R(`_}:]b T}Z BԣܺU3zog`HE3%DH_HUOJ[w$3GZ~eKP :|"}#Q){肘j)?ve;nDCXSqȿS.cX0?e2⼻{lT;5` CmucS~iulٲ)D@=i9:a߈=DW{1 in6JЖ j"EqԸYN7'.UkZ?KT;!38xr:}}y-ґrdQx.~XTYMo|Q: !ɳlLll' 8P5) o@ëv+ZWf?_b Qk '搷ss~e^i_q:x n|uHhR CgWNw Uepx^ ^6m$,}%su@$+,j5b ص!}U\~8&,gƖ͓j ,џZXΌUtu!'s,'z<;j5,C\n8z{^1'_vA UdEA+S14,y4KM $ר{? 欠f9^I2z8}vzu dt!))S.>y;I'95bEHNK# F#ãl 4$LD 0oM<;LҒ= l+ޖRbzcD^jmn 9³ɍ~s%d2Kg Y_l^Z+ "O2|~:7; \ɉ_ǘ[zL J^}vqydhY'7+ٕ6[)0"(4&ɀT)s|%zl(n7[X? dB?P}_rC3 R@x*ErSg/5ԷIJ }w7pC7 C,N ;JenpÄ}aP/|/#װޭ;;M=s 8gB ϵrh(mHKQerkgN=X-w9NI?A&4Q{B ʱθRhf$PIUeDh>6r fjBKU)=P5`'i+n]>; O@nm%َU 0"lKQ=ELū3ijT3Y#?䜭@ hfzh[4?47+ H[\?BWa UsY%6  A+,wHX3 %oa=f14K IݭRfІnnj s4#\ +zmV?.p pwvut9D]J՝:>YNb2:`lo9GC% d9E)շڹm=I9Ҫ9?-Eڼ^"Jrx$*BlA~cT_t ] ɖ,PN_ %ئ KK=Xb,`msUs.Ig5SvDS_R[,/Ғ2Gcn4WXk7U=rTRWX \nk3 ΑamiaJQZ ]~@("#<1$́ɥsiDKߴ|zo/;cAc+NKnMzH%տ_]st\U\GR)&@Ɔ(דR(^"™f%W;[R3/ .DBS@yk|"SϧȆ:4!M}Z(ȎqA͚Iju}e3D{ѕ;{|s<"#-O'1ZihT@@nOȗBU$vjPƵ&*(^%$J#=ӟ?J!t !ܜD?L`^ TwU316xZS^:s9D7@↮ʹ23|njGg*Z|Mq Q3= JglxE Χ^$$^ @ziEojO%L kn S3laay8"((Wk-i|dzաLYY=8Fi~g?(zi=C}9y(8^ x*3c~,%q$4k@&T6<4]2J39 FnNas` BŕKVb,p$G:= 6+E&/OV-܀`C}Qr5 VQ /;uñŦ3j`+ʟ~&/AK].wS Dsqp;WzK(;ڂ L_v<`&=Z,(9-I{z"LJ**: E.X]!`$޽#k1ᄄuy͢?UX{)0l۫m (V6 cd-DfNĜŊk5׏J3R0\12AIH:tؒ~L>QUvq\B?+"/g={Dz!N2mnuCXFXN8;#kaQ"FIiz=.!ڳ?SE֓K =ׯ( d >oܡ4|1C  ƉP~U{#¬Nd#z0>iҝ%8*(AίaD$n-SUa{I2(*a56's ϼK :]+JZoMy ]ΓR$0*z{⡟GfUXꑜc/l&Dk뢫}Ub8q/CrˡANwoĹ;c8Z,p`u/y+[<aB btְ6G4T,=Rp#i/P :0ɩLf<\*ˁȲC( !nM?CEtjq?UEgYmAV%vd=R|n5?rYbel(F>' T~΢ MzѝX.|WIfp#1ĞL7o.X @wzE/D|QپL>.G9rJx2Ǚ|ZX0_b팰 zIQL*0TO lU; zoSacp+zIpkx&Rr"}1Y}Ν(Aa_Eze!yTP:?PG6sH6[lQZ_z}% \ /Um^~S>KC%de؛ DH| gH~'Y;JH=I\Pļ8}?'^Qỹ%[jBM{O2 8c8x'D;~Wt63b:X59@Þ\ v 4 2NLvpoq_d4`R $ rz*1_ktc^sR! 0gzRK~=`h{pA? 'A }Jeg_)0&p*i}owDH}ڑD!w`YC7^ՓFM:Zv.qw1 i[:ㄜ0t /8!#_Tdqf0 YK;޼lX~녉(szWsװ38vk' X f PTWO:0K}ނ2 sS(}rsp֝iʆOixqDuIam8dOgyםtgV؜ғNշ` 1{/؝^ڙ#Ә _z$+ԋ- b=5$[g?rwb;8z\&ӗ |봇 &h|3RnsZ݈5 i"ej\Dc3v}d^RZB>ό*oovge!񗽲M S>)[VTcIT+WэwSHeǜro0{2|HD>*,Ȇ0ZK {lT3v'N c'{n(W\Җ%forwRhc!}_-Cgi@t|X7v9U̱:*Оn÷pnt^MJN:^UF܈b8R; 8 }jO"&qIiA44 LR|GP[^ cCr&f,!ĆE;<ǪfhgUEzl7 cZߥnf2+{+]{NVNc)<:M"-`ڗ9;>hFȩ5Tge eBHXT5-wya^!w?MZp:_o_{y˺L$mCWs^-+BbYMƠ,8+$'aY" _Ĉ*CG)co .,#]#]/4W(/_1 DE"IG4>E:eA$Kҿ*/W袬oG+:T >1tNwbf8fBgpQ3n qZ&_9ĥS@Ng\|ҷLk:ۙ:ܪ,;0?Q$arlXJWư֛&vvC-: 8Ǯ!,OC.{ڂfK!@/xoٿ,i}J*WaW95sZ"LFD-*1۪B%e%4&!+Q-]RN(<6=nyj0 *:U4TK~Mщ{]7V ʡZI{kjj18uМ6췿?8—λl:*"4Ub @g8ESCEִBΆבw7Q/H] Mb~itUt|wS%5[UDay'qp#WքWwQ'X!YSM&  g҆i{\ĢN}BJ2qJ>z&x$\lO`5WU4E8˦i6@~}op 5ɛJщ˒&1`ئV?"~׿[v,\~u-z3I@UI+2:v%/TGt0OS4t/ڐ [`uC)m-LuhQ`I;kûk^L9Lf)~4,i KH`|/_#)W*N/dU(T<`!Ff o3^F_xpM887 fð! \DT[/c*ʱDviM\Cn੃Ӧp-㻛E_E{6 AguVB[~ƞtoוuaeT{~#bK\:PȚhge[Y^0 |HHpQM ;XJ(O$$u8q$zCdwWOrJ1 -5x_SK, ,r3-SBVrԳ2 ZaQ McGfě7+N sB?k+3O!4x|ewPY9J]]ِ "20πԂpG(#Q. 1<oN'E nIqOw<W}(U1GDH*+vqxTt[rt3,ᢊFn^[]|n+w~':z?=1,\d0]}!M%q̸u/^t{{w70YEmv NXj"@BT[oWCԷc澪$ 0F5ʕ p<~RtzT@Ҝb' _csR`Is|fޤ!~$Wr dLN#|%YH:V~mKj98؅[~# iij_ˁx-1L:LUIќ" f^}X8?<tU*Uɚ(HLޒh_eqbIyN-ădCQ_W)4OH˜3iX4#8_栘̺$oFB luTފH[f`׼Dj K_Jq2H::#^0yJ=j(~촄Ɖ!m6Ro(>+9D4rM,F/uQ֚o@>BQV٣׾/4rorǝLlZ9@} PMwC4>aOyifc`Ys.5O>mBQ8_~n\,y~;/!w}fzb[ 7RY0:NӚ"x-V1nGQw:bbj~=]enK| G=-h_2/r17E8{j/bLtމk F'ŕl +F"> L9ClMCl 13㗏56o57wOOjpHς4 |ԽooD{l 5aPO(׵#A_O 8%ganf6i iIûD;qOI43 N4JhzŰFTRe+bIf텍q\I֏ղZq E,`Q/8vY:>(̳:3@ϕop8?i3O9˪tpCfz=AE~%Fwp+ZuP, b |&!cmꩮ?W4!-ط=#V4) {PfdRV`+|+*f!'"f^RLjc :`T|ck@gī 1[v$zm Ϡ-:Njo˲0px muCOw ԧBďR~.7PS᧞?A(u=+WγV/$ئ:߉Sgsl'a+,g:%tHH>fimDWzl.7Rh (O x$ޭu=\;[puF]mPY4h@Fw;@>?Sr< ]>1m`ddA\K05m;΅RciRG)B3f!wvŪH@Z!nrX2߆ƍ{$~ɔ \)6Z"" Rvnjе{Ey~Hzc!n Gf]VW  6;).u,kr|tpET Ԏei#Qe Uu?C=cB=LFgg-}d3ghrܴvQG0Ҍq67Pss5Q-Ԛᇙ1lU'*@W9i % B X \)10Q<)y~C ZJ {>9#]̨@yun"WҾz4dy}`m@ rߚfN2:vBcaZY^sZ<]MY lwe3n7ԶT'?zzgᣇ 裪t*Fw^K0⇻͈b #U_3,q pQԲcS.Egsn{Y7Wm%"l. 6Pk~$nUw.6'<Lܯ;ష?/YX 2$LcD*7 56`nv;az~n-V>K*jOX;_&^C4!DdLNwV6KӲW 0t~_iPƹ:)@&\]&{נنCqSH?Kc;}+\i%S~ =S=1*ȒYˑ=囅D))T R 5@2 1i=ܜF}MƌhNK ?;I:V .:p "] !2c #+ZdPHnU .Yad}&Kl> e+P@P IF'd/7Xf1N=6U09aH$3F [-Qxy2#YqVa(w9^ZwCbݽV RRLP!ɜhr *M՞5홹ϮtKAb$j\mt 27fsi 5~,\ds8<ż" {xU"cfԡ6aˮS*WC'IISYK;I@uh!-Lo[{;?HB4˄gK-|Eʓ&ӹw.ag mNfQb;?vt[w!ip~ˆΨr3LrKM5\kY:7Szѽ;'"p̀dhZ+»^\Ŵd}yTjJ@l>'}g슝fRgpL"ŇۖzQgX"aHptO{_}r;J2p .7;Z;p%OKXtX41%YwN^t'4s#ۑ3&y_\k ׁu۴@l1sAt~/{[.t4\?OTsc[r}wb-z<:Ĺ=/~A'sb&,lp?pmtktO81b;/-S2թ~3Ώ׃3aagQ+?&yCNI,Zݟ`J,2b͖s&Y5J \?\?/1A{ǭ?^Cʔ._U,=p4uTE]Qnc9^C>`T%.H~]`pLƔ4h_&"HsHسD[VJKy,brS'vtsd_Ws^u2=?." pdפ8F9m% y]K!Rx†s,߸D~ YA2|k5z~Ϛ&d녥 Rh. _$Ox܀pXgqG9r.hușVcd" tz/L!6J[rAp)#͌2#JZ3hCt|jֶ1iJ~ b{IE٨j~,qKZ/Xl[/^#1TIH PHͬu5p` .a߮+_7}گq#`[H+ZFcUMI/ c>'"hly#75Kj~ E =vq޺qaWux e ,1,pZލ%|r :B6hץ*X.1qHcKZℝoF?p~5JIbPh]FVrkfCs%mP`ӥJKG?݁Y[&fNp0ĪE:]Rx]}O'"d o`.f! Ƴꔆ:\܃^uۮxQ=す✧զ}yd髉9UbI`u!ZѽFZ,Q'jOjn2'ñOcAG0.xS@R~xe xiTƇa{}\dBs]6ӹiE0C/H3`DHЄO0Yd|G"qL;8M3H$}-NӘFA;g:9XttLUzMLޕ _(:CI+ v֡D7OY_ &lrl츆(r@yc/ЅLZYaLrҬt,`j^2U{J=kA  D|wESP[LK TxÌTt-zEui^=pB6"a?c¸V\@ ܿzAY.=!4mw9C6ZJTԋu3^P弔-1QU-t6Pg@s&$SUwN1ko* 8sER=Ųvw7qDcVZσHsac4@( k!ƿD.ܘX,iS#-onU?xY*9eE&!ja "4譿aH {TP?J NHqA| rbP#8A]䳑 ȿn@ftBP ɓo7.):wVc~1Ws89dkhW=nI:?S7wcH69^Az[׷{G i},լbXeƣW7N:J%xvq.46t6;šw;n\z D M {wp` Y'mz:9ʴ3rw}b>&tΗTdJt j6dڬ%Zo9GhMUf[S}6t$JsR  JӰQct PO*FvBҠ)Yr%Yμ.= CvsnP~RbWY + UF~Feo ʓIB鹬3;۝mx\uQƈ tM {,3gϭ74z+e;ḫ'O*ҏj_[Ao]uO)ۉXz޻?E/ ]䚖*~G~8ROgROg[: 3VjZ6jĴ*}ۨ^ ACzuz(TM(MQD̚7|-rӖ 2mImV.?{/v꽒z=&>02۫q-'*1i([ 3 36 j> C"R ґVo\Tw2cLxd C:].$ 7'HTGب1nvQNȲ|?ɪ{ +;W" K4)ąB0W ihA]>C"R .Tu1M_y% 9剜v>Buc|t *dLSPLV)p;H ĹlLPTz<[1 K[܎0{·޼'byg(V?/!%@rUXȊ%@BVav!+K|? b` !)Ԗ!tRtmenF+b,S]]!CbJϽ ^Pm3,D:xHn" չRY]^a[fg\CukZeANZ٭TZcpQ>6k3<𘋯@uu\y=jBגDzlOƶOLyXpG/Ч\ 7Y]n[Gf= Th%߿~rB'VLNд!?MNB:~pV@rphiLXDpͭ`]]xPUw29(z $Kҫ`g\Mcb!Y Δ)]j _IQS ) fm87Z%hΝ5n_4~uK1pxI[hwT2QߵkIN(O'O){iQG0kly&Yft20NrJ.}>]ԍ,>4}]=i prc;!w.NM"4cFR^&*1JZGP:**LmeQw0>saˬDÿwS?WyR&Ek5KA>ZQ MJb87 CS5/X_@4xI@G|/ VzSMƿ䫋|5w;X_@4xIX 3Wh0=CpϼT' :wx[!ռ3f8%5!*x]¯,<7ԵH=&3^XxlTᲦ3*AL00C4y ZZiI*WC_|'Pަ{3+y>'MM۟:G-Q)ZfK|!AJ~◙d +`:LǮ%#a㛌 gtj" N{v;V;OYR+eA&W:؀_@4xIuKJWqDv;tiW#eoE˖j;F&Gi ,JD _p֠|\G^7-{j]"a>B.ٚ\+|Y (wTL2-kƫ ':J@?`4 5 cg|<j#Os A 29@YV_SA p K:"FXڋiLT]X؎APD*@?i*#бVڣ+f2mCM$V?75fUq҆Z( uoԾ${MAb4ÆZO8B-˚ F&D*OTV_$z4svK o]5 ._C&{gͮH)&jݴ}v*Mf3}+d;,!?`~Q`@VD`0K5տvaEnS?W{QxzAԡ23(l\wGRIChE-VSSx3̕j//D>Js(b\[p*4LnW*VN k0IhXYUaB+;&~dA➥<=R%ߪoEA$]/:T4tiHq3_`BhV_BERIeb4m Hz?~jGD f!9I H,sf.RWb#G KKj3ߕ)R09AaZG2f\nȺ]Yw#^kG oXMK|t5'Nm[KTPΚ6A72)FR (r9}nw,ݶB$wVs)B!SfVLK;"\n`pu-sH㴢a)zoΞ]cͫic*F&FU<,tTQndƭ?a73Cկ\h3hycUt:5N~g2hWQOB,#wipv` lwSZs$|?6;} >nAVS2x|DVYVx?$jCH^P+HvLK;"\n`pu-sH㴢a)zoΞ]cͫic*F&FUJ]K{"avEB)RE%]~c!}BcŹBwKs[|F/69u$zBŖ - Y3S7d].]qU]Ե#҉h꥾[:yu6(gM Wxs%2F1ܡҀusNo! 5s'!鎶D-H%JK ZVTe9lT]U@w@KAZ?&rED;66 ;xm ̴ϫ‹?s^O5Wo5hLR6KcWF%JLs>8K9]e~Mz!䋷Tg'fߞZBuP7+qitT|҅4d~&"efӞ8uO'ҭ|k6X "6Hq_pǻ ʅݼq01(ߩ(R167(\7kZ{ s;|K i )܌@FjwbҖP)n^mˮaNޒDr$'WݯT8z}7KOQlʾ#i"Ln+Votoo?~7輮I#dx+oWg{K= O򚘶¿[F RS96,khXi[L݈UIá,*a5QP8.?Qe~ږl)B7xrԡ-9lCr]F6APZIO2ylYceQϫI0;u piU$^ h4ʈh懶;x^WWoyZ(fO i.6h=@ Lׅs5͒3Xx)e.Cl]|g甞G8zFM&˞zUwV<NU&(1uh'!ըnKq3x6DNJ2`> 8Y.ATm*/Xd FmL#'o owf|@-.HXV*Š W tW>k'.i 9es{YFD"OG `GklbZ8vD6NLP7qC1<K}t"EϵYwHI͢\٥Xp!$ -AJ$/,2zZ ䷋|M_dE9Mlr ih8\%(%SJ xcLJpnCX0ZlIJG~Ԇ6"JJ#+ӽ$ZA*'f~ @]𶖁d>pZ ڂ!=$=@o"#t Si''=SFp4ÖMP?`Mtݙ. d1 wO]tX)2e &]F^"roki/N4Y&ޗ*Nm:%I2Tn דƏ[m-B`R mFsF[\и,>ZjK uA-3EeZW&,$ Z_p$&tPm}nk)Q>L^O M{t.(VfjɾtmtHAy<Չ"rm⹽ :l8ɷ t葿٤7V]z|{p>Ŋ9 uOM/NLTև2 "(-PٟƽP"Ao^CUf2o>2hO>Ö?l(`._/bQoȂh=mdi*ukH]'\ O4Op.2ZW(Ga^{hT*LN+HuK7Q>sͩBTsIc)3퉬uiKNer38,-*MSr\Ӥdf{m` + ҃\1p_Nƃ3],0tљ$| Drˋeh)e!?yJzI]s=MF:J( {`쮦~s2R&ScS /1їLU6EOb1ʏKKUQs!\)c<0}ŝsrnOgn^E{sslLɈdmқh}͠<_&&DD@N5(_Κ{w}b/Fw;uc1ّSBXcR c?VK-+0y){0^f0Û` İ p&9lIЊݡv! aG޽eYiAUW{-,V,e:SJU|_$gvh*dBNy{dqRGL_*"eokU|s]\|Kk)BFSs&QL){L OU8Wi0SoUN:ʔ}\pbxӛ~L!p'4-~xN^>L%LkcR\0UeG,ZE+İ)}'f*8q ;bs/IWYπX[{xڊqS{..fɎ@eR]O.% ) m]||HK>}nAKxcbvC&ίm/>8/-"XYw!= ayX0WKD>PR{N@SLl f6옋H>?Y|$>x[C!dJ9k)$m 9ƮPo"Y>&gTVo?@};盛Ka290'Ώ}PSp8Rz +<Ô>;whp(hDt' sˁyMҀA+b拺((ܪ?7L;JO*VsŕE~~7#k hFI+g/LHd`%%@2+,wItWAc},訣ݛJLںxVv_&9;NJG>5Z86iIBpzvK>9^fC*U^nԕQ+=4́B<TQ^Ζ`eߓ]~O< (Uފq?<'Wq /$ z5 Ry8ɀS 2.QƖ5PFi?Zj eT26lfӥFoE/ҸPՐl%LbaB=(0_΁xGKSk$ "P`M3l3Ji~!;nS\aP M\dҘP̿9$3 $G{ʲ8#LBVՑ0ڤ'l%biw4/E{fp ƺcs'?uD!b+R<0iTxב`gLŵG B(&] KdSkPv54,u/Duj |DHpea`mC<}d?<Kλ[#NeoQ\81Uhv0-cr@4YcŌrd 8* 7ws?Pp]Ll*.ɎHu[Տxb_ƊVu(x?VVOe&m ߾v2Uj\j} [_}Q1Yd@w-mFx^ ݣ%!Bz:Mhc@xzD?X^ZD8 wsG6V3KV lIAP7caNA#Uei=ߐ#TRXcuia>tlsMIL=T͏Z瀤fu=.@azb*hLg3>Q9N,ԆE +@YdwƺC04u> 9Dw5iXmH'Vp׾CQ9WQ̄B @p^[L}~ G}br_ LR.j}!Ư? 槐>M:!G>K!s FX|^G  CgUm#ܦMA'x\׳o&9ϫtRK"{,®W=(bŅ4MFC7;^-7۩a:07վv݋a?r{-@i&3#`:#ly7:VT- wZ ?7!z)a3;cxai;t<#<9'uQn @~s7Ve6r*b̍I7O_`1|HϜ1nmO:Ru&i}^&o9( 꽧ΕwXQFrOxN WmY3$Q'p-u91LS,s0}sfGe 6mC` nkwϩ(-uklyht-\ޢ k`$9 fv:.~M$RMCEC}?Br뜻4Vb˺Mr˺Vcض=aDL=9" J]N/a.j6sȻu0cX8k|ݎl-nG.q*<+:\%ʃ9HF~|"ݿ'YqZ" o;+c5(Q`{oD:եwt3Cq((" bhQ8uj-({^1G Xq#:?BQ"pdV9NcS6%nu~MUmP,X_8¤Nwa.TdZ ﺾ◁ƘJT_XyyٚN ;:΂wi$T "Qkm&5<~~RBGޓ TŀD@1Vp{lWO#hSv߷NԽ?vILgh K{*!sL0Y2 3i!2FjqwINSas!Fu$hl* ?IHgN$ h $~VN 2 +**>G'sޛ HΆe&giܑ{=fOӎ26&*IgW=y+RQIOȵb'e zsYc1agwqZH.HUkO+Pa5f2 GqL/ބ,@SDP?'SEK`]1 S#fvs%EKh>AK +Ǒ\5c{P3f~#O1i,E ssս>qf*Q"Ú|!$sA4dbܰ(sߑc C͈Vç*{ڪ`i5B/F@MfUz<-ti2m eoJ$)*6eڔ<`~/gtZ'OU{SOmW;LQi}<FPCBXq6NϹ@w~iBַ_Y1 UBɉ ]"?qɄ9WkĿ5fJ޻r# &-s>\yb*6hˉHcO>)!J@(FWnw=[KI}|dղP<0My&Q¼X%#VwEsǾ_@ρs(t&ʕ_b4΀~߰:3ɶ-t J~$ %F7/uĔ)/!41c\}&zULv迶{扌$#+܌-_Ӛ)ƃ@봋qv/j$7ԝok9T9?/vb/bbmKRpyfuOg/S0Ӕh펍wY4yd6?Q)GW舋 1mÆsږ,hxYt#xg\N$` ҽ>%YH(vw6$kChj={Q0( lSi"Ɠb?>Zw`pQO۳Dl2@F*ʐsqde83*/apm{LJ2 rƇy_qdA"ӇHp22qqevc$-InP/;1!aMa0Hs9$:&˵ P\8U@sBx:Rt.2~LIٓjAmg<)oDkt+t(&K/5;O}~ITIz7_|vDshϹfx.M8I* "nT#Q\s^GZR`⚮^A(+=GR;׊%{)]V/gӒ}mZI.ρ;H F<5+PS.$CK({)|p" 'xwП{J&aYfԒdS\ʙ) H{#.щ'a K OaWݣ;L 3A@'pnoQB6!z>d‘{àqO}v#lx/ O /Zw%, iP!= S_QJ :WJ^iJS9㍭u_Qܞ$tۻNg޺tI hO1W'jbLs^?%x9Vlc2Һr=޲{uF?. )¤*rh~3DJHCAw?r|5Ieb9_Cϵ92 (oɩvW qmC2%կb,"">Jazrycr:x>Ynf/ lNx64Q9?;mw.tEP;(h!Vnk5}K86(" O1h qT:'}ʵ@D=t⒠N4`簻oL"j L#JO@;ǥ P,5TA~ Ă*,+r~ ֹ|92jQvsK ΞwLHz<T fg`6bX[UXZ|$AG Olܮwvڍu]Keoe0sF\SƕFΤ|aTʆKJ/)B') G,Ew 5W|OɈ^AK jyg>íT.Zݝz '25i3=1/5̱i(/ \==ccz~<]Y-\Q1g09ǯ8)ܜ56$!W7bY˵yh/>tP&ᷞdlV6k#I?ky kYw#;/o7du^Ӈ!`N[ժsepQf f4Zq~ZEI)hJ< O=(Йtp;9cjǭq(Ѹm%%Uc?o0-x(p+*~ou-}a<2g;2π@98\ HWʝEYo>0?,ZN%hu>/!w0S䓉 2|i;r1"3"R /\a-VZO`~t1}IשF&l@ wRe qN-А`sZjIAYzPُjʈ7(mmNiK"$*CMR &W"w(%jY@` T3CsvY֏' H,H|ₗ#fX5Sy,mWҪ*OԐsJPі OHvl#iTU9s:S>1P)mPvr0O}8YhAt [0&w!̈@So7}jÊ"gG"5FX)x@*{fDQPup'q`TmX,TI.YlB|aPtQL @ծ24c$WIvon(į@d()aW0`ea*<ګZz8gϒzXUOc۠Zm9kJo T~cto]>^inaN}<<]` XPX?:1ۊ 2RPr &6 f }8wCyle>P}? 4]D;M1jW+!buF:sX̺MP0 aI^Г0b5gm:,5{zZvIIKrݏ.GfgY.-}j0W-M@ #Gij [( nAcsA(rWC1P&NOC #u57SMΛU4~C9;S}7Rl3E})RP*=qd \Zcpu'BHe?"F6q, 36XKwP*|~&Y-vխ0ցjL\Wp?Xa]⡃+co%@.R1:@NQ-D30 զ6CϖLޭWN<.4egWSN1(IOQ(RC'|h!f$H~l,wJ"*UKV.ha&Vr3 ҇WF!eW%k{iU:TH}Xك K@Iz(<`|zm8ۃXx2g˛Eܘ\\&|>(*Ebb#p #W=7J8Cj^K7[r+K#u@SS.#fBٱڔ }$ްT~(t*7%I&8fōCd԰Ag?)|W 4; zr9<áNjS*PНa7 ?0z6Yex8H1e,C<mT}k\^418b"eM蝻gQgKhZ4,Fēa_&WŲL.xn|z\kSHE_@HVT1HP7:UcL}ٶyãv:ј1s O3QVySG {W~[}\~13L*(xrв&{ܳŋ6VF-El <~Vc^[Y8{"rdiW7}3_i*$nx%W)?diF&7tU g?y20}^dcm (fp؍ q!?"x+M.S::$(cytDŽTٜ3skOi,X1.;ySAsq++6bq5%{qKR4eKr&9}oݵ֓ףZaaIaU/vA?9A*1aD5381mg, ><^,=SS>hַy~A]|l.*Hcxif[a$5wP=XȟkBA?e_CrF苛&.i zS7D\u=\) 7PE zS7D\Wʳd8% @}?1Le<^9 awwl˭$νZQww^3F%ܟAPHŜTtI~bmGPbpG!y^_~Oq9FIBZy+WG)Sը/W,YOV\t )^5j/Kk9e?kZ:`LhCxob?+ ɣ>P]O'A݉Huo_4?8λˆ"շa}RJvBNl(p2:X%ٶX}[=~.i+O(t_.l1 AMG6\<,Ӛ2~4~؟fLE=32m`?~W/]nj%H1)sQM 5hЇs49k/`!2]}x7lh]ӛv -">)2?B7EOeƒ  3 o*|) |Wn R^qxo6]w$+cwy&L,4՝X9zAC72v|G]DAjҟŧ"<tjV !M,R .i5oY4}#SIsAd̀zkGKCict6 RgyyvlA^m%ATKipE7F ]:})vi1KDyE+Iz$*>FۢĄ1 gTVr f]/Nmtb͕nhV/pk=Ruc0V;*D&2zC[w/s _{P.^)T#tޙyU嗒<`^6ZS~Zqљ̧}\ :~^NG"vBm0 WS(ߡa#lbYzJYt΅XSWLhS=sSG=B=g ]+c~k_"5؞:ϗhkWNGís[iLZ$n,vy 0|uY.bG|䢤JìM |@xc4, !Diq(~5~<+:V(rU3H1d|;5(TҸV2PL>!RmHYƎs0[=pO'1dx'u IlCxi)6m|CLjsqt~4JjWs&bDcG@/ VyQTx-TD{sM%|Z}j.0!k_ [/[ GY.`A &3K4rn<A;7Cq`H+sEMRBWmQnGjңSC׿/&m4#7unDLd8&֤k c[H?)ZZ!Y#u5O;ָӦ˥/~CJԶ_-æ6΍ 7]\O2&/%&?leb[؇Z.'ѱ/V4{b&tKNC-$yht$p6zuLK;:Eve0'߄F2ͅas x%d6SEzԠWW¤t5fg;;f 1Ƭn8~ >g7w@o&$O9U!(j6c# P)ckc>|(aFS %v FPwAn·D3woI*8k"-ǹ*oug#\>2Y895 싛ƫ3`Hw|)POro-(Y֠,QDz&4=?˧DmeMܓ1#(;$WgSJw9h l8ШO9k}6*,Cɹ⪝6Rhuwz&^g.OiJ{}WH:w~:\G5nԧybl6f֨e9gCP`ѽyyBȖSa۔#Q-_^rf HI`v)9W>VIy3&Jd@-Už ^kTkδڰbp8@7kt "!yְ(R8X0VUyD4WXl`[5m+}$杕R־fpHX${j#*oy>k֕q)*NABA3pҾG2gm]4ldfyq75`Sք.L `f1h p!ٮv_KF[x|*IV}P&bLяii)EFSs>'Of:^zmHUXȘAGw1#F2] *(2A*6IZtO<5 P@UnԲk>iQB;.&u6j9޵a'sUx KB.GιMh ou/yM -{mT$V;6KCŗJ1$+~LlNv1.P5 [M&&<` 1*Q DG+1 ĭҦ!^R2R)ʦQvu1XL{S[f7h] (}tQ1*^<4FywՉ(CzO[\Lr?z[d?`l!2gu!؛a٢.h'#&zH0FjL|J0dTE q ;rTb/Rv$pő1+t2}=bZmW5P ,pqk nz|R^'rViDv=L7GAOK2 oSWm sjyL!+CRSk(Yo->45X4 V^7%k^D=1rQ#}6Qk}$6&ځ`DuYLrd1_Zmk;8L~ \\%4D =EGyHUJc?KBf%==qVV0S!©D. %KJ_Л'7|Z0{XNbIKi/956̩$,yv݀t~I/Iךς͜#oA0VJ[{ Y){7Ѽ*='X=Cyϧ p$ 2&&b{y޳5=e0J ǚ;ÌFېX/0_<ƨcݺ*n(@m'wpj=a'߾u ou#Iˠ_ K%΄9"vf;*j`t~\VseN}@8" Q@c? ؍/({ީiF^:Cu KV eealSye S1e ~3DH~ԟ[3z+Δ`Z{ގweqk¿ 2YDMÙtWˌd6_$ EQ I-qif^ΘiK&V4@ c㡶^HiQtiT :ת{U|J3_ :=L1|GF7Y;P0dddRh犟S%s.alJPY8[>Ob#YO̲%jSV{Zݭ,*HLs{` ַG4 -m~=4)O|E hM}2ȁГ")F, ݣIoV/KʜV\wT4ܞ ]?fO K-شejf腵ݸջ,Ǿf ,=?#,33Zʈ3Q7ގa9&& [:YJ4v }Ɠe hZQS LɀL{0%rY)xxIe 2iՠC{ϡ"[!3 a&xx 7r߶MRyζ, m\ E l*#Sv뾆P$RG7E X7\V ǐlT1J.m `d!$p5v2_LP5O<݌\ʚ8 5GȀkg"% {g Yf}~bIi/R8]_uW։2mu$6D֑`Hˍa JVJΤ W`GG.$Q1%6g!^nX~RK拥ŊRqYD62(dq3/ŗotoO\tK^9:\k2d6 [C0HWPlbl؝#StǣnzR"`!-\YhE戗N788/2"|!Fe^EUS:0O_Yih}4R_2rGeek uT˻qJ" QmA%W6sjfx"/Jڙqy"_ZL&p2Êk_y K6.33˾rg~l%h(ӿհYe0j\irѩQ,A YyʄQIy]Y]|D8l IflU`CP%o=Yj[KlƳu?>Vن- dY%_PC,|MB1E0ؘz>97_$ϣ/ AQ})tIiGl;j(3lXT3㝸؏xI3kS7}A1جu`Oʶ'򑀰J@_IgޏJL$V`.Mt6A7[vӯvp֏SجdzZ C PȟER6XXS9V@ ~mŞ1<Q%;h҆uXK-_ #(7a Mpl|Y*1#xh{L4ecoUc6t<߅+}Rx WkUim\|I{Wi4d $ jwOók}kAgZ;MYoDG暶jJ[ߩ쬙;j'GS*zV]ŐOP݉O%QN>TCsY#?pȿ;luJ (L:0^'O_/ý?dէQ@M35Z!VVJ UK[+y_.A.w1v_7A l ,cEvGBA\!.#b*mVr5ȹW2YაQ'թ{\Jc/UOeB1e 峲򣅭C;x,u6VIUbZqk21;m!\ksDy$ 6R`F>lsW2)RR&`PiM%fN4ocWW x.hl?iu{skJ%=!GZrB 8g eu((7!yD ˫q ><2y"cFЋc^ k݁rD͕UK?TCbUiYw# *F=^}?Nh2r|tm9f@*I+3QcȍpZ?>~ SPڃAgD[z.Oz_V8B c&.vԵ &k⻂0rȶ8C`&\+Wi1BhDj1 HҒ LG P4XnxBAxDaqZ`HѠ݅3að'F`ZX\|]@ ORr4ӑYꡌm,K$eLuS}US۬F9{ZHPRJ=D){OCKl=9Wn Sٰ,J45FjM[F*R9ZZ/RD̉y6[Es}-ZϘx:L,ߙa;6|=ZE:8>vjop8N4|Ț 3 ^Wo8^ecwƇwEџ&6Im'&CP2f&{׌\ PeY ׋- 1 $ҳ~BT{l)l@qVnh-Bt/9%鯧*VBCTϞH Y!Qʤhlg}u[GJ$T3v[ kY] ~W r#`4c:1+ቋ;ލA; 6y[Z# رܵpLEw^yDa9xlPk9bq0L[?54t(977(/^'@m/DȰ%3'2ĖeKMkd YqQQݮGtq%`qR؛&4B|IϒXM+ 2Du& 3,oSwK9pRG ؑ=9 eY9 OCH#t^lj󝫭nFe @Fn`.Y ~E ڍ:'\G(EK klf73LtUC'MK}T,jW[s1hS·د[6 oAo/l fY]H &Jԏ]k^B6_!W"0eEg eq`0iNp)QϸEn.97}ud6TL=ĥZ`KWA'( )ZŗIV@77 )a~Xʠf;wM[Sz.HIVc10GxT@#GK4yҰ%e&W0<:'x'e\Յ3WE%.8?$@Jp#EaX+ ECervM_<=`ꉔ[M߮_0Jg4rh!:A =#, L0 xۤܕZyDO Bq'QG6[O8FkxlV4lfuKBԻP?[&| 51RLAڰ7 u͇8pE1nt8yx$i],8b,%BvoH icrִprlpVG7mx87\ɀ6Hά(@Qh u9kL,{x:`/Ibx,] ױn3K(-i `$Sp GnR$|2 ؿ@84EX1~M~+y A;8#^lC_hCoӺӭCjrhC[9ٿ~hޟGG 9E,QqՑsǤ8<\,6,OP b</ E$9vQrЖvfH)3toJ*mǩ#Knt1#D֣0!X[W1a&!ca?%!8)m;x=ѪFzBb&f-É'Pu쯢- P< />)[rNZ۟ Bl< z#p҂S 5UAOg}ׇt^ d%rw:_-Z7; \MIܙŹ \Ң9@@sܳ.XCǜ.lvV<[B h%eɎGV^K:J}c&CtUPg.u+#*u༈N AFjv \Dp 0>$8kizS9N )Gk @.H@-h]{g`p/^%,t1Kz)0`!Z(zݓ/vA}FO #Y)/1|F՘QNyЙ۷ef[IGSCq'ƽ]a+Bhj#bIBG3`5P$|Ǹj3t!E$r] ͛p۝6;/&A+|~([}9B7#G:E\({pLK2F"} e#=vϛ5w9[cC/Zѧ;ԩU2a0/BruTJ46CYQo){MOBMckUn,+ٮtrߐOKYBڃ=q]<cXMp], +E(&J<}Qc2*(O\dJmr[!hchEGmKmEvDͭ)_61Lf }'gR0_..<&[e ll߆T+>f%Kum"̽8 E`Kc}>{kɓ;Ǖ!*uL/Oh,s|䓴SG7QNGX9QT+%D2/m:>F]w*\jxcQ>9,fZ$"ouaR0lxsSJZ̦N~ʸs*fWIev%G/f&+,&]l LłGbHFݨC넧CdU=q+H**ފPFQLV+>oԃZ)m({((ll]u=w'Q.ZUAMt7!ɯ-.>`p@==%9gҬO%qxŢ)L|?O*Ux)rF.Aۧ_oʒҢruOT{I5DW"gSmnaT^w_I_qiN4B&KY+f`E :r\פTCdYڕ++[r#mBMWu|dY>J7ھsoi |^AHFC((G|"-j o _'|age4&vZ"ed9+˪QHwWfv6-* Wz$c{^=ړfo_lWFv,uKγ#zhtٿQ)tlC\xE67~<ۨ)4 S]䲥eCm:=XLFe:/TPnۚVmz]8da9x i]~3*b.ˢB%HK!,xQ ͜TC *L|xi)ո-ɵN@I-/ԇt&ZrQBXE#4qzYɚMRYI b%/:5H/A/H!c[(,fJ@Ε6vAp_6 )x!:~opǫZn.6u?d/7?jE>;0xteh?4o u |:F;Kigk1d}˃)81=B3@%O!0g6ka сߥƐ t 3kFP&9I4sWLLI%g5}ib\;85Y);S7d b3_2ŭwqcr > Yc1^BI@}[mO+~#tΟyf5^JJ [َ@ %fp٨![_ʆ#w*ĸOnv6 =<gj Ӑ8'o.¬hTB"5d_Eؼ?M5{GM? N9e~ڥL 8rԔoԯpHĭ RF|Ox+? l޾r "[E CҌ%yU'';[cNeDN6$Va#7;zn2ʟ3t*1`EضJ҄}mF!S, <%KQ P8{~8\ 0Bd8VIVgIBOs<i&Mq$Ow>X^; 2; khQ WL<5،z Q/3Tp3SϷl5h̃VPś}Ƈ>3Ii(r㹑IEI"zp.k55Z1ʥJf jq2@A2WiE X\ {KU@se*%- _b; ֤l0.r avT4)G6R:%  +2ty5ǂnq;Ph|xW60aX-$$ AyhNRrC;qM*|vYj3nԺ = ׻'g:^k&. :"D9IC>ez9.*eb^VsR5d B덖L¨}=, xy )JdJxލVm`c:hV,&Cz]{eh{M~*cKU dlxNhT5_9HXE.O>k\ 꾳i\&1":Y _-ǂ [)՗aJphaAKv Y *&]MR`o0'2 jk5L%"pbJqYkCsuI3#wZV=0Kk2Az|+E4az pog xꋸqF@s _*$/!ſC ZrȽ=I@]akYTڡ|m5ih;Yhf@7CX j]g,1,S3ς؞JRJ{^8leaRs[+q eljۇ,\4u٨ ꏷBa8]O'+ORFQ4NJ4+VNO9^ø9 ^%|@.6ܛ&> 貄^8-*d=JIv{"pSh*BYEw.T`]pSCZ`KzL~rAQ{mL(G3d1j x`Oġo,jtR+[@9~{y±%߲^&1N^yDn⢼9z 4 j–݄fOAKQNly']@)ГK?p`w72Ľ'-M?~À+__Td2B#}Bu3!^RZ7puR i~>&G{*tF|)ж/M$&ʥ+WzhB0pKυQ gWһF_Wo|n[zf9!vN d74&t46'2[|6kA;:X4W9ɤ ]iPauWH=@T[% \b;8(oU EbEhMO9~APQ[`6hh3:ny}[@HvUյ+ay|ʬyv\BSMj()^|`w%53< G5~H{'< (Pgrx:{$ [ފn@x0%z:UJL<3%%RLĹ =6G8'|84EO"}ߛő;!=H-ǭ% ʖU^dʊF;u.g̶drcĠ`.QEct[96.ar/l Cſ<8_N(jH>YY >W>'Q>3;vbSʉ#&֝9#$\ٙ:0mf%+_U9ROqkq^B 'w`Fq }fU`o#2ueqc5l{gfbX ÐG vMj65'[ ôH%usB_NƖ\}49 ~l+MJA;OP4\6wErZʰ::c`Ξؿ6[RSHt/Tbvd Ѕ Nݞ_| m^JU~LbBDZON! §Bc?RVv w- xJ U|AY!aa]7 ȵNIߜ#oo.7A%U6-A1)5VVO{Im?HaE81:҅l!#9be ,;Ǭ uQE'Dv >h{z!RB*j~k@1cD!ɉөGϪGkg+ *FԣF,(w!Ѱw!߿KBTo~,X 9Z.b:GrbVHz~`wKn;8N֗rP.&ɵs Ki:,ŝfMJnQPӬxvKOTGUm*HˁT]I^o a7mCcՎRBa}d4,tgހpPl'?=`{*\C ɍOɁU?孚9es0ĮY QGhֈn]4P Q٭[1ɐFJdҎ> a˶~s4zipE(1Z[XռqOMC{&W.ㅩjri2}]|j($G=j19bFh_˯F3GL1< Ւ\37o<f&Zu5 fh?z4eU`B_"jSrLc<)ta=y5YYb&]91NLMmiH%-dw7R{EY`ǫtᨼ{:/GQ*͉Z'Om2Xo%q[ͬaN^_0i5g\NmE[{Con&F]gRS7Zm^̓ {ѿB_xFy=/M&1s%6ue5 1;r&yEBLϗ:m)$Xcsob9˯:B>>`r9 T"'j7m=v^,zZ=o6Pazw]r.޲;_K2qNB&!,s;9\q`i1%U-o0zfWRsv b~m  w6 Xא;臣57T]\i0bkEʲ}2&)hC"YѴM~y8W_b&~ݟhEikG #\s~ŅJ `F TKG^f7a¢YI1 % ixByIf!m43=`䙵<Ē;v8q">(?IqG׼S{#P4by"ߥȌžT_gcIL[IAWnC KO'{_֐C5[k 8VEc &KR'u ],0فt3c{Z!,r|tL>n?"z @8{ԧ8*|MRù_Zˍ+gJniݶpCdDzs2‡ҬH6EIwuvynӚWRJt93CVW o;tSj@P+KcR^IәK֞/QF[J]q%chyl-MIS!kA 2,5ŵGVBcG*0ZAWez񬞚`>l U8IKQs h/5 %sSC\$W~EU1ulQ=P5b!ňRe zH%%_ YlZX![dΠٔE/wYGo3GD@m#*oFyw*h+ oEۄJ(*.NR?Zer d"DLCE\GeW^J?J; R CYm?R\ :*9, $P!rKkP>:.Lw{F!)\EWdn:q~ !$E)Ģb\0H4_YeqdwrŢHbM£_\SMAj LЊޡC_oӝGȚ,6$m93mpC($FS!_1$cS4 "B-[ZQUٝe`4;G8-z/9w2.4NtwfE9O'ަH벛%"FfhZ7C5^(f@GHu1=ב7)upv4 ʲq%RjJpMAdpf|>(TB u@g0@H!;[u!~ ®<φ(zԑ,h{QEW.bR͇Q҂i >p#{֪@U7ӏD̑ʿyRqW0ڢ4r{) `~pd e'x:. N:ٻΥ3 `y9ᅴa*Յqsp-!+~n<YQZSWS ucz nt0%˶8ߕ&џrB}} gE6tK;wgE7ˈu4݃߼bͧt2Ux֋։ٴMf dn?Өj%2|+ճl&$7(X(J92S dcYi@R"iKbɈַؿ;.q@R vRؑ8R`}|V񂮲0RF9)i(d!T=&ݑ8C#ª[-Y#e%\op{Xgn/~Pi~|eٟ<[Ăl~3maf2 GzjQ&]H# (T7 sĪY'd)|֔[!@BMA8#}^-m8 w]zp[X2!ƚʖC%۰w6n2Nv5.{/h?W twCCY[{u ^$k$?vYmpdEڭWhXSZvwk;'bf% K|1=C'ȍ7Fu#AAo)XQrGjÆa457b']tFZ*Rd'evACgnb ؙ; G- RL!%(Z "k/Qf^ $ ]r\q.C"L'@Z\B4?" J+Mk qӝjv {d#l< Ͳjg*!\eQD!#)-&}b#ėҳٓ®9C} [ vCi4096ެt0C7;/)sj*A 7DQF7Fݛ7K֢HюsfJ!^efƽzq؃g@f ?JX{!⫹/ćf8Ȏ fwh/ T]T s5-X~$8)|ȤKBVō83as%o؟b:*4 e"Q 1y-F|g/'Sf++r]+zy* $ZjT**hnƹ‚l;T%5/T eGKY\'NPSn\sP׷q! ,aqoJ,ndO!\>tO0/7rz8elwyCԇ6ϩM nGE]s l4R([|`*XmT>7-Nn>n}V]H3bw-Vy(OS,IW.d^_aKd:w0 AL&4cPќ?]NyJ^?4g 8E쫀`uKFC'Ӵ=1F8k'A ݅gOBv(8Qf׹0DPR_;T;tygT7,0tD54%_Hwyd;?_5T5MM͐.59P5S\J;pގD?YUtj92ar!k[PzPޯ/Lv9V&-#vkC/viH;V2dObHqo'h7oE̯D9>BSݲ0`YHh\W+cm?(zfJ{&n5oZ=ê8 3wߠADp)?Z.a&]0#y1tc78#fj W=O [oQw8=jIc]` |ɋM(\\-_haSʉJv8K%mZ TL P[^vuZUY/h L'C\j)rbﴤ_yɶ][ʓ1d#YwX?78Vb/-Xj<1 zS/} ]#씵jmͰ]SZN`.RT5r^`Rgu[CںU#k,DH/ M9:ko>A!CkAVڶ%&<"n&>{fSQWzg;աM/d/UښVhoBg=a@ilSV!m1kW&RMAF ƪMmJv瀍?,e=8GG`!E7"$ 8V޺ͽ,r _g%2p 4ym>S?pjmDO\:$ؓڲQ4ܠx껁qC}&щ\9ȶ}MoQ:bK>u.gWFBJ8vhgq )&5c+Y')0pJj^.'I-$Z(l1C{}{WmtoT޵,io91\-׶ȸ\n1+G]\K~E @[*T4wGd*?NjOjEٛ k  ^ ןF{%:8M2ܙx R6@PEVԄadJLOmarked lesion pPNmeduser LOAvanto@SQjbPUI1.2.840.10008.5.1.4.1.1.4UUI81.3.12.2.1107.5.2.30.25641.30000005113007072225000001677!STMEDCOM RESAMPLEDPNSssssss^Jsssss LO 021234567 0DA11111111@CSM AS058Y DS1.730DS0 @LO,Nr. 309^^3610^^Weienkirchen In Der Wachau^A!USLO11 ml OmniscanCSABDOMEN  CSGR!CSSP"CSSAT2\FS #CS3D$SH*fl3d1%CSN PDS4 DS5.53DS2.81DS1 DS 63.687936 SH1HIS0 DS1.4939999580383 IS134 IS1 DS 69.79166667 DS75DS250 LO25641  LOsyngo MR 2004V 4VB11D 0LOt1_vibe_fs_tra_bh_dyn ADS0 QSHBodyUSCSCOL DS10CSN DS0.10828038305044DS0 QCSHFS UI41.2.124.113532.10.122.1.203.20051130.122937.2950157 UI81.3.12.2.1107.5.2.30.25641.30010005113009191059300000190 SH8000000000330109 IS18 IS1 IS1 2DS2-159.82565509386\-175.32202350207\28.426151275635 7DS 1\0\0\0\1\0 RUI21.3.12.2.1107.5.2.30.25641.20051130133557578.0.0.0 @LO @LT Precision V (US(CS MONOCHROME2 (US,(US(0DS"0.72314049586777\0.72314049586777 (US(US (US (US(PDS450\200 (QDS790\443 (ULOWINDOW1\WINDOW2 )LOSIEMENS MEDCOM HEADER )LOSIEMENS MEDCOM OOG)1LO 4.0.12412818)2UL &)3UL)4CS DB TO DICOM )CS MEDCOM OOG 2) LOVD20M )OBSTEP; HEADER; FILE_IDENTIFICATION( '', 'Wed Nov 30 15:11:24 2005', ('meduser'), (''), '1.0', '1.0', 'Exchangeboard'); FILE_DESCRIPTION('STEP format'); IMP_LEVEL('1.0'); ENDSEC; DATA; @329 = CsaGraDoubleVec3DArray(0, ()); @331 = CsaGraDoubleVec3DArray(0, (69.0, 246.0, 0.0, 67.0, 245.0, 0.0, 66.0, 244.0, 0.0, 64.0, 244.0, 0.0, 62.0, 243.0, 0.0, 61.0, 243.0, 0.0, 59.0, 243.0, 0.0, 57.0, 243.0, 0.0, 56.0, 243.0, 0.0, 55.0, 243.0, 0.0, 53.0, 243.0, 0.0, 52.0, 243.0, 0.0, 51.0, 243.0, 0.0, 50.0, 243.0, 0.0, 49.0, 243.0, 0.0, 48.0, 243.0, 0.0, 48.0, 244.0, 0.0, 47.0, 244.0, 0.0, 46.0, 245.0, 0.0, 46.0, 247.0, 0.0, 46.0, 248.0, 0.0, 46.0, 249.0, 0.0, 46.0, 250.0, 0.0, 46.0, 251.0, 0.0, 46.0, 252.0, 0.0, 46.0, 253.0, 0.0, 46.0, 255.0, 0.0, 46.0, 257.0, 0.0, 47.0, 258.0, 0.0, 47.0, 259.0, 0.0, 48.0, 261.0, 0.0, 49.0, 261.0, 0.0, 50.0, 263.0, 0.0, 50.0, 264.0, 0.0, 51.0, 266.0, 0.0, 53.0, 267.0, 0.0, 54.0, 268.0, 0.0, 55.0, 270.0, 0.0, 56.0, 270.0, 0.0, 56.0, 271.0, 0.0, 57.0, 271.0, 0.0, 58.0, 271.0, 0.0, 59.0, 272.0, 0.0, 61.0, 272.0, 0.0, 62.0, 272.0, 0.0, 62.0, 273.0, 0.0, 63.0, 273.0, 0.0, 64.0, 273.0, 0.0, 65.0, 273.0, 0.0, 66.0, 273.0, 0.0, 67.0, 273.0, 0.0, 69.0, 273.0, 0.0, 69.0, 272.0, 0.0, 71.0, 271.0, 0.0, 72.0, 270.0, 0.0, 73.0, 269.0, 0.0, 73.0, 268.0, 0.0, 73.0, 267.0, 0.0, 74.0, 267.0, 0.0, 75.0, 266.0, 0.0, 75.0, 265.0, 0.0, 76.0, 265.0, 0.0, 77.0, 263.0, 0.0, 77.0, 261.0, 0.0, 78.0, 261.0, 0.0, 78.0, 259.0, 0.0, 78.0, 258.0, 0.0, 79.0, 257.0, 0.0, 79.0, 256.0, 0.0, 80.0, 256.0, 0.0, 80.0, 255.0, 0.0, 80.0, 254.0, 0.0, 80.0, 253.0, 0.0, 80.0, 252.0, 0.0, 80.0, 251.0, 0.0, 80.0, 250.0, 0.0, 79.0, 248.0, 0.0, 77.0, 247.0, 0.0, 77.0, 246.0, 0.0, 77.0, 245.0, 0.0, 77.0, 244.0, 0.0, 75.0, 244.0, 0.0, 75.0, 243.0, 0.0, 74.0, 242.0, 0.0, 73.0, 242.0, 0.0, 72.0, 241.0, 0.0, 71.0, 240.0, 0.0, 71.0, 239.0, 0.0, 70.0, 239.0, 0.0, 69.0, 239.0, 0.0, 68.0, 239.0, 0.0, 66.0, 239.0, 0.0, 64.0, 239.0, 0.0, 63.0, 239.0, 0.0, 64.0, 242.0, 0.0)); @333 = CsaImageOverlay(0, (), (), '', 0, 0, 0, $, (), (), (), (), (), (#332), 0, 0, (), '', '', (), '', (), 0, 0, $, 0, 0.0, 0.0, (), '', 0, 0, 'CAP_3D_MEANING', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, ); @332 = CsaGraphicPrimGroup(0, 0, 0, 0, 0.0, 0, #329, 1, 1, 0, 0, $, #333, $, $, $, (#330)); @335 = CsaUVString(0, (67, 111, 110, 116, 111, 117, 114, 77, 97, 110, 105, 112, 49, 54, 56, 49, 55, 100, 101, 48, 45, 97, 50, 48, 102, 45, 52, 50, 102, 99, 45, 97, 102, 102, 49, 45, 48, 55, 99, 49, 99, 51, 54, 48, 57, 102, 56, 102, 0)); @336 = CsaGraphicFrameApplContainer(0, (), 0); @334 = CsaGraVVIDictionary(0, (#335), (#336), (-1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), (-1)); @330 = CsaGraphicPolygon(0, 0, 0, 0, 0.0, 0, #331, 0, 1, 0, 0, #332, $, #334, $, $, 0, 63.0, 256.0, 0.0, 0, 0, 0, 0, 0, 65535, 1.0, 0.0, 1.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 0, 65535, 0.0, 0.0, 0.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 1, 0, '', 1, 0, 0, 0, 65535, 1.0, 1.0, 1.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 0, 65535, 0.0, 0.0, 0.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 2, $, $, 1); @337 = CsaGraDoubleVec3DArray(0, ()); @339 = CsaGraDoubleVec3DArray(0, (0.84375, 0.84375, 0.0)); @341 = CsaImageOverlay(0, (), (), '', 0, 0, 0, $, (), (), (), (), (), (#340), 0, 0, (), '', '', (), '', (), 0, 0, $, 0, 0.0, 0.0, (), '', 0, 0, 'CAP_3D_MEANING', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, ); @343 = CsaGraDoubleVec3DArray(0, (0.90234375, 0.29296875, 0.0)); @345 = CsaUVString(0, (68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 77, 97, 110, 105, 112, 35, 51, 95, 48, 98, 51, 57, 97, 54, 98, 53, 51, 45, 56, 53, 97, 50, 45, 52, 54, 102, 48, 45, 56, 99, 49, 52, 45, 97, 55, 102, 48, 51, 99, 100, 48, 53, 51, 56, 99, 0)); @346 = CsaGraphicFrameApplContainer(0, (), 0); @344 = CsaGraVVIDictionary(0, (#345), (#346), (-1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), (-1)); @342 = CsaGraphicText(0, 0, 0, 0, 0.0, 0, #343, 4, 1, 1, 1, #340, $, #344, $, $, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 65535, 1.0, 1.0, 1.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 0, 65535, 0.0, 0.0, 0.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, (84, 114, 97, 0), 1, -1, 0, 100, -16, 0, 0, 0, 400, 0, 0, 0, 0, 3, 2, 1, 34, 77, 77, 105, 110, 99, 104, 111, 32, 102, 111, 114, 32, 83, 105, 101, 109, 101, 110, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2); @340 = CsaGraphicPrimGroup(0, 0, 0, 0, 0.0, 0, #337, 1, 1, 0, 0, $, #341, $, $, $, (#338, #342)); @348 = CsaUVString(0, (79, 114, 105, 101, 110, 116, 73, 110, 100, 105, 35, 51, 95, 48, 56, 54, 97, 100, 54, 52, 102, 50, 45, 50, 56, 49, 55, 45, 52, 102, 102, 50, 45, 57, 56, 52, 100, 45, 55, 49, 49, 101, 54, 55, 99, 52, 48, 53, 56, 57, 0)); @349 = CsaGraphicFrameApplContainer(0, (), 0); @347 = CsaGraVVIDictionary(0, (#348), (#349), (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1), (-1)); @338 = CsaGraphicCube(0, 0, 0, 0, 0.0, 0, #339, 4, 1, 0, 0, #340, $, #347, $, $, 0, 0.84375, 0.84375, 0.0, 0, 0, 0, 0, 0, 65535, 1.0, 1.0, 0.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 0, 65535, 0.0, 0.0, 0.0, 0.0, 0, 0.29899999999999999, 0.58699999999999997, 0.114, 1, 0, '', 1, 0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.05859375); ENDSEC; ENDSTEP; 923LOA42`LOMRT oberes Abdomen2@LT Precision V @uSQRJ@LOMRT oberes Abdomen@ SH8000000000330109@SH8000000000330109@UI81.3.12.2.1107.5.2.30.25641.30000005113013220781200000002SQ(US(CSPALETTE COLOR (US@(US@(US(US(US(US(US(US(US(OW  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(OW  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(OW  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~OW  '  4BEGC  $+ ! )"%?IEA6. 7V\:MTF'*VW&' 3 %3ED88PK. %FYI:9/31:%)1I%-$$*A;`Po.J A4.,?%" F   :B?1!&'"MHK..#ljR$S0 >N,'#%)&  * "4+! = $pVAk-P 9GC)%&**& ,(-" 8 / : /.\7ui 2%GR&(EMC2*#;<4& ' ,4##)(+ m8(65t(W' +7&rn{rtfYTRM1-*N/YnN!')":X?i'*=@M\.f $E8Ortuy}dWG5!:}lyyzxotQNU!;>*Hv]%L QJ9Ruwr}yWBBUamX!CyQfX5_gywrlbda6m= =">PAh$P0 %F4$ffjnr}i9@<6RLGWxfr9-::iNUaS<+%;GԎJ8ebW HPM$pim`ksrz^M9-=RQJ(Xgs{x-J!Ml?H-('o;lKK3 8JA"sxrwpruswmiWE7,!"eN?3=D,Zyx%t>P*2j%9qH<8  R[O_zr{~{sbL*$%@? 5PR94nE_E-!\(J-gĔJPLD= ?d ^NF% {yfH'&('*G0 (==548EE2B)QCT4$n;UxTN= 'd\  aSD$*C_C($%&*,/QSx624.(0=87'/Bc9XN$|Dn¤}KYA `S R dBX#&$(%*%.205J˵=A8=*=8(92$,Ajg*)ze٤fWo>EH '\U S QZ^3--*"(-0,+?Ż<'K=?@B?N=M.*fI@`lGFzTWE gZ E >^Y(3--+12-15~z3'&2HCA76EF@/C(,Κ=.\AANg:D )n F o\s0-*)--2;4B37,+:1)*%0tbƻu8Q~xAS\XUP ^Q H -vQY0.,.//:/ɶ8E6$G(#:$7Σz&;dc\KUcNC> .-  ?\Rd..30:K=˨qD6=a(D2#.WBE?ěl5ANLP8O:! Yt BhIE?+48R sZA2I$   'P8GB.,Η[%3>W4IS. 'ej 2^\Z<2?  K;NGY - >* &<95??G"*,2;:THWGA/ #s N^hLQ@A+U?WRUS3=D3.>:;998?"%+11-6SFBZT' / .N}t[bkW8AA6Km[7R\RUWIW,48:>;<>:<QOB?:( 2X9%#8n{IGCfcbcid\X (:$ =;=8B?>>FH&,PG8;QG$ /@9,/5@?78?&0! .#&'6=83- `US,`US`IS1 `"LOSiemens MedCom Object Graphics`@CSG `PSS`QUS`US`US`0OWF@D@DD@DDX/8@0 @@@@@@@0 @@`@ p x @ @ @ OW`n                                                                                                                                                                                                                                                                                                                                                                                          !$'*,-/001/-,*$                          !!!'-49:<>?AAA@@<8881,*&"        !                     &2>DJRZ_a[VRQOLGED>9;<:8::98753.'        )13567863.(#                        !&*/5>GS_begiheZQIEB@><;8689645446:<<94.)#       '3>BHW_[YWWYVQLF@:61,'"                 #*3@KT]elt{}xog^SD8/)&'**+.110+&# $-5;>>>>81-'       !#(,.+##'()2<Xr|}|~{tplf_XQH>4+$                    !""&+3:@FLUajptwy{zyqg]TJ?2)"#$#',/1/.../0344423554441.-*'$     !&,2332036>FMRVYZUMMTY_jv}z~}z{}}wne]TKC?94231-,+(%                 #).5<FQ]fkotzzulcWJC;2)!! #(.4:?CGIG?6+$!(07?GMNKC8) !    #1:BJQSRQPZclw}okrtv}{splggidZQH9*                 "(1>LSWZ\bglopqtvvusojfb^YUQTUQNLOV\`dgeb`^[WOHA<:8:963/.,-//17=CGGD?80&$(-16=HTbikqz|zws|}{x}}kmkbYQOTVV^i}ypf[PFA<5/,%                  %%$ "+6DTfz~|zwrnlmib\WSPONPQW_lxz}gP;+#$1<CFFB=6-%!%1<FPXXQB/"  ! $,7AJS_m}ylc_`foyrTC67641/03319D^zyobS@-               "%(*,/4;DMV]cmwwrj`ZUQMNPVWTSSW]afpyzk^RG;41378876677769AFJHB=9:=6/-,--(%#!%*/48<BHMR[behmt|~wkiljfa\_aWONKEA?=;@HPYXVMD:24430.03547<IW^dlwsfXND;2(                &'&'',09BNZdlrsmnoh\O@80,*06AGJNT_mw wV8'&1:BGLKH>2'#)3AKTX\ag\SNJGC92/)! !"! $+6BNXajrrsy~zwutupaQ@85/*&$"!!###!!".95356530258985789:AK]n|xeR;#               &-28=BBCEIT]bb]TF@;84/*))-3>JYfr|   pYK>6//16;83/-.29BMZh`URQOMMLHGEB;8876542247;?EKOV_gmmifbZRSSIAABEHLIC=83/-,& ,;DEGGGHFD@=FNOQPPOMJGDBB?<?ACDDFLT]ccccbbdhjloqxjZJB:*                   !%+18@IPWSPMNW\[UG7% &-8DTdv  uV@,&#+23233115<EWl\FHKKJLNPRSRNLKIEDDHMRWY\cimrx{|tj`TG:73%'7?BA=<;<<5/+*9Kcsuz|uoinruwutsroia\YUQTVVUOJFDHIFEEEFJNTZWTjyuu~xl^F0!                "(1<IPTVYVTKDEHKJA7-$#2AO[fq}  qbSH=1(%%)3C@2:IHD<530//136<FKNH?@CGLQUQNLKKJHFDEIMPMKHE=62-&#$)4AP]ilnz}sib^YVSOKHHJMPKFXf_^dmwu[F7*                   "',19FSadc_\VPE=?A?9.&""&+/AVi|  lS:& $2E<!#.;G;/*%#!"#%.<DIB89<AFMQKE@<;7/+',7AKLMJIIHEA943<Me$/41029BCA=8/$  }ysi`WSPNMF@NXQNRYdmw}v]H7+               %0;GQ\fklaQHADIFD>81,-2<GSbr      \<,#&*,$(>VRLE?<:8641--///,(/7?GGINSVWSOJJLID9-*)6CP\fy "#.8DJC;5/(*2>LRURND9*!%/7:83,#!!|peYRLTYSPQU]dkoruy{eSC2                $+9FS_horngWE<6=EDD>835BPbr"$  X@386,$ $8OSTNJJIFDB8("#(/*"+4=FFIOUY\^]\\_ZTKABFYl):FTa_ZZYVPD6&$3BJPMHA<3,.2<BB>7.%%(%" }sjjia[VUX\afklmoquythU>+             #.AR^iptqi\QGC@ADDD>;?DP_u|{{z ~aT`_SG<1%%'2<=>DHIKNE1)+2<81;EMRIB<869AJS_mz2JZ^\ZXJ<0#   % "$%%$'% &07;6' te[VUZcoqpnlrxvxqT6#              #)1?NaptvtpfYJ@8:>AFEEDEO[m|xqmoquvv{   xseTD5=DA@@?@AE?1+-3;<;FR[b\XTRSYdp~&'*/=T`b\TD3  #4AFB=81*ykbagrspnmu~xuzvYB.#                  *8J]m|znaUI@<99;=<;AHUcp|wqlrwsqomklrxzxvvv  yqj\M=0)&'((()+-5?M[hu~+6AJNIFGKSOB7.&5:90%    +7AINTUVH:*urusoqu~z{ztpmup^?$                 &.6=L^n~{hXMD<7568=DFIQ[m}tssy|{zyz~}umjhmt   {h\SNJGGJQZm(5<CMRKFC?>1  4FQW\cc^N;+ %4AJS]igd[PB/|z}~|tnhimzaB/                  "(5J\j{o[G88887446ANZenw{~qea_bgw&$/46 ~z (-(+86% $$'5>:4-$ 8b{pVI=()27I\kyyywoYD2~~~{qeW\hrzmP5!             &.9CM_wqaP@4,059<?CHT`lw~rhhjpv!$ $-(!%045,!!!/+)1611;;/% ""%)%"*/( $Jj{hSJA&   "&)(8JYhpvxwmd]TK4ucaeffzlXA,                    &')2>Vl~oYE2-(%&.6<DOXblv~unt}#%',0'  $+((074."! "(-.*" '146.%$ $0=Sdowyvog^RE@: &040152+&(4?KXcgjmqx{cG+ ~|sn`P_r~iN)                       $.>N_pnWH:0'''+2>IR[fox~{y~ #%%        $.851' 2>K[eec_]]WNJG:*~*7CNSQPNG;99BMLLT[XVZ_fo{zqcSD6weccmv|kJ0                       $+/6Xy{Y?% #&+5BQ_kv   |M7.,+8H^s$7=>,):HVdh\OEDLIADL4v} 2DQ^jpqnh]NQZdoaSUUJACFKT`jrttzp\0smq|lXZ^rpQ*                     !$3D\tnZI8-#$'1;FPZenw~~wrnjfz!    vg[USV]gdE+3=>?BFKQVas$3Kbu}m_SS]``bdD":HTX\^]WQKS_n~wolhb\YVTSTW[^am|fJ)zuw~oidkrz~{lO6                      &+,C_tR7"&-4DUgw wmbVK@Uiz}|$$#" qK4# %44$G[3CVI;*)8ER_mz -Mk~nabnw~~yR$ +9# 0?IFFJJEFISat{{ypg_UMHGIM^prU)sgipylfcistU+                    &1Gb|w^H8+!",8EP\n r`N<62EXl||   xVB/"$% ?s{hH,!!-;=9H\YT^fdgy "/F]szdTIKXfvm]<x}*+=GAAIMMQWYZfuy{vt|zytlbYURcu}znU8vioz|}}{rkkmw~sU;"                    +8DhybL4%#$(3CTfu qYD.-/?Qfw~  j`XUQLF;Ccx[K9%4WT+#!# )2;5':UB+..$!3If~ &2AQbfL:02@QgX?"mv3(<H@BNV[ahcZ_eimkm}iR;DOdw|}ufJ-oklpt~{rmjlx{[5!                    !.DaxdQD8,(-<Tgy   teX\cmxytxs^TJ@6/)&)6DTRIP^fnjeSC>6) .Zp\OUVQLG>238Y^79956BNW\]gw)8@JXW8!):+wen.EUU]p}ztfY^eumMD>N\[XQG:.# }lrvsrtsmrxX=#                    %0FgeL>2/-/6E^       sfZSVSGAAKYfrk_VL>1' ##.:;:3-00*$ 2]}~ufR9=MtyLHC@@IMJD9>Nk#6>HWW7  |uooldi|dh|/G[anjR^iqy|]I8BIB9.&!"'#xurqrwwln{tX:&                    #2PvlND<4.3:Ka} vngbZRQSRPTVI>98>?65:FWj~|xndVKF?3+&!%'$ !"!3N[f}lhhybL;/6<EF@==Ne9Ro|gR<-#(4.#|w||unic]h~ 6KUdym}j\OQO=(}rqojmvq_A!                (4Mz]E02522?Pm  !v[K>6,"#'*-5;2+*+3624:HZrrj_N@2% "/>9/Kj}w]E337ADB<4:G^xBj|raO<APPLzbWYev %8DQcqyylgb^V@$ zpijpv}|Z6#                   #(6WoS<638==BZv $$!  y\H:0$ $.77867>AADIVho^L;*$! !-7@@Aa~x|hVLD@=;9569EUhy 7ZiqrfQ\y}zAtc]\^n !)3?LZn|vof\dmibO5  ~jdkosyrU7                  /;SrJ:348?FP^~% (.0' r\I8(&.3855;>@BDP`vp_L=/' #&$!(5A8/Hcz}oaTG@?=<96:AMYl$6IH9Lpsl5~z|#*4ARdw}tjakwqj\FqmklrynL.                      )8XgJ==BA>FOj #5(&--(kN7"&+'%*-..,5BVm{m^QC3*'#!#(,# (12123DWr|tiXOLJID><<IX`gs40 #(-/138CQbmsvvutx|xwz|~umgX3 wjint~dH1                      )8MtN@@CIHFWj1:- #')%  gO:0'# %'"%((&#)6G\iuzkVF9.$!""!"$,2'!*.%!)19>AGLS[ivym[PKJMKHDAKWZ]^_aeo~x$+(2:879?IS^cehmnnrthair}zwkK2#&ropxwdJ3%                '3IhhLHILLJLOn-:8,#$$"#* m[K:2*+,+)$!(+*'"(5CS^ipwurfXE4% "#$%.7/,<E<1%#2:BSfntokilz whUG@BKPSPMPUY^\ZSRZes~vqnf_SM[j{,L_J0*&1:65:@HLKLNZimptvdVTU_dbizcL=552+  tmrzgK1                   (0;mwVHKLIJL\n-5/)#',+*'#ygYLPSNJGHOTVURWaglrwwwurkbWMBBJMLHADJS\`gx|oYH?=BGMd}wqozufWLEFOUYZZWV[`hlggqzzrjkmcZPK[jy}t|  ".@T\blvlc\X]\SNMRZlp]OFFJD9# xtuy}}fE-"                 %48CxNQRRK@DNp '*"%*/5430-'%((# }|ywuwy|x~wx}}zyxxws|}kr~oaUUYs{x|{rmntf]UONTY^bf_X]cxzy}|{od]Yiv|wdcuy "8CNbuyyogf_M81Hb|jXYghdI)yrqs\=*                  '.3W}dMSQHB=Qn!(&.7:=;951*%$~{yzzzywuvvusminrzgabu}noqtx~pf_i~qg_\ZXZ_`^af_X`j~zur|{llxypmkt} (0@MMOWXRA'(;Pl}~zW/! |tpsY=(                  !750{]VTVM;7;b~s'-9EEDB>93+# ~x}~{yxwtspmikmopfais  xkjs}fLT\ivrcVRS\ijh{r[WWZ_afjg]_d^Wdqy{~k[dkfcfs.APYR<( "?]|_/.0!  $ znrvwR7'                   +7KauPPME?;Kg1<?CF>51-'  {xwyzxwwwutqqpppsurtvnvxcchknmmquwxzk\WZ]I5?IWfy|sgWSTSSeyvqS>?DMUZ_b`Z\`\Wbkryw}{{6,#063*(*/4=F[oq@4+(  }sl|nS;)                266coVGID31>c)HQPKE4# {wtrppptwvvutuvwvtvxvtx{N<7BPW^`dkt|YA.2:DNPRWZTNIINWbc`chqwnhikmu}\LC@=/!-9FWoaODBCRc[P5"(1?JRWXXVY\ZX_d``c`PMXfwtgqny}R}X|dmx ,:;AJKJ?3;CTjS:#,/ !xdo}pP8&                     '6?GXI>:63Gq}<OK=3)   yvtrpmjpuy{yxwwx|}xxzn@8<==IRMJS^nx{wo[A1%%(2;=@IOMIB>=CJORQQPNHC><<BO[f`OHEGIC?ITbqwplhYI4%*1;CIMNQTVWURRRRU\_Z]k'QcB~yy&=HQQPLHCF[thL0/+ |ut`F3&                 $/9KalD=6-.;cq2FN?'zspmlmoomjfqz}~|{zz||y{sP9<H?3AL?6?J[ed]O?-$&.04?GIG>7249@HD@6,)%#2BGEFJQY\_hru`L</26;@CFHLQRQPMGCIQ\dir(BC+~(<LZf\P:,7Lpy\>5+ mxrV@/               !,36hgTB5-3Hr|q zvrpoopqsrponv}~ULYiym\chVGBCS\\VK=0-/37>EFGJOTSLGEGKRZTK@741&!&.7AHKVfs vhaZROQRRPMMNMLJK`r| O7} 1YekXKOXiv{{sdTH;- xnrsP:)!               *3;CAA>0,Dkust{usponpppruvwustv{{tCMs~}{fRB;HOQLE<38@HPV[]]VSXYUSTWZ_f]RG>=:/(+06<CJRd{(42(#  pfhge_WVXSPNPr7rI#9XphdghijjkjmqpmidWJ;*' phdH5(              *25SaA802Arhq~{uqoqquwzzwy{zvuux|U[zvdP;.6:9:;:8EW_fkrxy`OMMPRU[`a`VKC<<:3.14:AIR\l  t_UQy#K,$8 6Oh|{vtrnqvqjfb[SA1% "vaD4'              $1;BrVI>2,Cddw{yxwxsnnnrty}~~{|}vwx|ygg{|m]L8)('%+6>DVlppu|dIBBHNRY`^YOE?:983148=DMWan| h]X|zu| b@ 9A( Mpxuxwsv{umf_[S;*)"+zWB1#                  #+3FdH?618mqwssuwyzyvstwy{||yxwz~z|nzpr{}sh]QE<1#$:M\l|tgkp|[@87<AGNSSOIB=952/.5;?ENV_flywegjw~tq{|ss|uyZ+i7 %<4.)~pd{(FP_t{x{~|l[QC# ))oT;)             &/<]c>72C]  |xrpprvz}}|yvxz{|{zvuwz~c{}tttuk^YSI@A9",Pi{r]^aknS@???CHMQSTOHC>:645?GMSWZ]_`ly}ytrqsrjgpsos~|zwttejouvsnht^Y9#%2xj\cp5Xhlqv{seR<,<&eE2!               !$%0KaJ833h~~{wsqvxy{~|yyyxwxwtuz}tZal{zmqym^NQRF>FB%#DyiPONRSLKX^USUXX_hbYRLHECDS_imic\YXet}}r|qfccfhis~mqsonuxvy}wofc`ipbXZZXQC<=BKqn~    x~"=LV]k{|}^=$;:%wP=.#              $"#+DwxK>4AS"!~xnwlnoorz~zwutssvxwzq_QIJV[ZfzlUE7<@<:B@'#;gw_IFDGKVcszngca`gpi^YTSQKJXgx~vl_XUbrqe\TMQ^eky~vsoeajpprvrld[VQRSMGC?=6)$'*.S+;FUfxrV&wq8@7 jR:/$                $)6esSC:2]"-,|wdagtiijpuw}||{yurnlmou{~}yKMI3).8DUjT0$!,587)3\gUFB@FPl~pjilqgZZY\\NHRb}te]WcqcRch^ap{yTqygOEU^bdfd_[VNE=552' #" #'Hq 1=GkP!oYt3;<-ymG=2!          $"!!0a\E<GS#0+p[evunhnu{{xwvvtrolnqv{~yR/;=) !+;FND44865AJHB1;kjRH@EKT`zxonljd^add`NCJYq|zqbZU]f}zP=Vdfjp~ydz^A4DLJKNLFED@<3+//!"%Af~rhiqx|wz}$"#/63$ %-OrpM%nUfz*9B>&`M;+          %+(MpO@7Z !.&q_u{rrvur{zutsstttrqsuwx|~|v~I,(0&! )87-8I[le`hkeW:?sdI;99K]hu}rpjabekqkaL>CL]hoiZTRTVfw{txc9'@Wioi{syT6'59..3/()-15.(03#"%&>^t_TQH8=IPVI=?AFSs ",U:6Qdb:,Dm~[0oZ]c7HHA0}_B7+           !($ SzYEJX |xvz~{~yutsrsux{{{{zwvy{|zx+$$*/1,.64,@\rvgeaSE5;]~K4*/8Sn||xrmqw|vj]QMP]fk_HBCFHWgqwcU\esz{\VbgmrcH4-("$)&!%+2,'-0%%),@\l^TND633;D7+18CP`s  0_J08 8Xo~rY&}twl^^a.GKLH#uOA3&             "+5 1[G;Y    |{~~{xsrttqtw}wswxwx|k#.$%<D;5531LoeYK6)-5AShZ5#'7[~~tqk\VbhiU2-26:IX^]?.BQU]leXf\x{wx`F'$!"(/*&(*'$#(/3E[icZOHB5&,6-&2?S_XTR| UTGr\/|kmhbbe"EMSXB^J8.#               *)%Fz_FGW  ~}{{{{yyyywz}zx}}m%-)1MVF7,.8Mejmd\PD718?IWiV/#"/>b||yrhO,',5?FKD<*,7;Pv  _XllgthP9)!!'(%&)*,&!%)(&#$/;J[aM@=95+$+)'08BJLORm=wU%>h{a2qaae}:O]bT7\>6-!          &2%!z\@4Kw {}~zvxywx}~}~~y}q#'*/>_gQ:#(>LXI7FSG>;<DKS_nW*%-8Ei|fI'"'6FC>+$Ew|~XUb^VbqnXN?)$,/./1-(!"')($  .BOZZ4$))& !%)-0/3@LWcp[SjMLKKv:J}n;|_`du.RgkdT!upD>6*               #$"GzhJEW  y~~{~}a$'+6ImznX;<MUYE-BUMG>>NX[^`M-2CINlmkjjjt~iS>+-6@JB973$ +;brVcuq\^cgYFdcM^Z=2430141-&!$&! #,8AIqE/-(" #'+,08DUh}2h= ^UQY ?C$IzpBucTdx)Rlvq_>cG1)"               )!$zeL>O|~y}{R')-<SywUOY\\D'?URNEEV`_[TD/<TWUmyLOSSTXaznYD707DIMD:DI1 (7SwM3Fu[9?eokT9f^EjoM=;612531,&!$#&*/4:rX;2(#')-2>Rj 4 o`]mOM ZOkJWg!Oo|iXHpS0*#              HdUR]  vw{^K976>R}u`RZiR5?IIMaiWLILSE+4IKKfxbMOQNMU^kqlbTE5>PRQX_XO5$)?ucQQ?*TeJ8Jwv_K7cyP^\E=A9+)+.010'!&( #&(+0^vS8&"*1--6?GUh|v'K~Wa^^{9bxykaZ-ovJ/                !-| `LP`{svt`KPSJBDThJVq_GGHKTt}T;>I`S12=??\{t]VUTRJET_dioncUDL^^ZkzgR:).J63PH9cztiTE>SuQ@4]^TJ=<C9'##*1690)*)! "!#'Nze<#'07/-8?=CNk9I WXp^h{NnvmhdN2l<             KTNRk   ~}agqnWSavXCPghfjnqsmaB9Qq\B/-,Lnukgmui[H<Wlu~olqstsruxcN<3E_j91;DNxzTivrhVYjZ:1-JkuM746:2%"!+7;=93+% Hxe6".12-,6<;;;Tz1^F}[wea'[rsfSMI tc7&          ,@Z<Me p^|pitbH<I]isy~cL79\{V4-)@Zmgjxt\G;ax{{qaQB;Nau|s_A65Kg[6\zm_ZF*%&BbwG/4662-'!+8;>=9,# N d1%/-,+,5:875Ms T> Kx\'x]v@ewiMMR1 vZ6&%"         !%(RMHKk #-60&w|~K75BSZ`dhfcTE:>Xxq\OD;6g}l_qoRHHw}~xcb_L>@BERigPJLf~H(KphS='LxTA;CB<?F9')/4986-&#!$,ga-$####&+495;Hd'8?,OV25kk/Ixv]NC?<Y6)$"              %5Md?Tm )/4=D.zf:-/;KU_WPPPQL=;J_y|th\A*Ki|m|zbbju^dgR@8/(:dm^WUo|]6 ;bz\F5,%]rS@DM]^UYdS;1*.2660*' *.+3> @*r:"&#!%).5?A7?Y|M]cP18,X.6nf2auq\BEKU3&%                "*R RV^,?AA=7 ~~~jM2))5C[tU9?H]aA008FXluyuoS:AIYkxyrdhgSB6,#5esi]PazwoQ4&-PxfYMBtkQB>Qhu_E+))4<71*"!:B?IW4aI,\:(!&+6@ELWU=DgHX`V;A;vK`w~=~]6-dxRA2)A(%!                .OtHg ):H>/#"#oT?-)+=SrkGABY^=)%(1AUajjiR=<>JYqww|rgc^QE9.%4[hbR=GXYXF5+'7X{{vptcVWZ]ry\>2(4<<8-! 9EI[q!PzjS [;* $).9DQ]hdINq,13,?K}:3caFt}^B/ 8||hI'11d?(!             !!BX[e 9DH*    M6qhbbZF7++2PtqS>II3&$)39;BJMOA5=DISex|}sfYNMI?6.5JQN: #,=NST?7Tsm^ivjpv^D,39?>. +;Lk8dP-.,&T8#&.--1:TjsqZ]x53sQ,aZJ={rVN7~{KnY&,0|f.           ! *Iy~`Ll  ?:)   Z<uicfaSG<=E`sTOG<41.---2:>B@AIOFCKYnvqw~{yocWNQQG>57BGG7 "1BR_WXwtif~nfcuY@?@IK<.#!%0@k.Uz]DKH9tZFHPNMLOfwvshl{}w ,wNp?rhR<$9raG9-0"Q4!         5q>D\   @(zqv{ ).-,++*)(# X=ztyvk`UW^pv_NMIC6##*26:GU[\B.,1DKGKTdxy}yvrh_ZVYZQG<9=BG>.)'-4KaokI>CichtpZQLV[PD6,"$,d7XgoZO\W:vx|~~wsupuz~yqnmf^}fi Gbr_dQyJ0>3LfxN*9: ~S(!           &?ilPHj    #&05:?CB@=;8771(!L3zvma\ZrtflwzjXOJJLU_a]<%$'1427ARgpw`JV``eu|trvvsmd\TX]afouogZQKIJFA@B@?YrqP55Ks~~}~|sfWD.'(Z8HRE?E6 zmn~|m`Shhn z;wl~reIRQG(>zbKE;(I2            .kl/9f zz*;CGLQQRTUVTOKGFF?5,$ >' ]?#6PwkfefgcY7#%$#")5H^b`>(204EPS\jmi\K=0D[jxo]SNOU[cZQmzS8&6^"+)|a>.)O(2-'#jbwbNS\|z|t{^8fV{=mcivO pvwR6@5sG             9^[Oq':HU\`bbgliedcb`ZVSPME;0&!  )C' gC)8Uqyvqmif]9 $%$*7GYepgY:$-.16:?Qn{}hJ?8FWizp]MJNXdkrol|~sh[M=*AwnT9W(00&{vvz~jmd\hvznnR/e:4ukr Xuuut@UfKG>+m9'              #ZVOz  ~Gcw~zxspnkea`[SJ@4("   6K)- |}}{tL#"%5Gjrkx 4(zrjia=#%&%4QjoT9'-34+'-FsxMEEKRg{y[F9>O`rydF>=IE0M |K`&,16'oXgg`bfebsyaVT}spU5>KRXbq(wajU/zcLBR7U6                 +By<f~xtpkiibVKA7-+'$ >X>*0qjfewDHOixbTWgwhnt{{`NRTU`tjKMSeNACV{_Z\ahy{jXB?JWdggjmmiVGFK\YCSomorpu"|xxcVs}j\QHC@DHVgeA>CPm3YNhvAFcs[LO>[2#                 @f }*_zurqriYMB:3332.DbQ<80jYPPf.Qde]ZksV@:9Ba}hVh{w|eDbs\Yelkms{|xhJAFNVTOQTPLHFMXjjT[vlQMOj{G8Xktsk~~ }}kUj|QAA8+:ONJ4(UnN4*)2PCW:CjLG}hVMC9}M0             &h#& ,Uz}}zvncWJD>@AA>( 7TVT:]HH^j4~gJ6,-Cjy^M>VnunjZG~)v'tmonjbYWWbnz|mSFDCB>89;CG>;MY\^_qbH0?RU\sF1;Mfh^iyroz0D5umryocPEb|o[W^aanwlH,J]RG90-Cltn/bCQvAOacI?H7|H            (;12) A{{smaRLHJMNL1      &>MY-^A@WdxV8&$0IV^TD9-F`zuZTUQKYfo]PECEB?M\hrw|{zwkVH@8/*&&):F>=S^UYkkC)2=hoF-+=_dZ\ajtcTalrx}sSUgPVh+470&wAno$eJQ]ULDCd|pouX0?KRQB4(8_e]~!_ODQ;QgF<RQ>c,          I*6("c~yxkZSMNPSR;(" ;& S;=T~pEhM?CHOPMGB;4=GWirl\GEINT*y_8}\I9,()'%.9EOY`^[VND<6-""#)0BR^gopfiz{Z<%015Ld{zJ7H\qvsld\SKEPZ[_iom`HIZHPa"CYVD"aDj E{<cPFS`gr]/5;BB3("9fuw'-">`B^ #ODAINQ6 z[0            %j31 ~'h~saYSTUZZH96571#P8tgojK;@WIeg9p]SXWQJCCEC@:7<Hwp^WK>=BLX{1E@~]P@0(# %,4;DJGB<7533.$&*2<IWn~uvxbH5%,678;Hr~NAdv|~~sfYLIGPVSUacYM@H]WdxIltK^>#Ly8uv5mCYswLGFMK5)$<h~*:6&pGESU)8?9CWP9 rK        ;_  /{ufa]]]bd[SQPQH5'QG6  mSF>GLHHOd7EQ]F+eca\UMIGMTTSD627hhWOJFECIR[g#p]HB?FLIEC@:50-+2ADBCCKTOMar}~tS@30/4:HR>:dtOO{{rkhfnxsponjhofG;?Y >qG\A'7M Ip\L5fpZ@7C^z$*%!VxDLwT,'CRY;s:           %T |'oynmlllprniebaVC83DF?$  lRLE>:<AJT_t4`}Cwbih[QKKMSYZ\OB>Com[QLJJJOWVWupaSJA=83<P\cfegiXJS]m{|P9-19=ANW@7^pX[~zkkm~xqpbDCZ)<Ig`yP=+)/XER?AQi#cqOBEUn9cY&` -IdZF `/              !3k|  {'t{}yqjd[LGI=,&15.+.(  +*uX>SfgdUMUarf>uhniSLOQTRNRWZ^eqn^RINV_gq|*23>SSF&|oi_TVcuydPD>L`xU79DFHEA>Dcukgh{~||l`WSk#Y`jy9z81,%"1P%AkdGouTCAKXgw QhG2VbfDF             0T~s gzspkdbeb_TGB=+'-/264,.2( %36*sdY}`\dz#zxq`[^[VNDGMe~xbHM\p?_ye]\^`>whSBAOxhGJWetmflvuytbWXk=~#}fQ:(&7t #CugmM7` dHABKOQi~voFJd)8Vtk\g4              C  j{rcS;(&&)-5:?CF;,/455+$%)46/ yb`yA  \~|zwiTF:;?pxHI] >ZeyrJ$xaHFhr[cs}xycTSctmhB  g d=4;j8UpjJ1VpA/<HSPGazl$}6'bsg ;rC\-            .\t MpWLA74:CNPME;CLKI:,#"" M?!e^t}|* zhUOLS[ "obd\jE/41#~szzm %0~lqti^WTZqwbRJEF|0bPPxKz,3vZ;X{SDOSTK>XzreEX0j+xNvtEB           2Uxb(AnPADM\YMJJUa^XB- %Qv\4h[mn`7j<bsraX`n~ @B;! o5    mvzyjQ2|{}4*$5EWdi\;cP==?MZfw^SJD4#K#>um> 3LsM^  qmbPC8Nmh`y Y}4Td"v|Z$['            <v} r nXSV_WHGKR[VO4Fd|_8hkbOszZhssv~~gn(E]]S3")-0A    gF7,&9G6+CYluld\A  kWSShz]MVPF8(@{pv?D)Y]itzsP[z!+sthRE;Nifay`f$4jqOk~#waJ"            Ct# 6 j%0% se_^SABGJMG= \lxZ8yjW@LiziFTbcaWViphaZ'/CXkyvhB/=JW]`.G~sk\M! 38  4e]O7&Fctx`ZlT |wKGc^MD:|1   \l-qg*c{.=NglNUi2&htlVIARhge}% 1=8pt `aCat1              "/Yu *S%35$$*%qbZWNA>=711,%igClN>G^gn\G`whZTS`ijy;Yen|]BCNcxn@3-]W/3;KSKC<3*4EdxeQAZowoC:]LgZ^UGQ^k +%  ij,XK`z08AQzWR^  yf__VGYssq( qa#EZ,dU65             /Orz'+:<4(82" }l\SOJC:1#7uZnE=G[`a[UtnTTUZcqjyUGPlxXvf]X`iuywjWbz}nbp{zd$IA   qWI>^:56! oi!5&[|977:j aPSoVNjdMb&(Hz]8Ime~yu$7              3j!u ,42,"%)* wfYNKLJE;/!$ KTqPIVnssmfvum}@njj~~zci{l&<@%O2 -<3sdwu!*dq  ]r*<JMt{edi |IVq}  -aESMgxmL            9#m%,/*&'*.' tec^QGACIJG<."#033! (_Ks\Ue}vx{ Btpq|u*1@@,>Y"(1TkX/Z  [}'   ]j@[_} O7{`IjEI`wLu\x(mbhE? +           ,RL#*//163*hkkYMTVOIFGKJHA93,<KKJ@80%+Jnz/vljw}yx%R}B&<JRD)Zm)09]t]4X `]%  !No(DY^r,7~  :7Gc Qh R{VqxizZoDC>4F        $Cj!*  %#+158;3}iUDKO@8ELKJJJKIHFDCASa_]\WH<1#4On|a}|}~wv:yW;IUbV<lw.8Df|a< T g)/  +'<s4IX]fv,7  3,8Y{-X0Iy};vibcs{fgzd)          )Z52 X.7<8/  {bQB:49=405;BGJHDFKNPOL[gcbmmXORMBGTssf\kqZ2wplny-vcK]eeT:X_+AWqgJ% D n= Y2pCPZ[YRs+3* # q:>Qr Edsna/GdZxfVKwsrfpF          0p@4  }.~ #9??/mQ<.!#%),(%$'3<B@:?JRYXT^ebcw{b[hmikphA!:NRC uh]jZusyyi^T\fsnc]wm[oumX=H^I0Om~nXD::BOI8!3r wa>;$4ckR[b_T;M0B<06</"hN\t  MaoG+{cLVnxi_K<Os5{bZa!         !>;' m-A>2~bF6- (*)4DP\YTTTU[rzaZhtr?(<KJ+iRn ufD<DYl|}thR6$!-8CLWhsulUCXnum~}iN>3:DiwfX\u|gI3 ` |rt%2 ?faaoxq`@H{"/7=( xy} ")& 5@G;udUwh0jNGAKbe}X*|%          1T*1 ( : !4A1aM:( %7GWXVOHLSjs^XaqL&1=@0u\)}I('>Rdvvmgg_K:) %/5=JQQ[ptT8@Lfx{xeD 9[uhgxuUC4(Qy!,  bG[pnSVz%3 qio,53"#3! C{^e^H%uGFEJXBa6!         "Kv&0   ",)a.56Y;* !3GR\OCFK\e[TR_wpI=2) Pc='%-=KWbkrysV<,$9HTWYWRIM`p~|snj~c@2(4M_,Kt{dZpk[PHD?  G#A3Yw{{{ umkk'F=0!"/rVOY;OKHLY$o-Z5       'b0.$_wy:2#[;! 3H]TKJJW`_YLPcoyiU@ qu8wz`F9>GS[_aadhr{rd=:Nbuq^[jpo`JDBP_x}qL, !s~o>\sRHr~mmga``.9u ym5ci]X{vvzwq"C5( fWOfN\UPR[bP(J         .x/$  ,|~~{z,E* c>( ;Z^_VPYckeMFKWfr~pZ tgo5yo`\gr|~zrf_X^cZL"C`zlO/% 0D[tzv~Z-VxhrvUkn?3oxw|{}U-'k Cv\JxhYQqn}%!'8'#Ksf[p`<ke^[` \Q*b        )H ( M}{zz{~#4BoH) (HYg^ZdmsiI:8CS^ie_kvtdK|ywcMGB7) -1Py {W0 *5Gbnjd]sg9 0_ji^etm^sqC6nc@eW`Z[~|ukda~v0H_nx_MN`ylvlY!kkkfiUe3y      Cn) Shuy}{xwxy|7:7P2-Miefs{zhC/(1AKU@(C\kf'IkmE/ 1`qm13&lA(#IKE:ZsK"(JZZZY[_vySGocCb$F[`ig\`ow~'Cyb\xwx3bmxstLm7     "]' msow~ytqppw|2#d;" 1O\iuxlT0$4;B%!<IE!&,HivK) &Kv '<<}R6"4cy}bB -H]]U\h|ng{z_C&$n ">vvw}hTXn6dsvr==4\DD<4'|yxCdp}Do8 7$   *x#" A|xlu}unkhfluw}zu{$dF).NjroV;  )-/&zV*0E_ 7E#cE) -QvyxzeE#6afXcts[B-$=>wyq|qSTj<.j-@QKg0xwSis<wo8#T4     .N# #U}xmuztmiffkx|yupt{yurpu|vF2 ;^c]?&  "#" f`: '<HWhzxT;% '7fyeJ  %O^_rqdU4+J`|s|pz{or+6Sanz`Ah&Q9{sr_ECz@)sC     Ew."{Df{wptwrlgegkqpjjmszsijkpv~wN* (OQI(   xgSiM2-'2CFIM_{xa[uoq]@-1FVqF# :Sgwvpoj;0Um~nntsyyifx!gt-\`JFO-Ej~o`j{#LJ/R   b3}\qxtnsxsonorspnkmquxrkpuuw|cD(@IF(! ~l_WWZ ObM;AA* 0JPNU\C&$()$&-! &8 ~$LlJ&+?Uu~sv}oyU%-Ii-m^eut~qod/o# <-c)_KlxZmK\U5]       &5!}5s|vqmsxsquz}zqmlouvvrnwzw{}{~xR<'1BD*' ~S9,,:P{'?O KZLAPW7 %w*@pC),CfbP[jkq4,>p5|_P_xt}|G_L|? 4y=+PrVpo4.k`:i  3X(+ /Qtpmpspp{wsqsxxvwy}}~ rM=+ ,CJ4%%/) }U8/6HaDc#=}uR:$18{b_`ky!VhH-*3Kfu~zm]A4CWs[GGt  [{g\ut,)CUC+w<&.X -[gou`Dq{f@s   R' '5u;jtommnnp~xuv{zw|kI<.*BL<,(40&" [>7DXq Bn50ZdG' mSOKLTlxw{|!I^6'%3DaypT9&.Fgy`Rc|Ixsxacb " ] :lo9Fyokw8%Xut{mE $u" Xywrnkikow{tv~}zfE9- 0;@7,!--+'"  r[Vam| L0.Kz|zfK;,tpq{{pnrmddgx+jyS*"(.Jid^?%+?`~qmhcqL `59b#/.9{vToP-B_tzrH , )? (%5rztojgkpqv|tw}aC8/& 5320)#)-*''$ snv{6/+2Fyiul_VP6 ~mfh`TRR\hr~ma< 9TQM3  !'7Xvu~Yluhr N 7[1-N_kz()`}Gid3($>UdsqFF-   By# )[}}yromprlm~}wz{_E<454/"8*"#!  '+0(~vxyz~;9:E\k}v]F3#shfaYTPOPV]r~|||yurzzw^uT* %4DA?><2)".Skxp\_ku~gM,Lpz PFKX;8>M]6cVjoU48O_rve;-j?    _  ~ Ox}~|vtruull{~z|}}yaJC<@A9) !6" !+6(~}{}HCCYsrx^?"~pg`ZSNGAACS`bcfkqoglvuqlhq9R>! ,6A??Q[B-+WmrcH@?AC!3mwQ !) RM;%+9n  ;~{djttoA 3DVlygU,9O    .-j{yxxxuuz}}}~~|~zy~~hSNIGC8($,   )7'0aMEmwQ*]ux l_TPMF>61=FHKR^prjmuxzxwld7DPORo|M*/fi:'"&m ,! nN  <Y7Y.#\Jcog[o}O+-4IagR? <\  /U"~Jz|zyy{{|~}zyz~}z~qmt}oZUOF>5'%%"   )3(?aQPhBjtyros~    wdTNJFA5,7?>@HWnupqtzrciy#8FRXaO'(Dq/$4 0w"3%  jH!]`nEt!>. AkbQi|X:0.=Svw[G69i  F}!bzvux|yuuwzzx{}rlq{uaYP@2.$+" &---,***(6@IPeiL;0\]_fiedkrxyy91+-+ oZOGGI=5AIBAGUlwyxt{zmj)2=IZmG$<hz%+OvV4R &/" k?}[Yk f5j FkoJZ[Tbn\K<22CkpTD7 0u  $g 9s|zvsqvzy|uqrsrsswy{|ysvvbWL<11(0$ %58457,'+  A82Y}A`TMX_bemswup}+5>?=6*n]OQUIAOWNIIShtyxsx #!?`u{E/\p *QcLt  o1sLOl Cl^0d}S Q^begZOC91=cjUI@!  %@  Oxsuqonsvmoqmpmhjnqty{}s`QE;5:14* /BF@6:C. (  4B*fW|^HT^ioru{woot(CFJPL9t^_bWP^f^VNQcoutqsvvw"E_lGC[Awm t qJXs2qB[YwO#LfvneVKGA7>]dYRL+9 8p#   "`vsw~~trqssggsnpj`djosx||~o_QFEDG=!  82* DRJ>/5B- ;?9,&kcv\bhornnsqkgeq+?T[K7xpka[bhgbSSckmmmoqon} !0QfRXyJ/Wxfg~rv]wR}o ;kR<VpuhRA?>>G\b\TJ,Q4! O '#Enwv||zyxwvtocavvrqfY_gnty}||{{~wk^SJRVUJ1 &;;7*! 1V\J8%-=,  OC.3<lxbKMqRxwvuqgdgge`[^dt+QdYL;(qjecdonYUdgdejkmkgt(BIG:/#Gd_mU;DlmZezn }yiJ,<Xu:_ cX#$ d{{nN526FS^a`SB(cP, .p%  !_x~}|ty}ysqv}sprj`cgpx{~{xuxukaZT\^YN<'':>?81/7IME6#+;1#! "$WE*8FPP* 9{{eL$poookb]\]__`bfkr.MWWN?-pkfdeswiemnlgaekpu|DhmleT<*F\\jLC^snjpls:`kL<P.$6"_z|nS<12FV^cdU=Zn9 !E#&Bw}o{yv}nmspjihr|~|ulnzsleb`ee[PG8% &7@GEB=:7:?5"*9710.'%231]G(=N. _qQ2}lfbcdfd\VRTY`hkmhes1Qa_UE&mjgegwzwxwvjX]hx[|W  ;HRVb~{GOywfgjqfg{j wXE-Q>Vv}mZF3.EW_eiW8MF -l'S}w~wikvwtplw{pq}voh_XZYQH?70  #9@FJI@6*/?:)3DC@ABADTO!+[B .9;qX5YUSLHLS^c_[WY^bgjmkhkq&GWUG*zpgjnx}b_axYj,7QLHIRjx{pZgsMNVygyh4 c}NXLu(9q{iWD;HNKRbZB 9O;$+ ~<c~~qejx}~wp{uu|}xqj\PNLFA748.  ;@FNOB2&?>/;NOMPTYasi%%X=&uzY9|skL)3>608CWcb_[]bcehlljc^bl*MTH- vhntxmb\xV|8(V`gQ@=BWbcfno48Eizd! ~N OpDi  OmyhTHKE5=Z[K+%W!&[$$ wLixps}}y~ynbP@???:-)/'   'EA@GH;/&,;9/;NQRG@Rck[$F/ /-*'No>wupkZGR\PGDFS]`a`_]ZWXZVQMKMRb,DF7! ssrpy}hq}HHFrtt]JBC[e_hh%1IoJ  ~K LuzJd:E goZNTF;EA"f#>} #"}{s[o~~}~yk[F43374% &!   .L@9@A4,,/64.:KQV?.Lc^J $2 ":HSIHVuW7vpnopqolhcoyk_SLQX`dd_YRLKKD<<=>?@R 4C@4#vmhp}rj: ^8_jVGF`j^k`(JkfvS+{GJzwS)dq4av]P[H /6v''d&~~x%`wwz|}xx}{hUG92.1/% 4G7.79,'*+**+2<HU:%DX=$$!+PVV@14@YgiheR:" }|xor|wqsvn`YZfibZRMJIH?5;AIMGOq >C>/s_\gr*:/ 94Fg~iUPnxioPAmXb, ?MhIx- LSu|zSB]S $ 5  3*  ~~6f~{nrv}|}vswiSLB5*+*% # $.8>.%03&!&% "(-0AT;(FU)  -+XVM,   vblu}|mpyrlt~zhbon`VPNMLJA8CMW[PQf 3??5)qTR_KC'_OSmx_Wvpoz~}>3zwWaxQ >I{b<nh-,I`XTrK3[['    E' B 1 "Ko}}ylpu~~~xtszt][U?,&"$  83,# &63/% .1! (+,?TLF^e6.9=/ =2#rgujah`PNP\kz|r_XY]`]XVVbmlg]]q&+,+rPLW} jCL>o]q}aWs|kbbcf+buUGTamD N4fkH ! OG636mG&N]I04 W0 +[%6)@]x~zptx~~zvqxihbH0#$!!#7PC4'  &8-#+-(,-@TX]iiD2FQP8  qhuxnhu`NLB35<L^q_^fmsnhkp{yodct%/!|VKQt6P-GG1drz]Rho`VQQT!NP((H1  _%Lk{p M 4hJ #,mD>U\I!(K3i9 $H !.96!~Sl}}|{{xtzxqfO8&#!&06EVH9-## $0& $*()16EU^f`ZUS\R0~gzwsyo][_jwvsjceiohK92-(-5G[wgcjw{|nb_k#6,kRMi+F./<*gp~iQESVLHKKJ&>T" 3lfr4Kf|rzmFvu'C[sS+4AtA'=YP*7aH{B *i -23  :$ cw~zywvut|tdTB1&($-8@HQF:/'($$+#!$$ )04ANSU<,CSV;rYPIYm~nd^]VMUdo|~rga`heRD;=EOZo mbitwj`\cy(<4(`Par#@[8l %iipvzhWC69<=FURF.9x]. AtKz-6D^s~{ukxjdBp{3ZfkM*6Em}7  DD&8dP(L$ 1:1#11(3qzvurmmq}s]WNA73+ $19@AA;5.(,+   !%($"" ')(3?7+06 eJ:015?JbzzcWWURON_wujfqwuphs*.+ o`aq{xojd]Z^u $4A9/ sY]gz3VtW3(i]UXYPD2$4OmeI9/>mkK8Gt3|0OQVan||zvplnfIC8OUN7+:Wb'%+UJ/X+! BD+ &E;*  *8ytrnjmutZZWOG=4)+38;851,)&()(#"$"&++*"  )  }D0('*.7AYqycXTY`inq355# bemx}||}zwwwmefghmy,>FJB9fagy OzlW@nVACEEA, .Rvg<21,'C_ol+&)Ckrwtxvpqplo}YCJJ3;52D DG@h6$  /[ )M"/L9" Rxrnlkq|wZ\]\VH=64542/,'!!! #.3-)'!(033"    iuE3/320:FaycOV\ex-Bg{Y%h`u{tqoicgmhdho|"KY]ZUNF&tkn}6s{|(}wwvS138CF+*St\&#0>GQn|/@mmd`764%QshechlmyFLVX" % 2FV5 yD'  #$ E|0I -@(gztmmq| a`_`\OF@<83/+("# 073 ('#+4;<(!(("d~|bWUNEQ_vzv*blm@=gGpnr}ursvqkqx{@dxneA}sux Lh?6|\;:;MU62G167:Lb&/obRGXR9N}|{vog_cfjpy2[UL+*4* !+JgN+U.$((# !!]%3@ &-")y|vmozkd`b_TNJD;4.*& ' /85$%&.7AE1 !*21(qyqco%D\e(.Nxl qkwoqzMt`3{{uIwR*DiPID\gF$ ! %1]}j+EcuW%"(ppa* LDrpmlf^^]hoovlP7207<;*  /(OweIg7!%'&"!$"# y '*)#$)~+}~yop{znfge]XSJ>72-("'1+*35-',/37?D:1&#-46.?\]55V}W% -F[oKBke!~#PK@gsd^ZioU74BSjf0y2hrJA>!Y/ I=fyrjns|pF!(,**(((0<5+(#-*Bjh_&vB$!#!#%%# ''""$+ $(!1|*|qqzynnlgb[PB;60*&!/;9871# ,4:96;@CC4/;>9( &m b> (84*<d"*/+% O#@S,h|wusuucL( "Afw|<2AdTEA<M. B6Zw{$r; #GB5AIS]io@!@C 1VfsJL*!&()$#!$%#"!&@ 33+("/.~~}trw}xqg[NC:751,6?=<:1 ,=BD>777BH>:>7# +?0q@82'  &Ip ->HOPP9<5I1tpw}kQ'(7DQNFQbzmhaXVSI0}P) -0Ti2zF")">DDUhmm> AF   >[w^?V0""(" #%"2V3JA.$/)+ 4|}~xts}th[M??B>8=BA@>2 #9OPMC82.@LHC@- hvu ho!sV 4H=0   I}$0BWdkrxeM;r! *=T{ixsU$zto }TThkkiisl wG-'N[q AS# 'GG?Vqmd9BH% &Nyp^a7&!!!(($&! "Bu<TJ2*,!?~|{{ypaONQJBBA=9:1 /BRRMD:52;A?8*ez|jddy%flpwhN7MbR@$  +o&37DX`bnzpdZFI"$~Ksv{zT  yaa2#Dfpz|t:m*ml4Ni =oA 3Q[`kvS1% <?'0# Aiokm>&!#$!$TE\O3-'&wG~ta^^UKGC;672"$;ITRLE=95541'~esaNHHdy{+inlr~jNJLbvaK-   H$8A=FV[Yhywtrf"q{y #yvl{zuUEhW Mh}waBYzZM?ay  7`4 )B[p~@ &87 1:)4YnwyD&" !!!!!!  #j(HUF* $%t>~~ypg]TPLFA@;2,*2BJNLGD@<7' yrxpcQKJ^wzz.hj(oah|r^YWcmT<$!/ #45:HKCCHKNYheac`8:nc$u~+j^ x)%;a-0GUW[^T*u4v)R`v})Z. -AKYjV0<;269% 'Jh| L% #!()*!"#$#""$"!#3IN< " q1|~md\YUQMIEA>:>GIIE@?>:3nt{{vqmdYSNYgq|Y.nb'hT]wtga\aeH-'12+V1COLMTSIA=?DLVSMRTI%[gSg *$) xqkS{~h{;JC)<QY=!5"TAH]h xG8Yeaixk;IQ=+99# ;`{T'""'/689'&%$###&$""'&<EE1!ppohc`\\ZUOMJFEFFD<10/'hqz{vvrgeicXWYj~c=RAJBPli\VRX\; &EQC-GS[YWXTKB;;?BF?69;G9oQZ&5@/'OmfGzq/ztA%8-.8" h(P+0EnQB*MjmZf}ig^<" 89'.Sn$^-"$.9AGHJ,)(%$$$&$ )7ABA=)rdnif`Z\\UPNKFB>;8, ~cp{xvrquqbcrjXPJa|Z.ta,`.1@VUMIGKM- 1RY< &8S\b`]XRJB:8::92)(*DE>ZVDS^F9t5~d;#'|nytxqhE > 0W!6\}kB"!%6*NifI^wa76;. "Fa.g2 $"(2;DJNQT.-,(&&%#!! 3P.RB;9'xVuidaULKIB??<5/*%saqysomrm]]k`H?9Uv4Bz50!)-269<:6#6E; ((=PX^^[SLE?965441-'%=Dhsb Ah{eJo)vpO M[go b ?p"6Pl[>+(&p -IE'NqS- 5A;":U3 n5 #-9@@AACGLQ-..)&(% !!?l=YA64$  |K{v}mc[UPA3.)#!$" ukbu~wojnj\[dX@72Qt MJ#!.# +:CKRXYWNGB=63334680,AG$(|2euR90Z +iSt\ yz L'9KaxWC7-"h*)=qH(5EE)4P4u6#!,;HLID@@AHO(,-(%)& NBU?3.  BwmnptvvwyiRID;1!tjgg|riji`\\Q@84TyiX.      0OJFJOQPICA;0/479AKEANP3DPwO N'eO#/$ W|yURltv)gdpZ /?N]lwy`RG1g *v@( 6HK.4S3|5 $#" 8HMMJEA?=EN#'($"'& !$\GS?3*  ;qdbabcca\K6+#  {oeio~yleggbbfb[OBWr2f<  i/n^OGBEEA@E@229;<IXZ\caB JltNKzvs,gc0  &#W{rW' XJ?LFpgq&n(1@Tclvuk_R:!t(vD- 5GK+7T06 "##!'@OLKORWYW_h%'$ ")$j4KQA5(  %}5}xi\XTQPPG9* zpeny|rga_dfbj{sX[cBpU<)~ % vprfT)zaF3786<LJ;;BA>Oboy}vQA>nM}6urp!VJ ,' #cpX6 I$e S3{D//>]nu}}zwwj[F29}{WlP6 3DH#<U+8 !#)3FPGHWh}# "&(%!$+%s @PQA5- #) ,ysk^SKD>83&xmakxrk_WX[bfdt]]b #  ! tikukZwwqH+./0:NRJIKHCWl|{T8[oN]vg|}ZF )&WxkYA<Zef@d"04Gj{t|lYOF6#~d&Ag V=% '8@#:K$<$ ".<MVQZq-$%,,&'*$zIUR>65&&'!xpe[RI=2* ui\fsdTLGPXagg[_ih$A6%).12tfswljt~k@hK$&(+7NZ]ZTPK`wyQ /)stP96v9(t J vggny#52-AecZIFy0Uv/"'/<Uzyi~jSV[0+=N? YC)(5+6=@(!!3DT^ct0( #*,*)*&"HRO>890$-:0$#!x~umhbUIB8&xk`U[dYPPQTW\aez|b{{~~0F<3))53$ e_]m~,`C./16>JU`a^]]o~h<-)rlB @PI)(\ xfYYb021 ,CNL5&OkmXD)]#.+4NjznmYZ\)|-<^>BOD.++,+B#%0@Qcs!(-2-& &*.,)((CML?:<:7G[D+  h}lbYVSD60%oaWNORPOZb[WVY`plhj~Q[djnnvrOm"$7D??JMH1 eKR\qnB39<<>EFDO`ghmrmT#.$kb0 ~2.UkOHN'-1%?MNHVlD!:'heOU1680:a}vqb]Yc$Mm/OBC4"& )! C 1CP_t/EKN740' #++)/9#EKKF>47@QdP8#_zywtfTLEB=-{lb\XTQU[ej^SIEIR_cd RW]]ajgYVW $.>AEH>"pt|xs~x4=GTWQU`kw}{jT5bQ}d6 O! Yztsu ;Zsyy_A/!WC#A823Cl}gPS~Au6^@I? ,5! B8Rcu%1CWZZ"=<:1((*(7K)GHJMB+3HZk[E-|U}uoib^\N;51-' vidcc[Q\gnq`N;1138Ia@VXYTXhZ2>e/2$%7DJB)p`[Yj.)<Oaf_]_onS8= 4[jrT1 { &.7AJU Lxp{ 'cwpaP&)\7 6EP9+7MvrGDn `@!l?QL9C'A?aw2DJVfgd9?B=5(#&)?Z8VQOQ?&COWRK8'!yA}vmaXWSLHF6! "& pgdb`WMSZ_`UF1&&2Gl#!`ZUSUZO7^B4#7FA5i^cp'N*DW`egt|unM+M -1/ 55;HUbE 0vTdfuOxi_^u}Fl}x5@>#]UPOK5*;TwtE=|'t$1K}N`[!TI >$0On(ETZahii4AHGA1$#)EgGbXTU<>EEJN@1# y~)ra\SD;=;40.(/331wjca^YQGJMPPLA*!7[E'wh[RSRMHC#O6!5FO8]KSl%.4"[!>Wdgq~saXO)Q:YgwnC%4DK, rZSrbRD`|a~'{}^>T2H0bUG4-AZxrC7BR;\C1oy[pj.kL</F_y >Vchiijm*8CKJ=. "*Gj)Mb\VR6 5<=@B9. tmXI<90  &((${i^\\`XLFA;5<CFIKF41A^of_[XWQFUy-<4):KH= eYcy/C&,N*5BM?*"NEglpz~x fa+0_;Ey bka~~m!qiCDEDGQaz_;-_G|?]>lwe|w91gA=9[l3IW`ffcfl$0<KPF8%!)Hk8P^[VN0 ,4765.&T{dG*!  pUB:>GVN<4/-+3;@FMMAF`{k]WTXZXRGg(3.4=GQ<}cXb%A# <b}Dv)Kn)'09@})w@6Xzmx f`NC#+niF&7GU`ai{   iM3( x r||^wynA"-@[5> Bmx+DSW\a`[`h,+.AJG>/%$Di?IPQME)".6/&$qW:oT?88?EMF831479;DLSWWc~e]WMFJNRW^).8C5'qgi{  !7Pob7 e/E^~64RkPWg|xk~plPn$W3Vjyvw}|sZB-w3z(p}C'4:;' ="Jw:PYUUVSMT]"<.(8CGC8, @gEFGGB8(2&  Zvpo`L0~neYC47;AEFA:89?EB@EKQXct`WSPNB:?EL[v"059sWi+55=HJJE? a):NfE/;gxguiinoo w|PT 8t2axvftT<'r?3p*o~vA(63!# <$ (T%HZ_UPPKDKS4Y>,/6DG?3";dKJG>4&!({qndSJG5rcVVRE>CGHFBBDGJOUQLB<AJ\o|to`PJFD@718>F_7'{ii u'<Ga d5PUZ`h YA}{yMjvK7Mbv4exvai]> ~KJEh7}fqj8!/*3:!%8b 4TbcVQQLDGLH|Z?0.@GE8$8^&VSL:&!" V|usm\OI=-"rcVYYNIMNLF=>DLRZa]WE79@Q_jjaZTMFB?<81-4;C`/ umt  $'<e  17Z_M0  '|yEMHdD3Md0`sno\4 yI f a^9Mq^g_00+87-IpC^gfXSUPHHI_`;*8CI>&7V4gcW8(*# %qvaXPKB1#'450"qpm`VSOMD869EQ^kgaN>98?DGKQOJGDA>942149A_" qt{ r<Sc g!KU>[EFfx$84&Ch=Vm}%PivQ`7#@1*=n_T]V*:9  /37[8Sfhe[Y\XRNKuR34<KC,#"3J>ol\5  74&?o|neZI8.&/CPXXN8,'"rf[TSLC;4>LZi`VMD<78639FIFC@??;7548>C\ +yr inx #J# 4B+#[kT8ysnlqu .9;=@ 0rFduX8I3(Dk(tdWXN,%BC-(- 1@m J^ifb\ZYVROMrG23KH4)#-< Eqo^0F@+'%"} Bqzvl_K6( .K^mqsqbE=DC>+xf\][YJ38DQ]L=DIA<71+0?FGB;=A@>:8@FHWz .cp|oh v;{$$(akrCW}kZNL|qw&TxLA@b|`C,k4;Ip {dVG42JK81/ 2H~Ydha]\XPLJLOa7.HI9,!&/<]i^.J?&+3  'Eln\PK>. !=WaghfaR:8FJKD<'fD@=967514<BHE?CIHGBALSR[pkVp f xA?   _xbR>iqXF?slh|_o I *JhfF' ]s\{W<55?@88:'1x1P!_gh]XYQC<7?K?,DG;."z+A^_.G:.A,$B]m|~trl]I2"  .@POLKG>2$);GPV\F-+FRH3!Z?++-6<>=9?IIGLSQPMMZb`bh[PRtk ).*_] }#+-t)|_G=t|e]db6M$@[r~U3 T$bX/22,,3=H5+Cn/X)aihZSTI5).CW7??:0#! r+[i: <2+>  1):M^nrrpnmj[NIA3! #48;5145237EZms_LE;(.`[ }L:1;DKH=ALOQTWWWTT`gfb]DKaw&25, F`tb $a&tc\oXSc4r.1Z 9Vp lO1%  T+ [U!#!%6I;$3J$a-#b3gkgYPNC2##9 rF9683*'"kZuJ".)&76,.ASY]YUOG6''8,!&-;Tl1XozkK)zQ8BLWSCDOV\[Z\]ZYcjiaPty3Lv (7:*|x3@Fna =tiF~cHJh|r**KjNl v[J:2*>PPH& h"ZQ +G@-:M)R*&k<mmfXMH>3! . ^6-:6+'"X#_yX5"(&%$6*%7<=:7/% ->=;7:Qfz+<7/$#'-ivSa sh]RPSX]\Z]`ZV_ec\Nvq;X8=*vr=IPRYy9;\XJ. ~l^by-fxN/A_Fl  oXB/1D>1r= mo}C   9<7?K'C#!1}Etj_SKGB=-# v3%<9+&#Ek'&2e}gG)6$$7'"4EQZ\f/Ng~IHzfb]XY]\Z_cXQZ_]WNzlEd 7@*ic|ucpKW_9AP c?k ru{uww~&vwo12R|;i 30, bG',#`< [XZ4 )7@DH$ s3&< N{gWNIHGG:'7$@<,)+5F2=LbnhR+7# #4%/F\z 1Nbzg;V ~f]\ZYZ\^`VPY][_lsTl:D*ULfzxmy}glShw8rSgxe^esqmz<Q]7e'X(6," {P5x]B)*{U\f{y  .?CF b%,HOsaSMJJKLC6)$!<%C?--1(%8Qd_`g[96#   #1#| >Zu<e>tk]_[UY_^\UPX\Zhybt =G)wB9Oko]vljXt:onuyYOR]mmiqy~4QQ{Iw $.7& S"}ulXF7)4vLattb $>BC S2T$Pk[OMKLNOJC4!#%K.CA743("!Qp[S`\C#! &0$! `FkTK}_a\U[cZSSTZ^^uxq?Ce<7KeubuxwEgI|y}w L`krq"S=h('% _/qY9 %+11(Bts6elC "8;9  L8g0Qe[SQOMKIIJA5"(#]9CC?:3' LzYIYZL& +,1$"%& =JtGeb\T[eXLQV[_dwAAV65Javyit}+QtR-  x~*,qa`|(V 4[x% cBw^A -84Zd%ha%'35/E!!@y:R`ZUTRNJDFLIB&'wIBAA8,%"w9_LQRO1 3!-=7#* .G|%DhvostxTw`UPWaVMRWZ`ory @ET02Qes{ttu} HHD#6VhwiO;% yx5U~`Xt7` .Qv  qQ2|xgP 1<8!0u(dI  62&C L<TcVOPRSL@>A?< #*)YC?B7)%%^'dNGGP<5&<O=#&+:c=UmuDBI\a]w%`ROT[UPSWZdk;I'[45Whs{xzztq|4G8"&Nyp\LB8~vv*m,q]s Dh$Dm_>invkZ#4;3!Q6c560> &U>VbPFKQVN>8752  +5 iG>>7-+*MhQ<:MF/*%&MdD$$<v(LpM+=OWYj K dUVTSVXVV[nw-M:wGA[lw|xqsvtt} %(#Jw!;PdhlnpvrV9\0Wm}fI*Nk/Z|~hL&fQ^pfY0)693 y[ei(4-{5)XAU^E9DMUO@70)"  )<uI>?91.,@i |gP31KNC! &$(XrJ'    (Cu"B]y}#%G\eehlpto.kZ]VOXa[XbIG\M^mz|xupqsvz6`CozZ<p<  -NVV70WsEhzygP8W@3JeYNA:AC<,"J9wdO$ *2 1)e-([EW\@3BKNKA;5,# %;J?G?2.+7Ym_L-+ISO&) !YzR-(U,Sqvsw54js]bn  Es`cZP^i`]p&} =MrW^l{xpswus{A 3Y~iCyG:QE.2_ /SpmR9#n%/SD8GRNH?) 3f:^7+'AG# -$L%#\M\`C7GKB@CEHB: "8IBQD0,).I[UF)*JUS(2 UzW3K5Ywdk{F5gtX_p Nwcc[R`kcc@ }{'EgelwskryyyFz ~Q![8  ,?.,_&HlfJ.S;0'=MHA:$ >b,Z-5@RS2#/" '&7 `rNfnOBPP@=BIPNI 4GE]H*''$8EG@(+KUP) @"MtZ8  ?{6^{t^vH+HUctlYcx+Lzc]YT`jbi>Kw|    1{rnokfox~>z&*-%  $0* {DzU95%#(%W 'El|eM-D(332/ DFW.CU]X8'7$ "G,u&ecJqcR]ZHA@FORS"1HHcI".3;8#)NYR4 J-KlY92lP{vfZxc5ASfow2u_VWY_eh{C5{ vnlkqw\e  "#.73/246-h3eYD! ' J"9\yv_I%|;!## G%_8FS\W8->( +U%g&uc?ttbd_SJBABDG""(/KLfF'#/.'Q^VD. R;+NdV7^.^yaXXvClT+J7HVbhr  kXOV`^_p9:#rqtuv~p7QYI;1)!%,!'888?@4( Q y^@.' $$$ z<m)E`{oUBi6  ImGEGTR43E, ,Z[(9j/rqic_UG:..1+$!)-- XTdB*&( Td]QC%(QC:SbW9 A%JvmK4$$)XE@%-*AW^iUbUO\k`Y~I {|x|,/_rt^J8) '17-'!w?EM='mXM- 8X &A_xdE&P*  Zk<99KN1'9=")QO!1N .sq^F@FC=?C 3)%.1*f]`=/# Vke]T6.LIHYcY= 7mDhy~d4 7&/]Wy$ .OWdbiXSQcycT-Syz      {{}U<cnzmT:$'%&*.3(quyjV.qN#' )7Bt @^wwX3`6 oe+)+CJ- :@1$DB)+"9e!2u{V"!BPTZa /)'01#zfV5,'Tli]M2$733SicJ*\8lep4GnupXy{1O^o8fZURe{eW2Elfl     #hP*Xzrmqn^H- %0;F>) nN. mB0( *+/-[7RjmH|O$  I *BHA @:!-5`5)+!;l+3L"@[n )')20nJ-',Rml[C+ KpnY!#T]gdoF E@`U6Pf}e]XTg}g\ 45VK^  %#&"XgBn\VQK:{U^o #5GYS=#kR7aC)yfr76+&Bz1H^qzb8h? 5wtt+-\O7&E3,7&<(!!')<q54A-` ,*,96l;$"p2Lhn\>%   >jxm4*S|Nh*rY3` l60b&Ei+9]{ sdZQ[hfn$YFW   #>$FI-d|eM:,%$ pOVc#:SRA,nYB%zT0u^]f& 7m*EXdox}kQ[0  "dzthZ3S{M,0! S5-!!#!##=e'W! @Ue 0-/A;j-Z7 Ecp]: 4dH @bE}~|pS"XWJZ,DKvM0(gR{ $Tuj\PQTg0^DR{      VG6# ehB,nQQW.MRE4#raK2f8vYKH!$0d&:WgknpzyslZ>pL Rcas^B?@wI3/'v0p#$!'=Yio_C 5:: :33F=_$C3 =^ugG) 8Z_#>a7kvf[]JFp>#vk`V Op}za\^RDo5~ab{ STQe"Ych=qO}&GMC8,$xiO4uNwWAh3<6)Ir'>]npru||qe\R=T/{AS~gGi0"*  1r [# ! "-<K 'tyv @98H:T/e.4WypS35@Sw=2W|%b|kYG84])G_Q b\sX]lU:z4 & }r pIZ9f6MH@DuCKB<5-%sV8b&b=XtCTSLb%=_rsw{yj_TH:!f8 h$DnNf)!7grF%%19?x,C_ A@ =??9#K'Q#(M}x^>A`UU}[ 3\BwvQI?0I"-0%t)7>DIs3*eL_d@0 """EEe8/?B3 1W{GMA?@4%gF"r@ lC\y"Kkts.Rhoy~o_O<) N +S6rna8( 2@B.$)-39uv}6{7 P @FD( |D@@}gI*,2^h\{{1a ZwU31-^{</U#Ugpuy%o\IdrN+$ ,550& ,KaIDF:% ujqqji9SVaDJ;<C3wU* zP!tJa!JtE_kzwbK4A  =zE ,enqc#(7+% (,+/5 rj n:ce MQF x@5  -xlQ58?ixnM ,g=g}wpdWA,/+b ws|N-M%Ml_qe\Tljp* -4/#} H"SELI7$ jSGIE;G`_X3 -(.c5=,/8"e7uKyUk6^r}9VfxjJ0I  .SpC-_oy@$) [!~-%(-.04 t /[iEL `W@t=, m~t[>@Ei|z:.u Vszsj^RH>65*(~ln~ Z# >.[p|dh`bgu m`"q{B2z>/MG0#lP=.%  ;an%tG(vM"q #DYix,K^qs{jG) T/  /JhiD4_mwn`" #()pg/' '-///=c}xqhit0 yW1 o:&k Zw~eDBCZo|m':Bk}}wsodVQNQUF*_ tr]4jW\(b#ebn}qhZr wtoisy7A%u|E>!gC5"9Ji]A. U,#7K_u<Rdsn^fu^BeH0/'#%.Ke{dH/CeihO5 "% =rqH'&#$+.+#u6!m]US|q< }Ij7!M>hqLHGOXoTP9\{}rokfb]^ahoT-\tho=`R}r_gu}jm]\th`Wv}x)EHzx{w52kC9"4WsXC#tL%#8Ogr} &>Q^WIKRA- oaI*4- %+/,0I^lzz]I:H_\U5 .@MB."#"*.)eke-: n1  c34iR}UQRHBZlm}Lm UpsghbZanw_1InQKzaz &4KmI\kVoxzuo- }hWowd[Tj~z{}~xAa|m]4"  xOF,yog^bh*SvomV;[6$  0F\it{ &8C?4+# |dSL611),124CRbjdgslUH>DOH>&+ R5!!).)V'RmS}W(" P \/+Z6hb_K;KUOX}q@B`{qfgbYijD}7b@:hbm+Zbo([Pgjcu:j_pufeeq}wouyurnjfipyy/[)s`R7 {hUH?^"Jlt_[Zrz`H2wQ?+&<Sbnt~  )&^F5.+00/.+,H^_[KL_^MB:=C=4/2+"\c )0+L"P._#(-' )V+*SwxoT<@>,+Ecn> k&csjkf]tu_DRR12]xK-t~{x{ vmPJWTH{3hn}yqlu|tnkiossqkd\YXanqs|{E3s]C% {_>#7W@Snv`IILggO=#^K6  1K[jpy cB) $.6.$D_N=*,JPE;25;60 'E8% 7Va<!  !(2."Dy+Ok.~rI" (GNxw]F@4 !@lj9+$]~xsvwv~wlE^P.*VE.ytsz$n]PIDKV|jup`dm}}pfdcfilmmjeb`ZRXeghkp-52mO6"set,6Khj\H15<VqlQ:oE7& $?P`lz{cM7%,2#"=M2"%3PSB:6<D8( ,:'3>79'  %1/#?lT&gi#}<"&9\e|gSD/#Wvk1;Vz~~}hgT.#PG/w~np| RTH0Ep#tlynYETmlg^VX[cjhgda_aiaPT`cd`^w"Yr|{rdWZD5* &<C@/ ,D]}qQ1vJ! 3DTh}^>90!)++-65)F^ZA;?HS< +,&QA"  !/.#;b4 2! &uU9"-DzC}oaP:%VmoU1Cj{`0`_M}|wnkl{YrGD>4dzwuv{r\BRp]_rj]_aglswwshgsm\_jllf`u@w|irk#sO8*8CB!('" 8QszX3 i?+=Nas|X+/,%-,.30+ /K8%IjseEAJNP0 !2 X3!! ('4T@=^S8u+W8!-`v~~xp^G ,YdWmvB#i/XzwwoQj QInveRVj2sR;23<o|rnz~zdBSt{~^=Uzhhikoso~zkmvxwneuus{),}~baw Z9'jB  " ,Fia6_8%7IXh}pdm{U&($CK@<=6,(%Nk<*mqJGVSK#*6["l  !&" ,Dcz<B.[<"/T+Sxua5#5TVDFSooH6!1Y 5[ep~ztfVBa!6LYgcrxndYei S:++J|cZhrxkQXjnp`G\weu|zxqjwiivy+~rjpuzB{S--I!% &&$5GczjCZ6 -AKXtk^bl}o~]11+!<B76;==?CU`9(@rmLDIC9 % %L ^ !!'9}{U3c u?&"1Gf)p|K,2>NH1 >xeKNM+&U;Sk}yoe_]hP~ebbe}'Uwrmifdwo3_7%*f)wUIZixr`^aabeTc}sbyvsoy]_okj$qj~rai}~uAm7&)08SpT#  *WK6>H]mqxrO&|Y* "8=Hi|fXW^muwn_k|cF=.  26*-9CMT[XQ5%;Tt{hL@<3) *>P  #/pUcskMR/! $/<KPy`;8;D<&HIECB?76x!Kqztnjt{h"8AJS\_h{_]D2,:ejXXp~xm`YTtklviVpgflsba^[Zn gehrsmqx]E;H\ss4O|RMKZfjssQ-j5 !+8Se^XUYdjkcWhteXKH: ,@RI>3*/4<GZcaT>40.+   #.H ""&4ejpxBwi4   "%-25g-hqG>;>5 />61IYP/ T Exyrpq}F #Hb{obRIUj^z115?b&|ddp}cVJ_tvufR cYZixkh~eNNO`q}v|)qXRdotvu~b%fTc~tFkm]QZdgptS2u=~qnu (=NTVRRY]^WMchJKJNC !<S>% *?:9@EE>0*'*.& m?#&*9Z{}%h %'P# #(.6VCtMECF='7 )E^Y ~3wJ|}W4-Hdij^TSXpQR,<V~~wcQNLk|j  `[aq~^L?GRi}|xXQWfpwu7o:drbjrt{yU2m?m]Zds&6EMGDGIIE?[_854CA/?0):-'**$ #).2+#  \6 &)%#"-;RkEw)g;9= "$*4EZapPJJPF..  RhF    qe YGaA*+H_uk]XT`p.K:5X<8 | vaI3Mey igo}eI>8EUs% qRLYer|vck2WyY4e?bOJScx"6@9544211OtQ&""68%1-((1")04-$ ! L-""!%*)'%/=L\s,?Je5|C1p7"$$'-4<}+_aMKQ^S6   @_G {eTh62p|\<#@Vkd[hu`rCI[,UU015) ^;<BXolWNJFMV }\JO_kwxwOgk0 =b:_=eJ>DUm%-%  7T7" ,AV<%# $+2(&@'#$#  '(&$-<L]t5Sgrs#7S1 "%%$%),-e5bVMHOc[="  Xgr_OS[m JkT9(F\qni,yWQOn*`qP<JI<rJ8,=U}vz  XJRTTZ` VJPZerpnfnl/*ld:Y9iK;:Jcz   3 8RlG%  '2%-7"!$# "''#,=M]s~/Qp i>u8+! '&%$%)-1R  IQP?B][C%"$aY( shaZQI*ThRH8!%>_w7J_y-\dS"#>OSJ6dC((8k|_X_hswjmwKBU^dlv  -(  _GHObwsu^Lo0!U\3 rS3nSB9D[m}   4Z`b9  !6$"91 ()!.AO\n?c~  T$# !*(&#$*.0AW.Q^D?SUJ/  *}{0dRk`^af]RczBX_IID79Gb.qfk4TbD ,EV^ZI+pK+")UpreJBEJPrzwuaQRYpB9L\kx&7>9'  cPDSco{}LAo9Eq~P'dK- mWF9@S`j !,IjV<#  "5 2H!- &)%2EPYiy|Bd}o<"++("#-/+1<UuTCGKQ?! aCcH & wYPTbstrS9DUcNVZYdw<~P}Cj]B""D_gh`FwtoQ5(&?PXQ>3./2G_xeUW[I98;Fb}</8Oj|-862,% #pDCFdyy6/mK4:Zyp?oWA&hVG;?LSXn   K^k7  '2 &IY"w,  #(,9HPUetsu9Vqzx}gi1  ),*##,-'-8|GjVDDSK:*xn8Y3%#  hMDH\v}];p f!Un\bhm{R j]z'NckA 3T`eaG~lZ`eP=0)06?@:6149;=YuoTNKMO@40.1Gzn;.1Fas&"%%0qWA[ruvs.ybP>1&" #8Pie5oT;!jSB8:BGLb{   -\ZK#& @WZl, $-8CNXizvv!8Pgpns{{yq}lT. &++$#*)$/Bv"/qH@QUTE2gZOS& . pZD;:Rtvcbq=~Pv|mnr{l9=r DfmN  4L[_I|^@JULC:/$ '0<BDKTA*-3@Qw|UA6BQOKA82,'6dyt_=20?Sbs "09.KR\qts,}pcVLIE?1+:Od\.yX7qN9236<CXnpow}xy    CfI7 - Z^Qb-  +29K_s|*<N_giowvsj_SB' #)+&%&&$0@`+_ZIJNSNF gs:D  "xaPC<7LkwxoVR`-Pozz,q:ZjtHikr{?OB~bEJPMH@6'+HUZ`hS93/16Ro}eG@AQc^WSOG>28^mdP4/49>Sh y &8!t\istwz 7pdffcT<21:F\rgA~[6~U:0,-4>N_\Xgstz >MM-(+(%\O4Z-  &,Ec{5Sdjllqxyx^nG<0  &**'#"&/<HT)r1zqVB@HQY*s|axV5-~mUGE?8H`kstrL:E-Lg  [aQ\^ZOoI+:P[fw:8lTQOOME<."*WkpuziSJA3(2Ce~jWGLYixqilmcVC@]eW@&*:4(Ca&(k[|-=Ed_`u|ti\yw^OFKVmgD!]6 _>.&$-;EOH@Vju, /`S()c7 $X8T,   ?f@p{vru|~CuX?4) %)*'""'-4>I|VnJ<:HYD*vh)("-vfNA@=8AOW^acF6nh *F]qJ5mu-QK?0vQGFMUltu&& ysn_QQOE=8/-Yjlrzqehk^QIIazxjegkqwtqvwgWEC[_M8#&3.%Io'0+s&E:*uxzwri3{}ocadud8 }rS1jQB847>BDA?Vl{*BP88R 2HuK*  7X{?wuqqv}'FB:-$"  #(*("#)+,7D 4-U:,=V]ax@t) )/+xyxn_H<;:8:>CIMQ?4My: ,EVd    X5rL61f AKG2zQ@:QqkafOnzoTSQD=C>&0YfckvwuhXc{}xruyhSFEYYC1"")'$R.=:. 9Ob7 {mqstvy{[yr}~@vk`F*vfXNHEC?9<AXo MR7NF6(EB7gB(   /Hq;{wkckx 81*$!!!%'&%&*++5Bh.YtW>;?LZ6 xw1)ynnkaVJB??@>;;=?@95C]G2Ch x+}#zS=>]CD;(dHYbJ  rbvvZOFA>?9(.LVU^jpt{rmkottrbTHDNH1&#""(/b! &A:0pdhjiRF]r[Y_UG.zsolhdb\VPJQ[m4F9 .L"  .U?%V7"  $2d-j{skqz-" #$%')+++3?M\" g/tQ:(9NNEk%  6!{ofb]UNLHCDHC9522135:DZH?d&&!s'mX<)7<5M5D=0    {UGx95)\FuaXt}aL;>>:3),>EFP^hr|gdfjpjd\UJCB6 #")9q) 8O@'uY^`]YU}B^{8]<(1F<-eaaiouyzsjd]hu 7H<6AC#  #Aa;E,   UYwuw~{sw}' "$%''((-3?M wbh@)AS4$wpke_XSTUTSQQRJ>834643:AHbKs=ZvdD$:sL8+5BX1JUNB1 $'))"(UQF\@?zj^a{kJ067/($&07=HV^ex}qu|{xi]_]J<80#!%(*2;xtj &01ob^\\j|b6^u[K! t`\\cgks~ :<#!>&  -;Io<&    Ak Zxddqx|! !#$%#$%&(3@m0{1}H  7^cX '! xSVZ[ZNHPVWWXWUL?9358528;8=Os"Eb~dE(y<=DCA5/8N}*N_d[M:'09=>5(BfcZ h%,=`daoqH'.0(""#'.5@MT[l}~hU_`H50+))*/69=}gQr 13"ofbc]SVYo +8On]0w4qf]XX]adq/;2)5;   ,640}^4"   /GVxYVdr"$%""##.;Jf(xKX#8VdgE,2' pVCBBOWI?@A??@?;95301121/.-1<Md|qTI?946=Qs%MfmlV<!-771 0NKBx->KMns|bA&)-12.19927?PbkugMPM<0-09=<<;<?pTew    !+yhfgeaxIo$A\hqU7t;of`a`YUZcp23/(0C0#$$1=+|wR1"    !+t>qi`TZiv "%&! *60;j k9/*=Q^hhY. 2NB).6%L@?94GRC87646<<:842/.-02*%'+268?JZmz~wm_I6).?Sgf^O>73?OnOitnbC165##<92IOM<NR:&&*9@=@JB105Mjkl_AB@60/6CGEB>AE~^ak  '61xsvqjmq(Krn3{xuqnbUTUag_\an*724?GL#=0-9D"xyfF,     SZrkNN[k{ !  !%'"&..8{uIYNHLPIIajW9-LG7@KIC#vCHXK?EI>9>CHScmtdJ=0/-25,'+2=BAADJSVVWWOHGGEDDDGLRY^TDDDINYkVptiO/  )0."885/#[32Ae{C4'$(<KPUXJ3.0Nskc{whG.9@;9;<<:69?IT~~qu /+{yw~2FXI7vnjhb\YWVYjutv~ "3?BJXL+ 9K8#  *BHJj{V:"    2Viy`\bmy)(% $(#$).7^ 7[_veWTO>:[okW0.KI=GS[aH,j=I_P@><65=DLZm}xVD4327:5049BFB>;<?;41-& #&,4@JQUVVUI:BM]l~Lw{oU/ &*%  $48:=<|:8;E^O:($'7GUajbNA7TxiZm{bVL2!8F@=@=522?Sam~+/)~z~|romf]aghk| #7BMSXZ;'4CI6$  -BXTGgfG/      4Kqikqy2-&  '&!$(08>b4lk%oPQPD@UcaZL>07KF9>ETa]T4p<>L@4.**,/47@M^rhRG=>?ACEEA?A?93..3-%)4?B<=CHLJFP[tBhvfQ6 *# !)19BA?2qUA6WR)'&$-EbtP_yeQZnxX:2," AVF<;7/3@]3&|zz|nbciuy1CS[bfY869<72( &I`qZ7wtS7#      ,^ Gg|2*" '&#$'080H5 gr~STSTU[]UTZR@BOH<73BS_fU@! UC70)%"%).1248EWTHC?@AABGHC>;6/+((*($)275*+4=GOWgxAcldK6#-0/  '*3====-gB-QQ8%#@mfcl`SNYhF&/Hq_D:67Jgw~}} +/$ ~vqx{jc`bfilrx}9`jrqmbC #@7. 6_ptMbE+    ">]~Nq+!  &% $%&/55I;3zO1}_ZXmyl]IF[[LNWPE0(7NbkhJ*  V"!#'-7;;5-1=>:::9989;<:72,&&)(%)/*%" $)./)#)7FYn6WhXD+9HTE5"*)!&,143'm>)M}W$'E!z`SY_IFeE'XU=:Mt}hW]m !/+wddj}wry~|~HrnI @@;" Jqtc/nT:"  (>g Kgv"  "%##%(.27Er&ANwGr_vjS@B]cYX\VM8"$(6F]i^G#c#'-03458761,1;924753334542-($%*($)/372./0,($ $2Hc 3CJ?/ :[YVF6#(25'  +3-r?(>{~nzWGF_3D~U;OdF<[>#0BlY\y{X>Z{ &'{mfmxHxuO0VD,0Xn^<_H1    *Fay<GM  $#!%*-07@J?.k\gv{[C;Dalfb^ZUI;."9Sc`B"l2=JMNH?4+)*2;G>0152-/02320+('')(%'*:KD>:4&%'(3Fi ""$4LdRB;4*$',3) #)7+vE()DQXal&,uBPyF"CeE7~}mL4P # uL1h " o^X]fp 0ZQ/ET9Ga]:xT>)       #8b~    #! &--.38?h>mYMweB,2Ddrqmggh_UB/ ?PJ<% }KXgjj[MC==BJPTJ=;;97779975420/11.-,9E>753/3DPYj'<=:'  .=FN8&.4-#"%$ )6-O547=Ma 17Em;?eG9zuw\6*$p]H@ mea`ix )KonO 087,IQ<pN6"      $@[v  ! "'/.--0=]?4EnxI%(Cfwzwrw~xoZC 0JRI6 gtn\YY_djhaYQJCDFCACC?>A@:9<<:6146.(+0?Rn">N[ZV8%2@7, 3.  ,'%# +42,N2()<T  ,(!2^2=dI<{ soM!/y@GYxgdkXSU]h| %D\trmYD'%0,( %7C6jJ.    -Vmw !!#% (//.*+8Ns2kok@%-;Q]bkvt`IC^f^K8&th\J@KUaksutpke_`a\WYYTOLF>8359BKRY]co{ 3IVahkS/&:@D6&(7.#4/ #(.00'"#YD==>'(_4Eqa\zQ0Ug?_oWGARg{ojiqz +BJO=*   (HD@4+''-/*bD'       5J`~   !$&("")/0/(%1?M)Y^23e?517>CZxvbL, ;hzhTG:1)$ &)*)&[>%5K]lwwpqqkcWLA4&*5Miv'/=NXbroNQ@y:RPH7$%%3;.+;6%%%&,3;AB-gXA's'  b8N  Y E{lXE{]J8,%(3Iiricnz!-;1!  5a[UJA@;0! qY>       &Hd}    %%# !&+-.)&*4HnL6Kw6iP;-%5O^ibYM@2!8fvi`WPIDACC@AFKQQO@.|daainonkhe]TPLKLRXZ[[]beht() *:JS\fnaDRB>J@0//6<??6,)13/)! ')+-09>6*zKq6  !uP6Y}(sHO{yxdYPQRRSUbynsyz}"$(.  2JD=3+-*~`K3   /?Nm   %$!! $(+-*'#+F\l9P5mM7hqC" (4>=;7475%6d{rmihfaadktvulbP>-{xsk`SMK>/'!'/;GQ[et6GXkjF#%6FOUY[P8ZK$==,&8EPHA>;;;;6+),&#)-0--69*%+%us{A#!hQcx/\7Xqmmzyhbez~||tnkjlr  ')&#!    &,0*#jO<(    !Bi     !"#$'*+)$(>NX)Pz@BeL=2-*((-1463+3Sz~|zvvxy{zxjZNC;-%&&+/05IQE. ,;HKLNL705988=?@=4/*,0(!,51.01*)0/'"" (KYint~'m@.)o~|~ "&+&"          lU?-      ".=    !#" $(++%&7BHm]?TTb9lH5&"",58<CB3-2Ecu}lWNFC<  %&),/5;?B==AGOQOG=:7+ !2>7 6CMJEFB#  *&#)/:AB<.*,05*)83/,++-48888% 5  /GP\[]izS,.B  !'/653.*13*!       uRA0             $# #&+-))2<J_y&>@rWCqfZ]_]\[WLC>BNUX^dp|}lT=2' .27=BFHHF@<9<CEE5"2650<Q[bXMPO0  2!(0563+.9==-10.-.365663/(!  %;+ IQ[JA]tVAY !#$(-%      }Z;0$           #" "$*-,+-6HQU+c(dWZ!hzsmbUNLIFC?JWdq~|xw{~_A- &*/6<@@<71+%&-012MWRZiqvgUXX>,--'*6,$=#%).11-5DGD2 +-.-07:544/'(.-,!.A;.\YY<-Z p^_& "  _@&!             !!"&)+,+0<IUv8:4yTmTyofWGDBHO\gc`^\Zbqvv|xcL9=?D< =Ydcl{u]\YNFHE:9D>-#:N9'*..29>=BKLH<, ),//022346."+:* (8<:sS:/k qo     %(%#  u[@*            ! "%)+*,1>P_m-Z,vled{@es]QFFGPWVUUQIKUZ]en{s]LRYhgO1 ,I[ceqv\UOQTUPD?DC?'2BQF<7437CIHHIIF@9*"),.//,+/26/%)=/!)3< [>2v p}   $.0.(#sN<(           $)++)2CPZ|9CE|e^l|&<Si|~smhc`bdfaPHFCBGOYcfh[S[gywhRB5( *CSWNLPaw|{cI<2@KLH?6.2@?70)2>GM@79?LPKC;:;<>70.,++-,&$*.234,"'/20 .vM5x n   !%'),(! }bH-#            &++$)6AK[m)M8wi^Vd}.:GR\cjnv}|yz|~~zw{~nc]XRTWY[`e]Xbn{|vqh\J6C\`[MIM]stoYA3(:HIF>1%?KR?$'.CTC8=CNPG=0.137651-)&(($#'*-3;5))+03 a7u {       cM:(             "*+#"(3BIOy->*pghc[_ds*Daw|nlkb]fmmi^]fgcUC+8NSVVX[fuqhVC91AMMJ?.:LWB# !;QB9>CHG>4(&(&$&(**$ !%'''&.<8..0+&' %> {7l %    -)% zaH1%          &(! $-9<>Tm%$tleb`fklnot~ 0Rp|hcmomcUB-&)6IborxzqdWOJU]]XK9$+GW_J.+*AUJCGJKIC=643/))).2+%##),,*%+84*/6(+)jq ( Nv  &"&5/#  oZF4$                #!&+036=FYo #&! wncUI@<?ABCDN\w&VZXKHUl}}ysl\KC: 7p|vqkquuo\MCKaihW@?AQ^XTWWSRSTSQLF=82;A:3,)0450')0+!-=&*2\Azs   =C1  wl\C1$               &(*.2229Ci  {roje]SWaho5SesybH$(a|ywvpjnrql^USZhjfT?CKWb^\^^ZZ`efeb_ZSKPSMGA<=>@;0.1,%1?+08_/Jwe{ #'*!)'xnbUH@5$                 %&&+/*$%(:Ng(3<.!lfcePTd|(IixvO-  G\biolegja\`cc`YX]cge_L6@NZda`cc`cmsvwwxzskigb^ZTLILG:642/6>3)9< i*$7d i<^{xnI%R    nmq$)-*& %'%!!  wlc[RG8)!               $*&)4CP\ix aHCDLZjx $?VdtujgidYURUXI9%+=NX]cjhbde^X]a][[]acca]N<CMWa^\^]ZY[\Z[__^TJKMMNTVMHHE?:767894094c302<\ M~jdrpfT?(=m            zgYOG?:50,"             $!"&().6?FHH\w !*.0/,%&(#wZJ=4.)*,)%'*@Uk0E[rqf`beli]Z]bigccb\W^bZX_cca]\[REHKT\XVVVQKD<46>:4(#).7ISKEA@B?9:>93457*Z@G:VVI_UaQ5% -V  !!        !('!  ufXNG<-"             "$$&+04@P[et|l[OC7,3;JZjy2Oj~xsmnokhe_SD/#%$ )( xaXcV3XmQws\>750+<W    $%&'%#%))'%$(-0231*&$%)(%'+,-'  |sk`VPJC<4-)#                 % '+.+')+5?GPZepy nV>618=?=732-&1Ea~0X}ysiU<y  ijosN]zkLNWRKMY#$%%&()*+,,,1860-+06<BGJDA@BEC>@DMVRMC963/(t`RE:0#                   #" %+4<@GOSSU[^_r{rpi^TIINV^n-;DJO[iyytojfaW@& |is}pvyxpaewpauylnslcae #+,.03531/,-/+& yk]QKE>72.*$                  #)*+0/((.*$&(=Rr  vld[RTWZ^ft#-6BM[houxzz}xof_ab^\\`hd]YWWVSPKGC:!wti^__[[l}}wrpnpt~rmpkbWNhysotq]Vhxrieehkpnnyx zm^QB1                   ! #*4>HQV\agnw|``ikmg^RKVakqsrpomnnkhc``chnqpjhhcZXYetx||uqi^X`gold_\ZYZ\^ahpw}~tv~{qe]mwm_TKEA:2.)"             !!*+,'#(*%$'+.=S^f} |xuuux{|lhkljmqpobVUSX[ZZZ\`ceedt|q`KRbnyobRFLQX]`^XVW^geb^\_cjoljlkjd\bmnnll~umhdddedca_\XWV[`dhnstuxtnourme\VRbs~nc[XYbmqt||vrruy{xpgYLB8-$              #! !#"#(,.6BFGNVVV`hfgqzvsqqk]WVSQPPQRE9867767;=>?BA=L]ek`Yad^]bcaZQ[ku~ysibcflpqqoooz~}~y{x}}zxwvzyog`_ajv||vogaXPIC;3+$!                      "&*+.21.,)'%)+'(3AR_fu}woida_][\_TJGD@=<>EGFFHFALX[\SMUYVW_cfgfp}{wssszztng_WPIB<7/'"                     !"##$&##&-1.,18BEBCIHEJQ\foy{vgZTNIC:3.($"                     !&,/.,.064,'%!%-4>O]^cnw~|tlea]eny}xsppuuska[VQLA82-)$                      %%$())*.,&"!"#%(*../6<;83116?FNPR`ooq|~{xwvssyxifnolf`ad]X\_\YSQXYUUW\b]UY^\[Z[]^`bfd^]_bgedffghiijjfeglsutrpsv{~wndbbYRPONORTSOF?83/*&).6=DJJHCAA@>5)"                     "!"''%##&(*+-/+()**&$*.1;DFIRY`ddgnqqu{~~|wx|wpu|umjihgcdmlb][ZYUPNLKJIHKJ@>DED>7672.2443//340/05<814877557779<;7779<<;=>>?>>??<<=BHIIFCFINSZ]ZXVUTPKD<;:2,,+**,--+&!%+-,)'&%%                    %')+,-,+.1+&$$%$!! %,1631114553/.333210.//350..045349736<9578=?76@D>945;715;73-)*+()2/%!"""! !""!!!                  !""" #'$! #$ $# "$'+&!!!!!"    $" !"$%! ')&""  &"                         "$!!%$! !! "#&'%$$%%&'&%%$#""!!!!! #                                   #  !! !                                     #"!! "                                                                                                                                                                     pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/examples_palette.dcm000066400000000000000000010515361515706620200265670ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.6.1UI61.3.46.670589.14.1000.210.2.199999.20110525185628.1.0UI1.2.840.10008.1.2.1UI1.2.276.0.7238010.5.0.3.5.4SHOSIRIXCS ISO_IR 100CSORIGINAL\PRIMARY\OBSTETRICALUI1.2.840.10008.5.1.4.1.1.6.1UI61.3.46.670589.14.1000.210.2.199999.20110525185628.1.0 DA20110525"DA20110525#DA20110525*DT20110525145628.350000 0TM142825.000000 2TM145628.350000 3TM145628.350000 PSH`CSUSpLOPhilips Medical Systems LOPhilips HealthcarePNSHOEM-4K7CO2TYJWP LOCX50PNOB^^^^ LO11-05-25-142825 0DA@CS LOCX50_210\"453561454581__PRINTERS.06.708__PRINTERS__[2010/06/30]-07:41:13"\453561492081__2.1.0.515__Ultrasound_Applicat--11/04/27]-07:23:23\"453561601281__DRIVERS.29.317__DRIVERS__[2011/05/13]-11:14:07"\453561453792__OS.09.460__Operating System__[2010/06/14]_16:45 PLOC5-1\UNUSED\UNUSED PLO OB_GENERAL`SQ`US`US`UL`ULx`UL<`UL `UL `SLT"`SL$$`US&`US(`FD*`FD,`FD6$ۚ?.`FD6$ۚ? `US`US `UL`UL`UL `UL`UL@ `SLP"`SL$`US&`US(`FD*`FD,`FDT3?.`FD 1`CSCURVED LINEAR UI61.3.46.670589.14.1000.210.4.199999.20110525182825.1.0 UI61.3.46.670589.14.1000.210.3.199999.20110525182826.1.0 SH10 IS1 IS24 CS(US(CSPALETTE COLOR (US^(US (US(US(US(US(US(US(US(US(OW !"#$%&()*+,./012356789:<=>?@ACDEFGIJKLMOPQRSUVWXZ[\^_`bcdfghjklnoqrsuvxy{|}fAE)% ZkYj9(OW !"#$%&()*+,./012356789:<=>?@ACDEFGIJKLMOPQRSUVWXZ[\^_`bcdfghjklnoqrsuvxy{|}fApsJ>' kY`(OW !"#$%&()*+,./012356789:<=>?@ACDEFGIJKLMOPQRSUVWXZ[\^_`bcdfghjklnoqrsuvxy{|}fAV#Ds^: F kY(!CS00P CSIDENTITYOWEýýƿúĿƵķÿýĿĽĿýÿ~~¿~ýw|ru{|tuy~uuu|~tyuuy{~~|{uyvurw~{|{|}~~bnu{{w{{{~|}~{{||{|~|ywtY\it~~{~{y~}}~{uz|~~wtrrpYZbkt{|~|ywxu|||~|vtx|~~{{~wuyywc`^`eptw~~urtwy~|~}~yttty~}~~||{{|~|un`ZYWbpu{~|xutuy{||~}|{utvz~|~}yyz{~~{{}}{ricWWSUYeryy{|vrtyywxzw|~}|}}|}z}|{vspv|{wqosyzutz~|~~~wutlb\EWSSUYcrutttpnuyyurut{}}~~zz}ztt|~|}{uohpvsmjjknsrs|~}zw|yliic`\`WUSUUZgttpnnppuyypinu|~|~{||xtvztrw~}|}||xsrkjokehkmmqnlt{~{yx{zwutg`eeb^^`^ZYYY^gqurlikqptywlkry~||yy{|wux|{ut{||{ustv|zuulhkkfjmqttpghpyxuvvvuttnegie^ZYZ`\^bbelttngdfkilrqlpt~}}z{uty}yu|{uyvtrrorty{z}rdfjknkjsskcbkqpmtspquzzrkie^YY\SNQ^b^bkplgebcccilllnu~{w~~~}|{}|zyutttu|~y{~~{uwtrptrtvurz~vfbfkplaehc`ahkkhmnllu~~wplibYZ^\C>81/38<><86:?CHPSPHJSZ^bcaZ[bhkkmt{}wyytpnnu~|ttrtywpryyww{{xxxungkuz}~|zuvz}}}}zwywtw|~|zxqtv||}|}{x{ttyyyywzzxwwwqptrpnkgb[Z`knbWVYTFGOPRUUTVPIEELQTPHEEEJZbc`ZSNNNQSP&5:::>CJLQWYUOPTVX_ed]Y_hjgdhls|~}vtutpmnry|uqttvwupt{{ttw{vrmigbfklorttutruz}~~ztw|{~~||~|xzzvtvptt|||{y{ww{{||y{{utrrmknlkhedb]\ZbeZSSXTKGMKGJPRUPHAAGQUPE?AENY`\ZYSLHHNNL;',/15:ENQSQPNLPPPT]ef_XYdfddcejotuttslikrw|zttvtvytuy|unrwwple`b`gihigfgiiimsuy~~wy{y{~}{~}|}~||}|{{~~~|~~ywwxvzzvz||z|z|{{y{~y|~{{{|yyuuuw||wvtrkegfbabbd`[YY[WRTVQIGHHCGLPSPMGADKNMD@BAJSWUUWULCAEHJG$$#!#*3CNSLGEGHGKNV]bb_VW]_adeghknqrrlggjrw{xtttt{|~}tnprqkic^]`ihikggfefefgintw{~~|y}{t{~|x|}~{||}|||{||wt||{~~~~~{{{yuwwy{uty{y}{ww|wy~{uwwywtnnnv}|{xrlg`bb^\]_daXTVZWOPPL@ADGIMNQRQPMGCEHKD=?AAGJNQSQLA:EJQPPPQQPJHHJPK@>?GLNLHC<:CJJA/-!&:EGEA<:AGOQPT\__^[YY[ahkkhjkllifcb``gkeacijlttu{xrkiiggib`acgllnnttqokc``\^cecgktu{~}~~|~{yyyuytu{w{wrnr{y~}zvttv|z||~~ytty|unliilrrlgkpvyzpiebb^\UQWPEFT\\ZZ\\QJKJE><@GLLJGGLHGHHNRRKDC?>?CGGECA=5%-( ->A?><<=CJOPRY^`_]]]YX\bfgdegiib^Z\^bjjb`cgediknpnnligegc]]bglronlprqqniigbbbcbflttwy{}|xtwtt|{{yyt|~{}{rpt~~xvvuttsttv||{wx}{vwwwrkgglrtnebeknpqjbbb`[WPJNJ;;P]``]YYUOLLGC?>@B???>@>>ADIPPNKJICAA>>>>><;95358;DIJIKKEA>:5578:>?<1+*-- -8><668:?C;=GRZ^bbbb_YY[][]\\``YRSSQU[bikgeeinrstttrkc`b`YYZblsw|wturnnpronniegekpstwwwuuqrtutwrrpry|~|y{ur||uttlgltty{{y|{w{{ywywzzvyyy{yyywttvyywwvxxttw|{vtyytrrle``kttlc]XWZ`ekife`YUPPLJLG@IX\ZUH??>?BDEA:6724=>833/**2;BEGGEA?>85356>?6*!# *363016:>A;27DISZ\^a`]Z^a`\]\^[YXUYWSSUZbcb`ckprrtrrlga^`^ZZY\ciryyy{wttuuqpogceeknnntuuuwurtyytrsrrv|~|{xsry|~ytxutyumkkeefkkputpuwwz{wz|z|~|||~~||{ywtuwxvvtssopu{yrtxvtqkgbZZbnpi\ZZYVZbeb`a\USQSRMOMFGPWWSE7216?6) $/1-&&-5=::80.6987:91&$(-/4>FEHH?5158<<5* !$$!!*38<@>>>9;EJOTYY\bffa`bccc_ZYXZ^\WWZ\Z\gonmi``caYQPSQMMQU^belptuvuqpnnpngddelrrolklmpprttttntuyz||yyuurpqy~yty|ytt{{ytmpqihquuw|~~~|{|yvttvttsrpkikkiijkjddddeb\XTKO\gkeYNPVTRSXWUY^\YZ^ZROOGCDGEA>91-,-6:7486-+3642252-+*))*0:BCC=3,,141-*#  #,//1:>BC>@EFHPUUY`fhb`^`cgc]]_bc^ZZZ\\^iponeZW]ZQJLPNNNPS[_`bbekqsnkhfhgb`benuxwwtssuwwuuurklprw||yvvxtrtuzxytuuutqwxutpqokhqttuy|~~~~~||yuwuqoprqqqpniefihgb``[X\]^^\YSHFQZa]UKNRQSQVZYY\^ZZ_]VMG=56:??>;4.-/572(*--),.-.-,,----)$"'.133-((+,&$&$!  !*1/*,29AC?@CCGOTSUYadb\Y^bc_Z_dge\YZZ^`^ellkdYW\SLHMLLSUQPTWUUPQWdkkkfbdb\YZbktz||{{y{||~~|riiknwy{utuurtwtutwurnplnrttqmkgfelpnnty|{ywy|{y{yyyxytnnpmlmqsrolke^]a`^ZYYYUY```^XPGCHPWUSOOPMPNT[\WUWXZ^\SG=2+-6>A@>7.*,--,#"**'(*-.)(()+)%"&((*+(##&%"  %/53/,-3>A?AFEGMPQQSY]^Z\`^YSRY`c^QQUW[\Z^cegaY^^QHGLHHW\YUSPQPFAERZ_ddbd`WSY^gotwwwutty{{~|riilt{|}|{zurtwvwvwurplilppqokfeefklkiltwutruwwuvvuwxytlklkijnlkgb`^URUVUWUTWUX^`^ZRJGCEJPQSSPMGIHOWZYSNOUXQJC;0%)16-(&##'&"&%'(,,&$$"#"!#&%#!!!##    '2663--2>CAEJLJMPPPPSWYY]ZRMNPUYZPEGNPSSSY]^^]_ebSHHMFHYbb^ZUYWNEDLNR[_bcbWSY^gknpnlkgilllppieglx~{rpw{yywutrlknnnprlikmnrpnmotwuttuwwwvuttwxtkegc`bc_YWTTVRPPQSUQPSVWZ\\XPJHDFIPSSOIDDDBFPY[VNJLMGAA<1%$+6>?@9-&###$%" #$$"!!!  %-0/-,07?C?DLPOPQRRRVZYZYQJNSQORQIAENOPMLSZYWZ`ebWLHLFCS`ccb]bbZUPPKPXZZbcYSY\ceggecc_beccc`YZbjt{|{z{zulkrvtstrtpkklllpqllrqorttssuvusrqrttplkkkkh`ZZZYZYSNOPPVWVSSUWQSWWWZ`^YUPLGGIPUQGB@DD?=GPVRMGGEA>?=3'$%*3=@=0&$&&&&$" !     $$""+16<>:?IMOPPPQU[`^ZWLKSTLIMMGAGQRSKGQYUUW]^\WLHLE>JY]`a^cgc`ZWSY\XX`bUSYZ[\\\ZZXYcigb`YPU`elrqnmlkiecglkijkligeefhigbdie_biihhjkiggeccea^\ZYXUQRTUWXWSQTWTY\\ZUSWUY^\Y^ee`YQIEFHLPPIACGGA68>GOLFCA??>;3+'%$*6>;1'%&$&&&$! #      &,/1558BGIKJJMSY[\\XQSVPIIMI@>FNRRHEOSPPSWWUPIJLE<72-*($!%0993($$#$&$$" $$##     "%'),,3:=@BDDGJPTY_][ZVPMKKF@>AIONFBGHJJMPPNJJNNG>>GIJLKOSSRSQSY[]bc^WZZSPSSQNMNXgkc^^\^^ZZadfeXU\]ab`\ZZ\\\ZSNPNMONLKHJGHKMNNNNPRQPPRQUXYYWX\Y\`bb`\\befb^^``beebklf``a]VOKEA=7>GKH>@CGMW\]]\YTRPMGB==FKKF@?AGIKIHGGJPOI>8<==ABEEFGHHNTUY^^WW]^VRVWSSRW`ig`\\^b^ZYYY]XKPWVZ`bYSSUWQQJCJHHNPQQNLLRTYWTWZYZ^\X^^^cb``aeb\`ec`]^dikjhcbcgkibgg`WTRMIGIG@7/676>EE@406?F@81*#! $)*&! $),-(!#-/*$!      #*----479:>AGMOOQVVRROHEA>@GJKGC?BFIGGECGJNMG:56319==>>@CENSNNUSNRY[YWZZWUW^gicbb`bcb^ZVTUNGNSQS^cZPPPSQPGCJHLSTWYYRPX`eb_dhdekgcikhiigggkibbghecgknpple`bba\UVWPLIE?<=@?6/*/633.08EJLIJF>>?CGLKJGGDFDFFFDCEJKIA8684147:>>>AAHLGJSNHLSUWWYVQPQZccbgigiidb_[\\UPQWSWbf[QPOTWUJHNLNUWX`cZQWglffknlnqpnprrrrpppssnlppnlnnnnke\UUSOJEDCCDD?:3-251,*/53/,)/36650.0-*(&&&'"#$# ".40(!       $(*+-----+,4::9=ADA>=637>DILIGDFGHECBA??CIJG>:JSLGJPQSSQOJIJOUY\beikf`__bgg`[YYW\gi^USQW\YPNPQTYZYdkbWZlsnnrtuwwwyyxy{{yxwwwrnonkgeb^]\TKHHGA@A<:ACBA=1(-20,,/566/&$&)(*((*)&&(,-,$!!$-1,!       !#&-01,&"#'.7?DFGF=63/.29?CDB@?CFEC=;99=AGLHCCCCA>9646:867758GNJGJNNPPMHGHGGLQWZ^bb[VWX]de``]WS\gh\USSY^[UOPTY^\\ipgYZovsttwy{yyywutsrpnkkgb\\ZYSPLGKPIBAA>@BD<:BA?AA7.3761--5::6,# !$$))&'(*-+$ $&% !$$!      $,11*$,1:GNOMH?61024666469=@?>>8658;AGLLIIHEA?>858<86;>8AHGA><:@DE>=A@>CG?9;??8//59<:3& "$''%'&&**%$%%%%%      !&,*&#$-26>HPQNG<4024000)%,06:9:<:867:?EHJJJHC<;<656<99ACAGOKFA@DGGGDDFIKKJPUW\\YQMPNLPUZZUJGLPPPPNKOPQOHGHHC@FJKH>>LPPNLJJHGFC??>>>:8:<>=>CAA?>>>=?A><:8ADFDAACDIMG?<>=81-16883( "#$$$$$&*,*,+'$      !$&(-69;>DHHG>3,,1/,--%#&,367::87568AEGF@>DILNLNPSWYUOLLJHJQYYSHA>AFGIGFHFFGD@@:306666//>CD><>?><>?><>?A><>?C?>=CHIKGCJKIIB8311-)(+-.1/&!!""$$%*----'       %+0:>>@@?<81(!#*()--)&(-135864333668::9=?:647:=;;=FMJCDA@BDB>@GGJMNNLLPSTPLHDDGOWYQC:5;A>?=?D>>B@;73-1767811?HICCHKKJKLLHJMMIE@CHE>?GC?@>;868>EB?EHMNIDGG?;3'! !##%&%$&*$##%')'*,,(#      #+3;>>>=:5-$ !%*,**,-/-.3411132/2567;<6106>ACA?=7106>?:;>?AEA@FIHJNRQKKOVVQLE?@ENWXP?31<>863;A=<>:4/-09@@AA:8CNNJMQTUTTVUMNSRMG@CJJCAJHEED@<>AHLE?C@DGB<>;2+& $$#$$  $(*($%$#   #.4666652-$  &)'()+,*'+/1//1/-/58:<:3-08?AA??=3)(-660-.6?EDCGHGJNSRNOTYUPHA?BGPWVM;,2><1//:A?>;6/((3?BBBE?;BNLMPRUXWUXXOLVXPGDIPPKGMPMKJE??BGHA><88=9883)"#!# $" "%&#     )/00-+)$%$$$$$(($%*-,,,**-3:>=7-,29>?>>?;0&&*00*!'6?BEGIGGJNNMPSSLE?<>CHQUSI7)1;5,,/:CC?:5/(*6ACBEHE>CNOPRSY\ZYZYRPX[TKGMTRMGKPLGC>:8>8-,29<;===8.$$(,,%+4:88?HPSPG6,06/,/3?;651/38>><8663--00'!#!##    %'$ ##!!#"!!#('*/6:6,(2:>>>=:5+#"%('"")06>CGGEGKKKIC>:61/3?GHF@6/33-.258>AA<7428>@BFJLH?DPRSSPPQSSQJCBFFA:68=93143-+,,,27:863231)#&)' !#    $'&   !!!!#&%$$),*"-8>>?>82+&%''%"$)-5>CB?DLMKGA?:4-*,167642/1-+/0-*18:87524679<>?<59DDEC?>?>??<53674..353--0/*&*(&,130++,-,$$+*"!#$$!  #%%#!#$$"" "-58==7-(()()%$$'+.5<><8?JLIC?>81-,**-.-+-,($(-,$%-0121-+,.2222.,/78864575355/-02.*,-/-*)**$!#*--+*)+,$%,)!#&$#  ~~~~~~~~~~ !#!  !" $+36/&#&)))%"#')-149<=95>GHFA>:41-**,--*''$!!$*(!"%(**)$#+00.-+&&-21-.142-..,'),&##$#"" !!!&+/.-+.1(#%"!$#  ||||||||||       $*$#$(*''%%$$).368=A>83:CEC>860-,*&)-.+'"!&($#! !#$#!&--)&#$*& "&)'$"#"!  $$$(---)+-&!!  zzzzzzzzzz    !',*'%$%%%&,36:?C@63=FGC=761/--*,,-+&! !!$%! ! "!! """"%&!"&&#$&$%&''$! xxxxxxxxxx       '-*$"$%$$/59<><32>GJGA=950/000-*'$ "&$ $(!$%%&%')'$$'*%"$%$  !"$$! wwwwwwwwww         %*&  "&,./34/08?CCA>92-1364/+&!!##$"$*($#&)$#$(*)((&$$$'&$$$" #! uuuuuuuuuu     "&# %+))-/56662+(-030-)$!#$##&%#!$(%!!#&(('&$$$%&&$$$"!!    ssssssssss       $  $*,-)$"%'*%"" ! ##!!%**&$&()*)'%%%''$   qqqqqqqqqq       $   #$  !"""""&(''*,-,,,++*))'$"#! oooooooooo    #      $&&%%*,,++,,+*)'&$""  nnnnnnnnnn        "$$##&('%%&$! "  llllllllll         jjjjjjjjjj          ! hhhhhhhhhh        ffffffffff         dddddddddd         cccccccccc       aaaaaaaaaa __________]]]]]]]]]][[[[[[[[[[ZZZZZZZZZZXXXXXXXXXXVVVVVVVVVVTTTTTTTTTTRRRRRRRRRRPPPPPPPPPPOOOOOOOOOOMMMMMMMMMMKKKKKKKKKKIIIIIIIIIIGGGGGGGGGGFFFFFFFFFFDDDDDDDDDDBBBBBBBBBB@@@@@@@@@@>>>>>>>>>><<<<<<<<<<;;;;;;;;;;999999999977777777775555555555333333333322222222220000000000..........,,,,,,,,,,**********((((((((((''''''''''%%%%%%%%%%##########!!!!!!!!!!      pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/examples_rgb_color.dcm000066400000000000000000007044361515706620200271040ustar00rootroot00000000000000II*tDICMULOBUI1.2.840.10008.5.1.4.1.1.6.1UI@1.2.826.0.1.3680043.8.498.60462359955763750474035947786807696063UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSORIGINAL\PRIMARY\SMALL PARTSDA20040826TM185838UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.6.1UI@1.2.826.0.1.3680043.8.498.60462359955763750474035947786807696063 DA200408260TM185059PSH`CSUSpLOG.E. Medical SystemsLOBAPTIST MED CTR PNSH-0400 SHmvme22LO LOGIQ 700 "!IS0 $!IS1 (!IS0 *!IS1 PNCompressedSamples^US1  LO13US1 0DA2TM@CSM  DS0.0000000DS0.000000!LTLO4121885  LOR1.0.D UI,1.3.6.1.4.1.5962.1.2.13.20040826185059.5457 UI.1.3.6.1.4.1.5962.1.3.13.1.20040826185059.5457 SH13US1 IS1 IS1 CS @LT Uncompressed(US(CSRGB (US(US(US@(US(US(US(USOB       ???~~~rrrrrr~~~@@@  KKKKKKKKK KKK KKKKKK EEEEEEKKKKKKKKK KKK333rrrNNNNNNvvvrrrNNNNNNVVVJJJKKKKKKKKKKKK~~~EEEEEE KKKrrrKKKKKK SSSMMMMMMSSS 匌MMM 񿿿 MMM MMMLLL SSS ///sss888OOOOOOOOONNNmmm LLLSSS   LLLSSS  rrr񿿿 ??? LLLMMM ꆆꆆꆆKKKLLL  ꆆ???  ꆆrrr==={{{999WWWOOO\\\ yyyKKK䰰배yyyKKK䰰배xxxGGGEEEEEEGGG  MMM ꆆꆆꆆyyy  LLLKKK MMMMMMꆆ???  ꍍ SSSXXXSSSSSS  yyyMMMrrr䓓yyyMMMrrr䓓 xxxGGGEEEEEEGGGMMMMMM EEEEEE SSS   MMM   MMM MMMLLL  OOO000SSSOOO000zzz000~~~ LLLSSSMMMrrr㍍LLLSSSMMMrrr㍍ rrr  ZZZ  KKK  xxxxxx KKKKKKxxxxxx KKKKKKKKKxxxxxx EEE OOO444XXX{{{999OOOKKKKKKKKK䰰ׅ KKKKKKKKK䰰ׅ ~~~ qqqqqq        vvv~~~___///               ??????   KKK䰰KKKKKKKKKKKK KKKKKK䰰KKKKKKKKKKKKKKKKKK KKKKKKKKKKKK KKKKKK xxx EEEEEE KKKKKKKKKKKKKKKKKK  TTT sssLLLSSSMMMSSSSSSTTT sssLLLSSSMMMSSS xxxxxx LLLMMM MMMSSSMMMMMM MMMSSS  񿿿匌MMMMMMLLL匌MMM  길KKKyyyꆆ길KKKyyy xxxxxx MMM MMMMMM  KKKLLL  KKKLLL 꿿 ꆆ??? MMMMMM yyy곳XXXꆆyyy MMMMMM yyy곳XXX xxxxxxEEEEEE 곳XXXKKK丸 곳XXX댌 MMMMMM LLLKKK  LLLKKK꿿 ꆆ??? MMMMMMLLLSSS댌NNN MMMMMMLLLSSS댌NNN xxxxxx ZZZ 댌NNNsss TTT 댌NNNxxx MMMMMMLLLMMM  KKKKKKKKKKKKKKKKKK KKKKKKKKKKKKKKKKKK KKKKKKKKK KKKKKKxxxxxx KKKKKKKKKKKKKKKKKK         KKKKKK  KKKKKKKKKKKK EEE  KKKKKKKKKrrrKKKrrrKKKKKK  SSSSSS  SSSSSS MMMLLL 񸸸 MMMSSS ?????? SSSSSS ꆆ???   꿿TTTꆆ???  yyy ꆆ???yyy   TTTꆆ??? 곳XXX  SSSSSS  SSSSSS MMMLLL  댌NNN  SSSSSS xxxxxxKKKKKK xxxxxxKKKKKKKKKKKK EEE KKKKKKqqqqqqqqqqqqKKKKKK        xxx xxxKKKKKKKKKKKK xxxKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK   MMMLLLMMMLLL  LLLSSS LLLMMMLLLMMMMMMLLLLLLMMMLLLMMM   yyy MMM MMM  MMM MMM 댌댌 댌yyyEEEEEEEEEEEE EEEEEEEEEEEExxx xxxMMMLLLNNNYYYxxxLLLSSS ZZZ ZZZ NNNYYYZZZ ZZZ xxxxxxxxxxxxKKKKKKKKKKKKxxxxxxKKKKKK  KKKKKK       ??? EEEEEE ~~~~~~KKKKKKKKK??? KKKKKK KKK KKK KKKKKK 񿿿LLLMMM KKK  SSSSSSMMMSSS SSSSSS   MMM 䱱  ꆆ  MMMMMMEEEEEE yyy  ꍍyyy  ZZZ  SSSSSSMMM SSSSSS 999 ???????????? xxxxxxKKKKKK KKK EEE xxxxxxKKKKKK 999qqq999   999qqq333===888000...///666<<<888<<<<<<777666333222555<<<777555:::333888...<<>><<<666000999EEE???999DDDMMM666222444???666444///---BBBBBB...---///***>>>GGGBBB666666777555333666111333444---///---%%%000JJJEEE777,,,///@@@&&&000:::000+++)))...333555111''' &&&+++'''((($$$"""&&&333===DDD>>>888<<<888888===<<<333---888999555555777<<<777444888222((($$$...!!!'''!!!+++888999;;;///000777...###!!!---(((%%%+++'''---:::000$$$###111222...'''222666:::CCCBBB---"""((($$$%%%!!!111999444,,,:::AAA222 $$$+++111++++++***999666&&&;;;HHH:::&&&!!!...888222+++###&&&***(((///------444111000444&&&***:::;;;---,,,000,,,###!!!------''')))333...333444444'''000!!!$$$***222888>>>555///+++;;;...'''$$$###"""%%%++++++///111+++)))222,,,%%%!!!%%%%%%'''%%%$$$%%%(((%%%'''+++)))$$$+++(((///+++$$$'''+++444333,,,000///,,,///...LLL^^^dddIIISSS___bbbLLLFFFjjj```SSSMMMNNNIIIDDDBBBBBBKKKLLLIII888???FFFCCCYYYUUUHHHcccoooPPPOOOlllMMM===555...(((999RRRXXXJJJAAA@@@:::666DDDGGGFFFOOOCCC000777TTTGGGVVVooo\\\999LLLPPPZZZVVVJJJGGGjjjhhhhhhsss}}}hhhkkkjjjlllrrrssskkkMMMJJJXXXllliiijjjmmmkkkYYYgggTTTJJJBBBOOOHHHVVVDDDJJJcccrrryyyfffZZZHHHDDDEEETTTIIICCCIIIEEEFFF>>>LLLbbbYYY]]]aaa]]]777//////&&&"""&&&,,,555***...<<>>KKKSSSEEE===FFFOOOTTTHHHJJJWWW]]]]]]aaa~~~pppaaaTTTZZZSSSdddVVVVVVWWWdddLLLGGGGGGMMMAAA888IIIMMMOOO>>>fffyyywwwlllAAA ---666666)))111<<<<<<;;;;;;444***:::AAAFFF???AAA@@@AAAaaammmlllgggWWWMMM333888BBB@@@DDDPPPGGGQQQOOO888777333JJJGGGCCCGGGOOOTTTMMMBBB;;;OOOTTTJJJJJJNNN;;;000000AAASSSUUUZZZTTT???QQQLLL[[[bbb```NNN111222333GGGKKKGGGNNNLLLHHHKKKNNNfffeeeWWWOOOaaasssccc>>>aaawwwkkkZZZ[[[mmmkkkrrrkkkaaa\\\[[[]]]kkkpppppppppnnndddrrrdddSSSEEECCCUUUaaammm]]]lllzzzUUUZZZbbbJJJ>>>KKKSSSPPPMMM>>>>>>QQQGGGMMMcccOOOIIIIIIIIIOOO[[[]]]PPPUUUYYYaaannnqqqxxxvvvxxx|||{{{tttPPP000FFFDDDGGGYYYmmmjjj|||{{{hhheeeaaa???LLLaaakkk\\\tttrrr\\\jjjyyyllliii^^^XXXmmmxxxqqqqqqjjjmmmbbbLLLPPPYYYOOO@@@MMMjjjaaaddd{{{uuuqqqYYY```]]]UUUOOOQQQbbb\\\III;;;NNNWWWUUUQQQPPPUUUPPPNNNRRR\\\UUUQQQXXXdddccciiiBBBWWW}}}mmmgggqqqjjjfff{{{tttaaaOOOQQQ^^^```nnnsssfff[[[OOOYYYlllccc```YYYdddvvvyyygggUUUvvv{{{gggTTTXXXbbbVVVbbbvvvnnnwwwbbbrrrtttpppnnntttqqqQQQ[[[pppaaasss}}}mmm}}}rrrccckkkrrr[[[XXXpppiii```LLL\\\\\\XXXIII,,, ***000111)))"""'''++++++000+++"""&&&111999@@@>>>FFFLLLNNNAAA333(((###***......)))&&&(((+++111///'''222GGGOOOBBBIIILLLLLLNNN<<<999>>>333000000###***...>>>777///111///777IIIWWW@@@444999999111666999555111,,,///&&&%%%333777@@@OOOLLL777,,,444:::;;;222222666;;;444555666;;;:::;;;DDD;;;>>>SSSFFFAAA@@@<<>>BBBIIIQQQ???>>>@@@<<<666777777111444>>>444333999999111"""---;;;BBB444222<<<777+++::::::888<<<===DDD===???DDD<<>>>>>JJJNNN:::::::::888<<<;;;;;;???===;;;<<>>888999444222444>>>GGG>>>:::666333///---(((222111***,,,444555111999;;;666111000333---333333111999999555222*** &&&+++$$$###222%%%***111000***%%%***&&&---222###%%%///888666111---666@@@888222IIIUUUPPP\\\gggKKKCCCDDDDDDEEE>>>---(((+++999DDD???555999333+++777666:::III888''',,,777<<<777777444///---###$$$%%%%%% (((+++$$$&&&---111***###(((///444---)))---666888777222000000++++++333000:::444 ***,,,,,,***)))''')))(((''''''---333>>>???@@@999999<<<777555222???RRRKKKBBB???;;;888...///666:::,,,))):::;;;???CCCCCC>>>555777777000 %%%  )))111333000,,,%%%!!!(((...///(((!!!///777...000///$$$FFFbbbqqqiiiaaaLLL333%%%///@@@999***,,,,,,)))///,,,+++$$$!!!$$$---000000333333(((!!!(((%%%$$$---...###&&&---'''$$$333>>>777666++++++444%%%!!!+++...+++$$$)))666---&&&000QQQPPPDDDDDD888CCC???666555444,,,:::GGG:::222222///***'''222***---444888555///((( ***!!! )))### ######!!!%%%***,,, &&&***%%%'''+++111555555222,,,"""***$$$!!!%%%(((,,,,,,&&&&&&,,,444GGGGGGGGG,,,$$$'''$$$###+++999999444***444888000222///222777111...$$$999QQQOOO>>>%%%"""111AAA222"""444AAACCC111333555,,,$$$!!!$$$,,,%%%))),,,$$$$$$)))&&&'''&&&)))((()))*** %%%%%%(((000...000>>>===999!!!'''""" ''' '''333<<>>BBB<<<,,,###(((!!!%%%***"""!!!!!!&&&""" ---111444%%%)))???555...)))(((  )))+++(((+++...***%%%)))000666777+++%%%***)))(((,,,&&&$$$%%%***444)))111&&&%%%...111,,,(((''' """###(((((('''111111111666---###,,,///,,,)))"""%%%(((+++'''!!!$$$&&&'''###%%%---''')))%%%...,,,!!!!!!111+++"""$$$(((!!!%%%...'''&&&,,,...444222666,,,***%%%  %%%444000 ---...!!!$$$'''333<<<888,,,...999,,,$$$&&& (((&&&***+++###000$$$ ###///777444+++:::666///###!!!((()))&&&&&&777@@@777,,,%%%!!!+++555444,,,***''''''...&&&******&&&---222***$$$&&&&&&$$$###,,,++++++###"""&&&+++111444666999AAA333""""""(((&&&!!!""")))###### ###%%%111>>>555'''%%%(((+++'''###'''...999JJJ444&&&!!!+++--- 111<<<>>>???777---### )))%%%---+++$$$%%%"""%%%'''***<<<===111$$$555--- ###111555---111777333...(((+++&&&%%%'''%%%''' ...>>>HHH:::888&&&&&&###!!!+++;;;:::;;;666"""%%%%%%######$$$***!!!000===333+++------...%%% &&&""" (((+++111111"""'''+++...)))""""""$$$,,,777===;;;555,,,:::===...444<<<333((('''///'''%%%)))###!!!((((((%%%%%%''',,,   %%%###$$$---&&&%%%((((((777DDD999$$$###&&&'''!!!$$$''' 000;;;888444...###!!!---000***!!!%%%---$$$,,,*** +++333111444AAAGGG;;;888000+++///******...333****** '''000000+++!!! ((( '''###(((***$$$)))"""!!!(((''',,,<<<>>>888)))###&&& %%%---)))###''',,,---!!!(((,,,333,,,***555'''!!! '''...  ######$$$***$$$***444'''!!!'''&&& &&&---"""111000$$$###"""---000000!!!)))///***&&&'''!!!(((###///000***&&&***'''"""$$$---,,,###//////...///+++$$$ ---***((())))))&&&$$$ )))444...///444BBB999(((000555***$$$+++///888999,,,...666888333111''')))111444333)))888...!!!%%%'''######''''''"""$$$333777555...,,,*** ###***$$$%%% !!!###!!!***111000)))######'''---111+++%%%777)))!!!***'''######((('''"""$$$'''"""!!!%%%&&&$$$###,,,'''---000$$$$$$))))))///"""***,,,!!!)))000'''$$$%%%%%% """ ***'''&&&)))&&&'''****** !!!######'''!!!---...333888777999---"""(((///444---$$$$$$ """&&&,,,222))) !!!"""$$$((((((+++"""$$$,,,,,,***$$$### !!!''''''###!!!!!!!!!###!!!!!!'''+++***444333---'''$$$''' !!!"""&&&$$$"""111333)))"""000777???555+++333999333///...&&&'''%%%%%%%%%######&&&%%%+++111<<<===---"""---<<<;;;000***+++!!!###$$$ $$$***(((<<>>BBBDDD[[[gggeeebbbXXXRRROOO???444222***+++222'''***555555000...:::CCCVVV^^^YYYddd{{{}}}rrrUUUiii^^^QQQHHHIII:::'''""")))+++ !!!"""######&&&///888***$$$  ((()))###'''&&&---555000000///((()))333...)))%%%***)))%%% ###'''&&&...222...)))'''!!! ---///%%% <<<777:::VVV```NNN444333+++(((;;;KKKHHH;;;111***$$$(((***+++((()))((( !!!((($$$"""$$$&&&... %%%333111,,,---%%% ))),,,888555 +++333777---666AAAOOO444000BBB666&&&$$$ !!!***&&&'''777444"""###+++***######///222!!!$$$,,,$$$###555999(((!!!&&&******###  ###""" !!! ###!!!###&&&***///+++$$$***555...###""""""$$$333===@@@777...--- ###$$$'''(((111$$$   %%%"""&&&  """))))))222:::000)))...333666===999EEEIIIaaaSSSVVV]]]___^^^QQQOOO^^^kkkqqq___JJJDDD;;;FFFLLLNNNMMMJJJ???:::KKKkkkdddVVVQQQSSSQQQBBB&&&+++:::;;;>>>;;;333444333333666888---000GGGJJJ%%%$$$)))+++)))$$$ %%%+++222333333444:::BBBIIIHHHAAA999222---+++***((("""$$$000555000***((((((***&&&***222+++%%%---111&&&  )))777444'''%%%###""""""%%%--->>>>>>===::::::IIIAAA'''---((('''(((::::::...%%%""" ///,,,###+++333*** (((&&&$$$"""(((999???777...222444((( )))===DDDAAA666222333???HHH444333 ###!!!...222(((!!!!!!'''&&&111===AAA666$$$$$$"""%%%+++%%% """!!!$$$&&& !!!,,,///!!!%%%"""444<<<---%%%---...$$$ $$$###&&&''' !!!### %%%"""&&&:::GGGCCC<<>>???MMMRRRkkksssuuuqqqVVV333222...888***!!!(((+++)))(((&&&###$$$000000(((+++:::LLLHHH///+++(((***'''%%% ///"""%%%999NNNSSSaaannnjjj___kkk~~~aaaHHH;;;TTTKKKEEE999777+++111222111444444---***$$$"""***)))+++$$$)))***''';;;CCC<<<333333111...---///  (((,,,///555222555666'''%%%%%%''')))%%%///,,,+++"""...%%%%%%!!! (((,,,777JJJTTTYYYFFF@@@;;;777999;;;>>>:::555...%%%(((###444NNNCCC000...222---***%%%'''///333)))"""!!!###)))***%%%###'''%%%%%%)))(((""""""'''&&&$$$###""" !!!'''///---::::::!!! ***+++ #########%%%$$$,,,:::777 """---222888666888...///444;;;:::,,,000000,,,,,,&&&""")))333444333333NNNzzzuuu]]]aaaiiiooouuuzzzrrrVVV>>>111((( 222444777///---)))222,,,(((+++---111111666///222000...,,,$$$$$$...///222,,,&&&***+++***+++(((+++111999:::222"""$$$(((''''''!!!!!!(((///111)))...######&&&###..."""%%%###+++ (((333EEEMMMLLLddd~~~~~~|||~~~eeeXXXQQQsssmmmddd]]]QQQXXXRRR999555000+++,,,000///"""---&&& '''&&&"""$$$  RRR׆VVV%%%""" %%%+++888111(((------'''(((*** !!! $$$+++))))))...555>>><<<777222;;;AAA777'''...------)))######)))000---,,,===AAAAAAKKKAAAWWWgggGGGJJJRRROOOOOOLLLCCC<<>>333---###$$$###111888:::<<<222///&&&&&&///((( 000+++&&&'''%%%999444444555"""&&&(((%%% '''>>>222"""+++))))))***000,,,000DDDFFF---777@@@===AAABBB>>>AAA:::222000444DDD???@@@GGGAAATTTMMMPPPXXXVVV[[[XXXKKKAAA888444333333:::,,,777---TTT׆KKK fff㍍ ZZZ!!!'''!!!!!!(((''' 666111 ...222,,,)))333777999===888---333333(((+++999===444,,,)))222777444...111666777111+++000***,,,///---///888GGGOOOTTTPPPaaasssaaaHHHjjj}}}fffEEE]]]ddd\\\VVVUUUUUUJJJ???>>>JJJSSS[[[UUUWWWgggsssdddGGGBBBLLLGGGGGGAAA111777BBB>>>111)))%%%!!!111///,,, 333$$$000SSSmmm{{{xxxbbbVVViiivvvnnnXXXLLL>>>IIIIII???AAAUUUOOO;;;EEE???;;;DDD888///222CCCQQQSSSPPP(((,,,%%%$$$!!!###111:::---"""&&&(((+++000(((%%%&&&'''###%%%###)))777IIIWWWPPP;;;===CCC@@@BBB@@@===999777+++(((999HHHYYY___NNN666!!!)))((($$$!!!++++++///"""...BBBMMMLLLEEE555777222(((***999:::444$$$!!!!!!'''///%%%&&&000444999222$$$ %%%)))111555222000000000&&&777EEEAAA888111222>>>777,,,AAAEEE333""" '''+++!!!(((!!!'''000111'''***)))999CCCAAAEEEJJJ@@@:::@@@===444EEEEEE555===&&&YYY㍍SSS ꆆ㍍ꇇ"""333%%%"""///444''',,,333'''---444,,,***111222444222888HHH>>>999???HHH@@@;;;XXXgggllliiigggeeeWWWNNN???===777''')))999???;;;555<<<@@@RRReeeaaaTTTCCC;;;666999>>>CCCJJJFFF???FFF???>>>DDDOOOGGG555>>>KKK666777======>>>OOOXXXPPP>>>BBBOOOKKKKKKDDD111'''+++000"""+++111&&&)))000,,,+++***(((666:::999333111444888<<>>???===666***///===888///,,,,,,000888@@@KKKGGG;;;===@@@...)))&&&///===<<<555:::CCC???333444///$$$"""'''(((444666,,,'''((()))111,,,,,,//////,,,555BBBMMMSSSRRRIII@@@111///,,,(((444EEEEEE999===:::555000111111&&&!!!+++222444,,,444;;;777,,,&&&;;;???555(((***,,,((($$$!!! )))((((((:::EEE555)))???III???)))%%%"""***666'''%%%---000555...))) ###  +++...!!!###&&&###%%%///555000###(((///111///'''&&&((((((999888FFFHHH///&&&555222"""ꆆ###㍍ꆆ ꆆ{{{)))###㍍ꍍ///$$$'''+++""""""!!!"""$$$'''333???666)))222///666<<>>IIITTT^^^ZZZHHHKKKEEE666000333===CCCGGGBBB)))...222***,,,777>>>222 )))///555666---,,,444<<<===666...222333444===???AAA???GGG[[[___^^^OOODDDEEENNN]]]\\\QQQRRRPPPLLLMMMNNNLLLFFF>>>///$$$111DDD;;;555BBBSSSGGG000)))######""",,,GGGIII@@@999...000777@@@MMMDDD111666777000555DDDNNNZZZ___RRR>>>555BBB666444777555:::;;;999999999666@@@EEEAAA>>>///)))444444555)))000111222<<<:::444,,,222666444;;;<<<555###%%%---999<<<:::000+++444;;;<<<999444))) )))///666;;;222###&&&(((,,,...&&&%%%,,,+++$$$%%%...111%%%"""111888///+++---000---///222///'''+++%%%***,,,"""$$$""")))222000000BBB666%%%ꈈ:::222㍍ꍍ ------###,,,111+++'''###555===///...'''999;;;555DDDNNN???NNNZZZNNN{{{ooo:::555222<<>>OOO]]]SSSLLLEEE<<>>@@@999??????888:::666000666EEE;;;...555===:::000111111777777888666999<<>>888===;;;,,,###***===???EEE@@@777<<>>;;;AAACCCPPPUUUDDDbbb|||wwwkkkbbbUUUCCC<<>>???BBB111+++'''"""***&&& ???'(%###444BBB;;;666,,,%%%%%%)))%%%&&&///,,,)))+++&&&...000444555111222999555999NNNSSSOOONNNFFFOOOeeeggg;;;JJJRRRQQQQQQTTTSSSHHH@@@LLLJJJKKKIIIHHHIIITTTYYY```iii```\\\WWW\\\YYYdddaaaZZZzzzlllnnnvvv~~~cccaaaxxxxxxlllccc^^^SSSQQQPPPVVVQQQLLLNNNGGGIIIKKKcccYYYYYYkkkzzz~~~xxx```RRR___uuuxxxuuu|||jjjaaaoooxxxqqqllloooiiiVVVfff}}}zzztttyyyeeeYYYPPPXXXdddYYYLLLPPPNNNKKKQQQJJJ___bbbRRRMMMYYYqqq^^^VVVqqqmmmbbbQQQFFFMMMVVVRRRWWW^^^PPPIIITTThhhiii```\\\___XXXTTTEEE888EEE;;;,,,111333@@@QQQSSSHHH===777AAAMMM^^^\\\XXXYYYUUUMMMAAAGGGMMMIIIPPPNNNDDD;;;LLLjjjnnneeeXXXUUURRRPPPDDDDDDVVVGGG>>>MMMKKKBBB<<>>:::333000*** ###333999555---888,,,(((777>>>666HHHdddnnnvvvllloooooowwwooo[[[GGG:::======333cc#!SSwww~~~~~~www|||Ȼ##!!!+++888EEE>>>$$$$$$!!!((()))+++444888999999999HHHHHH999[[[666888555,,,:::CCC===AAAJJJVVVIII888999888:::HHHGGG???<<>>333EEEOOODDD888((($$$///777666222---))),,,CCC555(((444BBBKKKXXXOOOOOO___bbb^^^\\\VVVMMM@@@??????;;;999222333666:::CCC vvv썍(((((+++(((///777--- ;;;OOOZZZ___aaaGGG<<>>888222...222666>>>NNNMMMAAAQQQ\\\XXXaaarrrbbbKKKBBBUUUjjjxxxwwwOOOaaaRRRSSSMMMGGGLLLNNNIII888000000666@@@:::CCCXXXTTTJJJDDD;;;DDDBBB>>>===???@@@FFFLLLEEE===444666777>>>DDD999:::===>>>CCCBBB888444;;;HHHJJJ??????]]]ttt{{{qqq]]]YYYUUUOOOSSSJJJBBBJJJFFFMMMYYYdddkkkeeeMMMIIIVVVYYYFFFBBBBBB@@@===;;;???HHHKKKEEEHHHGGGGGGNNNOOOMMMTTT000222///000222444666CCC::::::AAA777888LLLQQQOOOSSSOOOMMM@@@DDDTTT```fff___jjj}}}sssooobbbNNNPPPcccbbbQQQRRRLLLHHHDDD]]]qqqqqqYYYTTT]]]^^^TTTNNNUUURRRYYYcccfffWWW@@@GGGYYYdddjjjkkklllppptttzzzqqqUUUOOOWWWWWW[[[eee```XXXFFFAAAHHHLLLNNNFFFBBBPPPTTTSSSQQQKKKNNNLLLJJJKKKYYYiiinnnZZZSSSVVVRRRGGGEEEUUURRRGGG>>>;;;IIIUUUTTT@@@333111666BBBJJJ999;;;555???:::;;;:::777444DDD@@@999777...***,,, %%%***999222555666=== qqq㌌88*333$$$'''222,,,???III@@@GGG```rrreee^^^WWWSSSOOOMMMPPPXXXqqqpppSSSNNNIII???;;;444444@@@KKK```PPP===]]]hhhXXXUUUcccTTTCCCGGGQQQ___gggfffUUU666<<>>CCC>>>555333AAAKKK<<>>AAA???AAAEEEKKKNNNMMMTTTNNN???;;;555555999>>>???===;;;BBBFFFAAAFFFKKKRRRPPPCCC@@@KKK???CCCFFFCCC>>>EEERRRpppzzzrrrwwwnnneeedddnnnpppiiiuuurrrZZZNNNTTTccc```]]]SSSSSSiiinnn^^^DDDEEEQQQMMMeee^^^YYY]]]UUUbbbUUUKKKLLLhhhxxxxxxZZZ;;;EEE[[[cccMMM444JJJRRRQQQUUUKKKKKKmmmmmmEEE???NNNPPP;;;666@@@AAADDD777???999000---))))))000)))444777222---555GGGNNN& mmmړ@@3888000:::888444999333888VVVaaaUUUEEEKKKYYYAAA@@@FFFLLLVVV______fffeeecccWWWQQQDDDOOOTTTCCC555555666777===444===CCCDDDDDDCCCKKK[[[aaa[[[KKK000@@@NNNOOOIIIMMMeeedddbbbiiifffdddbbbjjjeeeYYYMMM>>>>>>DDDEEERRR]]]\\\\\\\\\___eee\\\PPPQQQ[[[UUUTTTVVVMMMHHHGGGDDDGGGGGG:::FFFSSSXXXPPP[[[kkkqqqnnnlllmmmiii]]]TTT___]]]UUUCCCjjjjjjWWWWWW]]]uuulllhhhzzzppp```fffcccUUUBBBQQQhhhgggYYYEEEHHHIIIHHHKKKWWW```YYYSSSMMM???hhhjjjiii]]]HHH<<<===888999MMMSSSNNNFFFLLLJJJDDD:::AAAPPPIIIAAA<<>><<<555000999,,,'''...(((###333444000---......444222777<<>>FFF555(((777BBB;;;EEEJJJAAA;;;666333***...<<>>666555<<>>===666444<<>>@@@@@@666===(((...111%%%666KKKKKKQQQTTTWWWWWWLLL111)))000+++333555222;;;OOO[[[UUUJJJ#{ dddȔ63)&&&...&&&'''888,,,+++333555///BBB777:::NNNJJJFFFOOOMMM;;;777;;;LLLMMM===222333666999DDDBBB444BBBBBB???GGGXXXYYYSSSZZZaaaccc___]]]SSSOOORRR[[[dddaaaRRR\\\___OOOIIIGGGEEENNNLLLLLL[[[VVVbbbSSSXXXuuu|||qqqYYY]]]]]]ZZZdddbbbHHHQQQdddZZZKKKVVVWWW___kkkbbbiiicccaaannnuuu```PPP]]]wwwyyyqqqvvvqqqjjjbbb[[[XXXPPPDDD666444444444<<<@@@DDD<<>>@@@???AAAIIIUUUWWWHHHGGGGGGLLL```[[[KKKLLLBBB===NNNNNN@@@000------$$$******&&&)))&&& ((((((###;;;222&&&)))&&&+++DDD===;;;CCC+++888AAADDDRRRUUUXXXUUUdddjjj]]]___[[[IIIEEETTTVVVEEEJJJDDDKKKUUUdddwwwgggppp~~~qqqkkkXXXLLLGGG333555BBBRRRQQQPPPMMMNNNFFF???888JJJ@@@999222@@@QQQTTTHHHBBBLLLUUUPPPIII??????TTTHHHIII```^^^gggxxx{{{rrr@k Ⱦ ```x0+"111...---,,,///666888555BBBBBBLLLTTTIIIJJJRRRNNNVVVVVVPPPVVVZZZLLLJJJUUUDDDIIILLLGGGGGGOOOHHH666:::===DDD???555AAAHHHIII<<<222000//////000...777;;;>>>BBBCCCEEE???:::???LLLSSSKKKaaaaaaNNN777RRRiiihhhXXXYYYssslll[[[XXXOOO555999NNNRRR___\\\YYYdddjjjLLLOOOXXXQQQcccttt\\\bbbpppxxxiii```lllnnnpppwwwggg???,,,222666EEE;;;999BBBFFF999888::::::777+++@@@OOOH@@m&>99UUUfffddd```kkkxxxooo[[[SSSPPP\\\gggcccUUU\\\lllmmmeeePPPAAAGGGFFFGGGSSSJJJGGG\\\[[[HHH555===CCCIIICCCSSSTTTTTTMMMDDDBBBDDDYYYgggWWWNNNVVV\\\SSSJJJ;;;111///+++)))))) ---555,,,***&&&!!!...$$$(((%%%$$$"""(((***...)))+++:::;;;333,,,"""...,,,222444444BBB@@@<<>>HHHSSSSSSOOORRROOONNNddd^^^YYYZZZRRRPPPUUUggghhhUUUUUUEEEMMMSSSFFF\\\[[[PPPTTTWWWCCCJJJZZZSSS999333>>>@@@MMMNNNOOOJJJCCCOOOVVVLLLUUUPPPIIITTTYYY||||||lllcccjjjeeeccc3\ [[[{tm5.''''///))) ###///555444;;;AAA>>>IIISSSVVVaaaaaaYYYMMMQQQDDD777QQQNNN```nnnfffGGG>>>888777@@@OOOHHH;;;BBBLLLMMM>>><<<<<<555,,,333:::***'''666555000000222>>>GGG>>>333%%%++++++555666)))666BBB@@@:::666BBBGGGIII;;;777222888000''',,,555777999;;;===666888>>>222444KJJKCC=<>>AAAAAAAAA???;;;555555888777===AAA___iiikkkhhhhhh]]]JJJGGGLLLSSSHHH666IIIGGGbbbqqq]]]WWWdddUUUAAA???;;;444BBBHHHLLLUUUQQQRRROOOEEE,,,+++///666<<<888!!!***...&&&)))&&&!!!""" ###&!!& &&&%%% ---)))!!!!!!&&&***...444555*** !!!"""(((+++ %%%///777:::888CCCHHHNNNQQQQQQOOONNNKKKHHHIIIJJJHHHMMM^^^iiiiii```VVVQQQGGGYYY[[[KKKNNNXXXZZZaaaddd^^^hhhmmmhhhRRRPPPLLLCCCQQQ```______TTTMMMLLLQQQJJJNNNOOORRROOOOOOYYYdddkkkhhhMMMJJJi'L WWW{snceeeeeeeeeeb1)#---CCC222$$$)))***)))===QQQVVVUUUJJJ777FFFTTTSSSPPPDDDTTTAAA///LLL;;;888;;;777444000CCC<<<333???EEEBBB@@@IIIAAA,,,///---+++***111,,,,,,$$$''')))'''%%%(((444000111222%%%)));;;000%%%)))555@@@444(((+++000###333FEE_40_51@??111((()))(((555888-*)333***///111***S)&Q&")(((((...+++---222666(((###"""((()))"""!!!'''&&&,,,&&&%%%(((///<<<555.** 5--444777BBBJJJ<<<888@@@CCC>>>555(((***$$$000444:::LLLYYYYYYUUURRRTTTMMMGGG@@@LLLSSSXXXaaaggg```JJJAAA666333:::,,,999===:::>>>RRR]]]MMM777...(((---$$$ '''-%%0//&""&&&$$$######-)) B  %%%777777000///,,,&&&%%%---444,,,---%%%111777222222111222444AAACCC>>>===:::BBBRRRTTTPPPLLLSSSWWWWWWWWWQQQWWWbbbYYYFFFLLLTTTSSSkkktttlllgggnnnzzzqqquuueeefffWWWYYYgggjjjmmm~~~}}}o=eeeeeeeeeee< RRRtlhBCCCCCCCCCCA% ***,,,***???KKKEEEJJJPPPQQQJJJ>>>IIIIIIEEENNNMMMJJJUUUYYYFFF;;;999333;;;;;;---111///111111000...***(((#########---%%%'##***%%% !!!P&!^4.-)('''---%%%&&&%%%222000(((!!!***"""(((999///0++Y+%:;[+$/'%,$"621###$$$444m'!N 333444,,,---i,.&&&$$$***333777)))$$$'''---((($$$!!!%%%6/.gp!T)$;208/-Q# #&#"---777777999111111777???5--/++000;;;///888BBBCCC999666;;;KKKGGG...999TTTSSSRRRNNNHHHDDD>>>222666???MMMAAAJJJ???BBBbbbggg```SSSEEE333(((...'''###***:o , S !!!######%%%+#"g +##'''"""---$$$+++***(((+++777>>>AAA666(((''''''+++666333888(((,,,))) !!!+++((('''///555---111CCCEEEGGGSSSZZZZZZOOOLLLWWWRRRNNN\\\OOO;;;@@@NNNLLLMMM???FFFUUUFFF===;;;IIIdddlllaaaUUUZZZiiidddfffqqqiii]]]^^^gggnnneeeUUUXXXppp{{{V4CCCCCCCCCCCz*NNNmdb""""""""""""+#!(((777999999///===^^^hhhggg```III<<>>IIIDDD555777666000777333888===BBB777444<<>>333222,,,666HHHSSSIII===888:::<<<<<<777### '''($#&,#'''%!! y =.#" $$$%%%!!!%%%***000*** +++***---"""***"""---&&&!!!...'''"""(((...111555:::;;;FFFUUULLL>>>AAAGGGDDD<<<<<>>222------HHHTTTUUUGGGBBB<<<999???EEECCC<<662[yUC5$J '''7mH.f;$2" K """"1)(, B8 %1&%L!WZ1)(%%%'##!!!$$$&&& (!=@$%222444444...---000222111222===888999HHHBBBQQQqqqjjjZZZ___KKK777777555555444999222222------%%%,,,---$$$X F:I# +##"""A';/+' $$$"!!B%F:!!!###)))!!!###&&&333<<<***%%%???999333333&&&###)))---222===IIIAAA666333222:::YYYUUUKKKJJJ===EEEVVVNNNBBB:::FFFKKKZZZTTTJJJAAA???@@@;;;666444@@@<<<111---"""---AAA;;;:::BBBFFFu(" [GGGldd_WWJJJ---444DDD<<<<<<999666===KKKZZZXXXFFFEEEFFFLLLOOODDD;;;<<=({1) \'##***&&&'''"""#-|j" -% yN)))!!!BA###&&&(((I# +=T[Olf},*"!s#XQ@7)2 ')n &&&$$$ed"""8h H'&&4$!9}zLu##"""""111444111000&&&"""1--# dd?07 """!!!+++222!!!111111333444444+++...JJJ\\\XXXNNNSSSQQQ@@@AAAJJJHHHDDD222&&&'''******)))&&&$$$###+++)))':_9cd#4l>+"""""((()))%! X b ] !!!!!!$$$ &&&$$$!!! ...@@@@@@///444666333888555GGGRRRJJJ777AAAPPP\\\ZZZ555555AAADDDBBBEEEJJJBBB999+++...222>>>;;;555666222>>>:::>>>JJJ111!!!222@@@CCCEEEDDDl#" nBANNNe__z}}}}}}}}}}zLEE999111===000999KKKEEECCCBBBHHH@@@JJJUUUKKKMMMUUUccccccPPPAAA:::KKK>>>KKK;;;@41UOz$ )$#%$$$!!!w+P !!!*$n)&'7 """!!!###### lNXZ}kLLsE0HNTiX!$j #dd -A$$$$$$####$$$&&&)! 09?/f ...///%%%%%%3+*2tvd +++......555000999---###'''---333///...111555222666KKKQQQNNNNNNAAA444+++,,,///555&&&+++###$$$### !"kuk;W#Ma fE/PNM'''''''''+++"""%%%///+++,,,///---)))...)))---777YYY___KKK777AAALLLCCC000555DDDDDD555666777111222))))))>>>444333AAA@@@111BBB:::222@@@999---888===777555>>>^}}}}}}}}}}99xx}}}???|||}}}ojj^^^^^^^^^^^\C>>DDD777HHH>>>000CCC>>>@@@SSSDDD111222555222JJJTTTNNNKKKFFFOOOCCC;;;"""***V(_rkM7t&$$$.**+"!(! $##(nJ (((///Mua4'Bd+"!!!%%%+++Ign]V;)YpPIoiG *g #5    &1)'A53!d '#""3{` ...---((("""*&&)%%%%%&&&///...000333111)))***???BBB@@@GGGFFF===BBBGGGIII>>>///222***///[)  gSc   '7! -fBIuW ((($$$))))))###"""555222###"""000333444///***(((444666AAAVVVMMMFFFYYYTTT:::222777111***???>>>???MMM<<<666666BBB666:::BBB:::888;;;AAA777===;;;@@@>>>===555@@@L^^^^^^^^^^^9 vvv}}}}}}vvvyyy:::tttuuutttmkk0//444111???;;;///;;;===:::AAA666333(((///999EEECCC;;;BBBGGG;;;...,,,$$$,$ AMknZ7c YL #!]|, C( 6Sxe2K|Q$""")%$///---%%%'?N*7.4+9-+0#=Vvl:2tS-m ######%%%%%%%%%Z^*&&!!! '''iQ"'"%%%+++&&&+&&} <|ncudB }iI.*)---p'g---&&&222---!!!//////+++666,,,,,,111,,,+++:::DDDDDD888***&&&%%%%%%&&& $$$"""nRmQh ...&&&h`v$D>Ci}- o^Zp' ###&&&!!!###...1))A000---"""$$$...+++,,,888CCCMMMZZZccc[[[III>>>:::>>>CCC777<<>>===444333DDD999222BBB)))'''%.-Opa2"(JZw" L !A~X!iOrk1S. \111,,,%%%2.-j$-)(;76w%XD@IDC@@@[[[sssjb_vLQ4(46K sB+ a{%s&&&&+##I~ _" """,,,;;;:::222,,,$$$...'''###%%%: ;Ob & CDF+z' ZD6xS\5 $$$ ] <5-,$'''%%%###000,,,111111111333FFF\\\```aaaLLLAAAHHHGGG777555333<<<555888@@@BBBOOO@@@444===<<2`__YYYqqqwww^^^fffzzznnnsH=*1(yJD(\TTRRRBBBr'WONNNNIIIAAAEEE;;;0007778882..622:::CCC===IIIJJJPPP]]]cccTTT;;;&&&L&#x'!%3777&&&<&H2d to?f .&%  $&%%!!!$$$###$$$ &&&$$$  djK&$q#,(1,a",fl`"i.&%,,,((( FH ! #F& $ ###***111...///)))000999JJJ___kkkfffSSSEEEEEE...:::KKKDDDHHHJJJ@@@>>>888222555777444777444,,,000DDDHHHAAABBBKKK>>>RRRe++sssssssssss?___eeeeee___...]]]]]]]]]\UUB::000'''&&&333444111666888>>>CCC000CCCQQQVVVSSS@@@???888%%%%%%---777(((""")))***###&:':!2,)!!!'Qg@B{lr|{",y' ,,,777...666>>>===EEECCCEEEEEEKKK1(.$^VUWWWVVV\\\\\\NNNSSSeeeiiihhhc__d\[hdc___vGC"$OGFKKKjB?81[WWaaaiii]]]FFFDDDDDDDDD@@@>>>FFFVVVZZZRRRUUU```ccc^^^___TTTKKKIIIOOO___5/x.$EEE666'''L3?,o"L"4,+[+&YuoL#f$$$*"!@-e e jg %$$$ &&&%%%%%%&&&$$$%%% (>hMg7vn_L2[  |G{a(%%%, >F)""HQq&###"""(((:::777888@@@CCCAAALLLZZZZZZLLLBBBGGGNNN111666CCCEEENNNLLLAAAPPPFFF@@@999777AAACCCKKKCCC<<===222000...444777999???RRRJJJ???@@@EEE:::+++"""%%%333777...!!!555 &&&)))(((!!!] ZmP###)%%8(#:F0,UcFSWy(&%%444BBBMMM```wwwbbb```XXXEEE<<>>EEEBBBAAATTT___vvv}}}eeeSSSfffmmm]]\UMLh93}/)^VVJJJ@@@LLL^URF'j;7h=8o%B>>C??9t_' h5--6.-, 's] GA "  """$$$'''@ orc]ytJ? !!!([j\.+#"!!!k!rig%y+.f (## #?'( 000((("""###111<<<111000BBBMMM]]]WWWEEEFFF???FFFIIIFFF:::GGGFFFMMMXXXXXXCCC@@@HHHHHHLLLQQQGGG999AAALLLHHHDDDCCCLLLNNNSSSXXXVUUy-)TQQQUUUUUUQQQ'''NNNNNNNNNKCA3+*888111222;;;???:::222EEEhhhssshhhRRR@@@666...,,,###"""!!!888&&&='##Bs! A}If &---+++I(I&SpFWC=<>==999666AAAEEE***'''666555===FFFBAAH@@EEENNNUUUVUUi;7!( MDCBBB>>>FFFUUUaYUK;))Cg<7???R/,sM '?r5*TwR4$#&&&$$$!!!%%%%%%---:::>>>...EyveL R|OO!""",,,...###."d*rbt!{.}|3"%A)))###'''666---'''JJJhhhnnnUUU@@@IIIKKKIIIEEEJJJ...LLLVVVXXX```___GGG333777666888:::@@@DDDAAACCCMMMTTTRRR@@@888TTT[[[EEEw)^JJJNNNNNNJJJ###GGGGGGGGGJB?666666666665.&#+++,,,777===IIICCC<<<>>>EEEVVVKKK555333333///+++ &&&,,,((( #1`sc?/"N")!"""!p&p5v{zYJCLGG07:V`\4CBBEEEA==PKK___WWWXXXvSNgccbZY(BL+OHG<<=PPP]]]kkkfffXPN8O>Ymq#''''''ss[<91YY\y@@ &&&!!!000---###%%%(((''',,,""" !!!$>n7Ht&1 w)M"###""" A3 be2a. 0 )!!!"""///###+++...666EEEQQQIIIBBB;;;<<<:::;;;OOO555GGGUUUNNNDDD>>>:::@@@777888:::999CCC<<<:::<<+2bG9 l"}+ t&x& 9]byGn @&:VnAl5,!Q=9A-*' P<O@=>65v'2$KJJ999510.wG>>@87t(z,#Z0+MLLkkkfffZZZ^^^OOO`614Acns)333;;;ty{|xfT3aro/ %%%)))!!!+++:::>>>777((($$$!!!3= n Dib>$]w5z 8 1!a $ $:x{dm@  '''555;;;<<>>@@@HHH999DDDUUUaaadddMMM;;;BBBAAAPPPRRRFFFNNNbbbcccJJJ555???FFFOOOPPPDDDRRREEEDDDP#YYYYYYYYYYY~0<<7wzzzzzzzzzzwIB<@@@AAA444777111444666222======555???777111&&&!!!'''111'''D Hs" '$$ >/jueCDb][E4^yL@9)K<;443;+(0[rG6.,---444===>>>888?;;F=:D<7E=8=<<@@@IIIUUUQQQx-"w7#???999?<==AAA888000444CCCHHH[[[oookkkUUUNNNMMMQQQ]]];2CJA_WV[[[TTTuefprWG#Yn{:d!!! (((!!!###,,,#r1Xj =F $$$+*6hn1yjAQ]B_TK] }T|z,*"! """)))+++)))'''***)))(((&&&;;;KKKNNNHHHBBB???@@@@@@PPPIII===<<>>GGGOOOLLL666444)))!!!!!!***######,,,#}C4 %Ae UGERw[@74IEENFDbVTzSOdXS3^](]URDDD;;;888u( X> CCCXXXgggnnnaaaVVVZZZSSSEEE999:::HHHLLLPPP]]]aaa```YYYOOOEEE]30'y+!PHGWWW\\\YYYu,'<;y+ I=95)'jI}A} ###&&&3$!Hk& ^ ''')))-,,4$"=T v%Ev|3?y NtuWEZc@ F '''''',,,***'''===DDDDDDAAAMMMZZZGGG===GGGOOO@@@CCC@@@:::===IIIFFF777666111888GGGAAA555>>>JJJGGGAAAJJJRRRZZZ```\\\QQQs'N///111111///~~~*********A=3UQG555///999???CCCGGGVVVHHH666555(((,,,$$$!!!$$$ )))3l7V (v$5xb9 3ATdVIA?@@@BBBX2/% *:GBi]3'666BBBHHHFFFKKKZZZYYYUUUggguuunnnZZZOOOUUUUUUVVVfffpppcccSJJG??DDDDDDNNNfffՈw!|/*6.nC>JJJFFFDDD110=-'d6A %%%&&&((("""!!!%%%( Dm.p& ???;;;+++---///7/.S$;e|F%u'4,*3//|-"Jy{vqL?S#|)23+ k CHkj +#" """"""+++### ######)))---+++777FFFXXX[[[VVVXXXLLL;;;DDDAAABBBOOO@@@111999?????????888???PPPYYYIIIEEE???<<<<<<<<](((******(((######$$$A?3RPD>>>///CCCLLLHHHDDD@@@555111'''"""888111!!!)))!!!...< `@ #: HjfpIBVVVUUUTTTJFE<43@76D;:w)#>^S-?75111333LLLCCC<<99g!1--000&&&,,,"""(((/+*2 Y+I>=OKKSJIF=<[0+/#>]3d63AAA===GGGYUT7,!0J?BsIBgqvV5)%***+'&*"! $$$)))%%%###!!!###!!!"""&&&999???IIIGGGNNNUUUTTTNNNBBBAAABBBGGG===555<<<<<<666BBBDDDCCCIIIHHH???BBBHHHMMMSSSSSSQQQ;;;BBBWWW[[[SSSQQQUUUSSS(l"""######""" ==0=>>MMMJJJSSSaaaggglll```OOOGGGCCCBBBGGG\\\aaaOKK%1>zJAfbbfffdddXXXSSS]]]HHHWWWZZZ]USIYGixG|2)LLLAAAIIIPPP===G)'910t/"?;:GGG???***,,,666222---333333L")T&"GGG<-84)8?I^V7"RQQ___XXXPPPUUUhggjba^RQVRQNMMSC?@sr>3(%/'%(~7,,,***###!!!"""&&&***&&&''',,,---"""%%%+++&&& &&&$$$111BBBOOOLLLCCCCCC@@@AAA===888CCCNNNKKKSSSLLL@@@EEEJJJBBB:::>>><<<:::333888EEEDDD999888EEERRRPPPQQQddduuuuuu2z <>1666555,,,555666111)))(((&&&///444+++!!!)))  D) 7_wd8:"i6,BjkkW:lB1JFE[[[hhhhhh___\\\ccc``````SSSC;9\8\2,???>>>QQQNNNRRRdddiiieee___???666EEELLLDDDGGGTTTWNM%cR9H@>JJJ```iiieee;;;IIIQQQ[SQSoq}L2 rjjgggGGGRRRooofff[XWIIISSSQQQ???GGGBBB999;;;999666...///666a;8B65OOOeaaPmS""*d4-X-)}2(fYWh`^]\\TPPyOEe2KO1pppzzzyqo}RKg<7d;6g@8RIG5@ 3'&*"!'""&&&---,,,%%%$$$///444!!!#***%%%!!!,,,BBBbbbbbbYYYCCCCCCPPPMMMRRRUUUrrr}}}gggEEEFFFQQQNNNPPPPPPPPPEEEKKKXXXSSSEEE???ZZZ___RRRMMM\\\oookkk/99+CC5999444:::GGGDDD999...****** ,,,!!!333 !!!!U\D1$C{EW% 999>>>`1%pY7k<0C;9B>>EEEKKKmmmiiiXXX[[[nnnnnnWSR4qb3*887IIINNNMMMLLL>>>666CCCPPPCCC<<>>CCC===444Q*(Y.)=53F:8{1'^3-DCC;B/!(fuEB(MXGNK(N_rfdnnn```VVV```H/R-}NIDn^)))'''$$$&&&!!! !!!&&& ###> ***000000---333777GGGRRREEE444GGG;;;NNNaaaMMM[[[aaagggeee]]]SSSZZZfffhhhjjjaaaAAA===NNNQQQBBBFFFBBBFFFGGGGGGFFFBBBJJJKKK"11#77)...777@@@DDDMMMJJJBBBBBB999...''''''"""***!!!###"""###000!!!"""?j B6U"7cC!D53T0+k<'|T7$_SRjjj```YYY[[[UUUJJJSSSUUUYYY^^^TTTJJJGGGc844/B;9999<<>>GGGIIIMHH.>EPgWsE5WSRKBA>*'<Vyh7 d\ZPPPZZZoonW98-4 0)(,('%! ......### %%%)))555???222444BBBCCC555333+++444CCC999DDDEEEJJJQQQRRRIII]]]tttyyyrrrYYY777444GGGNNNAAAIIIBBB...---@@@KKKHHHGGGTTT),,% 'LLF:::HHH:::666<<=9Ez@kcblllsssooo[[[PPPDDDDDDQQQcccjjjhhhXXX@@@666I#! K,IA?JJJ===CCC]]]VVV@@@111---%%%######***//////---)))Q'"% :20777000---;;;iiihhhQQQ???LLL___njih`_ofepdb)5,kkkeee90(P9;2fbadddbbbUUUQPP\UTTSSHHHAAAHHHMMMTLJC)SrB.3+0ӆ p:j6X-Bi." Kz}+ "'+'&8B&&&,,,000  ((("""###&&&'''---***555999777<<<888999999===444,,,>>>KKK[[[UUURRRVVV[[[JJJHHHNNNNNNDDD222...666AAAGGGKKKFFF===DDDDDDDDDYYYvvvW :7,MM  [[[***ׇYYY555GGGJJJ???555888777333...,,,***111+++ )))+++!!!||C  2 MMB=)'~+jnC? dD9Ay+3'=<8Usz^WnoK,4*&u"d<IAAXXXWWWXXXNNNKKKQQQOOOQQQVVVKKKFFF@@@:::DDD<<<40/<41MF@sH.nrv'@<;999222333777@@@444***.&%`####$$$ ###,,,844N$!b!%%%$$$,,,777rrruuuqqqccc^^^ccc___TTT]]]OOOP)' "k<6sHBXu^VNMdddbbbMMMlB=" qB5CBBDCCPHGKGF4%R/C|nY[uV@2" GbV $$$"""***---999555'''!!!###555666===LLLQQQZZZVVVJJJZZZnnnaaaQQQ<<<@@@MMMSSSOOOKKKKKKJJJ???>>>:::;;;]]]hhhRRRJJJGGGtttFFF؇KKK \\\㍍(((^^^&&&888JJJAAA222GGGBBB***111333444///%%%!!!444&&&&&&''')))333L&##&Rzc8 @X?%RZw)<98333:::}6'P6"jL.O: [SJ: 92[KI70)E:9B:9 }( VW]/#999DDD???EEECCCOOO```fffLLL@@@OOOe>6^70OOOVVVIII555111AAAFFEg<,=8PKKMMMJJJ>>>000+++G(&0,,(((f23*(///000...***,,,***+++333))) %%%###"""###***GGGNNNIIIFFFTTTYYYZZZVVV===999+++5)(&JJ].(GGGMMMGGGGGGw)!*1-{'m("z*Sxge6'Z/,0Jw,+%^KL ### &&&***333999<<>>555===EEEJJJ;;;<<<555999VVVZZZJJJ777999AAAHHH222000kkk㍍SSS ꆆ&&&㍍ꇇ000777,,,,,,:::///,,,---777888111,,,+++!!!"""$$$$$$'''!!!***666&4}{{H0!P1! <Gl!666;;;111@nG9ue?!ra^skjlll`__[TS[[[]]]PPPLHHaaa___d]\qig2-L94lC>>@@@DDDTTTaaa```OOORRRyQLvOK[[[LLLIIIWWWJJJDDDEDDJFFQML^YYKKKVVVRRRKKKBBB@@@733)))g KE """'''...222,,,))) &""""",,,777444... %%%+++,,,333111---222888:99S)%% l:CBBSSSWWWLLLLLLt'"2$/$6-^3.<87z,$6AYxVrC9DDDFFFPPP^2+6G~a;( I@ """$$$---222555444555000'''555???AAA<<>>FFF???///777MMMIII<<<,,,$$$***AAAHHHAAA===RRRZZZ;;;ꈈ!!!㍍ꆆ ꆆFFF777㍍ꍍ666FFF666###---,,,000###"""333111)))888)))%%% ((($$$~)  ,$#Ed^}L6  M'#n$J1%$1--1119XIOjS-5QMI\?7 sQNXXXJJJUUUXXX___ZZZFFFAAAKKKQQQVVV2*7BK6.XRdddJJJ888999IIIVVVRRRAAALLLVVVUUUKKK===KKKaaaIIIGCCn-*C??=53{5?41111...***$$$***n! l  )!!N $$$444######((($$$!!!+++&&&###???555555>>>q'\Ea73NNNMMMWWW\\\XQO 3(6C'RJIEEE===w*"'")@L-WGC^]]RRRQQQMMM>>>CBBj;5HwvlODHcj7Izq.[._tl @  ,,,??????CCCEEE???;;;@@@<<<888555FFF<<<111)))///999666CCCEEEEEE<<<888???777666888333///LLLLLL222333BBB444///BBBVVVfffnnnpppCCCꈈ~~~<<<---㍍ꍍ~~~NNNPPP666'''///***&&&&&&$$$222222))))))$$$"""$$$$$$,,,222&&&!!!"""}i Q# {Yz(n G|e #( U& L&#%%%g Jj{Tf> C~[bVRllllllUUUNNNPPPSSSJJJFFFAAAXXXfffF'jTK7'UUULLLCCC@@@LLLiiiaT|VJHHH444HHHEEE999===AAA>>>HDCp("1)(m$kL>x*A$$$!!!y.l! """!!!///666...((("""&&&666222&&&...)))...955C;:y,ohSC>IHHOHFJJJFFF@@@H@<>(8='J:6^3*q$2'\1.OGFwH@2%pD?XXXUUUUUUOOOKJJVNL]TR@/Ti8%m:?31b)2D,733-%"&g 4mS" %%%---///))) (((,,,@@@LLLDDDSSS]]]OOO:::777111CCCBBB111555...)))...)))<<<777666444((()))333000333...333222888222111@@@777222DDDTTTUUU______:::---;;;FFF222~~~HHHRRRBBB$$$,,,VVV555GGGCCC>>>999---...***888777,,,!!!###$$$!!! ^=pz)  ,Yt$###<<IWe K f bm5;x_h0&TF2WWWJJJkE:R%I#d>6MMMJIIT.,KGFXMI~C->64>>>===HHHYYYTTT`QMdjOKJJJJ>>>JJJUUUFFF>>>\1,097.,k!up! )! """!!!o'cg$$$!!!###!!!73 4+*1)(000)))%%%''''''###$$$***D%!,('3//02VJIi:/@m?4DCCDDDa71^`QmJ7oH"_52`:7RRRYXXpEA-@/NNN;;;888888RJI8 @8)0X%H86P&"''&Ig!!!!7"; 2'%0000006nM$   ###$$$%%%'''"""000777<<<888,,,***<<>>444///(((777;;;999???KKK999<<<444&&&222???PPP@@@222III<<<777...666999...,,,---777:::///222888AAA000222;;;111...&&&EEE  555555999///***...///333%%%+++...222>>>444///555222$$$###...333===???/// %%%%%%{zz"'g>9 _b}+xtQ5"0 _D( ;#k^@/*W~.910/,+N6u,"|*!b2,4! 911///+++111333;77D;8Ci92QQQHHH>>>666333>668[2)%*"!z3 gU/#  $ *!)%% $ $ $ZZ Z ;}s} "!!!"""!!!$$$$$$"""---<44v%'X3qU.*q$jM6[z1&888333333~0?%CBB@@@888---<42R d'9d#>####""#!!!UghF  ---///"""'''LLL\\\[[[NNNDDD999???444:::;;;;;;444333???FFFDDD666111888000555>>>444///666AAA@@@>>>FFFAAA@@@444;;;///%%%(((666@@@999///AAAOOOSSSYYY???>>>+++%%%"""(((+++---;;;EEE/// $$$666DDD888111;;;CCCIIIJJJHHH@@@@@@******666333666111,,,---------000666888(((***000((( zzzy0 ^ {( hb  T~Tdit[q GGX%Cx6'&}a37(E:BiR'"$$$)))$$$T9*%LxE>=@@@555"""0('!0#If !   $ )-#zsi&&&""""""!!!!b  *%%%%%'''%%%,(()aK % p^p6+F<T% 954333:::&&&H400888FFF888t,(  0$#...;;;DDD888###+++,,,%%%((((((z'^M<  ,,,++++++444OOObbb[[[PPPDDD<<78'$3xx JdwXMK-%$###***###$$$)%%1((=+." "!!&&&111--- .&%+p "  Z a!+{z\ &^"""I"' *C_, ){z3u#2",++,,,'''###-,,622%%%///...;1.))*&&&&&;;;888888YYY```DDD333222&&&&&&+++///,,,}-RPy'  ///===HHHWWWQQQTTTYYYVVVVVVRRR666JJJQQQBBBBBB777***)))$$$***((('''===AAA)))'''000777<<>> :::444999EEE888555;;;,,,///777888>>>AAA777///===&&&!!!+++111!!!!!!&&&$$$&&&,,,...###uuu+#!Ap  $\?Tm (OI Q#dndx@7 d>7*XSS{K;1!!!&&&%%%!!!&eA''' #oP,$"   ///  =_#www<\ V """i Ugwz_JA/>bS&F***######""";y.!!!!!!! ,,,<<<000)((G!!j "TjL?Zc.  @@@UUUUUUMMM@@@GGGEEEAAALLLKKK777...111777666...///+++&&&AAA///111666777>>><<f=3#'### k# 7#Y   PO#"""*#"U -Y9@  dC +++---444666???VVVOOOHHHFFFJJJXXXKKK:::333444222555......:::111""""""000222'''111000)))...,,,111;;;EEEDDD555222---%%%...:::BBB@@@111777555444666@@@<<<:::???SSSUUU@@@333---333555444BBBGGGDDDMMM+++222888111'''777...&&&((('''666555((("""!!!333......444///$$$)))+++$$$(((<< Ad&Rzt]/ ibK` (((###***/# gr  ^  """%%%000!!! E Q=""" !!!(((---DDDLLL@@@HHHYYYXXXTTTGGG@@@AAA888!!!555888///***%%%(((///%%%)))///444888------555,,,'''111BBBHHHGGG<<<555,,,:::555&&& ### ,,,<<>>DDD777***###888111111))))))---'''...555222...&&&...999+++&&&888DDD777JJJHHH/// ###'''""")))777;;;AAAHHH777888NNNLLLHHH???777111,,,...+++(((+++>>>EEEIIIAAA000(((!!!&&&222222((()))$$$$$$,,,***,,,,,,### ###%%%111KKKDDD666333???>>>///+++)))***__ M#L` , 4 +K>>=  ^j %!!0(%.PYzM > w6U".#"K""""# j<*"!"""   IhVx-   ###%%%"""///222555,,,'''222222---/((vvv(   g1:^ &"!j!j _BE :CBV  9 1   22280/&^o   %%%+++$$$444:::222///FFFZZZ\\\UUU[[[eeeXXX555---JJJQQQBBB>>><<<111BBB;;;222:::222///***(((---''''''...... $$$000666///!!!,,,444BBB???///...$$$---::://////:::999444>>>000)))---000222333,,,***222111)))---000yyyjjjiiiaaaUUULLLBBB333???FFF===777444555:::555)))!!!+++222 %%% ***444555888AAAGGGAAA===AAA999%%%DH   k2 * r".^*n ./-%$&!!&)OBFNn  # [F   [`7   !!!###111???LLLHHHEEEAAA;;;;;;777+**M'$www  $1_  !Xi    b 8 .    bsf  !!!---======QQQBBBQQQfffgggiii\\\UUU@@@NNNTTTEEEBBBGGGGGG>>>999IIIFFF333000111$$$333@@@///###$$$...""""""000333......'''&&&(((///999999555...:::AAADDD***%%%)))&&&(((...333000!!!,,,***''')))"""(((///%%%RRRZZZZZZWWWNNNHHHGGGGGGDDDFFFFFFMMMKKKLLL<<<>>><< !Z{v( PO&    FJ$ %%%   &&&###)))...111///666888888:::HHHFFF444:::666+++...+++"""###   S  M     2K $$$    -,,  &6 !!!)))###(((&&&$$$222:::777BBBFFFOOO[[[WWWRRR^^^]]]WWWSSSFFFHHHCCC;;;EEEDDD888>>>999,,,"""!!!&&&555555***&&&***111+++!!!777;;;)))%%%000,,,444///444<<<******222222333333<<<333$$$000999;;;>>>555...000***$$$%%% +++:::AAA@@@>>>;;;===222&&&000222***+++444///000222555... ;;;LLLTTTKKK???333&&&(((///444===>>>666222000333///,,,,,,"""   G1C N ` b BLi  0iw> -$#R:###!!!"""  +++***000999GGGFFF777PPPTTTLLLRRRJJJEEEHHH===999:::aaaUUUCCC;;;333+++'''***"""            &""! %%%"""!!!***333333111888<<>>777<<>>>>>GGGIIIBBBMA@d=:UUUGGGRRRZZZ[[[FFF???UUUTTTFFF...,,,+++   !!!    &&&===???---333===999<<>>BBBBBB///+++111:::HHHTTT```eeeaaa```hhh[[[RRRPPPCCC@@@:::WWWLLLDDD???%%%     RUU    +!!!2cSq"     ((((((333666HHHLLLKKKBBB<<<999555AAACCC@@@HHH_85 QJI]]]CCCAAAOOO\\\KKK999DDDAAA;;;@@@777555===$$$***444         ###&&&222===444BBBZZZQQQNNNddduuuiiiQQQPPPBBBEEEYYY]]]CCCGGGVVVcccHHHBBBOOOMMM999'''***666222******...///###'''999:::222222000***---999PPPBBB)))'''000555888:::666'''$$$+++111###"""%%%$$$(((---$$$+++111)))(((***!!!"""&&&...888555---***666EEEsssfff<<<;;;999>>>JJJKKKFFFDDDFFF@@@<<<777000333555CCC>>>888222###'''///'''***...333999EEERRRRRRDDDEEE>>>@@@111NNNHHHZZZYYY999&&&$$$     L[V   (   $$$%E"=    ((("""///AAA:::...AAATTTfffssskkkRRRNNNSSSOJJMFEIIIVVVdddZZZQQQEEEBBBFFF<<<===>>>OOOGGG777>>>AAA444,,,000$$$&&&)))     %%%!!!""" !!!(((;;;AAA;;;LLL]]]MMMKKK___wwwgggOOOMMMGGGKKKGGGdddqqqOOONNNQQQLLLDDDFFFTTTGGGFFFOOOCCC+++000======555===777...+++...444:::;;;...111000+++GGG111&&&)))000///((( ((())),,,))))))*** (((&&&!!!""",,,+++***---$$$ ---)))$$$SSS{{{+++...---'''$$$$$$'''555444666///(((...555111(((+++777;;;---&&&"""222444555;;;;;;<<>>DDDGGG>>>((((((444111%%%     bd    !!!!""" , .p      ###...777GGGAAA777BBBOOOPPPXXXXXXEEE@@@FFFMMMTTTTTT]]]OOO___]]]OOOVVVVVVQQQNNNEEEFFFBBB///333:::$$$$$$(((%%%%%%     ###---:::###+++555888???GGGPPPLLLjjjnnnZZZeeeXXXZZZNNNOOOTTTNNNWWWVVV\\\eeeWWWFFFCCC;;;GGGFFF===HHHQQQSSS<<<>>>:::&&&***///***)))666000111888555,,,)))222777222'''''''''+++444)))%%%%%%!!!...)))%%%###!!!$$$&&& 000''' 000...''''''&&&)))000444@@@NNNKKKOOOFFF...$$$,,, ###%%%000666DDDVVVMMMOOONNN;;;:::LLLFFF888LLL@@@>>>EEELLLBBB333333888888===...)))!!!       -  T  b #       '''666%%%...:::666999JJJKKKMMMWWWEEEGGGssswoo<<>>???LLLHHH>>>FFFCCC;;;222(((555CCCDDDDDD???AAA555444888999999...&&&222,,,)))$$$+++(((!!!### """///---!!!!!!111000)))!!!"""))),,,333*** $$$+++888777---***'''///(((###$$$...///###''',,,111333<<<999,,,===???444???AAA:::DDDGGG<<>>???666<<<>>>?????????PPPjjjXXXIIIQQQTTTAAA;;;999===>>>333..."""           ,,,444222,,,'''222777666,,,111777111CCCOOOLLLKKKMMMDDD>>>999DDD222111777===AAA???888888FFFDDD555444+++///444000&&&$$$///&&&!!!"""(((222---222<<<<<>>DDDIIIDDDMMM^^^]]]YYYTTTGGGSSSWWWPPPLLLUUUMMM\\\ggggggXXXJJJBBB666:::444'''$$$''''''      ***///***111III@@@666???>>>777000;;;EEE@@@DA@DDDGGGLLLNNNRRR...777HHHOOO@@@888CCCGGGGGGFFF???777555999222---%%%,,,(((...//////$$$&&&""" ###---///222+++...AAA===555222222AAAFFFjjjuuummmeeeeeeeeeuuuxxxwww~~~lll{{{eeehhhmmmhhhgggVVVGGGCCCIIIDDDGGGOOO]]]dddXXXbbbWWW]]]gggfffjjjcccwwwxxxqqqwwwPPPBBBBBBFFF666444+++&&&***...+++$$$ """...(((%%% ######$$$$$$!!!333222))) 000777777AAASSS```SSS>>>000(((,,,***&&&'''444***&&&''' '''###+++...''' %%% +++111'''!!!(((************777===444???IIIGGGJJJBBBFFFGGG222MMMOOO???EEEDDDNNNRRRRRRSSSZZZRRRKKKGGGNNNJJJQQQRRRUUUPPPBBB888222+++,,,???777,,, """        """!!!+++111777???777888AAA;;;;;;===AAADDD/++@"///999DDDIIISSS^^^pppssscccTTT======KKKTTT]]]pppVVV777:::JJJDDD>>>;;;000???;;;333***///777+++///111'''+++222111;;;>>>000444^^^mmmuuujjjKKK[[[kkktttVVVJJJBBB[[[iiimmm~~~~~~|||xxx}}}xxxTTTXXX]]]SSSOOOPPPNNNYYYpppwww^^^NNNPPPLLLDDDTTTXXXfffmmmfffnnnuuu|||jjjTTTpppdddMMM<<<@@@TTT___\\\___GGG222222(((:::000'''%%%***///***'''$$$###&&&%%%######'''333(((%%%***!!!&&&,,,%%%///>>>>>>222+++777DDD;;;000***---***)))000888<<>>444999222...((( &&&/// &&&333444111---000...!!!---------(((!!!---===BBB???DDD>>>555<<>>:::444===RRRBBB>>>:::111???OOOSSSKKKUUUSSSGGGPPP\\\OOOKKK888...###'''""""""      !!!    &&&!!!+++666(((&&&;;;CCC///111FFF^^^\\\VVVPPPGGG@@@BBBDDD@@@;;;BBBIIIOOOTTThhhiiieee[[[\\\UUUZZZNNNPPPbbb|||wwwhhhbbbSSS^^^pppnnndddWWWZZZ[[[MMMMMMhhhlllYYYRRR===???XXXrrrsssZZZSSSdddwwwvvvXXXkkkmmmbbbfff^^^[[[___bbb```fffddddddeeefffRRRTTTffflll^^^KKKPPPNNNSSSRRRFFFQQQmmmmmm^^^TTT___fffgggzzz|||ffflllkkkyyyhhhSSS]]][[[PPPFFFGGGRRRJJJTTTXXX???<<>>****** %%% 888 %%%%%% ###,,,((('''''',,,888<<>>:::999@@@666...;;;666888AAALLLMMMPPPSSSKKKPPPUUUIIIEEETTTCCC(((***%%%'''!!!         """,,,!!!)))===AAAGGGMMMRRRUUUBBB999LLLIII???BBB333:::CCC???HHH>>>>>>HHHLLLKKKWWWggg```ooovvveee___lllbbbYYYfffwwwuuu{{{wwwbbbtttnnnxxxsssVVVVVVlll|||tttmmmllljjjkkkssstttrrrvvvrrr\\\SSScccdddMMMPPP^^^HHHOOOPPPccchhhTTTWWWZZZ[[[TTTQQQWWWRRRSSSNNNHHHQQQdddooorrr[[[XXXyyy|||ppphhhllliii[[[\\\aaakkkvvviii]]]ggggggZZZ^^^^^^VVVKKK444MMMQQQRRRkkkpppbbbWWWEEE333,,,///(((###%%%000333555---!!!444 %%%)))'''+++###!!!,,,(((///,,,%%%+++%%% )))888333:::FFFDDD<<<>>>III((("""&&&$$$(((000000---,,,&&&$$$'''''' %%%%%%'''$$$///)))"""111333***...999111666''')))---888GGG<<<<<<999>>>NNNZZZYYYWWWEEEDDD<<>>GGGMMMCCCCCCJJJNNNNNNUUUKKK@@@KKK888IIITTT___[[[UUUXXXXXXeeeeeebbbuuulllWWWaaa\\\cccOOO???@@@...000///***(((&&&$$$******///)))+++777>>>AAA333***)))+++ """###     ###333333555777666111333KKKCCC???GGG777===AAA666(((555CCCAAA999666666777<<<555111444888CCC===@@@HHHOOOgggVVVRRRLLLKKKJJJKKKRRR[[[ccc[[[^^^kkk^^^PPPLLLPPPfffxxxpppgggcccQQQTTThhhjjjkkkppp\\\WWWZZZUUUTTTOOOIIINNNeeeZZZPPP===RRRNNNLLLRRR@@@FFF???NNNbbbhhhiiivvvggg^^^kkkzzzwwwdddfffpppyyyffffff```cccppp~~~xxx{{{mmmjjj```MMMSSSOOOIIIMMMRRRKKKDDDGGGMMMNNNFFFQQQOOODDD:::)))$$$%%%))))))<<>>333'''"""%%%$$$"""!!!'''""""""###)))111///444777<<>>AAAGGG111(((,,,''' %%%:::888EEEMMMOOOCCCZZZWWWRRRMMMEEE444>>>TTTYYYAAAPPPFFF@@@FFFIII]]]jjjWWWJJJTTT___iiihhhfffYYYZZZBBBEEEMMMLLLFFFGGGSSSQQQ[[[uuuttthhhbbbdddcccbbb[[[yyy|||vvvyyyuuuWWWOOOLLLMMM^^^\\\jjj```MMMNNNKKKNNNLLLJJJMMMCCCDDDNNNPPP===JJJQQQZZZTTTTTTIIIlllggg[[[\\\ffffffNNN```[[[UUUYYYdddIII888IIIQQQOOOVVV[[[LLLLLL@@@888SSSMMMOOOUUUIIINNNYYYLLLDDDEEE888@@@<<<333000:::999;;;@@@AAAIIIGGG???>>>---***%%%'''+++((("""$$$###"""""" """'''$$$((((((000>>>JJJKKK@@@)))###)))---222;;;@@@:::444@@@DDD   '''!!!$$$###...999,,,((((((;;;@@@333...333,,,?;;722777444999CCC333333666GGGIIIDDD<<<555===;;;EEE777777AAABBBCCCLLLXXXRRRBBBEEE\\\eeeXXXSSSWWWbbbNNNVVVeee]]]cccWWWMMMWWWlll```lllooo```^^^ccchhhccceeeaaacccyyyyyyUUUFFF[[[]]]RRR???JJJKKKAAA888:::PPPOOO======111***000///&&&111GGGKKKSSS]]]NNNFFF]]]xxxwww]]]DDDNNNJJJ<<<999>>>MMMWWWHHH???KKKbbb___fffvvvgggOOOPPPWWWRRRHHHFFFGGGCCCEEE---@@@JJJHHHDDD@@@CCCJJJMMMWWW[[[KKK<<>>TTTHHHDDDLLL===KKKQQQGGGAAADDD===;;;JJJMMMDDDIIIGGG888;;;AAA<<<999666<<<''')))555EEEKKKAAA444<<>>>>>///444555444===666:::222111666333333999:::777===222333QQQTTTKKK???HHHAAAJJJUUUHHHGGGQQQGGGFFFMMMGGG]]]NNNQQQaaaNNNsss{{{zzzmmmooohhhYYYYYYCCCOOO[[[UUUDDDAAACCCEEENNNOOO:::000333...(((------888@@@111,,,333333"""...<<<...))) %%%}}}(((((($$$!!!((())),,,$$$)))%%%###$$$!!!&&&%%%...;;;999333---(((......&&&"""...:::   ***&&&!!!---///&&& """(((555333222---""",,,===<<<888<<<222f?5g@;DDD===HHHVVVXXXPPPOOOMMMKKKRRRddd\\\CCCCCCJJJ===DDDNNN===444MMMnnn^^^LLLXXXVVVTTT\\\NNNCCC>>>UUUQQQQQQIIIAAATTTRRRHHH@@@LLL\\\WWWYYYjjjcccfffkkkjjjzzzpppmmm~~~kkkLLLIIILLLIIIKKKSSSSSSLLLVVVVVVQQQKKKMMMAAA777EEEAAA...333:::;;;:::///888FFF777???AAAPPP[[[OOO<<<>>><<<***+++888AAA777...333555>76:99666<<>>:::@@@BBBBBB@@@DDDJJJ@@@???DDDNNNIIIBBBLLLQQQfffllluuu{{{|||sssfffYYY^^^bbbaaacccGGGaaaddddddcccTTTQQQGGGCCC888999>>>CCCEEE???ccchhhIIIQQQ111---??????444KKKIII:::444@@@ZZZeeeZZZLLLQQQLLL:::%%% ### )))---222333???555DDD,,,000'''+++'''*** ,,,+++(((%%%"""     (((+++444BBBAAA555000::::::444+++%%%999...<<<666333FFF<<<777???@@@444<<>>HHHOOOWWWgggttt^^^WWW\\\rrr{{{eeeaaaggg^^^XXXNNNRRR???>>>IIIEEE999;;;???888@@@???333333@@@FFF333===MMMPPPEEE999666DDD???<<>>DDDYYYLLLEEEJJJMMMPPPYYY___WWW<<>>999===MMMMMMUUU???(((CCC000222:::999;;;;;;>>>888777888[[[bbbFFF666...%%%666;;;444&&&'''$$$"""++++++555===000...,,,SSSMMM===>>>000$$$###%%%&&&$$$222DDDEEE===     &&&'''---###+++--- &&&yyykkkrrrwwwmmmfffpppssstttvvvuuuggggggkkklllmmm|||zzzrrrvvvttt{{{}}}|||mmmhhheeehhhhhhjjjtttlllYYYYYYeeeZZZZZZiiiaaaTTTNNNQQQIII;;;QQQTTTFFF;;;GGGUUURRRYYY___NNNFFF>>>999FFFIII<<<<<>>===@@@AAAKKKOOOFFFJJJGGGLLLDDD???888QQQkkkiiikkkVVVMMMYYY???:::DDDCCC???===TTTZZZNNN,,,777???@@@BBB888777;;;((($$$ )))###&&&""" ???<<>>666)))  &&&'''!!!!!!%%%---___fff""" """###&&&!!!???:::)))(((444>>>???>>>333+++%%%      &&&(((***///$$$###,,,)))%%%444---+++???FFF999---...;;;444111;;;999111+++666///<<>>111333777'''&&&%%%)))""",,,***&&&(((((($$$"""''')))""" +++888444+++///>>>??????<<<555777333777MMMOOOGGGDDD<<<@@@KKKVVVOOOOOOLLL>>>888333777888,,,111888999,,,000999999===999:::CCC999777:::HHH@@@333444888444444888000000CCC777555888666+++(((%%%888===,,,///333///555:::///000555:::BBBAAA999>>>666:::CCC<<<>>>444<<<======AAAHHHHHH;;;OOOjjjhhheeeLLLCCC000888666(((%%%$$$'''333444...)))---777888888222'''&&&888444)))"""""""""%%%)))###:::BBB---(((###<<>>999---''')))((((((333555555000&&&)))!!!***///(((,,,)))"""666///''''''''''''***(((%%%(((///CCCOOO555>>>777&&&###)))+++%%%$$$+++---+++AAACCC777<<<999DDDDDDJJJ:::888JJJSSSMMM>>>+++"""'''+++///((()))(((###+++,,,(((,,,%%%""")))""" +++### ,,,!!!***888;;;&&&(((+++(((***((( ---888???EEE555:::???===UUUXXX>>>666111111///,,,555///;;;KKKLLLFFFJJJPPP===555222555444111,,,%%%!!!&&&222222<<>>HHHFFF@@@???AAA000???888)))333999222///;;;333,,,---&&&,,,///555;;;999((("""///===888...,,,&&&!!! ,,,555'''...222777<<>>MMMBBB111...---***///FFFBBB///+++((( ...;;;???<<>>777DDD;;;444999AAA>>>222999>>>:::444:::>>>444>>>\\\\\\GGGAAADDDAAABBB===JJJEEE,,,000......888:::666///AAA333;;;666$$$---000...===555&&&***222666111,,,<<<,,,444666))))))???JJJKKKPPPPPPVVVXXXGGGAAAGGGDDD@@@<<<444---)))'''+++&&&%%% 333000)))###""",,,%%%!!!%%%,,,111+++""""""&&&""" )))111777777//////999++++++444,,,444333333...666777///...///***%%% !!!###+++@@@777......%%%333((((((222222''')))(((&&&<<<===333%%%<<>>...%%%""" +++333 !!!      $$$(((!!!'''%%%...$$$###///###---...***)))...777CCCPPPDDD???WWWlllrrriiiTTT;;;AAANNN@@@FFFEEE888888DDD@@@>>>???OOO666444444555***,,,---///CCCKKKJJJ???999FFFDDD000666>>>???AAA???>>>888555888<<<222///666222333000......///,,,(((000222222444;;;;;;FFF@@@222666DDDQQQMMMQQQ;;;...???OOOGGGEEEOOOMMMMMMGGG===:::555'''&&&!!!###))),,,"""###''')))000...+++""" ***+++333,,,&&&###%%%'''###"""!!!&&&'''(((&&& !!!,,,(((%%%111---///666IIIAAA>>>DDD;;;...+++)))---666666000444:::,,,%%%,,,>>>???(((***"""000<<<555333000777@@@444000444+++$$$///;;;AAAPPPJJJ444,,,555:::'''(((///000AAAKKKOOOMMMPPPRRRXXXjjjTTTDDDBBB///???EEE666"""""""""&&&$$$///+++ &&&      '''---222******,,,)))333"""&&&000&&&***888222&&&111EEE<<>>333@@@TTT555>>>===***444<<>>JJJKKKNNNNNNOOOEEEHHHOOOLLLRRR???;;;IIIEEE666///,,,888:::HHHSSSPPP\\\TTTKKKbbbWWWDDDRRR<<<555???EEEXXXNNN777555AAA999((((((&&&))))))((()))000%%%(((000!!!'''222(((''''''...&&&&&&000999///''',,,888888)))(((...***---AAA222444---777===+++444+++ $$$,,,666CCCAAAIIIRRRTTTHHHFFFIIIFFF???333222000///777444111)))%%%(((,,,000***""")))===999%%%"""***:::>>>999333000444111+++---+++,,,///888000'''//////+++222BBB333777QQQppplllttt~~~uuu[[[UUU[[[GGG;;;&&&%%%)))%%%###---444'''222+++$$$...'''333666000+++***###"""   $$$      ###"""((($$$'''555555444(((""")))111***%%%***###$$$***&&&'''888@@@333000(((333:::CCCHHHKKKEEEDDDJJJQQQNNN<<<777>>>]]]jjjJJJTTT^^^cccnnnttthhhWWWSSSVVVVVVvvv~~~aaaZZZVVVLLLMMMFFFWWWWWWHHH;;;FFF\\\eeeQQQJJJMMMHHHOOOBBB666DDDLLLIIIDDDAAAJJJ]]]fffUUU111333------+++!!!000...---(((,,,444777###$$$+++...111)))000'''***555333))) !!!((()))(((&&&444333:::EEEDDD<<>>888******...------...'''    ,,,...%%%&&&$$$ 999%%%         %%%'''//////333+++''')))'''...&&&+++***,,,***"""###777888FFFNNN@@@)))000>>>666FFFRRR[[[eee___```\\\PPPOOOSSSUUUEEE666FFFMMMHHH@@@KKKIIIDDD>>>555---IIIQQQ\\\hhh^^^```NNN999000111555888>>>>>>...'''222@@@HHH;;;>>>444;;;===666&&&///&&&,,,333//////;;;EEEBBB+++---333(((%%%)))...000///!!!!!!%%%---,,,%%%,,,444555!!!###+++...222$$$'''++++++$$$ &&&'''---999888222...444999444JJJ>>>AAADDD???:::222888DDD222999666999:::JJJHHHFFFRRRXXXYYYeeeaaaVVVAAA///PPPNNNVVVMMM777((('''...+++$$$&&&%%%(((777222###'''---+++$$$'''***777555"""$$$%%%///777222;;;HHHHHHfffVVVUUUWWWRRRCCC>>>555555@@@<<<333(((,,,)))"""+++111444---...333BBBEEE???222'''---222333***$$$''',,,"""  """'''///...000///+++''' ***@@@%%%      !!!"""!!!///...""""""$$$&&&===222((('''%%%...000...///333777333...:::BBB;;;666???@@@BBB???EEEGGGHHH;;;666444:::<<<666000)))111777555000222555000...!!!***BBB???111444;;;;;;444(((222EEE888000'''888>>>222,,,$$$"""""" )))999,,,%%%!!!,,,++++++///)))""",,,888111---JJJFFF???>>>>>>000222///%%%***&&&###"""+++!!!%%%---222)))))),,,+++%%%)))222...,,,"""###///000+++///:::777&&&"""000444///'''---333444---)))!!!333777000???888===000222===::://////111888:::<<<>>>000111222===DDDBBBTTTMMM<<<<<<888666222///+++;;;:::+++...'''%%%&&&444BBB;;;...,,,333'''333:::JJJLLLOOO```MMMLLLAAA???555999>>>666777333///!!!***:::///222###&&&333,,,"""((('''***---(((...999KKKRRR:::444/// !!!!!! %%%###))),,,888FFF???:::999000***+++    )))'''"""'''///&&&,,,&&&%%%AAA333***((()))===---$$$555///444555,,,&&&---222;;;JJJEEE<<<888AAA<<<666777444666333888---,,,111444///...)))444+++%%%&&&444888555)))&&&???888222666+++<<<888,,,)))---111777/// ...'''$$$,,,000222333((()))+++000555,,,***???III333***EEEEEE<<>>===666000---''',,,///222444000(((###!!! &&&$$$$$$###)))+++***,,,>>>999777CCC999333444......777111999+++444???:::222///222JJJ@@@...$$$!!!777===:::@@@CCC777000???PPPEEE444,,,000///333;;;FFFPPPJJJAAA:::DDDeeekkk[[[NNNSSS^^^JJJ>>>666777999---"""&&&111:::BBB$$$333111000666888999000+++666888---)))"""+++000999GGG222"""%%%"""!!! """&&&***888???999666///    $$$$$$%%%333!!!222'''&&&))))))===666***888999555444777******444222555AAA???...***+++###444666'''...444666???;;;,,,+++222444AAA---&&&)))444999:::999...000777999<<<444222===333555666222777...)))555<<<===<<<999BBBKKK???222444<<<666555888777111000###,,,***000555...)))+++...000+++111999((()))666666000'''+++444:::///))),,,444,,,+++777;;;:::333333///222---)))(((,,,222??????...''''''888===000222???222222000222111222555===666888>>>999CCCDDD>>>EEECCCKKK:::???;;;BBB===555AAA777:::>>>777BBB:::BBBCCCCCC>>>>>>??????GGG[[[```lllrrrYYYeeeWWWOOOJJJKKKRRRJJJMMMZZZBBBEEE>>>---222111---333333===<<>>DDD???FFFQQQHHH???LLLOOOZZZNNNGGGRRR]]]ccc@@@BBBEEELLL555777999888333...***+++,,,333111999111'''&&&"""...,,,---111---000...000888;;;000!!!&&&+++***+++'''"""!!!;;;@@@CCCAAA222555FFFGGGLLLIIIJJJXXXjjj]]]999BBB>>>DDD>>>///444---(((:::EEEHHH777DDDRRR999888@@@PPPHHH111444???EEE@@@OOO___VVVCCCSSS^^^VVVkkkfffaaaZZZ[[[cccFFFBBBQQQUUUMMMMMMPPP@@@LLLmmmsssffffffTTT888EEEFFF000@@@AAAJJJ]]]UUU>>>===333:::999;;;>>>XXXKKKGGGDDDNNNIIIAAA777777777AAAJJJLLLHHH777;;;888===...111===555  $$$(((((("""  ###%%%$$$%%%---222000AAAHHH999444444:::555,,,!!!   """ %%%!!!"""***''',,,222###111///+++!!!+++%%%***>>>KKKHHH444,,,///444222999EEEIIIFFF666888///888DDD>>>BBB<<<+++555***"""%%%---666666GGGSSSJJJDDDLLLRRRUUUQQQEEEFFFPPPPPPRRRVVV\\\RRRSSSTTTOOOHHHQQQbbbsss\\\IIIXXX<<>>QQQgggrrrsssjjjSSS@@@DDDOOOGGG<<<@@@;;;:::777===AAACCCEEE===888JJJ???BBB<<<:::===555333::::::CCCKKKTTTPPPAAALLLRRRLLLJJJQQQIIIIIISSSSSSHHHDDDHHHEEE\\\___NNNCCCHHHGGGKKK<<<555666888AAA222)))555777JJJMMMCCCKKK===CCCMMM@@@666AAARRR???HHHJJJDDDAAA===OOO___TTTWWWOOOEEE;;;<<<666,,,***&&&!!!%%%""" +++000+++000--- (((*** (((111BBB:::999555...666444555<<>>HHH???000...>>>CCCBBB555<<>>>>>NNNXXXMMMBBBBBBNNNPPP:::555LLLHHHCCCDDD444,,,///777>>>EEE===<<<:::<<<@@@ZZZRRR===999EEE555>>>999***222777:::...(((///999WWWTTTLLLOOOEEEHHHGGG::::::IIILLLIIIJJJNNNAAAJJJGGGMMMMMMIIIBBBBBBIIIDDD555%%%$$$"""!!!))))))&&&(((888---"""***!!! $$$###''''''%%%///%%% %%%,,,%%%%%%%%%***...111TTTjjjgggcccsss???     """  &&&!!! """,,,"""%%%"""(((>>><<<444222///666IIIUUUTTTDDD444666---:::MMMLLL666<<>>===---'''444777:::999333:::;;;666,,,...<<>>FFFJJJGGGNNNRRRDDD888JJJSSSEEE===>>>===999///444777000***:::999...444222...111111+++555CCC@@@@@@CCCHHHCCCJJJGGG;;;999>>>@@@JJJBBBCCC555??????444AAAEEEQQQSSSSSSDDD888<<>>DDD<<>>333999999444555;;;333:::BBB???BBBFFFGGGEEEAAA***!!!***444444111333444111&&&###""" 444,,,!!!---+++...*** %%%444444---&&&%%%...((( 111555000...000222111+++000111:::333:::>>>BBBCCCOOOVVVWWW^^^QQQTTTbbbhhhqqq``````wwwfffIIILLL___XXXJJJDDDFFF===777<<<<<<:::@@@000%%%''',,,333---)))@@@<<<...>>>666111GGG@@@<<<***&&&222---***555OOO@@@888555666111***<<>>===DDD[[[ZZZBBBKKKbbbDDD<<>>DDDKKKUUUjjjooodddcccQQQDDD???IIISSSBBB111666%%%)))<<<555///777<<<<<<444666666???GGGZZZSSSCCC>>>888000111222...222(((///000###$$$"""###(((###)))111***(((&&&///,,,+++###&&&***""" 888BBB+++ """)))......(((###!!!"""'''+++000FFF<<>>444222111333,,,000999333555555,,,%%%666666888;;;999@@@===,,,///999<<<>>>BBBBBBGGGDDD>>>NNNLLLTTTSSSDDDRRRXXXHHHBBB???DDDDDD777:::777---555EEE***///444///...BBBIII999,,,///777,,,!!!'''$$$"""'''%%% &&&$$$!!!444EEE222"""444===GGGJJJ@@@>>>IIIOOOQQQ===666@@@(((111///***---777>>><<<000(((    %%%)))%%%&&& %%%)))000***222:::===AAA@@@///===EEE555---222;;;CCC@@@IIIEEEGGGUUUJJJ999333222>>>BBB555111555777///888>>>===AAAJJJFFFMMMSSSCCC[[[VVVCCC@@@HHH555555<<>>999LLLPPPEEE:::888===>>>???======<<<>>><<<111444444@@@:::>>>555444444---,,,%%%### (((...222(((===@@@999EEEEEE111AAAGGG:::///<<>>DDD;;;888...;;;FFF777:::888@@@CCC>>>>>>666555444OOOFFF///???UUUXXXNNNNNNAAAFFF;;;777888666???BBBUUUSSS@@@///111)))666222***444222444111(((777;;;$$$"""""" !!!###***///777999<<<333000---///===888222444999???+++%%%666000%%%+++000111333GGGHHHLLLKKK@@@,,,    """333,,,'''!!! 000### ...+++)))''' $$$)))111111###(((111222222)))===222...///777;;;888000888===GGGBBB888GGGJJJGGGBBBHHHCCC,,,555AAAQQQXXX^^^XXXUUULLLQQQ___ZZZ888///???@@@///...%%%+++""""""&&&%%%$$$"""/// +++%%%!!!///@@@000===777777333---000555333,,,---111,,,$$$$$$"""'''))),,,444666666CCCGGGGGGEEELLLMMM===777000%%%---333111444999<<>>GGGGGG<<>>DDD@@@999DDD>>>999444)))555<<<555666888333555$$$###&&&(((---)))###***222)))+++,,,222---(((%%%)))&&&%%%'''!!!!!!+++###000555///222666FFFDDD>>>*** ###&&&,,,,,,999777000***@@@BBB;;;CCCBBB999---+++,,,...:::"""       !!!"""+++$$$,,,555!!!"""%%%'''+++)))''',,,444999555:::===111555222444---***===;;;000555777888<<<;;;...777DDD???AAA???GGGFFF>>>999IIIUUUSSSIIIOOOaaa[[[XXX[[[HHH555---//////...111333333222888333###---/// )))555444333555222"""$$$((()))+++111,,,888===;;;111,,,'''((("""%%%'''$$$&&&"""***...(((%%%'''---:::333333---,,,)))111777444>>>???555111DDDJJJNNNIIIDDD222###...222,,,111000111<<<:::%%%***--- """&&&+++***000*** )))"""&&&))),,,###)))222(((+++---***777FFFHHHRRR[[[QQQDDDJJJMMMaaa\\\ZZZCCCPPP]]]\\\ccc[[[OOORRRSSSjjjiiiiiiooo___VVV\\\aaaaaaWWW```UUUbbb^^^QQQGGG444666======??????000555>>>FFF???JJJPPPTTTHHH<<>>              !!!"""!!!  !!! )))$$$&&&***$$$***...222999***###***''''''!!!%%% '''$$$   &&&"""$$$((('''!!!    %%%000444666000...555///---%%%&&&+++&&&!!!!!!(((111444;;;666666???999000666>>>+++&&&...>>>VVVGGG888///%%% ###666:::222666,,,$$$000AAA===555222$$$$$$%%%&&& %%%"""***...+++!!!AAAuuu   EEEEEEKKK EEE KKKKKK KKK ~~~~~~񿿿SSS 񸸸MMMMMMMMM  ꆆꆆ 꿿TTT  ꆆ??? MMMMMMꆆyyy ꆆ TTT  ꆆ???    MMMMMMMMM xxxxxx  EEE KKKKKK KKK   888888 qqq qqq qqq  qqq qqqxxxxxx qqq xxx rrr www     KKKKKK lllKKKKKK xxx EEEEEE KKKKKKKKKKKKKKKKKKKKKKKKKKKrrrKKKKKKKKKKKKEEE 匌MMM KKK MMMSSS  񿿿 xxxxxxMMMSSS SSSSSS MMMMMMMMMMMMxxxxxx??? MMMSSSMMMSSSsss KKKLLL KKK   xxxxxx  ꆆ xxxxxx RRRQQQ LLLKKK??? 곳XXX 댌 MMMMMM  곳XXX  ꆆ   곳XXX곳XXX  MMM KKK 댌NNN xxx 댌NNN  SSSSSS MMMMMM  댌NNN댌NNNKKKttt xxxxxx KKKKKKKKKKKKKKKqqqqqqxxxxxx KKKKKKqqqqqqKKKKKK KKKKKK qqqqqqKKKKKKKKKKKK???EEE     OB hpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/examples_ybr_color.dcm000066400000000000000000006672061515706620200271310ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.3.1UI81.2.840.114340.3.8251017118051.3.20160503.121539.16117.4UI1.2.840.10008.1.2.4.50UI1.2.840.114340.3SH Tiller_SV500AE microMAXX CS ISO_IR 100CS DERIVED\PRIMARY\EPICARDIAL\0001 UI1.2.840.10008.5.1.4.1.1.3.1UI81.2.840.114340.3.8251017118051.3.20160503.121539.16117.4 DA20160503!DA20160503#DA201605030TM1208501TM1208503TM121535PSH`CSUSpLOSonoSite, Inc.LOPNSHNot connected 0LO`PNpPNLOTurbo !ST"RGB to JPEG Baseline 1 conversion PNPLA  LO204 0DA@CSLO`!SH !LT LO51.80.108.010 0LOcDS33.333IS0 PLO50.80.103.002\\ `SQ`US`US`UL`ULT`UL`ULS`UL$`US&`US,`FD/#?.`FD/#?LOSonoSite Private Data PUT^i 0 \Storage Card\var\patient\P0000082510171180510001576\S0002171\R0002171\PT_PPS.XML \Storage Card\var\patient\P0000082510171180510001576\S0002171\R0002171\C0016117.DAT C0016117 1 0 0 30.000 FALSE FALSE 3480 85420 7957478 200 88900 85804 4575413 7000 174704 85612 1817646 3416 260316 85828 15099979 1760 346144 85612 1228631 328 431756 85540 1837910 4224 517296 85828 4147409 3448 603124 85204 7931257 408 688328 85380 5949223 752 773708 85356 8917925 4728 859064 85868 4398489 3952 944932 85868 4398489 3952 1030800 86060 14667900 4616 1116860 86148 6465423 1744 1203008 86460 5571179 5816 1289468 86836 16033999 2672 1376304 86764 3720990 6160 1463068 86484 7288459 2360 1549552 86332 8996282 6296 1635884 86324 8300365 4008 1722208 86396 2377533 6504 1808604 86484 3814947 1888 1895088 86500 6006014 3000 1981588 86820 9703750 3344 2068408 86652 5285680 3512 2155060 86804 6458739 5688 2241864 86868 14576940 4176 2328732 87068 4029440 528 2415800 87068 4029440 528 2502868 86820 15491951 3888 2589688 86716 4810288 7920 2676404 86612 7816640 1056 2763016 86572 1819895 5648 2849588 86908 9314056 2440 2936496 86452 8092082 6224 3022948 86596 1544522 2312 3109544 86612 2244922 4152 3196156 86828 13224098 6072 3282984 86748 4547875 1752 3369732 87012 11938944 1768 3456744 87132 43086 2416 3543876 86932 5145955 7936 3630808 86908 14875213 5096 3717716 86644 15205021 712 3804360 86644 15205021 712 3891004 86820 12117634 2880 3977824 86236 4842309 2896 4064060 86148 5061037 6200 4150208 86356 1072716 5472 4236564 86316 4883495 4584 4322880 86428 4652820 5016 4409308 86204 7291758 6776 4495512 85924 10673221 7568 4581436 86356 11746084 7840 4667792 85876 3004907 1968 4753668 85532 6372024 3752 4839200 85700 2850438 2840 4924900 85556 9848630 272 5010456 85700 12397252 4656 5096156 85620 13602260 7192 5181776 85652 5407711 3240 5267428 85652 5407711 3240 5353080 86052 15520292 6512 5439132 86012 8456386 2768 5525144 85620 10503049 2688 5610764 85948 468601 6368 5696712 85980 15270583 5880 5782692 85836 1485531 1728 5868528 85892 5061472 80 5954420 85892 9686511 4296 6040312 85972 9385706 1992 6126284 86116 5832487 1840 6212400 86076 3697501 7728 6298476 85556 1928584 2208 6384032 85724 16160938 5152 6469756 85700 131188 7424 6555456 85956 10527068 8120 6641412 85956 10527068 8120 6727368 86324 13956193 4104 6813692 86388 11860015 8008 6900080 86436 5520194 5984 6986516 86572 3328315 7024 7073088 86572 12399706 1496 7159660 86660 5964639 2096 7246320 86780 14286106 6104 7333100 86724 11424662 7504 7419824 86716 6999408 7824 7506540 86652 5549045 7904 7593192 86636 1280457 2952 7679828 86444 6856553 4608 7766272 87004 7783595 7792 7853276 87052 8647321 168 7940328 87156 8786796 1192 8027484 87532 5417269 1448 8115016 87532 5417269 1448 8202548 87660 3855217 1656 8290208 87644 8973834 1880 8377852 87420 8154662 776 8465272 87252 4630483 4536 8552524 87260 15046106 2112 8639784 87116 9339829 4576 8726900 86460 9090009 4016 8813360 86636 16086517 4728 8899996 86604 5035470 4632 8986600 86868 16187935 4088 9073468 86964 10788068 256 9160432 86820 8886717 7392 9247252 86684 4447501 7360 9333936 86868 3640266 520 9420804 86956 12440643 6560 9507760 86956 12440643 6560 9594716 86820 8937059 7648 9681536 86884 14936417 168 9768420 86764 4256246 7632 9855184 86972 9334893 2144 9942156 87188 10179683 3504 10029344 87204 14497255 7712 10116548 86820 8746324 6632 10203368 86740 11365114 2072 10290108 87036 1999008 7944 16117 20160503 121535 120 33.333 480 640 0 0 0 0 0 50.80.103.002\\ P21 1.2.840.114340.03.000008251017118051.3.20160503.121539.0016117 ISO_IR 100 Turbo YES M-Turbo Cardiac `UT 51 050.103 0x83000003 UI61.2.840.114340.3.8251017118051.1.20160503.120850.2171 UI61.2.840.114340.3.8251017118051.2.20160503.120850.2171 SH1 IS1 IS16117 CS `CS(US(CS YBR_FULL_422(US(IS30( ATc(US(US@(US(US(US(US(!CS01(!DS19@DDA20160503@ETM120850@SSHSONOPPS0002171@TLOOBx/G6_vD7Pij3RMfX™ֲJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U,pj]x28W=i.tвRE] ȗ\x?$edI20g4]oeF6 hk( !#T%wGO9,"pUO5vNpGRY͟V <}:wm")0\ 7#46t̗Dw$tV%ݕlIv,P#$eFJuq|ʜk&HeQ@Q@Q@Q@Q@S ąPOAJ*qoEH<}2x & :R:( ( JZJ(`QEQEQEQSB9a@[3գ@c+AǜV9+:tc@m!uɦK*X1J!*0HI@z1e/bm,hBq.l1AuN? Җ$G@ï^\V (.e9Tuk^Kt m@mGbIi4{בB@ ((((( S{Sinns>b.AzBNsVJ& T`޴ŊF۶6;Ґ)3ȤQEQERRPES((=89.H\qV`9@P!:츈އSǗqOZ#oFQ :*Soo<&w+oƠ;Pw XK=}.@`-]9*:yHB:f,,cRA5@`cq 9aЇB]݇jTy.6!F3UA9Vxl)9 byzU ڶQՈ5ul( IRI֣(((˶:&w|d;gAK 2=ҵ{m>n#|Ry[ _V> X+b\2+BRJ% Gh瞟NA_[y%$ *(( (Q@Q@.)( PgePQ5j&9o"|cci67*d0:=Ž S%22vJ)W_gۦ.܌V5jzp)/-#>^Fysfr M P`P1 T`ivOU]?rIrhR;h>&XycB#6IXs={{Y۲@l1EDNL$ڣ44J( ( ( ]H=)ŋ``< 0{Vv^71z_Ѡ0|l1IҝCokڑq>jmOQSՄ)rEo,? @P(((EPEPKIJhxH&&֮]8[9+`YZlv c#PHX=ju={ֵDksz'90O\SqS;dҢb3ր%cR }H!3PE @ҮS)I.9OUV(*sSܐH$G1M6 (((]'99)!Hc&h@QEQEQE)i)z)hb ҁN=h03HFivt՛gĪ{.z"VWPEkQwhĀT֤A1s@6Stہcwᇭ$rqҩ^fRMV`M6PRRPڊ8 JvqJU{y\Dv1 OPmy%Q[npNsP^LU8f+tf ͏2>t#Ufgr;K3'@ ER( 8\ւFF(;f\R4LT13bӷMJjhSPGxwy#(qR#ԫq֐tۑ C]5ε9 \t+@J#KI Ϩy'N#s@#?vH#y_jO"*ۚKR7(,;|ҧb@t }pH8^=q@w5X:sOr 5qs@ 4Q@PF3F1J?@sڎ1֌F6$|o^1AaS.ߒIl=(29Rs^|L5movR?Ħw|~5)bǰ7dsT_E8 A|8ZDv}is^ր*$,I!Q5kʐ>f_ZO´J~ʁVdֲfxLՋ{A PEPR3Ki(ހQ@Hʑ$rgcޣi^4vn]W1*z\X$t$Se1Hm&NsVο.Ucyp:L;B~$_7 I˛L~+kr}ebҘij5Id󚆊RFM%QEQEQEQE*A#4*LQAHT09 gz޷m;ѠT"rAQ Z(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@$[8> <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih(JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U,pjMx68W=ji.tвRE] ȗ\2i'.S>dpxzhymz4cBFHA![ؖ[$ۉDOuW AEPEPEPEPEPTyB'm? k463#JzWKmNklr9΀'}Z<^d_$du}J#WP;(0\(\mjZ7Kq)b.AzBNsVJ& T`޴ŊF۶6;Ґ)3ȤQEQERRPES(((;.&{UTg9R(9wf GUU0TJ%@6}P AK4CIYZZ.nZHӨe\j \HQ hU@aUҥ`\e< Βg/1ր.G!i;TN78br9C! v#;Qr$U =HTQ ϥ[ @PD::/#V6k"Cv@pi*Y皊 ( ( ( K.+e0.$JK%]IFxl6=~R!X[`ɉp˃(? J8B!+ +Ǒ z}8}o{,>FX"9'p3h ( ( JZJ(`QEQERQ@Z8*j6&4#r2q=jd*lgި$^ڦG&Ew>PK!sxI*2*x4r}khCȟÜVna>w0B<㌌ `*!-ߎ=42rO5Y=B(а57nfr ^)cvlڤdi6&Ϫ$Qvy]fk!]B&I=}qc@wI'v%o1sD I\ޙ{((((q8jJqbAw>hxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQEQE-( 5) w0ҮL<ܻyZ8VϵG4h/U5 mۺqVM#sDKxrz΢)QERRPN)Ҙh@Q@5"*>Ԋ4s` B,|CdnLtb&6 pډaeʱ\vT^|+]Ɯ^eb4Eˇ "S.A+:_3on[:,CjEgYzVr,KV(^aEAjIGFي} SH|ɠ O֪5XaNEWlP(EdҒҀ)CIPjŽ"Cb{~'1V-$p+mN s*ɐ*1Sg,ֱn,G֑ndw*G~}> fc$h(@QEJ<`*8@@(8E;p09N+)29RG\qZ3R4MTEH4ci?ʚ}I+ ۽i˪q&O~zSd`GLHX)4ǥ'Ҟ8 >"~O#rt1Lz5Aq;jĥE#($(l`緯 wgӞJ(Q@Q@%-%(8ϥ6`;7 y8֠0/]qwå< ?9*ZvdHkz e%M? ulc=ֺ{6?.Gr*iE*.z,*y\) c+guG"<63[ܙF:2?jF;3o?c<ЙF8JؐqMj]iR@;UVA@'-5v a(m$V}ݕŶCheR>[qOUw&fɠ$sEiRRL^(H=$zR!9Hʑ$rgcޣi^4vթ $ǵXa\Pn$7N 5clvJ'K4s֬?ĀgpJiN=s@DZj8N_,$s^u͜z+RPs@ivwЅU?"b5#eb]J=OmՔlRKw{f 2J}+hIP `;6=V ȠȤsI E^J(((,|׭6Jv>l緧)QEQERRPES(((+ZK3P^G{,L2$LEЩ*WOq2#jAupyNh2{L`q^l.տ:wۮ:Y9Z|jZv9i\َK4u1fHO֨CE8 <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih(JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U..͠΀O+A=jiu4,ԑWm.`2-ߕ(茝I˔ϙ*l2}+\;ìh;{㞵6-BɌ҂*C<-[jI0?JE(((((¨O-Vۜ~jhl58fG3GOJLڝr8r?O{kyby*ȿ/IGn$wQT `QոnSxG˔y%8ABxƱ,]Pc{u)J(( (Q@Q@Q@Q@*v :@2p*\dzwG,ԩ i@'}5_QZ)c NmI8,bjRzj֝nOM=2%bF~]*]6 hU(+0۲Nӄ{0AҰ$yB8@l}QVź`dQ@Q@Q@Q@Q@S ąPOAJ*qoEH<}2x & :R:( ( JZJ(`QEQEQEQRƠʀ%qV$x~o j, DdUI-1W'Sj܁fT(`ŎEf*JexGط.DR[UÕIHQˎ+1n5@a9ր6Z#+ TĄo1U8߁ǵ6%)$P4KnIJE-Gֶ&@@ ۧa4ڹ"8N %Q@Q@Q@Q@8!@P$gzڛN;ps|or Ԋv۞VB^Q4 R,R6ݱp~YNqE (( (Q@Q@P(ʹ1DI>v=Zж#U֋'1ҠuP#w\UG˸ H\I z i':ŞvuZVrʫv 'ȸoUa@{Fg* ;{VT$ԊqVbN{g?[Ո-@ ц?)Mo=p)Z" \#,[sKI84UQ@Q@%-%QE0 ( ( ($Nf'Uz4~) G>hN%=5NߘΥYy9Y+)0y#ڣoH/k+luF9_GG> fbAP 2 w&sfz{iӼ,w`r(CbKF 1ӊ'h$S;O4h#rQ VX cJyff4D1jp/ SPy,{gB*=2 QEQER'@IN,X( |׭ol!(ڴC;:%`OnN{Xԍ0ۉSh%=2zj!K+xd|,FO'qRQ@Q@%-%QE0 ( )HRS?p?Hc*<]t ҭ \Ojg!}Z'$ l?vjB CYx PZJ#"u# ܒ}(֮^@dϭMq1ZI!qR$qU=)#P2J"څ)qyA$y(cQ1:B;?71ҕ1)RQK@ EPEPN%pA6NrsӌSi( CdCLE(())i()QJ((ǽ"r9(攁jq۸saAC@⤈aЬ`:D$8@ fUܳ;TRD}H|;}ꄐ>I 4_#ޛ 0 rzTd-ӹnM 5O|r8ǖ(X"G&e G Ly$@sPX<˻^nDL:bJ슈*ѪűԞ]OM(Z^( KIOlppj u,N9=;4p.|h)^xs")rWX. $s&]6eH{uQH( \qGj\S;RS'@ KF;Ph)P(UR msIy 1Ȫ9O܌&gI_tX g8J`T;5%Вۉx N+yJEmonMa]j77,wJvQ_i Pi;XAH XgD$j1Vpޥ6wTVd88Ua@ 4RRI@ GZJQ@zQN2[z$;/gZUk-\<*vws/ʀ"d,ʨTK5q[0fl|q[Yʫ3>ߟOBY?ZJ(Q@(ޒ&4y#3ގ)nHHpѷqν`۔dwvИej:.t3YI܆+QE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($IBp}+N=.PyVu|-tV,NX7@OLw ܙ6r60Y`H-\#pZһ%@7d^MA AUlgٿiO"Y'#zX}pNyYv *i61yG͢Cn)B)j$%(f_-r`ܗ's>ҝ6(cxi&W('ns`bd򢕘` HmUI' vKh񤛟07gǶiMDVRB%4L 8S?hJ}`ٜlEuNև6fgZro??7Mj-NTcңI89fnd(f%dU?x9iim.(?ҬDc8}jđ4l<ܐAgR*#as;M'9?_}<3֤WACI~`-:3w)pP\Sd;?-pOqMH4{WHIi=eQvk-7c<gE2UY]o *l8*u Dbd&"U:$~uN1$T閪h= q;IgٿkH]*e N*Wp0O*]5pZpи-ZI̒Sv8x*UTtsE\ϳ4fڞ??ؚ\nN[ޣlTO!V*D} YQ,2L5Sj[ ɒݕ$qjr;Jkjh‚~O'˝1z#T=sQt(((˶:&w|d;gAK 2=ҵ{m>n#|Ry[ _V> X+b\2+BRJ% Gh瞟NA_[y%$ *(( (Q@Q@(4"P>SJހ4cۚnP9+:7TJ8tpZV,pUl֗DHVu__O-l=8#\+zީ#a<ִx{16} _uV8q4ܤUTY%89$l(zʙ\C zQ!cV=1ˏNTVSpۚtD)Og&Arz FI@i~oZQA ( ( ]H=)ŋ``< 0{Vv^71z_Ѡ0|l1IҝCokڑq>jmOQSՄ)rEo,? @P(((EPEPJ))å8 IӃTΔr(dl05<^\A 0IՈI%b{4k{)`3x(oLW?l-nﻥ7VԶF9Ntg!S\[V'.2@\B I ۀL˱X>l緧ӈP#4)QEQERRPESZJ)hSS:vys;\HNNhJ(`1H2W"_7@6@y#ej~tzV"}?)me#nh?P)"6՘t>|kgI rdܕ4{(mq)&~YA.|ޝ$(@c[kVfR8Qɪ:|F>YRzs\XѼz(BOjI!r1UIKE%R\4QEt#Ufgr;K3'@ ER({IPMisEiiqG@ 4SJ`0SҔe5"|/J1jZ3jE#LTdD2Hr)Ppg9"-JRq4 RIޞI 'ڭC{Sm\P?j;S98nb_qE-%fqڎhϥ 43KڀI'0#9ڂqWNw zsހ((( x (0QɤM=0y[+l\ {/Ze q.v`(vp:/5B р33m欝:YM( KE-'z)qHxSR$uLb0p{u#M+Ƒ4ǝNBjeQH(( ((۩zS)A",FsǽkZʒΰOOPEM9 *Qr_ m3dvnB?tj2@%o꙼EsgjpTqhw> d}4R~WE^ }i-Ɵ7M@ֶ7v5 vA>?~i0/5%rOSm dz}l*ugʹ FB2@R fAn=TNp(*;sJA.6)O84xQ@Q@8`w>iW qd'=8%QH(( (Q@Q@Q@We9T4PĸL? 9<8=22o<!y?Պ#i|7>i>P3[WdǠ8[žo[?:L[Me*dK#?ZnO ̮NN*t&Q@Q@Q@Q@R*d3@;mtJ8șOVn!.G{05jm#3ըG;ݛ&鶡C;?OSI2A@9;swe8'3O?EmLI8MXSսj[G$遻8=ME\.o&2z(#A:eP9žxkBW#f:+&Ď:tǞ8 3:gٿkQoPp ?6^Hq3uo+ E1+" ;NHit ЉAb'_4iCV.$a jHd`*;RS,o}f6IpeOv:rvVdjvW8 :~.g> R%SH κabg2q1±/$V(((JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((PXuv~ty\".X4VhYU}2 <żO\|U=9 J|-1NFsE<=^Ixķo&H"{x*PZ ( ( ( ( ( I<=[nqUYdTm?{*2[jv\`Edt?If@"1''KVAiEPF:oSV![OQ.R8f.N[UIN21V[ 6,l^̐'f>l*^vPpI P1\#7Lޡ|ژGCYLqTXڀ6v6djmHWcriw AM$ Xl緧ӈP#4)QEQERRPESR v:qL4Hxpx$٠FI) $㚌>AҭD0@ַ1'X3D3edzS>ի;iBV=KR-0Oր/̀,R0h. {)i\(u,zY+s313)oU!}zzUF<h Z(RJ*y-&LE>-9*ޟ46Y԰U;W,w]8{y] U^^cx(Bϧ֖h)v޴ A@QE ( JZJ)qH(Ҋ\ NQIE-:Px.hݞP5,L5 =I C$m'/^8wˉrzѻсZ`P5 3;*>ZǑ̌K15bط =@S&;bj*U KY qڴ# ,_'ӠέJFN84N`T3d3f E%-0 (b6[z$;/gZmy%Q[npNsP^LU8f+tf ͏2>t#Ufgr;K3'@ ER( P>.8.r(;izP3@ 4S< pҘfi&9b0h &šTӐq*>aE ,$q&g<ޣL'Vr5KSi QIzJ7 *][8>Cp2b0.*)=iiQFhR@j@qKހƑI'6F0s׵!4pp=((())i(;#mx8q]v6`:fLibz@3`OIy> ( ( ( (RU9fIv72x=i #$ C{z;gyY4J[NH=3?¹@ ER((((((((((((((((((((((Hd+gҴXgZEk"tz =ɓh.o&M]29e+TvH?. 8Ȋ_8$ک_A&ݛ&d*px?7k 真U@gi-)rܯm3) gTJ|$0&".q2VB]Ž `j2۪G f P-rw17M)mB1wڞexrv=*9PqO*)Yf04;Tp?x?kzԶIvq{f]KLee "PGHtPs=ք FtWQMt=hqHfgu&>֢ޠ$AF0~l*9.ブfZVAribVEYv6o.*Nif;Iӎ֬\IF x"B634Rp#@˷߳ʸ? jE~9T`A Bӣ1pRwN6CC2wNԃGy$UWf2#p^3S-U٘ P6ذw_MF*6AkPL!{YX<ábGTMNjЗ㴟ݛ&ҩvP۟??ҫw TݕLW 9AHeG,yhzVCa298$ UJd#[́UE~bNN8?ΗWԭ;uu #ҊŒuަŨCtĢ=\Kpy-`:e<6&5Y`;ۯ1H TQEQEQE(((()UKU& 8jDr @yi +g.ܻbB hI HK .(A .aTzz t|J4frJermހ8˸_ 0" qkĉ7\ysXwZ!XtG#C>_QV!W}k*XztQEQEQEQEQEQN.3aA=sh(ſRV9 h&hWH袊())i()QEQEQEQEMd I +dQ(z֔4|@:|3*H\-xkc;,rI!c$j -s֬!`B5 n5 YcG:+g8'V-W p 㷥2,4 1U1a{֬sʫ<8OO΀1Mr;e_0'B@ ((((( S{Sinns>b.AzBNsVJ& T`޴ŊF۶6;Ґ)3ȤQEQERRPES(((蛺82EWQZlv Ku|F "c ڳmd &:8LA4"B"WT'oZ$uYÌS-ˀN*#ȫ%]!%,pzꄪ;YL2!(tΐr-[8>mqY}N=jRUȬ4MJ[;T`;>Ja= ]H @&iKq̍2lzB9j]GPQZڕpBVA(W"<(GMiiZ-h@7Ti 8)$^O9aB~85HTŽýXPAH!Xn=!xI T7>x(t0sVl$@ J?F[#ҚFM+i))HEPEPKI`g%8` ;^!/j3#9#PPZ4 > F2 ?8=S;mbR6n'M<09z.R(ㅒ5 ?xH QEQEQE(()E%(@Fԁ<槂fVPGTp*h5a'w;!]fI#cN$\A%d7&B4]< )ýcާ%UF3"e?|=sOOC@AIBz[oKEԁ9P\>=*4QCH4RQEQES\.A͓q $r14QE ( ( JZJ(`t4PQE)Ga֣=[րc =d{1'Iy>ԡH` *r*d`{g=x/M2iֲ0-{Un,,s>3ـ$Fy?cl[G%P&@;hm `v#YsFqJƻ}YHv!pP9#O-4Ri#*@ހ3@QERK(RRI@ E)4SAQԑ0"U]?p8e\= QkBƀ):vO=g X9w-#3j[vlUB9@$w#4b9͑P>fӐbYs(w>Y|Zkg|-VgnA UF99GE)ph((>4ʱoo=눐ؼ<߉jUk-\<*vws/ʀ"d,ʨTK5q[0fl|q[Yʫ3>ߟOBY?ZJ(Q@(Ғph{њ\LPyb8<~){Ԃ S<JjO)t$; @A*vT*&RJ`4 zi*Ex#'CϿjSr]zҒx4()@SjmvCp(q0#|5]9?Ja3@ PRE( Z)Uv$|-A\;3zJ(Q@Q@%-%;4)^iq9ڧB@QUOC‡^2 H!(-IaщOBx#8 *s+ݣWivFW< +ГP13د*j I8RTIbT(: ;s@z۟F*UQMiN})ZE2hVZc*6`j$s04ixzcu1V ȑğ]NI M;SQHRsFi(R42I+F`6:FW"i;\(Q@Q@%-%QE0 2EP8tGE]#խ 9dx+*39Fvqn7y!ެ%,>w W9 3=L7ϰzx2tD ⹅',J=PMD9"]+PXF׊MqW;6XVݶ0Pk=;bދ{YHC(zʵg+NM*=(FWԚڸɮ$kѓ!3 r&9x-~\s]Z1N#MPZu(`QEQE傃``<Ӊ\.A͓QE ( ( JZJ(`QEQEQE=eujU`0ÏjE\KՈ+& SS# .Y܃>\f^Gq5cgIkiv|tʼ]NV3Ҁ; ^&K֪ˬip+3J&F֚YV?k\4lK<2}PQ@)2i(((()T`F2yyR`:ZB!kJdݒ˂N=y52"W  zvqWI}fG]S5 ^i#&mG|zUٯLHqyUevf'#9=( ,ૃ]*&mMpx? GG#8>VV3X8ǠeSZ%?'}f!t]68#y]bHjz$kbkBYq9n;zʫGq5S+zg?_ΎT3LX$g]D˱3 v XjdCLETQEJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((Tg8QRGeAm>wM = ^- ʔtGN6}23̬9 J|-1NFsE< GJxķo&H"{x*PZ ( ( ( ( ( I<=[nqUYdTm?{*2[jv\`Edt?If@"1''KVAiEPF:oSV![OQ.R8SQVڣ)*3Y&QEQEQEQEQEQE80PHQIZTPsS'b ^ #(((EPEPEPE<(noʀ$ VnAQ##Ei6.hBaHA*ÐZ&0wg=*HxlUhՉk J2;UCYdH*ŹT 6 6((((X( 3=OM]>lE F;m+!Zq(v)PqN{z)n8\JB 8" EPEPIKI@QL((( 皝Ոq(JɰUH["݀1e]Iipc@T/8Q={V X̏#Ƚ<7&Z,q"( Nq@oy΁_9u㜞UѤ$A0\qSRG\ǭQIed1@a\ à=)A$ϓװCҬ/=d 9j!?vTqZs˙ 9FX"9'p3h ( ( JZJ(`QEQEsI@ TJtqUWqV"h 1M?LzH<1i tvVC琹Nvh]αDoMɎ ITMߍy+$+_6q@yu+ڪ'cKcʟ^4^+)`qZ)ޙFE$JۓQNAph^ +MYPd(ïY3nqN?!Os@ #Te|K+Wbq8b QEQER'@IN,X( |׭ol!(ڴC;:%`OnN{Xԍ0ۉSh%=2zj!K+xd|,FO'qRQ@Q@%-%QE0 ( ( QF)@ P Sʀ:ͿCd*T&Σ#9Ň7t=yhέz0]>%U-|Ȑҹ h\@5rQuEl9 MigsԜ3Wod2HX95C=3R#|P8l]Y玵=ÍFl fW';;s@剨YS\)''UZi=i)IE(()Įh N{zqm8Hl9s@ (Q@Q@%-%QE0 )`PQҊ\P*a#\pj\ngo fc$h(@QE9 Qg ( xZP8AH#ʓM1EM ›VLE M OBA*d @GpKsI ܧ&o\ sHi)q;2:pRh Z1цi@*+:@[}jP1S͸}*c=jFg:@ =ziH%v@{RL~4P< ۵81޽' v;3z`%QH(( p"E0J)QבP)N:*@#*fT>_UT0F=VݙCCwTzwfʙ1cm>:3HNjBmC,g4 )HC^/#'u!!'Ȝ1qry4κGЮ7*3W4`:ܺ3CA4K@ Yi&")`;Q+yJ Pb|@x;ˢ]G5b]E6xgsJң&%.hPw(} )(heHV93luQԍ4D;Gv)9 QE ( ( JZJ(`tvF=:(弡$VcX  Xc*8*FB&$bj;sjr* H=JX,=I:ʷu-kzS6Uwuq;cdeU"Suy 6;;Df;ۋ87UXf3ech.ytp`f Vk Vbf!rk.mz) KO@ԄTMթ`tl2==?:RcրKҐH74SQ@Q@8`w>iW qd'=8%QH(( (Q@Q@Q@Y]z1 E_3*O><̢6RW8گrB`1 JpU8hf[/C tE\{?@ĚdHd}?hM &4F?'>~cXw oN{8=3MɤQEQEQEQJ1s;ʓodz) FH㞇|;4h6?;zgs€(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP"(Viǥ#080 εE {&N]& "L X?še$sZWs$~\qɨ!2pH9ӵSM7M:=6U+05oW`  9?_ҫ<[ RC^-&f!R@2H`ME(\"e?ҭY$AիeT@<V[bgvo?Sڅ c=M$z TrݔlTR>`iMv 1$~5aNV9m4s85p)hAD閡C z ^/34讣@8ӂ;z&OMG}fE@I` `zTs #T],վ,Ĭ6?:m" \7B%U|vX&(< ERl.gs0iG9>KogqԊP((r>Fb6 랝*lre 0:jII3m';ҮzeF g[ʫ+09E_Pm`\Q6hUl֠B?2>yBďΩ=*2@-.9i?7Mi R졷?< ~W@C+fVsvT8xeI YB3xJNh ݛ&S'[]>rˍq~UZ;\8trd*HO#+:%]ƷH˷8UH ĿS$eZ((JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U.p&ٴ#p2ǠM5պ@zo[@dK*Q:4˔ϙ*l2}+\;ìh;{㞵z.9("9{ uq#QAh(((((|*(Y$mVfSds4qIQTmMq-G#o+Y'̋Ĝ p.[AvG}B 덽M[Pn%?gD{( ( ( ( ( (f  094T)+Jx d44LA+ttQEQEQE((((MKoV|գoR J r8kkX]s@lmD%GM0veOSW-o36`تWM5ۨ րjHaUP V_ mPz}F8@W6ʜ5*GS.,qJIBϵeLUxԒ1ZA9UYbZȑ66:ƙZ+.EPEPEPEPN,P 瞧ӎ.6}s\"#x畐WM;H8'=illw._!VSgH(((EPEPEPwFb {F|k @ݓU8K"¶sүJ[9}+6'r)fC$k Mg9Q$[P*ԋhcY\uߌU,2N H 5Ia!)"%^} vK_THIV<˖2ʹW;*F@iJOS0b߱ $yd ( ( ( K.+e0.$JK%]IFxl6=~R!X[`ɉp˃(? J8B!+ +Ǒ z}8}o{,>FX"9'p3h ( ( JZJ(`QEQEҎ(EH=j|ǭUR3V#|0€.Dp$qVa $׭f' #v@̦ml8?څ̶o݊ê/Fҵ5 .#Uz (gi 6jv'>|dfG_ 4d 'c^rF$y[jg&м$?\P&9ӽZ{۱)n @=Rs =xgqt1tUqhNcPQKI@Q@Q@.p $Ԕł00}zbL̎;/CAhmRX6$`N!HmH 56X'HHXdzg (QEQERRPES(())€FjUH9N<H0r9jEpT`s U |nF=( .=)?ʺ]QXa;郀=TEϜ>YF?5sә]dbGq+ >z室mOAj٦f#|(= bzt7=ի"Q Dс>bav1@dPSN9oNMW-@ AjJJ( ( ( q+8sޜbN!@R$F:f(EPEPIKI@QLQA = (Bj XRSۑJߊf8Zc&@>(8?Jn*@ncg= &RRȪʧ;CA 7Ks{2 rRV^V\ Un呎GR /!j"sO$:RbIj*3^*8 8j6t@Yd +J I{.9RRJ( qFh(@O%Cp鈧G885[: j8e>\ngo fc$h(@QEmF(Ͻ(ϥdRr)NI&UOIL^x ܂*%zZɴL]kbYAoj x7= ,3BC)9j[$Xf,D ?ZfSdp}?*ұ(Ҟ;t ;5aAiFk^EolB&}L ֨;ji4Ji((v( 8Iޔu.8]緯3 )N{(@QEQES)SisIR)T#5 <pϽX9 jDQȠ 4 i.,c*w(?ʵN?D1ᴾtS:ʑdtA(˶dHYrAˌt (M o·f'CaD49; L PKeb\PX={UK g~{Vtf\}kMC m# ߥgw26m[*B>wrhǞ 9sMP1Eb =(ϵ-!Nҥ:;ܹPQT^EN?u) q@>kҮ1"08Ux&Oi:rɁ@bdhi1R )r)3)@Q@Q@8`w>iW qd'=8%QH(( (Q@Q@Q@Y]%7pjƕ'Fk:؎m=^2 \$t8 d$o΀;+Mfhr{knW Z/ڧ+d{t1Va gs ۟z')g; -9g ^E/#Q%QEQEQEQE*A#4*LQAHT09 gz޷m;ѠT"rAQ Z(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@$[8> <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih(JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U,pKhGeAm>wM 8eDӯMLLzh/Һ飼:Alѷ9\я8oZR彉 RMD\Uz(QEQEQEQEQE>G,yhzVCa298$ UJd#[́UE~bNN8?ΗWԭ;uu #ҊŒuަŨCtĢ=\Kpy-`:e<6&5Y`;ۯ1H TQEQEQE(((()UKQW"N@$V ͍*1 8,$,s+C:/ڸ>7 9]HSʃRڮa4+*O%L8PwႮcB#ڻdzIwc EȄ=pTU{8=L>ǥ2((((()قbB('x%8JҢ$s> wBj6뚢˴((((X( 3=OM]>lE F;m+!Zq(v)PqN{z)n8\JB 8" EPEPIKI@QL((((ɩ}x;zձ[ZG$qY6b\8状9PKu.Tdv73PNy)2*ȮvnҀ!U!܊8իY@@Y᳀C}Yg\ iMÎIY J`^Ϊ_FX"9'p3h ( ( JZJ(`QEQEPnj8;UtZ#/G"*E<pKk03֥EGUشdSr{VF3?V֧x 15WTdI aQqP&O `SvNA- USPĞYrՉm%\S Ԟkۚѷ?0,vs^DMc [ɧG4e NH >sޖF8+ҫk=Tf\nN8O#i9gڀ R!sL=*Ivyr脮I횛a'܊xd *54>ڀ}i)s֐RO^ fc$h(@QEycލg4gi RR; J`*G9cܧҕQc@]Q{ar3T䁓 7NǐC ~"1, t50` b9E<4M78P)$HYUɠ V;Ax-jXWa4OQJIX +Sگ#OVs}h!QE-0 P=裚@/ZZNh40Pi$c=x 1A]Nw zsޘ ER((SM?J3MOZQHx|)z؀$ڮ) k` Zq@r2}l(plP ZeowbZK\Oh#f*R z)Q > *^)ٗ@PA`fn-i 4hq(ڴҦpGEG9;{PFmiI[~1KW+Ƭ|P"֋pY+mS Mm$CUyt' O4RGc!y sC}i IK@%(#))I HM֒Hʑ$rgcޣi^4v*WH'C Si5EsÂ?\D֜WK (*a4\D9FrYP p@pc\K3[ a+41?ŷԚ۳f@e(4 Y1 /=_ARe5brWn-L W15;tM HdК-5щXB(iTO"MX`1}*9"+IMY0qi1@3gޒ J((\Pq ;^q+8sޜb(EPEPIKI@QL(((ΝՕ`::(C}E<܇9Y(^;FǿpjwHH G#@0`\:[_AQp1\^nw 0&ΜMݍui JfwRGsg7͓?=~jkb_I8,B1>BLv,\=Q@Q@Q@Q@R*d3@;mtJ8șOVn!.G{05jm#3ըG;ݛ&鶡C;?OSI2A@9;swe8'3O?EmLI8MXSսj[G$遻8=ME\.o&2z(#A:eP9žxkBW#f:+&Ď:tǞ8 3:gٿkQoPp ?6^Hq3uo+ E1+" ;NHit ЉAb'_4iCV.$a jHd`*;RS,o}f6IpeOv:rvVdjvW8 :~.g> R%SH κabg2q1±/$V(((JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((vc@ '"ASM[d8eb^yRyiw(*l2}+\;ìh;{㞵pxA![ؚ[$ۉDOuW AEPEPEPEPEPTyB'm? k463#JzWKmNklr9΀'}Z<^d_$du}J#WP;(0\(\mjZ7Kq)FX"9'p3h ( ( JZJ(`QEQEPc>UzSBM^Rx$ܚok/W\eqҧ;~b{Q@$6M5uurJHQacqyh+!GF8a5jW\G4xV )]_31PԮ|( (=4 *a4l,B_$1UYX"z沖@9j#4O89HXv5$>Ƕ?FS)֘q@ EPEPEPKI`g%8` ;^!/j3#9#PPZ4 > F2 ?8=S;mbR6n'M<09z.R(ㅒ5 ?xH QEQEQE(((ZpP4HaX~leSæk<sSͻ ~=)ft!ԁ jtbՖN:2[3iNO*pPRBUXܟgT@5h4)|}*“<jմ &E_STZѻut}YIKEQEQES\.A͓q $r14QE ( ( JZJ(`J(֝ޔ 9JFj6j\P{b=1R+*H@UKwfQ(hm `v#YsFqJƻ}YHv!pP9#O-4Ri#*@ހ3@QER(S4)(PjPϽCirhv }jaIѻ>^E3;{WHH( aֵ%V^gq]Ӿh8{4"fʒsUJcCZWWC 5IPBy@]k;h#seZ؆るq@ tEF@?k\vӭe W9 Úld@J^b^ڱoo=눐ؼ<߉j1V-$p+mN s*ɐ*1Sg,ֱn,G֑ndw*G~}> fc$h(@QEqMPKۚ2(b֐lS)G(.?J@*DsUV7/!0("xI,6ީj Wޔ=ސ;9q.Bu& $b1-\rL0/!=SO[yIϦ(iF80yn$|@ZHj譭côEКH{V vb @w )blunwJҼl(8V\984]iM4m)1ILz:SbQ=(`.I{zC)]Nw zsހ(EPEPIKI@ )A)⓭&}hZ@9x5*y>if(ۭ[rzpj(6u5Ƞ T pI`to/N;0`3֏Ib** 7l2OJ"d[oYIyK+= ^NkXgN1QAJ@3ҶЮa8hN1Q&18#jQ0Mniʳ+utaZt,nZyeOE֨_ )U\밴xذ\@Mq#T$}5 <i@zތQژ3K)(yA>PR42I+F`6:FW"i;\(Q@Q@%-%QE0 (u< HG|V Pe>Uj2Ҁ:b8"Hn݉[^J7BEn[]@qh7Ȯ=qO"-{kH݂>qU]ܲ(O; = *'g@=xy.9=+bR sߊ+ȭdPM銠*?̖g[W){UĂ]Iv]GM@"Fm>F]N,O.9-Ж=qD>;LĒZH9 [gBA\*# PbsIjSE7w0 1֗#4iQ1I)f((\Pq ;^q+8sޜb(EPEPIKI@QL((( EvȠjE_L.yOn*XS8DZ(an2Ww&ũu^;9)G@Ɲ)B޺  `G@+[&qz7̇Mf6^BW8-0R+Κ-4?g'?n}Ӯ,2۩IZi-cr\B#~I?)l{% ( ( ( (RU9fIv72x=i #$ C{z;gyY4J[NH=3?¹@ ER((((((((((((((((((((((Hd+gҴXgZEk"tz =ɓh.o&M]29e+TvH?. 8Ȋ_8$ک_A&ݛ&d*px?7k 真U@gi-)rܯm3) gTJ|$0&".q2VB]Ž `j2۪G f P-rw17M)mB1wڞexrv=*9PqO*)Yf04;Tp?x?kzԶIvq{f]KLee "PGHtPs=ք FtWQMt=hqHfgu&>֢ޠ$AF0~l*9.ブfZVAribVEYv6o.*Nif;Iӎ֬\IF x"B634Rp#@˷߳ʸ? jE~9T`A Bӣ1pRwN6CC2wNԃGy$UWf2#p^3S-U٘ P6ذw_MF*6AkPL!{YX<ábGTMNjЗ㴟ݛ&ҩvP۟??ҫw TݕLW 9AHe.MZ4c`Z{[֠uT."rT&!+3=EI# -պ)bAoϥ9dbs0Ek3ITmU_sj?m\<f2<Q:М c;T!6 cc9X뵈EQEQEQESFy= 9͟\1@ HH'md+U%N*0 oZb#m HUR(())i()QEQEQE(U]aӵ0B^6`TmVՕv (3(PH*w81֧Dgz*'=A@ Ur h k"HP{df53uz@ EPE(/ PjŽ"Cb{~'6גZxU'9_EYQ3kXI`x#HN;Vf}#>Z1~QE ( P8VMR 4N#xqZL~"~ЇjIx ̤F*:6N9j 'U<q*p q<H wlIol81ǵ=OZECV (RhՔ.aژ$~5ڕ#z9®Oj:s@k2X9FV̍c0.?:u')_ Wc]P~Zñv }ws]uׇ$VݺAjZ|620f~rjW9Qʺ=\,( mב4Ry%rM33iGj@A4SQ@Q@8`w>iW qd'=8%QH(( (Q@Q@Q@I^?rSU (](g?0SLH5El+7 ܺ 3Ұ#"I ?4Nher{nktEyj]OܕԇQ=n4۶w+w}y a^lSɚC449+ 9c,IU_\^Q!soW=EYkd9cM ((()T`F2yyR`:ZB!kJdݒ˂N=y52"W  zvqWI}fG]S5 ^i#&mG|zUٯLHqyUevf'#9=( ,ૃ]*&mMpx? GG#8>VV3X8ǠeSZ%?'}f!t]68#y]bHjz$kbkBYq9n;zʫGq5S+zg?_ΎT3LX$g]D˱3 v XjdCLETQERJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((RGrǠM6un䊽m[\dK:pleg͙X6s@x>.MZ4c`Z{[֠uT."rT&!+3=EI# -պ)bAoϥ9dbs0Ek3ITmU_sj?m\<f2<Q:М c;T!6 cc9X뵈EQEQEQESFy= 9͟\1@ HH'md+U%N*0 oZb#m HUR(())i()QEQEQE(U]aӵ0B^6`TmVՕv (3(PH*w81֧Dgz*'=A@ Ur h k"HP{df53uz@ EPE(/ PjŽ"Cb{~'6גZxU'9_EYQ3kXI`x#HN;Vf}#>Z1~QE ( P8VMR 4N#xqZL~"~ЇjIx ̤F*:6N9j 'U<q*p q<H wlIol81ǵ=OZECV (RhՔ.aژ$~5ڕ#z9®Oj:s@k2X9FV̍c0.?:u')_ Wc]P~Zñv }ws]uׇ$VݺAjZ|620f~rjW9Qʺ=\,( mב4Ry%rM33iGj@A4SQ@Q@8`w>iW qd'=8%QH(( (Q@Q@Q@I^?rSU (](g?0SLH5El+7 ܺ 3Ұ#"I ?4Nher{nktEyj]OܕԇQ=n4۶w+w}y a^lSɚC449+ 9c,IU_\^Q!soW=EYkd9cM ((()T`F2yyR`:ZB!kJdݒ˂N=y52"W  zvqWI}fG]S5 ^i#&mG|zUٯLHqyUevf'#9=( ,ૃ]*&mMpx? GG#8>VV3X8ǠeSZ%?'}f!t]68#y]bHjz$kbkBYq9n;zʫGq5S+zg?_ΎT3LX$g]D˱3 v XjdCLETQEJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((v@ ' 54}պAqWk xbϦ\|ٕ=Ah/Һ飼:Alѷ9\я8@Jxo&H"{x*PZ ( ( ( ( ( I<=[nqUYdTm?{*2[jv\`Edt?If@"1''KVAiEPF:oSV![OQ.R8Tv5f7EGWLx=ҨK cK*>\w⚲qya .9"3֢B_ Rns@"lz֥P1ڢa$ 9+JA) FX"9'p3h ( ( JZJ(`QEQEN*ջmlJS#I<} _.ہ8=*Gx'vK \ Y5 9{G͞5Ywwc~D_i8[PI#a a g{p1h7DP(jHV,}A6je(P[_kVDsQ2}+^ (Ħ2T/Zn6Aeȃq.dFhEy9M@ (((N$03ڒXP@FϯZ\C Qieswu(- wK#)ڝ6I XaKzd=XB)V XOL ( ( JZJ(`QEQEQ@)Gu4?*dsޜVVZ3ڀ=+I1퐌Mc LyUb֎s7(;y{>+e3@SN*L~~*;[uF[( =ib%2d(vL [rr1@W;ӼjΕ1սEiLSen=<IEQJ~QES\.A͓q $r14QE ( ( JZJ(`R(Jiʙ֝nh8&pN:Sd{uc!X=*!O^9[gQlhrg*t3D09S;\.+QL V\1jK=ݷ<Kc:ZF?9dUYodvbNh8=j3Ҟϸqq@ qj:niB4sΨIʸp>𸄸unՇ'$Q@oz{S()h JZ;PQAPSi46:b)ym AV2Υڸ'ƀ eϗ:+xdUe"B B}>sDKxrz΢)QERRPJc.9w4QE(UTU V @2 #Ua?J\8$וd< ZLg̇W3!$Xs֛sOQt kxf'sp*p FU tbZێHP~V-J6]];;y*|#G'KmJqZ͌d(j:(@Jp1@ьRb{!ݱx x=b[^IjTV۴~Tɐ*1Sg,ֱn,G֑ndw*G~}> fc$h(@QEsIFhGz;wjLR4 mo8i2xB?4F˂F*14t ?JVlOTӨ ҐqJC+wi$H 5?zu${PWBkAz^e4iII ڰÞ%%ϽBgvdS`h0yn6Mcܷ4YDҿwmpp=(@QEQEfMɥ\@9N g4ƐtNƠ=`-)~U`2@qهOmPGk:;y 3+nyU@nƀ9mBXSVf 5wJK}FEW_mS,wc. pі#F{E$M*!c`: nggy>X=N2I7GķlZi[B_C Y7Pj[",M8'4|In`(W9jz=(>fiq5I=J$bMDN{>4;RHRQ4R4`zsFhheHV93luQԍ4D;Gv)9 QE ( ( JZJ(`QE.j@y8 I) ?/H.V<ҧOz {XfP}kX*яZK7ތFú([e Y{? +QE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($IBp}+N=.PyVu|-tV,NX7@OLw ܙ6r60Y`H-\#pZһ%@7d^MA AUlgٿiO"Y'#zX}pNyYv *i61yG͢Cn)B)j$%(f_-r`ܗ's>ҝ6(cxi&W('ns`bd򢕘` HmUI' vKh񤛟07gǶiMDVRB%4L 8S?hJ}`ٜlEuNև6fgZro??7Mj-NTcңI89fnd(f%dU?x9iim.(?ҬDc8}jđ4l<ܐAgR*#as;M'9?_}<3֤WACI~`-:3w)pP\Sd;?-pOqMH4{WHIi=eQvk-7c<gE2UY]o *l8*u Dbd&"U:$~uN1$T閪h= q;IgٿkH]*e N*Wp0O*]5pZpи-ZI̒Sv8x*UTtsE\ϳ4fڞ??ؚ\nN[ޣlTO!V*D} YQ,2L5.MZ4c`Ze-P:҂*C<5[jI0?JE(((((¨O-Vۜ~jhl58fG3GOJLڝr8r?O{kyby*ȿ/IGn$wQT `QոnSxG˔y%8ABxƱ,]Pc{u)J(( (Q@Q@Q@Q@*v $']4zxmډǵIe%B2# {<@f|6X3MKqH%<{?JA&̥=PhZ̖?-۵2ƪ:lu( ( ( ( q`B0H8w`z58Ҭk@}zJE-GrFTi&O * e9JdtQ8dTq֔}hEJjY".8*GNߍi])?^49x>JhL`T1=3+2X%}B #QEQEQE<]37V&>a= ]H @&iKq̍2lzB9j]GPQZڕpBVA(W"<(GtXLT=k776F5t!DaFv `p2(=r0:J-L'ol ^ @>5M& PߎpC=(F&;=+R++g{W>4~zرG 2GTH}Ro1Dz1#Չ%p;L9Q|ր76WEZfdw!xt~ FoA'Jva RCjFmǞ=F5OVEpF`B#'8)B(( (Q@Q@RTҢԡvujh es*ji Y?ph|$[_-C?JD6;DKzMŪ]$л1Sj_pL K^w/;Vt$I/|Te;9:͜$ێ 2(SI@Q@8|9oN1M) G#h3ER(((E(%UyF=)B95?^NS= 0j1ɧ@Nt4%dc QIA= W֟Ĥ>)XLU,ǥmCcp7x3#&̲6w檃8"0jݯ>>l a ̌~Bۂ]9oѴ,avKV#€*=ER04JZJ(zRRހ(hmtS#CopeKSpONA2˟.7|u3W5ȫE\; )}in扢mMRER( \Rs`I 6*ueU`SՙHL V߂H2+tO5_P!9>;8?Ss/-FNq\3wk?|Ll@g;+y:sZ,=IIX3> ޜI)p[ ٤nrYx8SOW6{V8M&J(;@r+k0ÑajP>f@E@dzQN{gGҊSҒ Z8(iH>b{!ݱx x=b[^IjTV۴~T!fUFbh*Yc$Y3c㌏":UY}j,IQE((ZQ֓9Qiy<@z~{=@xŷ5<)Po/ӽ0߷z]ڴD)f9e+׊o@^t#h>=8^j}!^ǐ#W~8Nfo:JϕX_t)]6I?Zrfƀ_?J3 @Oj+x -F?!Lрz9&hc\.0r~ZTrIr<~?±onv_aү7fG`XrlhsLcNe4JiRv QڌQ@(ў8) X#9ڐv;3zJ(Q@Q@%-%(8M6`;4Q*@EӚxcL |F}*C ު"AU.F A@V˕pOU@p?l5 RFr>aV՝G=SQx\=1Y½ m*WTԐ|>|oVSjuG_H+ءS'Eg20xt[c|! FI+9"EswTCmq(:I%Xz UGgJᚫhS H:@ KQ&}0M*FT%hc;\HJM#qbڀER(((EPձ֗Q|֛N%pA6NrsӌPQE(())i()QEQEQE"LV#$COjEih,o8>Y]ֱg0jE^C8o$SIJ/I} uu+ O+zK!S,󅼹^?J-g?wW 1qOnd?QﺼNf46C=NK=>}sqe(uJV"b?-\jk' UIEQEQEQEQJ1s;ʓodz) FH㞇|;4h6?;zgs€(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP"(Viǥ#080 εE {&N]& "L X?še$sZWs$~\qɨ!2pH9ӵSM7M:=6U+05oW`  9?_ҫ<[ RC^-&f!R@2H`ME(\"e?ҭY$AիeT@<V[bgvo?Sڅ c=M$z TrݔlTR>`iMv 1$~5aNV9m4s85p)hAD閡C z ^/34讣@8ӂ;z&OMG}fE@I` `zTs #T],վ,Ĭ6?:m" \7B%U|vX&(< ERl.gs0iG9>KogqԊP((r>Fb6 랝*lre 0:jII3m';ҮzeF g[ʫ+09E_Pm`\Q6hUl֠B?2>yBďΩ=*2@-.9i?7Mi R졷?< ~W@C+fVsvT8xeI YB3xJNh ݛ&S'[]>rˍq~UZ;\8trd*HO#+:%]ƷH˷8UH ĿS$eZ((JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((.ݠ sހO+A=jiu4,[i0(莝leg͙X2}+\;ìh;{㞵6-P:҂*C<5[jI0?JE(((((¨O-Vۜ~jhl58fG3GOJLڝr8r?O{kyby*ȿ/IGn$wQT `QոnSxG˔y%8ABxƱ,]Pc{u)J(( (Q@Q@Q@Q@*Wm@j!M=b%GhiJ7%}Eh>2v]296)U$^z8SʷG^dӢrIAUƞuiqBErd%Wk83f,On'# rhX `0OPּ}.X7(QEQEQEQEQEQN.3aA=sh(ſRV9 h&hWH袊())i()QEQEQEQEKw"$=kRɪ> {ѲHZD$GԮzGX|9njԋIAR;~j,2eG$ 2G"F| H@w^BB_Bhx49V=Z3!UU#'Zf@@0cY85vyz͑67izER SuؠEQEQEQESFy= 9͟\1@ HH'md+U%N*0 oZb#m HUR(())i()QEQEQE(hQ UߕI?TG' Ќ6pzPe:֢&p=#|";PJ%O?Zb 5<X2#Cu a@ dldqPr C+':!(:*!!$)G 76jqFF9@;Z0PY8]J+]G2zh =Q!5Kjx9Y<W( JHQEQEQET[vDn[,8l)v FGtVmY-rO26a ݫuLK\AEh_jV1y Y^Dm@ q-Ls<,G{4]>ܚ݋I#g~52HH F{P"RW<ݚ8;pk~mt@R@hFO,7'}Wx!_Ɣg YwSB@FIuDkā'mI$YD{a p\Ȯ}Mg£'&gh(((Jv>l緧ӈP#4)QEQERRPESRRU<Ҁ1SsO.Q1@K 4c4$VI#u V|Mp;-9*ޟ46Y԰U;W,w]8{y] U^^cx(Bϧ֖h)v޴ A@QE ( JZJ)ip3J`P(Fix5`C!eަRLu"d և|"F|}7\HӰywsYG367gZj0sNU?j[s͸٫VVqv_O3+lV,8)rؠɀT0+#&b1k7Hvȋf!FϕvFLG5 wҎ (gJv(#ڱoo=눐ؼ<߉j*ŵ䖮EmI;@y2eTf*pv⥚8E36>^8-ӬUyϧ֡,rğ%QH(})(&3Gj3@ )i@QOivS+U c"$8 *zF}D4EVHx")$4274eF#׬ǗJ .xm*Ἱ)bL Zȋ u޴>o@ Njh\zՐ+|}(K5iiT^}ӁY- rBZ%;7~$…k"Gav'OQ*Nұ%Hw A?΢ g)`F0}{RfЧp;x=9@ EPEPEPIKI@8)S(c$=VUfD{|J %Z85Z (]ʮe#xW}jq@3$94u𥣷Z?%PM !4Hʑ$rgcޣi^4v`iMv 1$~5aNV9m4s85p)hAD閡C z ^/34讣@8ӂ;z&OMG}fE@I` `zTs #T],վ,Ĭ6?:m" \7B%U|vX&(< ERl.gs0iG9>KogqԊP((r>Fb6 랝*lre 0:jII3m';ҮzeF g[ʫ+09E_Pm`\Q6hUl֠B?2>yBďΩ=*2@-.9i?7Mi R졷?< ~W@C+fVsvT8xeI YB3xJNh ݛ&S'[]>rˍq~UZ;\8trd*HO#+:%]ƷH˷8UH ĿS$eZ((JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((RրO+E54}պAHeD1J?Ӄf.S>l4]oeF6 hkp2޵("9{_ uq#QAh(((((|*(Y$mVfSds4qIQTmMq-G#o+Y'̋Ĝ p.[AvG}B 덽M[Pn%?gD{7eB1jؘLV^Ȝ reJZ`v~qB\ 9STUp񯖍+Hg( ( ( ( ( (f  094T)+Jx d44LA+ttQEQEQE((((@EKxWv뚭 />٭H" 3 V1{ZOܫ.w7qS%vd0EQO9_hFя7tn[PX]/TQ3N3H )S|Jg9cX.3OS%O@mKgȡ= jK捣?Jellg#6G8l6PQEQEQEQESFy= 9͟\1@ HH'md+U%N*0 oZb#m HUR(())i()QEQEQE(Lx=)9<ЮB,*7d~~F+LTaC)V\,sH|}@a;d_xS2U{`"U+bP 2Y@%K~w$5I8h˴cvx3nn#|Ry[ _V> X+b\2+BRJ% Gh瞟NA_[y%$ *(( (Q@Q@((VߪS#<(>>a R+eE@Ѱֱ#;+2koIHucm6ȷmj23BF_*F3QLPrAsEXC#qsz8i$˼^;޵mTLߏjbkxe=TcpV*U/ϑZsJs)U ݤ u5zNT=jphQEQEQE${RS (y@+aA"32;nb:e@aI`c ۥ;S)!#k 6| cLR"8Y#_0!b ~EPEPIKI@QL(()hE*9Hnɧ>Ӝ 7\x۽xbUFFh|"!q}*F Q Y$ǭkZE_UYj5z7+9̌@@ Sw95\`%(((]'99)!Hc&h@QEQEQE(PQZP(fnOv40s@4ԥDg" jr8t &ٕK9_\EqA#UYzȈ6LU>  yb=N*HYDP95YFX8bK9(;}9g'k_[Y>ŸIgdz6͵ QP8<ի36XGU/zc1={h\A\²I@_qԬ{ds@ (IKE%RPSi46:b)ym AV2Υڸ'ƀ eϗ:+xdUe"B B}>sDKxrz΢)QERRc')qAJ;RRA  L)S/=zP9cU0OZd?LSsWss#3̤cZpYwk$&;E8R==m4BPv v&5 bSQ]+@La@%#1-Eq9ϭt3 fc$h(@QEԀ4+DX9ֽfR7:RǨFFV+u L vẓ\XT>͉8R*y<{U)H9 H4 -lSιh=3֢- MtWimcz+ rYBձ_쪤/bk1%PYO <\S@qM7ZJ? )hh4wRq)(۵81޼bS<QE(())i()S(;Sw\~t)z`Mƞg8> s֭PE.Xz` d9dϊ)G|*R4牌 p+cz~ %Yc=QmK yګ wW{sfz*=?B-0 @o@;FF)yR?sVyAZ֚dz ޵vu AE#(Gy0>c.r`bA4]985=E&~\q@/8=Md=*YKO>P\PC'44R)ywiqHx4zBǚL@Hʑ$rgcޣi^4vo?kIBҭGrqHǩ|:r"a4jP`G9fpF9_Ҽo.0n$#@ĺ1 6}IkѦs476&^h#9PW#Kd.⑺b"HfIP* I%QEQEQEQE*A#4*LQAHT09 gz޷m;ѠT"rAQ Z(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@$[8> <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih(JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((v~ty\".X4}պAqWk ޘ#t<4˔ϛ29eW[<=4wYh<эw6=k[֠uT4\m K˃q e4ENmArĹwұ.ݝ9a)/+*ߞx 7Ic1;PtQEQEQEQEQEQN.3aA=sh(ſRV9 h&hWH袊())i()QEQEQEQEOcn{ uc9#յݞjJ%/ݣ~eG ە#i!զ,D##; opy HbejxL/'V.᳦ޚ%EDFN)>|+l,jڳkbT cƌ1@y!3橺lPh((()Ł @#<qۅۜϮ{~ ^Poi緭1b퍎*p)QEQEQE(((g&%HARHzD I(Ao޴DkVt:t"^4";)t֍R\du`EIm# xD"^AIh9 Un> 1Q1נ K 5W>n)@z+4 "@8C޷bt^ze۶v;{s>wsYfyPFH9N%h^ZyD)?7ROj#QEQEQET[vDn[,8l)v FGtVmY-rO26a ݫuLK\AEh_jV1y Y^G?Zz8 5<܂=;ŜkpFFOǩ+kB@> ۥTO..2yGClZ|eAe#'S|ܞ5} Fy@Q@Q@.p $Ԕł00}zbL̎;/CAhmRX6$`N!HmH 56X'HHXdzg (QEQERRPES((;Ԫ8's@w2i[h9)3ЊTIx|V3rHP3Uzspj3ր J){QEQES\.A͓q $r14QE ( ( JZJ(`:PR;RtXdހ))`;g%%/Z(((hmtS#CopeKSpONA2˟.7|u3W5ȫE\; )}in扢mMRER(R1L>Ԕ3@ J(Fh`2[zN*9ˎ21ҫ#]ndWicP8u)=POh圆 h=1]ͯWW͆Vd`qg~}~Ux&8{'Тh& 9O>][l$+}Niu14́(\iCF vgeDlEĂO,y~(>Y$ b`x^ĦV'>Mr1 dLFߩ g95 Uɔ `bRJ@h:4JLSLHՋ{y\Dv1 OPmy%Q[npNsS/&B̪NќTZHfZEuܪ39%X)QERIFq@QA\Nҁɥ.@UAT`qV!0ۀjֶrs%8'J6 -i&̜icW-hńrdȮ,-^Hp I+ԞtsXC9uN?:Av$/`1Xג:F}3Ҷ5P"RɮbYy3g@'q*8ݪyQA4;RIJ8ҊP2yH꫷kqdt>޽ Чp;x=9L)QEQERRPNE0MޔuqQCOӑL 8,v@n3W!MJ^;VvJIW'"2<´RFjtr:V9I 3EcHe|%Npm"3nN2wW^nieRA,VjYӗW9xmvc' 2eH!끑Z0[U&Vjq%"Ԋ4淎(*(?bV$B"U!#$`X z .lyk-ܱrji$u5Q5ݩQQK)H#) .qސi(R42I+F`6:FW"i;\(Q@Q@%-%QE0 ()CbEXG.6pk,7JG @{WC\wiV ߮({ȡRDoEd9lvH}EeKtTc;I?=28 Mf2r}52jԊ7/ƀ=@<@sѱTL2B`+ӮZT +['S#1 ݱB=:!:m#kHmi#s<2;h9w1 <50"HX{)'&4¢|f3IS;v[s(As0Jߝ??٨M~ܬEpM#FF9.hdcn!2[&y\~/`6I%dj2sPEPEPEPEJ#<0NFO!Pd9zߏY+3FiSi}GW<(h@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI,lVz\2: _ZdX8nZA'2mm`$)ZG;@쵥w2Jn'C+=;U8$O>ӣlERNZFva* .T;mb%$ *OD$R2&S*՛HKQ Z[uH 5j.N/}f:mP9=;SLPNG*N=6E+0 &tG`NVuoCI7>:`n=lQW vJij1p0Е>9ٻN4 1#8#)lδ4gvo?[6 ͟ץG=5Epr[J.Qm2Jȫ9`~sӦ-]%t"PX,i9qՋ"hy!B~U(Fw3jNs4vyWgAH *8Ztf SnҦw(fZ.?h4ē6zʣ=*צ[$n x8e3xJU[pUiY&8?Mj D##oz+t,HcI-Tzv>֐U.sUy\<`1$ T;jUg<h;iLCOp?Z$#;Xʧ@pT gٿh͵=55!YS,ݎGUݕ=3G* ϦBTT?³Xeؙk~ys\dgK52I!U* (?0JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((i@$T qpcTiVhY"i0yޘt4˔ϛ*l^u Gxu'}o|sֹYzR彉o RMD\Uz(QEQEQEQEQE>G,yhzVCa298$ UJd#[́UE~bNN8?ΗWԭ;uu #ҊŒuަŨCtĢ=\Kpy-`:e<6&5Y`;ۯ1H TQEQEQE(((()@,p:$ջx3 X4 4J҂Iे%ӣ!I\(9t>)6E$^ ]$H?Ҥ%rqeÆ #=(pڧڲ"+2qXD[%} ")9~x!" oaXcluQ@Q@Q@Q@Q@S ąPOAJ*qoEH<}2x & :R:( ( JZJ(`QEQEQEQRqҀ%deJն^V@ugCv W GXjSQ1<(X0uEJ4Ҩ484 qֵʤ\nG'}Nʄ fÀǫzT٣ I!f0|9=$J`hL;K qlI:fȣyE)((q8jJqbAw>hxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQERJQ@RH'g4cv q^U˓ޤ";S,6TP >C y#*̬[^.\X%';pB8ef 8Xc)QdP 7sɤ4p(_W-$;1gX8љ\zrتSɅ?)hG*8nwf];$.zPo5g5 s`gJJ)h(()Įh N{zqm8Hl9s@ (Q@Q@%-%QE0 ZJQҗ8J3h#3֘y@ })ǿ59~O0?T瓊Z5]ǪLU 6P6bS@ )P3;KcfHWt%ULJ&j2/t`:pO"GZq-9*ޟ46Y԰U;W,w]8{y] U^^cx(Bϧ֖h)v޴ A@QE ( JZ1@iqK4h3H Hȫ>[r0!x ֠k#!s٪Q_iR99zSm]Bf㭘 =״h[GY7E08-vb$@+ecxUk< `YAҀ+c=* 7('JvȠ ͨpT`vZid yޤdRcp]O@ lzPv [rnj3pʈl˞٬;ȳ6@s>jx QLb(ʱoo=눐ؼ<߉j*ŵ䖮EmI;@y2eTf*pv⥚8E36>^8-ӬUyϧ֡,rğ%QH(Gq@i^(@&)Ԕx^x#jU|+Q3vȭ]~V+ƪ0ݴ(9曃RMDpj==u׫ci b09\WqZֺ{"eOAހ-9f$TqX(A~k뚬0;@ ݒ $b6v>$aV$8XKΜfhhbrDSu5_@$0p+l6гc毃A$wkoOb|'GPs^a/jx<)IC,9kyl0>sx.ß$Jw5^kyp6& *Ci_Ai+r6a<"+^L+RsSEar' lЭR0pHfwF ;eL6uxqXz.8*}QomA5Ғyu-ĥ==62(QII@h)gQQx$b9Hʑ$rgcޣi^4v!sUMQ̀Y n9fGrލnp\`⧒'0?ZtYv#]#u}Ua@]\Bsw0n$@<⶛@ku,ŤϦE`ZMg,q @ycU %)H%:}K.*Q0 H`Au1,A'*&c)4IQIL4QEQE傃``<Ӊ\.A͓QE ( ( JZJ(`QEQEQE9du9&"=*ɷ8lC*( ffRX~XycTz<#eTw"onP8ǽ?J~}f-(v.d=6kݲ9?S|Nxz6<Ʒ^3-^K0 @\kJdݒ˂N=y52"W  zvqWI}fG]S5 ^i#&mG|zUٯLHqyUevf'#9=( ,ૃ]*&mMpx? GG#8>VV3X8ǠeSZ%?'}f!t]68#y]bHjz$kbkBYq9n;zʫGq5S+zg?_ΎT3LX$g]D˱3 v XjdCLETQEJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((i@,pLU>q<,z m>wM = #oZzatD'.cϛ*cpxzhymz5arơprR彉o RMD\Uz(QEQEQEQEQE>G,yhzVCa298$ UJd#[́UE~bNN8?ΗWԭ;uu #ҊŒuަŨCtĢ=\Kpy-`:e<6&5Y`;ۯ1H TQEQEQE(((()UK0dK0U&o|PabԚU=kF %P`zZIDUX(9րXDWbW,$[Fz٥!f-5sͲ._ @@mڛGf4,]ش],XѓF{@2ųOQWE%1$Wvr :ž)w]SR*PXnaVUrFy4 4GlK5Ji|i|GmP 'mf[ԍLXH, ҅|3:{Ӭϸ gGBw|w7 TtD''(mlڤq̸n#׭m\\PGCՔO\b3] 6)~ԢdU'B@ ((((( S{Sinns>b.AzBNsVJ& T`޴ŊF۶6;Ґ)3ȤQEQERRPES((rb(6 'f~iF؀ϵhZ `wa8=*Й$j*B0fm{`TW_# %;\8<7Z494ub:f=*$vo'd> `X`ƴ!H"O`ygy%EE @kpkxws]3r@?Rrpi+SPdP%a= ]H @&iKq̍2lzB9j]GPQZڕpBVA(W"<(GhxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQERQ@!H@4¸s#$o4wmr9 SH('8ɊH֏%nI ls6@QHw]qWg7){SOA@EZ)jT| PN1w9~5v">]7|W>T14晏#uPEPEPN%pA6NrsӌSi( CdCLE(())i()QKEQF(vHF J4 1"sN#0zpn<(gJd(Iz Ia꬧zja8)lc%Hjqȫ-HF#>9jD)gS@ 9VC޵O*{ḫ@rwY$n ݆,Uys9R:f @6qH)PzF9PSi46:b)ym AV2Υڸ'ƀ eϗ:+xdUe"B B}>sDKxrz΢)QERRPKҀ旨ac{qH8R:u#ҀZ6<=2+I@[ZV, p(K*fW/;pq] ,F`XPچi0q0pBGҞ' _uZn-7'kvyzJ ۑg]Yѱ_'L޼[qLiiNs#<Km 뙭c91M#0} r4P#f>Z{rh((()T`F2yyR`:ZB!kJdݒ˂N=y52"W  zvqWI}fG]S5 ^i#&mG|zUٯLHqyUevf'#9=( ,ૃ]*&mMpx? GG#8>VV3X8ǠeSZ%?'}f!t]68#y]bHjz$kbkBYq9n;zʫGq5S+zg?_ΎT3LX$g]D˱3 v XjdCLETQE,JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((6614q<X4}պ@zG5~Lc1L?圉MK"Y{Vu Gxu'}o|sֹۖd\R彉o RMD\Uz(QEQEQEQEQE>G,yhzVCa298$ UJd#[́UE~bNN8?ΗWԭ;uu #ҊŒuަŨCtĢ=\Kpy-`:e<6&5Y`;ۯ1H TQEQEQE(((()@,p4IV!r@h=y8ɧ,E'}>Yv8)@ DTW[W=NE>;K])[&hBќ`V[FPk[E,i^?aKm oq@RG_:$<#xB9s袊(((((](f$(‚z QSܤ*(r@9)L1qҐEQERRPES((( ߷:<08=xZ@9VN;c(J8٣sj?1"䏘ҍNXWg$cvZe;XTqV,9-Q+ v5ocYXvC#"5.tI/LB`8ӓQ""`?# ϥG=).r0Rqqڒ̏k@< ͚=͜e:m>ВE2#?Qt(4( ( ( ( q`B0H޳m*?B8Ö9HL˹8 L}ja&vY0ݿQ yN͎' ɠ .Sq;Eڡs@ v  qqZ* -[thDͥF@ր*j؄ `xՃ=ɻ]!IPG\ [!f^@)SIZczVY4QEQEQET[vDn[,8l)v FGtVmY-rO26a ݫuLK\AEh_jV1y Y^hxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQERJZrޥBy>)895!$K& 5g,gUZӳ[nr0ۅq?9Ua @ޓ<`ӻS >`|А\n$aUsOL:m BAs/@1ڠ`gh'qڡwߚs񊈏J1iI@ EPEPN%pA6NrsӌSi( CdCLE(())i()R QJM&(g743J޴^"cQSՈ9B LZ%h䁶rc,\mVPkjotAq P27c'~Bc*wvPA9#ڀ 8K0uMaIʾ[,NWZނ0 3k2yl^{֕R2wzV~Psi5#c (%-QEƘA 9RK xGJj2S#[FC@, bB` 6ˌGK$Hx'=ER r~+C ǘc1:־sPaso,P+,mҭ4+'TdW!ipFQD{9+t5u.>n٪EbƵ}6:q@ hDa: ;Fqe/ >ՠu2Pm0('gVfEk 9g%I+qHrwr :Ε2@9#TX@iQH(L Qf CvN>l`緯jBiJ wgӞQEQEQESLsKAAN^Nif)\r9`wl  ~>PE:AȭHp{UaY[U,P'lrBkYd*u9/-]LSN*LJ2ћ[ @nAW,e`.?J u gϹs]nq孹fTKubL%<浤0b:!h[~\ zD%B kZ% 9}G$zU'MX5>bOTwX&b5.$N+ MKs\IjRI+4 ֕uجWo4pA㚋4句0GZ: RRޏҌgNA9R42I+F`6:FW"i;\(Q@Q@%-%QE0 3(▙Fhdr`^>AGz- )j}= qC tY7 8@5hx@0aV}:oPxd27nCWЭ'{qh}ۀ{WR|7ZjhPn֊Έr(B5m űH剠 D]!W+z;*tˡL{wϬ+4i:S ?'d, ڕoLia@J2OQ8I (AqM$}84RsIEQES >Q|֛N%pA6NrsӌPQE(())i()QEQEQEv^HGU 4UXfD2Oc%9_ՎEwHonv=@2܋v;+"֮Z+\!'&g'Ԝn?ը]nxe%Ue_slYk6clFy&"Wd$#za[s١#;p r؇ms\nKK{*HI@Q@Q@Q@R*d3@;mtJ8șOVn!.G{05jm#3ըG;ݛ&鶡C;?OSI2A@9;swe8'3O?EmLI8MXSսj[G$遻8=ME\.o&2z(#A:eP9žxkBW#f:+&Ď:tǞ8 3:gٿkQoPp ?6^Hq3uo+ E1+" ;NHit ЉAb'_4iCV.$a jHd`*;RS,o}f6IpeOv:rvVdjvW8 :~.g> R%SH κabg2q1±/$V(((~JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE(((((( X nۏp2Ǡ4вВ9eͿQ,NgcȖe~2k\;ìh;{㞵lF2}j qA![ؖ[$ۉDOuW AEPEPEPEPEPTyB'm? k463#JzWKmNklr9΀'}Z<^d_$du}J#WP;(0\(\mjZ7Kq)**{{tNucO)4Q@Q@Q@Q@Q@S ąPOAJ*qoEH<}2x & :R:( ( JZJ(`QEQEQEQSEH-Ҁ@`*շ7x肀x<H.G1َEzB'y9(}Kmq"2Bn@(hT3NC(zb\JBĒw@7h\\=*_-銆60 1>-A%ێqYsGj۸00:\ڀ3Yvm_ݕpï=jFEQEQEQESFy= 9͟\1@ HH'md+U%N*0 oZb#m HUR(())i()QEQEQEK ' #eU)s@늎5%Ph繭1<`߭fBYC}h|䜀M4 eF8 "IRAw6Y{d fܚ' \#,[sKI84UQ@Q@%-%QE0 ( ( 7(4:1b"gSwՈ 9;sڤ \tҩN, \5BG$|u7谯8\});P!Y{Tix^[jXU<sV-1s @Xq}Sc3[Z|Eϙώ,@Ŏj:G"#=){RhhmtS#CopeKSpONA2˟.7|u3W5ȫE\; )}in扢mMRER(h&iQF8=(4Py P8O@:V ޙ֚۫SHJɥ;QaP"B Oa;$Ka fDWgNkc3]eӦAr!Ij^pOB*/gxv;Hœr+n.fiO(^G|VWa*8rK)'iR3!'9g]i2F@>>lfǥvZ¢Ӎ灙F@Kȸq W#~qzs]ԳN?rXw8 71Q=*yFO>¢RSQRu4@QLՋ{y\Dv1 OPV-$p+mN s*ɐ*1Sg,ֱn,G֑ndw*G~}> fc$h(@QE1M @jqMaތ֗ҀRvdf&/j` ׊lF7EXB> zvo`cWm /5i䜩z$*zsPがٷWC++9 I^{Ey88nkoI$mE'zJ4*XEp7,+|O=&O,Fk'^p[T>~YF} b4!\vQyGPzt&GL@0%q3ss˾32jͶ qc8F Hrzy#fD, :F_Z9]e;r7;\31^Bx# *V'IHȪlO4Nr)҂i("Eh@h=(Hݤ#9)2;Rp=途QE ( ( JZJPqJiS?f9O_81@06"`C.ҿ)Ǯ+N9EIv, }*A2빎:\T]]BƑk\Z4w @\4UX+Hi|k7ϴ0ԑSd37Vͣjx ǥee|71uyA>[ɕ0}4-QN}@&(O- R5v8d Ov4bo3s}E`^GM=Mt 0L jD r9oJQg*U8 钻U~+׊^5Vn@@4wcFO44h((\Pq ;^q+8sޜb(EPEPIKI@QL((( GCV"h API#6RObknfH H4&{.;)d@}(F>Z 8-\a}ɠ]h\r:u+[z6U9;3Ty`5zƀ=*ak ]' H$&MM D35tW8HcIP $דPC"(e|rj})gvo?tzmȪV` kHޮ=7\r~Vy@ʇrZMB$eQ)hPDZtI w 8<فW0n6xB<%ϳ4M 89jzI ۜC)Ǧ U;d37MٶO}&&+*|Ӗ㷨w#U;qAs9U*BGVuK ?o npI$4ʴQEAAEP|JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE(((((( X n>#' OPBP_-nmL3g"pl]yfVNh+飼:Alѷ9\,ej qA![ؖ[$ۉDOuW AEPEPEPEPEPTyB'm? k463#JzWKmNklr9΀'}Z<^d_$du}J#WP;(0\(\mjZ7Kq)'*z;xEnW?{O'vaxۈuA@]G,FHƋc޻[+d;%I)@En^WTUm,@UǽdOx4Q@Q@Q@Q@Q@S ąPOAJ*qoEH<}2x & :R:( ( JZJ(`QEQEQEQSF >@$nqKT s 3@6\*b7J|Č9_7'qLBN5ڀ gf΅6V{dKր2 jm^{vQ/ 8nEQEQEQESFy= 9͟\1@ HH'md+U%N*0 oZb#m HUR(())i()QEQEQEMo€$܄}xf/=sRAg`Ia@`{VGjψ' F2 ?8=S;mbR6n'M<09z.R(ㅒ5 ?xH QEQEQE(((Pհy;ST2HZxÏrաn54VU $xB֑drLU$1km@;H5Spy&"xN9@nrORşN*XԀ۵Bj˒2)F}GAQN cqҘ4c}0@8SPQEQES\.A͓q $r14QE ( ( JZJ(`tZ]) u4sHIV?IL1ޣiʥF0>AW&&||q+1;YNk`Ӽ1zPHiHͽ|Txzg8ǥ&pp)u!2_M=32pjų 3@@۫dk.1 &-˾[3k/VvX}IuPT}(PIKE%b KIOlppj u,N9=;4p.|h)^xs")rWX. $s&]6eH{uQH( ZQޒvQJ8T7iy488Z#B+N4H֮o,Qlu||ޞ9b*{at5=)mu!#eղc}kBHfqֻk p^H}ӕE-5pܓ}O:LvKsonumָ;oZ8,? kc >P>t:~5.S65 L+'g=Ip[@e4o$l|+eJnrrq]Zvʭ<Ae.$)ds\$AͶ0=&ZDyHU@=qLnO$E&1IדKҒ-`#U{y\Dv1 OU͵䖮EmI;@y2eTf*pv⥚8E36>^8-ӬUyϧ֡,rğ%QH((@ =hN##8`v=)ȠE977=}?.qNi x;vm cZ'`dq2[q@;3=0fI ?&'d SzWIYd;8̬5a^Y67P_í6DI Bz-xVӵx2s7AkNO.es%ǰɫ1x5a5ԊȴŰRvi˦IGHD6%GJ /*ϏNտjBS##-̯U8M~4ز1nIv|{k=l緧)QEQERRPES(((t5:]TUj(ZMFbZ5mv>sP3H~X5:iҹwCf_J/nv!E,>U$93n#V?S_\s@ak ]' H$&MM D35tW8HcIP $דPC"(e|rj})gvo?tzmȪV` kHޮ=7\r~Vy@ʇrZMB$eQ)hPDZtI w 8<فW0n6xB<%ϳ4M 89jzI ۜC)Ǧ U;d37MٶO}&&+*|Ӗ㷨w#U;qAs9U*BGVuK ?o npI$4ʴQEAAEPJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U,pM*p2Ǡ4$sWK6; YȜϥ\Ǒ$ e`W[<=4wYh<эw6=kٰoZDPEHsǖ%p-I6FsU袂QEQEQEQEQEUPIs­Z h i3ީU)S.['G omo,VO#2W88:]_R$J*  1z J~yr/1=>Oؘ5ek `n )QEQERRPES((((@q۔8"0vYB^Ej˵ "*7 {>7*T֯~]%sE> (V.`mS+TQEQEQEQEQEQN.3aA=sh(ſRV9 h&hWH袊())i()QEQEQEQENSҀmqT VqbOczPlE F;m+!Zq(v)PqN{z)n8\JB 8" EPEPIKI@QL((*Ŵ8fրuP1FjUurx''T@A9rQӊE@޳$ '뚲z:pjܙpId@˞qTƄ$@\HoW2|2Bwg֠$ 6F ǽF9jLuG@``F:JѵDh$w"8 q]]vѡd WH8ֱ$Aʃz8M(gUKȇŭeq2HQwjz ysϭs.a(QEQEQE<]37V&>a= ]H @&iKq̍2lzB9j]GPQZڕpBVA(W"<(GUa彇jYjkq:8m# a{mai#m+O6H^ d;I@s#1\730k7WI$d1 T[ ( ( ]H=)ŋ``< 0{Vv^71z_Ѡ0|l1IҝCokڑq>jmOQSՄ)rEo,? @P(((EPEPEPՈSd}m48pzu$7b,) zP]S [sZ"Sh7u8W?ّ.Wr7b-iή9+?zrr@#BZ8#HFc5+8 ơ'& ֊:PA ъJ)HhmtS#CopeKSpONA2˟.7|u3W5ȫE\; )}in扢mMRER(h)q)QE%8R"G;Z`| TA=(68⛴V61EZ10=hi6דیFttЌajڋkU0OY1P'\Zmh++Z]Z8!(,Ŵe4 X̀(R2 tR^8 2#8 Iۄdu&N7#:ⶡNJܳx 2 ֍#yh܏a]eG\8:\vdo@$6O)Bc+4*["#1 '< 2Xry*i*ߟOBY?ZJ(Q@943@$J)A)0)iڐ"(10Mm#By<`N@όj䶡W<ze}0)<ݖmkB;bv89^w&I@6ZYzU+:1z f1 ;$ H#sVtOKáaS't CmlZjl큊⅚7?&z`C%>@)[$ԏ^QXs3Iի suP:\{Uь@.@rbF2sڻ=Y'gv;b\H)D_ șB0*jPδt<ҞIցEhR ZBhOJF $|ҕp=途QE ( ( JZJ)LR zUA^9oLI5}bxo@ x"bGX7pysVSFꌭ}3W"ep>Ùd'%͓y45Źفzј( Fx;w7׊i& sUNMQ@Q@Q@R*d3@;mtJ8șOVn!.G{05jm#3ըG;ݛ&鶡C;?OSI2A@9;swe8'3O?EmLI8MXSսj[G$遻8=ME\.o&2z(#A:eP9žxkBW#f:+&Ď:tǞ8 3:gٿkQoPp ?6^Hq3uo+ E1+" ;NHit ЉAb'_4iCV.$a jHd`*;RS,o}f6IpeOv:rvVdjvW8 :~.g> R%SH κabg2q1±/$V(((JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U,pjmW8W ,z m>CK @zG5o\fDϥ\G$F u Gxu'}o|sֹ1j\xķo&H"{x*PZ ( ( ( ( ( I<=[nqUYdTm?{*2[jv\`Edt?If@"1''KVAiEPF:oSV![OQ.R8&2do̼Rx"RMgh:( ( ( ( ( (f  094T)+Jx d44LA+ttQEQEQE((((E@Kڀm,=Xs:T'9D} QW -9<3J. p3s\KpK;:r>o'"hep )Ͻ_RU`Ujs0gW 2y#" c:m{eaX2=q[rezgGPk_^ V\i(((()Ł @#<qۅۜϮ{~ ^Poi緭1b퍎*p)QEQEQE(((pdf& Y$Tw/i҄`߽Dsk|L Xvq5`r*ɝ>8*99-،BFǏ/ &n9[R:$397hɨwa5]\$}*$=zu VmWcyg bD>PyuV3(U}#˥V Lw5=].RNIҺY$i8Z$v8u8)x$(uFix:H) 8( ( ( K.+e0.$JK%]IFxl6=~R!X[`ɉp˃(? J8B!+ +Ǒ z}8}o{,>FX"9'p3h ( ( JZJ(`QEQEV*Q i&F;wM2rN=1YWz’2={ԉ Lty2N}i@EUܧZC,9{ pg|(N3kęLrm9P N}*&=0x4#`AE:F *0Nk8bi,QFi2O@;־pgڹ9W-&:u2k+U䯛s,Gʕ >] Eox IfDX"|<h`"l'w `P8U=E%Op* (()wI ,>Q|ր76WEZfdw!xt~ FoA'Jva RCjFmǞ=F5OVEpF`B#'8)B(( (Q@Q@RMJztǭNF@88$ H:OĒ\+?@~j֩,fC,-\1MvڇJ)!,4+HDLHjgӊqI$qUہ9j:RՂiԱz@ʍIsUL'z)րEPEPN%pA6NrsӌSi( CdCLE(())i()QJ1(v{QJPpHsOj\d_4/ y| @z o31kRsі9eX#-#(JJr5$H#F΀ܞ}=*@LU7 RcޘF;T$`I 8c(N8 עՕBk+T>]GHgɁҢs3t據(Ni@ GqMhmtS#CopeKSpONA2˟.7|u3W5ȫE\; )}in扢mMRER(1H4_ZNu4 Qzm/J`<sE\}R+Pf¾6ky"ˁ5,dnb}gsҤ&4)H€hW)DR439o7&r2 ÷- eK(e-k>Ԣ_1!Yvz2ҟy+^KdTs\Cp"S4K7c Z4jz;񚢈cYF?@Ic>ls€8:x&(bfaʤlf1LW}qut`:U]6;hy$ 8&"qrǒ+B8^"Jh^B 4ϐ~#MO. Q`h1QȤ):C!(b{!ݱx x=xגZxU'9_0"d,ʨTK5q[0fl|q[Yʫ3>ߟOBY?ZJ(Q@(h(''NcwE8ԇ :0iѶ;glE)',5[do UCd7CҘO4`n 's2*qǥ.A U\\rj r>==fň!S j{MNiSy$qIJ'Pvtmj<ƔAXbLOni:-0=(f=JADms5'MjG^herp@H#뗹IŸk({+y8 eL1aS a$5XLIގ(ԝtE-h: ۴q1޼bߚ )N{(@QEQEvsқE0iP ;iAɤ( QsOUSMQTF[*jr㑞 /!rtp9v$t|6(YIc>\?sQ dd%!06J[ yҡ5f^GzX^ [ϱb*#i% $(.6!`_~AZGwSI4h#q^{ֆO!sef  VMf[Na8tV7d>+: ʣ+<[Y z3Y@:f\aڹf,j~'Y8sjRiqKHh4Jw4NSR$uLb0p{u#M+Ƒ4ǝNBjeQH(( (Q@ >h W5n`P EHPKmyPbEip 6"ԔZ3mV]5fWTֱOVX4y⋉_,G?Jl-55;1ԊloBo ZBgOONZ%;@>sx2q6ݵu~@9pGVFGe^i+3R}(+nR}jT;N}#Zi$ǨU`jVb[PDRS`iԀJ3FM%0 ( ( qrA00}ziĮh N{zqJ(Q@Q@%-%QE0 ( ( ( *֋U #6=sȄݹk:{bEXњܭ¸qRҌ-{97lFȘ>ٳ\/统rsM7w VXǮy}w- 9"344c}:b,Q.3ȣ!n$?qIwv%“򌏦*+jeQEQEQEQE*A#4*LQAHT09 gz޷m;ѠT"rAQ Z(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@$[8> <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih(JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((U,pjmW8W ,z iVXY$kBKc0?圉E6}*<&WNh#飼:Alѷ9\ُf0 T9-K|-ZmČ"'ҫE(((((5&,[Ey9V_.JE*l=ooܫSYVc3z)T9@ 6(`2)gE6"ٔml ~bO:P ˋp-8{ sSLs@rb8zQ5^< 3F^l:#EXLힵa`.뷜LIk8%( vsXwz{\˥t$CABonTҷ@ [Jcp{{U2Tw !I (QEQEQE<]37V&>a= ]H @&iKq̍2lzB9j]GPQZڕpBVA(W"<(Gl緧ӈP#4)QEQERRPES(i(bdUm(zR.0i &iAQBFE] {&H h,w^o$:[Abˏ\z3U1s0ݸ穨Vr :~"ܚ|OAP\Gh9TaJ cb@P"88R( n5-6ùA !?sH< ԯzXRE%-&8.( E0 KIOlppj u,N9=;4p.|h)^xs")rWX. $s&]6eH{uQH( \P8>`%?(@8cTG֣=2M0,G3R=v8>rdwiP$wV$;Szs@#u vk]KQn\쑒kb1`hgYs6Ea "+3]|ـy!yn ?(}nK&3ev=i0#@al]r ƀyᖎf6$VHю: ~5ziD8|h煈r0 =k1[T;p\͹MeHqPJ" fc$h(@QEqJPPQQJKJyJ.=)דR&}7i=ːhq}jd Żܮ=OjRВȧ=ɫdw3AUŹ t_O@^[ץmibY3Gq@:ܰTL-}~UkF68|Ӹլ\j;\Tk?1nuI >ޭ܃ko13@'Uv>,U% ?JAKҀz>ޑI'6F0s׌PN(+)N{QE(())i()S)E >f O=iv 0z➣=GMBZ S@V<կn @S܁YC:$zîEX5Ioa\嬱9FX+)CmgwKCuyB*}Y(ߊºr0xuo\*qXe!ت/r͚㠁Je}vƝ+UrC]hѡb#pz $_@:\FgnE tUMQ StX0O`qXW W qDzICߞ2 c; bB˸=(g㿭GJ~֐ IGz(KOJ[SM&9Hʑ$rgcޣi^4v]=L.zO4`~4zBGj@)3IE0 EQES >Q|֛N%pA6NrsӌPQE(())i()QEQEQE547-( 8/5vՎVD8k:\MLi'kIdqVRU G@%8tI r1X8fюŵӀwlx\?@Qԕά׾t0b'ę=e͐nz@wFN!O`LsvA\bIԱ) Je( ( ( (RU9fIv72x=i #$ C{z;gyY4J[NH=3?¹@ ER((((((((((((((((((((((Hd+gҴXgZEk"tz =ɓh.o&M]29e+TvH?. 8Ȋ_8$ک_A&ݛ&d*px?7k 真U@gi-)rܯm3) gTJ|$0&".q2VB]Ž `j2۪G f P-rw17M)mB1wڞexrv=*9PqO*)Yf04;Tp?x?kzԶIvq{f]KLee "PGHtPs=ք FtWQMt=hqHfgu&>֢ޠ$AF0~l*9.ブfZVAribVEYv6o.*Nif;Iӎ֬\IF x"B634Rp#@˷߳ʸ? jE~9T`A Bӣ1pRwN6CC2wNԃGy$UWf2#p^3S-U٘ P6ذw_MF*6AkPL!{YX<ábGTMNjЗ㴟ݛ&ҩvP۟??ҫw TݕLW 9AHeOؘ5ek `n )QEQERRPES(((( *0Ѵu=MH!,7犽kb'թ:Pz|rBr=z֍0ۧn>egY[gV LD=Pun`( F ]GdåsW*zw a7?EW ͵xR;iCEPEPEPEPEPEC1!Fg<~f[%iQC9AL&f%{(( (Q@Q@Q@hQ@Pϡ@`+UP+횆 1W&NB~$ f Q#49TbY$ ;_5rwz2B{?jhGڪ8#ӧ 埧j%Č>y[i>X+vV)@pG#ٳTm[ &x'U.!>jpy@nO6e,!GSϹ{i0 Q@Q@Q@Q@8!@P$gzڛN;ps|or Ԋv۞VB^Q4 R,R6ݱp~YNqE (( (Q@Q@TFXpEX24 dw2]EI@ y&6ٕQYVAǰ,Nn6+Af,6{:xH}ܖb# r>pOCp Nw09(\n(\Ql5%RM::sҝp9c@Y_jdp08T,d(pEtvi3 =O{+VvYvXVvX4X+#E\y v(,E&V9?JB)G]ޡd۔R9OR.PtQEQEQE<]37V&>a= ]H @&iKq̍2lzB9j]GPQZڕpBVA(W"<(GU8¸Ror:>PIy4x#aSY(((N$03ڒXP@FϯZ\C Qieswu(- wK#)ڝ6I XaKzd=XB)V XOL ( ( JZJ(`QEQEQKplT%A*Rz!1ޥ $ҫ>h2D;:HkJXuyޗ~Ɂz1t2U}hԁ =Mf68hjJ+1Y2p]Iy׊z\ zhlgn:X!ڸUx;QU}2ٜ{8v*PA ͸;PJߖv\$úNse L$ mրt4qHtSs0E)I@O%Cp鈧G885[: j8e>\ngo?<\?0lZVeTaf?r|$w %(b @SGu0hmGh=~YDg#8SVq⡸e3WC-D`Sڹk2{kc ~C'ʕ<jӌթr:y> fc$h(@QE8bsM/s@8ޗuhLPO biҎ4V-I"iXwUc PV-2<Յg,LK!SJu.4~Z aLu̸ AW=q&$˳}sNPC}n P(tArm) 4BU|F 5\O^-@ Oq\>Rt2L } uge,G 1H>*=={棐LA=F({Txԅn@˜}h3Ҁ)Oiɢ J((\Pq ;^q+8sޜb(EPEPIKI@QL(((&(z~2ִ&eobFk6gN#90ʜBX$})`0%nV5g"9S EZ7G&@TTzc|ӑNGrn?M$9۟z9]Dknm%/ l d* 1#iriPEPEPEPEJ#<0NFO!Pd9zߏY+3FiSi}GW<(h@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI,lVz\2: _ZdX8nZA'2mm`$)ZG;@쵥w2Jn'C+=;U8$O>ӣlERNZFva* .T;mb%$ *OD$R2&S*՛HKQ Z[uH 5j.N/}f:mP9=;SLPNG*N=6E+0 &tG`NVuoCI7>:`n=lQW vJij1p0Е>9ٻN4 1#8#)lδ4gvo?[6 ͟ץG=5Epr[J.Qm2Jȫ9`~sӦ-]%t"PX,i9qՋ"hy!B~U(Fw3jNs4vyWgAH *8Ztf SnҦw(fZ.?h4ē6zʣ=*צ[$n x8e3xJU[pUiY&8?Mj D##oz+t,HcI-Tzv>֐U.sUy\<`1$ T;jUg<h;iLCOp?Z$#;Xʧ@pT gٿh͵=55!YS,ݎGUݕ=3G* ϦBTT?³Xeؙk~ys\dgK52I!U* (?bJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((i@,p*bP>q<XM6unOBHi6dwGH$[Ӛpxzhymz7a^I*C<-[jI0?JE(((((¨O-Vۜ~jhl58fG3GOJLڝr8r?O{kyby*ȿ/IGn$wQT `QոnSxG˔y%8ABxƱ,]Pc{u)J(( (Q@Q@Q@Q@dPMZSZ4ڻGS֤*ɃVZz]/OFD*~yi V[W' -Kz< #lzun`xLdһ[y!\C!p?\l?EWAsRH`#(((((qv` 3?3@ EN-r珠OA3DJ@GEPEPIKI@QL(((*p4h Z0m C&{gAo5N04r'f`R OD 8]=Ͽz+6wa4r j/5O^ʟް;Oj@ 5 ^sOI#U;['4Xn$Y65׮\ 6Rmk%X+>ݭg1>P4QEQEQEQE@ `yjm8qg= P/R(R7nyY {DӴJs֘HvquRe8`AyJ( ( JZJ(`QEQEQSD]`sXa8Gbn.܎}E Jpۚhdww#P)^ִ ue; y8y(3vsM8Ruiy$FXy^QXPXv@NzgDO\Pi%r%55nUʱPT*lG m0u'VA* 5+ Elǰ0r3lZoigKU95w-f8Һ'Ozmƞt0S@ ʹ\0jo Ho-p*Ibhd(P(((*y-hgo7wȭL|ö{TH@##ހ:M+W,9w'meIcr nՂ&%./+k jCu=U }kOS{Y~`O S!SsR UhxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQER"ONG42AtHrx=Pր:m8_$Y3J.Gy }>顗Oj/ H3*5$=+J֮( &ے <LޜC;qZ+lVQV**H!wYe4[5N>swMǧS@ yN1-3P7q& !KCPTRޒ ( q+8sޜbN!@R$F:f(EPEPIKI@QLZ:QGJ(@?a^4n8NRK!m R4#ʮ*~&G@ K7WW,efZ/1UL;ىBr=?RKA,2n .]sUi_iEȨۭARFQ 4Dq]Bx6vX'5BE6ޠs5zYzrX2޵4&w$Zg=;*Bmy,$GZùF Hր3،=fL Q9z &h"( KIOlppj u,N9=;4p.|h)^xs")rWX. $s&]6eH{uQH( \Q( (4f&- 'M*F*G*R80BA 2VsҼo;@jX*r fnX B[Yn{E#iPѨO-ն׮ԟ{0+!_g֦ Ć.1ހ:{D(09b0j(l|JrJ@F:Bѝw+1G& Tf=>)!Wa5ibqWoL@"PڃIGnQc(i*Ž"Cb{~'xגZxU'9_0"d,ʨTK5q[0fl|q[Yʫ3>ߟOBY?ZJ(Q@N=8Pig@ )1Lҁ@H M^F}W C3OqZZb :@bp(q[:F&qc9rOj%kB9sSL\£|Γa'0H`Xvv?@ze2i~ʺ}ہU%YZ=+i68{&[pz`\pIEx| A%q R6{QoSL&IFh((bڔ4(`nI͑A]Nw zsހ((( RQL/&h#AP^h:SH6@ U֝D+Қ00v`r_C',sXڍM'Ҷ#)3~r+SO*ԓJ󴴚NV6?AREm"^2EӠ+,ErwpjSo$%z Q#3%A܊Gp6s;]nĊF;|0 3YG(H.uG )k$KWeFg_SPkRFVW7SƤy W=h i);Fi~$RsIE0 "IZ7X#GR4ҼiHyؤ.zvQE(())i()QEfxn0jEiA@QL k^͕HG,3\gi5܉mPϦq[mdFW+gu }XPrI$>~bH7^W-s+gv\6huXpbCK5ݹ%c?iw!}t>Nun=?Q8va֍ğ3tYs#=B+KxK,Hg ֹVW ;&Oj4N#IEQEQEQEQJ1s;ʓodz) FH㞇|;4h6?;zgs€(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP"(Viǥ#080 εE {&N]& "L X?še$sZWs$~\qɨ!2pH9ӵSM7M:=6U+05oW`  9?_ҫ<[ RC^-&f!R@2H`ME(\"e?ҭY$AիeT@<V[bgvo?Sڅ c=M$z TrݔlTR>`iMv 1$~5aNV9m4s85p)hAD閡C z ^/34讣@8ӂ;z&OMG}fE@I` `zTs #T],վ,Ĭ6?:m" \7B%U|vX&(< ERl.gs0iG9>KogqԊP((r>Fb6 랝*lre 0:jII3m';ҮzeF g[ʫ+09E_Pm`\Q6hUl֠B?2>yBďΩ=*2@-.9i?7Mi R졷?< ~W@C+fVsvT8xeI YB3xJNh ݛ&S'[]>rˍq~UZ;\8trd*HO#+:%]ƷH˷8UH ĿS$eZ(( JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((i@,pLW` p2Ojm>7K E= "i6lwGH%_s@X>.MZ4c`Zyg pI򠊐-K|-ZmČ"'ҫE(((((FX"9'p3h ( ( JZJ(`QEQEO-5 ( 5$4#}7Fր4br?i;O^K)@T~>nEjDj3Fx 6&\9sl˘{W]V"@`juVѭl|Ҳ$q@ u05W,mJҶcx\5I ;Pe?63iFv$t HƬ7aO$ֶyiQ ZoHL?N /#q|쪎2CK%m#CʭGNβb0E%YwV((q8jJqbAw>hxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQKI@(A$UJ9&x$Y H ѺY۟Iր:_]2;G$S%GFC2@c$zsZkVחqfY \ڹH&5>!X<YDzJN<΢9Mɭ9̒.a^kRP$P(cgmŀs\8˩Zt-s*G M39=:bRއM9F{'<&hRJ()Įh N{zqm8Hl9s@ (Q@Q@%-%QE0 (ZQR*׭F*@Ê_)RjR;{Pvdg zӌ,$k T Ƞ ,pH]-߸ lW HR6=B tv c[yo 2'TX+zº^@T:Tu-@襛Ɩx\ngo ;mu FTϩ42_TcڦT@ IF}% ^)eXHwl^obKW ݤ?^LU8f+tf ͏2>t#Ufgr;K3'@ ER(J/qJ9SE4SLSQH dӼ'DcЊц% S$ j2+>a5˂i9ȫ֚ŨnWЁQ)4ԸT &vk6F.$OkY}TE zmO5$2A >~daO v;S p+'GgevLj`/2M KaO1;֯7SJ:'LMFT$x%)G4Qڔ3IHsN 'Z\gu`nI͑ wgӞQE ( ( JZJ3vsMiG\SAiL{LsN~z8Kj12ܸf_] cۚ,QZ){⒒=x旟˜ZJ^!BJ)T JѺ&v1 =:HGh'!s2(EPEPIKI@QLQ@ 2i( _c4lPpǨϸmk&*sZ8h>X*OJKŶN-r}W5l4"2ʧNJH? uBI5sw;`5 W,8Qbtԗb9_8 Kd$l֮ .,RIO3TVCnɥF͇'9ⰵ f0Jb9i&32:E&NI:5CPmIg4h()(yM]'99((@QEQEQE(((PT>т2=CEhޢYV3R~5ϙئ$N7 VP$t8@ ъLO]N-H6H4<+c@<4a5v+۟V !927H]V?z}[[$#<kԮ-I?鱜tW3EO4;֡%QEQEQEQE*A#4*LQAHT09 gz޷m;ѠT"rAQ Z(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@$[8> <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih( JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((i@,pLW` p2Ojm>7K E= "i6lwGH%_s@X>.MZ4c`Zyg pI򠊐-K|-ZmČ"'ҫE(((((FX"9'p3h ( ( JZJ(`QEQEO-5 ( 5$4#}7Fր4br?i;O^K)@T~>nEjDj3Fx 6&\9sl˘{W]V"@`juVѭl|Ҳ$q@ u05W,mJҶcx\5I ;Pe?63iFv$t HƬ7aO$ֶyiQ ZoHL?N /#q|쪎2CK%m#CʭGNβb0E%YwV((q8jJqbAw>hxCeq ?1D^զfGprGAޡ젴h 6@}),d0p{tjv$6maOA,y`sTa \Q[ $k,Ab2~=3(())i()QEQKI@(A$UJ9&x$Y H ѺY۟Iր:_]2;G$S%GFC2@c$zsZkVחqfY \ڹH&5>!X<YDzJN<΢9Mɭ9̒.a^kRP$P(cgmŀs\8˩Zt-s*G M39=:bRއM9F{'<&hRJ()Įh N{zqm8Hl9s@ (Q@Q@%-%QE0 (ZQR*׭F*@Ê_)RjR;{Pvdg zӌ,$k T Ƞ ,pH]-߸ lW HR6=B tv c[yo 2'TX+zº^@T:Tu-@襛Ɩx\ngo ;mu FTϩ42_TcڦT@ IF}% ^)eXHwl^obKW ݤ?^LU8f+tf ͏2>t#Ufgr;K3'@ ER(J/qJ9SE4SLSQH dӼ'DcЊц% S$ j2+>a5˂i9ȫ֚ŨnWЁQ)4ԸT &vk6F.$OkY}TE zmO5$2A >~daO v;S p+'GgevLj`/2M KaO1;֯7SJ:'LMFT$x%)G4Qڔ3IHsN 'Z\gu`nI͑ wgӞQE ( ( JZJ3vsMiG\SAiL{LsN~z8Kj12ܸf_] cۚ,QZ){⒒=x旟˜ZJ^!BJ)T JѺ&v1 =:HGh'!s2(EPEPIKI@QLQ@ 2i( _c4lPpǨϸmk&*sZ8h>X*OJKŶN-r}W5l4"2ʧNJH? uBI5sw;`5 W,8Qbtԗb9_8 Kd$l֮ .,RIO3TVCnɥF͇'9ⰵ f0Jb9i&32:E&NI:5CPmIg4h()(yM]'99((@QEQEQE(((PT>т2=CEhޢYV3R~5ϙئ$N7 VP$t8@ ъLO]N-H6H4<+c@<4a5v+۟V !927H]V?z}[[$#<kԮ-I?鱜tW3EO4;֡%QEQEQEQE*A#4*LQAHT09 gz޷m;ѠT"rAQ Z(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@$[8> <|+:>+Y',N';֐ILE9tx,0$g` j閮p8?-i]̒ApIǯ&DP NN* 6Sϳ4'T֑],{Xn>'<J;HlKxiII<ʣS!7IsJfpyVaR90l ZynKgٿiNj1pCs4+901QʇvSMyQJ0]6*ēՅ;][楴xMώ|4U]c+)?CZ c)wv%xϰlr6nӢn HNyC@3??7Mݛ&' *1gQp$Qw7VҲ [L*p鴋x6IpV"uK1Nvt>bH6hnHP3_JړM/]UkR+@ ?0j;۸(ztٖ'˸w&=$q$ʹJ513"o*dg?҅}AVŀpDm1VIZdgުv ?:ltUwϳ5.K'q^W+ IeUYZF-PS\$fIP<|*:w9.fgvo??mODMlMwVT.7c-oQUh6FwesLʂs鐫"U>먖v&ߞA#.W#+> LHih( JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?x&Vc&P }CQxP@];F:/ҬxĚݍiPJ,I0Xw̻RKP=rz&⭹ JŖͳ,SM1"Gm${Hb! ؑK mV. p[ϊȳ6{iѲnQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQJPKzJ*Y˸HTlqI#[KElgVW z1lb1,vV?~UN [ !',Ȫ+*}zY4f^yݸ+9$Čտ퍂cKHyG8(GUԗQhc(T=;YQE((((((@8V $M6unh[v6lwG8?B)UyLdW[<=4wYh<эw6=kٰrƠucڂ*C<-[jI0?JE(((((¨O-Vۜ~jhl58fG3GOJLڝr8r?O{kyby*ȿ/IGn$wQT `QոnSxG˔y%8ABxƱ,]Pc{u)J(( (Q@Q@Q@Q@(ZNC 4(OZmdσէxryP>9 !T9kJ(`C'IeoefYmh/6dm8vVkQks7*i]eKϘ}QU2c֪KF Q@Q@Q@Q@Q@S ąPOAJ*qoEH<}2x & :R:( ( JZJ(`QEQEQEQVo.wDßҴmCS#qQAcXx -r>NasЃH.X1ҫ4"䓏J\D̮@'x^&ç\Xn'?^x<^L#%=j#`jHd/4b@s:e[ҝz BuMP90 c=鵫ReWUg:((((X( 3=OM]>lE F;m+!Zq(v)PqN{z)n8\JB 8" EPEPIKI@QL((*ż%sP;9#r:td61@ [0p9d@BԎO$`*LzzۿwR=*)[ zXeh.Ws֨<ҜќbB͇səvr3@ @sP\3qR,$.jp#S@vd,|*&ʠSӬdo^>A'@ o->}ˌQ}b_Yq\WA$r-j_";uXTV9zim&1Jak@Tyo$j!I( ( ( K.+e0.$JK%]IFxl6=~R!X[`ɉp˃(? J8B!+ +Ǒ z}8}o{,>FX"9'p3h ( ( JZJ(`QEQE(z9}* ^BMW+ϭh+?^/ڂ '>O3k+8RS-(dL#5i^s˵Fc=w!&H<~纊쐨$zU>YӚ=qsr;ĵNgmޢ3NGq@VeD|/`ˆu.rƹwPH]%"F6:g et $4o+Vew+:Y~q@&pד XʽVRv~]#6a)vRPEPN%pA6NrsӌSi( CdCLE(())i()R1I@ EP3V!rUpq@y\TgH Au9Oz1'H!Eʡo\ T๖9R:`֠0z{e έ8?s,0ko P0#d29upͧjE tDFuMxzKK~"kl. O' 5,"xݰsI$7 c9R EC^;O@I9kpA'5\+z܀gh&~mր1P4sSɴUpsAL醎SR⒀ KIOlppj u,N9=;4p.|h)^xs")rWX. $s&]6eH{uQH(R E.(PRJZpb )28xs] [f-9WyueyB?mSu+ f8Mby#u[\px>g͑HJH'584  f)rT8\w*3v 3]5sMwrhij*6n3B3lajy[Q6f UZRhh@ qHF)q8ǽ6[z$;/gZVm$p+mN s*ɐ*1Sg,ֱn,G֑ndw*G~}> fc$h(@QE%M;Q@8`E E%=)Gz)iGJy}Ȧ762j[1AzL ռFPR)8ݚ9GH9A=fr}'$ӌg{S TcwRNL嶒G@n9FT81w&0K(gCv Fq@Lvz@XUɚYw9JN9c4 )QE:R֐1ހ<ޓ @ mI8o^1HƔЧp;x=9L)QEQERRPҜiSإA.sӥ q@O4`%8/$R`T:  瓊ղR^KI@vƀ48936=l[@Lgo ")cs<`JO[eZ; @$9& =UmyNMe\ob@oa=eiFΆW=l]ۮluνL\&s@FLJЌuW X0*ײu$5f^j7$Oր+J͟#y4x撗ъ@'j^ \@ F(:L_Ji>撘Hʑ$rgcޣi^4v5Ziø[Hc@/5UB?€+Ե!'~EtyГٲ+@JG;& }*c71UL2ǓTe4gFFzLќtf)f((\Pq ;^q+8sޜb(EPEPIKI@QL(((5*@TTPȮH$Z߫u [LK+gatgw,M tVlGKw HpƞS]RaV,́TҸu994+g29\z4[Cg1jO9?W3EM4qQdQ@Q@Q@Q@R*d3@;mtJ8șOVn!.G{05jm#3ըG;ݛ&鶡C;?OSI2A@9;swe8'3O?EmLI8MXSսj[G$遻8=ME\.o&2z(#A:eP9žxkBW#f:+&Ď:tǞ8 3:gٿkQoPp ?6^Hq3uo+ E1+" ;NHit ЉAb'_4iCV.$a jHd`*;RS,o}f6IpeOv:rvVdjvW8 :~.g> R%SH κabg2q1±/$V(((pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/image_dfl.dcm000066400000000000000000000110351515706620200251270ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.0.0.977067309.6001.0UI1.2.840.10008.1.2.1.99UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 nq /BEjlܠd']TǪXa EEWZ0Ѕ!/y wM#󗼇9$=ߟ C(7|t~۲<^m-_?yr'<><,7cfŗGEy{X\o_/^+/(}X|}~?˳/kgrآ=^٣U=<\Y˲ZO=+~U,׫_gqחGf'g_=<ыrً8;;]Ͼ^|uUy>鋓er|Aqx]Ňyqz~vgEkqA#>ܻW^Q;99o;s| CTXD{Fl"????=k[4V)VY?ۓm]m9-S᏿YwyvHǿl[?Zo*ǿ_Seǿ?b%6l/KBlߊ\OoOٿ#38t37g#_͗V$<0MF+G푰ߦ_mU㒛vWOQӂ2?_򻶍J4ߎZwZ7FK]?6d ۧ _~蟛P$ZZ1?p3:Y]񟸿iSzN?ے; COo1?o]T%eo YW[$?~~giLMN /o`C` ۧ1qh<=1u1;w¿+?7gIɝ7o\%?qgџ.Sۖ/),-ր?cv~g˟ sOO:a4& ~"?_?,?ϭwգ~ҿC{Y[ƀ^o}Yt?gaCV )ԡ㟧x}?:#?߉5?٤ צXO?SK0 C~miV??vxv5:¿?߅%ǿGvC~o; Z\+R;wͬ?=wM;~?6]X}ˍg/?!?g/] m_sC~>w6/N5?1uz}U?CA ^eǿxf?Z.Wi? omk_NoGoԿ_/>hOֿw9y䌮? 6Ws0W?1$yI^8:R=G Ci~G__iwO?6'[l'{k Uҿo_3`?y_߶?heZ~,+~g0cFу?o۟oδ:[/1'wZOw;ܧ tԿ~;7+[_;OZj/7@ά*=jk|? Y\yT; L7YHc/kL_oc?agX㙽#t/KϠncBG9۩?/mW,?O_PE񟴿k?6me_S?O_Pwj/?[zsMW3{Gcy5jD5jKۦ+/e!wE(⏿ ?)3 {m۱NXEpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/liver_1frame.dcm000066400000000000000000001103341515706620200255760ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.66.4UI21.2.276.0.7230010.3.1.4.0.42154.1458337731.665796UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.1SHOFFIS_DCMTK_361 CSDERIVED\PRIMARY UI1.2.840.10008.5.1.4.1.1.66.4UI21.2.276.0.7230010.3.1.4.0.42154.1458337731.665796 DA20030417!DA20160318#DA201603180TM1046071TM1748523TM174852PSH03086212`CSSEG pLOQIICR PN>LOLiver SegmentationLO$https://github.com/fedorov/dcmqi.gitSQJSQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23433.1 PUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23432.1 PUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23431.1 UI<1.2.392.200103.20080913.113635.1.2009.6.22.21.43.10.23430.1 PNJANCT000 LO99000 0DA@CSM AS060YPLO`LOUIowa qLOLO0  LO0d533f1 UI<1.2.392.200103.20080913.113635.0.2009.6.22.21.43.10.22941.1 UI21.2.276.0.7230010.3.1.3.0.42154.1458337731.665795 SH1 IS1 IS1 RUI<1.2.392.200103.20080913.113635.3.2009.6.22.21.44.34.23882.1 @LOSN !SQ dUI.1.3.6.1.4.1.43046.3.0.42154.1458337731.665797 "SQ dUI.1.3.6.1.4.1.43046.3.0.42154.1458337731.665797 eATb gATb !LOReferencedSegmentNumber dUI.1.3.6.1.4.1.43046.3.0.42154.1458337731.665797 eAT 2 gAT  !LOImagePositionPatient (US(CS MONOCHROME2 (US(US(US(US(US(US(!CS00bCSBINARYbSQbSQSHT-D0050 SHSRT LOTissue bUSbLOLiver bCSSEMIAUTOMATIC b LO SlicerEditorb USϠXbSQSHT-62000 SHSRT LOLiver pCSQIICR QIN IOWApLOIowa QIN segmentation resultpPNR)SQ SQ 7DSN1.000000e+00\0.000000e+00\0.000000e+00\0.000000e+00\1.000000e+00\0.000000e+00 (SQPDS 1.000000e+00DS 1.000000e+00(0DS8.105470e-01\8.105470e-01 R0SQ$SQ!SQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23433.1@pSQSH121322SHDCM LO,Source image for image processing operation SQSH113076SHDCM LO Segmentation SQ WUL SQ 2DS*-2.352000e+02\-2.268000e+02\-1.286900e+02 b SQb US $SQ!SQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23432.1@pSQSH121322SHDCM LO,Source image for image processing operation SQSH113076SHDCM LO Segmentation SQ WUL SQ 2DS*-2.352000e+02\-2.268000e+02\-1.276900e+02 b SQb US $SQ!SQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23431.1@pSQSH121322SHDCM LO,Source image for image processing operation SQSH113076SHDCM LO Segmentation SQ WUL SQ 2DS*-2.352000e+02\-2.268000e+02\-1.266900e+02 b SQb US OB?d`c_!#w ?$? ???????????????/?}??^{  ??????????4 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/liver_expb_1frame.dcm000066400000000000000000001072641515706620200266240ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.66.4UI21.2.276.0.7230010.3.1.4.0.42154.1458337731.665796UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 CSDERIVED\PRIMARY UI1.2.840.10008.5.1.4.1.1.66.4UI21.2.276.0.7230010.3.1.4.0.42154.1458337731.665796 DA20030417!DA20160318#DA201603180TM1046071TM1748523TM174852PSH03086212`CSSEG pLOQIICR PN>LOLiver SegmentationLO$https://github.com/fedorov/dcmqi.gitSQJSQJfPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23433.1fPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23432.1fPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23431.1 UI<1.2.392.200103.20080913.113635.1.2009.6.22.21.43.10.23430.1PNJANCT000 LO99000 0DA@CSM AS060YPLO`LOUIowa qLOLO0  LO0d533f1 UI<1.2.392.200103.20080913.113635.0.2009.6.22.21.43.10.22941.1 UI21.2.276.0.7230010.3.1.3.0.42154.1458337731.665795 SH1 IS1 IS1 RUI<1.2.392.200103.20080913.113635.3.2009.6.22.21.44.34.23882.1 @LOSN !SQ>6 dUI.1.3.6.1.4.1.43046.3.0.42154.1458337731.665797 "SQn dUI.1.3.6.1.4.1.43046.3.0.42154.1458337731.665797 eATb gATb !LOReferencedSegmentNumber j dUI.1.3.6.1.4.1.43046.3.0.42154.1458337731.665797 eAT 2 gAT  !LOImagePositionPatient(US(CS MONOCHROME2 (US(US(US(US(US(US(!CS00bCSBINARYbSQbSQ2*SHT-D0050 SHSRT LOTissuebUSbLOLiver bCSSEMIAUTOMATIC b LO SlicerEditorb USϟXbSQ2*SHT-62000 SHSRT LOLiver pCSQIICR QIN IOWApLOIowa QIN segmentation resultpPNR)SQ SQ^V 7DSN1.000000e+00\0.000000e+00\0.000000e+00\0.000000e+00\1.000000e+00\0.000000e+00 (SQRJPDS 1.000000e+00DS 1.000000e+00(0DS8.105470e-01\8.105470e-01 R0SQF$SQ&!SQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23433.1@pSQVNSH121322SHDCM LO,Source image for image processing operation SQ6.SH113076SHDCM LO Segmentation SQ WUL SQ:2 2DS*-2.352000e+02\-2.268000e+02\-1.286900e+02 b SQ b US$SQ&!SQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23432.1@pSQVNSH121322SHDCM LO,Source image for image processing operation SQ6.SH113076SHDCM LO Segmentation SQ WUL SQ:2 2DS*-2.352000e+02\-2.268000e+02\-1.276900e+02 b SQ b US$SQ&!SQPUI1.2.840.10008.5.1.4.1.1.2UUI<1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23431.1@pSQVNSH121322SHDCM LO,Source image for image processing operation SQ6.SH113076SHDCM LO Segmentation SQ WUL SQ:2 2DS*-2.352000e+02\-2.268000e+02\-1.266900e+02 b SQ b USOB?d`c_!#w ?$? ???????????????/?}??^{  ??????????4 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/meta_missing_tsyntax.dcm000066400000000000000000000004751515706620200274770ustar00rootroot00000000000000DICMUL:OBUIUIUI1234567890.1998.310Double Nested SQ  Nested SQ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/nested_priv_SQ.dcm000066400000000000000000000005271515706620200261510ustar00rootroot00000000000000DICMULTOBUIUIUI1.2.840.10008.1.2UI1234567890.1998.310Double Nested SQ  Nested SQ pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/no_meta.dcm000066400000000000000000001137271515706620200246550ustar00rootroot00000000000000 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20040119TM072731UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 DA20040119!DA19970430"DA19970430#DA199704300TM0727301TM1127492TM1129363TM113008PSH`CSCTpLOGE MEDICAL SYSTEMSLOJFK IMAGING CENTERPNSH-0500 SHCT01_OC00LOe+1 LORHAPSODE LO GEMS_IDEN_01 LOGE_GENESIS_FF SHCT01 SH HiSpeed CT/i 'SL,g3 0SH 1SH SH05 ULM": SL,g3PNCompressedSamples^CT1  LO1CT10DA@CSO SQH LOABCD1234"CSTEXT LO1234ABCD"CSTEXTAS000Y0DS0.000000!LTLO GEMS_PATI_01SSLOISOVUE300/100 "CS HELICAL MODEPDS5.000000`DS120 DS5.000000DS 480.000000 LO05@LOIVDS 338.671600DS1099.3100585938 DS 630.000000 DS0.0000000DS 133.699997PIS1601QIS170 RIS170 `SHLARGE BOWTIE FILDS0.700000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 373.750000DS1.016600DS 955.799988SSSSSSSSSSSSLOS DS7.791870LOI DS -320.197968 DS0.000000#DS5.000000$DS 17.784578 %SS&SL'DS1.000000*DS 178.079926+DS 3994.299316 ,SL(.DS -718.079956 /DS 984.0000009SS@SSASSBSSCSSDDS1.000000GSSJSSKSL(RSSWSSXSS^SL_SL`SLaSL(bSLjSSkSSTpSSqSSrDS0.000000sDS0.000000tDS0.000000uDS0.000000vDS0.000000SSDS0.000000SSSSDS0.000000 UI,1.3.6.1.4.1.5962.1.2.1.20040119072730.12322 UI.1.3.6.1.4.1.5962.1.3.1.1.20040119072730.12322 SH1CT1 IS1 IS2 IS1 2DS"-158.135803\-179.035797\-75.699997 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI.1.3.6.1.4.1.5962.1.4.1.1.20040119072730.12322 `CS @LOSN ADS-77.2040634155 @LT Uncompressed!LO GEMS_RELA_01!SS!SH05!UL)/_!US^!SS!SH05!UL2f,!7SS!JLO!SS!SS!FL!FL#LO GEMS_STDY_01#pFD7A#tSL#}SS%LO GEMS_SERS_01%SS%SL,%SL%SS%SL%SL%SL%SH'LO GEMS_IMAG_01'SL'SS'SL'SS'SL'SL' SS'0SH'5SS'@SHI 'AFL{h'BFL333'CFL33A'DFLff'EFL'FFL'GFL'HFL*4'IFL* 3C'JFLff'KFL*4'LFLĢ'MFLff'PFL|'QFLg'RSHL 'SSHA 'TSHI 'USHI (US(CS MONOCHROME2 (US(US(0DS0.661468\0.661468 (US(US(US(US( SS0(RDS-1024 (SDS1 )LO GEMS_IMPS_01)SL)DS0.000000)DS0.000000)SLW)SH) SH) SS)&SS)4SL)5SLCLO GEMS_PARM_01CUSCUS(CSSCSS kCSSCSS(CSSCDS0.095000CDS0.085000\1.102000\0.095000CSS^CSLCSS CSSCSS(CDS2.000000CSLC DS0.000000C!SSC%SS C&US C'SH/1.0:1C(OBPCT01HiSpeed CT/i0505z:=|C)OBCRC*OB(CT01HiSpeed CT/i0505z:=|C+SSC1DS-11.200000\9.700000 C@FLv2CCAFLnECBSLCCSLCDSLCESLCFSLCGSLCHSLCISLCJSSCKSLCLSSCMFLCNFL)AOWFjR9][9  8Tiy~Kz72[XbH  yS   Mmza3_8,NVN8)V`M;  a, Er~i-ATrf5,:,*, `+$7+)'DlW/39T6D,A FF?QH9=5^v?N;-9>D=^VMpi[H %OZ W>h8M'/Zn /vY6 LZ+.E  3&+Et<hA[ve7E|A!!]% ,6 Hpf_ "Bx3{   + 3hM!5QFQJwj0$et]#$c"  n! A  8M,T\ ,i|~oB?+e\0r [;%Nyj6(  )5v7L=4H~#?ap9( B7E3y cmG\R%=xf90-N<[-[k/w}&(OPzvGR!*M?  ~_IP0%/=p` TDsBWH% C%(O@)!  ) LDs;&Ev+Vo|_-   6jtU 13 a^t(/3MjYS /&=f/3 'kF" F5D%)p7+ANqSx'o 1I+3bKOcu`gw< G7@R)`vz{|w>yg%  2x6HIN:16OQlW" !_#aX@:Kwvr}`/ayh/#g4N*A@G2 76I,YmZSP$>U )5* 7U (( #2XMUjq#@Q@ZqwiSw"3@SN3 rbK/y ( x Q! ]{ $06OYyqUM,aj@qz.D&1uy"  {?+ 3?4CI#ble&%'.9Tp 4| 0=|f5H)\wl H4 ?=!""/-NQ'*II^/y$ L!xjjVm K tz\x>}I2#"%3qL$8\;8OE=O2C^t  3u>D5$!+0+71jyvt? . ) ~{4KE( {rJJzvE+%%"+{|O6=j[ aA $?'FBQK\<0LTyV' 7dq40mV `j mr)))=` 8"~V<v#   9=MK..Y8 -X0JJ&|!HJX/W$s %%KN,  /0?*>$$A+ +V* Ha:!%upM/E"0.='2-7 Dr z NH(([2]*!4 33{n5 i,y Ft388:7sj,"g^!k9(  ="y~9L2 H'l# F2(LD3phq/Z$! K7O0dV>.5  /N FvZ-"xfNt%@ $7*LQZ</  V!3;8-@WjvRK8}Ia8+SV4hru64 # .?L"} l5"V4(1,OJ7!&>,)7bd  ,he ;ovWw51hA0%"0T52EC1`kF Xk+!}'<H[v.z rNQ0,$K~7"+#%4,=24 C}lEA*QK rA);fO;   .:JFdexz| 8_K,75B<BfK7"& $ @cA+ \`$ :>H7Zppvy%YFR7MSz*Q_=LYKgyW^-?OM0.` 4 i{ 1Tc{qyH%@lC]PC,$* ;&~SG,#J1F'  (p$Vcdh~qOZhlh90=fH> %Y'702ER[ K! /g#s;xvc\YLOSR:6 i6^/9   //O8sCon2" \63(&v;^rN/  GuQtJJ/<FF)($)3.(;h@(}*$ mub/ZnJ21(! &,5Dh+%$;5>;+*('1-)+C !  omiFm{bP5 ;Mv)!,%!% 3nPY&mO7 c2^]ncXL jH[a{Z+$!*/*3.&%>|X%  " uFjs^VA0{ -@5m{Z<HQA64./98( ( 4:"%$xN  N >#+EMNI?7& ,J(/YCJ4+FI,%62*+6$#00)eog\N)  B N 9U5'"  <TFC-b#('1@=/"   8Lyr\M& r2 jH;<]=  Uz*G[KC! &0)20&74'..:-3Q|diTO@ *E|J% 4' CSIDq_O.55*-+=3'.2..% 6ZfN[JB2  "&HE>s#;O< @L,[7Bq`UM80=)!   ":WYJhpZUN<M1"'?4+$ H! qZ81G#FKOnT?3/#- ' 8ph&/S8   a :[AR'/IH'+Or%<E#(/!T|]auwR  efT6r,$9BRY#3S3 2nb?aAnF?: ".fz'za$?Q7*/Py2ac[|?*!yCv5vlZDA#z#_x f?    ( M2+7Xj 'EHUtY6@<X% -2.?y4,6mx9}{" #yQ%Un%!C``e>~'_8v= Z}>7aLCW:T?]t& o[0PX{fgx-e3Kt~I~JB)8D+YbGiy$5Jhw&O$ v&4!5=S :V ."`[pT[Ozo^s3\P/AZ=]6)@i5 *R}q'mb@vYj 75i^VJH L}gyF%3|V.^GGm8H}J<-( hVCc'Rx3I N}OI  k_n(ctb8}P;  7 s8'Ydlvr  < yU""1,!%-24"x-t'd TzR&Stk;5A.+%=1r\>Qmn~sxk^PophC3n]wH+~*9x ,LU tydmvkJ2$ Z AognhQOY53<7?-D[y2j9  pK:$-@Wxe!ytRde, 0vhp_?_=G3 "-$  $0%($#4JWEb*|n\IaW'&#&2,*F. Q ~n''0F. "   >46)+86ez)  ')    <4SO.%YyFo=8 #&#) A   1,4t}:  )fr,tkz*X gV&#*)6-%!#'!.69=,// ,%#   " .'Rk#!  '8  't2M-A! ) ;KJKNUF38:("B@AD2 ">jNI-5,  &4".<I6TbR<_!J|>!%"*'95+# B:7,',%/*(29C@8BRk#X :06!+)JRC>3!%4<V*|B$xZw\+   "# '+06;-:iiL;.)7TCMC 3'2" (56RG!<_u:2))+ 53''*E?5I2,   )%  *598($%.)!)5%F^?:LGGCI1.#8DIG3</ $,=XyfKV`dC!! ='*B.=AFN:*4 *1& &-991+/5!1=?R_B.& 1:240;2=EI@.>860$#%%-/  -\1.bC2l7 2  *,+  7)"(&$ %5*)29WTYykohj:%5,/"-%$&tQT@    " /&&& "YO:3;0<EUMAH<1.@65;*##" 64;>4(&%,8( "XKOT0(  /HX4PneO*& %A=<+  ''/&4@:45&';RK[[\^LD2*%+# ,NB:SJPYQL8*%-01!-&(!&:41 I~5/-7L8.:CSC.)?@D<F_d[[dL75#8C. #,%.-.4-7SF7,  &,=YWE7DdZDAG#$% )0040/=72*4=OXQ<-- Og+" )>5!&1(4-( %"!  2&!#(DA0#,55>A78)#)( */7BT^T`K9."%! 1 .8EU[dH2(  5:+++<BCRZPDS`XED3%!!*$ $:31:?OaMBR@>JLB2DSA::ERWGJ8 *%'7OR-*6LUTW?>8!D3#"11.9/:FRH' " (1)(>C;8A1150  A7,&%+IFFCE>%<fm]C:92:3!&+1C1/0)$'2*4/(;>)<>7818@G2,&")"21<HE6 +5!%%)- '# NA)*,$&2*(-/*&#34**3+&%2A7&9;4A2(  !>[R2.'"*/7)6Q- 3VXJ94.07@JQA*);:)%,,1-"0+! ,>ORJ:),&%',-  &%9C@10, ":$ 0,%5IS[OL1.TZPRebMJ</@AJW]\[SQB6452  - "&*:8//OQR[]SS!-%/7@8787), ,6885Vca?' ''*45#&#$  %8KQ)&# +04:556@MN;7$5D0 &!#);< "&%"(&%/6E@KJOL!*"$%  ^daaTEK?54% $+GL>/#$2:BEB?725=!1BA@6 '#"&$&," HI>D0#,')/$(1DLFKG)472$*44RPA.<OA 1-0.',62CCR|q_SS>3,)2&8:;< >N/*  # &.3;1 )+%;: A=TQP:&$1 ,</2**0'4&:8;VC%)1548  .('  2(-3  ";KGC&hz4=A-5=STEUWOFJG3* 2- *1EKQQUXbgH441 %(*3>9, =KRB?7 )a!"() 2GN;->HRUOD!*7:2OOKE=/CJI?!$&4?1@~2 *10.6&'+! %89! %7GKFMR3&*,<FLE9:B9OTTVA).+# In<(@C>J,'B@  "  */#*UHG7"' ((   #C,  &+<$%     &"2:O`J?:;6:9?=4##**%).    " %   $:GG@=. 5#& *97;:0>0';BKQ" ( .'!.A=," $$  >:(, 6?J6# (".553+60 ;;<<7 "487;>>NH"$!!18/! H^II>-"*2=A463-.)$$;06=8*!$ ')&#$=JH/5$.' .ImldOE<*'.&#1D\wtUAFXMGVPQTLN_iwrTPBHBB=9;)+ <=?GCGYbqwys\ROK=BM=?8[UM'#DTUcWB%!   .'! $+++.==5&*LZecK77AA?FH 1* $$5D9HMRXTM?.  BK7NU<?LN[WUP?),;-(25!A?'  #"+)"")"!-V\SONLNVSB3*&9.B& *$)88TO7E:*<5) 9)$)! /#-"&<@@N]G(6# &/;NM@-=;22""  !/+"(-29=5%# >C9+5+$*  "3/LMEYLSa?$/@AF87P>=>;$#02  %.B<6:=@ZK>1>G6,7:)B=<9*7PHDDKLIVTXJ:VbfbUWWRDLJC5"')-(#)605,-"/9'*=Rec_]@F6)**7--<0 $M[pa[S4"&%2<>;("*A9CM2(,*+!"&&<JF@@4@G:;40HGDEG>'-/09OZ](/826340-FR?.%<<$)&$/1D.#>8B>.533:)4&z +:9=O@/(6?2!"#1*6>4:J@H7.=ASN[TE::3.E[Z_WXWGCOSC3-'AleaTGNFB<3%2??9/' %-(/4B8&#  0EEEJL84>;=RKJFC=*;@C51/%,&FY_ZXRH>6%$>F][25?! "% 4:IHL7&!<;95, 10 )5*.<4. '$'59*+1?5CIC958@=FTUJ72@0%8+   %*~!4I@R9$ /;C83L;07SQ/+! ',#++)/9-0=!03)?N@1- 24,,C]YQN3 }+2<0/;2*" 1TM& #>@9:?4   "& :64('    50'?NG6$-6>7$#1>70(%$/C?.#14!'()+/6+%4A5+;7ED9@-1*#06,01+;M@;4{}0GFAI@,!(?94NG7. $;QPPK?BE8&%"=JG<1IKD./BLWMHALYS;*}p|xr& 489<$ *272HRGCNQG?:75/10.=NE/0H$0$    )tx ')/9JP:8DPLI@*1'*1-+(1 )BbfWNM>23'#,$5LD@00*G9,;47;A0+07H:74  "%KM6<LL@11M>{|y!0,5BI>2"53/%.87;?7+ "*F[]Q;5six}rpt7CB+ "?OOB3*"/ zpytpu\S`jqo~}}hts{xlp}{y{wdkrqvyq{}wo{qhvhlt`pn~w{pe{ypqtx~}kpxneqtzqq~xOB~ Hpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/no_meta_group_length.dcm000066400000000000000000000006301515706620200274160ustar00rootroot00000000000000DICMOBUI1.2.840.10008.5.1.4.1.1.481.1UI"1.3.46.423632.131558.1322675745.41UI1.2.840.10008.1.2UI"1.2.826.0.1.3680043.2.135.1066.101SH 1.4.1/WIN32AEIVIEW ORIGINAL\PRIMARY\PORTAL 20111130125601.140000 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/priv_SQ.dcm000066400000000000000000000010421515706620200246000ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.4UI41.1.111.111111.1.111.1111111111.1111.1111111111.111UI1.2.840.10008.1.2UI1.2.276.0.7230010.3.0.3.6.3SHOFFIS_DCMTK_363 ?aaabbbccc MEDICAL SYSTEMS ?111111111111111 ?123456789 1234567 1234567 ?11111111093402.100721-0700?image1234567 at 123 ?Values updated from xxx xxxx. pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/reportsi.dcm000066400000000000000000000056301515706620200250730ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.88.11UI41.2.276.0.7230010.3.1.4.1787205428.166.1117461927.10UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.5.3SHOFFIS_DCMTK_353 CS ISO_IR 100DA20050530TM160527UI1.2.276.0.7230010.3.0.3.5.3UI1.2.840.10008.5.1.4.1.1.88.11UI41.2.276.0.7230010.3.1.4.1787205428.166.1117461927.10 DA#DA200505300TM3TM160527PSH`CSSRpLOKuratorium OFFIS e.V. PNLast Name^First NameSQSH99_OFFIS_DCMTK UI1.2.276.0.7230010.3.0.0.1STOFFIS DCMTK Coding Scheme ST<Kuratorium OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany 0LO$OFFIS Structured Reporting Templates>LO IHE Year 2 - Simple Image ReportSQPNLast Name^First Name LO0DA@CSO UI41.2.276.0.7230010.3.1.2.1787205428.166.1117461927.5 UI41.2.276.0.7230010.3.1.3.1787205428.166.1117461927.11 SH IS1 IS1 @@CS CONTAINER @CSQSHIHE.01SH99_OFFIS_DCMTKLODocument Title @PCSSEPARATE@rSQ@CSPARTIAL @CS UNVERIFIED@0SQ@CSHAS OBS CONTEXT @@CSCODE@CSQSHIHE.02SH99_OFFIS_DCMTKLOObservation Context Mode @hSQSHIHE.03SH99_OFFIS_DCMTKLODIRECT @CSHAS OBS CONTEXT @@CSPNAME @CSQSHIHE.04SH99_OFFIS_DCMTKLORecording Observer's Name @#PN Enter text @CSHAS OBS CONTEXT @@CSTEXT@CSQSHIHE.05SH99_OFFIS_DCMTKLO&Recording Observer's Organization Name @`UT Enter text @CSHAS OBS CONTEXT @@CSCODE@CSQSHIHE.06SH99_OFFIS_DCMTKLOObservation Context Mode @hSQSHIHE.07SH99_OFFIS_DCMTKLOPATIENT @CSCONTAINS@@CS CONTAINER @CSQSHIHE.08SH99_OFFIS_DCMTKLOSection Heading @PCSSEPARATE@0SQ@CSCONTAINS@@CSTEXT@CSQSHIHE.09SH99_OFFIS_DCMTKLO Report Text @`UT Enter text@0SQSQPUI0UUI0 @CSINFERRED FROM @@CSIMAGE @CSQSHIHE.10SH99_OFFIS_DCMTKLOImage Reference SQPUI0UUI0 @CSCONTAINS@@CSIMAGE @CSQSHIHE.10SH99_OFFIS_DCMTKLOImage Reference pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/reportsi_with_empty_number_tags.dcm000066400000000000000000000052141515706620200317300ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.88.11UI41.2.276.0.7230010.3.1.4.1787205428.166.1117461927.10UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.6.0SHOFFIS_DCMTK_360 CS ISO_IR 100DA20050530TM160527UI1.2.276.0.7230010.3.0.3.5.3UI1.2.840.10008.5.1.4.1.1.88.11UI41.2.276.0.7230010.3.1.4.1787205428.166.1117461927.10 DA#DA200505300TM3TM160527PSH`CSSRpLOKuratorium OFFIS e.V. PNLast Name^First NameSQSH99_OFFIS_DCMTK UI1.2.276.0.7230010.3.0.0.1STOFFIS DCMTK Coding Scheme ST<Kuratorium OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germany0LO$OFFIS Structured Reporting Templates>LO IHE Year 2 - Simple Image ReportSQaULPNLast Name^First Name LO0DA@CSO 1FL `SL$`USFDSS UI41.2.276.0.7230010.3.1.2.1787205428.166.1117461927.5 UI41.2.276.0.7230010.3.1.3.1787205428.166.1117461927.11 SH IS1 IS1 @@CS CONTAINER @CSQB:SHIHE.01SH99_OFFIS_DCMTKLODocument Title@PCSSEPARATE@rSQ@CSPARTIAL @CS UNVERIFIED@0SQB@CSHAS OBS CONTEXT @@CSCODE@CSQLDSHIHE.02SH99_OFFIS_DCMTKLOObservation Context Mode@hSQ:2SHIHE.03SH99_OFFIS_DCMTKLODIRECT@CSHAS OBS CONTEXT @@CSPNAME @CSQNFSHIHE.04SH99_OFFIS_DCMTKLORecording Observer's Name @#PN Enter text@CSHAS OBS CONTEXT @@CSTEXT@CSQZRSHIHE.05SH99_OFFIS_DCMTKLO&Recording Observer's Organization Name@`UT Enter text@CSHAS OBS CONTEXT @@CSCODE@CSQLDSHIHE.06SH99_OFFIS_DCMTKLOObservation Context Mode@hSQ<4SHIHE.07SH99_OFFIS_DCMTKLOPATIENT b@CSCONTAINS@@CS CONTAINER @CSQD<SHIHE.08SH99_OFFIS_DCMTKLOSection Heading @PCSSEPARATE@0SQ.@CSCONTAINS@@CSTEXT@CSQ@8SHIHE.09SH99_OFFIS_DCMTKLO Report Text @`UT Enter text@0SQSQPUI0UUI0@CSINFERRED FROM @@CSIMAGE @CSQD<SHIHE.10SH99_OFFIS_DCMTKLOImage Reference SQPUI0UUI0@CSCONTAINS@@CSIMAGE @CSQD<SHIHE.10SH99_OFFIS_DCMTKLOImage Reference d OFpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtdose.dcm000066400000000000000000000166201515706620200245250ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.2.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2UI1.2.999.999.99.9.9.9200309031500311.2.840.10008.5.1.4.1.1.481.2*1.9.999.999.99.9.9999.9999.20030818153516 200308050115747P`RTDOSEpManufacturer name here Computer001 $Treatment Planning System name here Lastname^Firstname id11111 0@O P  version 1 1.2.999.999.99.9.9999.8888 1.2.777.777.77.7.7777.7777 S1 1  22189.431250000000\199.431250000000\-761.87000000000 721.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 R22.22.222.2.222222.2.2222222222222222222222222222.2 @(( MONOCHROME2 (15( 0 ( ( (0"10.0000000000000\10.0000000000000 ( ( ((0RELATIVE0PHYSICAL0 BEAM0 0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0 1.0000000e-6 0P1.2.840.10008.5.1.4.1.1.481.5U*1.2.123.456.78.9.0123.4567.89012345678901 0 ,$ 0 01 0"1 p`p"p"@0@0(4(4p( ;C??UhY8aP]UI eli e~`x~vH0Hp@X((8  P ,4<84,p@@HXD8Pu } ؈ ؈ 8y @   X ( x! 0- 5 5 5 0- < @ 8 0- 0`p"X,(4@0X,p( 8?C?UP]hYUQM8ail e~xx~~v`HXXp@(8 8 ,88840p@@H@H<Pu ؈  ؈ p     (  x! 1 5 5 5 1 < D @ 5 0``p"X,(4@0p(  @0?C?U8ahYQIIP]ili~`~vvx00@XX8 88 0<8400p@@H@Hp@ } ؈ ؈   X  ( ( H) 5 8 5 5 1 < @ @ 8  H p"p"@08@0$@0;CChY8ahYMAAhY elix`zooxHX@XЧЧ@( PP 4p@<4,0p@XD@HXD ؈ }  (  (  0- 8 8 5 1 5 @ @ D <  x0p"(48@0 p(8?CP]8ahYI(:AU8ail``xv kr`0@@Xp(8P8p@<4)0p@XD@H@H 8y    @  1 < < 5 1 5 @ @ D < `p"88@00   (4?C8a8ahYA@6(:IP]il``xo8g kv`0(@XЧ@Ph p@p@p@,),4XD@H@H؈ } 8y } ( @ ( 5 < < 1 0- 1 8 @ D <  p"88@00 0 H@0;C8a8aP]@6@6X2AhY elH`x8gPcPcrx0((@@Pp@XDp@%)%0p@@H@H 8y 8y 8y  X @ @  8 @ @ 0- 1 0- 5 @ @ @  p"??@0H`X,;CiihYA@6p.>U el0xoPch_oH@Ч0ЧXPPXD@Hp@0)%,p@XD@H  8y Pu  ( @ X ( < D @ 5 1 0- 5 @ @ @ p" CC(40 `X,;CilP]E@6p.>U ei0`rPch_ kH@0X(x8hXD(Lp@0)%,<XDXD `  8y Pu }  @ X ( < H @ 5 1 0- 1 @ @ @ p";8@00 HX,;C e ehYA@6@6>U eiHHxoPcPc kH((@ЧЧXPhp@XDp@,)%,<XDXD؈  8y 8y } ( @ @ ( 8 @ @ 5 1 0- 1 < @ < 8(4@00  @0??8aP]hYE@6(:>hYii``xr8g8g kx0@@XX8h8p@<0)))p@@HXD  8y } }   @ @ ( 5 < < 5 0- 1 1 @ D < Hp"(4(4@0 (4C?P]8ahYMAAEP]iix`xzoor`0X@XЧЧ@ PPP 8<<4,,0p@@HXD }   ( ( ( ( 1 8 < 8 1 5 1 < @ < ``0@08@0p(  $(4?;hY8aP]UMIQP]i e`xzvz`0Hp(Xp@   4<<8444p@XDp@ ؈ ( 0- 8 < 8 8 8 8 < @ 8  @08(4@0X,X,@0(4;8hY8aP]hYUUhYP] e8a``x`H`p(@XppX@(@ 0<<<88<p@p@< } ؈ ؈ ؈ ؈ ؈ @  H) 5 < 8 8 8 8 < < 1 @0(48(4@0@0(4888UP]8aP]hYhYP]8a8a8a~``xxxx```@(XXXX@@X8 ,8p@<<<<<<08y ؈ ؈ ؈  p  ( `% 5 8 8 8 8 8 8 5 1 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtdose_1frame.dcm000066400000000000000000000036461515706620200257640ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.2.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2UI1.2.999.999.99.9.9.9200309031500311.2.840.10008.5.1.4.1.1.481.2*1.9.999.999.99.9.9999.9999.20030818153516 200308050115747P`RTDOSEpManufacturer name here Computer001 $Treatment Planning System name here Lastname^Firstname id11111 0@O P  version 1 1.2.999.999.99.9.9999.8888 1.2.777.777.77.7.7777.7777 S1 1  22189.431250000000\199.431250000000\-761.87000000000 721.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 R22.22.222.2.222222.2.2222222222222222222222222222.2 @(( MONOCHROME2 ( 0 ( ( (0"10.0000000000000\10.0000000000000 ( ( ((0RELATIVE0PHYSICAL0 BEAM0 0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0 1.0000000e-6 0P1.2.840.10008.5.1.4.1.1.481.5U*1.2.123.456.78.9.0123.4567.89012345678901 0 ,$ 0 01 0"1 `p"p"@0@0(4(4p( ;C??UhY8aP]UI eli e~`x~vH0Hp@X((8  P ,4<84,p@@HXD8Pu } ؈ ؈ 8y @   X ( x! 0- 5 5 5 0- < @ 8 0- pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtdose_expb.dcm000066400000000000000000000167021515706620200255440ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.2.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 DA20030903TM150031UI1.2.840.10008.5.1.4.1.1.481.2UI*1.9.999.999.99.9.9999.9999.20030818153516 DA200308050TM115747PSH`CSRTDOSEpLOManufacturer name herePNSH Computer001 LO$Treatment Planning System name here PNLastname^Firstname LOid11111 0DA@CSO PDS LO version 1 UI1.2.999.999.99.9.9999.8888 UI1.2.777.777.77.7.7777.7777 SHS1 IS1 IS 2DS2189.431250000000\199.431250000000\-761.87000000000 7DS21.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 RUI22.22.222.2.222222.2.2222222222222222222222222222.2 @LO(US(CS MONOCHROME2 (IS15( AT0 (US (US (0DS"10.0000000000000\10.0000000000000 (US (US (US(US0CSRELATIVE0CSPHYSICAL0 CSBEAM0 DS0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0DS 1.0000000e-60 SQPUI1.2.840.10008.5.1.4.1.1.481.5UUI*1.2.123.456.78.9.0123.4567.890123456789010 SQ0(0 SQ 0 IS1 0 "IS1 OWp`"p"p0@0@4(4((p ;C??UYha8]PUIe lie ~`x~vH0Hp@X((8  P ,4<84,@pH@DX8 uP } y8 ň @   X ( !x -0 5 5 5 -0 < @ 8 -0 0`"p,X4(0@,X(p 8?C?U]PYhUQMa8ile ~xx~~v`HXXp@(8 8 ,88840@pH@H@< uP  p     (  !x 1 5 5 5 1 < D @ 5 0``"p,X4(0@(p  0@?C?Ua8YhQII]Pili~`~vvx00@XX8 88 0<8400@pH@H@@p }   X  ( ( )H 5 8 5 5 1 < @ @ 8 H "p"p0@80@$0@;CCYha8YhMAAYhe lix`zooxHX@X@( PP 4@p<4,0@pDXH@DX  }  (  (  -0 8 8 5 1 5 @ @ D < x0"p4(80@ (p8?C]Pa8YhI:(AUa8il``xvk r`0@@Xp(8P8@p<4)0@pDXH@H@ y8    @  1 < < 5 1 5 @ @ D <`"p880@ 0  4(?Ca8a8YhA6@:(I]Pil``xog8k v`0(@X@Ph @p@p@p,),4DXH@H@ } y8 } ( @ ( 5 < < 1 -0 1 8 @ D < "p880@ 0 0H0@;Ca8a8]P6@6@2XAYhe lH`xg8cPcPrx0((@@P@pDX@p%)%0@pH@H@ y8 y8 y8  X @ @  8 @ @ -0 1 -0 5 @ @ @ "p??0@H`,X;CiiYhA6@.p>Ue l0xocP_hoH@0XPPDXH@@p0)%,@pDXH@  y8 uP  ( @ X ( < D @ 5 1 -0 5 @ @ @"p CC4( 0`,X;Cil]PE6@.p>Ue i0`rcP_hk H@0X(x8hDXL(@p0)%,<DXDX `  y8 uP }  @ X ( < H @ 5 1 -0 1 @ @ @"p;80@ 0H,X;Ce e YhA6@6@>Ue iHHxocPcPk H((@XPh@pDX@p,)%,<DXDX  y8 y8 } ( @ @ ( 8 @ @ 5 1 -0 1 < @ <84(0@ 0 0@??a8]PYhE6@:(>Yhii``xrg8g8k x0@@XX8h8@p<0)))@pH@DX  y8 } }   @ @ ( 5 < < 5 -0 1 1 @ D <H"p4(4(0@ 4(C?]Pa8YhMAAE]Piix`xzoor`0X@X@ PPP 8<<4,,0@pH@DX }   ( ( ( ( 1 8 < 8 1 5 1 < @ <``00@80@(p  $4(?;Yha8]PUMIQ]Pie `xzvz`0Hp(Xp@   4<<8444@pDX@p  ( -0 8 < 8 8 8 8 < @ 8 0@84(0@,X,X0@4(;8Yha8]PYhUUYh]Pe a8``x`H`p(@XppX@(@ 0<<<88<@p@p< } @  )H 5 < 8 8 8 8 < < 10@4(84(0@0@4(888U]Pa8]PYhYh]Pa8a8a8~``xxxx```@(XXXX@@X8 ,8@p<<<<<<0 y8  p  ( %` 5 8 8 8 8 8 8 5 1pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtdose_expb_1frame.dcm000066400000000000000000000037301515706620200267740ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.2.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.6.2SHOFFIS_DCMTK_362 DA20030903TM150031UI1.2.840.10008.5.1.4.1.1.481.2UI*1.9.999.999.99.9.9999.9999.20030818153516 DA200308050TM115747PSH`CSRTDOSEpLOManufacturer name herePNSH Computer001 LO$Treatment Planning System name here PNLastname^Firstname LOid11111 0DA@CSO PDS LO version 1 UI1.2.999.999.99.9.9999.8888 UI1.2.777.777.77.7.7777.7777 SHS1 IS1 IS 2DS2189.431250000000\199.431250000000\-761.87000000000 7DS21.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 RUI22.22.222.2.222222.2.2222222222222222222222222222.2 @LO(US(CS MONOCHROME2 ( AT0 (US (US (0DS"10.0000000000000\10.0000000000000 (US (US (US(US0CSRELATIVE0CSPHYSICAL0 CSBEAM0 DS0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0DS 1.0000000e-60 SQPUI1.2.840.10008.5.1.4.1.1.481.5UUI*1.2.123.456.78.9.0123.4567.890123456789010 SQ0(0 SQ 0 IS1 0 "IS1 OW`"p"p0@0@4(4((p ;C??UYha8]PUIe lie ~`x~vH0Hp@X((8  P ,4<84,@pH@DX8 uP } y8 ň @   X ( !x -0 5 5 5 -0 < @ 8 -0pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtdose_rle.dcm000066400000000000000000000152401515706620200253640ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.9.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2.5UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvUN20030903UN150031UN1.2.840.10008.5.1.4.1.1.481.2UN*1.9.999.999.99.9.9999.9999.20030818153516 UN200308050UN115747PUN`UNRTDOSEpUNManufacturer name hereUNUN Computer001 UN$Treatment Planning System name here UNLastname^Firstname UNid11111 0UN@UNO PUN UN version 1 UN1.2.999.999.99.9.9999.8888 UN1.2.777.777.77.7.7777.7777 UNS1 UN1 UN 2UN2189.431250000000\199.431250000000\-761.87000000000 7UN21.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 RUN22.22.222.2.222222.2.2222222222222222222222222222.2 @UN(US(CS MONOCHROME2 (IS15( UN0 (US (US (0UN"10.0000000000000\10.0000000000000 (US (US (US(US0UNRELATIVE0UNPHYSICAL0 UNBEAM0 UN0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0UN 1.0000000e-6 0UNP1.2.840.10008.5.1.4.1.1.481.5U*1.2.123.456.78.9.0123.4567.89012345678901 0 ,$ 0 01 0"1 OWL@Tp ""04( ;C? UYa]UIelie ~~v   ,4<84,@HD8 u}y !-5-<@8-`pp@(p h8P  `xH0H p@X(( 8 P 踈p@X P 8 @X(x00и0J@Tp " ,40,( 8?C? U]YUQMaile ~~~v  ,840@HH< u!151Uel oc_o ǿ DH@0)%,@DH yu Uei rc_k ο DL@0)%,Ueiocck @D@,)%,Yirggk8@<0)@HD y}} 5<<5-11@D<(@0@8Ph@(h`x88 x0@XX8hpp@X 8 @@(Ȱ 0J@Tn "40 4C?]aYMAAE]i zoor   8<<4,,0@HD } 18<8151<@<Hp(@(P8hP x`x`0 X@Xи@ Pؐ p@X ((Ȱ иF@Tn  080( $4?; Ya]UMIQ]ie zvzû4<<84@D@-8<8<@8 ``0Ј @@p( h8PȘP `x`0Hp(Xp@ بpXp(Ȱ0иD@Tk   0840,,04;8 Ya]YUUY]ea ÿÿ 0<8<@@<})5<8<1 @(@XX@( h8PhhP 8``x`H` p(@XppX@(@ pp @H"@Th 04840048U]a]YY]a~,8@<0 y%5851и@((@@(P8PhhP8``x`@(X@X8 p 8p(`pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtdose_rle_1frame.dcm000066400000000000000000000041121515706620200266130ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.9.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2.5UI01.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4SH GDCM 2.8.4AEgdcmconvUN20030903UN150031UN1.2.840.10008.5.1.4.1.1.481.2UN*1.9.999.999.99.9.9999.9999.20030818153516 UN200308050UN115747PUN`UNRTDOSEpUNManufacturer name hereUNUN Computer001 UN$Treatment Planning System name here UNLastname^Firstname UNid11111 0UN@UNO PUN UN version 1 UN1.2.999.999.99.9.9999.8888 UN1.2.777.777.77.7.7777.7777 UNS1 UN1 UN 2UN2189.431250000000\199.431250000000\-761.87000000000 7UN21.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 RUN22.22.222.2.222222.2.2222222222222222222222222222.2 @UN(US(CS MONOCHROME2 ( UN0 (US (US (0UN"10.0000000000000\10.0000000000000 (US (US (US(US0UNRELATIVE0UNPHYSICAL0 UNBEAM0 UN0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0UN 1.0000000e-6 0UNP1.2.840.10008.5.1.4.1.1.481.5U*1.2.123.456.78.9.0123.4567.89012345678901 0 ,$ 0 01 0"1 OWL@Tp ""04( ;C? UYa]UIelie ~~v   ,4<84,@HD8 u}y !-5-<@8-`pp@(p h8P  `xH0H p@X(( 8 P 踈p@X P 8 @X(x00и0pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtplan.dcm000066400000000000000000000051601515706620200245220ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.5UI*1.2.999.999.99.9.9999.9999.20030903150023UI1.2.840.10008.1.2UI1.2.888.888.88.8.8.8200309031500311.2.840.10008.5.1.4.1.1.481.5*1.2.777.777.77.7.7777.7777.20030903150023 200307160153557P`RTPLANpManufacturer name hereHere COMPUTER002 @Radiation Therappoperator$Treatment Planning System name here Last^First^mid^pre id00001 0@O   softwareV1 01.22.333.4.555555.6.7777777777777777777777777777 1.2.333.444.55.6.7777.8888 study1 2 0Plan1 0Plan1 020030903 0150023 0 PATIENT 0D 01 0 COORDINATES 0iso 02239.531250000000\239.531250000000\-741.87000000000 0 ORGAN_AT_RISK 0#75.0000000000000 0,75.0000000000000 02 0 COORDINATES 0PTV 02239.531250000000\239.531250000000\-751.87000000000 0 TARGET 0&30.8262030000000 0p 0q1 0x30 01 00 0|t 02239.531250000000\239.531250000000\-751.87000000000 01.02754010000000 0116.003669700000 01 0p Linac co. Here@Radiation Therap Zapper90009999 0unit001 0MU 01000.00000000000 08 0X 01  0Y 01 01 0Field 1 0STATIC 0PHOTON 0 TREATMENT 00 00 00 00 01.00000000000000 02 0^ 00 06.00000000000000 0650.000000000000 0x4 0X 0"-100.00000000000\100.000000000000 4 0Y 0"-100.00000000000\100.000000000000 00.0 0NONE 0 0.0 0!NONE 0"0.0 0#NONE 0%0.0 0&NONE 0( 0) 0* 0,2235.711172833292\244.135437110782\-724.97815409918 00898.429664831309 040.0 0P< 0 0.0 0Q1  0 0.0 0Q2 z 01 041.00000000000000 0PP 0  9.9902680e-1 0Q1 " 0 1.00000000000000 0Q2 0j1 0&QHFS 01 0 0tlP1.2.840.10008.5.1.4.1.1.481.5U*1.9.999.999.99.9.9999.9999.20030903145128 0U PREDECESSOR 0`RJP1.2.840.10008.5.1.4.1.1.481.3U1.2.333.444.55.6.7777.888880 UNAPPROVEDpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtplan.dump000066400000000000000000000342121515706620200247240ustar00rootroot000000000000000000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 0070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0080 : 44 49 43 4d DICOM prefix 'DICM' ------------ File meta information ------------------------------------- (Always Explicit VR, Little Endian) 0084 : 02 00 00 00 (0002,0000) 0088 : 55 4c UL 008A : 04 00 value length 4 bytes 008C : 9c 00 00 00 value = 156 0090 : 02 00 01 00 (0002, 0001) 0094 : 4f 42 Explicit VR 'OB' 0096 : 00 00 2-byte reserved 0098 : 02 00 00 00 value length = 2 009c : 00 01 009e : 02 00 02 00 (0002, 0002) Media Storage SOP Class UID 00a2 : 55 49 Explicit VR 'UI' 00a4 : 1e 00 value length 30 bytes 00a6 : 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 1.2.840.10008.5. 00b6 : 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 1.4.1.1.481.5 00c3 00 pad to even length 00c4 : 02 00 03 00 (0002, 0003) 00c8 : 55 49 Explicit VR 'UI' 00ca : 2a 00 Value length 42 bytes 00cc : 31 2e 32 2e 39 39 39 2e 39 39 39 2e 39 39 2e 39 1.2.999.999.99.9 00dc : 2e 39 39 39 39 2e 39 39 39 39 2e 32 30 30 33 30 .9999.9999.20030 00ec : 39 30 33 31 35 30 30 32 33 903150023 00f5 : 00 pad to even length 00f6 : 02 00 10 00 55 49 12 00 31 2e .....UI..1. 0100 : 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 00 2.840.10008.1.2. 0110 : 02 00 12 00 55 49 14 00 31 2e 32 2e 38 38 38 2e ....UI..1.2.888. 0120 : 38 38 38 2e 38 38 2e 38 2e 38 2e 38 08 00 12 00 888.88.8.8.8.... 0130 : 08 00 00 00 32 30 30 33 30 39 30 33 08 00 13 00 ....20030903.... 0140 : 06 00 00 00 31 35 30 30 33 31 08 00 16 00 1e 00 ....150031...... 0150 : 00 00 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e ..1.2.840.10008. 0160 : 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 00 5.1.4.1.1.481.5. 0170 : 08 00 18 00 2a 00 00 00 31 2e 32 2e 37 37 37 2e ....*...1.2.777. 0180 : 37 37 37 2e 37 37 2e 37 2e 37 37 37 37 2e 37 37 777.77.7.7777.77 0190 : 37 37 2e 32 30 30 33 30 39 30 33 31 35 30 30 32 77.2003090315002 01a0 : 33 00 08 00 20 00 08 00 00 00 32 30 30 33 30 37 3... .....200307 01b0 : 31 36 08 00 30 00 06 00 00 00 31 35 33 35 35 37 16..0.....153557 01c0 : 08 00 50 00 00 00 00 00 08 00 60 00 06 00 00 00 ..P.......`..... 01d0 : 52 54 50 4c 41 4e 08 00 70 00 16 00 00 00 4d 61 RTPLAN..p.....Ma 01e0 : 6e 75 66 61 63 74 75 72 65 72 20 6e 61 6d 65 20 nufacturer name 01f0 : 68 65 72 65 08 00 80 00 04 00 00 00 48 65 72 65 here........Here 0200 : 08 00 90 00 00 00 00 00 08 00 10 10 0c 00 00 00 ................ 0210 : 43 4f 4d 50 55 54 45 52 30 30 32 20 08 00 40 10 COMPUTER002 ..@. 0220 : 10 00 00 00 52 61 64 69 61 74 69 6f 6e 20 54 68 ....Radiation Th 0230 : 65 72 61 70 08 00 70 10 08 00 00 00 6f 70 65 72 erap..p.....oper 0240 : 61 74 6f 72 08 00 90 10 24 00 00 00 54 72 65 61 ator....$...Trea 0250 : 74 6d 65 6e 74 20 50 6c 61 6e 6e 69 6e 67 20 53 tment Planning S 0260 : 79 73 74 65 6d 20 6e 61 6d 65 20 68 65 72 65 20 ystem name here 0270 : 10 00 10 00 12 00 00 00 4c 61 73 74 5e 46 69 72 ........Last^Fir 0280 : 73 74 5e 6d 69 64 5e 70 72 65 10 00 20 00 08 00 st^mid^pre.. ... 0290 : 00 00 69 64 30 30 30 30 31 20 10 00 30 00 00 00 ..id00001 ..0... 02a0 : 00 00 10 00 40 00 02 00 00 00 4f 20 18 00 20 10 ....@.....O .. . 02b0 : 0a 00 00 00 73 6f 66 74 77 61 72 65 56 31 20 00 ....softwareV1 . 02c0 : 0d 00 30 00 00 00 31 2e 32 32 2e 33 33 33 2e 34 ..0...1.22.333.4 02d0 : 2e 35 35 35 35 35 35 2e 36 2e 37 37 37 37 37 37 .555555.6.777777 02e0 : 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 7777777777777777 02f0 : 37 37 37 37 37 37 20 00 0e 00 1a 00 00 00 31 2e 777777 .......1. 0300 : 32 2e 33 33 33 2e 34 34 34 2e 35 35 2e 36 2e 37 2.333.444.55.6.7 0310 : 37 37 37 2e 38 38 38 38 20 00 10 00 06 00 00 00 777.8888 ....... 0320 : 73 74 75 64 79 31 20 00 11 00 02 00 00 00 32 20 study1 .......2 0330 : 0a 30 02 00 06 00 00 00 50 6c 61 6e 31 20 0a 30 .0......Plan1 .0 0340 : 03 00 06 00 00 00 50 6c 61 6e 31 20 0a 30 06 00 ......Plan1 .0.. 0350 : 08 00 00 00 32 30 30 33 30 39 30 33 0a 30 07 00 ....20030903.0.. 0360 : 06 00 00 00 31 35 30 30 32 33 0a 30 0c 00 08 00 ....150023.0.... 0370 : 00 00 50 41 54 49 45 4e 54 20 0a 30 10 00 44 01 ..PATIENT .0..D. 0380 : 00 00 fe ff 00 e0 aa 00 00 00 0a 30 12 00 02 00 ...........0.... 0390 : 00 00 31 20 0a 30 14 00 0c 00 00 00 43 4f 4f 52 ..1 .0......COOR 03a0 : 44 49 4e 41 54 45 53 20 0a 30 16 00 04 00 00 00 DINATES .0...... 03b0 : 69 73 6f 20 0a 30 18 00 32 00 00 00 32 33 39 2e iso .0..2...239. 03c0 : 35 33 31 32 35 30 30 30 30 30 30 30 5c 32 33 39 531250000000.239 03d0 : 2e 35 33 31 32 35 30 30 30 30 30 30 30 5c 2d 37 .531250000000.-7 03e0 : 34 31 2e 38 37 30 30 30 30 30 30 30 30 30 0a 30 41.87000000000.0 03f0 : 20 00 0e 00 00 00 4f 52 47 41 4e 5f 41 54 5f 52 .....ORGAN_AT_R 0400 : 49 53 4b 20 0a 30 23 00 10 00 00 00 37 35 2e 30 ISK .0#.....75.0 0410 : 30 30 30 30 30 30 30 30 30 30 30 30 0a 30 2c 00 000000000000.0,. 0420 : 10 00 00 00 37 35 2e 30 30 30 30 30 30 30 30 30 ....75.000000000 0430 : 30 30 30 30 fe ff 00 e0 8a 00 00 00 0a 30 12 00 0000.........0.. 0440 : 02 00 00 00 32 20 0a 30 14 00 0c 00 00 00 43 4f ....2 .0......CO 0450 : 4f 52 44 49 4e 41 54 45 53 20 0a 30 16 00 04 00 ORDINATES .0.... 0460 : 00 00 50 54 56 20 0a 30 18 00 32 00 00 00 32 33 ..PTV .0..2...23 0470 : 39 2e 35 33 31 32 35 30 30 30 30 30 30 30 5c 32 9.531250000000.2 0480 : 33 39 2e 35 33 31 32 35 30 30 30 30 30 30 30 5c 39.531250000000. 0490 : 2d 37 35 31 2e 38 37 30 30 30 30 30 30 30 30 30 -751.87000000000 04a0 : 0a 30 20 00 06 00 00 00 54 41 52 47 45 54 0a 30 .0 .....TARGET.0 04b0 : 26 00 10 00 00 00 33 30 2e 38 32 36 32 30 33 30 &.....30.8262030 04c0 : 30 30 30 30 30 30 0a 30 70 00 b4 00 00 00 fe ff 000000.0p....... 04d0 : 00 e0 ac 00 00 00 0a 30 71 00 02 00 00 00 31 20 .......0q.....1 04e0 : 0a 30 78 00 02 00 00 00 33 30 0a 30 80 00 02 00 .0x.....30.0.... 04f0 : 00 00 31 20 0a 30 a0 00 02 00 00 00 30 20 0c 30 ..1 .0......0 .0 0500 : 04 00 7c 00 00 00 fe ff 00 e0 74 00 00 00 0a 30 ..|.......t....0 0510 : 82 00 32 00 00 00 32 33 39 2e 35 33 31 32 35 30 ..2...239.531250 0520 : 30 30 30 30 30 30 5c 32 33 39 2e 35 33 31 32 35 000000.239.53125 0530 : 30 30 30 30 30 30 30 5c 2d 37 35 31 2e 38 37 30 0000000.-751.870 0540 : 30 30 30 30 30 30 30 30 0a 30 84 00 10 00 00 00 00000000.0...... 0550 : 31 2e 30 32 37 35 34 30 31 30 30 30 30 30 30 30 1.02754010000000 0560 : 0a 30 86 00 10 00 00 00 31 31 36 2e 30 30 33 36 .0......116.0036 0570 : 36 39 37 30 30 30 30 30 0c 30 06 00 02 00 00 00 69700000.0...... 0580 : 31 20 0582 : 0a 30 b0 00 (300a, 00b0) Beam Sequence Implicit VR 'SQ' 0586 : d0 03 00 00 length 976 bytes 058a : fe ff 00 e0 Item tag (FFFE, E000) 058e : c8 03 00 00 Item length 968 bytes 0592 : 08 00 70 00 (0008, 0070) Manufacturer Implicit VR 'LO' 0596 : 0a 00 00 00 Value length 10 bytes 059a : 4c 69 6e 61 63 20 63 6f 2e Linac co. 05a3 : 20 pad to even length with blank 05a4 : 08 00 80 00 (0008, 0080) Institution Name 04 00 00 00 Value length 4 48 65 72 65 value 'Here' 05b0 : 08 00 40 10 (0008, 1040) Institutional Department Name 10 00 00 00 value length 16 52 61 64 69 61 74 69 6f 6e 20 54 68 65 72 61 70 value 'Radiation Therap' 05c8 : 08 00 90 10 (0008, 1090) Manufacturer's Model Name 0a 00 00 00 value length 10 05d0 : 5a 61 70 70 65 72 39 30 30 30 value 'Zapper9000' 18 00 00 10 (0018, 1000) Device Serial Number 04 00 00 00 value length 4 05e2 : 39 39 39 39 value '9999' 0a 30 b2 00 (300a, 00b2) Treatment Machine Name 08 00 00 00 value length 8 75 6e 69 74 30 30 31 20 value 'unit001 " 05f5 : 0a 30 b3 00 (300a, 00b3) Primary Dosimeter Unit 02 00 00 00 value length 2 4d 55 value 'MU' 0600 : 0a 30 b4 00 (300a, 00b4) Source-Axis Distance 10 00 00 00 value length 16 31 30 30 30 2e 30 30 30 30 30 30 30 30 30 30 30 value '1000.00000000000' 0608: 0a 30 b6 00 (300a, 00b6) Beam Limiting Device Sequence 38 00 00 00 length 56 0620 : fe ff 00 e0 Item tag (FFFE, E000) 14 00 00 00 Item length 20 0a 30 b8 00 (300a, 00b8) RT Beam Limiting Device Type 02 00 00 00 value length 2 58 20 value 'X ' 0a 30 bc 00 (300a, 00bc) Number of Leaf/Jaw Pairs 02 00 00 00 value length 2 31 20 value '1 ' fe ff 00 e0 Item tag (FFFE, E000) 14 00 00 00 Item length 20 0a 30 b8 00 (300a, 00b8) RT Beam Limiting Device Type 02 00 00 00 value length 2 59 20 value 'Y ' 0a 30 bc 00 (300a, 00bc) Number of Leaf/Jaw Pairs 0652 : 02 00 00 00 value length 2 31 20 value '1 ' 0a 30 c0 00 (300a, 00c0) Beam Number 02 00 00 00 value length 2 0660 : 31 20 value '1 ' 0a 30 c2 00 (300a, 00c2) Beam Name 08 00 00 00 value length 8 46 69 65 6c 64 20 31 20 'Field 1 ' 0672 : 0a 30 c4 00 06 00 00 00 53 54 41 54 49 43 1 .0......STATIC 0680 : 0a 30 c6 00 06 00 00 00 50 48 4f 54 4f 4e 0a 30 .0......PHOTON.0 0690 : ce 00 0a 00 00 00 54 52 45 41 54 4d 45 4e 54 20 ......TREATMENT 06a0 : 0a 30 d0 00 02 00 00 00 30 20 0a 30 e0 00 02 00 .0......0 .0.... 06b0 : 00 00 30 20 0a 30 ed 00 02 00 00 00 30 20 0a 30 ..0 .0......0 .0 06c0 : f0 00 02 00 00 00 30 20 0a 30 0e 01 10 00 00 00 ......0 .0...... 06d0 : 31 2e 30 30 30 30 30 30 30 30 30 30 30 30 30 30 1.00000000000000 06e0 : 0a 30 10 01 02 00 00 00 32 20 0a 30 11 01 5e 02 .0......2 .0..^. 06f0 : 00 00 fe ff 00 e0 d4 01 00 00 0a 30 12 01 02 00 ...........0.... 0700 : 00 00 30 20 0a 30 14 01 10 00 00 00 36 2e 30 30 ..0 .0......6.00 0710 : 30 30 30 30 30 30 30 30 30 30 30 30 0a 30 15 01 000000000000.0.. 0720 : 10 00 00 00 36 35 30 2e 30 30 30 30 30 30 30 30 ....650.00000000 0730 : 30 30 30 30 0a 30 1a 01 78 00 00 00 fe ff 00 e0 0000.0..x....... 0740 : 34 00 00 00 0a 30 b8 00 02 00 00 00 58 20 0a 30 4....0......X .0 0750 : 1c 01 22 00 00 00 2d 31 30 30 2e 30 30 30 30 30 .."...-100.00000 0760 : 30 30 30 30 30 30 5c 31 30 30 2e 30 30 30 30 30 000000.100.00000 0770 : 30 30 30 30 30 30 30 20 fe ff 00 e0 34 00 00 00 0000000 ....4... 0780 : 0a 30 b8 00 02 00 00 00 59 20 0a 30 1c 01 22 00 .0......Y .0..". 0790 : 00 00 2d 31 30 30 2e 30 30 30 30 30 30 30 30 30 ..-100.000000000 07a0 : 30 30 5c 31 30 30 2e 30 30 30 30 30 30 30 30 30 00.100.000000000 07b0 : 30 30 30 20 0a 30 1e 01 04 00 00 00 30 2e 30 20 000 .0......0.0 07c0 : 0a 30 1f 01 04 00 00 00 4e 4f 4e 45 0a 30 20 01 .0......NONE.0 . 07d0 : 04 00 00 00 30 2e 30 20 0a 30 21 01 04 00 00 00 ....0.0 .0!..... 07e0 : 4e 4f 4e 45 0a 30 22 01 04 00 00 00 30 2e 30 20 NONE.0".....0.0 07f0 : 0a 30 23 01 04 00 00 00 4e 4f 4e 45 0a 30 25 01 .0#.....NONE.0%. 0800 : 04 00 00 00 30 2e 30 20 0a 30 26 01 04 00 00 00 ....0.0 .0&..... 0810 : 4e 4f 4e 45 0a 30 28 01 00 00 00 00 0a 30 29 01 NONE.0(......0). 0820 : 00 00 00 00 0a 30 2a 01 00 00 00 00 0a 30 2c 01 .....0*......0,. 0830 : 32 00 00 00 32 33 35 2e 37 31 31 31 37 32 38 33 2...235.71117283 0840 : 33 32 39 32 5c 32 34 34 2e 31 33 35 34 33 37 31 3292.244.1354371 0850 : 31 30 37 38 32 5c 2d 37 32 34 2e 39 37 38 31 35 10782.-724.97815 0860 : 34 30 39 39 31 38 0a 30 30 01 10 00 00 00 38 39 409918.00.....89 0870 : 38 2e 34 32 39 36 36 34 38 33 31 33 30 39 0a 30 8.429664831309.0 0880 : 34 01 04 00 00 00 30 2e 30 20 0c 30 50 00 3c 00 4.....0.0 .0P.<. 0890 : 00 00 fe ff 00 e0 16 00 00 00 0a 30 0c 01 04 00 ...........0.... 08a0 : 00 00 30 2e 30 20 0c 30 51 00 02 00 00 00 31 20 ..0.0 .0Q.....1 08b0 : fe ff 00 e0 16 00 00 00 0a 30 0c 01 04 00 00 00 .........0...... 08c0 : 30 2e 30 20 0c 30 51 00 02 00 00 00 32 20 fe ff 0.0 .0Q.....2 .. 08d0 : 00 e0 7a 00 00 00 0a 30 12 01 02 00 00 00 31 20 ..z....0......1 08e0 : 0a 30 34 01 10 00 00 00 31 2e 30 30 30 30 30 30 .04.....1.000000 08f0 : 30 30 30 30 30 30 30 30 0c 30 50 00 50 00 00 00 00000000.0P.P... 0900 : fe ff 00 e0 1e 00 00 00 0a 30 0c 01 0c 00 00 00 .........0...... 0910 : 39 2e 39 39 30 32 36 38 30 65 2d 31 0c 30 51 00 9.9902680e-1.0Q. 0920 : 02 00 00 00 31 20 fe ff 00 e0 22 00 00 00 0a 30 ....1 ...."....0 0930 : 0c 01 10 00 00 00 31 2e 30 30 30 30 30 30 30 30 ......1.00000000 0940 : 30 30 30 30 30 30 0c 30 51 00 02 00 00 00 32 20 000000.0Q.....2 0950 : 0c 30 6a 00 02 00 00 00 31 20 ===== ??? end of SQ????? 095a : 0a 30 80 01 (300a, 0180) Patient Setup Sequence Implicit VR 'SQ' 095e : 26 00 00 00 Length 38 bytes 0962 : fe ff 00 e0 (fffe, e000) Item Tag 0966 : 1e 00 00 00 Item length 30 bytes 096a : 18 00 00 51 (0018, 5100) Patient Position Implicit VR 'CS' 096e : 04 00 00 00 Value length 4 bytes 0973 : 48 46 53 HFS 0975 : 20 pad to even length 0976 : 0a 30 82 01 (300a, 0182) 02 00 00 00 31 20 ..HFS .0......1 0980 : 0a 30 b2 01 00 00 00 00 0c 30 02 00 74 00 00 00 .0.......0..t... 0990 : fe ff 00 e0 6c 00 00 00 08 00 50 11 1e 00 00 00 ....l.....P..... 09a0 : 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 1.2.840.10008.5. 09b0 : 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 00 08 00 1.4.1.1.481.5... 09c0 : 55 11 2a 00 00 00 31 2e 39 2e 39 39 39 2e 39 39 U.*...1.9.999.99 09d0 : 39 2e 39 39 2e 39 2e 39 39 39 39 2e 39 39 39 39 9.99.9.9999.9999 09e0 : 2e 32 30 30 33 30 39 30 33 31 34 35 31 32 38 00 .20030903145128. 09f0 : 0a 30 55 00 0c 00 00 00 50 52 45 44 45 43 45 53 .0U.....PREDECES 0a00 : 53 4f 52 20 0c 30 60 00 52 00 00 00 fe ff 00 e0 SOR .0`.R....... 0a10 : 4a 00 00 00 08 00 50 11 1e 00 00 00 31 2e 32 2e J.....P.....1.2. 0a20 : 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 840.10008.5.1.4. 0a30 : 31 2e 31 2e 34 38 31 2e 33 00 08 00 55 11 1c 00 1.1.481.3...U... 0a40 : 00 00 31 2e 32 2e 33 33 33 2e 34 34 34 2e 35 35 ..1.2.333.444.55 0a50 : 2e 36 2e 37 37 37 37 2e 38 38 38 38 38 00 0e 30 .6.7777.88888..0 0a60 : 02 00 0a 00 00 00 55 4e 41 50 50 52 4f 56 45 44 ......UNAPPROVED 0a70 : pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtplan_truncated.dcm000066400000000000000000000041211515706620200265670ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.481.5UI*1.2.999.999.99.9.9999.9999.20030903150023UI1.2.840.10008.1.2UI1.2.888.888.88.8.8.8200309031500311.2.840.10008.5.1.4.1.1.481.5*1.2.777.777.77.7.7777.7777.20030903150023 200307160153557P`RTPLANpManufacturer name hereHere COMPUTER002 @Radiation Therappoperator$Treatment Planning System name here Last^First^mid^pre id00001 0@O   softwareV1 01.22.333.4.555555.6.7777777777777777777777777777 1.2.333.444.55.6.7777.8888 study1 2 0Plan1 0Plan1 020030903 0150023 0 PATIENT 0D 01 0 COORDINATES 0iso 02239.531250000000\239.531250000000\-741.87000000000 0 ORGAN_AT_RISK 0#75.0000000000000 0,75.0000000000000 02 0 COORDINATES 0PTV 02239.531250000000\239.531250000000\-751.87000000000 0 TARGET 0&30.8262030000000 0p 0q1 0x30 01 00 0|t 02239.531250000000\239.531250000000\-751.87000000000 01.02754010000000 0116.003669700000 01 0p Linac co. Here@Radiation Therap Zapper90009999 0unit001 0MU 01000.00000000000 08 0X 01  0Y 01 01 0Field 1 0STATIC 0PHOTON 0 TREATMENT 00 00 00 00 01.00000000000000 02 0^ 00 06.00000000000000 0650.000000000000 0x4 0X 0"-100.00000000000\100.000000000000 4 0Y 0"-100.00000000000\100.000000000000 00.0 0NONE 0 0.0 0!NONE 0"0.0 0#NONE 0%0.0 0&NONE 0( 0) 0* 0,2235.711172833292\244.13543711pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtstruct.dcm000066400000000000000000000047461515706620200251250ustar00rootroot00000000000000 ISO_IR 100200912231238401.2.826.0.1.3680043.8.4981.2.840.10008.5.1.4.1.1.481.3(1.2.826.0.1.3680043.8.498.2010020400001 0P1 `RTSTRUCTppydicom station1pdmasonTPS Test^Phantom30sep  tPhantom30sep 019691231@M  0.9.3 QHFS *1.2.826.0.1.3680043.8.498.2010020400001.1 ,1.2.826.0.1.3680043.8.498.2010020400001.1.1 sep30 1 1 0sep30 0sep30 0200912230 1225070 R*1.2.826.0.1.3680043.8.498.2010020400001.20P1.2.840.10008.3.1.2.3.1U,1.2.826.0.1.3680043.8.498.2010020400001.2.10 .1.2.826.0.1.3680043.8.498.2010020400001.2.1.1 0 0"1 0$*1.2.826.0.1.3680043.8.498.2010020400001.20&patient 0(patient 0,49200.0 06MANUAL 0"2 0$*1.2.826.0.1.3680043.8.498.2010020400001.20& Isocenter 1 0(Isocenter Beam 106MANUAL 0"3 0$*1.2.826.0.1.3680043.8.498.2010020400001.20& Isocenter 2 0(Isocenter Beam 206MANUAL 090* 220\160\120 0@0BCLOSED_PLANAR 0F5 0H1 0Pd-200.0\150.0\-200.0\-200.0\-150.0\-200.0\200.0\-150.0\-200.0\200.0\150.0\-200.0\-200.0\150.0\-200.0 0BCLOSED_PLANAR 0F6 0H2 0Pt200.0\-0.0\-190.0\200.0\-150.0\-190.0\-200.0\-150.0\-190.0\-200.0\150.0\-190.0\200.0\150.0\-190.0\200.0\-0.0\-190.0 0BCLOSED_PLANAR 0F6 0H3 0Pt200.0\-0.0\-180.0\200.0\-150.0\-180.0\-200.0\-150.0\-180.0\-200.0\150.0\-180.0\200.0\150.0\-180.0\200.0\-0.0\-180.0 01 0* 255\64\2550@0BPOINT 0F1 0H1 0P 0.0\-0.0\0.0 02 0* 255\64\2550@0BPOINT 0F1 0H1 0P 0.0\-0.0\0.0 03 001 01 0patient 0patient 0EXTERNAL000REL_ELEC_DENSITY01.000 02 02 0 Isocenter 1 0Isocenter Beam 10 ISOCENTER 0 03 03 0 Isocenter 2 0Isocenter Beam 20 ISOCENTER 0 pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/rtstruct.dump000066400000000000000000000173771515706620200253330ustar00rootroot00000000000000(0008, 0005) Specific Character Set CS: 'ISO_IR 100' (0008, 0012) Instance Creation Date DA: '20091223' (0008, 0013) Instance Creation Time TM: '123840' (0008, 0014) Instance Creator UID UI: 1.2.826.0.1.3680043.8.498 (0008, 0016) SOP Class UID UI: RT Structure Set Storage (0008, 0018) SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001 (0008, 0020) Study Date DA: '' (0008, 0030) Study Time TM: '' (0008, 0050) Accession Number SH: '1' (0008, 0060) Modality CS: 'RTSTRUCT' (0008, 0070) Manufacturer LO: 'pydicom' (0008, 0090) Referring Physician's Name PN: '' (0008, 1010) Station Name SH: 'station1' (0008, 1070) Operators' Name PN: 'dmason' (0008, 1090) Manufacturer's Model Name LO: 'TPS' (0010, 0010) Patient's Name PN: 'Test^Phantom30sep' (0010, 0020) Patient ID LO: 'tPhantom30sep' (0010, 0030) Patient's Birth Date DA: '19691231' (0010, 0040) Patient's Sex CS: 'M' (0018, 1020) Software Version(s) LO: '0.9.3' (0018, 5100) Patient Position CS: 'HFS' (0020, 000d) Study Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.1 (0020, 000e) Series Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.1.1 (0020, 0010) Study ID SH: 'sep30' (0020, 0011) Series Number IS: '1' (0020, 0013) Instance Number IS: '1' (3006, 0002) Structure Set Label SH: 'sep30' (3006, 0004) Structure Set Name LO: 'sep30' (3006, 0008) Structure Set Date DA: '20091223' (3006, 0009) Structure Set Time TM: '122507' (3006, 0010) Referenced Frame of Reference Sequence 1 item(s) ---- (0020, 0052) Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0012) RT Referenced Study Sequence 1 item(s) ---- (0008, 1150) Referenced SOP Class UID UI: Detached Study Management SOP Class (0008, 1155) Referenced SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2.1 (3006, 0014) RT Referenced Series Sequence 1 item(s) ---- (0020, 000e) Series Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2.1.1 --------- --------- --------- (3006, 0020) Structure Set ROI Sequence 3 item(s) ---- (3006, 0022) ROI Number IS: '1' (3006, 0024) Referenced Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0026) ROI Name LO: 'patient' (3006, 0028) ROI Description ST: 'patient' (3006, 002c) ROI Volume DS: '49200.0' (3006, 0036) ROI Generation Algorithm CS: 'MANUAL' --------- (3006, 0022) ROI Number IS: '2' (3006, 0024) Referenced Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0026) ROI Name LO: 'Isocenter 1' (3006, 0028) ROI Description ST: 'Isocenter Beam 1' (3006, 0036) ROI Generation Algorithm CS: 'MANUAL' --------- (3006, 0022) ROI Number IS: '3' (3006, 0024) Referenced Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0026) ROI Name LO: 'Isocenter 2' (3006, 0028) ROI Description ST: 'Isocenter Beam 2' (3006, 0036) ROI Generation Algorithm CS: 'MANUAL' --------- (3006, 0039) ROI Contour Sequence 3 item(s) ---- (3006, 002a) ROI Display Color IS: ['220', '160', '120'] (3006, 0040) Contour Sequence 3 item(s) ---- (3006, 0042) Contour Geometric Type CS: 'CLOSED_PLANAR' (3006, 0046) Number of Contour Points IS: '5' (3006, 0048) Contour Number IS: '1' (3006, 0050) Contour Data DS: ['-200.0', '150.0', '-200.0', '-200.0', '-150.0', '-200.0', '200.0', '-150.0', '-200.0', '200.0', '150.0', '-200.0', '-200.0', '150.0', '-200.0'] --------- (3006, 0042) Contour Geometric Type CS: 'CLOSED_PLANAR' (3006, 0046) Number of Contour Points IS: '6' (3006, 0048) Contour Number IS: '2' (3006, 0050) Contour Data DS: ['200.0', '-0.0', '-190.0', '200.0', '-150.0', '-190.0', '-200.0', '-150.0', '-190.0', '-200.0', '150.0', '-190.0', '200.0', '150.0', '-190.0', '200.0', '-0.0', '-190.0'] --------- (3006, 0042) Contour Geometric Type CS: 'CLOSED_PLANAR' (3006, 0046) Number of Contour Points IS: '6' (3006, 0048) Contour Number IS: '3' (3006, 0050) Contour Data DS: ['200.0', '-0.0', '-180.0', '200.0', '-150.0', '-180.0', '-200.0', '-150.0', '-180.0', '-200.0', '150.0', '-180.0', '200.0', '150.0', '-180.0', '200.0', '-0.0', '-180.0'] --------- (3006, 0084) Referenced ROI Number IS: '1' --------- (3006, 002a) ROI Display Color IS: ['255', '64', '255'] (3006, 0040) Contour Sequence 1 item(s) ---- (3006, 0042) Contour Geometric Type CS: 'POINT' (3006, 0046) Number of Contour Points IS: '1' (3006, 0048) Contour Number IS: '1' (3006, 0050) Contour Data DS: ['0.0', '-0.0', '0.0'] --------- (3006, 0084) Referenced ROI Number IS: '2' --------- (3006, 002a) ROI Display Color IS: ['255', '64', '255'] (3006, 0040) Contour Sequence 1 item(s) ---- (3006, 0042) Contour Geometric Type CS: 'POINT' (3006, 0046) Number of Contour Points IS: '1' (3006, 0048) Contour Number IS: '1' (3006, 0050) Contour Data DS: ['0.0', '-0.0', '0.0'] --------- (3006, 0084) Referenced ROI Number IS: '3' --------- (3006, 0080) RT ROI Observations Sequence 3 item(s) ---- (3006, 0082) Observation Number IS: '1' (3006, 0084) Referenced ROI Number IS: '1' (3006, 0085) ROI Observation Label SH: 'patient' (3006, 0088) ROI Observation Description ST: 'patient' (3006, 00a4) RT ROI Interpreted Type CS: 'EXTERNAL' (3006, 00a6) ROI Interpreter PN: '' (3006, 00b0) ROI Physical Properties Sequence 1 item(s) ---- (3006, 00b2) ROI Physical Property CS: 'REL_ELEC_DENSITY' (3006, 00b4) ROI Physical Property Value DS: '1.000' --------- --------- (3006, 0082) Observation Number IS: '2' (3006, 0084) Referenced ROI Number IS: '2' (3006, 0085) ROI Observation Label SH: 'Isocenter 1' (3006, 0088) ROI Observation Description ST: 'Isocenter Beam 1' (3006, 00a4) RT ROI Interpreted Type CS: 'ISOCENTER' (3006, 00a6) ROI Interpreter PN: '' --------- (3006, 0082) Observation Number IS: '3' (3006, 0084) Referenced ROI Number IS: '3' (3006, 0085) ROI Observation Label SH: 'Isocenter 2' (3006, 0088) ROI Observation Description ST: 'Isocenter Beam 2' (3006, 00a4) RT ROI Interpreted Type CS: 'ISOCENTER' (3006, 00a6) ROI Interpreter PN: '' ---------pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/test-SR.dcm000066400000000000000000000152141515706620200245240ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.88.33UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.4UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.4.2SHOFFIS_DCMTK_342 CS ISO_IR 100DA20010213TM184746UI1.2.276.0.7230010.3.0.3.4.2UI1.2.840.10008.5.1.4.1.1.88.33UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.4 DA#DA200102130TM3TM184746PSH`CSSRpLOPN0LO(OFFIS Structured Reporting Test Document>LODemonstration of SR FeaturesSQPNTest^S R LO0DA@CS UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.2 UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.3 SH IS1 IS1 @2DT20010213184746@@CS CONTAINER @CSQ2*SH1111SHTESTLO Diagnosis @PCSSEPARATE@sSQ@'LO OFFIS e.V.@0DT20010213184746@uPNRiesmeier^Jrg@SQVNSH1705SH99_OFFIS_DCMTKLOJR UI1.2.276.0.7230010.3.0.0.1P@'LO Organisation@0DT20010213184746@uPNObserver^Verifying@SQ@`SQ SQSQjbPUI1.2.840.10008.5.1.4.1.1.88.33UUI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.1 UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.3 UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.2@rSQ@CSCOMPLETE@LOThis document is completed! @CSVERIFIED@0SQ@CSHAS OBS CONTEXT @@CSUIDREF@CSQ^VSH1234.0SH99_OFFIS_DCMTKLOSome UID UI1.2.276.0.7230010.3.0.0.1@$UI 1.2.3.4.5V@CSCONTAINS@@CS CONTAINER @PCS CONTINUOUS@0SQ@CSCONTAINS@@CSTEXT@CSQ^VSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`UT A mass of @0SQ@CSHAS CONCEPT MOD @@CSCODE@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@hSQbZSH2222SH99_OFFIS_DCMTKLOSample Code 1  UI1.2.276.0.7230010.3.0.0.1@CSHAS CONCEPT MOD @@CSCODE@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@hSQbZSH2222SH99_OFFIS_DCMTKLOSample Code 2  UI1.2.276.0.7230010.3.0.0.1@CSCONTAINS@@CSNUM @CSQ\TSH1234SH99_OFFIS_DCMTKLODiameter UI1.2.276.0.7230010.3.0.0.1@SQ|t@SQ^VSHcmSH99_OFFIS_DCMTKLO Length Unit  UI1.2.276.0.7230010.3.0.0.1@ DS3 @0SQ@CSHAS CONCEPT MOD @@CSCODE@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@hSQ`XSH2222SH99_OFFIS_DCMTKLO Sample Code  UI1.2.276.0.7230010.3.0.0.1@CSCONTAINS@@CSTEXT@CSQ^VSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`UTwas detected. @CSCONTAINS@@CS CONTAINER @PCSSEPARATE@0SQ`@CSCONTAINS@@CSTEXT@CSQ^VSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`UT A mass of @CSCONTAINS@@CSNUM @CSQ\TSH1234SH99_OFFIS_DCMTKLODiameter UI1.2.276.0.7230010.3.0.0.1@SQ|t@SQ^VSHcmSH99_OFFIS_DCMTKLO Length Unit  UI1.2.276.0.7230010.3.0.0.1@ DS3 @CSCONTAINS@@CSTEXT@CSQ^VSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`UTwas detected. 2@CSCONTAINS@@CSTEXT@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@`UTSample Text A B C @0SQ@CSINFERRED FROM @@CSTEXT@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@`UT.Inferred Sample Text New line. &%$"!()<>{}/;@CSHAS PROPERTIES@@CSSCOORD@CSQ`XSH1234SH99_OFFIS_DCMTKLO SCoord Code  UI1.2.276.0.7230010.3.0.0.1p"FLCCp#CSCIRCLE@CSHAS PROPERTIES@@CSTCOORD@CSQ`XSH1234SH99_OFFIS_DCMTKLO TCoord Code  UI1.2.276.0.7230010.3.0.0.1@0CSSEGMENT @8DS1.000000\2.500000 @0SQ2*@CSSELECTED FROM @sUL jSQ>6PUI1.2.840.10008.5.1.4.1.1.88.11UUI9.8.7.6@CSCONTAINS@@CS COMPOSITE @0SQ@CSHAS ACQ CONTEXT @@CSDATE@CSQZRSH1234.1SH99_OFFIS_DCMTKLODate UI1.2.276.0.7230010.3.0.0.1@!DA20001206@CSHAS ACQ CONTEXT @@CSTIME@CSQZRSH1234.2SH99_OFFIS_DCMTKLOTime UI1.2.276.0.7230010.3.0.0.1@"TM120000@CSHAS ACQ CONTEXT @@CSDATETIME@CSQ^VSH1234.3SH99_OFFIS_DCMTKLODateTime UI1.2.276.0.7230010.3.0.0.1@ DT20001206120000bSQPUI1.2.840.10008.5.1.4.1.1.2UUI 1.2.3.4.5.0`IS5\2 SQ@8PUI1.2.840.10008.5.1.4.1.1.11.1UUI 1.2.3.5.6.7@CSCONTAINS@2DT20010213184746@@CSIMAGE @0SQB@CSHAS CONCEPT MOD @@CSCODE@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@hSQbZSH2222SH99_OFFIS_DCMTKLOSample Code 3  UI1.2.276.0.7230010.3.0.0.1@0SQ@8@CSHAS CONCEPT MOD @@CSCODE@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@hSQbZSH2222SH99_OFFIS_DCMTKLOSample Code 2  UI1.2.276.0.7230010.3.0.0.1@0SQ6.@CSINFERRED FROM @sUL.@CSHAS CONCEPT MOD @2DT20010213184746@@CSTEXT@CSQXPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@`UTSample Text 2 @0SQjSQ>6PUI1.2.840.10008.5.1.4.1.1.4UUI 1.2.3.4.0.1@CSHAS PROPERTIES@@CSIMAGE @CSQ^VSH1234SH99_OFFIS_DCMTKLO Key Image  UI1.2.276.0.7230010.3.0.0.1SQPHPUI1.2.840.10008.5.1.4.1.1.9.2.1UUI 1.2.3.4.5@US@CSHAS PROPERTIES@@CSWAVEFORMpydicom-pydicom-20aa4b7/src/pydicom/data/test_files/test1.json000066400000000000000000000507451515706620200245010ustar00rootroot00000000000000{ "00080016": { "vr": "UI", "Value": [ "1.2.840.10008.5.1.4.1.1.4" ] }, "00081010": { "vr": "SH", "Value": [ "L1BAY3_GE3T" ] }, "00402017": { "vr": "LO", "Value": [ "" ] }, "00201002": { "vr": "IS", "Value": [ 714 ] }, "00250010": { "vr": "LO", "Value": [ "GEMS_SERS_01" ] }, "00080090": { "vr": "PN", "Value": [ { "Alphabetic": "" } ] }, "00190010": { "vr": "LO", "Value": [ "GEMS_ACQU_01" ] }, "00430010": { "vr": "LO", "Value": [ "GEMS_PARM_01" ] }, "09030010": { "vr": "LO", "Value": [ "GEIIS PACS" ] }, "00080018": { "vr": "UI", "Value": [ "1.3.6.1.4.1.5962.99.1.1516012269.2092621929.1509049565933.2991.0" ] }, "00080022": { "vr": "DA", "Value": [ "20141210" ] }, "00080023": { "vr": "DA", "Value": [ "20141210" ] }, "00080020": { "vr": "DA", "Value": [ "20141210" ] }, "00080021": { "vr": "DA", "Value": [ "20141210" ] }, "00101030": { "vr": "DS", "Value": [ 87.09 ] }, "00181088": { "vr": "IS", "Value": [ 0 ] }, "00120064": { "vr": "SQ", "Value": [ { "00080100": { "vr": "SH", "Value": [ "113100" ] }, "00080102": { "vr": "SH", "Value": [ "DCM" ] }, "00080104": { "vr": "LO", "Value": [ "Basic Application Confidentiality Profile" ] } }, {}, { "00080100": { "vr": "SH", "Value": [ "210005" ] }, "00080102": { "vr": "SH", "Value": [ "99PMP" ] }, "00080104": { "vr": "LO", "Value": [ "Retain all descriptors unchanged" ] } }, { "00080100": { "vr": "SH", "Value": [ "113108" ] }, "00080102": { "vr": "SH", "Value": [ "DCM" ] }, "00080104": { "vr": "LO", "Value": [ "Retain Patient Characteristics Option" ] } }, { "00080100": { "vr": "SH", "Value": [ "113109" ] }, "00080102": { "vr": "SH", "Value": [ "DCM" ] }, "00080104": { "vr": "LO", "Value": [ "Retain Device Identity Option" ] } }, { "00080100": { "vr": "SH", "Value": [ "210006" ] }, "00080102": { "vr": "SH", "Value": [ "99PMP" ] }, "00080104": { "vr": "LO", "Value": [ "Retain institution identity" ] } }, { "00080100": { "vr": "SH", "Value": [ "113106" ] }, "00080102": { "vr": "SH", "Value": [ "DCM" ] }, "00080104": { "vr": "LO", "Value": [ "Retain Longitudinal Temporal Information Full Dates Option" ] } }, { "00080100": { "vr": "SH", "Value": [ "113111" ] }, "00080102": { "vr": "SH", "Value": [ "DCM" ] }, "00080104": { "vr": "LO", "Value": [ "Retain Safe Private Option" ] } }, { "00080100": { "vr": "SH", "Value": [ "210001" ] }, "00080102": { "vr": "SH", "Value": [ "99PMP" ] }, "00080104": { "vr": "LO", "Value": [ "Remap UIDs" ] } } ] }, "00120063": { "vr": "LO", "Value": [ "Deidentified", "Descriptors retained", "Patient Characteristics retained", "Device identity retained", "Institution identity retained", "Dates retained", "Unsafe private removed", "UIDs remapped" ] }, "00120062": { "vr": "CS", "Value": [ "YES" ] }, "00100030": { "vr": "DA", "Value": [ "" ] }, "09031012": { "vr": "US", "Value": [ 0 ] }, "09031010": { "vr": "US", "Value": [ 0 ] }, "09031011": { "vr": "US", "Value": [ 0 ] }, "0019109E": { "vr": "LO", "Value": [ "EPI2" ] }, "00181000": { "vr": "LO", "Value": [ "00Brigham750wMR1" ] }, "00081090": { "vr": "LO", "Value": [ "DISCOVERY MR750w" ] }, "00081032": { "vr": "SQ", "Value": [ { "00080100": { "vr": "SH", "Value": [ "M2197" ] }, "00080103": { "vr": "SH", "Value": [ "0" ] }, "00080102": { "vr": "SH", "Value": [ "GEIIS" ] }, "00080104": { "vr": "LO", "Value": [ "BWH MR PELVIS WWO CONTRAST M2197" ] } } ] }, "00081030": { "vr": "LO", "Value": [ "M2197/PRO/BD Pelvis w" ] }, "00181310": { "vr": "US", "Value": [ 128, 0, 0, 32, null ] }, "00100020": { "vr": "LO", "Value": [ "NOID" ] }, "00181312": { "vr": "CS", "Value": [ "COL" ] }, "00181090": { "vr": "IS", "Value": [ 0 ] }, "00181314": { "vr": "DS", "Value": [ 90.0 ] }, "00181315": { "vr": "CS", "Value": [ "N" ] }, "00181316": { "vr": "DS", "Value": [ 0.603909 ] }, "00181094": { "vr": "IS", "Value": [ 0 ] }, "00200052": { "vr": "UI", "Value": [ "1.3.6.1.4.1.5962.99.1.1516012269.2092621929.1509049565933.1722.0" ] }, "00400242": { "vr": "SH", "Value": [ "L1BAY3_GE3T" ] }, "00181250": { "vr": "SH", "Value": [ "EIS_eCoil only" ] }, "00400244": { "vr": "DA", "Value": [ "20141210" ] }, "00400245": { "vr": "TM", "Value": [ "125903" ] }, "00281050": { "vr": "DS", "Value": [ 5888.0 ] }, "00281051": { "vr": "DS", "Value": [ 11776.0 ] }, "00185100": { "vr": "CS", "Value": [ "FFS" ] }, "00400254": { "vr": "LO", "Value": [ "M2197/MR3 Pelvis w" ] }, "00180091": { "vr": "IS", "Value": [ 1 ] }, "00180093": { "vr": "DS", "Value": [ 100.0 ] }, "00180094": { "vr": "DS", "Value": [ 100.0 ] }, "00180095": { "vr": "DS", "Value": [ 1304.69 ] }, "00181020": { "vr": "LO", "Value": [ "24", "LX", "MR Software release:DV24.0_R01_1344.a" ] }, "00080031": { "vr": "TM", "Value": [ "134344" ] }, "00080030": { "vr": "TM", "Value": [ "130727" ] }, "00080033": { "vr": "TM", "Value": [ "134345" ] }, "0008103E": { "vr": "LO", "Value": [ "Opt2 Ax Diff Nb8 Bmax=500" ] }, "0043106F": { "vr": "DS", "Value": [ 0.0, 0.0, 0.0, 0.0 ] }, "00201041": { "vr": "DS", "Value": [ -91.90546417 ] }, "00201040": { "vr": "LO", "Value": [ "" ] }, "00200037": { "vr": "DS", "Value": [ 1.0, -0.0, 0.0, -0.0, 0.982071, 0.188509 ] }, "00280011": { "vr": "US", "Value": [ 256 ] }, "00100040": { "vr": "CS", "Value": [ "M" ] }, "00280107": { "vr": "SS", "Value": [ 11776 ] }, "00280106": { "vr": "SS", "Value": [ 0 ] }, "0020000D": { "vr": "UI", "Value": [ "1.3.6.1.4.1.5962.99.1.1516012269.2092621929.1509049565933.1720.0" ] }, "0020000E": { "vr": "UI", "Value": [ "1.3.6.1.4.1.5962.99.1.1516012269.2092621929.1509049565933.2967.0" ] }, "00280103": { "vr": "US", "Value": [ 1 ] }, "00280102": { "vr": "US", "Value": [ 15 ] }, "00280101": { "vr": "US", "Value": [ 16 ] }, "00280100": { "vr": "US", "Value": [ 16 ] }, "00181030": { "vr": "LO", "Value": [ "Prostate With e-coil C-/" ] }, "00180088": { "vr": "DS", "Value": [ 4.0 ] }, "00180083": { "vr": "DS", "Value": [ 1.0 ] }, "00200032": { "vr": "DS", "Value": [ -129.995, -56.8856, -108.805 ] }, "00180081": { "vr": "DS", "Value": [ 67.0 ] }, "00180080": { "vr": "DS", "Value": [ 3500.0 ] }, "00180087": { "vr": "DS", "Value": [ 3.0 ] }, "00180086": { "vr": "IS", "Value": [ 1 ] }, "00180085": { "vr": "SH", "Value": [ "1H" ] }, "00180084": { "vr": "DS", "Value": [ 127.767001 ] }, "00100010": { "vr": "PN", "Value": [ { "Alphabetic": "Prostate^Volunteer" } ] }, "7FE00010": { "vr": "OW", "BulkDataURI": "" }, "04000561": { "vr": "SQ", "Value": [ { "04000565": { "vr": "CS", "Value": [ "COERCE" ] }, "04000550": { "vr": "SQ", "Value": [ { "00100010": { "vr": "PN", "Value": [ { "Alphabetic": "" } ] }, "00100020": { "vr": "LO", "Value": [ "" ] }, "00101010": { "vr": "AS", "Value": [ "051Y" ] }, "00100030": { "vr": "DA", "Value": [ "" ] }, "00100040": { "vr": "CS", "Value": [ "M" ] } } ] }, "04000564": { "vr": "LO", "Value": [ "Transfer Framework" ] }, "04000563": { "vr": "LO", "Value": [ "Siemens Healthcare syngo Transfer Framework" ] }, "04000562": { "vr": "DT", "Value": [ "20141222104657.146916" ] } } ] }, "00209056": { "vr": "SH", "Value": [ "1" ] }, "00280030": { "vr": "DS", "Value": [ 0.7031, 0.7031 ] }, "0018A001": { "vr": "SQ", "Value": [ { "00081010": { "vr": "SH", "Value": [ "CORE_11112" ] }, "00181020": { "vr": "LO", "Value": [ "Wed May 24 09:06:52 EDT 2017" ] }, "00081090": { "vr": "LO", "Value": [ "DicomCleaner" ] }, "00080070": { "vr": "LO", "Value": [ "PixelMed" ] }, "0018A002": { "vr": "DT", "Value": [ "20171026182546.399-0400" ] }, "0018A003": { "vr": "ST", "Value": [ "Cleaned" ] }, "0040A170": { "vr": "SQ", "Value": [ { "00080100": { "vr": "SH", "Value": [ "109104" ] }, "00080102": { "vr": "SH", "Value": [ "DCM" ] }, "00080104": { "vr": "LO", "Value": [ "De-identifying Equipment" ] } } ] } } ] }, "00080050": { "vr": "SH", "Value": [ "1" ] }, "00180021": { "vr": "CS", "Value": [ "NONE" ] }, "00180020": { "vr": "CS", "Value": [ "EP", "RM" ] }, "00180023": { "vr": "CS", "Value": [ "2D" ] }, "00180022": { "vr": "CS", "Value": [ "EDR_GEMS", "EPI_GEMS" ] }, "00180025": { "vr": "CS", "Value": [ "N" ] }, "00209057": { "vr": "UL", "Value": [ 13 ] }, "00200011": { "vr": "IS", "Value": [ 10 ] }, "00200010": { "vr": "SH", "Value": [ "" ] }, "00280004": { "vr": "CS", "Value": [ "MONOCHROME2" ] }, "00200012": { "vr": "IS", "Value": [ 1 ] }, "00280002": { "vr": "US", "Value": [ 1 ] }, "00080060": { "vr": "CS", "Value": [ "MR" ] }, "00081111": { "vr": "SQ", "Value": [ { "00081150": { "vr": "UI", "Value": [ "1.2.840.10008.3.1.2.3.3" ] }, "00081155": { "vr": "UI", "Value": [ "1.3.6.1.4.1.5962.99.1.1516012269.2092621929.1509049565933.1718.0" ] } } ] }, "00080008": { "vr": "CS", "Value": [ "ORIGINAL", "PRIMARY", "OTHER" ] }, "00180050": { "vr": "DS", "Value": [ 4.0 ] }, "00200013": { "vr": "IS", "Value": [ 151 ] }, "00101010": { "vr": "AS", "Value": [ "051Y" ] }, "00251007": { "vr": "SL", "Value": [ 714 ] }, "00080080": { "vr": "LO", "Value": [ "Brigham and Womens Hospital" ] }, "00280010": { "vr": "US", "Value": [ 256 ] }, "00181100": { "vr": "DS", "Value": [ 180.0 ] }, "00080032": { "vr": "TM", "Value": [ "134345" ] }, "00200060": { "vr": "CS", "Value": [ "" ] }, "00080070": { "vr": "LO", "Value": [ "GE MEDICAL SYSTEMS" ] } } pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/test_PN.json000066400000000000000000000034611515706620200250060ustar00rootroot00000000000000{ "00080090": { "vr": "PN", "Value": [ { "Alphabetic": "" } ] }, "00100010": { "vr": "PN", "Value": [ { "Alphabetic": "Prostate^Volunteer" } ] }, "04000561": { "vr": "SQ", "Value": [ { "04000550": { "vr": "SQ", "Value": [ { "00100010": { "vr": "PN", "Value": [ { "Alphabetic": "" } ] }, "00100020": { "vr": "LO", "Value": [ "" ] }, "00101010": { "vr": "AS", "Value": [ "051Y" ] }, "00100030": { "vr": "DA", "Value": [ "" ] }, "00100040": { "vr": "CS", "Value": [ "M" ] } } ] } } ] } } pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/waveform_ecg.dcm000066400000000000000000010704201515706620200256700ustar00rootroot00000000000000DICMULOBUI1.2.840.10008.5.1.4.1.1.9.1.1UI,1.3.6.1.4.1.20029.40.20130125105919.5407.1.1UI1.2.840.10008.1.2.1UI1.3.76.13.1.1.1.1SH AISDWAM40 CS ISO_IR 100DA20130125TM095427UI1.2.840.10008.5.1.4.1.1.9.1.1UI,1.3.6.1.4.1.20029.40.20130125105919.5407.1.1 DA20130125#DA20130125*DT201301251059190TM1059193TM105919PSH03028041970546`CSECG pLOMortara Instrument, Inc.LOE. O. Ospedali Galliera PN2721SH1,0 0LOECG `PNpPNLOel250 PN Anonymous  LO6423410DA19710123@CSF LOAS042Y DS0DS@LOLO LO0.0.0 UI*1.3.76.13.65829.2.20130125082826.1072139.2 UI*1.3.6.1.4.1.20029.40.20130125105919.5407.1 SH1 IS IS1 `CS20LO22PN27218LO130026898LO528LO8@LT@USQ@@CSCODE@CSQSH 5.4.5-33-1SHSCPECGSH1.3 LOElectrode Placement @hSQSH 5.4.5-33-1-1SHSCPECGSH1.3 LO<Standard 12-lead positions: limb leads placed at extremities @LO@ SQ@US@USpSTRITMO SINUSALE @US@USpST ECG NORMALE @SQSHmsSHUCUMSH1.4 LO milliseconds @CSQSH 5.10.2.1-3SHSCPECGSH1.3 LO RR Interval @US@US@ DS982 @SQSHmsSHUCUMSH1.4 LO milliseconds @CSQSH 5.10.2.1-5SHSCPECGSH1.3 LO PP Interval @US@US@ DS0 @SQSHmsSHUCUMSH1.4 LO milliseconds @CSQSH5.13.5-7SHSCPECGSH1.3 LO PR Interval @US@US@ DS161 @SQSHmsSHUCUMSH1.4 LO milliseconds @CSQSH5.13.5-9SHSCPECGSH1.3 LO QRS Duration @US@US@ DS75 @SQSHmsSHUCUMSH1.4 LO milliseconds @CSQSH 5.13.5-11 SHSCPECGSH1.3 LO QT Interval @US@US@ DS368 @SQSHmsSHUCUMSH1.4 LO milliseconds @CSQSH 5.10.2.5-5SHSCPECGSH1.3 LO QTc Interval @US@US@ DS370 @SQSHdeg SHUCUMSH1.4 LOdegrees @CSQSH 5.10.3-11 SHSCPECGSH1.3 LOP Axis @US@US@ DS74 @SQSHdeg SHUCUMSH1.4 LOdegrees @CSQSH 5.10.3-13 SHSCPECGSH1.3 LOQRS Axis @US@US@ DS52 @SQSHdeg SHUCUMSH1.4 LOdegrees @CSQSH 5.10.3-15 SHSCPECGSH1.3 LOT Axis @US@US@ DS57 @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL+@US @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL@US @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL@US @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL@US @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL@US @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL<@US @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2ULE@USd @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL@USd @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL@USd @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL@USd @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL1@USd @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2ULV@USd @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL,@USe @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL@USe @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL@USe @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL@USe @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL@USe @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL=@USe @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL @USf @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2ULs @USf @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL @USf @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL @USf @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL @USf @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL @USf @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL @USg @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2ULI @USg @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2ULx @USg @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL @USg @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL @USg @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL@USg @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL@USh @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL-@USh @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL\@USh @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL@USh @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL@USh @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL@USh @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL@USi @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL@USi @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL3@USi @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL\@USi @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL~@USi @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL@USi @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL`@USj @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL@USj @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL@USj @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL*@USj @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2ULL@USj @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2ULq@USj @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2ULJ@USk @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL@USk @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL@USk @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL@USk @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL6@USk @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL[@USk @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL @USl @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2UL @USl @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2UL @USl @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL @USl @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL!@USl @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL("@USl @CSQSH5.10.3-1SHSCPECGSH1.3 LOP Onset @US@0CSPOINT @2UL#@USm @CSQSH5.10.3-2SHSCPECGSH1.3 LOP Offset @US@0CSPOINT @2ULB$@USm @CSQSH5.10.3-3SHSCPECGSH1.3 LO QRS Onset @US@0CSPOINT @2ULq$@USm @CSQSH5.7.1-3 SHSCPECGSH1.3 LOFiducial Point @US@0CSPOINT @2UL$@USm @CSQSH5.10.3-4SHSCPECGSH1.3 LO QRS Offset @US@0CSPOINT @2UL$@USm @CSQSH5.10.3-5SHSCPECGSH1.3 LOT Offset @US@0CSPOINT @2UL%@USm ULOMortara Instrument, Inc.UOW8:UOB YLILast:cFirst:cID:cDOB:c Age:cSex:cULOULOULOULOULOULOU OBC el250U OBU OB@U OBU USUOBUDSTSQhDS0 iDS0 :CSORIGINAL:US :UL':DS1000: SHRHYTHM:SQ:SQSH 5.6.3-9-1 SHSCPECGSH1.3 LOLead I (Einthoven) :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-2 SHSCPECGSH1.3 LOLead II :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-61SHSCPECGSH1.3 LOLead III :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-62SHSCPECGSH1.3 LOLead aVR :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-63SHSCPECGSH1.3 LOLead aVL :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-64SHSCPECGSH1.3 LOLead aVF :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-3 SHSCPECGSH1.3 LOLead V1 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-4 SHSCPECGSH1.3 LOLead V2 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-5 SHSCPECGSH1.3 LOLead V3 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-6 SHSCPECGSH1.3 LOLead V4 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-7 SHSCPECGSH1.3 LOLead V5 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-8 SHSCPECGSH1.3 LOLead V6 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 TUSTCSSSTOWPZ #2(AU4(2P 7(#K(9(%M(:#(P(<(P(<(P(< (K#7#(F2((F2-(F22-D -22A(20C+-#-F /((/F .#2F-0F .#-F /(+F0-(F22!D#32A(42?&22<#/2 <#/7<#/<%D1<2K 2<?I )7#<K-2(0F .2#<*2#?-7<#/<7)<#7%<:,7<-2&A.2(< (2(9 %2-A *2(A-2<#/2<(2-A-729*2-<%<(/A)7#7< 2(9<2#2< #2(09 !7-2A(<29M0<(2K 2<((A-7#(7 #2#5#7-<#- 7#(2-4777<&<)7#<*2-7  7#7%<7)72#*2%4 !22#2(+2#(2#+ 2((22#2-#2*22%25##22(2+-2#- 2# 2# 2##7##<2% 7-(2&(2( 2(7 (#<# 7# 2# 2#2-2-(2##-#((( (( (* (((#&#2(-# -# 2$2(2$</2##7#%(#((((# (# ( (( ( ( (# (# # ( !## 7((9/-7-22(#(( (--#(!#(  - #2 -#( *(2#((((( - 2 7#2! -#(  -(   ( 4)#- ( #((%##%##( # #-%( &22%2&2#22 222--*( %!-(2(2#2-#( (( -#( #-# 2-$<#7*<!7 < <#<<<72-(((%( # #  #( (-#(#-(2-(% (-%( /%(2*( #(#2#7 2 7<72 227 <!72 < 22 2  2 2 -2  #  ( #( #( ! #  #  -"( 2# &( ( (((#  (%- ( # (  ( (  ##    #  ( ( # ( # #(  - (((((( ( (  #   ( #( # #( ( - (2(  # ( ( #    #  - ( 2 (  #   #( 7- <.# 7* !   ( (# ! ( ( (##( / #2# /"7-# # (     ###( !( #( #- -#(2#>,-F2<2K7A2U<H2_AP-#dAR( *g=R# (d<P( *nDY(-i<R( *pF[#-xKa( 0xH`( #nK\(#vSd(#sPa(*uK`((sK_(+sH]-(sK_(#sPa##xUf%bt(i}(s (x/{-4{An KgFi?p 7s:k-x/}72- 42} +#}*n <_} CZ{ PKs ?Ml-sF\7s<W7xA\ <z>\7KfAHh<Ki FFi FAd S4] P7 _K<aP7 _M{.TKs(M Nd=FZ7 AU4-K4/P!82P 7+M"7K-< %D1##<*(-2(#- (%*###( ## (#  (  (( #$(#%(&&( (#%((-(2 (#(((-2  22 2 #%2#%7 (-<727 < 22- ~<2  <-2  22~22 2#(2~ 227<< < 7222A #F#FF P FF  P P PZ d d(n2sFZU Z~&}P#7KAZP_X[}Zixd2-dzidK(nZnZ0\tPin<PnFnx<U0Z7nU2}w2WnZXRVi}8ddZ"& S2TE"<U"Lf@tx^r(Ld&8A+v,M'V XVab= lN0#sj48Rqk\a fa9fN`p{p!>6]i:ZCHjN fYGZ_l2&|V/hiq:Z)DJ}llx8AJ{jl*L?@!_v*L0R"?:_o b|DlV>N)&C05\zXzwMlOW\@$G&"F8@6<[iwJ}9$~{pg([}ZP dZs9VC[#d(PpLZLGU#C (LUG-eK<<~D6(F.K<(<BD*/-KVF-/ 2PtU->-ZZ(F(ZP#>2_U#C2PNB2ZF<2ZU#CAPd(PFPW(CAZ_-H<ZS&@<UK#9<PW2><Kd7HFFK03 KF<#*PF-#PK- (PF- (PK( #PF KFFF!FAF<%F<2%F<(F<#Z<-ZA7*Z27-Z-7-Z29/_<7-d<5(_<-Z<2%ZF-#Z<!Z7 Z2#_7 d<#_K-%ZF7,ZA<-Z<>0_AA2dF(-$_A((Z<(* %ZK(( ZF(*"_F(-%dF((dA(-d<(0"d7(#d2(d7#(Z</!d<(Z<(/"d7#2%Z2:.Z2#-#Z2(Z2(d2(%ZA2-# d<25'Z7-7*Z2(0 )iA-# d<2dF2# d<2ZF-P<(#P72- P<(<*' PF<F(2PF<:(& PAA2# P<<(&UAF# ZFP-# KAK<-P<F:,PAK2%P<F4#" PAAF#4PF<? /PAF7(P<P7(PAP7#%P<Z0!KKU( FPP/# KPP2%FPP<.FPPK>FFP0"FFZ-(F<Z>2%A<Z<-%<<ZI01 A<d<(( F<d:*% F<d7(# F<d<-F<dA#/F<d2!!FAs-# FFx9#'FAs<-F<n ?#-FFx<#*F<x 5!$AFx2# <<x>#,AA2(FF92 FKA7%FF 9>!FF F<(FF DA#KK <A#PP 2A(KP((< (FP( <:AK# UA4<F \H8AF(ZF7<F( SF0FP-PF-<P2SN,$FP<FF##<P< ??<P7<7 <P2KA*<UAFF##FZF(DI'FdP(7F*<ZP(KK%%7UK-_F<2PF2_K97UU2ZK4<dZ(]Z0+Add7Z_*2Fdd<_b.2Fd_<_Z2*Fdd<U]&2FdiF(PZ #2FnxP(\X0*FsxK#UU**FxF(dd22AsU-_d-4<x"Z2Zb)5<}'d7Z_*2<x"d2Sg=2s,_2Ud#92x6d2_i *92x6iAdn -<2x@xFz 8G2xOxPx4K2^Pv1O7^Pn-K<hZs+U7}mZn*P2rZk&T2rds-R2|nv~.T(n}y4R(nq;T(xhAW(xh9_(h9_j4a##m/d#m/d#h2f"_@a"YH_,OIg#6ERi@(G>zJ7;9^"A83 c6<87h6E61m@F.4rJL.0!OA'<&T:#C !^7"F &h F> 0rK< 0|F F:"KF:'PCD'U>D",UAS''PCX6*QDX11PHX66DWS6;KRX@EUM]JJ_FbJO_HbYOdCb^YkAg^Yn>lh[dIbcciHbhkv?b&mcdMb&hm]YX!mwZaX&r wnMg+|m}9b:y1g0w4b0r2l0r2l0|{Cg+! xHb0&>b5&9X:&=X0+w4N00r}<D05r7:&0t;x:+0r7000w}>s++&|7n&&&u:d!m4nf3d|^}2d|hx<d |cx9d|\q=UhTn<P^Tu5PYJs2FTJz+FJE PJ>K@6 P@/v !U,'n%P,l"P|"d(Pr_*K^|mi" <Tr^d+AOcYd3FJhTd6F@O@Z8 F6J6Z8 <"@,U;#26"UL-KT(KY-}F`2qOh(iPo 2iMq(iKr(f=|p(i7|k(k2|g#n2yii( \#xi##W(nd*\(iU7a(nH}5 Y #_Px(PZMx+QZPs#KxPF_<nK<Z<dP7R6sxdF<Z<xxZF:S6nnZAAP/nnZ<<I +d_P2<F (dZP24F,dUA22A(dP<249#ZKA(7< (ZP<(4<"#ZA7#7< P<2HA'PA7KF( (PF<(MK'$#PF2#KP#*P<2?A!P<-77F<(52A-#22<2 #2 #<(#2 (<( -2# -#2- 2 7/-7# A2((2 9-"(2<-%(2 >/&#- A-* (( 7*"((# 2-((( :(& ###<(( A&.(#<(( 2( 2*2#(##2(*%2(((2(-&2(#2--2##((2(( *#-((#2((-# (#(#( /# ( A(-( <%)(2(( 0! - 2(2 +2 - 2 /!-2# ( 4%! (7(# (  5(! - -(2 /-2 --2  +(- ( (  %- (2 2%2A#/2 D#2-F#4(5&(-( +  - -# 2  +- -# ( -%- 2(2 (## 7#%( 2#-7(22$- 7((2 "( 7#%(2#-<-2-2 2#2 5)7- < (<# (< -#7#2 & 2(2  2 2 2(2/!2#A#/20!7(< %7#2 (<2%2 &2(2(2 - 2!7< # <#<*  F7(# F9-"<#A-* <( -&F#((<2#7- <9+<#A2<((7##2( <(# F((/!F(#7(<(2& A(-( <((2#F#(7(F( (P- 2%F2 -U2 2%P2 < ,P2 <#*P2 > .F- A#/F2 :(& K7 <(( P2 2& P7-# P<2& P72(P2 2# P2 -P2 (P2 ( P2 /% P#< 2# F2 9!(P2 </P2 ?2P2 7-P2 4'P2 2(P2 (P2#P2 %U2-Z2- U#2 - P(25,P(-7/P((2 -P--2 -P2(4+P-27-P((A 1P#(A2P(5##P(2# P(-P(-P( *  P((#P((P(- P(( P(2#P(0&P##2 -F(2.K(-*F(( #A#-%<# A#(%F73P-*P2.P7/P0'Z( Z( K2*F <2P7-P4 /A2 -F 2*F7/<0 +A-*<-*A(%F-*A(%<++<##< %%< ##< *+<(*< %&< ((< -*A-%F+ %F#F&F#( #F(( "K#( P(2*K#( F%72*<2)<(2*<5+A- <73F< 7<7.F#F FF--K((P()P-/F++PP U # P+ &P# F&#FF#%F##(F((%K#((F-/K-/F#$K# F((AF&#FF&&F##F%$F- (<0(A2 -<+ $A#- (<( #<2 -<#A## <(!<<(('<(##2(#)-(#2(((2##2!!7<% 7- (20,7742 52( ( - 2-,2 2/2-)2 -%22 ,--#<2(<7/</ )-#- (20 )2( (*&7-( #<(!-#2 -((2&%2##<##2<#$22 2 < <(2- &2( #2# -  2 !7 < # - ( #29+7 7*2 </72(<#2 2#-##2($2##2**7742((2#%2&%-<2 2 22##22 #!2 # < *!27(2-!A-#F -%A7/F! A( <+ &A-%F* %F7/F-$<2(<0,<--<2<-(2# ( 2-#2(! -(# 2(-# -7(# (+# (-# (2#(2%2( --*2( "2( #2( #--%((7#2! 7# 2%!7( 2 2(-2(( (-< - 2  2 27# <4*-<22/$-2%2(-#7(2&7#-#2(&<#<* %2# 2( #2#<#2(<* A2(< -$2(2&2 (2#(# 2 # 22#2#2-%2 ( 2 # 7-# 2 % -(#2!2#(- 2#-2%2 2'( -2 0 )(2 -(( #--#< -$7#22#2 %(2(22&--#<(-- ( (( #2 -#( 2%2 *2 (2 &2( #2 #-#2&-# 2 % 2( 2&%2##2 !- (- ( 22 7-#2&7-#2/'72*< 5'72# 2-(2--2#7%22< #( A!1(#F#4( &F 3( #F#4(#D!2-(F2(H*9(U<H(*_5J(7n7R(2l:S-7n7R(2g5N-2n<U2#dAR2ZFP2WFN7#Z7H<-\/E72d2K<9n5Q<<}A_2 AFf-FKnFUxKZ Kf(Pd~S\(ZU|(I_(7i4i(A_5n((s(4gAZz(Ff(Pny2Di7s0w#-s<fAdA_#<d<ZxAPp<SqFFiANnFKnCBcF}7ZCx5VZxKZs F UnC dp ,> dn -< Si?Pd< ?]=#2P 7 (H 4(-K4(-F /- (A-2 <-2 #7%2 7)2 #7%2 7'7(2 <##7( 2-%7- (<#$7 (*2 2 ( (( -(%2!"2 ##2*)2 # < !2 2 < < 7##2#"2##2!(2*2#.7%<%<< #'<(*< (*<(*< -0F-/< (-F(-< #KFKF!K (P%P(P *P#-P*5K(7F!0A*<~+:F(2P(P P~ KPU~  Z~~Z# d("U-#2P((_-#d( d#nx-x2~AP~_~d ny d2t%!id<A>d XNSn<#_<MxnZ%kFXnsAn- Md2_u$EZFAxx<<FdZk[:([i< xFmLZ6'pi2hTmxJ"7ZZLWO`F5w_\.0BZtebI^nkx8*3{RazN x~}hMWHi Bz~{X5&bb<$* \Dd=!>Q- V0T$><j+W,?At&M'G:o%bL-vN!bA4beRHz&0sI|;}\lD[QJ1>80#8L^B#`Pr,vlwG }KW ~s4YoKnxk B2_]R3PU(8DF-AGAF2FVACAPoAAPZKCKK.F<FPBI@FU`KAFdt F>Fi~A <PxRJKiU PFnN IFsKCPnPLUsFCZxIEUnAAPn:<Un22Zn21_n-*Zn<8_n7 2dn73__74ZZ42ZP24ZP56ZP79ZP79UU79PZ<?UZ7<PZ9?UPAFPP?CZK27dP-2_U-2ZP*/_K-2dP(.dK27dP01_K((ZP-*_P-*dP _F ZF **ZA --ZF ($UA (%P< &&UA#ZF 2/ZA<<ZF53Z<22Z<45ZA22ZF 22_F2/dF*&_F(%ZF02PK27ZP (-PP-2ZP+1UP29ZP*1UU(/PZ07_Z(/Zd(%)iZ#22dZ20dP#(*nP(% dA(-%dF(2(_<-#ZF2#Z<-##Z<2!ZK(( #ZP221ZK#- (ZP(/'ZP(</ZP( ?2ZK-A4PF2 F<UF2F<PP< ?5PK<7(PF<?#-KA<7#%F<< +KF< #PP< %PAA ( PF< &PFA (PFF#KKK ##PPP F*1KFKK-4FPP I-2FPPF-/ FPP2# FPKA-* FPP<+& FPU<(( FPZ <!+FUU </FZP C!2FZP A2FZZ A%.FZ_F(2FZd <#*FZd<(( Fdn <(( FUn <(( FZn <+& FUi A(-FZn 2-FPs 7- FPxA(-AUs<-%<Zx D(0<Zx A-* <Zx :+$AZ}7(# FZ( 5##FU( 7#%FP( K22 FP#Z<<FP(S77 <P-K7/FZ2K7/<Z2UA4FZ< R<4<Z<P<2<Z<N<07Z<UA42ZF F?&AUFFA%FZPCH&7PPKU /2PPNN''7UPKP#*<ZZMP%)7dU-ZU/(2dZ(2UN.#2d_(2UU**2dd(2WZ*.2_n(2Zd (72Zn2<X_(32dx<<UZ(/2dx<<M\57i<Fdi/7<nFFZd (7AsFFUd#9FnPPSZ&0KiUUKZ4FnZZ_d-4F}'dUns4<F,dZs} 4CA1nZ y<K<6ndl{.E<@x_n}/F<@xZq{ 3B<Jis/M<Tnu0N<^nxy-Z<^xr4Z7c}j<Z(hxg=[(m}m7\(| p0`(x-r%i(0i'o#}<`#}(8`&z -Y2ux0F9'2B9,3E767@7@<87JF8/JD43TP8( ^"K4. c"P.-h,I(5r1P)/|6P&1|@U'-Jb*^ 6s(r;i4 |@ZF>b=@n2"Gz)!6O}*0@Ls3+ETs7&@Yz2+OYs90T\{3:^^}2:hh/:cw9:hw9? m9Dr3?||2:|w4}D|2xDz6xD! |2x:&+s:5#xD:%x?D+(xD:&9x?:!<nD:2 s::&4n::&4x?D+-nDD0+n5N04n0N0's&I5(nD:(n?0-dD0%n D5/d:0)_++*P&/_!9 Z&)Z!(Z|& Z w PrkKr^ FhV<^^<TW!FTO<|JHArE@Fh,9~<^',x<T|.<Or, <@|^,76wT'"<,hJ-<"hE8<T6{?2 J'sE(6iJ -, }iO 2{iQ -nn[(sd[(sd[gkd-dne(p_a#nUh _XuUPzUU}PPxxZC psi7|kd]>lsxiFKn nndKFk si_FKn ndZHDh d_PF}7Z dxZFAx7W _xPK<i-K ZnPF<n2P_nFA7i2MPdF<Fi#F#(PdF<Fi#F(FZ<2Hp(L((AU<2An- M(<P225d/I-(<P77-Z-C((2F<22Z(A-(7K2-2Z(A2(<F2(0X(@((-<((7U 9(24U! ;(27U 9(20S#;#((-F /(( 0H 0--P#9(9W :#7<Z<(2:X;(- 7U 9( 5P 5#- 2P 7(2 <K-#7A %+7 !# -( -2(#27( -9 "(7< (  7< (77(4A '#7F*0>&2A( +A +-A * #?-##F#4(%H#5(-K4( (I!52-F /(&F 3-#F#42/K 3-2F-(-A *( -<%(05- (< (2 +7 !2(-2 (-- (-(*----2222<<2->'7(A-<&7 $72%2 9)7#7%<%<)7-A *2 4C)2-A *2&7 $2-2%/ -(2 (/: "(-7  (29 ((7 #02#(( +-# (2 ( 7< ( 7A %( 5<!(#2 ((-( (((- (# ((( /!(# #2 (( (/(- --(2 ( (# ( (( (#(#(((#*(##- ( (4  (#2 ((2 ( #2 ( (-(##(2 ( (2#(22(*((#- (2 (7 #(2 #7%(( *9 $#2 #7%2 #:(# (< (( (5 !#2 !0 (#2#(( /7## 27( +< &##7%(0&2#( 2( ("2( (#2(#(7(-2<( (0<- (-<2 ((2- (-<( * <(-<((-2((-<( 9-"2( 2-<( &-7( #7%<( /9 !7( 772( &0 A((F( ! <( 2( 2( 2( 7#< #7(-2 272 <A#2( <7 #( <2#(2 5-(-<2#(250-((2 22%/ --(2 (2 (&--# 2( & -#(   ((#(((-##2 &%2 ( 2 ! -#(((! ((# ((#(--#(22-*22--22*/2-2-2(5&" 7(##<((#A((#F(/# 7(2# <(+! <## <&#AF& F( F A# F#(A#(F%#F##<*<2%F(F#<F F#< F F##F #A#(#<(# 7-# 22% 2-( 2(2-222-22 7-(<(#<7<2A2F(( F-( F(%A(2*<(#A# <#F# F(! F## F(#!7-#<27(#F A  <<< 7#2* #(-%2%7(<&2- <(7#-#2!2( 2! 7< - 2 7 </&-<4(+#72(<!7#( 2(-#7((<(2#< F#P( A<% 7##<&7(#2((2-2(2(#-( 2( 7( 2 7(<(7(2(7-#<2/%2#2(2 7 22#2 7#<!<#2 7 2 7 2(AF <#(%F2% K#( #F( #P( #F( "F( F# P F K2 -<- &<- (<! FF FPKF KFKF P-P!A(< (7#2<2#2(2(%(#(((/#--( 2(2#( 2(((%"-2*2- 2- 2 A <%2 2 7 2%2 2 227<(&72% <-%<&&A# <*+K--F(*F#%P21F2/P(.+P##P# F( FF FP F  F < <<< 2< 22<7( #2--(##2#!<((< <( #<! F( <# F(# F(/ )<(2 -<( F## F F <  A< 72# 2#2# 2+7#<2(--%(-$7( #<( !2# 2 #2( 2(<( #2<(2(#2( 2( 7-# 2(2# 272 A( #<($F## <(& !7(# 2(!<(##2(($<(# <( "<(#(<(-A##%<(,7242 -+<((<AF(F#FK##PA##F KP!!F P* #K- (FFF F## F(((K(-7  P(F<(F(77F(97FA<#F:<A#27<9F )27P427X! <27P42&F 3-<#/2%A.2##<*2%F!37((F2<(-M 6A#(P(<F(P(<F#P-><!_>N<##sPa<((Zn(-_u -bx -_u 4]w2d} 2_x7Zu?Wv7_z4`z2Zs 7Up-dz/by7_z>ZyFUx DRt 7Pk4]w2_x 2}Kd<s7U<q5SAi( H?s4S<s7U?p1P7s<W?n/N<n2PHs+OFn(KFi#F<Z<AU47P4 7P4AP/ <A##77( <2#-722 722(-<&-7#(2 !2  2 2 2 ( 2#2 7 <  <<7#2 )-  2 +2(2'7< ~ <~ < ~<~ < ~F y(< t&7 t(< t#1< y-9< ~(6< y#/< t ,<t#/<t)A t*FtFt FtFt FtFjFtAtFtAjP(tFy P~%1F~7>P~-7Ky(4Ft-Ky P~ %Py (Pt &Pt (Pt+Py *P~ U#~*Z(~*U(~*P(~ (P( #P( _(  d( d#d(s-n2)d# d(n7! xFx</xF0xP~2Z~ *d~n~ n7~ xd5.1}nPKMx(dFUsnF2xF_nnd R{)RZn2_x#HPxZnq5:<s(sH2(xPwP9d}TZRP6@7cf2nY\ P".<[-!m"mKkV%d`)!"}RtN &;xP8=GlplY MR`fw5*\y9{az*V jHfp*vv g2NDx x5: 1y_(& 8 7*^q0 V>,Xs5"`<'Xw1"e4X&` }w 8p:bZDc>\W@!pNyp&cYWNNE,lh 'aBP`:h@7)Zcp-V^dk~F_tZp-Y QZ7_RRB( __-z.Z_(<8P\<KBKUFZVRY<PjPP<P.~DAFZBF>FPVF;K_jPFPdUHKnPCFnKCKxU PFnUVKxUWPxPOZsKKZx<>ZsACZd 7;_d24dd74__<9dZ< 7dZF AdZ7 1i_7-nZ2 +i_(%dZdZdZ((dZ--dZ--dU22dP--_P--nP9 4n_F>nZ?;iP74dP53dU--dP2/dF2 -d<:1iF7*n< -!n<-#n</'n< ( n< 7/iF K>d< D8d< 7-d< 7._A 7-ZF- &ZA2(Z<41UK2/PF75PF<<PF2 -UF2 -ZF7/ZF-#ZF# ZF( #PF-%_F#ZF/&_F7-PF< 5UF#-*ZF(-*UF#<9ZF96PU(74ZP(A9PK-F7PF2A5_P27*ZF25,UU-<2PP(2)P_(2 -PZ(+'PU2# PZ(7)P_7F9PZ2> .KU<<#*FP<:(& PKA7(# ZFF7(# KFA7#%PF<<!+PKA<-PF<5&" KF<<#*FF<C#1FF<K#9FF<K!:FK<K#9FFFK!:FKFK#9FFFN*9FFFK#9<FFP*;AFFZ-CF<FF-/ FFPK7/FFPR>3AFP F7*<FP U?5<FUK<-<FPK>,<AUK<-<<Z A0)<<Z 72<<Z /0<Ad22<Fd 72AFd2-FFd<7 APnA<#<Fn<:AUs<<FPxF<(FP}7A %FPxA?!FZsK7/FZn<<FZ}A7%FZ HH$$FZ#KU /FZ(PW$/K_2UU**Pd2UU**K_2Z_*2FZ2Zb)5KU7PZ #2FP2IU 0PU2FP -FP2R\ $3PP(7PZ #2FP(<RZ%1FU(<ZZ--FZ(F_a.1<Z7FPd<<Z<P Sd!:FiAP K_9Fd<P N_8Ad<P PU%-<d<P Wa &5A_KZ Zi%<FdPZ]s#DFd_iZs FFddnax%GFd_ids*AFddd]v"GFddn#Zs FFnnx(aq(@Fnnx#UnCFnxx(iv .AFnx(in29Fx(kp3:F}2ss99Fx"2q} 2D<s,7x}9A<x6<v 6E7x1An-K2x6<w9P2x@F}|7M2JFw9P2}JA y<K2TFi;\2s^Kh9_2xhP%n-e2xhZ}(o*f2xrd*k+j-i(e/k2n!b6h-x^>d(x#Y9n(#T<p#T<p# #T<p+P8x#"2G7(",+?@'6(8F6@42@;J7,A@TA36EcA,9ThO'1^|P$2 h|L7m <Hr F@ AFFBP9"Z 7!'Z93WB+@_A0,HbB56JdA0@M`F?6EUMD6E_C?;Ji<:JO]J:JTdFDT[iDD!Y^nAD&TcnCD+ccs>D:hkx=D5hhx<D:rjkJ?DmrnKDDr:I!N|> N&X|> ?!X9 :&X= D&bA:0l; ?!bA:b;}:!]7 x0&bBn+bAx&b5n&!b/n&b5n]/nX4i!]-nX-dX|%nX|z,dSr#dXo$ZN|mdD|hU:wc P:|f.U&mY}/Z^Vz1U TT}-ZTM{+ZO;n/PJ@s-K|;@x(Pr6; Fh16 F^63KT|1FJr'}F@^ "sF6Ti" A"J n.2@|`82,rU@ 2,h^G-T_O(J}aS( @x_Y (6ni^(,siY(,plZ(ni^(fldddjiPo n<tsx_2anU2\dZ2_i_7f dX1] ZU2\ xxZX4` }sUP< dxxZC=^xnKK}2 WxnFHv. R#idFKiC(ZZ<F\9_K2A_>(ZF25U :PF-2Z(A(ZPx2>W8K<s-UZ(/F2n(PZ #2A(iP_ 7(F(n?\<F(_2U#<(F(Z0F .#(<#_-A *((<(Z/C +##<U7F*2P<D&2U2A(2Z4C)(7#U2F-2<Z0A)-<U2A((2P7:(- P<7 ((P 00(( P2((( F 7*"( K 7(# (( P 722-P <<((P 09 !-(P-<%2(P+7 !-(F(-2( F%&7#A(#<<-<A-<F-<A# <<*(<<-(<<0&<2(#<<-! A7( F</*A<-(<<-%77((< 2/# 2 2-22(  72-(<2/# 7#2-# 2( 2(! 2( ((2( (!!2#-# 2 2*2-2#2 (4%2-(7(2((-7#( < (( 7(-2 (7 '-#-A2(27)-(2#2(#7- < 2  72(222222 22 22#22-# 22(%77((<<!22# <2 <2#<2(7-7*2(0#7-2%< 2-$< -7/< (( 7-2-#2(2-%2-#2 2!2-#2(*"7-#< 2(< 2-%< 2#< 2#< 2< 2< 2 <# - < ( < --%< 2*&7(2( #2( 2*!A-22%<( 2#<72#<<2<- - <2(<7 ( <2 (<<- <<2 F72F22<22#<22 F27(#<2</ 727( <22*<-2(<(2!<(-( <( (!A--#F22+ $K-2( #F(2&F(- <((*"A(-2(<(2!F(2(<(2%K-2- F2(7*K2#27-P2(2(%K2#-P2((U2--- (Z2(2( Z7--(Z<22&Z<27Z<22 Z<--Z<((U-#PP2##F2(P(#(P((*'P(#(2/P(2*P(#(2*P((# U#(-Z(((Z((-Z(((U(#(P((($U(#2*Z((0 +Z((2 -Z(-)Z((((Z(&"Z(Z( Z(# Z((Z(#( Z(2 -U(<9P(:;P(<>P(43K(<9F( 75K( 77F( 22P-((P2U- Z( U((-P( 45P- ((F2 /.K# 7 2P( Z( Z  K  F *)U#(%Z( #%P  Z( Z( # P( Z( Z( Z( Z( %*U-(-P2 08P2-7P2+2K2#(F2(*F2##F(A(<(<(<2!<#<( <-#<2A-F2$F2F2 <-F(K-P(P(F+P# F( *P#*P&U(Z #/U P"P(F%/P#/P)K#< ,F*F%0F*F!.K(P$P%F'P#P%U(/P-7K#-P&-KF)K%PU PP*F K# FA*<(!A((<( *7#-2#-< <+7*<&1A -F-F-F'A%< -F-<F(6<<$<#-<(-9<(7<(*< <( )2 #<)<#2<(- #2)7%2,<#(<'-%2 #- 2(-#22!0-(<(42(/2#--##-2(!,<(#<(*<#%<(7(<2!<- <( &-#*2(%/7*2*62(72 $2 < (2-2!02(2$<#< < < 1-(92!6-/2-2(22-:2(42!.2 <#2*2 ,<-7<#22#42&2(42+:2-92&42-72#-2(2<+<##<( -#2)--2*<#22+7#22&1-(42&1-(42%62(92&6</2 1<(9<%3<#/<-:<7F25KA# ><# =7##<<3<#-<#;2(4<(#6<(->2((8-#2F(+@2-(>((37-%<( ,2(-2.<--9<(2=A(-9<-:A-<<*<# #<( "<-2<(/<#-<4B2-7C225@<2-<<22A722C<(+;<2(9<(-=A-2F2(&6A2#7<2(97(22%7<(-A<( 97#/2<7# A2#<<#42*9A-9<2=7#2A2(-=<#->24D72F2(=<(#7F(-AK-->F&<A(#<<#7A-#7<2%:<--A<(7L<(7K<(! <<(4< &7( (F( (K((P( 6A(#7F(2CA(2C<(-><#2C<0D<-A<(:A(%F227<-#%<(  A#F( %K7- P24(F22*F2 2#F22#F(+A#(F( 2#F(- F 2% A7(# <9(% <2# <:!)A <-<(<-<# A#/<(A2(7#A<#<(?F&7 -(<K-222<U7<72_-F<F<a% C <7KiC <<Ug!<7<P_ 7 2<M_822KZ4 2<WZ*. 2-U_ %4 22<Z<77(Z2F <2(X0D2A(U-A2<4_+E7A7_(C 2<4_+E2F2U#<2F2M 42<<P2(<:P3(A<K-(F<M/-<<F ((<A7%(7<-%2F2-(F<( (PA/(K<-(PA/(K<-(U5: #-P-9 (M(9#U#C M? F9MB(K>2MB2A9<<47##7 22(777# 27<( -57#*2 /97-2< /67-92(37#2<%6< 7<*D7(C<0N<-K<#DA !/F4F4F9A A< .K#*F2F# >P# >P# >P7P -P7K##FF(@F# AF<F>F2F>F>F>F @F( HP(/JK-2MZ20KK(-HP2+GF#<P(9P-<P2<P(7P26K2F.K/P7P 9P0P# AP# =U# 9Z(:U( 9P(+Z( #Z(!Z#Z(#d(/Z(=U4Z ,Z Z&i -x2",x<&-F !/xK -xP%UdZ#dP/41iPZUx2fU]xsPx_knxd 4q=Wi}}#UsHdF(zu?8UZA`f9<d[i<V\M x,n.^[PT\vCL k^DWdlH`u\9^hl\t&uO3kb|v\t(W/A|C>`% `8#{0? *v>gV9>p&^| D\l~ FRlh\~,."v' V| *tJB.F^le`K -sCt<KdUp` (\R-[ZK <`d*O 2jdAC2tXP0$AZd (7<.SpF<8UsH2L_u$E7`_s%C 2jSu"K<~U}(R2R}+TAP7 _FUA k#AZA nFKRwFPU}<?_~<2i<2q72n2<p-Pd~(?n-<n(7x--((#-224<~5 2 7{ <t 9w 7w 7v2w 0w(y ~7m ~<e ~5i ~7h ~~7i~y-m~t-pyt2mtt4dyt2^ ~t0a ~o-c ~t#k~(e~~* g~~(c~~*_y~-[~~/"X ty<TttCQo<V t2` j7 `j>` j7jj2ot(w t9n t7o t4p yAh~5p~(y ~-y -y2y#2w 2z<t4w7w2~-7y<|7}7~5~2>w Ko IqAw 5y7y4~2 2 2 0-A|#PxtKt#Kt(5-7(C~~#-<x(2Kq}(<Ax(<?x#<<s<Ad#<Fd(<An(#FFs((FDw-(K72(P:-2Z7((Z<s#-ZFdZRV#_Fd(ZKd((ZP_((ZFl(-iPZ(2nN_(7nFd(<nDk(7sAn(2n ?f(2} Ad(2 K_27KZ2<KX}<FPPx2F\N}|AA#ZKx<<(NW~7A-F_2F2PX-A7F_2<2MX~2K<KUz(F<WS~(F<dFyx(F< bKy |(AAZP~}(F< UU(FK KUz(FP WU(KP _Py(PZ _Wv(KZdUr(Pd]Uy(UdAi(ZnW_z(Zn(ZZy(dx(aXs-ix7-nPj2d<2n_c(_72xZ[(d"<2{WZ(d"<7xZ[(d,F2XR(d6F<sZ` (n@P<nd`(n@P<dih(xJZFskX#nTdFxdV x^dFulU#}cnP}iO (rxZkK #}_iE(diE(iiE(dqF-nnG (nqF-xsE(xl7#d$#d$#i'"q#1'n%@,E; T; T1}T/{ Y,n ( ^8} rE}% |"Eq1 |'Ei9|,O%;OJY+Yc0^k:cm :hr ?|m:|"rD"|( N,2 N1(X@$XEX@*XJ/XJ+%]O%,b^+*]^%3bh<gm(.lh)0bm%3br$9lw#8b&| Ab *8X|&7]!|#8X& *8xS!%;N&>xN+=xD0%;}I&%;D& -3x:+(6x0&)7i+&#8n&(6i;n#8d|;n|5_r .Zr,+Zr*"Zr"Uh$Zh &ZcP^FO|FJr A@hF@cF||,^<rr,Y<hh'Y <^|^"JAJrJ@ <@h@; <;T;;<6T617'6"2,}"2 's'2"0 7.<37};2=(}@2nD (_J(}P[(xKc(sMg(nUh (gTo (}xdZo (xuIg(si}<e z (ddpApy #ZUx<jx ZPqAoy #}xZZn<ts (xnPZk2|g#}dKPi7|k2xdFPb4e(i_KFd7i2ndFF_2a_U<Ad(ZZP2<_&UUF-7_#RZF2<W+VZF#<U}(R(ZF<Ps#K(PA#2Ks(M(PF2?q2Q(U<77n7R(P<<Fn(K(P<-Fn(K(P<(Kp%J((K<#Ks(M((F2 Fk%H(#K2 Fi#F((F2 MiB--F(#UnC22F2RlC-2A#(_i *9((<Xg$;(-K_9(2D_=7-7#A_>2(2<S5-#-AK *((HP ,##( PP((((( KM$'(#( KP#*((( KU /-( F_<2( R] #4-#U_ %4((P_ 7((FU2(IN")(AF%( PH, - UK/ 2 XW,+2 PU%-2( KP#*2#AP/<2MP%)2( PP((2( KR",2( PZ #22( PW$/2(KZ42( KX 22(PP((2( MZ 3-# UZ(/( NU#.- FU22 DW52# AZ92 FS 07 FK (< FK (< AF%< FH"%A-KF( F( KH'"F( PP((F( DK)F( <K-F( 7F*F(2A(F2>C$F- UK/ F2PD.A-P<2<(I7-A-F<(F2C>$K2# FA%P2( <C%F7( KK%%P<( HD& K2PA/F(PA/F7ZF7F2UH1F-ZK4F(NF+F(PF-F(AD#F7FF##F2I?)F-AA F(CC!!F-KA*F(N:1F-A7%F(D<&F7F7*F2AA K<FF##P<AD#K7AF%F2>? K7F<(P2A>"P2FA%P2H:+K7K<-F2A:$U-#<7 P52P-(<7 P2(<9K#A7%F((>/&K2F7*P2I>*P2F<(P(C7'U-F2-P2A0)F2A(-F25%" U27- P2C/+ F7A7%F<C7'A7A7%<279<7<7 <<97A<A2(F<I4/F<F7*<<FH"%FA#AK *FFHD& FFK<-<FC:&AAU79 2<F2-A<A(-<<I-2<<F-/ <<A4'<<<A#F<(9:F2-A-* F((:(& K-(7#%P2(A*, K2(F2-F2(F/. K2(A-* P2(<-%P2(<2#P2( A9$UA2A7%P<(F7*U7-F2-P22 N72P7- K7/P(( F7*K<- A-* F<2 H-1 F<-U(AF<(N+8A<(K-4<<(?&,A<( 2# F<(>(* F<(F2-F<(P/8F<(_2FF<_9B F<-_<A F<(Z?:F<(K22 F<(A7%A7(A7%<2(:2!<2#72<272F2#72P2(7+!K-#<(( F(4+A#<(( <:*% A#<-%<(>-'F(<-%F(9/!A#A2(<2& <#2# <(<#*A(-<(0#72%2 4&A( 7*F( 0#<(2%<(<#*F-7(# F(4#" 72(<5+<<(( 2 5##< 2#< 4 $< 2# < <#*< <#*< <.< 2%< 2%<- <4&<2#<+  <(#<(<#<(-"72%2(+"7-# <2# A-#F24,A(2*<+ 22*<2)7-2*2(<27#</2<4<#7*2(+<- <2 A(#F# FF(F#<(73F#F AF< 7F2 -<<3A7-<5*<#<+"7#( 2((2###(((7(%<#<( 2( #- 27  <<< A- (<+'A(*<!"<#%2 !---( ! 2 # 2 22 #%7 2%)((%(+'- 22222  72 -2-('( ( - 2( 2  22( 2 2(- (#2(( # ( #2  ( ( # ( - (((  #(  - 2 #(-(!#     # ( - (((  (  # ((( (2 #  -2 -2 2 2 2 2  7 < 22  2 2 #(  ( (( #( # -( ( (( ( # ( #2  2 2 - 2 2 2 <2 < <<< A < F < 7 < A F < F F<<< F < F F< < A#< A#< %F#(F A #<$A(4F-7F29F077 2 << 2 2 -( 2#((7222 << < <7(!7%2%< 2 -(7 2#$<##< !<##<!< 22%2((A2/F0.A2/<24<(-<!%<##<2<< <( !-- (29 227 22 0 )22*20 )7-%<0%<((<C2*27222722A(24D*27A %2 7F*( -F /( &P*=(K-<( M/>( #P->2/S$;2-K42 -W*@2-Z-C2(X0D2P7C2 4Z&@7Kd>2Kp%J2P2Z2F<_# <}A_ AHhFKn IMq AZz (<Xv <Us HNr#FPs(:Zw-_u 7Wr2d} 7_z #AZz ?Zy-<Zx(?Po(7}Fa7}Fa(7s<W(5n9S<s7U<s7UAn- M?s4S<n2PFk%HFn(KPlDPnFNs%L<n2PPs#KZn#A kg71n_>(XX,,KP#* ?D$2< # 55-2( /+## (# -# 2 # 2# 2 !2  2 #!7<72 7 #2< %1<-< *4<(-F#-F F-A *< .< -<-< /<"K%F A F KPPP P(P#P %P!P %PP P &P~-P,P/Z (P~! Z~ "K~%P~(F! P #U#Z""Z #Z&Z!(Z !%Z %Z %"U(P&K-F~+K~ *P~ +K~ *F~#P~##P~''P~##P~")Z#~/P(t !/Po(Zt._#o(d(t2nj<x(`@x2[D<V5}FQ(PL!P` Z(j%UUt2K>d DIFd- UKPnP Z:Jnsi #Z7HdxCZ8U2id7/F<Fx]I!2}Zdn~_#nea:Z, LRa<h"!&Tc6"(itnh LCcGKr_Z~(&D,gbQIJipbXh}Zu1R=v5umzfqr4a nRmX.p&tx n %hx{g%/'ep+lD*(.9 W|,g!*<=0>I&l*FB* \{ F=  t${t+i JXl >#2H:&|u]4|,n*v&Y@pJN1*8 ,VTJjZ,dj3Fj #s%7sdaRt<dnuV_nVPd-VFU<`M\< tKU(F.DK-PBKM(FVK F-UeUM2Z~P K7_AA<Z:;FdAAFZ>DFd<CFd<@PZ<APZ49P_ACPZ<CKZ<FFZ>DFZAHPZ5<U_2<Zd(4U_-9PP(3PU(PP(UP(-ZP9>ZKFKZFACZFAAZF+.PF ZF#'ZU -/ZP -2ZK -2ZP 4:UU~7>PP~(0UK~ZF ~&UP~#PF~"PF~#*PF~(/PF y#(PF t#)UU~(*ZP-,ZP- (ZP/,ZU2/ZZ(-ZU-2ZP/6Z_-/ZZ-._Z#--dZ(* %_Z#2 -ZZ< 6ZU7/ZP(%ZP((PP/+ZK( #PF(-)ZK#-*PP96PK#2/PF(+'PF#2 -ZF+'PU(# ZP((&PP-(%PP2/.ZU22 -PF274PP2F APF2>5UK2A7Z<2<3Z<A7-ZF<? /UKAA4PF27*PF<2(PF<9+UA<A2Z<<D 4KAAF7PFFD6UPK</ZPF5'UKF<2PFF90KAF7/F<F5 .KFF2*PFP4&PKP7- PFP:0"PFP7#%FFP>&+KKPK#9PFP</PKZF9PFZ:+KFZFFZ2$FFd 2%FFd K(7KKi d2KPPn _+IPPnZ2APPnI01 PPxA2(PPxD2+PUx<-%PZxA2(Pd A2(PZ A4'Kd} F<(FZx Z7> KZ#U79 PZ(U5: Kd# U->Fd(F4,A_(K22 <Z(K50AU(F2-FP(F4,FP( F2-FP A++ FU A-* FZ M90FU( P<2<P( I<+FZ(F<(<Z(UF2FU2UA4<P2PA/AU7PA/FZ<\K6FdKUP-%PnP(ZU/(UxZ(UU**PnZ(XZ+.KsU(ZU/(FxP(\Z/,FnZ(ZZ--FnZ2]]..Asd2ZU/(<xd2_]0-<s_-_Z2*<nd(Za)4<ni7Zd (7<xx <df14A}x<Zi%<FFis />A}Adn -<<<fi16A"Fnd<-F"Fil37Ax,Fni92Fx6(Fqn:5K}6(Pns4<P@2Pz 6JK}J2_n*PFT<dzz0VFYAdt7UFhPnm7\FrZnt7UF|Zn}w2WAw_st7U<|dxm4_7d}#c4i<n#c4i<}#c4i<*a0oA(`2n<(Y5q<(Q9u2%P<t-#JAu(,!DEw#'#@Fz,4>:#;<=4J=@2E23AJ<39T76<^A/8 cA"> hK"7r F>r?H< M&""KF01'PC 0@"*KJ5E,PF0@"1NJ:J,1KM:T6=TJIh6@ZFNh@Cb?Nr@Ji<N|JQaGNJYn>XT^nAS^^nAN^alDNh^nANhcpANh^nANrYbJNmYdHXrr{>]  |sKb wJX CX A ]> N&5S!7 N&3X!|2X> S >N >N!CD&AD2:= x0&<x&&<n&!w4xw<sw4xw4i w*np)dh(dm4d|c}4dr^}2UhY*PhV"ZcJZ|^HUrT@ZhT@ KcJ@ F^J; P|O16Pr@,"}Fcm1"n$<T^" d) <@Yi126Th82,;n=2"6s@ -"nB ("gF# ZLvaZ s_^ p]b #nUh (nZe sUc(vKe(xAh}2xp<rt-snArx(ni7|k-dd2d2d_*Y-Ks_(W(Fni##W(}<di##W(x2dN4 [(s-_F<_ (x2dC}:[ (i-_Fs- P (xZP?d% D sPF7d-H dP F2\*CZF <7d-H dF<2_-FZAA7_(C(ZFF>]>P<<K_9P<<C_=P77AZ9P22:I,#F--2A((F22+A +(K-2(A-(F224C)F-(2F-F((4H.(A((2K 2(<(0F .#A(2F-(<(4? %#<(7< <#7%(<(2#(<(9 %--<%2 4<"(#2A<#( 02( (-( *2( -2 ( &  #    ( # # (7 #( ( 45( ( 77(( 2< #(( (7 #( ( /7# (-7   ( 25-2  2< ## -7  ( &+## (% # ((  & ( #(( # (  ( *  #<#*2-# 2-(+&(##( *! (2#( 0(( (2 ( (5 !( #2 ( &4 !((2 ( *2# 27 (0# #- ( (/- -22 #&2 # 2 ! 2 #2 %2 -# 2 7*"7 F2-< 0-(2-(&(-#(2& 2( 2 ( --(( %#- -# 2 !-# (# (#((( -# 2# 2# 2!( 2##2 & 2##2!!7##< #<(((<(%(<#-(<!#7# (2 &<# 2 # 2--2 +/2--2! 7# <%  <# ( < #F# #F( / <#A(-<5%" F7- < 7(# 7 ((< !#A  F F  F #F # F ( F- <2*A2-<(7/<(722((2 7(22(((07-((22--2-(-2(%(-(#(2(#*2(-(2(#(2(( 2(%-2#(2 2 (-2# #(2( ##7( (#<( -(7--# (+-7#2 <457#<2#2252((-2( (+-# -# ( &(2##- <(( 7((2( #&2( ((2( *%2( 2(2(((7-# <2*2A--2F( (5 !A(-2<(-+A(2(F(//A#-7  <20<<-%<#2 <2%< #2 < 222 427 222 -22222(-7 -2<77<(7 #2 +22 -22 +7 !7 (7 #2 %7 $( -7  (7< 72< #<-0-(-2+4 227(452<2#2 522(2 2-07(-<7*"7<-%2 >/&2<2#2?2&2722 222 222 002(2 2 ((2##2*(22(22(2 2(2 <(( 72(</-2<#*< 0! 7#2( 2##(%7#22(72-2+22(2 2 2-2 (-2(+2 -(( (#2 2 2((( 0+2 ((27(# - 7#%( 7(- - 2 0*<-(</% F-(F(&F-(<&< F%A( #<5,<2%<&<2*77-29-<F<< 5+72(2 !<<*7 7(22$72- 2!7 < 7 2  7 <%<7(2 >/- 2%2 +"2( 2 - &2# 2 2 2* %(-#2+ 7(< -2& 2# (# 2  2 (#2%((((-(< (2#<( !22 -(2/$72%24,-- ((&#( - 2  ( 2 2( - 2  7 F <-%< + &727 # 2 22% ( 2 ((-2 22 -#2!-#2 72(-#( -# 2&"2( 2!-( #( (222  (~ 2 ( ( 7 2 < < 7 ( < & !< #2 & 22 -# 2 ( 2 #2  2 7<2 <7 <A<  < - 2 # AF# < < 7  < -#2 *"< 7/< 4 /22*2 20779< !&- 2 2 2 -  ( # -#2 2( (22 (  ((#( # 2 - 2 ( (# ((-2 #(##( ~( #2 #- #2 4)#A#/(- ((  -# 2-  2%"2 ( #<(<( < (#<( <%7# 2402<4( A9- 7-( &-( (!-(( - 22 2 2(#2!2!22< #( #C 1( (K#7(4N 4#<P2:K.#<K-9K.<U7:U82Z(A+X-B-Z-C*P&;#-U(>(-W*@#-Z-C*a7L<n2P<i-K7i2M:n4Q 7xA\ <Hf APp ?Wv AZz <f <d ?\{#FUxMSy #UPz IUy (KPuFX{ (AUu(KPuUKuFX{<_}7Zu 2d} 2]v7KfAAaAAaF>a#FFiM<bZ2_S9 bZ2_Z5bd-_]%SZxK Ks(MUsHWpD UnC _n(> Zi%< K_9 KU / 7I-#(7 #( %/ 2 222 722722 (+2 (#2 % 7 2(<*<- < -"<7(< :2< 7 2<2/<< 7<+ &F-*F((A(-<--<A7<7 0A 7/F~52A~##F~#$A~ F ~K ~F ~*+Fy-2Ft(-A~#*< ~!+<(<~*2<(2<!17 2 ~-7 y#-<~t%.<y(/<~/7F ~29< ~(-F~##< ~#$F~(*<~(+F ~(-F ~(/F~(4F~&/F#-F ~#.A~#/< ~(2A~#-F~&K P&5P#2P,P#(P(%)K#((P!(K%F~ "A#~ *F~ )Ft 2Pt1Zy4Zj.Zt#4dt!8s-j 2x<j/xAe4nF` 'xP[ xP `~ x_-e#nZPt???sd}ZUWnd<xdnsi_-Ukddx2UnZnP2ZPn p,OF<#wHA2dFWZNs }EZaZ61Xw<c6-U|, /&qPh'O(j2'mFpGb@Kz~N^Pz.q Smn\$$\($|`Cgp fR*m*8W}~qlDN y00F  j}x8 /"bu( Q>'Vx2 j&J$H7y!C"N2~#- X[vn5Imv vz?1H?= n~[4!alckp:r>I$blAL|5>`s6L-8t(@}ez `Zs dn<f`2xk*Bfca8_a2BSS(FVPR(FjPM(F~PH(F$ZK-<3U#C2FBU E7KeU#C<Z~N?<ZF9Fd\MFZdWFdZRAnU PFnSPFiA>FdD ?FZ<9FZ<=FZ<<FZA ;KUA4FPKAFUA9FZA :KUA <PZA <KKA>FF? :FF< 7FF<8FF<9FFA=KF< 7FF<8PFA <PPF @PFA <PF > 8UP A9ZP : 3ZF 7 2ZF -*UA2/PF9 3KA<4FF <3KK7/PP ( PK ( #PP 2.PF 2/PF 4 .KF< 7FF51KF((PF9 4PAAAPF><P<AAP<?<P<7/P<: 4U<<4Z<2*_7- (d27 2Z2<4d22 -U2#74Z255U2<>Z244U<#2/PF(:7UA#2/FF(+(U<-2/P<251K<2--PF2( #F<-- (FF(<4A<(7/<F(5 0F<-2 -P<<- (UA-2*Z<2>:Z2(<4Z227.Z27</Z2<:1Z277 2P22<8U22< 7P<<96U<A7 2Z<FA9ZAF<4ZFF74UFA77PF<53UAF22ZPF- (_KK-#dFP / )ZFP7-ZFP F<U<K7/PFP >5UFU F<ZFZ 2.ZFU A9ZFZ<3ZFZ<2ZFZA8PFZF>FFZD8FFZ7-FFd2&AFd2(<Fd+ $7A_-%2Fd-$<An#-#FPx(A%.FFs-Z2AFFx2A7%FA}-<7 FF(C0+FF}2<2#FF2H+2AF7K-4<F<:(& AK<-# FPF2#APF<-<PF?#-APF<#*FPPC%07KPK-4<PPK/3 2KKU<7<FPW7; 2FUZ7> 2FZP27 2KUP27 2PZD-- <KZF-/ <PdC-, 2FdK22 2FdP/82KiP742Px M</7Ux UF2<P S<57Z UA42d Z<<2__<A 2Z bAA2d# dFA2d( PD.2d(ZK42d2SH/2n2PK*#2n<UP-%7iAU_ %42n"F(]_-07s'P(_d-4<n"P2ii44<i,Z-}sC4<d6Z2li73<s@d2ss99<x@d2sl=27}Ei<ss992nJn<is />2xYn<_} M2x^xFd}%K7}hUi}*H2rZx8D-rU}}>>(|Z}{?<#Z}}>>d|F>}"itFF(,xu?K's oAPx,x ]H[}EYH_xJ\D_}TYAf^W?i h#^7k h KBrr -@>|(8F"-1F6-,HE<.<T<)>YA'<^8Fc 2Rh2Qr-U|9I  K9&S6!"P >&"D G&'A K&"CK&17W&6'DO0@1KM0J/PG0E1KM0&J/NI0&J6UF0&J@XH00YJUP0:^MbD5:hYx40Dr[kB5DrciH0DrmuA0Nrw9:N|r5}5X&w/x:Nky<}0N|hx<x0N|cq@}&S&c_Rx&X&jhM}&]&mx>n&X&r7n]&w9nX&r2n]+m}9db0m}9iS&mx>dN&f3iS!cx9ZN|ez8Z?|cs>P:r`|4U0r^-F0h^&K+mh-P&hY%P^OFTHKO@x(P@3n+A16n-<|"/b5Fr'_ 4<hd*Fci" P^|i'FTr i1FJhi1A@^d3<,Jf77';_;<"r,]?7m'ZB2TYJ2T}dQ 2JUR7EPQ<6SU<6sZ` <,pNi7iKr(_I} x2s_Ap(nk2|g-ii( \2df-`2Zi( \2Zg*] -}P_#R (dFZ{!N (dFZxK (Z<\x J(xP<UsH(xF2Xn!B#xA2PiAn<2Uk@#d<(Ud#9d<D];-_22K 2(Z22K 2#2_}#-A *(Pn <?!2Pn <<(FdAK *#2Fd<P2((Fd 9M0--Kd <K-((FZ <A#(#AZ77(<P5<!(#2P<A#(2P9<-2K<7 2(2F752-2<7(# 2(2<:+-((<7*(((27%$ -##<--2(20/7-#222<(20/<((2-2F2(24+A-(-F2(2#A2(7(<2(2$F-#-#F((2# F2#22#F(2A!0F#-PAF(F%3F((A(-F((- F-#F(#A2- <(-A(7- F(0&F#-F(P(- F((A(( <( 7(# <( <(( <( 9*$ 7( <-%2( F#42# F(22 D*/7 <(( < 7!&< 2%<( 4&< 7(< 2%<#2%<(+<# - <(4*7#2(2( 4&7#2%< (7#2 -"7( (<(* <( -#<( &<# </"7 <-2 C 32<-( < ,2-2+2#2 +7 # < *  < # </!< (<(/% A(7(# F2(! A(<( (<( 2%<( -!< 7*<( >4A# 7*F2 5(K2 2%P2 5 %P< -PF 2#P< -P< 2 "P7-P< F7 F2 A#( F(9*K(A#/PD#2K#7(F2!!K2# P(2#K--P22#P27#%F2>(* F27(# P20+A-(#<( A( <(  <#  < <(<2#<--<(( 2(#(<(#%A--(F2/(<2((F2C-, <2F2-F2 A++ <- F-/ <( H/0 7(F-/ 2(5-<(#- <(*(<(((<((&<(-(<(!( A( F(A( <(# A(-F2-<--F2&A(-<(4&<7(<( 2#<( 2# <2 0 A2 #(F2 %-K-#(P(& P(# P(%(P((#P(4!#K-7(F22%K-7#%P(2$P(-P(-# P((#P(/! K#-F( K#- P(A5K(A4F(7*K((P( (A- # F2 # F2 ##F2**F2((F22!!A27(<2<2 F((  A-2# F(0 K((#F2+! F(-# P(*(K(-# <*! F(2# F(2$<##F#K## P(# K(- F(# F-(F2(A-(<(<-<2<(<(7##22# 2 2#2- (2- (2*"77-</%7- (5 .22*2- &7-%<!2< -2 7< << 7 2-#< A#( F(! <(#F( F7F2K2# P2(&K(2 -F21<#22F(++F(##F(# <#< <<-2- 27*22)7# < -2 7<7<222##2 #"7(%< -##(2# 2 7# <<<A((F0/<-*<FF FF %$F-*F - 'A2 -2A F F <K--P&#FP(K# <F<<#<(F#<F< 7(%2+#<-%<+#7( #<( #7#-%2#7# 2! 2 (  7#< 2#2( #2( 2(#<( #2(( #7#( #<(!22* $2#( #2&#7( #2 A< 7# 2&#7(%<#<#< K( #F2*A( F/'K#7/F(:0A(<(&7(( #2(4,2(7 22(?72(-%2(+#7-( #2(- (<2- (<2</F2<-<2>17-A4<2:02(# <2( !7-( #<2/+<-- (<((%<(2 -<(<42< 7<(- '2#-%22-$7#- 2(7)7-KA22D:<(A4<(:.7(#<(( 7## <(#2( #<(* $<-2*222 -2(2*<20 *A#2*F(/+7#2/<20<-*<0'A-F7*A2%<+F2*F/ )A#7-F(- &P--%P2( !P(#P2* #K#-%P(- (K-( Z2-)P(2*P(2'K#A(-P(F#4P(A2P(:+P#</P2%K2#Z9#'K<#*P5'K7*P9.K</P?3A</F-$K# P# P( #P(#A#<-"72(<2& <2# <5(! <7#%<4#" <2#<7(A2# <C#1AF(2< 5##<7#%2-! A2# F/% F--F40F#7- F(52F#77F9M0K#U_ %4F(7X! <F(-P#9F2W%>F2_-FF7d-HKAn- MF<i-KA<n2P<<i-K7 7i2M2 5i4N7<n2P25d/I- 2i7P(>n0O(Ks(M(<p4R-As2R2 Du1 S( A}<\( D<^-AFf( <Sq( 7_z9b~A_ AdFZ} IUyPPx RS|UU NaUdyKs|#Ax(5z(}(-x7n7d7i-n(i} -]s(Zn7}FaA}<\ Cz7X K}2 W K7 \Z-ZS2[U-WP/WP2ZDz6XPx(P UsHUnC S] $3AF% 5A & 7<  4A '- 7A %2 !9(7<#/22#-( ( %- # 2  2 2 7#<7 2**2A>2(-2%2AFF~#F ~ F (F $K%P ~#/K(P "F F ~ K #-F (4F #4F )F  F "F  F -F-F~ -K P &K F~~!F #F 2P#9F~~ 6P4F ~ *U%P %U%P~%U(Z $U%PPP~U#~Z(~U# P~ 7P#7P /U *Z #Zd !_(Z ~_n &_~<Zt~ )d~+dt&d&n~)}(~~(2~~(<~! F~~ PyP~_o Zj_K~#-(ZxPNO_iP\ZFnUasiU2i7PdnnRi@_}}-(nd<-PxPFxzX.7}ija4x^UM_"GFs<TJ/Q d;1KM<|TdFt#&wdWBv;Us[D&T_}z $jb bmNq@kvaw+/ao zdOC%/M8fZ{dNv"\0X# 'ti#D d./;o\5&G>EeZA `WCKhM%t\@DnN*~!Y8CtH%9V+ js$0Ls_g{z2/RD8 e 6s>0HXaGbO148b#;Q|=4jxJY#G;_yt<qynx}s B<klR3dk 8]_#7B_a(<LUV7FeKKFP~NDKK.A2PZBH:KU[PAFZjK?FZtF>PdN GU_FFZnAAUnA>Zd:;Zi#%Zn/0Zd27Zd07Ud-2Pd/3Z_-/ZZ23ZZ##ZZ**UP22PP((UK ZP(%ZK2 -ZF0.ZK-/ZP25ZP-2PP(.UF(-PF/4U<-4Z<*2ZF-7ZF(/U<(-P<!'U7(-Z<*+Z<((ZF--UA-/P<U7Z< !"Z< ZF UF#%PF2/PK < 7PP <2UP2 -ZZ- &ZP- (ZP/+_K- (dF44_F<>ZF 23ZF-/ZF03KK-/PPFKPF%"KK7 2PP/ *KP- (FP2 -PK( #FP( "PK#7/FP(7/FK(-*PP(% KK((%PZ(9 3KP(7/FZ(5-FP(2(FP2(AP((<F2/+<<#( #<<( A<-F<2!F<2#<<22)A2-<2<227-<772#<<<>%+<<<<(( <<<5!$AA<2#FF<4#" A7F7#%<<F<&)AAFF(2FFFA 1<KFA(-<PFF#4<FF- <PP0"<KU2#<FZ<AU-<<Z/# <AZ7(# <FZ7#%<FZ7(<FZ9!(<AZ2%<<d2#7<d7(2<d2$7<d7#%<Fn7!&<An7(<Pn:#(7KnA#/2Px 2-2P} 722Z >-'7U72<P C-, <PF2-<PH7,<P P<2<PD0,<P<(( <P A0)<PA2(<P<-%2P#7- <Z(F+07U#_2FFP(S/;AU-F2-FZ2 H00 A_2U2<<d< K7/A_<#PA/<dF(D?$2_K(AA 2dP(F:)2_K#F<(2ZPA:$-_K(F<((ZP((A5&(ZP((A<#(ZP((KC)-__((UP-%2dd22ZP2#-in<2_P7 (dn<2NN''(dx<AZU/((dxFFWR.&-sFFZU/(2x"PPdW8%7nPPid7/2n"PPnb=+2s,_Pnd<-2n,dZid7/7x6nUni92<@nZai,8<Ox_n}/F<Txdqx5?7Y}ns2H2^np} 1E2min-K2rns.O7|}x|/U2}w2W-}xy-Z(zx/Y(}t/\(u5V#}w2W(n4^^>dS@m"#Y9n"&\5n,-Y2u6(Q9u;(Q9u 6 HDt;(G>z@->?O<39^,9-? m6F.4 |@A'< JA">TA">Y  F>^AFh7 R&r8S&w<R0"$ME01,UA:6)RB:@1Z>:@=k3?JEn4DJOs4IOYs9DTWx3IYYs9Nh[iDNhhdPNhcfKIr^dKDr\gGN wcs>N|hsASr}<N~6N!/X&0S5|2X0w;S0|7X01 I07D02D:%D:#:?-::+059 x&01x&-n&,x+> n&2n-di |Zr Zr Zm_mZ|oZ|r#Zr\KhTF^OU^JPTE P|T@ Pr@; Fh;1F^r,.FY|r''FJrh"$<@hYs<6TJq#7'O@n)26,d521"dB2"_J7}dQ <_O7}_T2xZ[-n_ckZh-sPe(sMg(dPt (X^y(Pd~(Z\x(_K| z(x_F~ u(}dA|s(xxd2d#}nnZ(UxxdZa!OxxZZ_} MnnPZU}(R#iiPUFs- PndPPCs0 Q(d_AKAi( HZP<<<p4R(_U2<2n<UPP2<Cs0 Q#UP7AFx2 U PF2<H{3 W PF7<As2R PF2<:k1NPF-<7d-HF<(2<_# AA7(<Z<<(<Z<(2((FZ7 (2((?Z:7--<Z<<225\'A#<(-2U#< <( (7N2 2( #7K/ 2 5N32( (K#72 4U! ;#2A_>( ?X82<U7(2CS1#<K- <K- <K-  <D& 2< # &: '-# (7 #(( &: '#( #7%( #<*## (< ( -9 "<A# 9F )#(AK *((5D)(2F-( &F 3(# F(7( A!12( -<%(#<*(<-(*A ,(-<%((< (#(< ( -5(< ( />&2< # 2< #2< # 2< #2< #-7  -7   (9 % -<%77 77 7>"2< #->'-A * 7A %2< # 0< $#-<%( 0< $( -<%( 2A(( -<%( 4: --2(5-(-#  (## /*#2-( 77(-<%(4: -(7 #2-: #2222/72272(5--(7#%((+%#-- (&# (( ( #-(2/--</$#A2((?2&(2-( +2#(2 ( 22#22( >:!# A7%A2(2( 0+#2-( 4*#2-(0&2#-# 2(2!!-((2(+((- (( ( -# -# ( *#( (#( 2 "-#-(2(&&2-##227(# #2K7/(2?+) -2<#*22<#*(22# 22A%.#-7(# (( 2!!#( 7#%(( 5%" (( -# (( & -( ((%(-#(2#--(2(-# -#2# (& ( ( 2# <(#(2#(2 <((+<#7- <(7+!A#2-F24&! A#<#*<?3<#7-<(2%<((<(<##<-  <2#<2 "<(#<%<-<-A-(F4&! <7(2 2)-# (2#<( 2(7-2%227*227*22 A3(2F722:+---(( 2# (( -((2$2#2#<2## 2* 2(- <( 9/A#A7<(:1<2(F ! A#2 A# F 7#<%<(<#<( <!A(F*!F-%F-%<7/24,22*20%72#<+7-#2( 2-( #2(/,-(-*((%(#2/(((%-## (+*2( #2( 2- 2&  (2  (22##2*+2242 %$2- (2- ((#2 22( 2 2#2 2( #2/ )2</2<3(<420 )2# 2*"-- (2 7-#2 2#( #2(- (2#(%2!## (&$2<*'2-*274-#-*2-*2#(%2##2##%2"(#((2## 2 2(# 2(%"2#( #2&"2#( #2(-+((*(22# 2#2 -2/'7#-#<!<2 7-#27 022/(((2-*2(%(#%22 (7 2 22% 7- ((&"7-*2& !-# ( #2 # 2 ( #- -*2 //2772 0 +7 2*2 + $2# (# 2-#2 #( -#( ( (<  < 7-%2&- #2 *2#2% 7-%2(<- (2- (2##2#$2#%2 -##( < < ! 7 < < 2 4 /--*(-*(((( +)- #%2 -,2 2  7 2 # 7##2 -)A(%<7<- 22 2%%- ##(-# 2# 7 # < <- (<2/722<2 2# -2/( 41(< 7( 2 ,7( #272<<<<%!72*<(-#2 2 -2 7 22 ++2 --2 7 2-7 2<!-( 22 2 ( 22#%(##(&'- < !2((<&%A(%<#$<FFF 7-#<( !< < 72 2 2 2 # ( ( (%2 #$2 ((( &&-# 2 &$-# 2##(2 #%((((##(- (2 4 .22*2-#22(2+ $(- (2- (((%2-2 -#2# - <<<A# F<<# 2#2#2#2(2-%2*!2( 2/ (7-%20 )<#<A<A( #<*!7-22# 22# 20/22< #2(D0<7F*<D(67A-72 H-:2 P2A2*R(=7 <Z<2 5X# =2 2_-F2 4Z&@22Z(A2 -X+A<2Z(A<-P#9<-U(>< <f* H< Kx-R< 7q:U<7n7R<7n7R(2sAZ0xH`#  (Zn 4Zt AZz ?_~ A_ 7d #2Zs 7Sn AKk<Rp7Zu-_u2Zs>ZyKPuIPtFPsANnAFf7}Fa-Uk4XrAPpDFh<FdAx7WAs2RKp%JZs FPu%MUx#MP{+SU}(RWx!L_x#HNn GUi >K_9<U7 FU2 AP/7I-<A# <C%(AA ( -9 "2 (< (2 -7  2-22%---((& --%2 7<72!&2#2'2-42#)<-4<#(< #<7#27 <(< F$<#< &A-<#1<-< *<#*<&A F &F  F ,K (P1P-P 4K (<F#7P *F )P *F/P(9F #4P/P,K*F -F#7F .K%P )P%PPP/P##4P(4P# 7P4K /P 1U 2Z (Z (d(Z2Z  .d/d)d/n( 1}7((<~(F~!P~_~d i(# ZF:89_xP<FZ(iM[iP-nAWxnn+uJ_n}xAs2Rd((XqEUP<ii44<nZrZ4s}Yn9ZFgSA@")\zrh&fnOEAajPo\[=7D;_nj :aao$gIw}K}8zj4=vr/viH ] 4 >dvLpl? p zk  /`z&b2E,Qv8{D*U)+\1=}Fl4xB:a'3Dg9L5R=7l>L2CF**}B&bP lw0z>.v X$  9f:m XMl'dRvr\8]'%8|0'V6GtFJikL<}~ %o4y<Kx s\Vdi BZd BNU2VKU2jHI(AF>2P8F:2AG7-2FVMB7KtdU<ZaR<Z_PFdbSFUUKFZRHAdUHFdUKKdF<PdF<P_< 7Pd>;P_A <PZ?;UZ74PZ<=PZ-2PZ/3PK24PF-.P<(*P<-.K<24F<03K<-2P<-3P7#*F2*+U27/Z<>5Z2<4Z2+ &_FdP % iK2*nP($iF-*dF -)iA (%nF /+nF2/nF &"iA (%dF +(iA# nF#nF( nF-%iF- (dF7/dA77dF +(_<# Z<(&Z7(%Z2+*_7-*d<%!i<# n<- (dA2(nF*dA2%n<0#i<#7*n<((i7( d2(-)i2-*Z<&"i7#- (d<(>4_7(F<d<(:-Z2(7-Z<(?2Z7-2%ZF24*U<-7-P<2(PF-# PF<-"U<2( Z<</!Z77A2Z22<.Z-27*P(2F 6Z(2P-9Z2<F(2U<A<-%PFFA++ PFF7#%PFF2$PKF2%PPF7 'PFK<#*PPF<&)PPFA(-PPF5 %FKK-(FFP9*$ K7K((P<P/+PAU7- PFZ* KAUA#/F<Z<(( FAZ<-%FFZC*.AAZK(7<<ZP27 A<ZK22 F<dF7*F<dF7*F<dF7*FAdPA/FPn NA-FFnKA*FPn NA-FKiU<7FPnAA FFsAA FFx <<FFx(A-FF9:KAA<#P< H>)UFUA4ZP N<0UP# K<-PP( PH, UP#PP((ZP(PK*#PP- PK*#ZZ2 FF##UZ2 FK (dZ< MK'$ZZ< UP-%ZZ< SN,$UU7 ZP2#PP<ZN3!ZP< iPAZZF bP:PPF dU9#PPF _N8PPFUP-%PPPPW$/K_UUd#9Fdd(S_ #5Fid-#Ui >Fnd2(UnCAin-#Ux#M<dn2(fz)G<is<(x}9A<dn<(dv)D<ix<2nx 2A<nxF2gu,A<}A-dx(F<F2gx+DAxK7d#P<x"P<s 3F<1Z<}<C<6ZF~<E<};_AtFF<x@ZFs} 4C7}JdFs2H2xJdFx 6H2TnU}w2W2^xZzx/Y2m}Zx(t(d2rd%l.f<wi#c4i<|d#`6j<|d(e/k<n$e2h<n#c4i<x"`6i7}-^/s<4\+y27T-25?92"28>2"<B221KE%2@G@+#EFB*@:4:J<.<T7'CY<C^9Im" F> |,?Dw6<F |@CE!O'PC0^'MF&c 'FM&h,IM&h 6PK0rBc>5|"On9D,Hl8D1Js2D,TdF?6YFf:6`\TIEhnFNThx<NOmx>NThx<NTm}9NTr{>N^wsHN^|}A] h4brAgr }Fbr @ br 9l|8g+  7l&B]! >X|E I'sZD|%xV I& KN&B?+C:&5 5+400.!}&&-$n&&(x&4n/n  2d&n  d|#d|4dr9dh<Z^3Z^/ ZTh+UO^#ZJ^#dJ^Z@[ZEYZ|6TPr1JPhr"GK^wh@FJhT9 <@^E,}<6J6 x7'E,s'2,n)7,s,<"x,<",<x.7n82dB2dL(}dQ 7_O2QO-F[(sKh(xiFtz(xkNn(niKr(xdbMx ~(i_Py(d_D s (n_U< f (xZP\:h #}_UZA n xdZ\D r snZKZA n ndP<W? j#d_A<U2\ZP<2Z2_(_P2-Z-ZPF2(b%V -UP72Z-Z(PP22X2^-PK2-K7 \ PF((Hs+O(KA#(Kd> (<2FdA#<<<d( F<<:_% B72AZ9<( CZ8#7(KZ4(2( <\ >(#7 2U#<(< <R4(-AU4((AX7((# 7U 9(( AW6(#- KZ4(( IU 0#2FU2((2 KW 1(AU4( ?W7#(<Z<(( <N0#( 2A(( /F .(# <K- ?K + AF% <M/##<P2( 9F )(#AF%(( :F )#(<F (  5F+# 7P4( 4M 3# 7K/  0K 3( 2K 2  7M1  AP/  IU 0 FP - ?N.<K- ?A!7F*>H )AF%<D&##7A %( >A"-FA%2AA 2AF%2 :F )2<F (2AH'2<P22 >P12<F (2>D%2FA%2 IC'2<A#2 :C &77F*<7D (<2A(<7I-<2F-<7F*7-A *( 2A(- (< (( 2A(- 7F*2( AK *-#<K-((?M-((2K 2((>F'(#7A %((:F )(<A#(5F+(2F-(>A"(K<-(<:(<<(F<((AF%(CF $-FF##2 MK'$2KF( 2DF!$22F-2 2A(-(7 #(2A(( AF%2 HD& (FA%(FI!&- <F (2 HC&2(F<(2( D<&2F<(2 <5!- -22 477<A#2(FA%2(A<#<( FA%2# K<-2 FA%7KF( 2FF##7#AF%<(F<(7-<<22 ?<!2- F<(2( D:'(( AA 2(A<#<( K<-F( D<&<- 2< #F2 <7 7--2<(+-7(22<(947(<2#2(94<(77<(74<(-7  <((+27((-22((797(#A7%<(:2!<-72<2:2!<(<2#<(<(( 2#<#*<((7## 2( %(2 #7%2 #4 "-(7 #(/-(--( 20-2(2*2-%2 4%-(2 ( -0( (-(%&( --( &&( ( ( #(( ##( (! - # 2  22(2#2 (<( F # 7  <  <  <# <#< - &<2*< 2 #2# 2 <A <  7 #<< 2 <<&-222 2 2  2 2 -(  -2-(((##-# !# (( ##(   #((  ##  (   (   (  # (2 # ((( - 2  ( 2 -# ( ( ( -2 #(-2#-2  2 (*2 #%7< 2<<<7 <7 <AF FF 7 2  <  <<< < < A F << A < 7 22 2  -  - #2 & 72<<2<A < K  F <2 7 ( 7 2 - (22- 2-(-( 2 2 < < - ( -27 ( (((##2 #22 2 ( 2 ( ((-2  -(72-2 < < A F  F F A <<<F F F< F < 7<2<<<< < A< F< 7<  AF7< A< < <F < FF << FF  A 2  << < < <%<A F  < < F F 72 -(2 ( 2 (  ( ( 2 2 22-  - (2 (  (  (  2( -(( (-(( (-(((- 2 2 2 #(- 2 #(- 2 2 2-( ((  #( "!(#(%( &&&#(%/*, -% 2&,7(/( A(4( A-7(D5<( <27( :26( 274( 0-.- -(*( -%- 2#2 F*8( U<H(dMX( nZd( uZg }dp kus}%i{(i}(g{(_s0Ph(}Ui z\k}dp {bnx_k (Wk -}Pf(\p #_p s\gnZdnUa#iFW%kFX(d<P+]2G#Z7H(X0D#Z7H-d7M(d<P -k>T(iAUA_>KU /<N07F*4A '2A( 5> #-A * 2< # (2 ( -0(2(( /(((((&(( (((#( ##( - 2  22 2  2#2<<<!<< < <("A%F(K#%<#<%F(2F7>F(3F%F!F F *F (<F%9F(>F0F#9F!6K 2P,P*Z*P*Z*K*P(9K->Z(#5U(2P(4P#2P2 *U  Z +U(<P%;U#7Z ,U#9P/Z# #d( 3d(2Ad(-;i(-<d(!5d#%d( 'n((d(#7_/d 'i# n(  x(%< #F #P,Z2d,i x i2 (#nZD5<s_PW<iKZ}ZnUan Ck( Isss99d<(sK0UUFh_9<nXp8GsF n, ,cqKcJ#d@84hw^Fi`d&;Hy3A0qcFz` bwaY){ ]&#[fLfd~x>p p)Rnlj:  o (;O'%(+R'B<v4F$0a18I?4i=:k1.Nv4L?r3(R{CeDp,&N>j?C?#s=+j&DiVb `R)\:?UXz>m9l+|~<zJO(3&"#VT7onr"}YB_wtFsZn(}9`7zfVnj (QZ U<Va^#<j_ Z2F~\O<U.i-R<PLd2K<Z[i-R<Ztn#\<di_<dbZFniaFddbFs__Fx][PnZ\PnILUsKMZnDCZnA9ZnH:ZdPAdZI;_UKAZP:6ZP77ZF99_P77dP02dP22dP56_P24ZP-0_P-2dP*/UK-2ZF01ZU22ZP/2ZK-2ZP(/UP(PF(UF#ZF*.ZU2/ZP - 'ZP2(ZP4 /ZK -*ZF 01ZU77ZP97UK74PF 23UF-/ZF &,ZA-/Z<4;UA7<P27;P279P2!#P2P2 #P2P2P-(*F( 22U- --P2--Z7((P<22P7((P2%%K222P2--KA#((Z<(23P7(77P2(-/ZA(P<(!PK((*PF(PK#P<P7(P<##KA((-F<#%K<-#%P<2/0KA2<>FF223<F2(*FF2&)KF<#P<<#$KA779FF223FF2--FF2('KK2# PF<#PFA# P<F(U<A( #P<<4,KA<F>F<<00KFF24PFF2/PKFPPF+'PKKPFFPFK PFP(*UKP2 -ZPP7,UUdF(2PZnI&6KPdA2FFZ:!)FPi -FFn & FUi # FPd 7 'FKn 2(FFn 7#%FKn </FFn -  FF}2#FF7#%AF}7#%<Fx 7!&<F}7*<Fx:+AFA-* FFF4,FFA2(<F:4 FP# 77<P( ?A!KU2 7< FZ2 <> KZ2 FA%PZ2 PD.KU7FA%PP2 PF-U_< PF-PZ< PI+!PZ< PA/PZ< WD5KUA ZA9FZ< XH4FZKPF-FZPPP((F_UKP#*FddP\ "4F__#(Zd (7Fdd((fd41Knd-#_d-4Pxn2(np69Pnn<-in29Pnx<2_l )<PsxF7Zi%<PnF2XqEFiA2_n(>Fn"F2ds*AFx"K<dx(FF,Z<u 4GF}1UFnx 2AF6ZFz9EA}6ZF~AA<@dPv8R7xOsUx|/U2^xZn#%Z7Y}_n#%Z<^ds!})Z2h}d}w2W2hdn;V2rn eFU2|nd=^7xc<a2x"`6i--^/s/N6|#28>(+5E((3H("57=(,7;96?A06<87@?09J2)FT9-?Y7,A^"C-7 h'A'< h,<Dr6 <H|@? L J7UT$7[c1AWh;PM+r@_A0|,Lf@:,Oi>:6Mi=:1Oi>:6V\O56^dK:@agI?O^iFDTefLDYhiKDTrpIDYrsFDhmsCDhm4Nr3S|}HX|{LI |}KD|F N| A D| =DF : ??<:&F:! C$:&A"?+C:0@ ?+/':0;++9"x;!s!! 7&Ax! <xDnCx9n -n<n|Anr?_h9Zh4Z^w4PT|4PO|2ZTw'UJr-ZJf.U|1Y*Frr,T!Fhm'TF^|h"J%KOwYE FJrT1u #F;TE "n#F,J6i%F"1"Z/F,k#F,x.F,s6<d32f22d32i@(dL2ZL#PLKW#PV(MS(PL (CZ! (x<`#} (n7\){#xd7^(z ndz<hy#d_7c%x(ddq>pv(}ddd<~n(xxZZf2e#xiPPi7|k2ndFPd-_(__FFi( \2dd<Fg%!X-_Z<Fn(U<dZ<Fp*T-UP27x|/U2PP22l"%X#PK#2d# U(PF2d{&I(F<(dx(F(F<(_x#H-K2(_x#H2F2(dv)D#A2#Zs F<2(XqE#-<7(PnF(2<2(Nf?(-A2#Pd<(2<2Wb &6--7#_d-42(2( Kd>722#FdA<22 Mf?7((Pd<2(2R_ "6<22ZZ--2(( NW "02((KZ42((K\62#(KZ4<(AS2<(<P2<(AK *7#AK *2 FI!&2 AK *2 CP .7# AK *<( AK *7# 7K/2 KF( 2UA42KK%%-(7F*(2 <H *## <P2(( ?P07P45K0#<K-(>D%#<A#:C &<A#5I.7F*2? &-<%/5##2-(0-((-(-4--7  20< $-2< #(&7 $-7(20!2#- 2&--(-(( ( (( ( (-((-# -2(2(#-# (    (  ( # ( ! (##(#!(-( ((-  2  - (  #  #(  ((#    #  ( (  ( (( -   # (((  #-2 #(             +              # #        ( #     #  #    #(*"(-%(( (( ( ( # # 4#" # A2((:+$- -(2+! 2(2(-( (<.(</(2% #7#%25##-#2#(>(* (A2(7#%2((2747772792<7 2C2*2722(>2%2K22 (F-/ 27#%27(# 77- 2A-* 7<(( 2(C/+ 2<2#2?0'27- 2<7 7<-%2C*.7F-/ 2C+- 2K-4( K(7(<(( 2F2-2<2#2P27 -U2<( I/1 2A2(2D5)7F-/ 2?0'7(A-* 2(:-#2(A-* 22A2(<-P74<(P55 <P27 <_<A <_A>2U5: 2F7*<(N<0<F7*<F9)A#F<(F(FA%F(F<(F(D:'K-F7*F(U98A(P74F(F0. F(A-* F2K/3 F#F2-F(A4'KA<#P(M24 AP27 FS77 KU79 PF2-F#<-%PP27 KZ7> <a0IK(d2KPb9EF_A>P]F:FZK4FZK4KZF7ZX<:KP27 P_4EF_<A F_C=AdP<FiKCFiKC<b?B<P74<M>.7KA*<ZA9AdFAF_??<Z<<F(fHBK_A>FbC@FUA4FKK%%F2KK%%P2dK>F7xFU F(}FZF(xFU F(qFN K2nKHF2fM?K(iPAP(nUCF(dU9#P(bI=F-dK>F2ZD8F2ZA9F2d?D F2dFAF2dH@F7_P7 P<kW?!F<}_M F<sZF K7sZF F2lPD<2nKH<2XF5F2_F<P2nCL P2}KW P2q?QK-s<UF(fAEA#iFFF(dACK-_A>P2XC6F(dP<P(sNLF#}FZFvFS P-xFU F(pCN P2xFU P(oFLF(iAH <(f:I<d<F F(d9GKi<KP(d5IA#d2KFd0LF_2FF_9B K#ZA9P(d<F P_<A PU79 PZ-CF(P&=F(P(<P(U*@P-d7HF2_7CF#Z<<F(_:B A_<A F(_2F<(Z2AF(p-YA#7kF(s0[A#n2UF(u0]F(s-\F(g-PF#d(PFU#CA#P#>P(\&IF(d#RP(d*OF#n7RFl4RFi7MPl2SAi2PF_-HF#Z(FF(X(DKZ(FP(U(AFUFF(ZNAZMF(NDF#A9FH;K#PCP(I;P(A4P(H:PF#4F(\#JU(d(PZ(X#FZ(_#MP(PAZ#PAZM?ZK<ZR#@Z#U#CZ(Z*E_(d2Kd(aA@d(xKRZ(_F<U2ZA9P2]?=P-Z<<P2ZA9U-_K9P2XF5K- UK/ F( ZK4F#ZP2#F( XP0$P-_U4%P( \P4"P_Z2*P(XZ+.P(PZ #2P(DW5U-KZ4Z2 PZ #2P- P_ 7P( \d*6P( dn -<Fdx(FF(d#P<( b !Q7 d#P( Z4a# -U< f (X9e2_7f 2_7f 2_7f(\5c7i( \  2d2dA_2a FZ9f7UA k  <U? i 7Z7d <Z-Z-Z2_2P5 ]7Kx-R 2S}*S2P2Z 2U*T 2U-W (PlD(PZ #2(MZ 3#ZZ--fd41(}nF/(nn77(ds*A (Sb"8-ZU/( 2ZU/(#UU** aP9 #_F<(W<9#_2F_9B (d<F (P(<2K<2I:< A2F 7+F<4F 5 /F < 7F +)A#(< $A%F(7A2><!6< 7< 3A-F</J<7W<- P<2R<!DA9F #CF<P ( HA - P< - LK-KP-KU#CZ# AU# APCPCPEP9P@U9Z!DUAPCPFP#J_##FZC_#CPCZ(#HP#IZ(#KZ(#JZ-#KZ(!GZ2HZ( JZ(#MZ&PZKZAZ#9ZFZ<Z";_#!>d(G_##Md#Pi#~#Pn(&Cn2+Ax2)?n7+Hn2?x<<x<4s7#9x2 ,?A29F69K 2AP9=_?7d*1n#d2n_n }<(2 d5&s --A++ xF2P#>ddPCeKx_|z 2vi~#;L4dhT&O(@ir {~+"6LZ:vQ[ t(l&rB l<F zjp_;*?dH%Xy*.R{tX52xq*U)gD4xB0'U{4V0%V v4`)]/`yB#Xse0# l{[RaR:D@rX`#>v0cE T6}G'80fbKVYKeht,7e|G([tbdinV>j2P[zp[<`n~2`<ji7KjF` s<PtCf nAZAj kFd.UltFZBZtsFdVZqtKdtZtsPn UtpPsPtnZXeyZsP[zZx I] vUF` sZKV z{_A`pd H^ udxF[ u~dxF[ u~dsFepdn7tans#Mnx/|Ys}(Rx&Qsx#PnxLni&Knd$Isi&Kxn 'Lxi~(Mxd #r$Xxd #o&Znd (h$`|xd 2`iyxn+g"b|}dt-Rdw/Oit-Rdr,T_#j(\{dt(U_(tZd(wXZ#y!UZ*p]}Z-e!d{xZv'TsZt(Und(*h"a}n_(-e!d{nd(&s!Ynd##t#Wnd!x#Tni(~(Mnn(%Qsn((~Uxx(!~ Qsi(t(Und(t-Rni-~2Hnn2r3Q|ss2j2Wvxx2p7Px}n7yj<Rqd<~`2_osd<(`(dtxd< o)Xid<(o!\nd2&s!Yid7-o_nd<%u!Xid<#t#Wdd<+q]xd<#~RxnF~#PdK(o!\xdP/maxdP-janP#w"VxdK#o&ZxnF!q'XxdF 5CxnF~9E}_F~<CZP ~7F}dFy+PxdP#g*^xxZFt(UxZPv'TxZP(tZxZP(tZ}ZP(tZxZP-l`}ZK-o_xdP-m`}dU-t\dZ5nc}_Z-t\xZZ(r[sZU(o!\nZP*r\sU_-o_xdd+vZ}dd -yZdd t(Usddy0Mndd %j&]|iZdt-Rddn v'Td_n #y!UdZn w%TdZi Ae ndZn2oad_s(tZddx(q [ii}(o!\nn <gjnsxF` snxxFepnx}K`unxDb qsx FepxAj kx}(<o fx(<o fs}(Ae nnx(4|\ns-<yanx2 7y _ns7 #Hnn2 -~Wns2 -~Wnx2 -~Wnx22y\nx< 4rasxA<jixxFFc qxxAK[xxxFF] tnsKAe nxxP(<hjnxK(Aj kxxP(>j jsxU(<o fxxZ(7y _s}Z(-<~_nd(2>zbx_27Pjsxd22Isksi77Kyixn<<Ivisn<<A_nxF<A`ns<AKyinx<<UjunxAAdenxFF_h{nFFZounPP]nwn_P_oxn"dPNgs'dZZ~nx,nZWks,iZZkn6nd_yss6sd_~pn@xdnoiJ}dxjdJxnnt}iTinyzn^n_onhsisnhxx{~im drd}dvsiifdum_xnZ}u_zd _"d,U'(P,5PE2PJ-PO 2PT7A^7<^"FAh'U|Fr@UzF|@Zy<J_o<!T dm20^ie20cn`(0hna(:w"x[(D,V(?6OD6ED@8 NJ<$NT;#XT?"]^=-b^24gm$2 lr)3qw,2l|36l|17l-;q"Fv#Gv&"Fv0J0W:Q:&Rv:&Tq?!Uv:&YqN5dvN0QlI0 MlD0 QbD: RbD:WbN:\bN:f]S?kbND obNIkbNNnXDDnXDD kNDD dD:: e::?_0D:^+:0Z:&Z5&Z0P&K,A64?*=-|F+|T-rU}.rVz/^U|.^Y}*T}d}Jir@by{ sww6Unh|h,Uxn^wc"UpnT^TR|iOhO"UdJhJ"D|dJ^@7pd@J65v#i6J6-u(n,@"%{#n"6#zd"u-s'x2n"}2n } x2nxu7nxz2nzz<nxe<nihAn_jzFnah|KiZjxFdZjxKdPtnPdWjvPiZ[PdW^|KixUVFZxxP^yPisxF` sPdxxPT~|UsxxKV z{ZnnnRT}UnniPQyPZddIS{wZd_iFQztZdxZdHM}q__}UdFL}odZxZdAOyod_sUiFGjdZnPdCJ|kdP}nU_FGjdPxnPZCL{mdZ}iPZFBedZnPZI8\dZsnKZF~8[dZndFZK6[dUnnFPF~8[dZndFZF:]d_sdAUF=`dZndFZDw3#UdZs_AUAo.(NndnZ<PKt)!Nd_iU<KFt.#QddnZ<FDt0$R__nZAPAt3&SZZnZ<PFq+%NiZnZ<PAo.(NnZnZ<P7m6.QndiZ<P<j.-LnZdZ<P?h)-HnUdZ7KA`0?nPdZ2FAe$-Dn_dZ2FFe+BnddZ2FA[2:nZdZ7FF[08nZdP2F?]2=nUiZ<FA`0?nPdP2F:Y7OUF2<MPF2<NPF2 7KPP2?PPF27HPF2<LPF2 2CPF2 AMPA2 <CPF2 ?DK<2 AHF<2 :@F72 7>F<2 <EK<2AKP<2>DP22KKP<2 RSK--KHF2(DDF7(<>F<( A@FA( <<FF( AAA<( <<<<( FEA2FFF2? :F7# <4P<( < 7K22/P<<4P<<4P2 H>K<# F<F< F:F- K>F2 M@<2 K<<2 I 9A2 F(2<2 D5<72*F<9/77A9222 +<2- (<2*A-(#F(-F(##F(7#%F-P#>F2R#@72U-><2F(2A-A(-F(?** 7-2-<2F7*7-AA F( <7 <(A7%<(A9$7(<7 2( 95<(72<(</$<(72<(<2#7#F7*2H>)2K<-2 <2#7 2-< 54< 7< <A9$-K<-2:727< 29>!7#7F*<((4C)<#7F*<(>A"A#<F (F>M.F<K-F9M0AFP -<IU 0<FP -<KN$(<FK (<AD#<#FK (<( 7F*<# (K#7< 4M 3<# <K-<( ?F&<# 7A %< +A +< (< (< 2C*< (P(<< -R%;A -U(>F >Z;7 K_9< AX7< 7P4<<R4<#7K/<( FK (<PP((<7K/27F*2 :U827_(C<2\*C<(_7K24_+E-Ad#C27d-H72Z(A2(K#7<(A-<4K1-2U#<22U#<22U#<2/Z+B77_(C< -a4J72_-F27a*E2<d( F27d-H-<d( F( <b& D-<_# A22Z(A--U(>( 7_(C-A_>2 :a' D2<d( F2<_# A22_-F2 (]5I2-Z-C2%Z5G2#_<M(-Z-C2-d7M2 +d9N2-i<R2/uF](2n<U2(qI](2sAZ2-l?U--i<R(4f2L-<d( F2+d9N2-d7M2 -_2H( #_<M2 ]?N-#Z7H(*a7L<n2P(9l3O(Ai( H(+f;P((iAU(*g=R(2n<U(2k9R2n<U(2n<U-2n<U20sC[((nFZ(nS`2(sK_2dKW-#Z7H(*\2G((Z2F(U7FU7F(2a/H(<x<Z(5s>X#nK\/n?V(nFZ!gFV#_KU(aHT(#dAR(dIVdFUpUb((xPd(%uPb((xPd(#vSd(xZi(s_i-sdk2(uMa#7xA\%uPb((xPd(!xWg#sUdsUd#sUd(%vQc(2n<U&uOb##xUf-sF\(nFZ!iHX(nFZqSbiU_n]enZd hDS0 iDS0 nUL:CSDERIVED :US :UL:DS1000: SH MEDIAN BEAT :SQ:SQSH 5.6.3-9-1 SHSCPECGSH1.3 LOLead I (Einthoven) :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US :SQSH 5.6.3-9-2 SHSCPECGSH1.3 LOLead II :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-61SHSCPECGSH1.3 LOLead III :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-62SHSCPECGSH1.3 LOLead aVR :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-63SHSCPECGSH1.3 LOLead aVL :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-64SHSCPECGSH1.3 LOLead aVF :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-3 SHSCPECGSH1.3 LOLead V1 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-4 SHSCPECGSH1.3 LOLead V2 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-5 SHSCPECGSH1.3 LOLead V3 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-6 SHSCPECGSH1.3 LOLead V4 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-7 SHSCPECGSH1.3 LOLead V5 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 :SQSH 5.6.3-9-8 SHSCPECGSH1.3 LOLead V6 :DS1.25:SQSHuVSHUCUMSH1.4 LO microvolt :DS1 :DS0 :DS0 :US: DS0.050 :!DS300 :"DS0 TUSTCSSSTOWp PFKPZ<( PFKPZ<(P2APZ<#U2CPZ<P7CFZ<F7>FZ<K7AFZ<K<CFP< F<AFZ< F<AFZ<KFHFZ2 PFKFP2UAKFP2P7CFP2K7A<P2P<FFP2P7CFP2K7AFP2K<C<P2PAH<P<F2<<F2F(7<P2K2>FP<F-9<F2F-9<P2F7><P<A29<F2F2<<P<P7C<F2K<C<F2 KAF<F<K<C<F2K7A<F2F-9<F2F-92F2A-72F2F2<2F2A-7<F2 F<A2F2F7>2F2A(42<(A292F2F7>2F2 F<A2F2F-92<( A7<2<(<(22<(<-42<(A292<2A-72<2A(42<(A292<( A7<2<(A292<(A-72<(<(2(<(A-7(2(A-7(<(<-4(<( A7<(<(A29(<( A7<(<(A(4(2(A-7(2(A29(2( A7<(2(A<>(2(A<>(<(A29(2(A29(2(A29(2(<-4(2(<(2(2(A29(2( <27(2(A29(2(A29(2(A-7(2(A-72<-4(2( <272( A7<((<79((<79(2( <272( <27(( A7<((<(2(( <27((<-4((A29((A-7((<(2(<-4( 7-2((724(( 7-2( 7-2(724(<(2(7#-(7(/(2#*( 2(-( 2(-(<(2((2((2#*(2#* 2(-((2#*(2%2#*( 2(-( 7-2((7(/((2-/( 2(-2#*7#- 2(- 2(-2#* 2(-2#*7(/7(/2( 2(--(*2-/7(/2%2#* -#( 2(--% 2(- 2(-2-/(#%-% 2(-2%2#*7(/ -#( -#(-(* -(* -#(2( -#( 2(-7(/7(/ 7-27#- 2#*  2(- (#% (#  2(- 7-22-/2( -#( -#( -#( -#( -#( -#( -#( -(*-%2( 2(- 2(- 2(- 2(-  -#(  2(- (#-%  -#( 2(  -#( -%2(2(7(/ 2(-2222-/2( 2(-2#* 2( 2#*  2(- 2#* 2#* 2#* 2(-7#- 2( -%-(* -#( 2(- -% -%2(2#* -#( -#( 2#*-%2#*2( -% 2#* 7(/ 7-2 2(--% -#((#%-%2%-  -#(  -#( -#( 2(- 2(-( ( -% -#  2(- -%  -#( -#( 2#* 2#* 2( -%  2(-  -#(-% (# (# (# -(* 2(- 7-22(2#* 2(- -#  (#  -#( (#%  -#( -#(  2(-2#* 7(/2#*  7-2-% 2(  -#( 2#*2( 2#* 7-2 7(/  2(- 2#* 7#- 7#- 7(/<(27#- 7#-7* <#/7(/  2(-  2(-2#* 7-2  2(- 2#* <-4 <-4<-4A-7<#/<(2 7(/ 7#- <-4<#/ A-7 <27<(2<-4A(4A-7(F7>(((K7A((K7A(((P<F2((U<H(222dPZ(<22(nFZ2<22nZd2F<2nZd2F<2sZf2F<<x_k<FF<x_k2PF<}_n2PF<}dp<PFFnz<PPFiu<PFFnx<PF<nx<PFFix<PPFiu<PFFs<PPFs<PPFs<PPFx<PPFnzFPPFix<PFFn}FZPF#sPdZP#PdZP#PdZZ#PndZ#Pxdd(Pxnd#Pxnn#Pxnd(Pxnn2~Fxnn-~Fnnn(t<nnd#t<nnn-j2dnd(t<dnn#t2dnn#t2dnd#t(ddn#jZdd(tZdd#jPZZtPZdt FZd~FZZ#~<PZ#~<PZ(<PZ(<PP(x <FP-n <PP(s <PP2i <PP2nFPZ<iFPZ7iFZZ7iFZZ-iFZZ<UsFZZ<PnFPP7Pk(PPP<Fd(FPP2xF_(FPP(sK_(FPP-nAW(PPP(nFZ(PPP(iAU2FPF_FR2PPF_FR(FFFZAM(FF<UAK<<< PFK<<<K<C222 F<A (22A-7 ((( A7<(( <27((2-/ 2(-( (                                        (2((<F  (<P( (Fn(2F<<FPi\Fd nxsFP<2P"ZFZ,xZ-iZ"nKPudd7iZ6(`2nP^(L<x<T<87~"Z/VhEi9$0m4Nv-~d>'V2X@uU6\fYRWV |NU$K4 B\>Nf'C ,M> 1U\Z$4OtKAzLRTXUSvtacQMbhllphDPl^bDzc8ZnJb&p^?ZgTl" \OL_Uh*,li+\`n*xs&5^&DpKKl\lBwzDYERX6 n4  \f$@v.xZB|JnH`Je\>~*ZTnP*$>iPAVfZ-CtddF9FF<4 227*((</82(7#%(`<22-2t F2<<(F<7A %2PF<<22ZFA<#<2ZF<7 <<Z<72F<Z<A2(<FZ<<(( FFZ<7(# F<P27- < FF27(# < FF2((<FF2--2FF(((2F<(((2F<((2 2F<((2 2(<<(#2 2(<2((-22<2(22<2((<2(((22((<2(#<2((<<((<2(<2(F<(( F<(F2(F<-(P<(#- P<( P<((P<(((P<(P<(P<( P<- (P<2%P<2(P<2%P<- Z<-%Z<((Z<-Z<2#Z<7*Z<2%Z<2%d<(-#dF(7(d<-(d<2%d<2%d<2%dF7#-d<2%d<2#dF2(dF(-%d<- d<2#d<2(nF2%nF(2%n<(#2 n<(2%nF(2(nF(2#nF(2%(xF(2(xF(2#xF((#7%xF((2#(xP2(7#-xF2(2((xP2(7(xF2(7#-(xP2(2(xP2(2(P2(7#-(xP2(A#2(P2(#7%xF2(<#/P2(<(2P2(A(4P22A#2P2(#A/P2((< (P2((< ((P22#<*(P<2F(7(Z<2(F2(Z<(#A/(Z<2<-(Z<2<-(Z<2A#2Z<2A#2(Z<2F(7(d<2#K(9(d<<#A/(Z<2(F2(d<22F-Z<2A#2(d<<#F#4(d<2(K#7(dF<A(4(dF<-K4(nF<(K#7(nF<(K#7(nF<(F2(nF<(A-(nF<(K#7(nF<K-<(nF<P2A(xPF#P->(xPFK-<(xP<#P->2xPF#P->(PF#P->2PF(U-A(PF2U#<(PF#Z7H(PF(Z2F2ZP-U(>2ZF#Z7H2ZP-U(>2ZP-Z-C2ZP(Z2F2ZF(Z2F2dP(U-A2dP-U(>2dP7_(C2dP<d( F2nP7_(C2nP2_-F<nZ2_-F<nZ<i-K<nZ7d-H<nZ2d2K<nZ2d2K<xZ<i-K<xZ2i7P<d7n7RFd2n<U<d7s<W<d<n2P<d<s7U<"d7s<WF"n<x<ZF,n<s7UF,nA}<\F6nA}<\F6nAAaF@xF<_PJxK7 \PJx<FdPTKAfP^FAdZ^FAdZhK<aPhKFkPrU< fZ|Z<iZ|ZA nZdA|sZUFpd"_F~ ud"dA|sn,iKrd6dKw }n6_Uwn@dUrnJiUm nJsPenTsPen^sPenhsUcnh"xP`nr,xU^x|6xZ[x|6ZQn@ZBxJZBxT_Ex^i@x&hi;0rn=x0|i1x0|s,Dn)D"s'xN,nN,xX6"sX6's X@,xbJ;lT@l^E}%~v^J#~v0hT~0rY~:|^~D|YtN^txNhjxX&m%jxX&rjb0w jxl:w`xlD|`nvD|VnvNVnvNVxX#VnbVnb,Vnl'Lnv)Lnv.Ldv3Ld1Ld6Ld)Bd,BZ1BZ38P88Z=8P @8Pv=8Pv =8Pl68Fb 88FX 88<X88FN38<Dv 6B<:v 1B20l1B<0vb.B2&vX,B2lX )B2bN "B2XD B(N:L(D0|L(:&mL0mL0hV(&cV|^ `|Y`hT`hJ`^EjT;j|J6j r@,'j h6',t ^,}"1t T"}6t J|"x;~ @rs B~ @hiJ 6|^nG ,|^iL "rJdT h@Z[T6Uc T,ZcJ"_}c6Uxo,P}r,Pxt"PxtKn~KiPd~Kd<iAd<i<d7Zu2_x-Zpx2Zsx2Unx<Kix7Pkn7Upn-Zpn(}Uin(sK_d(sK_d#sPad#sPaxd-sF\xZ(sK_xZ(sK_xxZ#sPaxxZ#iFWxxZ(d<PnxZ(d<PnxZ(iAUnxPiKZnxZ#iFWnnP(iAUdnP(d<PnnP(d<PnnP-d7MdnP#_<MdnP#_<MdnP#_<MddF#Z7HddFU<HddFUAKddFU7FddF#Z7HddF(Z2FddF#_<MddF#_<MddFU7FddF#U2CdxZFU7FddF#U2CZxZFU7FZxZF#_<MZxZFZ<KZxZFU7FZxZFU<HZxZFU7FZxZ<U<HZxZ<U<HZxZ<#Z7HZxZ<#U2CZxZFU7FZnZ<U7FZxP<#P->ZnP<Z<KPnP<#Z7HZnP<#U2CPnP<#U2CZnP<#U2CPnP<#U2CPnP<#U2CPnP<U7FPnP<Z<KPnP<ZAMZnP<Z<KPnP<#U2CPnP<U7FPnF2Z<KPnF2U<HPdF2U<HPnF2U7FPdF2#U2CPdF2P7CPnF2P7CPdF2P7CPdF2P2APdF2P2APdF2#Z7HPdF2Z<KPnF2Z<KPnF2UFMPd<2U<HPd<2P<FPd<2P7CPd<(P7CPd<2#U2CPd<2U7FPd<(#U2CPd<2P7CPn<2P2APd<2PAHPnF2UAKPdF2P7CPd<2UAKPd<2UAKPd<2P7CPd<(K-<Pd<(K7APd<(P7CPd<(K-<Pd<(P<FPd<(P<FPd<(P<FPd<(U<HPd<(P<FPd<(P7CPd<(P<FPd<(P7CPd<(K7APd<PAHZd<(PAHZd<(P<FPd<(PAHZd<ZAMZd<(ZAMPd<(U7FZd<(K7APd<P<FPd<U<HZd<(P7CZd<P<FZd<(P<FZd<(UAKZd<(U<HZd<(PAHZd<(UAKZd<(P7CZd<(PAHZd<(PAHZd<( PFKZd<(PKMZd<(K<CZd< PFKZd<(PAHZd<(P7CZd<P7CZd<ZAMdd<(UAKZd<(U<HZd<(U<HZd<UFMZd<U7FZd<(UAKZd<P<FZd2U7FZd<U7FZd<P7CZd<P<Fdd<(PAHdd<K7AZd<K<CZd2K<CZd2P<FZd<UAKZd<P<FZd<K<CZd<K<CZd<P<FZd<U<H dd<(P7CZd<P7CZd<(K7AZd<(P2A Zd<(P2AZd<(U<H Zd<(P<FZd<(P<FZZ<K2>ZZ2P<FZZ<UAKZZ<PAHZd< PFKZZ<P<FZZ2U<HZZ2P7CZZ2P2APZ2P7CZZ2K7APZ2U<HPZ2P<FPZ2UFMPZ2UAKPZ2P<FPZ2P7CPZ2P<FPP2PAHPP2K7APP2K-<PP2P<FPP2P7CPP2P7CPP2P2APP2P2APP2P7CPP2P<FFP2P7CFP2F2<PP2F(7FF2#K(9FP2K<CFF2K7AFF(P7CFF(P7CFF2K2>FF(K7AFF(K2>FF(P2AFF(P<F<F(F7><<( F<A<F(K<C<F(K2><<(K7A<<(K7A<<(K7A<F2K<C<F(K7A<F(K<C<F(F-9<<(F-9<<(F-9<<(F2<<<(F-9<<(F2<2<(F7>2<(F7>2<(F2<2<(K7A2<(F2<22(F7>2<(F2<2<(A(422A-722(A2922(A(42<(A2922( F<A(2(<(2(2(A-7(2(A-7(2(F-9(<(K7A(2<-4(2A<>(2F7>(2( A7<(2( A7<(2(<-4(2(7#-(2724(2( 7-2(2(7#-(2<(2(2( <27(2( <27(2( <27(A-7(2(A29(2A-7(2 <27(2<(2((<(2(F-9(<#/(7*((7#-(7(/(<(2(7#-(724(<-4((724(7#-(7#-( 2(-(2-/( 7-2((2#*( 7-2(7(/( 7-2(7#-( 7-2(7(/(7(/7(/(7#-( 2(-( -#((724(<-4( 7-2( 7-2( 7-2( <27( 7-2(7(/(7*7*2-/2-/( 7-2(7#-(7(/( 7-2( <27(7(/ <27(<-4(7#-( 2(--(*2#*7(/2#* 7-2 7-2 7-2 7-2 7-2 7-2 2(- 2(-2-/2#* 7-2 7-2<-47#-7#- 2( 2(-7247772-/2-/ 2-/ 724A297247(/  2(- 777 222 7-27(/ 7#- 7(/ 7(/ <(2 7-2 2(-7(/ 724 -(*  2(- -(*  -#( -%  7-2 7-2 <79 <27<(2  7-2  7-2  7-2 <(2 777  7-2 2#* 7#- 2#* 7*  7-2 7-2 2(- 2(- 2-/ <(2 <(2 7(/  7-2 7(/ 2-/ 2(-  7-2 2#*  p1CSp2CSpSAEDW_AM pydicom-pydicom-20aa4b7/src/pydicom/data/test_files/zipMR.gz000066400000000000000000000154561515706620200241510ustar00rootroot00000000000000aOzipMR.gzipŚgxVնsΕCh(JSz" $BQ-[E TA:RE#Jl"[[Ηk?ZnhٲYrڙՈmܡeiT7=9)%99nRFRJR:oy"'Ғj6Qv꯷#ߩuSkHΨQGM,o/W)ǽwT5EM^&Yּim2+%!0΋7YZv쒗,7'IoՎq&I]hVlTKOK6ZrZ4r8D&Skj~;'Dm#wo~>8[vnҝI"kBbM㈾wwc3™dѦnrRDv<3s &Dˊfy08[1r7-3$2T83?{맦:oEOj0W1vZRz7^[5- 1--F\AVrj~MǴmR3xXLީ=6Իy WI/` FͿz#-rĢ'"Q2̥bwUÓkuU/brIӓk':ܯJ]cv="L0cC'&21[1ìfDx7d6k.7;+5!1-m"`^^aLKI'c/42ߥfDM9ѴAKgjbipXɄfWUɝpu Էm]otOW5%@&op!$EjmrԖl҈g< RCb<)wUo?t-"(mR^I+IBWC.ѵɞ7Gv/gsɓ7$4CBd4HZ(͙kvKqOiu{ޝ+[ƣ_IsJ5sTVrںFs]+|[0ɕi+ +Iʠsf %TA %*kʋݿl> IGIH=a3y梉[:S[n>-_EMqQ;^ {_2SnDJ4Ex 3Ir\b改hnOXo{PzS岹`~g)AoH;9.U?!&%[5_OҤ*+]5Ev1dWxm Zr~kdhA1IHois5?͑V #Ѕ:AT&u#{\V |^I*{{ ФxV䧢Uo D`K9tNCAqɂelm%ҏOkZʻ`sЯK7L8 yxpr:DuK\g|XkUw˶t3tf/sL B_ HYQMEfigٮ\ t;XWO#)5e"*\3"W7U]^"j&j_sQ /8>p&JFHvyD7O?CfnGn"2Qv\ϕau|p]n&~g;-C~Ay]UoDD~rId2_ٷN]J~It?NR.r'lڔscѥ! c%]iue.p Q2F^GԫҎܭ'(dp(B0Xr+&"/?H5Z9o_|"̼fjǶ4x6JͺO 3O#9DYuz sìPn΍%hZMO4JD}H6[k1j mRSOhO cE9apw3yD|QW U9*Fx,Kٮ6W3ybD%FiK " ږHX%su7tWѰgF~_@8\3H.A$`?ɚtm5:L{AY擙qV-Vj?'9}L_TTBzRp ]v!D%̃ioi]kK2R6h˰B,t_B"zZ{+Tg>Xvu5%>s }DºN΁yI-e(VX 2Py!MFGvݤaG6\ 1li }ɍvS4p-W.NĚaeXƗ]<Ѓܚ}E<ٍܳ&|%iE.u>!:k]T/M7uw375q$=0"9H[iNwSϿ OƑXنW$G(Y,mR u!/u\!-w}pP:7m%X=`3`z5Gv5Ǩ1dM-"sjZͥkyU幣+FO4}J7PKKΑqhT؂9 U!o'n#{f#v=5= -˷1nMpV{=\?tˤL)=X|NSawþ\x0DuTs,4of,rK;+dVg;ڻQ;}Lqy[urFHޭG ]-~dr Bn]"ģE.^AOSWf|Zϧл\sؿ ⮫[n(r'[Au.r8:'#ByJ2:qSu55?v,A,f:ohd_ՏBWgewWF7=ںJ8-K1'R'A Gr_A4 l5\i'M z8]e&ZR|ĆMcofh@7ݽNll;v=DV} ' _ !2RQb'A hCYk&fÂqnމw}A-7nA4ַGuZ.9^(B(wXa,(A>ډJ ͅYh\SﱛmKr*#Xw??->G;vzd.:V#rdNv7F; FDIwzPK9%T[6A&{އw[sr4k/7 =`W|k]-AXݫƖo|/RtiZUV UH-ՆM(Ou -ZEςmc_qGJrA&|-| z})t6WmGKso:gy"nAeV7툁DSAe?u6o7K2_˱7(mא 7򪮗}S>'XZ:0ó`_]B7PO)ͱo+1xk|=r,A>D ~f}Z|{"ȃYd# b)&\}l&kL,XJOɔg>W&s mĺ{6wȎ>iGT*Ai5X;9f\rBط{mvt{3$g{ӯMu}f=eO`_+ىA;s.[~j]K#RXlJ3< [@?E$YF}R7d*kSd]5wئ`#ۿwqxKATtj&/SMo;Ͱ[W #g'>XM:H,|2Ջ-lk"W|h7uwϹkD[/5wdj2 :S[: TeD6w p`)lAhyΔdD\Q[ƹ;6x"{_@CоSBF@-hD󾙃>g.rq0bZ!Fgy<w.Ev=m{lKtV߼Aٍћ`#>R9%Fp}|\̈́+l›[`*(̈́Uٹ4yr;$QQ@b%p\d]Q=_]JoWCr#} LJHa,AUd=b֙emw4vwwAG =d󉨺-:=ͨ]9]ؽ5'! d#7 =ׁdj3/oԄO@1ca4ҋڛ^L7e5.avѥ_%Dr(TeѰ:`2¨&"ixD`> 3eրoCQ˞hٟE1FcJIk该9H'\OiUɺ=ʳY9wq Mh#pz-#"?Bf2UdnctN;+<6S.统\kfmӵ]UuEhFp.dhNk}׃":Ų\3l>QV5c]X6k9НyݫvZ`rmU1ѐJ݉Gw<cGx=|NGG'g3\b.{S SЋf5V =˵~.3wEkD(~އ|[ sdy7'#G5v'9v}:DxWэgn]uާ_2}d' \7p,[_w;'h]0,{ddJP!֏Þ`O zQwl!G4(\[7 ,f1>c"W0zwD 2ڗߙ C ` Z ~Y /tTՋ|JG~/׋H_'`H[bdX?'!fyK:[ ~D?B^DH9ogJY.s{|zdfMDfdG G|u/uܨArnlcFA^K]OkJPejہY+rGpr6ᑰC[]CZLp=x7@TBK]rAՠxW؇Mp7@MЏt?|*xw, $bf½Gx} str | None: """Return the repeaters tag mask for `tag`. Parameters ---------- tag : int The tag to check. Returns ------- str or None If the tag is in the repeaters dictionary then returns the corresponding masked tag, otherwise returns ``None``. """ for mask_x, (mask1, mask2) in masks.items(): if (tag ^ mask1) & mask2 == 0: return mask_x return None def add_dict_entry( tag: int, VR: str, keyword: str, description: str, VM: str = "1", is_retired: str = "", ) -> None: """Update the DICOM dictionary with a new non-private entry. Parameters ---------- tag : int The tag number for the new dictionary entry. VR : str DICOM value representation. description : str The descriptive name used in printing the entry. Often the same as the keyword, but with spaces between words. VM : str, optional DICOM value multiplicity. If not specified, then ``'1'`` is used. is_retired : str, optional Usually leave as blank string (default). Set to ``'Retired'`` if is a retired data element. Raises ------ ValueError If the tag is a private tag. Notes ----- Does not permanently update the dictionary, but only during run-time. Will replace an existing entry if the tag already exists in the dictionary. See Also -------- pydicom.examples.add_dict_entry Example file which shows how to use this function add_dict_entries Update multiple values at once. Examples -------- >>> from pydicom import Dataset >>> add_dict_entry(0x10021001, "UL", "TestOne", "Test One") >>> add_dict_entry(0x10021002, "DS", "TestTwo", "Test Two", VM='3') >>> ds = Dataset() >>> ds.TestOne = 'test' >>> ds.TestTwo = ['1', '2', '3'] """ add_dict_entries({tag: (VR, VM, description, is_retired, keyword)}) def add_dict_entries( new_entries_dict: dict[int, tuple[str, str, str, str, str]] ) -> None: """Update the DICOM dictionary with new non-private entries. Parameters ---------- new_entries_dict : dict :class:`dict` of form: ``{tag: (VR, VM, description, is_retired, keyword), ...}`` where parameters are as described in :func:`add_dict_entry`. Raises ------ ValueError If one of the entries is a private tag. See Also -------- add_dict_entry Add a single entry to the dictionary. Examples -------- >>> from pydicom import Dataset >>> new_dict_items = { ... 0x10021001: ('UL', '1', "Test One", '', 'TestOne'), ... 0x10021002: ('DS', '3', "Test Two", '', 'TestTwo'), ... } >>> add_dict_entries(new_dict_items) >>> ds = Dataset() >>> ds.TestOne = 'test' >>> ds.TestTwo = ['1', '2', '3'] """ if any([BaseTag(tag).is_private for tag in new_entries_dict]): raise ValueError( 'Private tags cannot be added using "add_dict_entries" - ' 'use "add_private_dict_entries" instead' ) # Update the dictionary itself DicomDictionary.update(new_entries_dict) # Update the reverse mapping from name to tag keyword_dict.update({val[4]: tag for tag, val in new_entries_dict.items()}) def add_private_dict_entry( private_creator: str, tag: int, VR: str, description: str, VM: str = "1" ) -> None: """Update the private DICOM dictionary with a new entry. Parameters ---------- private_creator : str The private creator for the new entry. tag : int The tag number for the new dictionary entry. Note that the 2 high bytes of the element part of the tag are ignored. VR : str DICOM value representation. description : str The descriptive name used in printing the entry. VM : str, optional DICOM value multiplicity. If not specified, then ``'1'`` is used. Raises ------ ValueError If the tag is a non-private tag. Notes ----- Behaves like :func:`add_dict_entry`, only for a private tag entry. See Also -------- add_private_dict_entries Add or update multiple entries at once. """ new_dict_val = (VR, VM, description, "") add_private_dict_entries(private_creator, {tag: new_dict_val}) def add_private_dict_entries( private_creator: str, new_entries_dict: dict[int, tuple[str, str, str, str]] ) -> None: """Update pydicom's private DICOM tag dictionary with new entries. Parameters ---------- private_creator: str The private creator for all entries in `new_entries_dict`. new_entries_dict : dict :class:`dict` of form ``{tag: (VR, VM, description, is_retired), ...}`` where parameters are as described in :func:`add_private_dict_entry`. Raises ------ ValueError If one of the entries is a non-private tag. See Also -------- add_private_dict_entry Function to add a single entry to the private tag dictionary. Examples -------- >>> new_dict_items = { ... 0x00410001: ('UL', '1', "Test One"), ... 0x00410002: ('DS', '3', "Test Two", '3'), ... } >>> add_private_dict_entries("ACME LTD 1.2", new_dict_items) >>> add_private_dict_entry("ACME LTD 1.3", 0x00410001, "US", "Test Three") """ if not all([BaseTag(tag).is_private for tag in new_entries_dict]): raise ValueError( "Non-private tags cannot be added using " "'add_private_dict_entries()' - use 'add_dict_entries()' instead" ) new_entries = { f"{tag >> 16:04X}xx{tag & 0xff:02X}": value for tag, value in new_entries_dict.items() } private_dictionaries.setdefault(private_creator, {}).update(new_entries) def get_entry(tag: TagType) -> tuple[str, str, str, str, str]: """Return an entry from the DICOM dictionary as a tuple. If the `tag` is not in the main DICOM dictionary, then the repeating group dictionary will also be checked. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose entry is to be retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Only entries in the official DICOM dictionary will be checked, not entries in the private dictionary. Returns ------- tuple of str The (VR, VM, name, is_retired, keyword) from the DICOM dictionary. Raises ------ KeyError If the tag is not present in the DICOM data dictionary. See Also -------- get_private_entry Return an entry from the private dictionary. """ # Note: tried the lookup with 'if tag in DicomDictionary' # and with DicomDictionary.get, instead of try/except # Try/except was fastest using timeit if tag is valid (usual case) # My test had 5.2 usec vs 8.2 for 'contains' test, vs 5.32 for dict.get if not isinstance(tag, BaseTag): tag = Tag(tag) try: return DicomDictionary[tag] except KeyError: if not tag.is_private: mask_x = mask_match(tag) if mask_x: return RepeatersDictionary[mask_x] raise KeyError(f"Tag {tag} not found in DICOM dictionary") def dictionary_is_retired(tag: TagType) -> bool: """Return ``True`` if the element corresponding to `tag` is retired. Only performs the lookup for official DICOM elements. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose retirement status is being checked, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- bool ``True`` if the element's retirement status is 'Retired', ``False`` otherwise. Raises ------ KeyError If the tag is not present in the DICOM data dictionary. """ return "retired" in get_entry(tag)[3].lower() def dictionary_VR(tag: TagType) -> str: """Return the VR of the element corresponding to `tag`. Only performs the lookup for official DICOM elements. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose value representation (VR) is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- str The VR of the corresponding element. Raises ------ KeyError If the tag is not present in the DICOM data dictionary. """ return get_entry(tag)[0] def _dictionary_vr_fast(tag: int) -> str: """Return the VR corresponding to `tag`""" # Faster implementation of `dictionary_VR` try: return DicomDictionary[tag][0] except KeyError: if not (tag >> 16) % 2 == 1: mask_x = mask_match(tag) if mask_x: return RepeatersDictionary[mask_x][0] raise KeyError(f"Tag {Tag(tag)} not found in DICOM dictionary") def dictionary_VM(tag: TagType) -> str: """Return the VM of the element corresponding to `tag`. Only performs the lookup for official DICOM elements. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose value multiplicity (VM) is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- str The VM of the corresponding element. Raises ------ KeyError If the tag is not present in the DICOM data dictionary. """ return get_entry(tag)[1] def dictionary_description(tag: TagType) -> str: """Return the description of the element corresponding to `tag`. Only performs the lookup for official DICOM elements. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose description is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- str The description of the corresponding element. Raises ------ KeyError If the tag is not present in the DICOM data dictionary. """ return get_entry(tag)[2] def dictionary_keyword(tag: TagType) -> str: """Return the keyword of the element corresponding to `tag`. Only performs the lookup for official DICOM elements. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose keyword is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- str The keyword of the corresponding element. Raises ------ KeyError If the tag is not present in the DICOM data dictionary. """ return get_entry(tag)[4] def dictionary_has_tag(tag: TagType) -> bool: """Return ``True`` if `tag` is in the official DICOM data dictionary. Parameters ---------- tag : int or str or Tuple[int, int] The tag to check, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- bool ``True`` if the tag corresponds to an element present in the official DICOM data dictionary, ``False`` otherwise. """ try: return Tag(tag) in DicomDictionary except Exception: return False def keyword_for_tag(tag: TagType) -> str: """Return the keyword of the element corresponding to `tag`. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose keyword is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Returns ------- str If the element is in the DICOM data dictionary then returns the corresponding element's keyword, otherwise returns ``''``. For group length elements will always return ``'GroupLength'``. """ try: return dictionary_keyword(tag) except KeyError: return "" # Provide for the 'reverse' lookup. Given the keyword, what is the tag? keyword_dict: dict[str, int] = {dictionary_keyword(tag): tag for tag in DicomDictionary} def tag_for_keyword(keyword: str) -> int | None: """Return the tag of the element corresponding to `keyword`. Only performs the lookup for official DICOM elements. Parameters ---------- keyword : str The keyword for the element whose tag is being retrieved. Returns ------- int or None If the element is in the DICOM data dictionary then returns the corresponding element's tag, otherwise returns ``None``. """ return keyword_dict.get(keyword) def repeater_has_tag(tag: int) -> bool: """Return ``True`` if `tag` is in the DICOM repeaters data dictionary. Parameters ---------- tag : int The tag to check. Returns ------- bool ``True`` if the tag is a non-private element tag present in the official DICOM repeaters data dictionary, ``False`` otherwise. """ return mask_match(tag) in RepeatersDictionary REPEATER_KEYWORDS = [val[4] for val in RepeatersDictionary.values()] def repeater_has_keyword(keyword: str) -> bool: """Return ``True`` if `keyword` is in the DICOM repeaters data dictionary. Parameters ---------- keyword : str The keyword to check. Returns ------- bool ``True`` if the keyword corresponding to an element present in the official DICOM repeaters data dictionary, ``False`` otherwise. """ return keyword in REPEATER_KEYWORDS # PRIVATE DICTIONARY handling # functions in analogy with those of main DICOM dict def get_private_entry(tag: TagType, private_creator: str) -> tuple[str, str, str, str]: """Return an entry from the private dictionary corresponding to `tag`. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose entry is to be retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. Only entries in the private dictionary will be checked. private_creator : str The name of the private creator. Returns ------- tuple of str The (VR, VM, name, is_retired) from the private dictionary. Raises ------ KeyError If the tag or private creator is not present in the private dictionary. See Also -------- get_entry Return an entry from the DICOM data dictionary. """ if not isinstance(tag, BaseTag): tag = Tag(tag) try: private_dict = private_dictionaries[private_creator] except KeyError as exc: raise KeyError( f"Private creator '{private_creator}' not in the private dictionary" ) from exc except TypeError as exc: msg = ( f"{tag.private_creator} '{private_creator}' " f"is not a valid private creator" ) warn_and_log(msg) raise KeyError(msg) from exc # private elements are usually agnostic for # "block" (see PS3.5-2008 7.8.1 p44) # Some elements in _private_dict are explicit; # most have "xx" for high-byte of element # so here put in the "xx" in the block position for key to look up group_str = f"{tag.group:04X}" elem_str = f"{tag.elem:04X}" keys = [ f"{group_str}{elem_str}", f"{group_str}xx{elem_str[-2:]}", f"{group_str[:2]}xxxx{elem_str[-2:]}", ] keys = [k for k in keys if k in private_dict] if not keys: raise KeyError( f"Tag '{tag}' not in private dictionary " f"for private creator '{private_creator}'" ) dict_entry = private_dict[keys[0]] return dict_entry def private_dictionary_VR(tag: TagType, private_creator: str) -> str: """Return the VR of the private element corresponding to `tag`. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose value representation (VR) is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. private_creator : str The name of the private creator. Returns ------- str The VR of the corresponding element. Raises ------ KeyError If the tag is not present in the private dictionary. """ return get_private_entry(tag, private_creator)[0] def private_dictionary_VM(tag: TagType, private_creator: str) -> str: """Return the VM of the private element corresponding to `tag`. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose value multiplicity (VM) is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. private_creator : str The name of the private creator. Returns ------- str The VM of the corresponding element. Raises ------ KeyError If the tag is not present in the private dictionary. """ return get_private_entry(tag, private_creator)[1] def private_dictionary_description(tag: TagType, private_creator: str) -> str: """Return the description of the private element corresponding to `tag`. Parameters ---------- tag : int or str or Tuple[int, int] The tag for the element whose description is being retrieved, in any of the forms accepted by :func:`~pydicom.tag.Tag`. private_creator : str The name of the private creator. Returns ------- str The description of the corresponding element. Raises ------ KeyError If the tag is not present in the private dictionary, or if the private creator is not valid. """ return get_private_entry(tag, private_creator)[2] pydicom-pydicom-20aa4b7/src/pydicom/dataelem.py000066400000000000000000001037261515706620200216200ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Define the DataElement class. A DataElement has a tag, a value representation (VR), a value multiplicity (VM) and a value. """ import base64 from collections.abc import Callable, MutableSequence import copy from io import BufferedIOBase import json from typing import Any, TYPE_CHECKING, NamedTuple from pydicom import config # don't import datetime_conversion directly from pydicom.config import logger from pydicom.datadict import ( dictionary_has_tag, dictionary_description, dictionary_keyword, dictionary_is_retired, private_dictionary_description, dictionary_VR, repeater_has_tag, ) from pydicom.hooks import hooks from pydicom.jsonrep import JsonDataElementConverter, BulkDataType from pydicom.misc import warn_and_log from pydicom.multival import MultiValue from pydicom.tag import Tag, BaseTag, _LUT_DESCRIPTOR_TAGS from pydicom.uid import UID from pydicom import jsonrep from pydicom.fileutil import check_buffer, buffer_length, buffer_equality import pydicom.valuerep # don't import DS directly as can be changed by config from pydicom.valuerep import ( BUFFERABLE_VRS, PersonName, BYTES_VR, AMBIGUOUS_VR, STR_VR, ALLOW_BACKSLASH, DEFAULT_CHARSET_VR, LONG_VALUE_VR, VR as VR_, validate_value, ) if config.have_numpy: import numpy if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset def empty_value_for_VR( VR: str | None, raw: bool = False ) -> bytes | list[str] | str | None | PersonName: """Return the value for an empty element for `VR`. The behavior of this property depends on the setting of :attr:`config.use_none_as_empty_value`. If that is set to ``True``, an empty value is represented by ``None`` (except for VR 'SQ'), otherwise it depends on `VR`. For text VRs (this includes 'AE', 'AS', 'CS', 'DA', 'DT', 'LO', 'LT', 'PN', 'SH', 'ST', 'TM', 'UC', 'UI', 'UR' and 'UT') an empty string is used as empty value representation, for all other VRs except 'SQ', ``None``. For empty sequence values (VR 'SQ') an empty list is used in all cases. Note that this is used only if decoding the element - it is always possible to set the value to another empty value representation, which will be preserved during the element object lifetime. Parameters ---------- VR : str or None The VR of the corresponding element. raw : bool, optional If ``True``, returns the value for a :class:`RawDataElement`, otherwise for a :class:`DataElement` Returns ------- str or bytes or None or list The value a data element with `VR` is assigned on decoding if it is empty. """ if VR == VR_.SQ: return b"" if raw else [] if config.use_none_as_empty_text_VR_value: return None if VR == VR_.PN: return b"" if raw else PersonName("") # DS and IS are treated more like int/float than str if VR in STR_VR - {VR_.DS, VR_.IS}: return b"" if raw else "" return None class DataElement: """Contain and manipulate a DICOM Element. Examples -------- While its possible to create a new :class:`DataElement` directly and add it to a :class:`~pydicom.dataset.Dataset`: >>> from pydicom import Dataset >>> elem = DataElement(0x00100010, 'PN', 'CITIZEN^Joan') >>> ds = Dataset() >>> ds.add(elem) Its far more convenient to use a :class:`~pydicom.dataset.Dataset` to add a new :class:`DataElement`, as the VR and tag are determined automatically from the DICOM dictionary: >>> ds = Dataset() >>> ds.PatientName = 'CITIZEN^Joan' Empty DataElement objects (e.g. with VM = 0) show an empty string as value for text VRs and `None` for non-text (binary) VRs: >>> ds = Dataset() >>> ds.PatientName = None >>> ds.PatientName '' >>> ds.BitsAllocated = None >>> ds.BitsAllocated >>> str(ds.BitsAllocated) 'None' Attributes ---------- descripWidth : int For string display, this is the maximum width of the description field (default ``35``). is_undefined_length : bool Indicates whether the length field for the element was ``0xFFFFFFFFL`` (ie undefined). maxBytesToDisplay : int For string display, elements with values containing data which is longer than this value will display ``"array of # bytes"`` (default ``16``). showVR : bool For string display, include the element's VR just before it's value (default ``True``). tag : pydicom.tag.BaseTag The element's tag. validation_mode : int The mode used to validate the element's value. See :attr:`Settings.writing_validation_mode ` for more information. VR : str The element's Value Representation. """ descripWidth = 35 maxBytesToDisplay = 16 showVR = True is_raw = False def __init__( self, tag: int | str | tuple[int, int], VR: str, value: Any, file_value_tell: int | None = None, is_undefined_length: bool = False, already_converted: bool = False, validation_mode: int | None = None, ) -> None: """Create a new :class:`DataElement`. Parameters ---------- tag : int | str | tuple[int, int] The DICOM (group, element) tag in any form accepted by :func:`~pydicom.tag.Tag` such as ``'PatientName'``, ``(0x10, 0x10)``, ``0x00100010``, etc. VR : str The 2 character DICOM value representation (see DICOM Standard, Part 5, :dcm:`Section 6.2`). value : Any The value of the data element, the :doc:`allowed type depends on the VR ` and includes: * a single :class:`str` value * an :class:`int` or :class:`int` * a :class:`list` or :class:`tuple` containing only a single type of item such as :class:`str`, :class:`int` or :class:`float` * a raw :class:`bytes` value file_value_tell : int, optional The byte offset to the start of the encoded element value. is_undefined_length : bool, optional Used internally to store whether the length field for this element was ``0xFFFFFFFF``, i.e. 'undefined length'. Default is ``False``. already_converted : bool, optional Used to determine whether or not the element's value requires conversion to a value with VM > 1. Default is ``False``. validation_mode : int, optional Defines if values are validated and how validation errors are handled. """ if validation_mode is None: validation_mode = config.settings.reading_validation_mode if not isinstance(tag, BaseTag): tag = Tag(tag) self.tag = tag # a known tag shall only have the VR 'UN' if it has a length that # exceeds the size that can be encoded in 16 bit - all other cases # can be seen as an encoding error and can be corrected if ( VR == VR_.UN and not tag.is_private and config.replace_un_with_known_vr and (is_undefined_length or value is None or len(value) < 0xFFFF) ): try: VR = dictionary_VR(tag) except KeyError: pass self.VR = VR # Note: you must set VR before setting value self.validation_mode = validation_mode if already_converted: self._value = value else: self.value = value # calls property setter which will convert self.file_tell = file_value_tell self.is_undefined_length: bool = is_undefined_length self.private_creator: str | None = None def validate(self, value: Any) -> None: """Validate the current value against the DICOM standard. See :func:`~pydicom.valuerep.validate_value` for details. """ validate_value(self.VR, value, self.validation_mode) @classmethod def from_json( cls: type["DataElement"], dataset_class: type["Dataset"], tag: str, vr: str, value: Any, value_key: str | None, bulk_data_uri_handler: ( Callable[[str, str, str], BulkDataType] | Callable[[str], BulkDataType] | None ) = None, ) -> "DataElement": """Return a :class:`DataElement` from a DICOM JSON Model attribute object. Parameters ---------- dataset_class : dataset.Dataset derived class The class object to use for **SQ** element items. tag : str The data element's tag as uppercase hex. vr : str The data element's value representation (VR). value : str or list[None | str | int | float | bytes | dict] The data element's value(s). value_key : str or None The attribute name for `value`, should be one of: ``{"Value", "InlineBinary", "BulkDataURI"}``. If the element's VM is ``0`` and none of the keys are used then will be ``None``. bulk_data_uri_handler: callable or None Callable function that accepts either the `tag`, `vr` and "BulkDataURI" `value` or just the "BulkDataURI" `value` of the JSON representation of a data element and returns the actual value of that data element (retrieved via DICOMweb WADO-RS). If no `bulk_data_uri_handler` is specified (default) then the corresponding element will have an "empty" value such as ``""``, ``b""`` or ``None`` depending on the `vr` (i.e. the Value Multiplicity will be 0). Returns ------- DataElement """ # TODO: test wado-rs retrieve wrapper converter = JsonDataElementConverter( dataset_class, tag, vr, value, value_key, bulk_data_uri_handler ) elem_value = converter.get_element_values() if ( vr == VR_.UN and config.replace_un_with_known_vr and isinstance(elem_value, bytes) ): raw = RawDataElement( Tag(tag), vr, len(elem_value), elem_value, 0, True, True ) elem_value = convert_raw_data_element(raw).value try: return cls(tag=tag, value=elem_value, VR=vr) except Exception as exc: raise ValueError( f"Data element '{tag}' could not be loaded from JSON: {elem_value}" ) from exc def to_json_dict( self, bulk_data_element_handler: Callable[["DataElement"], str] | None, bulk_data_threshold: int, ) -> dict[str, Any]: """Return a dictionary representation of the :class:`DataElement` conforming to the DICOM JSON Model as described in the DICOM Standard, Part 18, :dcm:`Annex F`. Parameters ---------- bulk_data_element_handler : callable or None Callable that accepts a bulk :class`data element ` and returns the "BulkDataURI" as a :class:`str` for retrieving the value of the data element via DICOMweb WADO-RS. bulk_data_threshold : int Size of base64 encoded data element above which a value will be provided in form of a "BulkDataURI" rather than "InlineBinary". Ignored if no `bulk_data_element_handler` is given. Returns ------- dict Mapping representing a JSON encoded data element as ``{str: Any}``. """ json_element: dict[str, Any] = {"vr": self.VR} if self.VR in (BYTES_VR | AMBIGUOUS_VR) - {VR_.US_SS}: if not self.is_empty: binary_value = self.value # Base64 makes the encoded value 1/3 longer. if bulk_data_element_handler is not None and len(binary_value) > ( (bulk_data_threshold // 4) * 3 ): json_element["BulkDataURI"] = bulk_data_element_handler(self) else: # Json is exempt from padding to even length, see DICOM-CP1920 encoded_value = base64.b64encode(binary_value).decode("utf-8") logger.info(f"encode bulk data element '{self.name}' inline") json_element["InlineBinary"] = encoded_value elif self.VR == VR_.SQ: # recursive call to get sequence item JSON dicts value = [ ds.to_json( bulk_data_element_handler=bulk_data_element_handler, bulk_data_threshold=bulk_data_threshold, dump_handler=lambda d: d, ) for ds in self.value ] json_element["Value"] = value elif self.VR == VR_.PN: if not self.is_empty: elem_value = [] if self.VM > 1: value = self.value else: value = [self.value] for v in value: comps = {"Alphabetic": v.components[0]} if len(v.components) > 1: comps["Ideographic"] = v.components[1] if len(v.components) > 2: comps["Phonetic"] = v.components[2] elem_value.append(comps) json_element["Value"] = elem_value elif self.VR == VR_.AT: if not self.is_empty: value = self.value if self.VM == 1: value = [value] json_element["Value"] = [format(v, "08X") for v in value] else: if not self.is_empty: if self.VM > 1: value = self.value else: value = [self.value] json_element["Value"] = [v for v in value] if "Value" in json_element: json_element["Value"] = jsonrep.convert_to_python_number( json_element["Value"], self.VR ) return json_element def to_json( self, bulk_data_threshold: int = 1024, bulk_data_element_handler: Callable[["DataElement"], str] | None = None, dump_handler: Callable[[dict[str, Any]], str] | None = None, ) -> str: """Return a JSON representation of the :class:`DataElement`. Parameters ---------- bulk_data_threshold : int, optional Size of base64 encoded data element above which a value will be provided in form of a "BulkDataURI" rather than "InlineBinary". Ignored if no `bulk_data_element_handler` is given. bulk_data_element_handler : callable, optional Callable that accepts a bulk :class`data element ` and returns the "BulkDataURI" as a :class:`str` for retrieving the value of the data element via DICOMweb WADO-RS. dump_handler : callable, optional Callable function that accepts a :class:`dict` of ``{str: Any}`` and returns the serialized (dumped) JSON :class:`str` (by default uses :func:`json.dumps`). Returns ------- str Mapping representing a JSON encoded data element See also -------- Dataset.to_json """ def json_dump(d: dict[str, Any]) -> str: return json.dumps(d, sort_keys=True) dump_handler = json_dump if dump_handler is None else dump_handler return dump_handler( self.to_json_dict(bulk_data_element_handler, bulk_data_threshold) ) @property def value(self) -> Any: """Get or set the element's value. Parameters ---------- val : Any The value to use to set the element's value, should be an :doc:`appropriate type for the VR`. The value will be validated in accordance with the element's :attr:`~DataElement.validation_mode`. Returns ------- Any The element's value. """ return self._value @value.setter def value(self, val: Any) -> None: # O* elements set using a buffer object if isinstance(val, BufferedIOBase): if self.VR not in BUFFERABLE_VRS: supported = sorted(str(vr) for vr in BUFFERABLE_VRS if "or" not in vr) raise ValueError( f"Elements with a VR of '{self.VR}' cannot be used with buffered " f"values, supported VRs are: {', '.join(supported)}" ) # Ensure pre-conditions are met - we will check these when reading the # value as well but better to fail early if possible try: check_buffer(val) except Exception as exc: raise type(exc)(f"Invalid buffer for {self.tag} '{self.name}': {exc}") self._value = val return # Check if is multiple values separated by backslash # If so, turn them into a list of separate values # Exclude splitting values with backslash characters based on: # * Which str-like VRs can have backslashes in Part 5, Section 6.2 # * All byte-like VRs # * Ambiguous VRs that may be byte-like if self.VR not in ALLOW_BACKSLASH: if isinstance(val, str): val = val.split("\\") if "\\" in val else val elif isinstance(val, bytes): val = val.split(b"\\") if b"\\" in val else val self._value = self._convert_value(val) @property def VM(self) -> int: """Return the value multiplicity of the element as :class:`int`. .. versionchanged:: 3.0 **SQ** elements now always return a VM of ``1``. """ if self.VR == VR_.SQ: return 1 if self.value is None: return 0 if isinstance(self.value, str | bytes | PersonName): return 1 if self.value else 0 if isinstance(self.value, BufferedIOBase): try: return 1 if buffer_length(self.value) else 0 except Exception as exc: raise type(exc)(f"Invalid buffer for {self.tag} '{self.name}': {exc}") try: iter(self.value) except TypeError: return 1 return len(self.value) @property def is_buffered(self) -> bool: """Return ``True`` if the element's value is a :class:`io.BufferedIOBase` instance, ``False`` otherwise. """ return isinstance(self._value, BufferedIOBase) @property def is_empty(self) -> bool: """Return ``True`` if the element has no value.""" if self.VR == VR_.SQ: return not bool(self.value) return self.VM == 0 @property def empty_value(self) -> bytes | list[str] | None | str | PersonName: """Return the value for an empty element. See :func:`empty_value_for_VR` for more information. Returns ------- str or None The value this data element is assigned on decoding if it is empty. """ return empty_value_for_VR(self.VR) def clear(self) -> None: """Clears the value, e.g. sets it to the configured empty value. See :func:`empty_value_for_VR`. """ self._value = self.empty_value def _convert_value(self, val: Any) -> Any: """Convert `val` to an appropriate type and return the result. Uses the element's VR in order to determine the conversion method and resulting type. """ if ( self.tag == 0x7FE00010 and config.have_numpy and isinstance(val, numpy.ndarray) ): raise TypeError( "The value for (7FE0,0010) 'Pixel Data' should be set using 'bytes' " "not 'numpy.ndarray'. See the Dataset.set_pixel_data() method for " "an alternative that supports ndarrays." ) if self.VR == VR_.SQ: # a sequence - leave it alone from pydicom.sequence import Sequence if isinstance(val, Sequence): return val return Sequence(val) # if the value is a list, convert each element if not hasattr(val, "append"): return self._convert(val) if len(val) == 1: return self._convert(val[0]) # Some ambiguous VR elements ignore the VR for part of the value # e.g. LUT Descriptor is 'US or SS' and VM 3, but the first and # third values are always US (the third should be <= 16, so SS is OK) if self.tag in _LUT_DESCRIPTOR_TAGS and val: def _skip_conversion(val: Any) -> Any: return val validate_value(VR_.US, val[0], self.validation_mode) for value in val[1:]: validate_value(self.VR, value, self.validation_mode) return MultiValue(_skip_conversion, val) return MultiValue(self._convert, val) def _convert(self, val: Any) -> Any: """Convert `val` to an appropriate type for the element's VR.""" # If the value is bytes and has a VR that can only be encoded # using the default character repertoire, convert it to a string if self.VR in DEFAULT_CHARSET_VR and isinstance(val, bytes): val = val.decode() if self.VR == VR_.IS: return pydicom.valuerep.IS(val, self.validation_mode) if self.VR == VR_.DA and config.datetime_conversion: return pydicom.valuerep.DA(val, validation_mode=self.validation_mode) if self.VR == VR_.DS: return pydicom.valuerep.DS(val, False, self.validation_mode) if self.VR == VR_.DT and config.datetime_conversion: return pydicom.valuerep.DT(val, validation_mode=self.validation_mode) if self.VR == VR_.TM and config.datetime_conversion: return pydicom.valuerep.TM(val, validation_mode=self.validation_mode) if self.VR == VR_.UI: return UID(val, self.validation_mode) if val is not None else None if self.VR == VR_.PN: return PersonName(val, validation_mode=self.validation_mode) if self.VR == VR_.AT and (val == 0 or val): return val if isinstance(val, BaseTag) else Tag(val) self.validate(val) return val def __deepcopy__(self, memo: dict[int, Any]) -> "DataElement": """Implementation of copy.deepcopy().""" # Overridden to allow for a nice exception message for buffered elements cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result for k, v in self.__dict__.items(): if self.is_buffered and k == "_value": try: setattr(result, k, copy.deepcopy(v, memo)) except Exception as exc: raise type(exc)( f"Error deepcopying the buffered element {self.tag} " f"'{self.name}': {exc}" ) else: setattr(result, k, copy.deepcopy(v, memo)) return result def __eq__(self, other: Any) -> Any: """Compare `self` and `other` for equality. Returns ------- bool The result if `self` and `other` are the same class NotImplemented If `other` is not the same class as `self` then returning :class:`NotImplemented` delegates the result to ``superclass.__eq__(subclass)``. """ # Faster result if same object if other is self: return True if isinstance(other, self.__class__): if self.tag != other.tag or self.VR != other.VR: return False # tag and VR match, now check the value if config.have_numpy and isinstance(self.value, numpy.ndarray): return len(self.value) == len(other.value) and numpy.allclose( self.value, other.value ) if not self.is_buffered and not other.is_buffered: return self.value == other.value try: # `self` is buffered, `other` may or may not be buffered if self.is_buffered: return buffer_equality(self.value, other.value) # `other` is buffered, `self` is not return buffer_equality(other.value, self.value) except Exception as exc: raise type(exc)(f"Invalid buffer for {self.tag} '{self.name}': {exc}") return NotImplemented def __ne__(self, other: Any) -> Any: """Compare `self` and `other` for inequality.""" return not (self == other) def __str__(self) -> str: """Return :class:`str` representation of the element.""" value = self.repval or "" name = f"{self.name[:self.descripWidth]:<{self.descripWidth}}" if self.showVR: return f"{self.tag} {name} {self.VR}: {value}" return f"{self.tag} {name} {value}" @property def repval(self) -> str: """Return a :class:`str` representation of the element's value.""" if self.is_buffered: # in case the buffer is a stream and non-seekable we don't want # to consume any bytes return repr(self.value) # If the VR is byte-like or long text (1024+), show a summary instead if self.VR in LONG_VALUE_VR: try: length = len(self.value) except TypeError: pass else: if length > self.maxBytesToDisplay: return f"Array of {length} elements" if self.VM > self.maxBytesToDisplay: return f"Array of {self.VM} elements" if isinstance(self.value, UID): return self.value.name return repr(self.value) def __getitem__(self, key: int) -> Any: """Return the item at `key` if the element's value is indexable.""" try: return self.value[key] except TypeError: raise TypeError("DataElement value is unscriptable (not a Sequence)") @property def name(self) -> str: """Return the DICOM dictionary name for the element as :class:`str`. Returns ------- str * For officially registered DICOM Data Elements this will be the *Name* as given in :dcm:`Table 6-1`. * For private elements known to *pydicom* this will be the *Name* in the format ``'[name]'``. * For unknown private elements this will be ``'Private tag data'``. * Otherwise returns an empty string ``''``. """ if self.tag.is_private: if self.private_creator: try: # If we have the name from the private dictionary, use it, # but put it in square brackets to make clear # that the tag cannot be accessed by that name name = private_dictionary_description( self.tag, self.private_creator ) return f"[{name}]" except KeyError: pass elif self.tag.element >> 8 == 0: return "Private Creator" return "Private tag data" # default if dictionary_has_tag(self.tag) or repeater_has_tag(self.tag): return dictionary_description(self.tag) # implied Group Length dicom versions < 3 if self.tag.element == 0: return "Group Length" return "" @property def is_private(self) -> bool: """Return ``True`` if the element's tag is private. .. versionadded:: 2.1 """ return self.tag.is_private @property def is_retired(self) -> bool: """Return the element's retired status as :class:`bool`. For officially registered DICOM Data Elements this will be ``True`` if the retired status as given in the DICOM Standard, Part 6, :dcm:`Table 6-1` is 'RET'. For private or unknown elements this will always be ``False``. """ if dictionary_has_tag(self.tag): return dictionary_is_retired(self.tag) return False @property def keyword(self) -> str: """Return the element's keyword (if known) as :class:`str`. For officially registered DICOM Data Elements this will be the *Keyword* as given in :dcm:`Table 6-1`. For private or unknown elements this will return an empty string ``''``. """ if dictionary_has_tag(self.tag): return dictionary_keyword(self.tag) return "" def __repr__(self) -> str: """Return the representation of the element.""" return str(self) class RawDataElement(NamedTuple): """Container for the data from a raw (mostly) undecoded element.""" tag: BaseTag VR: str | None length: int value: bytes | None value_tell: int is_implicit_VR: bool is_little_endian: bool is_raw: bool = True is_buffered: bool = False def convert_raw_data_element( raw: RawDataElement, *, encoding: str | MutableSequence[str] | None = None, ds: "Dataset | None" = None, ) -> DataElement: """Return a :class:`DataElement` created from `raw`. .. versionadded:: 3.0 **Customization Hooks** All callback functions for :func:`convert_raw_data_element` use the function signature:: def func( raw: RawDataElement, data: dict[str, Any], *, encoding: str | MutableSequence[str] | None = None, ds: pydicom.dataset.Dataset | None = None, **kwargs: dict[str, Any], ) -> None: ... Where `raw`, `encoding` and `ds` are the objects passed to this function, `data` is a :class:`dict` that's persistent for each raw element and is used to store the results of the corresponding callback functions, and `kwargs` are keyword arguments passed by setting the ``"raw_element_kwargs"`` hook via :meth:`~pydicom.hooks.Hooks.register_kwargs`. Available :class:`hooks` are (in order of execution): * ``"raw_element_vr"``: a function to perform the VR lookup for the raw element, required to add ``{"VR": str}`` to `data`. * ``"raw_element_value"``: a function to perform the conversion of the raw element :class:`bytes` value to an appropriate type (such as :class:`int` for VR **US**), required to add ``{"value": Any}`` to `data`. :meth:`~pydicom.hooks.Hooks.register_callback` is used to set the callback function for a given hook, and only one callback can be set per hook. Parameters ---------- raw : pydicom.dataelem.RawDataElement The raw data to convert to a :class:`DataElement`. encoding : str | MutableSequence[str] | None The character set encodings for the raw data element. ds : pydicom.dataset.Dataset | None The parent dataset of `raw`. Returns ------- pydicom.dataelem.DataElement A :class:`~pydicom.dataelem.DataElement` instance created from `raw`. """ data: dict[str, Any] = {} if config.data_element_callback: raw = config.data_element_callback(raw, **config.data_element_callback_kwargs) # Initializing **kwargs for each hook is a bit expensive, so avoid it if we can if hooks.raw_element_kwargs: hooks.raw_element_vr( raw, data, encoding=encoding, ds=ds, **hooks.raw_element_kwargs ) hooks.raw_element_value( raw, data, encoding=encoding, ds=ds, **hooks.raw_element_kwargs ) else: hooks.raw_element_vr(raw, data, encoding=encoding, ds=ds) hooks.raw_element_value(raw, data, encoding=encoding, ds=ds) return DataElement( raw.tag, data["VR"], data["value"], raw.value_tell, raw.length == 0xFFFFFFFF, already_converted=True, ) def _DataElement_from_raw( raw_data_element: RawDataElement, encoding: str | MutableSequence[str] | None = None, dataset: "Dataset | None" = None, ) -> DataElement: """Return a :class:`DataElement` created from `raw_data_element`. .. deprecated:: 3.0 ``DataElement_from_raw`` will be removed in v4.0, use :func:`~pydicom.dataelem.convert_raw_data_element` instead. Call the configured data_element_callbacks to do relevant pre/post-processing and convert values from raw to native types Parameters ---------- raw_data_element : pydicom.dataelem.RawDataElement The raw data to convert to a :class:`DataElement`. encoding : str | list[str] | None The character encoding of the raw data. dataset : pydicom.dataset.Dataset | None If given, used to resolve the VR for known private tags. Returns ------- DataElement A :class:`~pydicom.dataelem.DataElement` instance created from `raw`. """ msg = ( "'pydicom.dataelem.DataElement_from_raw' is deprecated and will be removed " "in v4.0, please use 'pydicom.dataelem.convert_raw_data_element' instead" ) warn_and_log(msg, DeprecationWarning) return convert_raw_data_element( raw=raw_data_element, encoding=encoding, ds=dataset, ) _DEPRECATED = { "DataElement_from_raw": _DataElement_from_raw, } def __getattr__(name: str) -> Any: if name in _DEPRECATED and not config._use_future: return _DEPRECATED[name] raise AttributeError(f"module {__name__!r} has no attribute {name!r}") pydicom-pydicom-20aa4b7/src/pydicom/dataset.py000066400000000000000000004167441515706620200215000ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Define the Dataset and FileDataset classes. The Dataset class represents the DICOM Dataset while the FileDataset class adds extra functionality to Dataset when data is read from or written to file. Overview of DICOM object model ------------------------------ Dataset (dict subclass) Contains DataElement instances, each of which has a tag, VR, VM and value. The DataElement value can be: * A single value, such as a number, string, etc. (i.e. VM = 1) * A list of numbers, strings, etc. (i.e. VM > 1) * A Sequence (list subclass), where each item is a Dataset which contains its own DataElements, and so on in a recursive manner. """ import copy import io import json import os import os.path import re from bisect import bisect_left from collections.abc import ( ValuesView, Iterator, Callable, MutableSequence, MutableMapping, Set, ) from contextlib import nullcontext from importlib.util import find_spec as have_package from itertools import takewhile from types import TracebackType from typing import ( TypeAlias, Any, AnyStr, cast, BinaryIO, TypeVar, overload, ) try: import numpy except ImportError: pass import pydicom # for dcmwrite from pydicom import jsonrep, config from pydicom._version import __version_info__ from pydicom.charset import default_encoding, convert_encodings from pydicom.config import logger from pydicom.datadict import ( dictionary_description, dictionary_VR, tag_for_keyword, keyword_for_tag, repeater_has_keyword, get_private_entry, ) from pydicom.dataelem import DataElement, convert_raw_data_element, RawDataElement from pydicom.filebase import ReadableBuffer, WriteableBuffer from pydicom.fileutil import path_from_pathlike, PathType from pydicom.misc import warn_and_log from pydicom.pixels import compress, convert_color_space, decompress, pixel_array from pydicom.pixels.utils import ( reshape_pixel_array, get_image_pixel_ids, set_pixel_data, ) from pydicom.tag import Tag, BaseTag, tag_in_exception, TagType, TAG_PIXREP from pydicom.uid import PYDICOM_IMPLEMENTATION_UID, UID from pydicom.valuerep import VR as VR_, AMBIGUOUS_VR from pydicom.waveforms import numpy_handler as wave_handler # FloatPixelData, DoubleFloatPixelData, PixelData PIXEL_KEYWORDS = {0x7FE00008, 0x7FE00009, 0x7FE00010} class PrivateBlock: """Helper class for a private block in the :class:`Dataset`. See the DICOM Standard, Part 5, :dcm:`Section 7.8.1` - Private Data Element Tags Attributes ---------- group : int The private group where the private block is located as a 32-bit :class:`int`. private_creator : str The private creator string related to the block. dataset : Dataset The parent dataset. block_start : int The start element of the private block as a 32-bit :class:`int`. Note that the 2 low order hex digits of the element are always 0. """ def __init__( self, key: tuple[int, str], dataset: "Dataset", private_creator_element: int ) -> None: """Initializes an object corresponding to a private tag block. Parameters ---------- key : tuple The private (tag group, creator) as ``(int, str)``. The group must be an odd number. dataset : Dataset The parent :class:`Dataset`. private_creator_element : int The element of the private creator tag as a 32-bit :class:`int`. """ self.group = key[0] self.private_creator = key[1] self.dataset = dataset self.block_start = private_creator_element << 8 def get_tag(self, element_offset: int) -> BaseTag: """Return the private tag ID for the given `element_offset`. Parameters ---------- element_offset : int The lower 16 bits (e.g. 2 hex numbers) of the element tag. Returns ------- The tag ID defined by the private block location and the given element offset. Raises ------ ValueError If `element_offset` is too large. """ if element_offset > 0xFF: raise ValueError("Element offset must be less than 256") return Tag(self.group, self.block_start + element_offset) def __contains__(self, element_offset: int) -> bool: """Return ``True`` if the tag with given `element_offset` is in the parent :class:`Dataset`. """ return self.get_tag(element_offset) in self.dataset def __getitem__(self, element_offset: int) -> DataElement: """Return the data element in the parent dataset for the given element offset. Parameters ---------- element_offset : int The lower 16 bits (e.g. 2 hex numbers) of the element tag. Returns ------- The data element of the tag in the parent dataset defined by the private block location and the given element offset. Raises ------ ValueError If `element_offset` is too large. KeyError If no data element exists at that offset. """ return self.dataset.__getitem__(self.get_tag(element_offset)) def __delitem__(self, element_offset: int) -> None: """Delete the tag with the given `element_offset` from the dataset. Parameters ---------- element_offset : int The lower 16 bits (e.g. 2 hex numbers) of the element tag to be deleted. Raises ------ ValueError If `element_offset` is too large. KeyError If no data element exists at that offset. """ del self.dataset[self.get_tag(element_offset)] def add_new(self, element_offset: int, VR: str, value: object) -> None: """Add a private element to the parent :class:`Dataset`. Adds the private tag with the given `VR` and `value` to the parent :class:`Dataset` at the tag ID defined by the private block and the given `element_offset`. Parameters ---------- element_offset : int The lower 16 bits (e.g. 2 hex numbers) of the element tag to be added. VR : str The 2 character DICOM value representation. value The value of the data element. See :meth:`Dataset.add_new()` for a description. """ tag = self.get_tag(element_offset) self.dataset.add_new(tag, VR, value) self.dataset[tag].private_creator = self.private_creator def __deepcopy__(self, memo: Any) -> "PrivateBlock": copied = self.__class__( (self.group, self.private_creator), self.dataset, self.block_start >> 8, ) memo[id(self)] = copied return copied def _dict_equal(a: "Dataset", b: Any, exclude: list[str] | None = None) -> bool: """Common method for Dataset.__eq__ and FileDataset.__eq__ Uses .keys() as needed because Dataset iter return items not keys `exclude` is used in FileDataset__eq__ ds.__dict__ compare, which would also compare the wrapped _dict member (entire dataset) again. """ return ( len(a) == len(b) and all(key in b for key in a.keys()) and all( a[key] == b[key] for key in a.keys() if exclude is None or key not in exclude ) ) _DatasetValue = DataElement | RawDataElement _DatasetType: TypeAlias = "Dataset | MutableMapping[BaseTag, _DatasetValue]" class Dataset: """A DICOM dataset as a mutable mapping of DICOM Data Elements. Examples -------- Add an element to the :class:`Dataset` (for elements in the DICOM dictionary): >>> ds = Dataset() >>> ds.PatientName = "CITIZEN^Joan" >>> ds.add_new(0x00100020, 'LO', '12345') >>> ds[0x0010, 0x0030] = DataElement(0x00100030, 'DA', '20010101') Add a sequence element to the :class:`Dataset` >>> ds.BeamSequence = [Dataset(), Dataset(), Dataset()] >>> ds.BeamSequence[0].Manufacturer = "Linac, co." >>> ds.BeamSequence[1].Manufacturer = "Linac and Sons, co." >>> ds.BeamSequence[2].Manufacturer = "Linac and Daughters, co." Add private elements to the :class:`Dataset` >>> block = ds.private_block(0x0041, 'My Creator', create=True) >>> block.add_new(0x01, 'LO', '12345') Updating and retrieving element values: >>> ds.PatientName = "CITIZEN^Joan" >>> ds.PatientName 'CITIZEN^Joan' >>> ds.PatientName = "CITIZEN^John" >>> ds.PatientName 'CITIZEN^John' Retrieving an element's value from a Sequence: >>> ds.BeamSequence[0].Manufacturer 'Linac, co.' >>> ds.BeamSequence[1].Manufacturer 'Linac and Sons, co.' Accessing the :class:`~pydicom.dataelem.DataElement` items: >>> elem = ds['PatientName'] >>> elem (0010,0010) Patient's Name PN: 'CITIZEN^John' >>> elem = ds[0x00100010] >>> elem (0010,0010) Patient's Name PN: 'CITIZEN^John' >>> elem = ds.data_element('PatientName') >>> elem (0010,0010) Patient's Name PN: 'CITIZEN^John' Accessing a private :class:`~pydicom.dataelem.DataElement` item: >>> block = ds.private_block(0x0041, 'My Creator') >>> elem = block[0x01] >>> elem (0041,1001) Private tag data LO: '12345' >>> elem.value '12345' Alternatively: >>> ds.get_private_item(0x0041, 0x01, 'My Creator').value '12345' Deleting an element from the :class:`Dataset` >>> del ds.PatientID >>> del ds.BeamSequence[1].Manufacturer >>> del ds.BeamSequence[2] Deleting a private element from the :class:`Dataset` >>> block = ds.private_block(0x0041, 'My Creator') >>> if 0x01 in block: ... del block[0x01] Determining if an element is present in the :class:`Dataset` >>> 'PatientName' in ds True >>> 'PatientID' in ds False >>> (0x0010, 0x0030) in ds True >>> 'Manufacturer' in ds.BeamSequence[0] True Iterating through the top level of a :class:`Dataset` only (excluding Sequences): >>> for elem in ds: ... print(elem) (0010,0010) Patient's Name PN: 'CITIZEN^John' Iterating through the entire :class:`Dataset` (including Sequences): >>> for elem in ds.iterall(): ... print(elem) (0010,0010) Patient's Name PN: 'CITIZEN^John' Recursively iterate through a :class:`Dataset` (including Sequences): >>> def recurse(ds): ... for elem in ds: ... if elem.VR == 'SQ': ... [recurse(item) for item in elem.value] ... else: ... # Do something useful with each DataElement Converting the :class:`Dataset` to and from JSON: >>> ds = Dataset() >>> ds.PatientName = "Some^Name" >>> jsonmodel = ds.to_json() >>> ds2 = Dataset() >>> ds2.from_json(jsonmodel) (0010,0010) Patient's Name PN: 'Some^Name' Attributes ---------- default_element_format : str The default formatting for string display. default_sequence_element_format : str The default formatting for string display of sequences. indent_chars : str For string display, the characters used to indent nested Sequences. Default is ``" "``. """ indent_chars = " " def __init__(self, *args: _DatasetType, **kwargs: Any) -> None: """Create a new :class:`Dataset` instance.""" self._parent_encoding: str | list[str] = kwargs.get( "parent_encoding", default_encoding ) self._dict: MutableMapping[BaseTag, _DatasetValue] if not args: self._dict = {} elif isinstance(args[0], Dataset): self._dict = args[0]._dict else: self._dict = args[0] self.is_decompressed = False # the following read_XXX attributes are used internally to store # the properties of the dataset after read from a file # set depending on the endianness of the read dataset self._read_little: bool | None = None # set depending on the VR handling of the read dataset self._read_implicit: bool | None = None # The dataset's original character set encoding self._read_charset: str | MutableSequence[str] = "" # TODO: v4.0 # Remove is_little_endian and is_implicit_VR if not config._use_future: self._is_little_endian: bool | None = None self._is_implicit_VR: bool | None = None # True if the dataset is a sequence item with undefined length self.is_undefined_length_sequence_item = False # known private creator blocks self._private_blocks: dict[tuple[int, str], PrivateBlock] = {} self._pixel_array: numpy.ndarray | None = None self._pixel_array_opts: dict[str, Any] = {"use_pdh": False} self._pixel_id: dict[str, int] = {} self.file_meta: FileMetaDataset # Used after reading an implicit dataset to help determine the VR of # ambiguous US or SS elements that depend on the value of (0028,0103) # *Pixel Representation* # It gets set by __getitem__() and __setitem()__ and is used by the # ambiguous VR correction function self._pixel_rep: int def __enter__(self) -> "Dataset": """Method invoked on entry to a with statement.""" return self def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None, ) -> bool | None: """Method invoked on exit from a with statement.""" # Returning anything other than True will re-raise any exceptions return None def add(self, data_element: DataElement) -> None: """Add an element to the :class:`Dataset`. Equivalent to ``ds[data_element.tag] = data_element`` Parameters ---------- data_element : dataelem.DataElement The :class:`~pydicom.dataelem.DataElement` to add. """ self[data_element.tag] = data_element def add_new(self, tag: TagType, VR: str, value: Any) -> None: """Create a new element and add it to the :class:`Dataset`. Parameters ---------- tag The DICOM (group, element) tag in any form accepted by :func:`~pydicom.tag.Tag` such as ``[0x0010, 0x0010]``, ``(0x10, 0x10)``, ``0x00100010``, etc. VR : str The 2 character DICOM value representation (see DICOM Standard, Part 5, :dcm:`Section 6.2`). value The value of the data element. One of the following: * a single string or number * a :class:`list` or :class:`tuple` with all strings or all numbers * a multi-value string with backslash separator * for a sequence element, an empty :class:`list` or ``list`` of :class:`Dataset` """ self.add(DataElement(tag, VR, value)) def add_new_private( self, private_creator: str, group: int, element_offset: int, value: Any, vr: str | None = None, ) -> None: """Create a new private element and add it to the :class:`Dataset`. Parameters ---------- private_creator : str The private creator string related to the new tag. group : int The group ID (0x0009 - 0xFFFF) for the private tag. Must be an odd number. element_offset : int The tag offset, e.g. the lower byte of the tag element of the private tag (0x00 - 0xFF). The higher byte is defined by the location of the private creator tag. value : Any The value of the data element. One of the following: * a single string or number * a :class:`list` or :class:`tuple` with all strings or all numbers * a multi-value string with backslash separator * for a sequence element, an empty :class:`list` or ``list`` of :class:`Dataset` vr : str | None The two-letter DICOM value representation, or ``None``. If set to ``None``, it is taken from the private tag dictionary. Raises ------ ValueError If `group` doesn't belong to a private tag or `private_creator` is empty. KeyError If `vr` is ``None`` and the tag is not found in the private tag dictionary. """ block = self.private_block(group, private_creator, create=True) if vr is None: vr = get_private_entry((group, element_offset), private_creator)[0] block.add_new(element_offset, vr, value) def __array__(self) -> "numpy.ndarray": """Support accessing the dataset from a numpy array.""" return numpy.asarray(self._dict) def data_element(self, name: str) -> DataElement | None: """Return the element corresponding to the element keyword `name`. Parameters ---------- name : str A DICOM element keyword. Returns ------- dataelem.DataElement or None For the given DICOM element `keyword`, return the corresponding :class:`~pydicom.dataelem.DataElement` if present, ``None`` otherwise. """ tag = tag_for_keyword(name) # Test against None as (0000,0000) is a possible tag if tag is not None: return self[tag] return None def __contains__(self, name: TagType) -> bool: """Simulate dict.__contains__() to handle DICOM keywords. Examples -------- >>> ds = Dataset() >>> ds.SliceLocation = '2' >>> 'SliceLocation' in ds True Parameters ---------- name : str or int or 2-tuple The element keyword or tag to search for. Returns ------- bool ``True`` if the corresponding element is in the :class:`Dataset`, ``False`` otherwise. """ try: return Tag(name) in self._dict except Exception as exc: msg = ( f"Invalid value '{name}' used with the 'in' operator: must be " "an element tag as a 2-tuple or int, or an element keyword" ) if isinstance(exc, OverflowError): msg = ( "Invalid element tag value used with the 'in' operator: " "tags have a maximum value of (0xFFFF, 0xFFFF)" ) if config.INVALID_KEY_BEHAVIOR == "WARN": warn_and_log(msg) elif config.INVALID_KEY_BEHAVIOR == "RAISE": raise ValueError(msg) from exc return False def decode(self) -> None: """Apply character set decoding to the elements in the :class:`Dataset`. See DICOM Standard, Part 5, :dcm:`Section 6.1.1`. """ # Find specific character set. 'ISO_IR 6' is default # May be multi-valued, but let pydicom.charset handle all logic on that dicom_character_set = self._character_set # Shortcut to the decode function in pydicom.charset decode_data_element = pydicom.charset.decode_element # Callback for walk(), to decode the chr strings if necessary # This simply calls the pydicom.charset.decode_element function def decode_callback(ds: "Dataset", data_element: DataElement) -> None: """Callback to decode `data_element`.""" if data_element.VR == VR_.SQ: for dset in data_element.value: dset._parent_encoding = dicom_character_set dset.decode() else: decode_data_element(data_element, dicom_character_set) self.walk(decode_callback, recursive=False) def copy(self) -> "Dataset": """Return a shallow copy of the dataset.""" return copy.copy(self) def __delattr__(self, name: str) -> None: """Intercept requests to delete an attribute by `name`. Examples -------- >>> ds = Dataset() >>> ds.PatientName = 'foo' >>> ds.some_attribute = True If `name` is a DICOM keyword - delete the corresponding :class:`~pydicom.dataelem.DataElement` >>> del ds.PatientName >>> 'PatientName' in ds False If `name` is another attribute - delete it >>> del ds.some_attribute >>> hasattr(ds, 'some_attribute') False Parameters ---------- name : str The keyword for the DICOM element or the class attribute to delete. """ # First check if a valid DICOM keyword and if we have that data element tag = cast(BaseTag, tag_for_keyword(name)) if tag is not None and tag in self._dict: del self._dict[tag] # Deleting pixel data resets the stored array if tag in PIXEL_KEYWORDS: self._pixel_array = None self._pixel_id = {} # If not a DICOM name in this dataset, check for regular instance name # can't do delete directly, that will call __delattr__ again elif name in self.__dict__: del self.__dict__[name] # Not found, raise an error in same style as python does else: raise AttributeError(name) def __delitem__(self, key: "slice | BaseTag | TagType") -> None: """Intercept requests to delete an attribute by key. Examples -------- Indexing using :class:`~pydicom.dataelem.DataElement` tag >>> ds = Dataset() >>> ds.CommandGroupLength = 100 >>> ds.PatientName = 'CITIZEN^Jan' >>> del ds[0x00000000] >>> ds (0010,0010) Patient's Name PN: 'CITIZEN^Jan' Slicing using :class:`~pydicom.dataelem.DataElement` tag >>> ds = Dataset() >>> ds.CommandGroupLength = 100 >>> ds.SOPInstanceUID = '1.2.3' >>> ds.PatientName = 'CITIZEN^Jan' >>> del ds[:0x00100000] >>> ds (0010,0010) Patient's Name PN: 'CITIZEN^Jan' Parameters ---------- key The key for the attribute to be deleted. If a ``slice`` is used then the tags matching the slice conditions will be deleted. """ # If passed a slice, delete the corresponding DataElements if isinstance(key, slice): for tag in self._slice_dataset(key.start, key.stop, key.step): del self._dict[tag] # invalidate private blocks in case a private creator is # deleted - will be re-created on next access if self._private_blocks and BaseTag(tag).is_private_creator: self._private_blocks = {} if tag in PIXEL_KEYWORDS: self._pixel_array = None self._pixel_id = {} elif isinstance(key, BaseTag): del self._dict[key] if self._private_blocks and key.is_private_creator: self._private_blocks = {} # Deleting pixel data resets the stored array if key in PIXEL_KEYWORDS: self._pixel_array = None self._pixel_id = {} else: # If not a standard tag, than convert to Tag and try again tag = Tag(key) del self._dict[tag] if self._private_blocks and tag.is_private_creator: self._private_blocks = {} # Deleting pixel data resets the stored array if tag in PIXEL_KEYWORDS: self._pixel_array = None self._pixel_id = {} def __dir__(self) -> list[str]: """Return a list of methods, properties, attributes and element keywords available in the :class:`Dataset`. List of attributes is used, for example, in auto-completion in editors or command-line environments. """ names = set(super().__dir__()) keywords = set(self.dir()) return sorted(names | keywords) def dir(self, *filters: str) -> list[str]: """Return an alphabetical list of element keywords in the :class:`Dataset`. Intended mainly for use in interactive Python sessions. Only lists the element keywords in the current level of the :class:`Dataset` (i.e. the contents of any sequence elements are ignored). Parameters ---------- filters : str Zero or more string arguments to the function. Used for case-insensitive match to any part of the DICOM keyword. Returns ------- list of str The matching element keywords in the dataset. If no filters are used then all element keywords are returned. """ allnames = [keyword_for_tag(tag) for tag in self._dict.keys()] # remove blanks - tags without valid names (e.g. private tags) allnames = [x for x in allnames if x] # Store found names in a dict, so duplicate names appear only once matches = {} for filter_ in filters: filter_ = filter_.lower() match = [x for x in allnames if x.lower().find(filter_) != -1] matches.update({x: 1 for x in match}) if filters: return sorted(matches.keys()) return sorted(allnames) def __eq__(self, other: Any) -> bool: """Compare `self` and `other` for equality. Returns ------- bool The result if `self` and `other` are the same class NotImplemented If `other` is not the same class as `self` then returning :class:`NotImplemented` delegates the result to ``superclass.__eq__(subclass)``. """ # When comparing against self this will be faster if other is self: return True if isinstance(other, self.__class__): return _dict_equal(self, other) return NotImplemented @overload def get(self, key: str, default: Any | None = None) -> Any: pass # pragma: no cover @overload def get( self, key: int | tuple[int, int] | BaseTag, default: Any | None = None ) -> DataElement: pass # pragma: no cover def get( self, key: str | int | tuple[int, int] | BaseTag, default: Any | None = None ) -> Any | DataElement: """Simulate ``dict.get()`` to handle element tags and keywords. Parameters ---------- key : str or int or Tuple[int, int] or BaseTag The element keyword or tag or the class attribute name to get. default : obj or None, optional If the element or class attribute is not present, return `default` (default ``None``). Returns ------- value If `key` is the keyword for an element in the :class:`Dataset` then return the element's value. dataelem.DataElement If `key` is a tag for a element in the :class:`Dataset` then return the :class:`~pydicom.dataelem.DataElement` instance. value If `key` is a class attribute then return its value. """ if isinstance(key, str): try: return getattr(self, key) except AttributeError: return default # is not a string, try to make it into a tag and then hand it # off to the underlying dict try: key = Tag(key) except Exception as exc: raise TypeError("Dataset.get key must be a string or tag") from exc try: return self.__getitem__(key) except KeyError: return default def items(self) -> Set[tuple[BaseTag, _DatasetValue]]: """Return the :class:`Dataset` items to simulate :meth:`dict.items`. Returns ------- dict_items The top-level (:class:`~pydicom.tag.BaseTag`, :class:`~pydicom.dataelem.DataElement`) items for the :class:`Dataset`. """ return self._dict.items() def keys(self) -> Set[BaseTag]: """Return the :class:`Dataset` keys to simulate :meth:`dict.keys`. Returns ------- dict_keys The :class:`~pydicom.tag.BaseTag` of all the elements in the :class:`Dataset`. """ return self._dict.keys() def values(self) -> ValuesView[_DatasetValue]: """Return the :class:`Dataset` values to simulate :meth:`dict.values`. Returns ------- dict_keys The :class:`DataElements` that make up the values of the :class:`Dataset`. """ return self._dict.values() def __getattr__(self, name: str) -> Any: """Intercept requests for :class:`Dataset` attribute names. If `name` matches a DICOM keyword, return the value for the element with the corresponding tag. Parameters ---------- name : str An element keyword or a class attribute name. Returns ------- value If `name` matches a DICOM keyword, returns the corresponding element's value. Otherwise returns the class attribute's value (if present). """ tag = tag_for_keyword(name) if tag is not None: # None means `name` isn't a DICOM element keyword tag = Tag(tag) if tag in self._dict: return self[tag].value # no tag or tag not contained in the dataset if name == "_dict": # special handling for contained dict, needed for pickle return {} # Try the base class attribute getter (fix for issue 332) return object.__getattribute__(self, name) @property def _character_set(self) -> str | list[str]: """The character set used to encode text values.""" char_set = self.get(BaseTag(0x00080005), None) if not char_set: return self._parent_encoding return convert_encodings(char_set.value) @property def original_character_set(self) -> str | MutableSequence[str]: """Return the original character set encoding for a dataset decoded from a file or buffer. Returns ------- str | MutableSequence[str] The original character set encoding of the dataset as given by the (0008,0005) *Specific Character Set*, or `iso8859 `_ if the dataset has been created from scratch. """ return self._read_charset @property def read_encoding(self) -> str | MutableSequence[str]: """Return the original character set encoding for a decoded dataset. .. deprecated:: 3.0 ``read_encoding`` will be removed in v4.0, use :attr:`~pydicom.dataset.Dataset.original_character_set` instead. """ name = type(self).__name__ if config._use_future: raise AttributeError(f"'{name}' object has no attribute 'read_encoding'") warn_and_log( ( f"'{name}.read_encoding' will be removed in v4.0, use " f"'{name}.original_character_set' instead" ), DeprecationWarning, ) return self.original_character_set @read_encoding.setter def read_encoding(self, value: str | MutableSequence[str]) -> None: name = type(self).__name__ if config._use_future: raise AttributeError(f"'{name}' object has no attribute 'read_encoding'") warn_and_log( ( f"'{name}.read_encoding' will be removed in v4.0, use " f"'{name}.original_character_set' instead" ), DeprecationWarning, ) self._read_charset = value @overload def __getitem__(self, key: slice) -> "Dataset": pass # pragma: no cover @overload def __getitem__(self, key: TagType) -> DataElement: pass # pragma: no cover def __getitem__(self, key: "slice | TagType") -> "Dataset | DataElement": """Operator for ``Dataset[key]`` request. Any deferred data elements will be read in and an attempt will be made to correct any elements with ambiguous VRs. Examples -------- Indexing using :class:`~pydicom.dataelem.DataElement` tag >>> ds = Dataset() >>> ds.SOPInstanceUID = '1.2.3' >>> ds.PatientName = 'CITIZEN^Jan' >>> ds.PatientID = '12345' >>> ds[0x00100010].value 'CITIZEN^Jan' Slicing using element tags; all group ``0x0010`` elements in the dataset >>> ds[0x00100000:0x00110000] (0010,0010) Patient's Name PN: 'CITIZEN^Jan' (0010,0020) Patient ID LO: '12345' All group ``0x0002`` elements in the dataset >>> ds[(0x0002, 0x0000):(0x0003, 0x0000)] Parameters ---------- key The DICOM (group, element) tag in any form accepted by :func:`~pydicom.tag.Tag` such as ``[0x0010, 0x0010]``, ``(0x10, 0x10)``, ``0x00100010``, etc. May also be a :class:`slice` made up of DICOM tags. Returns ------- dataelem.DataElement or Dataset If a single DICOM element tag is used then returns the corresponding :class:`~pydicom.dataelem.DataElement`. If a :class:`slice` is used then returns a :class:`Dataset` object containing the corresponding :class:`DataElements`. """ # If passed a slice, return a Dataset containing the corresponding # DataElements if isinstance(key, slice): return self._dataset_slice(key) if isinstance(key, BaseTag): tag = key else: try: tag = Tag(key) except Exception as exc: raise KeyError(f"'{key}'") from exc elem = self._dict[tag] if isinstance(elem, RawDataElement): # If a deferred read, then go get the value now if elem.value is None and elem.length != 0: from pydicom.filereader import read_deferred_data_element src = self.filename or self.buffer if ( self.filename and self.buffer and not getattr(self.buffer, "closed", False) ): src = self.buffer elem = read_deferred_data_element( self.fileobj_type, src, self.timestamp, elem ) if tag != BaseTag(0x00080005): character_set = self.original_character_set or self._character_set else: character_set = default_encoding # Not converted from raw form read from file yet; do so now self[tag] = convert_raw_data_element(elem, encoding=character_set, ds=self) # On initial read of the dataset, propagate the pixel representation # (if any) to child datasets in any sequences. # This is used as part of the ambiguous VR correction for US or SS if self[tag].VR == VR_.SQ: self._set_pixel_representation(self[tag]) # If the Element has an ambiguous VR, try to correct it if self[tag].VR in AMBIGUOUS_VR: from pydicom.filewriter import correct_ambiguous_vr_element self[tag] = correct_ambiguous_vr_element(self[tag], self, elem[6]) return cast(DataElement, self._dict.get(tag)) def private_block( self, group: int, private_creator: str, create: bool = False ) -> PrivateBlock: """Return the block for the given tag `group` and `private_creator`. If `create` is ``True`` and the `private_creator` does not exist, the private creator tag is added. Notes ----- We ignore the unrealistic case that no free block is available. Parameters ---------- group : int The group of the private tag to be found as a 32-bit :class:`int`. Must be an odd number (e.g. a private group). private_creator : str The private creator string associated with the tag. create : bool, optional If ``True`` and `private_creator` does not exist, a new private creator tag is added at the next free block. If ``False`` (the default) and `private_creator` does not exist, :class:`KeyError` is raised instead. Returns ------- PrivateBlock The existing or newly created private block. Raises ------ ValueError If `group` doesn't belong to a private tag or `private_creator` is empty. KeyError If the private creator tag is not found in the given group and the `create` parameter is ``False``. """ def new_block(element: int) -> PrivateBlock: block = PrivateBlock(key, self, element) self._private_blocks[key] = block return block key = (group, private_creator) if key in self._private_blocks: return self._private_blocks[key] if not private_creator: raise ValueError("Private creator must have a value") if group % 2 == 0: raise ValueError("Tag must be private if private creator is given") # find block with matching private creator block = self[(group, 0x10):(group, 0x100)] # type: ignore[misc] data_el = next((elem for elem in block if elem.value == private_creator), None) if data_el is not None: return new_block(data_el.tag.element) if not create: # not found and shall not be created - raise raise KeyError(f"Private creator '{private_creator}' not found") # private creator not existing - find first unused private block # and add the private creator first_free_el = next( el for el in range(0x10, 0x100) if Tag(group, el) not in self._dict ) self.add_new(Tag(group, first_free_el), "LO", private_creator) return new_block(first_free_el) def private_creators(self, group: int) -> list[str]: """Return a list of private creator names in the given group. Examples -------- This can be used to check if a given private creator exists in the group of the dataset: >>> ds = Dataset() >>> if 'My Creator' in ds.private_creators(0x0041): ... block = ds.private_block(0x0041, 'My Creator') Parameters ---------- group : int The private group as a 32-bit :class:`int`. Must be an odd number. Returns ------- list of str All private creator names for private blocks in the group. Raises ------ ValueError If `group` is not a private group. """ if group % 2 == 0: raise ValueError("Group must be an odd number") block = self[(group, 0x10):(group, 0x100)] # type: ignore[misc] return [x.value for x in block] def get_private_item( self, group: int, element_offset: int, private_creator: str ) -> DataElement: """Return the data element for the given private tag `group`. This is analogous to ``Dataset.__getitem__()``, but only for private tags. This allows to find the private tag for the correct private creator without the need to add the tag to the private dictionary first. Parameters ---------- group : int The private tag group where the item is located as a 32-bit int. element_offset : int The lower 16 bits (e.g. 2 hex numbers) of the element tag. private_creator : str The private creator for the tag. Must match the private creator for the tag to be returned. Returns ------- dataelem.DataElement The corresponding element. Raises ------ ValueError If `group` is not part of a private tag or `private_creator` is empty. KeyError If the private creator tag is not found in the given group. If the private tag is not found. """ block = self.private_block(group, private_creator) return self.__getitem__(block.get_tag(element_offset)) @overload def get_item(self, key: slice, *, keep_deferred: bool = ...) -> "Dataset": pass # pragma: no cover @overload def get_item(self, key: TagType, *, keep_deferred: bool = ...) -> DataElement: pass # pragma: no cover def get_item( self, key: "slice | TagType", *, keep_deferred: bool = False, ) -> "Dataset | DataElement | RawDataElement | None": """Return the raw data element if possible. It will be raw if the user has never accessed the value, or set their own value. Note if the data element is a deferred-read element, then it is read and converted before being returned. .. versionchanged: 3.0 Added the `keep_deferred` keyword argument. Parameters ---------- key The DICOM (group, element) tag in any form accepted by :func:`~pydicom.tag.Tag` such as ``[0x0010, 0x0010]``, ``(0x10, 0x10)``, ``0x00100010``, etc. May also be a :class:`slice` made up of DICOM tags. keep_deferred : bool, optional If ``True`` then when returning :class:`~pydicom.dataelem.RawDataElement` do not perform the deferred read of the element's value (accessing the value will return ``None`` instead). Default ``False``. Returns ------- dataelem.DataElement | dataelem.RawDataElement The corresponding element. """ if isinstance(key, slice): return self._dataset_slice(key) elem = self._dict.get(Tag(key)) # If a deferred read, return using __getitem__ to read and convert it if ( isinstance(elem, RawDataElement) and not keep_deferred and elem.value is None ): return self[key] return elem def _dataset_slice(self, slce: slice) -> "Dataset": """Return a slice that has the same properties as the original dataset. That includes properties related to endianness and VR handling, and the specific character set. No element conversion is done, e.g. elements of type ``RawDataElement`` are kept. """ tags = self._slice_dataset(slce.start, slce.stop, slce.step) ds = Dataset({tag: self.get_item(tag) for tag in tags}) is_implicit, is_little = self.original_encoding ds.set_original_encoding(is_implicit, is_little, self.original_character_set) if not config._use_future: ds._is_little_endian = self.is_little_endian ds._is_implicit_VR = self.is_implicit_VR return ds @property def is_implicit_VR(self) -> bool | None: """Get/set the VR method used when encoding the dataset. .. deprecated:: 3.0 ``is_implicit_VR`` will be removed in v4.0, set the *Transfer Syntax UID* or use the `implicit_vr` argument with :meth:`~pydicom.dataset.Dataset.save_as` or :func:`~pydicom.filewriter.dcmwrite` instead. Returns ------- bool | None If the dataset has been created from scratch then returns ``None``, otherwise returns the VR encoding method used by the decoded dataset. """ if config._use_future: raise AttributeError( f"'{type(self).__name__}' object has no attribute 'is_implicit_VR'" ) return self._is_implicit_VR @is_implicit_VR.setter def is_implicit_VR(self, value: bool | None) -> None: name = type(self).__name__ if config._use_future: raise AttributeError(f"'{name}' object has no attribute 'is_implicit_VR'") warn_and_log( ( f"'{name}.is_implicit_VR' will be removed in v4.0, set the " "Transfer Syntax UID or use the 'implicit_vr' argument with " f"{name}.save_as() or dcmwrite() instead" ), DeprecationWarning, ) self._is_implicit_VR = value @property def is_little_endian(self) -> bool | None: """Get/set the endianness used when encoding the dataset. .. deprecated:: 3.0 ``is_little_endian`` will be removed in v4.0, set the *Transfer Syntax UID* or use the `little_endian` argument with :meth:`~pydicom.dataset.Dataset.save_as` or :func:`~pydicom.filewriter.dcmwrite` instead. Returns ------- bool | None If the dataset has been created from scratch then returns ``None``, otherwise returns the endianness of the encoding used by the decoded dataset. """ if config._use_future: raise AttributeError( f"'{type(self).__name__}' object has no attribute 'is_little_endian'" ) return self._is_little_endian @is_little_endian.setter def is_little_endian(self, value: bool | None) -> None: name = type(self).__name__ if config._use_future: raise AttributeError(f"'{name}' object has no attribute 'is_little_endian'") warn_and_log( ( f"'{name}.is_little_endian' will be removed in v4.0, set the " "Transfer Syntax UID or use the 'little_endian' argument with " f"{name}.save_as() or dcmwrite() instead" ), DeprecationWarning, ) self._is_little_endian = value @property def is_original_encoding(self) -> bool: """Return ``True`` if the encoding to be used for writing is set and is the same as that used to originally encode the :class:`Dataset`. This includes properties related to endianness, VR handling and the (0008,0005) *Specific Character Set*. """ if config._use_future: return self.original_character_set == self._character_set current_encoding = (self.is_implicit_VR, self.is_little_endian) return ( None not in current_encoding and self.original_encoding == current_encoding and self.original_character_set == self._character_set ) @property def original_encoding(self) -> tuple[bool, bool] | tuple[None, None]: """Return the original encoding used for a dataset decoded from a file or buffer. Returns ------- tuple[bool, bool] | tuple[None, None] For a dataset decoded from a file or buffer this is whether the encoding used implicit/explicit VR and little/big endian as ``(encoded as implicit VR, encoded as little endian)``. Returns ``(None, None)`` for a dataset created from scratch. """ return cast( tuple[bool, bool] | tuple[None, None], (self._read_implicit, self._read_little), ) def set_original_encoding( self, is_implicit_vr: bool | None, is_little_endian: bool | None, character_encoding: str | MutableSequence[str] | None = None, ) -> None: """Set the values for the original dataset encoding. Can be used for a :class:`Dataset` with raw data elements to enable optimized writing (e.g. without decoding the data elements). .. versionchanged:: 3.0 `character_encoding` is now optional Parameters ---------- is_implicit_vr : bool | None The the original VR encoding of the dataset, ``True`` for implicit VR, ``False`` for explicit VR or ``None`` to reset. is_little_endian : bool | None Set the original endianness of the dataset, ``True`` for little endian, ``False`` for big or ``None`` to reset. character_encoding : str | MutableSequence[str], optional Set the original character set encoding of the dataset. If ``None`` then no changes will be made to the original character set encoding. """ self._read_implicit = is_implicit_vr self._read_little = is_little_endian if character_encoding is not None: self._read_charset = character_encoding def group_dataset(self, group: int) -> "Dataset": """Return a :class:`Dataset` containing only elements of a certain group. Parameters ---------- group : int The group part of a DICOM (group, element) tag. Returns ------- Dataset A :class:`Dataset` containing elements of the group specified. """ return self[(group, 0x0000) : (group + 1, 0x0000)] # type: ignore[misc] def __iter__(self) -> Iterator[DataElement]: """Iterate through the top-level of the Dataset, yielding DataElements. Examples -------- >>> ds = Dataset() >>> for elem in ds: ... print(elem) The :class:`DataElements` are returned in increasing tag value order. Sequence items are returned as a single :class:`~pydicom.dataelem.DataElement`, so it is up to the calling code to recurse into the Sequence items if desired. Yields ------ dataelem.DataElement The :class:`Dataset`'s :class:`DataElements`, sorted by increasing tag order. """ # Note this is different than the underlying dict class, # which returns the key of the key:value mapping. # Here the value is returned (but data_element.tag has the key) taglist = sorted(self._dict.keys()) for tag in taglist: yield self[tag] def elements(self) -> Iterator[DataElement | RawDataElement]: """Yield the top-level elements of the :class:`Dataset`. Examples -------- >>> ds = Dataset() >>> for elem in ds.elements(): ... print(elem) The elements are returned in the same way as in ``Dataset.__getitem__()``. Yields ------ dataelem.DataElement or dataelem.RawDataElement The unconverted elements sorted by increasing tag order. """ taglist = sorted(self._dict.keys()) for tag in taglist: yield self.get_item(tag) def __len__(self) -> int: """Return the number of elements in the top level of the dataset.""" return len(self._dict) def __ne__(self, other: Any) -> bool: """Compare `self` and `other` for inequality.""" return not self == other def clear(self) -> None: """Delete all the elements from the :class:`Dataset`.""" self._dict.clear() def pop(self, key: "BaseTag | TagType", *args: Any) -> _DatasetValue: """Emulate :meth:`dict.pop` with support for tags and keywords. Removes the element for `key` if it exists and returns it, otherwise returns a default value if given or raises :class:`KeyError`. Parameters ---------- key : int or str or 2-tuple * If :class:`tuple` - the group and element number of the DICOM tag * If :class:`int` - the combined group/element number * If :class:`str` - the DICOM keyword of the tag *args : zero or one argument Defines the behavior if no tag exists for `key`: if given, it defines the return value, if not given, :class:`KeyError` is raised Returns ------- RawDataElement or DataElement The element for `key` if it exists, or the default value if given. Raises ------ KeyError If the `key` is not a valid tag or keyword. If the tag does not exist and no default is given. """ try: key = Tag(key) except Exception: pass return self._dict.pop(cast(BaseTag, key), *args) def popitem(self) -> tuple[BaseTag, _DatasetValue]: """Emulate :meth:`dict.popitem`. Returns ------- tuple of (BaseTag, DataElement) """ return self._dict.popitem() def setdefault(self, key: TagType, default: Any | None = None) -> DataElement: """Emulate :meth:`dict.setdefault` with support for tags and keywords. Examples -------- >>> ds = Dataset() >>> elem = ds.setdefault((0x0010, 0x0010), "Test") >>> elem (0010,0010) Patient's Name PN: 'Test' >>> elem.value 'Test' >>> elem = ds.setdefault('PatientSex', ... DataElement(0x00100040, 'CS', 'F')) >>> elem.value 'F' Parameters ---------- key : int, str or 2-tuple of int * If :class:`tuple` - the group and element number of the DICOM tag * If :class:`int` - the combined group/element number * If :class:`str` - the DICOM keyword of the tag default : pydicom.dataelem.DataElement or object, optional The :class:`~pydicom.dataelem.DataElement` to use with `key`, or the value of the :class:`~pydicom.dataelem.DataElement` to use with `key` (default ``None``). Returns ------- pydicom.dataelem.DataElement or object The :class:`~pydicom.dataelem.DataElement` for `key`. Raises ------ ValueError If `key` is not convertible to a valid tag or a known element keyword. KeyError If :attr:`~pydicom.config.settings.reading_validation_mode` is ``RAISE`` and `key` is an unknown non-private tag. """ tag = Tag(key) if tag in self: return self[tag] vr: str | VR_ if not isinstance(default, DataElement): if tag.is_private: vr = VR_.UN else: try: vr = dictionary_VR(tag) except KeyError: if config.settings.writing_validation_mode == config.RAISE: raise KeyError(f"Unknown DICOM tag {tag}") vr = VR_.UN warn_and_log(f"Unknown DICOM tag {tag} - setting VR to 'UN'") default = DataElement(tag, vr, default) self[key] = default return default def convert_pixel_data(self, handler_name: str = "") -> None: """Convert pixel data to a :class:`numpy.ndarray` internally. .. deprecated:: 3.0 This method will be removed in v4.0, use :meth:`~pydicom.dataset.Dataset.pixel_array_options` instead. Parameters ---------- handler_name : str, optional The name of the pixel handler or decoding plugin to use to decode the dataset's pixel data. Support values are: * If using the :mod:`~pydicom.pixel_data_handlers` backend: ``'gdcm'``, ``'pillow'``, ``'jpeg_ls'``, ``'rle'``, ``'numpy'`` and ``'pylibjpeg'``. * If using the :mod:`~pydicom.pixels` backend see the :doc:`documentation for the decoder` corresponding to the dataset's *Transfer Syntax UID*. If not used (the default) then all available handlers or plugins will be tried and the data from first successful one will be used. Returns ------- None Converted pixel data is stored internally in the dataset, it can be accessed with the :attr:`~pydicom.dataset.Dataset.pixel_array` property. Raises ------ ValueError If `handler_name` is not a valid handler name. NotImplementedError If the given handler or any handler, if none given, is unable to decompress pixel data with the current transfer syntax RuntimeError If the given handler, or the handler that has been selected if none given, is not available. Notes ----- If the pixel data is in a compressed image format, the data is decompressed and any related data elements are changed accordingly. """ # TODO: Remove in v4.0 if config._use_future: raise AttributeError( f"'{type(self).__name__}' object has no attribute 'convert_pixel_data'" ) # Check if already have converted to a NumPy array # Also check if pixel data has changed. If so, get new NumPy array already_have = True if not hasattr(self, "_pixel_array"): already_have = False elif self._pixel_array is None: already_have = False # Checking `_pixel_id` may sometimes give a false result if the pixel # data memory has been freed (such as with ds.PixelData = None) # prior to setting a new value; Python may reuse that freed memory # for the new value and therefore give the same `id()` value if self._pixel_id != get_image_pixel_ids(self): already_have = False if already_have: return opts = self._pixel_array_opts.copy() name = handler_name.lower() if handler_name else opts.get("decoding_plugin", "") if not opts["use_pdh"]: # Use 'pydicom.pixels' backend opts["decoding_plugin"] = name self._pixel_array = pixel_array(self, **opts) self._pixel_id = get_image_pixel_ids(self) else: # Use 'pydicom.pixel_data_handlers' backend if name: self._convert_pixel_data_using_handler(name) else: self._convert_pixel_data_without_handler() def _convert_pixel_data_using_handler(self, name: str) -> None: """Convert the pixel data using handler with the given name. See :meth:`~Dataset.convert_pixel_data` for more information. """ # TODO: Remove in v4.0 # handle some variations in name handler_name = name.lower() if not handler_name.endswith("_handler"): handler_name += "_handler" if handler_name == "numpy_handler": handler_name = "np_handler" if handler_name == "jpeg_ls_handler": # the name in config differs from the actual handler name # we allow both handler_name = "jpegls_handler" if not hasattr(pydicom.config, handler_name): raise ValueError(f"'{name}' is not a known handler name") handler = getattr(pydicom.config, handler_name) tsyntax = self.file_meta.TransferSyntaxUID if not handler.supports_transfer_syntax(tsyntax): raise NotImplementedError( "Unable to decode pixel data with a transfer syntax UID" f" of '{tsyntax}' ({tsyntax.name}) using the pixel data " f"handler '{name}'. Please see the pydicom documentation for " "information on supported transfer syntaxes." ) if not handler.is_available(): raise RuntimeError( f"The pixel data handler '{name}' is not available on your " "system. Please refer to the pydicom documentation for " "information on installing needed packages." ) # if the conversion fails, the exception is propagated up self._do_pixel_data_conversion(handler) def _convert_pixel_data_without_handler(self) -> None: """Convert the pixel data using the first matching handler. See :meth:`~Dataset.convert_pixel_data` for more information. """ # TODO: Remove in v4.0 # Find all possible handlers that support the transfer syntax ts = self.file_meta.TransferSyntaxUID possible_handlers = [ hh for hh in pydicom.config.pixel_data_handlers if hh is not None and hh.supports_transfer_syntax(ts) ] # No handlers support the transfer syntax if not possible_handlers: raise NotImplementedError( "Unable to decode pixel data with a transfer syntax UID of " f"'{ts}' ({ts.name}) as there are no pixel data " "handlers available that support it. Please see the pydicom " "documentation for information on supported transfer syntaxes " ) # Handlers that both support the transfer syntax and have their # dependencies met available_handlers = [hh for hh in possible_handlers if hh.is_available()] # There are handlers that support the transfer syntax but none of them # can be used as missing dependencies if not available_handlers: # For each of the possible handlers we want to find which # dependencies are missing msg = ( "The following handlers are available to decode the pixel " "data however they are missing required dependencies: " ) pkg_msg = [] for hh in possible_handlers: hh_deps = hh.DEPENDENCIES # Missing packages missing = [dd for dd in hh_deps if have_package(dd) is None] # Package names names = [hh_deps[name][1] for name in missing] pkg_msg.append(f"{hh.HANDLER_NAME} (req. {', '.join(names)})") raise RuntimeError(msg + ", ".join(pkg_msg)) last_exception = None for handler in available_handlers: try: self._do_pixel_data_conversion(handler) return except Exception as exc: logger.debug("Exception raised by pixel data handler", exc_info=exc) last_exception = exc # The only way to get to this point is if we failed to get the pixel # array because all suitable handlers raised exceptions self._pixel_array = None self._pixel_id = {} logger.info( "Unable to decode the pixel data using the following handlers: {}." "Please see the list of supported Transfer Syntaxes in the " "pydicom documentation for alternative packages that might " "be able to decode the data".format( ", ".join([str(hh) for hh in available_handlers]) ) ) raise last_exception # type: ignore[misc] def _do_pixel_data_conversion(self, handler: Any) -> None: """Do the actual data conversion using the given handler.""" # TODO: Remove in v4.0 # Use the handler to get a 1D numpy array of the pixel data # Will raise an exception if no pixel data element arr = handler.get_pixeldata(self) self._pixel_array = reshape_pixel_array(self, arr) # Some handler/transfer syntax combinations may need to # convert the color space from YCbCr to RGB if handler.needs_to_convert_to_RGB(self): self._pixel_array = convert_color_space( self._pixel_array, "YBR_FULL", "RGB" ) self._pixel_id = get_image_pixel_ids(self) def compress( self, transfer_syntax_uid: str, arr: "numpy.ndarray | None" = None, encoding_plugin: str = "", encapsulate_ext: bool = False, *, generate_instance_uid: bool = True, jls_error: int | None = None, j2k_cr: list[float] | None = None, j2k_psnr: list[float] | None = None, **kwargs: Any, ) -> None: """Compress uncompressed pixel data and update `ds` in-place with the resulting :dcm:`encapsulated` codestream. .. versionadded:: 2.2 The dataset `ds` must already have the following :dcm:`Image Pixel` module elements present with correct values that correspond to the resulting compressed pixel data: * (0028,0002) *Samples per Pixel* * (0028,0004) *Photometric Interpretation* * (0028,0008) *Number of Frames* (if more than 1 frame will be present) * (0028,0010) *Rows* * (0028,0011) *Columns* * (0028,0100) *Bits Allocated* * (0028,0101) *Bits Stored* * (0028,0103) *Pixel Representation* If *Samples per Pixel* is greater than 1 then the following element is also required: * (0028,0006) *Planar Configuration* This method will add the file meta dataset if none is present and add or modify the following elements: * (0002,0010) *Transfer Syntax UID* * (7FE0,0010) *Pixel Data* If the compressed pixel data is too large for encapsulation using a basic offset table then an :dcm:`extended offset table ` will also be used, in which case the following elements will also be added: * (7FE0,0001) *Extended Offset Table* * (7FE0,0002) *Extended Offset Table Lengths* If `generate_instance_uid` is ``True`` (default) then a new (0008,0018) *SOP Instance UID* value will be generated. **Supported Transfer Syntax UIDs** +-----------------------------------------------+-----------+----------------------------------+ | UID | Plugins | Encoding Guide | +------------------------+----------------------+ | | | Name | Value | | | +========================+======================+===========+==================================+ |*JPEG-LS Lossless* |1.2.840.10008.1.2.4.80| pyjpegls | :doc:`JPEG-LS | +------------------------+----------------------+ | ` | | *JPEG-LS Near Lossless*|1.2.840.10008.1.2.4.81| | | +------------------------+----------------------+-----------+----------------------------------+ | *JPEG 2000 Lossless* |1.2.840.10008.1.2.4.90| pylibjpeg | :doc:`JPEG 2000 | +------------------------+----------------------+ | ` | | *JPEG 2000* |1.2.840.10008.1.2.4.91| | | +------------------------+----------------------+-----------+----------------------------------+ | *RLE Lossless* | 1.2.840.10008.1.2.5 | pydicom, | :doc:`RLE Lossless | | | | pylibjpeg,| ` | | | | gdcm | | +------------------------+----------------------+-----------+----------------------------------+ .. versionchanged:: 3.0 Added the `jls_error`, `j2k_cr`, `j2k_psnr` and `generate_instance_uid` keyword parameters. Examples -------- Compress the existing uncompressed *Pixel Data* in place: >>> from pydicom import examples >>> from pydicom.uid import RLELossless >>> ds = examples.ct >>> ds.compress(RLELossless) >>> ds.save_as("ct_rle_lossless.dcm") Parameters ---------- transfer_syntax_uid : pydicom.uid.UID The UID of the :dcm:`transfer syntax` to use when compressing the pixel data. arr : numpy.ndarray, optional Compress the uncompressed pixel data in `arr` and use it to set the *Pixel Data*. If `arr` is not used then the existing *Pixel Data* in the dataset will be compressed instead. The :attr:`~numpy.ndarray.shape`, :class:`~numpy.dtype` and contents of the array should match the dataset. encoding_plugin : str, optional Use the `encoding_plugin` to compress the pixel data. See the :doc:`user guide ` for a list of plugins available for each UID and their dependencies. If not specified then all available plugins will be tried (default). encapsulate_ext : bool, optional If ``True`` then force the addition of an extended offset table. If ``False`` (default) then an extended offset table will be added if needed for large amounts of compressed *Pixel Data*, otherwise just the basic offset table will be used. generate_instance_uid : bool, optional If ``True`` (default) then generate a new (0008,0018) *SOP Instance UID* value for the dataset using :func:`~pydicom.uid.generate_uid`, otherwise keep the original value. jls_error : int, optional **JPEG-LS Near Lossless only**. The allowed absolute compression error in the pixel values. j2k_cr : list[float], optional **JPEG 2000 only**. A list of the compression ratios to use for each quality layer. There must be at least one quality layer and the minimum allowable compression ratio is ``1``. When using multiple quality layers they should be ordered in decreasing value from left to right. For example, to use 2 quality layers with 20x and 5x compression ratios then `j2k_cr` should be ``[20, 5]``. Cannot be used with `j2k_psnr`. j2k_psnr : list[float], optional **JPEG 2000 only**. A list of the peak signal-to-noise ratios (in dB) to use for each quality layer. There must be at least one quality layer and when using multiple quality layers they should be ordered in increasing value from left to right. For example, to use 2 quality layers with PSNR of 80 and 300 then `j2k_psnr` should be ``[80, 300]``. Cannot be used with `j2k_cr`. **kwargs Optional keyword parameters for the encoding plugin may also be present. See the :doc:`encoding plugins options ` for more information. """ compress( self, transfer_syntax_uid, arr, encoding_plugin=encoding_plugin, encapsulate_ext=encapsulate_ext, generate_instance_uid=generate_instance_uid, jls_error=jls_error, j2k_cr=j2k_cr, j2k_psnr=j2k_psnr, **kwargs, ) def decompress( self, handler_name: str = "", *, as_rgb: bool = True, generate_instance_uid: bool = True, decoding_plugin: str = "", **kwargs: Any, ) -> None: """Perform an in-place decompression of a dataset with a compressed *Transfer Syntax UID*. .. warning:: This function requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decoding. See the :doc:`pixel data decompression documentation ` for more information. * The dataset's *Transfer Syntax UID* will be set to *Explicit VR Little Endian*. * The *Pixel Data* will be decompressed in its entirety and the *Pixel Data* element's value updated with the decompressed data, padded to an even length. * The *Pixel Data* element's VR will be set to **OB** if *Bits Allocated* <= 8, otherwise it will be set to **OW**. * The :attr:`DataElement.is_undefined_length ` attribute for the *Pixel Data* element will be set to ``False``. * Any :dcm:`image pixel` module elements may be modified as required to match the uncompressed *Pixel Data*. * If `generate_instance_uid` is ``True`` (default) then a new (0008,0018) *SOP Instance UID* value will be generated. .. versionchanged:: 3.0 Added the `as_rgb` and `generate_instance_uid` keyword parameters. .. deprecated:: 3.0 The `handler_name` parameter will be removed in v4.0, use `decoding_plugin` instead. Parameters ---------- handler_name : str, optional Deprecated and will be removed in v4.0, use `decoding_plugin` instead. as_rgb : bool, optional :mod:`~pydicom.pixels` **backend only.** If ``True`` (default) then convert pixel data with a YCbCr :ref:`photometric interpretation ` such as ``"YBR_FULL_422"`` to RGB. generate_instance_uid : bool, optional If ``True`` (default) then generate a new (0008,0018) *SOP Instance UID* value for the dataset using :func:`~pydicom.uid.generate_uid`, otherwise keep the original value. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one yielded. * If using the :mod:`~pydicom.pixels` backend (default) then see the :doc:`API documentation` for the available plugins for each *Transfer Syntax UID*. * If using the deprecated :mod:`~pydicom.pixel_data_handlers` backend supported plugins are: ``'gdcm'``, ``'pillow'``, ``'jpeg_ls'``, ``'rle'``, ``'numpy'`` and ``'pylibjpeg'``. kwargs : dict[str, Any], optional :mod:`~pydicom.pixels` **backend only.** Optional keyword parameters for the decoding plugin may also be present. See the :doc:`decoding plugins options` for more information. """ # TODO: remove support for pixel_data_handlers module in v4.0 if config._use_future and kwargs.get("handler_name", handler_name): raise TypeError( f"{type(self).__name__}.decompress() got an unexpected " "keyword argument 'handler_name'" ) opts = self._pixel_array_opts.copy() if handler_name: opts["decoding_plugin"] = handler_name if decoding_plugin: opts["decoding_plugin"] = decoding_plugin opts.update(**kwargs) decompress( self, as_rgb=as_rgb, generate_instance_uid=generate_instance_uid, **opts, ) def overlay_array(self, group: int) -> "numpy.ndarray": """Return the *Overlay Data* in `group` as a :class:`numpy.ndarray`. Parameters ---------- group : int The group number of the overlay data. Returns ------- numpy.ndarray The (`group`,3000) *Overlay Data* converted to a :class:`numpy.ndarray`. """ if group < 0x6000 or group > 0x60FF: raise ValueError( "The group part of the 'Overlay Data' element tag must be " "between 0x6000 and 0x60FF (inclusive)" ) if not config.have_numpy: raise ImportError( f"NumPy is required for {type(self).__name__}.overlay_array()" ) from pydicom.overlays import get_overlay_array return get_overlay_array(self, group) @property def pixel_array(self) -> "numpy.ndarray": """Return the pixel data as a :class:`numpy.ndarray`. .. warning:: This property requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decoding. See the :doc:`pixel data decompression documentation ` for more information. .. versionchanged:: 3.0 The backend used for pixel data decoding has changed from the :mod:`~pydicom.pixel_data_handlers` module to the :mod:`~pydicom.pixels` module. The behavior of the new backend is not backwards compatible with the old one, in particular the default color space should now be RGB when previously YCbCr data was returned. To revert to the deprecated :mod:`~pydicom.pixel_data_handlers` backend pass ``use_v2_backend=True`` to the :meth:`~pydicom.dataset.Dataset.pixel_array_options` method:: >>> from pydicom import examples >>> ds = examples.ct >>> ds.pixel_array_options(use_v2_backend=True) >>> arr = ds.pixel_array The :mod:`~pydicom.pixel_data_handlers` module and the `use_v2_backend` keyword argument will be removed in v4.0. Returns ------- numpy.ndarray The contents of the (7FE0,0008) *Float Pixel Data*, (7FE0,0009) *Double Float Pixel Data* or (7FE0,0010) *Pixel Data* elements converted to a :class:`numpy.ndarray`. The array will be shaped as: * (rows, columns) for single frame, single sample data * (rows, columns, samples) for single frame, multi-sample data * (frames, rows, columns) for multi-frame, single sample data * (frames, rows, columns, samples) for multi-frame, multi-sample data When using the :mod:`pydicom.pixels` backend the decoding options used with the returned array can be customized via the :meth:`~pydicom.dataset.Dataset.pixel_array_options` method. See Also -------- pydicom.pixels.pixel_array A function for returning the pixel data from the path to a dataset, a readable file-like containing a dataset or a :class:`~pydicom.dataset.Dataset` instance. Can be used to minimize the memory required to return the pixel data when used with a path or file-like. pydicom.pixels.iter_pixels Similar to :func:`pydicom.pixels.pixel_array` but returns a generator that iterates through the image frames. """ self.convert_pixel_data() return cast("numpy.ndarray", self._pixel_array) def pixel_array_options( self, *, index: int | None = None, raw: bool = False, decoding_plugin: str = "", use_v2_backend: bool = False, **kwargs: Any, ) -> None: """Set the decoding and processing options used by the :attr:`~pydicom.dataset.Dataset.pixel_array` property. .. versionadded:: 3.0 .. deprecated:: 3.0 The `use_v2_backend` keyword parameter will be removed in v4.0. **Processing** The following processing operations on the raw pixel data will always be performed: * Natively encoded bit-packed pixel data for a :ref:`bits allocated ` of ``1`` will be unpacked. * Natively encoded pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL_422"`` will have it's sub-sampling removed. * The output array will be reshaped to the specified dimensions. * JPEG-LS or JPEG 2000 encoded data whose signedness doesn't match the expected :ref:`pixel representation` will be converted to match. With the :mod:`pydicom.pixels` backend, if ``raw = False`` (the default) then the following processing operation will also be performed: * Pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL"`` or ``"YBR_FULL_422"`` will be converted to RGB. Examples -------- Convert the *Pixel Data* to an array that's a view on the original buffer:: >>> from pydicom import examples >>> ds = examples.ct >>> ds.pixel_array_options(view_only=True) >>> arr = ds.pixel_array Use the deprecated :mod:`~pydicom.pixel_data_handlers` backend to convert the *Pixel Data* to an array:: >>> from pydicom import examples >>> ds = examples.ct >>> ds.pixel_array_options(use_v2_backend=True) >>> arr = ds.pixel_array Parameters ---------- index : int | None, optional If ``None`` (default) then return an array containing all the frames in the pixel data, otherwise return one containing only the frame from the specified `index`, which starts at 0 for the first frame. Only available with the :mod:`~pydicom.pixels` backend. raw : bool, optional If ``True`` then return the decoded pixel data after only minimal processing (see the processing section above). If ``False`` (default) then additional processing may be applied to convert the pixel data to it's most commonly used form (such as converting from YCbCr to RGB). Only available with the :mod:`~pydicom.pixels` backend. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one returned. For information on the available plugins for each *Transfer Syntax UID*: * If using the :mod:`~pydicom.pixels` backend see the :doc:`documentation for the decoder` corresponding to the dataset's *Transfer Syntax UID*. * If using the :mod:`~pydicom.pixel_data_handlers` backend supported values are ``'gdcm'``, ``'pillow'``, ``'jpeg_ls'``, ``'rle'``, ``'numpy'`` and ``'pylibjpeg'``. use_v2_backend : bool, optional If ``False`` (default) then use the :mod:`pydicom.pixels` backend to decode the pixel data, otherwise use the deprecated :mod:`pydicom.pixel_data_handlers` backend. **kwargs Optional keyword parameters for controlling decoding with the :mod:`~pydicom.pixels` backend, please see the :doc:`decoding options documentation` for more information. """ if config._use_future and kwargs.get("use_v2_backend", use_v2_backend): raise TypeError( f"{type(self).__name__}.pixel_array_options() got an unexpected " "keyword argument 'use_v2_backend'" ) kwargs["index"] = index kwargs["raw"] = raw if decoding_plugin: kwargs["decoding_plugin"] = decoding_plugin.lower() kwargs["use_pdh"] = False if config._use_future else use_v2_backend self._pixel_array_opts = kwargs self._pixel_array = None self._pixel_id = {} def waveform_array(self, index: int) -> "numpy.ndarray": """Return an :class:`~numpy.ndarray` for the multiplex group at `index` in the (5400,0100) *Waveform Sequence*. .. versionadded:: 2.1 Parameters ---------- index : int The index of the multiplex group to return the array for. Returns ------ numpy.ndarray The *Waveform Data* for the multiplex group as an :class:`~numpy.ndarray` with shape (samples, channels). If (003A,0210) *Channel Sensitivity* is present then the values will be in the units specified by the (003A,0211) *Channel Sensitivity Units Sequence*. See Also -------- :func:`~pydicom.waveforms.numpy_handler.generate_multiplex` :func:`~pydicom.waveforms.numpy_handler.multiplex_array` """ if not wave_handler.is_available(): raise RuntimeError("The waveform data handler requires numpy") return wave_handler.multiplex_array(self, index, as_raw=False) # Format strings spec'd according to python string formatting options # See https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting default_element_format = "%(tag)s %(name)-35.35s %(VR)s: %(repval)s" default_sequence_element_format = "%(tag)s %(name)-35.35s %(VR)s: %(repval)s" def formatted_lines( self, element_format: str = default_element_format, sequence_element_format: str = default_sequence_element_format, indent_format: str | None = None, ) -> Iterator[str]: """Iterate through the :class:`Dataset` yielding formatted :class:`str` for each element. Parameters ---------- element_format : str The string format to use for non-sequence elements. Formatting uses the attributes of :class:`~pydicom.dataelem.DataElement`. Default is ``"%(tag)s %(name)-35.35s %(VR)s: %(repval)s"``. sequence_element_format : str The string format to use for sequence elements. Formatting uses the attributes of :class:`~pydicom.dataelem.DataElement`. Default is ``"%(tag)s %(name)-35.35s %(VR)s: %(repval)s"`` indent_format : str or None Placeholder for future functionality. Yields ------ str A string representation of an element. """ exclusion = ( "from_json", "to_json", "to_json_dict", "clear", "description", "validate", ) for elem in self.iterall(): # Get all the attributes possible for this data element (e.g. # gets descriptive text name too) # This is the dictionary of names that can be used in the format # string elem_dict = { attr: ( getattr(elem, attr)() if callable(getattr(elem, attr)) else getattr(elem, attr) ) for attr in dir(elem) if not attr.startswith("_") and attr not in exclusion } if elem.VR == VR_.SQ: yield sequence_element_format % elem_dict else: yield element_format % elem_dict def _pretty_str(self, indent: int = 0, top_level_only: bool = False) -> str: """Return a string of the DataElements in the Dataset, with indented levels. This private method is called by the ``__str__()`` method for handling print statements or ``str(dataset)``, and the ``__repr__()`` method. It is also used by ``top()``, therefore the `top_level_only` flag. This function recurses, with increasing indentation levels. ..versionchanged:: 2.0 The file meta information is returned in its own section, if :data:`~pydicom.config.show_file_meta` is ``True`` (default) Parameters ---------- indent : int, optional The indent level offset (default ``0``). top_level_only : bool, optional When True, only create a string for the top level elements, i.e. exclude elements within any Sequences (default ``False``). Returns ------- str A string representation of the Dataset. """ strings = [] indent_str = self.indent_chars * indent nextindent_str = self.indent_chars * (indent + 1) # Display file meta, if configured to do so, and have a non-empty one if ( hasattr(self, "file_meta") and self.file_meta and pydicom.config.show_file_meta ): strings.append(f"{'Dataset.file_meta ':-<49}") for elem in self.file_meta: with tag_in_exception(elem.tag): strings.append(indent_str + repr(elem)) strings.append(f"{'':-<49}") for elem in self: with tag_in_exception(elem.tag): if elem.VR == VR_.SQ: # a sequence strings.append( f"{indent_str}{elem.tag} {elem.name} " f"{len(elem.value)} item(s) ---- " ) if not top_level_only: for dataset in elem.value: strings.append(dataset._pretty_str(indent + 1)) strings.append(nextindent_str + "---------") else: strings.append(indent_str + repr(elem)) return "\n".join(strings) @property def read_implicit_vr(self) -> bool | None: """Get the VR method used by the original encoding of the dataset. .. deprecated:: 3.0 ``read_implicit_vr`` will be removed in v4.0, , use :attr:`~pydicom.dataset.Dataset.original_encoding` instead. Returns ------- bool | None Returns ``None`` if the dataset has been created from scratch, otherwise returns ``True`` if the dataset was decoded from file or buffer and used implicit VR, ``False`` if it used explicit VR. """ name = type(self).__name__ if config._use_future: raise AttributeError(f"'{name}' object has no attribute 'read_implicit_vr'") warn_and_log( ( f"'{name}.read_implicit_vr' will be removed in v4.0, use " f"'{name}.original_encoding[0]' instead" ), DeprecationWarning, ) return self._read_implicit @property def read_little_endian(self) -> bool | None: """Get the endianness used by the original encoding of the dataset. .. deprecated:: 3.0 ``read_little_endian`` will be removed in v4.0, use :attr:`~pydicom.dataset.Dataset.original_encoding` instead. Returns ------- bool | None Returns ``None`` if the dataset has been created from scratch, otherwise returns ``True`` if the dataset was decoded from file or buffer and used little endian encoding, ``False`` for big endian. """ name = type(self).__name__ if config._use_future: raise AttributeError( f"'{name}' object has no attribute 'read_little_endian'" ) warn_and_log( ( f"'{name}.read_little_endian' will be removed in v4.0, use " f"'{name}.original_encoding[1]' instead" ), DeprecationWarning, ) return self._read_little def remove_private_tags(self) -> None: """Remove all private elements from the :class:`Dataset`.""" def remove_callback(dataset: "Dataset", elem: DataElement) -> None: """Internal method to use as callback to walk() method.""" if elem.tag.is_private: # can't del self[tag] - won't be right dataset on recursion del dataset[elem.tag] self.walk(remove_callback) def save_as( self, filename: str | os.PathLike[AnyStr] | BinaryIO | WriteableBuffer, /, __write_like_original: bool | None = None, *, implicit_vr: bool | None = None, little_endian: bool | None = None, enforce_file_format: bool = False, overwrite: bool = True, **kwargs: Any, ) -> None: """Encode the current :class:`Dataset` and write it to `filename`. See the documentation for :func:`~pydicom.filewriter.dcmwrite` for more detailed information. .. warning:: Encoding a dataset with ``little_endian=False`` (i.e. as big endian) is not recommended. Big endian encoding was retired from the DICOM Standard in 2006. .. warning:: This function cannot be used to convert a decoded dataset to an encoding that uses a different endianness, such as from big to little endian. :func:`~pydicom.filewriter.dcmwrite()` must be used instead, however the process is not automatic. See the documentation of :func:`~pydicom.filewriter.dcmwrite()` for details. .. versionchanged:: 3.0 Added `implicit_vr`, `little_endian`, `enforce_file_format` and `overwrite` keyword arguments .. deprecated:: 3.0 `write_like_original` will be removed in v4.0, please use `enforce_file_format` instead Parameters ---------- filename : str | PathLike | BinaryIO The path, file-like or writeable buffer to write the encoded dataset to. If using a buffer it must have ``write()``, ``seek()`` and ``tell()`` methods. write_like_original : bool, optional If ``True`` (default) then write the dataset as-is, otherwise ensure that the dataset is written in the DICOM File Format or raise an exception is that isn't possible. This parameter is deprecated, please use `enforce_file_format` instead. implicit_vr : bool, optional Required if the dataset has no valid public *Transfer Syntax UID* set in the file meta and :attr:`~pydicom.dataset.Dataset.is_implicit_VR` or :attr:`~pydicom.dataset.Dataset.original_encoding` are ``None``. If ``True`` then encode using implicit VR, otherwise use explicit VR. little_endian : bool, optional Required if the dataset has no valid public *Transfer Syntax UID* set in the file meta and :attr:`~pydicom.dataset.Dataset.is_little_endian` or :attr:`~pydicom.dataset.Dataset.original_encoding` are ``None``. If ``True`` (default) then use little endian byte order when encoding, otherwise use big endian (not recommended). enforce_file_format : bool, optional If ``True`` then ensure the dataset is written in the DICOM File Format or raise an exception if that isn't possible. If ``False`` (default) then write the dataset as-is, preserving the following - which may result in a non-conformant file: - ``Dataset.preamble``: if the dataset has no preamble then none will be written - ``Dataset.file_meta``: if the dataset is missing any required *File Meta Information Group* elements then they will not be added or written overwrite : bool, optional If ``False`` and `filename` is a :class:`str` or PathLike, then raise a :class:`FileExistsError` if a file already exists with the given filename (default ``True``). See Also -------- pydicom.filewriter.dcmwrite Encode a :class:`Dataset` and write it to a file or buffer. """ # The default for little_endian is `None` so we can detect conversion # between little and big endian, but we actually default it to `True` # when `implicit_vr` is used if implicit_vr is not None and little_endian is None: little_endian = True # Disallow conversion between little and big endian encoding if self.original_encoding[1] is not None: file_meta = getattr(self, "file_meta", {}) syntax = file_meta.get("TransferSyntaxUID", None) use_little: bool | None = None try: use_little = syntax.is_little_endian except (AttributeError, ValueError): if little_endian is not None: use_little = little_endian elif not config._use_future: use_little = self.is_little_endian if use_little is not None and self.original_encoding[1] != use_little: raise ValueError( f"'{type(self).__name__}.save_as()' cannot be used to " "convert between little and big endian encoding. Please " "read the documentation for filewriter.dcmwrite() if this " "is what you really want to do" ) pydicom.dcmwrite( filename, self, __write_like_original, implicit_vr=implicit_vr, little_endian=little_endian, enforce_file_format=enforce_file_format, overwrite=overwrite, **kwargs, ) def ensure_file_meta(self) -> None: """Create an empty ``Dataset.file_meta`` if none exists.""" # Changed in v2.0 so does not re-assign self.file_meta with getattr() if not hasattr(self, "file_meta"): self.file_meta = FileMetaDataset() def __setattr__(self, name: str, value: Any) -> None: """Intercept any attempts to set a value for an instance attribute. If name is a DICOM keyword, set the corresponding tag and DataElement. Else, set an instance (python) attribute as any other class would do. Parameters ---------- name : str The keyword for the element you wish to add/change. If `name` is not a DICOM element keyword then this will be the name of the attribute to be added/changed. value The value for the attribute to be added/changed. """ # Save time for common Dataset attributes that are not DICOM keywords # This check is fast if `name` is a DICOM keyword (first chr is upper) # The startswith is needed for `is_implicit_VR` if name.startswith("is_") or name.islower(): if name == "file_meta": self._set_file_meta(value) else: object.__setattr__(self, name, value) return tag = tag_for_keyword(name) if tag is not None: # successfully mapped name to a tag if tag not in self: # don't have this tag yet->create the data_element instance vr = dictionary_VR(tag) elem = DataElement(tag, vr, value) else: # already have this data_element, just changing its value elem = self[tag] elem.value = value # Now have data_element - store it in this dict self[tag] = elem elif repeater_has_keyword(name): # Check if `name` is repeaters element raise ValueError( f"'{name}' is a DICOM repeating group element and must be " "added using the add() or add_new() methods." ) else: # Warn if `name` is camel case but not a keyword if _RE_CAMEL_CASE.match(name): msg = ( f"Camel case attribute '{name}' used which is not in the " "element keyword data dictionary" ) if config.INVALID_KEYWORD_BEHAVIOR == "WARN": warn_and_log(msg) elif config.INVALID_KEYWORD_BEHAVIOR == "RAISE": raise ValueError(msg) # name not in dicom dictionary - setting a non-dicom instance # attribute # XXX note if user misspells a dicom data_element - no error!!! object.__setattr__(self, name, value) def _set_file_meta(self, value: "Dataset | None") -> None: """Set the Dataset's File Meta Information attribute.""" if value is None: self.__dict__["file_meta"] = value return if not isinstance(value, Dataset): cls_name = self.__class__.__name__ raise TypeError( f"'{cls_name}.file_meta' must be a 'FileMetaDataset' instance" ) if not isinstance(value, FileMetaDataset): # Also validates for only group 2 elements value = FileMetaDataset(value) self.__dict__["file_meta"] = value def __setitem__(self, key: "slice | TagType", elem: _DatasetValue) -> None: """Operator for ``Dataset[key] = elem``. Parameters ---------- key : int or Tuple[int, int] or str The tag for the element to be added to the :class:`Dataset`. elem : dataelem.DataElement or dataelem.RawDataElement The element to add to the :class:`Dataset`. Raises ------ NotImplementedError If `key` is a :class:`slice`. ValueError If the `key` value doesn't match the corresponding :attr:`DataElement.tag`. """ if isinstance(key, slice): raise NotImplementedError( "Slicing is not supported when setting Dataset items" ) try: key = Tag(key) except Exception as exc: raise ValueError( f"Unable to convert the key '{key}' to an element tag" ) from exc if not isinstance(elem, DataElement | RawDataElement): raise TypeError("Dataset items must be 'DataElement' instances") if isinstance(elem.tag, BaseTag): elem_tag = elem.tag else: elem_tag = Tag(elem.tag) if key != elem_tag: raise ValueError( f"The key '{key}' doesn't match the 'DataElement' tag '{elem_tag}'" ) if elem_tag.is_private: # See PS 3.5-2008 section 7.8.1 (p. 44) for how blocks are reserved logger.debug(f"Setting private tag {elem_tag}") private_block = elem_tag.element >> 8 private_creator_tag = Tag(elem_tag.group, private_block) if private_creator_tag in self and elem_tag != private_creator_tag: if isinstance(elem, RawDataElement): elem = convert_raw_data_element( elem, encoding=self._character_set, ds=self ) elem.private_creator = self[private_creator_tag].value # Changing pixel data resets the stored array if elem_tag in PIXEL_KEYWORDS: self._pixel_array = None self._pixel_id = {} self._dict[elem_tag] = elem if elem.VR == VR_.SQ and isinstance(elem, DataElement): if not isinstance(elem.value, pydicom.Sequence): elem.value = pydicom.Sequence(elem.value) # type: ignore # Update the `_pixel_rep` attribute when nested sequences # containing RawDataElements are being added to a different # dataset self._set_pixel_representation(cast(DataElement, elem)) def set_pixel_data( self, arr: "numpy.ndarray", photometric_interpretation: str, bits_stored: int, *, generate_instance_uid: bool = True, ) -> None: """Use an :class:`~numpy.ndarray` to set the *Pixel Data* and related Image Pixel module elements. .. versionadded:: 3.0 The following :dcm:`Image Pixel` module elements values will be added, updated or removed as necessary: * (0028,0002) *Samples per Pixel* using a value corresponding to `photometric_interpretation`. * (0028,0104) *Photometric Interpretation* from `photometric_interpretation`. * (0028,0006) *Planar Configuration* will be added and set to ``0`` if *Samples per Pixel* is > 1, otherwise it will be removed. * (0028,0008) *Number of Frames* from the array :attr:`~numpy.ndarray.shape`, however it will be removed if `arr` only contains a single frame. * (0028,0010) *Rows* and (0028,0011) *Columns* from the array :attr:`~numpy.ndarray.shape`. * (0028,0100) *Bits Allocated* from the array :class:`~numpy.dtype`. * (0028,0101) *Bits Stored* and (0028,0102) *High Bit* from `bits_stored`. * (0028,0103) *Pixel Representation* from the array :class:`~numpy.dtype`. In addition: * The *Transfer Syntax UID* will be set to *Explicit VR Little Endian* if it doesn't already exist or uses a compressed (encapsulated) transfer syntax. * If `generate_instance_uid` is ``True`` (default) then the *SOP Instance UID* will be added or updated. Parameters ---------- arr : numpy.ndarray An array with :class:`~numpy.dtype` uint8, uint16, int8 or int16. The array must be shaped as one of the following: * (rows, columns) for a single frame of grayscale data. * (frames, rows, columns) for multi-frame grayscale data. * (rows, columns, samples) for a single frame of multi-sample data such as RGB. * (frames, rows, columns, samples) for multi-frame, multi-sample data. photometric_interpretation : str The value to use for (0028,0004) *Photometric Interpretation*. Valid values are ``"MONOCHROME1"``, ``"MONOCHROME2"``, ``"PALETTE COLOR"``, ``"RGB"``, ``"YBR_FULL"``, ``"YBR_FULL_422"``. bits_stored : int The value to use for (0028,0101) *Bits Stored*. Must be no greater than the number of bits used by the :attr:`~numpy.dtype.itemsize` of `arr`. generate_instance_uid : bool, optional If ``True`` (default) then add or update the (0008,0018) *SOP Instance UID* element with a value generated using :func:`~pydicom.uid.generate_uid`. Raises ------ NotImplementedError If the dataset has a big-endian *Transfer Syntax UID*. """ set_pixel_data( self, arr, photometric_interpretation, bits_stored, generate_instance_uid=generate_instance_uid, ) def _set_pixel_representation(self, elem: DataElement) -> None: """Set the `_pixel_rep` attribute for the current dataset and child datasets of the sequence element `elem`.""" # `TAG_PIXREP` is (0028,0103) *Pixel Representation* # May be DataElement or RawDataElement, also value may be None pr: int | bytes | None = None if TAG_PIXREP in self._dict: pr = self[TAG_PIXREP].value elif hasattr(self, "_pixel_rep"): # Must be second conditional pr = self._pixel_rep if pr is not None: self._pixel_rep = int(b"\x01" in pr) if isinstance(pr, bytes) else pr if elem.VR != VR_.SQ: return # Note that the value of `_pixel_rep` gets updated as we move # down the tree - the value used to correct ambiguous # elements will be from the closest dataset to that element for item in elem.value: if TAG_PIXREP in item._dict: pr = item._dict[TAG_PIXREP].value if pr is not None: item._pixel_rep = ( int(b"\x01" in pr) if isinstance(pr, bytes) else pr ) elif hasattr(self, "_pixel_rep"): item._pixel_rep = self._pixel_rep elif hasattr(self, "_pixel_rep"): item._pixel_rep = self._pixel_rep def _slice_dataset( self, start: "TagType | None", stop: "TagType | None", step: int | None ) -> list[BaseTag]: """Return the element tags in the Dataset that match the slice. Parameters ---------- start : int or 2-tuple of int or None The slice's starting element tag value, in any format accepted by :func:`~pydicom.tag.Tag`. stop : int or 2-tuple of int or None The slice's stopping element tag value, in any format accepted by :func:`~pydicom.tag.Tag`. step : int or None The slice's step size. Returns ------ list of BaseTag The tags in the :class:`Dataset` that meet the conditions of the slice. """ # Check the starting/stopping Tags are valid when used if start is not None: start = Tag(start) if stop is not None: stop = Tag(stop) all_tags = sorted(self._dict.keys()) # If the Dataset is empty, return an empty list if not all_tags: return [] # Special case the common situations: # - start and/or stop are None # - step is 1 if start is None: if stop is None: # For step=1 avoid copying the list return all_tags if step == 1 else all_tags[::step] else: # Have a stop value, get values until that point step1_list = list(takewhile(lambda x: x < stop, all_tags)) return step1_list if step == 1 else step1_list[::step] # Have a non-None start value. Find its index i_start = bisect_left(all_tags, start) if stop is None: return all_tags[i_start::step] i_stop = bisect_left(all_tags, stop) return all_tags[i_start:i_stop:step] def __str__(self) -> str: """Handle str(dataset). ..versionchanged:: 2.0 The file meta information was added in its own section, if :data:`pydicom.config.show_file_meta` is ``True`` """ return self._pretty_str() def top(self) -> str: """Return a :class:`str` representation of the top level elements.""" return self._pretty_str(top_level_only=True) def trait_names(self) -> list[str]: """Return a :class:`list` of valid names for auto-completion code. Used in IPython, so that data element names can be found and offered for autocompletion on the IPython command line. """ return dir(self) def update(self, d: _DatasetType) -> None: """Extend :meth:`dict.update` to handle DICOM tags and keywords. Parameters ---------- d : dict or Dataset The :class:`dict` or :class:`Dataset` to use when updating the current object. """ for key, value in list(d.items()): if isinstance(key, str): setattr(self, key, value) else: self[Tag(cast(int, key))] = value def iterall(self) -> Iterator[DataElement]: """Iterate through the :class:`Dataset`, yielding all the elements. Unlike ``iter(Dataset)``, this *does* recurse into sequences, and so yields all elements as if dataset were "flattened". Yields ------ dataelem.DataElement """ for elem in self: yield elem if elem.VR == VR_.SQ: for ds in elem.value: yield from ds.iterall() def walk( self, callback: Callable[["Dataset", DataElement], None], recursive: bool = True ) -> None: """Iterate through the :class:`Dataset's` elements and run `callback` on each. Visit all elements in the :class:`Dataset`, possibly recursing into sequences and their items. The `callback` function is called for each :class:`~pydicom.dataelem.DataElement` (including elements with a VR of 'SQ'). Can be used to perform an operation on certain types of elements. For example, :meth:`~Dataset.remove_private_tags` finds all elements with private tags and deletes them. The elements will be returned in order of increasing tag number within their current :class:`Dataset`. Parameters ---------- callback A callable function that takes two arguments: * a :class:`Dataset` * a :class:`~pydicom.dataelem.DataElement` belonging to that :class:`Dataset` recursive : bool, optional Flag to indicate whether to recurse into sequences (default ``True``). """ taglist = sorted(self._dict.keys()) for tag in taglist: with tag_in_exception(tag): data_element = self[tag] callback(self, data_element) # self = this Dataset # 'tag in self' below needed in case callback deleted # data_element if recursive and tag in self and data_element.VR == VR_.SQ: sequence = data_element.value for dataset in sequence: dataset.walk(callback) @classmethod def from_json( cls: type["Dataset"], json_dataset: dict[str, Any] | str | bytes | bytearray, bulk_data_uri_handler: ( Callable[[str, str, str], None | str | int | float | bytes] | Callable[[str], None | str | int | float | bytes] | None ) = None, ) -> "Dataset": """Return a :class:`Dataset` from a DICOM JSON Model object. See the DICOM Standard, Part 18, :dcm:`Annex F`. Parameters ---------- json_dataset : dict, str, bytes or bytearray :class:`dict`, :class:`str`, :class:`bytes` or :class:`bytearray` representing a DICOM Data Set formatted based on the :dcm:`DICOM JSON Model`. bulk_data_uri_handler : callable, optional Callable function that accepts either the tag, vr and "BulkDataURI" value or just the "BulkDataURI" value of the JSON representation of a data element and returns the actual value of that data element (retrieved via DICOMweb WADO-RS). If no `bulk_data_uri_handler` is specified (default) then the corresponding element will have an "empty" value such as ``""``, ``b""`` or ``None`` depending on the `vr` (i.e. the Value Multiplicity will be 0). Returns ------- Dataset """ if isinstance(json_dataset, str | bytes | bytearray): json_dataset = cast(dict[str, Any], json.loads(json_dataset)) dataset = cls() for tag, mapping in json_dataset.items(): # `tag` is an element tag in uppercase hex format as a str # `mapping` is Dict[str, Any] and should have keys 'vr' and at most # one of ('Value', 'BulkDataURI', 'InlineBinary') but may have # none of those if the element's VM is 0 vr = mapping["vr"] unique_value_keys = tuple( set(mapping.keys()) & set(jsonrep.JSON_VALUE_KEYS) ) if len(unique_value_keys) == 0: value_key = None value = [""] else: value_key = unique_value_keys[0] value = mapping[value_key] data_element = DataElement.from_json( cls, tag, vr, value, value_key, bulk_data_uri_handler ) dataset.add(data_element) return dataset def to_json_dict( self, bulk_data_threshold: int = 1024, bulk_data_element_handler: Callable[[DataElement], str] | None = None, suppress_invalid_tags: bool = False, ) -> dict[str, Any]: """Return a dictionary representation of the :class:`Dataset` conforming to the DICOM JSON Model as described in the DICOM Standard, Part 18, :dcm:`Annex F`. Parameters ---------- bulk_data_threshold : int, optional Threshold for the length of a base64-encoded binary data element above which the element should be considered bulk data and the value provided as a URI rather than included inline (default: ``1024``). Ignored if no bulk data handler is given. bulk_data_element_handler : callable, optional Callable function that accepts a bulk data element and returns a JSON representation of the data element (dictionary including the "vr" key and either the "InlineBinary" or the "BulkDataURI" key). suppress_invalid_tags : bool, optional Flag to specify if errors while serializing tags should be logged and the tag dropped or if the error should be bubbled up. Returns ------- dict :class:`Dataset` representation based on the DICOM JSON Model. """ json_dataset = {} context = config.strict_reading() if suppress_invalid_tags else nullcontext() with context: for key in self.keys(): json_key = f"{key:08X}" try: data_element = self[key] json_dataset[json_key] = data_element.to_json_dict( bulk_data_element_handler=bulk_data_element_handler, bulk_data_threshold=bulk_data_threshold, ) except Exception as exc: if not suppress_invalid_tags: logger.error(f"Error while processing tag {json_key}") raise exc logger.warning(f"Error while processing tag {json_key}: {exc}") return json_dataset def to_json( self, bulk_data_threshold: int = 1024, bulk_data_element_handler: Callable[[DataElement], str] | None = None, dump_handler: Callable[[dict[str, Any]], str] | None = None, suppress_invalid_tags: bool = False, ) -> str: """Return a JSON representation of the :class:`Dataset`. See the DICOM Standard, Part 18, :dcm:`Annex F`. Parameters ---------- bulk_data_threshold : int, optional Threshold for the length of a base64-encoded binary data element above which the element should be considered bulk data and the value provided as a URI rather than included inline (default: ``1024``). Ignored if no bulk data handler is given. bulk_data_element_handler : callable, optional Callable function that accepts a bulk data element and returns a JSON representation of the data element (dictionary including the "vr" key and either the "InlineBinary" or the "BulkDataURI" key). dump_handler : callable, optional Callable function that accepts a :class:`dict` and returns the serialized (dumped) JSON string (by default uses :func:`json.dumps`). .. note: Make sure to use a dump handler that sorts the keys (see example below) to create DICOM-conformant JSON. suppress_invalid_tags : bool, optional Flag to specify if errors while serializing tags should be logged and the tag dropped or if the error should be bubbled up. Returns ------- str :class:`Dataset` serialized into a string based on the DICOM JSON Model. Examples -------- >>> def my_json_dumps(data): ... return json.dumps(data, indent=4, sort_keys=True) >>> ds.to_json(dump_handler=my_json_dumps) """ if dump_handler is None: def json_dump(d: Any) -> str: return json.dumps(d, sort_keys=True) dump_handler = json_dump return dump_handler( self.to_json_dict( bulk_data_threshold, bulk_data_element_handler, suppress_invalid_tags=suppress_invalid_tags, ) ) def update_raw_element( self, tag: TagType, *, vr: str | None = None, value: bytes | None = None ) -> None: """Modify the VR or value for the raw element with `tag`. When a :class:`Dataset` is created most of it's elements are in their :class:`~pydicom.dataelem.RawDataElement` form, and only upon trying to access the element is it converted to a :class:`~pydicom.dataelem.DataElement`. When this conversion fails due to non-conformance issues, this method can be used to modify the raw element data prior to conversion in order to fix any issues. Example ------- Change the VR for the element with tag (0029,1026) before conversion to :class:`~pydicom.dataelem.DataElement`. >>> from pydicom import examples >>> ds = examples.ct >>> ds.update_raw_element(0x00291026, vr="US") >>> elem = ds[0x00291026] # conversion to DataElement occurs here >>> type(elem) >>> elem.VR "US" Parameters ---------- tag : int | str | tuple[int, int] | BaseTag The tag for a :class:`~pydicom.dataelem.RawDataElement` in the dataset. vr : str, optional Required if `value` is not used, the value to use for the modified element's VR, if not used then the existing VR will be kept. value : bytes, optional Required if `vr` is not used, the value to use for the modified element's raw encoded value, if not used then the existing value will be kept. """ if vr is None and value is None: raise ValueError("Either or both of 'vr' and 'value' are required") if vr is not None: try: VR_[vr] except KeyError: raise ValueError(f"Invalid VR value '{vr}'") if value is not None and not isinstance(value, bytes): raise TypeError(f"'value' must be bytes, not '{type(value).__name__}'") tag = Tag(tag) raw = self.get_item(tag) if raw is None: raise KeyError(f"No element with tag {tag} was found") if not isinstance(raw, RawDataElement): raise TypeError( f"The element with tag {tag} has already been converted to a " "'DataElement' instance, this method must be called earlier" ) vr = vr if vr is not None else raw.VR value = value if value is not None else raw.value self._dict[tag] = raw._replace(VR=vr, value=value) __repr__ = __str__ _FileDataset = TypeVar("_FileDataset", bound="FileDataset") class FileDataset(Dataset): """An extension of :class:`Dataset` to make reading and writing to file-like easier. .. versionchanged:: 3.0 Added the `buffer` attribute and the `filename` attribute has been changed to only contain the filename the dataset was read from (if any). Attributes ---------- preamble : str | bytes | None The optional DICOM preamble prepended to the :class:`FileDataset`, if available. file_meta : FileMetaDataset | None The Dataset's file meta information as a :class:`FileMetaDataset`, if available (``None`` if not present). Consists of group ``0x0002`` elements. filename : str | None The filename associated with the :class:`FileDataset` if read from a file or file-like, or ``None`` if the dataset has been read from a buffer-like object. buffer : ReadableBuffer | None The buffer-like object the :class:`FileDataset` was read from, or ``None`` if the dataset has been read from a file or file-like. fileobj_type The type of object the :class:`FileDataset` was read from. timestamp : float | None The modification time of the file the :class:`FileDataset` was read from, ``None`` if the modification time is not available. """ def __init__( self, filename_or_obj: PathType | BinaryIO | ReadableBuffer, dataset: _DatasetType, preamble: bytes | None = None, file_meta: "FileMetaDataset | None" = None, is_implicit_VR: bool = True, is_little_endian: bool = True, ) -> None: """Initialize a :class:`FileDataset` read from a DICOM file. Parameters ---------- filename_or_obj : str, PathLike, file-like or readable buffer * :class:`str` or path: the full path to the dataset file * file-like: a file-like object in "rb" mode * readable buffer: an object with ``read()``, ``tell()`` and ``seek()`` methods such as :class:`io.BytesIO`. dataset : Dataset or dict Some form of dictionary, usually a :class:`Dataset` returned from :func:`~pydicom.filereader.dcmread`. preamble : bytes or str, optional The 128-byte DICOM preamble. file_meta : FileMetaDataset, optional The file meta :class:`FileMetaDataset`, such as the one returned by :func:`~pydicom.filereader.read_file_meta_info`, or an empty :class:`FileMetaDataset` if no file meta information is in the file. is_implicit_VR : bool, optional ``True`` (default) if implicit VR transfer syntax used; ``False`` if explicit VR. is_little_endian : bool ``True`` (default) if little-endian transfer syntax used; ``False`` if big-endian. """ Dataset.__init__(self, dataset) self.preamble = preamble self.file_meta: FileMetaDataset = ( file_meta if file_meta is not None else FileMetaDataset() ) # TODO: Remove in v4.0 if not config._use_future: self._is_implicit_VR: bool = is_implicit_VR self._is_little_endian: bool = is_little_endian self._read_implicit: bool = is_implicit_VR self._read_little: bool = is_little_endian self.fileobj_type: Any = None self.filename: PathType | None = None self.buffer: ReadableBuffer | None = None filename_or_obj = path_from_pathlike(filename_or_obj) if isinstance(filename_or_obj, str): # Path to the dataset file self.filename = filename_or_obj self.fileobj_type = open elif isinstance(filename_or_obj, io.BufferedReader): # File-like in "rb" mode such as open(..., "rb") self.filename = filename_or_obj.name # This is the appropriate constructor for io.BufferedReader self.fileobj_type = open else: # Readable buffer with read(), seek() and tell() methods self.buffer = filename_or_obj self.fileobj_type = type(filename_or_obj) if getattr(filename_or_obj, "name", None): self.filename = filename_or_obj.name elif getattr(filename_or_obj, "filename", None): self.filename = filename_or_obj.filename # type: ignore[attr-defined] self.timestamp = None if self.filename and os.path.exists(self.filename): self.timestamp = os.stat(self.filename).st_mtime def __deepcopy__(self, memo: dict[int, Any]) -> "FileDataset": """Return a deep copy of the file dataset. Sets the `buffer` to ``None`` if it's been closed or is otherwise not copyable. Returns ------- FileDataset A deep copy of the file dataset. """ cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result for k, v in self.__dict__.items(): if k == "buffer": try: setattr(result, k, copy.deepcopy(v, memo)) except Exception as exc: warn_and_log( f"The {type(exc).__name__} exception '{exc}' occurred " "trying to deepcopy the buffer-like the dataset was read " "from, the 'buffer' attribute will be set to 'None' in the " "copied object" ) setattr(result, k, copy.deepcopy(None, memo)) else: setattr(result, k, copy.deepcopy(v, memo)) return result def validate_file_meta( file_meta: "FileMetaDataset", enforce_standard: bool = True ) -> None: """Validate the *File Meta Information* elements in `file_meta`. Parameters ---------- file_meta : Dataset The *File Meta Information* data elements. enforce_standard : bool, optional If ``False``, then only a check for invalid elements is performed. If ``True`` (default), the following elements will be added if not already present and the Type 1 elements given a value if empty: * (0002,0001) *File Meta Information Version*, Type 1 * (0002,0012) *Implementation Class UID*, Type 1 * (0002,0013) *Implementation Version Name*, Type 3 and the following elements will be checked to ensure they're present and have a non-empty value: * (0002,0002) *Media Storage SOP Class UID*, Type 1 * (0002,0003) *Media Storage SOP Instance UID*, Type 1 * (0002,0010) *Transfer Syntax UID*, Type 1 Raises ------ ValueError If `enforce_standard` is ``True`` and any of the Type 1 *File Meta Information* elements are missing from `file_meta` or have no value. ValueError If any non-Group 2 Elements are present in `file_meta`. """ # Check that no non-Group 2 Elements are present for elem in file_meta.elements(): if elem.tag.group != 0x0002: raise ValueError( "Only File Meta Information group (0002,eeee) elements may be " "present in 'file_meta'." ) if enforce_standard: if ( "FileMetaInformationVersion" not in file_meta or file_meta["FileMetaInformationVersion"].is_empty ): file_meta.FileMetaInformationVersion = b"\x00\x01" if ( "ImplementationClassUID" not in file_meta or file_meta["ImplementationClassUID"].is_empty ): file_meta.ImplementationClassUID = UID(PYDICOM_IMPLEMENTATION_UID) if "ImplementationVersionName" not in file_meta: file_meta.ImplementationVersionName = ( f"PYDICOM {'.'.join(__version_info__)}" ) invalid = [ f"{Tag(tag)} {dictionary_description(tag)}" for tag in (0x00020002, 0x00020003, 0x00020010) if tag not in file_meta or file_meta[tag].is_empty ] if invalid: raise AttributeError( "Required File Meta Information elements are either missing " f"or have an empty value: {', '.join(invalid)}" ) class FileMetaDataset(Dataset): """Contains a collection (dictionary) of group 2 DICOM Data Elements. .. versionadded:: 2.0 Derived from :class:`~pydicom.dataset.Dataset`, but only allows Group 2 (File Meta Information) data elements """ def __init__(self, *args: _DatasetType, **kwargs: Any) -> None: """Initialize a FileMetaDataset Parameters are as per :class:`Dataset`; this overrides the super class only to check that all are group 2 data elements Raises ------ ValueError If any data elements are not group 2. TypeError If the passed argument is not a :class:`dict` or :class:`Dataset` """ super().__init__(*args, **kwargs) FileMetaDataset.validate(self._dict) # Set type hints for the possible contents - VR, Type (1|1C|3) self.FileMetaInformationGroupLength: int # UL, 1 self.FileMetaInformationVersion: bytes # OB, 1 self.MediaStorageSOPClassUID: UID # UI, 1 self.MediaStorageSOPInstanceUID: UID # UI, 1 self.TransferSyntaxUID: UID # UI, 1 self.ImplementationClassUID: UID # UI, 1 self.ImplementationVersionName: str | None # SH, 3 self.SourceApplicationEntityTitle: str | None # AE, 3 self.SendingApplicationEntityTitle: str | None # AE, 3 self.ReceivingApplicationEntityTitle: str | None # AE, 3 self.SourcePresentationAddress: str | None # UR, 3 self.ReceivingPresentationAddress: str | None # UR, 3 self.PrivateInformationCreatorUID: UID | None # UI, 3 self.PrivateInformation: bytes # OB, 1C @staticmethod def validate(init_value: _DatasetType) -> None: """Raise errors if initialization value is not acceptable for file_meta Parameters ---------- init_value: dict or Dataset The tag:data element pairs to initialize a file meta dataset Raises ------ TypeError If the passed argument is not a :class:`dict` or :class:`Dataset` ValueError If any data elements passed are not group 2. """ if init_value is None: return if not isinstance(init_value, Dataset | dict): raise TypeError( f"Argument must be a dict or Dataset, not {type(init_value)}" ) non_group2 = [str(Tag(tag)) for tag in init_value.keys() if Tag(tag).group != 2] if non_group2: raise ValueError( "File meta datasets may only contain group 2 elements but the " f"following elements are present: {', '.join(non_group2)}" ) def __setitem__(self, key: "slice | TagType", value: _DatasetValue) -> None: """Override parent class to only allow setting of group 2 elements. Parameters ---------- key : int or Tuple[int, int] or str The tag for the element to be added to the Dataset. value : dataelem.DataElement or dataelem.RawDataElement The element to add to the :class:`FileMetaDataset`. Raises ------ ValueError If `key` is not a DICOM Group 2 tag. """ if isinstance(value.tag, BaseTag): tag = value.tag else: tag = Tag(value.tag) if tag.group != 2: raise ValueError( "Only group 2 data elements are allowed in a FileMetaDataset" ) super().__setitem__(key, value) @property def _tsyntax_encoding(self) -> tuple[bool, bool] | tuple[None, None]: """Return the transfer syntax encoding method (if any) Returns ------- tuple[bool, bool] | tuple[None, None] If the file meta has a valid public Transfer Syntax UID then returns (is implicit, is little), otherwise returns (None, None). """ tsyntax = self.get("TransferSyntaxUID", None) if not tsyntax or tsyntax.is_private or not tsyntax.is_transfer_syntax: return (None, None) return (tsyntax.is_implicit_VR, tsyntax.is_little_endian) _RE_CAMEL_CASE = re.compile( # Ensure mix of upper and lowercase and digits, no underscores # If first character is lowercase ensure at least one uppercase char "(?P(^[A-Za-z])((?=.+?[A-Z])[A-Za-z0-9]+)|(^[A-Z])([A-Za-z0-9]+))" "(?P[A-Za-z0-9][^_]$)" # Last character is alphanumeric ) pydicom-pydicom-20aa4b7/src/pydicom/dicomio.py000066400000000000000000000003571515706620200214630ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Many point of entry for pydicom read and write functions""" from pydicom.filereader import dcmread # noqa: F401 from pydicom.filewriter import dcmwrite # noqa: F401 pydicom-pydicom-20aa4b7/src/pydicom/encaps.py000066400000000000000000001677771515706620200213350ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Functions for working with encapsulated (compressed) pixel data.""" from collections.abc import Iterator from io import BytesIO, BufferedIOBase import os from struct import pack, unpack from typing import Any from pydicom import config from pydicom.misc import warn_and_log from pydicom.filebase import DicomBytesIO, DicomIO, ReadableBuffer from pydicom.fileutil import buffer_length, reset_buffer_position from pydicom.tag import Tag, ItemTag, SequenceDelimiterTag # Functions for parsing encapsulated data def parse_basic_offsets( buffer: bytes | bytearray | ReadableBuffer, *, endianness: str = "<" ) -> list[int]: """Return the encapsulated pixel data's basic offset table frame offsets. .. versionadded:: 3.0 Parameters ---------- buffer : bytes | bytearray | readable buffer A buffer containing the encapsulated frame data, positioned at the beginning of the Basic Offset Table. May be :class:`bytes`, :class:`bytearray` or an object with ``read()``, ``tell()`` and ``seek()`` methods. If the latter then after reading it will be positioned at the start of the item tag of the first fragment after the Basic Offset Table. endianness : str, optional If ``"<"`` (default) then the encapsulated data uses little endian encoding, otherwise if ``">"`` it uses big endian encoding. Returns ------- list[int] A list of the offset positions to the first item tag of each frame, as measured from the end of the basic offset table. References ---------- :dcm:`DICOM Standard, Part 5, Annex A.4` """ if isinstance(buffer, bytes | bytearray): buffer = BytesIO(buffer) group, elem = unpack(f"{endianness}HH", buffer.read(4)) if group << 16 | elem != 0xFFFEE000: raise ValueError( f"Found unexpected tag {Tag(group, elem)} instead of (FFFE,E000) " "when parsing the Basic Offset Table item" ) length = unpack(f"{endianness}L", buffer.read(4))[0] if length % 4: raise ValueError( "The length of the Basic Offset Table item is not a multiple of 4" ) if length == 0: return [] return list(unpack(f"{endianness}{length // 4}L", buffer.read(length))) def parse_fragments( buffer: bytes | bytearray | ReadableBuffer, *, endianness: str = "<" ) -> tuple[int, list[int]]: """Return the number of fragments and their positions in `buffer`. .. versionadded:: 3.0 Parameters ---------- buffer : bytes | bytearray | readable buffer A buffer containing the encapsulated frame data, starting at the first byte of item tag for a fragment, such as after the end of the Basic Basic Offset Table. May be :class:`bytes`, :class:`bytearray` or an object with ``read()``, ``tell()`` and ``seek()`` methods. If the latter then the offset will be reset to the starting position afterwards. endianness : str, optional If ``"<"`` (default) then the encapsulated data uses little endian encoding, otherwise if ``">"`` it uses big endian encoding. Returns ------- tuple[int, list[int]] The number of fragments and the absolute offset position of the first byte of the item tag for each fragment in `buffer`. """ if isinstance(buffer, bytes | bytearray): buffer = BytesIO(buffer) start_offset = buffer.tell() nr_fragments = 0 fragment_offsets = [] while True: try: group, elem = unpack(f"{endianness}HH", buffer.read(4)) except Exception: break tag = group << 16 | elem if tag == 0xFFFEE000: if len(raw_length := buffer.read(4)) != 4: raise ValueError( "Unable to determine the length of the item at offset " f"{buffer.tell() - len(raw_length) - 4} as the end of " "the data has been reached - the encapsulated pixel data " "may be invalid" ) length = unpack(f"{endianness}L", raw_length)[0] if length == 0xFFFFFFFF: raise ValueError( f"Undefined item length at offset {buffer.tell() - 4} when " "parsing the encapsulated pixel data fragments" ) nr_fragments += 1 fragment_offsets.append(buffer.tell() - 8) buffer.seek(length, 1) elif tag == 0xFFFEE0DD: break else: raise ValueError( f"Unexpected tag '{Tag(tag)}' at offset {buffer.tell() - 4} when " "parsing the encapsulated pixel data fragment items" ) buffer.seek(start_offset, 0) return nr_fragments, fragment_offsets def generate_fragments( buffer: bytes | bytearray | ReadableBuffer, *, endianness: str = "<" ) -> Iterator[bytes]: """Yield frame fragments from the encapsulated pixel data in `buffer`. .. versionadded:: 3.0 Parameters ---------- buffer : bytes | bytearray | readable buffer A buffer containing the encapsulated frame data, starting at the first byte of item tag for a fragment, usually this will be after the end of the Basic Offset Table. May be :class:`bytes`, :class:`bytearray` or an object with ``read()``, ``tell()`` and ``seek()`` methods. If the latter than the final offset position depends on how many fragments have been yielded. endianness : str, optional If ``"<"`` (default) then the encapsulated data uses little endian encoding, otherwise if ``">"`` it uses big endian encoding. Yields ------ bytes A pixel data fragment. """ if isinstance(buffer, bytes | bytearray): buffer = BytesIO(buffer) while True: try: group, elem = unpack(f"{endianness}HH", buffer.read(4)) except Exception: break tag = group << 16 | elem if tag == 0xFFFEE000: if len(raw_length := buffer.read(4)) != 4: raise ValueError( "Unable to determine the length of the item at offset " f"{buffer.tell() - len(raw_length) - 4} as the end of " "the data has been reached - the encapsulated pixel data " "may be invalid" ) length = unpack(f"{endianness}L", raw_length)[0] if length == 0xFFFFFFFF: raise ValueError( f"Undefined item length at offset {buffer.tell() - 4} when " "parsing the encapsulated pixel data fragments" ) yield buffer.read(length) elif tag == 0xFFFEE0DD: break else: raise ValueError( f"Unexpected tag '{Tag(tag)}' at offset {buffer.tell() - 4} when " "parsing the encapsulated pixel data fragment items" ) def generate_fragmented_frames( buffer: bytes | bytearray | ReadableBuffer, *, number_of_frames: int | None = None, extended_offsets: tuple[list[int], list[int]] | tuple[bytes, bytes] | None = None, endianness: str = "<", ) -> Iterator[tuple[bytes, ...]]: """Yield fragmented pixel data frames from `buffer`. .. versionadded:: 3.0 .. note:: When the Basic Offset Table is empty and the Extended Offset Table isn't supplied then more fragmented frames may be yielded than given by `number_of_frames` provided there are sufficient excess fragments available. Parameters ---------- buffer : bytes | bytearray | readable buffer A buffer containing the encapsulated frame data, positioned at the first byte of the basic offset table. May be :class:`bytes`, :class:`bytearray` or an object with ``read()``, ``tell()`` and ``seek()`` methods. If the latter then the final position depends on how many fragmented frames have been yielded. number_of_frames : int, optional Required when the Basic Offset Table is empty and the Extended Offset Table has not been supplied. This should be the value of (0028,0008) *Number of Frames* or the expected number of frames in the encapsulated data. extended_offsets : tuple[list[int], list[int]] or tuple[bytes, bytes], optional The (offsets, lengths) of the Extended Offset Table as taken from (7FE0,0001) *Extended Offset Table* and (7FE0,0002) *Extended Offset Table Lengths* as either the raw encoded values or a list of their decoded equivalents. endianness : str, optional If ``"<"`` (default) then the encapsulated data uses little endian encoding, otherwise if ``">"`` it uses big endian encoding. Yields ------- tuple[bytes, ...] An encapsulated pixel data frame, with the contents of the tuple the frame's fragmented encoded data. """ if isinstance(buffer, bytes | bytearray): buffer = BytesIO(buffer) basic_offsets = parse_basic_offsets(buffer, endianness=endianness) # `buffer` is positioned at the end of the basic offsets table # Prefer the extended offset table (if available) if extended_offsets: # PS3.3, C.7.6.3.1.8 # Byte offsets to the first byte of the item tag of the first fragment # of every frame, as measured from the first byte of the item tag # following the Basic Offset Table, which *should* be empty # Only 1 fragment per frame is allowed (Table C.7-11a) if isinstance(extended_offsets[0], bytes): nr_offsets = len(extended_offsets[0]) // 8 offsets = list(unpack(f"{endianness}{nr_offsets}Q", extended_offsets[0])) else: offsets = extended_offsets[0] if isinstance(extended_offsets[1], bytes): nr_offsets = len(extended_offsets[1]) // 8 lengths = list(unpack(f"{endianness}{nr_offsets}Q", extended_offsets[1])) else: lengths = extended_offsets[1] fragments_start = buffer.tell() for offset, length in zip(offsets, lengths): # 8 for the item tag and item length, which we don't need buffer.seek(fragments_start + offset + 8, 0) yield (buffer.read(length),) return # Fall back to the basic offset table (if available) if basic_offsets: frame = [] current_index = 0 current_offset = 0 final_index = len(basic_offsets) - 1 for fragment in generate_fragments(buffer, endianness=endianness): if current_index == final_index: # Nth frame, keep adding fragments until we have no more frame.append(fragment) continue if current_offset < basic_offsets[current_index + 1]: # N - 1th frame, keep adding fragments until the we go # past the next frame offset frame.append(fragment) else: # Gone past the next offset, yield and restart yield tuple(frame) current_index += 1 frame = [fragment] # + 8 bytes for item tag and item length current_offset += len(fragment) + 8 # Yield the Nth frame yield tuple(frame) return # No basic or extended offset table # Determine the number of fragments in the buffer nr_fragments, _ = parse_fragments(buffer, endianness=endianness) # `buffer` is positioned at the end of the basic offsets table fragments = generate_fragments(buffer, endianness=endianness) # Single fragment must be 1 frame if nr_fragments == 1: yield (next(fragments),) return # From this point on we require the number of frames as there are # multiple fragments and may be one or more frames if not number_of_frames: raise ValueError( "Unable to determine the frame boundaries for the encapsulated " "pixel data as there is no Basic or Extended Offset Table and " "the number of frames has not been supplied" ) # 1 fragment per frame, for N frames if nr_fragments == number_of_frames: # Covers RLE and others if 1:1 ratio yield from ((fragment,) for fragment in fragments) return # Multiple fragments for 1 frame if number_of_frames == 1: yield tuple(fragment for fragment in fragments) return # More fragments then frames if nr_fragments > number_of_frames: # Search for JPEG/JPEG-LS/JPEG2K EOI/EOC marker which should be the # last two bytes of a frame # It's possible to yield more frames than `number_of_frames` as # long as there are excess fragments with JPEG EOI/EOC markers # It's also possible that we yielded too early because the marker bytes # were actually part of the compressed JPEG codestream eoi_marker = b"\xff\xd9" frame = [] frame_nr = 0 for fragment in fragments: frame.append(fragment) if eoi_marker in fragment[-10:]: yield tuple(frame) frame_nr += 1 frame = [] # There was a final set of fragments with no EOI/EOC marker, data is # probably corrupted, but yield it and warn/log anyway if frame: if frame_nr >= number_of_frames: msg = ( "The end of the encapsulated pixel data has been reached but " "no JPEG EOI/EOC marker was found, the final frame may be " "be invalid" ) else: msg = ( "The end of the encapsulated pixel data has been reached but " "fewer frames than expected have been found. Please confirm " "that the generated frame data is correct" ) warn_and_log(msg) yield tuple(frame) elif frame_nr < number_of_frames: warn_and_log( "The end of the encapsulated pixel data has been reached but " "fewer frames than expected have been found" ) return # nr_fragments < number_of_frames raise ValueError( "Unable to generate frames from the encapsulated pixel data as there " "are fewer fragments than frames; the dataset may be corrupt or the " "number of frames may be incorrect" ) def generate_frames( buffer: bytes | ReadableBuffer, *, number_of_frames: int | None = None, extended_offsets: tuple[list[int], list[int]] | tuple[bytes, bytes] | None = None, endianness: str = "<", ) -> Iterator[bytes]: """Yield complete pixel data frames from `buffer`. .. versionadded:: 3.0 .. note:: When the Basic Offset Table is empty and the Extended Offset Table isn't supplied then more frames may be yielded than given by `number_of_frames` provided there are sufficient excess fragments available. Parameters ---------- buffer : bytes | readable buffer A buffer containing the encapsulated frame data, starting at the first byte of the basic offset table. May be :class:`bytes`, :class:`bytearray` or an object with ``read()``, ``tell()`` and ``seek()`` methods. If the latter then the final offset position depends on the number of yielded frames. number_of_frames : int, optional Required when the Basic Offset Table is empty and the Extended Offset Table has not been supplied. This should be the value of (0028,0008) *Number of Frames* or the expected number of frames in the encapsulated data. extended_offsets : tuple[list[int], list[int]] or tuple[bytes, bytes], optional The (offsets, lengths) of the Extended Offset Table as taken from (7FE0,0001) *Extended Offset Table* and (7FE0,0002) *Extended Offset Table Lengths* as either the raw encoded values or a list of their decoded equivalents. endianness : str, optional If ``"<"`` (default) then the encapsulated data uses little endian encoding, otherwise if ``">"`` it uses big endian encoding. Yields ------ bytes The encoded pixel data, one frame at a time. References ---------- DICOM Standard Part 5, :dcm:`Annex A ` """ fragmented_frames = generate_fragmented_frames( buffer, number_of_frames=number_of_frames, extended_offsets=extended_offsets, endianness=endianness, ) for fragments in fragmented_frames: yield b"".join(fragments) def get_frame( buffer: bytes | bytearray | ReadableBuffer, index: int, *, extended_offsets: tuple[list[int], list[int]] | tuple[bytes, bytes] | None = None, number_of_frames: int | None = None, endianness: str = "<", ) -> bytes: """Return the specified frame at `index`. .. versionadded:: 3.0 .. note:: When the Basic Offset Table is empty and the Extended Offset Table isn't supplied then it's possible to return a frame at a higher `index` than expected from the supplied `number_of_frames` value provided there are sufficient excess fragments available. Parameters ---------- buffer : bytes | bytearray | readable buffer A buffer containing the encapsulated frame data, positioned at the first byte of the basic offset table. May be :class:`bytes`, :class:`bytearray` or an object with ``read()``, ``tell()`` and ``seek()`` methods. If the latter then the buffer will be reset to the starting position if the frame was returned successfully. index : int The index of the frame to be returned, starting at ``0`` for the first frame. number_of_frames : int, optional Required for multi-frame data when the Basic Offset Table is empty, the Extended Offset Table has not been supplied and there are multiple frames. This should be the value of (0028,0008) *Number of Frames* or the expected number of frames in the encapsulated data. extended_offsets : tuple[list[int], list[int]] or tuple[bytes, bytes], optional The (offsets, lengths) of the Extended Offset Table as taken from (7FE0,0001) *Extended Offset Table* and (7FE0,0002) *Extended Offset Table Lengths* as either the raw encoded values or a list of their decoded equivalents. endianness : str, optional If ``"<"`` (default) then the encapsulated data uses little endian encoding, otherwise if ``">"`` it uses big endian encoding. Returns ------- bytes A single frame of encoded pixel data. References ---------- DICOM Standard Part 5, :dcm:`Annex A ` """ if isinstance(buffer, bytes | bytearray): buffer = BytesIO(buffer) # `buffer` is positioned at the start of the basic offsets table starting_position = buffer.tell() basic_offsets = parse_basic_offsets(buffer, endianness=endianness) # `buffer` is positioned at the end of the basic offsets table # Prefer the extended offset table (if available) if extended_offsets: if isinstance(extended_offsets[0], bytes): nr_offsets = len(extended_offsets[0]) // 8 offsets = list(unpack(f"{endianness}{nr_offsets}Q", extended_offsets[0])) else: offsets = extended_offsets[0] if isinstance(extended_offsets[1], bytes): nr_offsets = len(extended_offsets[1]) // 8 lengths = list(unpack(f"{endianness}{nr_offsets}Q", extended_offsets[1])) else: lengths = extended_offsets[1] if index >= len(offsets): raise ValueError( "There aren't enough offsets in the Extended Offset Table for " f"{index + 1} frames" ) # We have the length so skip past the item tag and item length buffer.seek(offsets[index] + 8, 1) frame = buffer.read(lengths[index]) buffer.seek(starting_position) return frame # Fall back to the basic offset table (if available) if basic_offsets: if index >= len(basic_offsets): raise ValueError( "There aren't enough offsets in the Basic Offset Table for " f"{index + 1} frames" ) # There may be multiple fragments per frame if index < len(basic_offsets) - 1: # N - 1th frames length = basic_offsets[index + 1] - basic_offsets[index] buffer.seek(basic_offsets[index], 1) fragments = generate_fragments(buffer.read(length), endianness=endianness) else: # Final frame buffer.seek(basic_offsets[-1], 1) fragments = generate_fragments(buffer, endianness=endianness) frame = b"".join(fragment for fragment in fragments) buffer.seek(starting_position) return frame # No basic or extended offset table # Determine the number of fragments in `buffer` an their offsets nr_fragments, fragment_offsets = parse_fragments(buffer, endianness=endianness) # `buffer` is positioned at the end of the basic offsets table # Single fragment must be 1 frame if nr_fragments == 1: if index == 0: frame = next(generate_fragments(buffer, endianness=endianness)) buffer.seek(starting_position, 0) return frame raise ValueError( "Found 1 frame fragment in the encapsulated pixel data, 'index' must be 0" ) # From this point on we require the number of frames as there are # multiple fragments and may be one or more frames if not number_of_frames: raise ValueError( "Unable to determine the frame boundaries for the encapsulated " "pixel data as there is no basic or extended offset table data and " "the number of frames has not been supplied" ) # 1 fragment per frame, for N frames if nr_fragments == number_of_frames: if index > nr_fragments - 1: raise ValueError( f"Found {nr_fragments} frame fragments in the encapsulated " f"pixel data, an 'index' of {index} is invalid" ) # Covers RLE and others if 1:1 ratio # `fragment_offsets` is the absolute positions of each item tag buffer.seek(fragment_offsets[index], 0) frame = next(generate_fragments(buffer, endianness=endianness)) buffer.seek(starting_position, 0) return frame fragments = generate_fragments(buffer, endianness=endianness) # Multiple fragments for 1 frame if number_of_frames == 1: if index == 0: frame = b"".join(fragment for fragment in fragments) buffer.seek(starting_position, 0) return frame raise ValueError("The 'index' must be 0 if the number of frames is 1") # Search for JPEG/JPEG-LS/JPEG2K EOI/EOC marker which should be the # last two bytes of a frame eoi_marker = b"\xFF\xD9" frame_fragments = [] frame_nr = 0 for fragment in fragments: frame_fragments.append(fragment) if eoi_marker in fragment[-10:]: if frame_nr == index: frame = b"".join(frame_fragments) buffer.seek(starting_position, 0) return frame frame_nr += 1 frame_fragments = [] if frame_fragments and index == frame_nr: warn_and_log( "The end of the encapsulated pixel data has been reached but no " "JPEG EOI/EOC marker was found, the returned frame data may be " "invalid" ) frame = b"".join(frame_fragments) buffer.seek(starting_position, 0) return frame raise ValueError(f"There is insufficient pixel data to contain {index + 1} frames") # Functions and classes for encapsulating data class _BufferedItem: """Convenience class for a buffered encapsulation item. Attributes ---------- buffer : io.BufferedIOBase The buffer containing data to be encapsulated. length : int The total length of the encapsulated item, including the item tag and value and any trailing padding required to bring the item data up to an even length. """ def __init__(self, buffer: BufferedIOBase) -> None: """Create a new ``_BufferedItem`` instance. Parameters ---------- buffer : io.BufferedIOBase The buffer containing data to be encapsulated, may be empty. """ self.buffer = buffer # The non-padded length of the data in the buffer self._blen = buffer_length(buffer) if self._blen > 2**32 - 2: raise ValueError( "Buffers containing more than 4294967294 bytes are not supported" ) # 8 bytes for the item tag and length self.length = 8 + self._blen + self._blen % 2 # Whether or not the buffer needs trailing padding self._padding = bool(self._blen % 2) # The item tag and length self._item = b"".join( ( b"\xFE\xFF\x00\xE0", (self.length - 8).to_bytes(length=4, byteorder="little"), ) ) def read(self, start: int, size: int) -> bytes: """Return data from the encapsulated frame. Parameters ---------- start : int The initial position in the encapsulated item where data should be read from, must be greater than or equal to 0, where ``0`` is the first byte of the item tag. size : int The number of bytes to read from the buffer. Returns ------- bytes The data read from the buffer. """ if not 0 <= start < self.length: raise ValueError( f"Invalid 'start' value '{start}', must be in the closed interval " f"[0, {self.length - 1}]" ) nr_read = 0 out = bytearray() while length := (size - nr_read): offset = start + nr_read if offset < 8: # `offset` in item tag/length _read = self._item[offset : offset + length] elif 0 <= (offset - 8) < self._blen: # `offset` in item value with reset_buffer_position(self.buffer): self.buffer.seek(offset - 8) _read = self.buffer.read(length) elif self._padding and offset == self.length - 1: # `offset` in the item value padding _read = b"\x00" else: # `offset` past the end of the item value _read = b"" if not _read: break nr_read += len(_read) out.extend(_read) return bytes(out) class EncapsulatedBuffer(BufferedIOBase): """Convenience class for managing the encapsulation of one or more buffers containing compressed *Pixel Data*. .. versionadded:: 3.0 """ def __init__(self, buffers: list[BufferedIOBase], use_bot: bool = False) -> None: """Create a new class instance. Parameters ---------- buffers : list[io.BufferedIOBase] The buffered pixel data frames to be encapsulated on writing the dataset. Only a single frame of pixel data can be in each buffer and the buffers must inherit from :class:`io.BufferedIODBase` and be readable and seekable. use_bot : bool, optional If ``True`` then the Basic Offset Table will include the offsets for each encapsulated items, otherwise no offsets will be included (default). """ if not isinstance(buffers, list): raise TypeError( "'buffers' must be a list of objects that inherit from " "'io.BufferedIOBase'" ) # The items to be encapsulated self._items = [_BufferedItem(b) for b in buffers] # The current position of the encapsulated buffer self._offset = 0 # Use a non-empty Basic Offset Table self._use_bot = use_bot # The basic offset table bot = self.basic_offset_table # Offsets for the buffered items # Start of the item tag for the Basic Offset Table self._item_offsets = [0] # Start of the item tag for each frame self._item_offsets.extend([offset + len(bot) for offset in self.offsets]) # End of the encapsulation self._item_offsets.append(self.encapsulated_length) # A dict containing the items to read encoded data from # 0: the buffered Basic Offset Table value # 1 to len(buffers): the buffered frames self._buffers = {idx + 1: item for idx, item in enumerate(self._items)} self._buffers[0] = _BufferedItem(BytesIO(bot[8:])) @property def basic_offset_table(self) -> bytes: """Return an encoded Basic Offset Table.""" if not self._use_bot: return b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" # The item tag for the offset table bot = [b"\xFE\xFF\x00\xE0"] # Add the item length bot.append(pack(" bool: """Return ``True`` if any of the encapsulated buffers are closed.""" return any(item.buffer.closed for item in self._items) @property def extended_lengths(self) -> bytes: """Return an encoded *Extended Offset Table Lengths* value from `lengths` Returns ------- bytes The encoded lengths of the frame. """ # Exclude the item tag and item length return pack(f"<{len(self.lengths)}Q", *(length - 8 for length in self.lengths)) @property def extended_offsets(self) -> bytes: """Return an encoded *Extended Offset Table* value from `offsets` Returns ------- bytes The encoded offsets to the first byte of the item tag of the first fragment for every frame, as measured from the first byte of the first item tag following the empty Basic Offset Table Item. """ return pack(f"<{len(self.offsets)}Q", *self.offsets) @property def encapsulated_length(self) -> int: """Return the total length of the encapulated *Pixel Data* value.""" return len(self.basic_offset_table) + sum(self.lengths) @property def lengths(self) -> list[int]: """Return the encapsulated item lengths.""" return [item.length for item in self._items] @property def offsets(self) -> list[int]: """Return the encapsulated item offsets, starting at 0 for the first item.""" return [sum(self.lengths[0:idx]) for idx, _ in enumerate(self.lengths)] def read(self, size: int | None = 8192, /) -> bytes: """Read up to `size` bytes of data from the encapsulated buffers. Parameters ---------- size : int, optional The amount of data to be read, if ``None`` then all data will be returned. Returns ------- bytes The data read from the encapsulated buffers. """ if self._offset >= self.encapsulated_length: return b"" size = self.encapsulated_length if size is None else size nr_read = 0 out = bytearray() while length := (size - nr_read): iterator = enumerate(zip(self._item_offsets, self._item_offsets[1:])) for idx, (start, end) in iterator: if start <= self._offset < end: _read = self._buffers[idx].read(self._offset - start, length) break if not _read: break self._offset += len(_read) nr_read += len(_read) out.extend(_read) if self._offset >= self.encapsulated_length: break return bytes(out) def readable(self) -> bool: """Return ``True`` if all the encapsulated buffers are readable.""" return all(item.buffer.readable() for item in self._items) def seek(self, offset: int, whence: int = os.SEEK_SET, /) -> int: """Change the encapsulated buffers position to the given byte `offset`, relative to the position indicated by `whence` and return the new absolute position. """ if whence not in (os.SEEK_SET, os.SEEK_CUR, os.SEEK_END): raise ValueError("Invalid 'whence' value, should be 0, 1 or 2") # Behavior emulates io.BytesIO if whence == os.SEEK_SET: # relative to beginning of buffer if offset < 0: raise ValueError(f"Negative seek 'offset' value {offset}") new_offset = offset elif whence == os.SEEK_CUR: # relative to current buffer position new_offset = self._offset + offset new_offset = 0 if new_offset < 0 else new_offset elif whence == os.SEEK_END: # relative to end of the buffer new_offset = self.encapsulated_length + offset new_offset = 0 if new_offset < 0 else new_offset self._offset = new_offset return self._offset def seekable(self) -> bool: """Return ``True`` if all the encapsulated buffers are seekable.""" return all(item.buffer.seekable() for item in self._items) def tell(self) -> int: """Return the current stream position of the encapsulated buffers""" return self._offset def fragment_frame(frame: bytes, nr_fragments: int = 1) -> Iterator[bytes]: """Yield one or more fragments from `frame`. .. versionadded:: 1.2 Parameters ---------- frame : bytes The data to fragment. nr_fragments : int, optional The number of fragments (default ``1``). Yields ------ bytes The fragmented data, with all fragments as an even number of bytes greater than or equal to two. Notes ----- * All items containing an encoded fragment shall be made of an even number of bytes greater than or equal to two. * The last fragment of a frame may be padded, if necessary to meet the sequence item format requirements of the DICOM Standard. * Any necessary padding may be appended after the end of image marker. * Encapsulated Pixel Data has the Value Representation OB. * Values with a VR of OB shall be padded with a single trailing NULL byte value (``0x00``) to achieve even length. References ---------- DICOM Standard, Part 5, :dcm:`Section 6.2 ` and :dcm:`Annex A.4 ` """ frame_length = len(frame) # Add 1 to fix odd length frames not being caught if nr_fragments > (frame_length + 1) / 2.0: raise ValueError( "Too many fragments requested (the minimum fragment size is 2 bytes)" ) length = int(frame_length / nr_fragments) # Each item shall be an even number of bytes if length % 2: length += 1 # 1st to (N-1)th fragment for offset in range(0, length * (nr_fragments - 1), length): yield frame[offset : offset + length] # Nth fragment offset = length * (nr_fragments - 1) fragment = frame[offset:] # Pad last fragment if needed to make it even if (frame_length - offset) % 2: fragment += b"\x00" yield fragment def itemize_fragment(fragment: bytes) -> bytes: """Return an itemized `fragment`. .. versionadded:: 1.2 Parameters ---------- fragment : bytes The fragment to itemize. Returns ------- bytes The itemized fragment. Notes ----- * The encoding of the item shall be in Little Endian. * Each fragment is encapsulated as a DICOM Item with tag (FFFE,E000), then a 4 byte length. """ # item tag (FFFE,E000) item = b"\xFE\xFF\x00\xE0" # fragment length ' Iterator[bytes]: """Yield items generated from `frame`. .. versionadded:: 1.2 Parameters ---------- frame : bytes The data to fragment and itemise. nr_fragments : int, optional The number of fragments/items (default 1). Yields ------ bytes An itemized fragment of the frame, encoded as little endian. Notes ----- * The encoding of the items shall be in Little Endian. * Each fragment is encapsulated as a DICOM Item with tag (FFFE,E000), then a 4 byte length. References ---------- DICOM Standard, Part 5, :dcm:`Section 7.5 ` and :dcm:`Annex A.4 ` """ for fragment in fragment_frame(frame, nr_fragments): yield itemize_fragment(fragment) def encapsulate( frames: list[bytes], fragments_per_frame: int = 1, has_bot: bool = True ) -> bytes: """Return encapsulated `frames`. .. versionadded:: 1.2 When using a compressed transfer syntax (such as RLE Lossless or one of JPEG formats) then any *Pixel Data* must be :dcm:`encapsulated `:: # Where `frame1`, `frame2` are single frames that have been encoded # using the corresponding compression method to Transfer Syntax UID ds.PixelData = encapsulate([frame1, frame2, ...]) For multi-frame data each frame must be encoded separately and then all encoded frames encapsulated together. When many large frames are to be encapsulated, the total length of encapsulated data may exceed the maximum length available with the :dcm:`Basic Offset Table` (2**31 - 1 bytes). Under these circumstances you can: * Pass ``has_bot=False`` to :func:`~pydicom.encaps.encapsulate` * Use :func:`~pydicom.encaps.encapsulate_extended` and add the :dcm:`Extended Offset Table` elements to your dataset (recommended) Data will be encapsulated with a Basic Offset Table Item at the beginning, then one or more fragment items. Each item will be of even length and the final fragment of each frame may be padded with ``0x00`` if required. Parameters ---------- frames : list of bytes The frame data to encapsulate, one frame per item. fragments_per_frame : int, optional The number of fragments to use for each frame (default ``1``). has_bot : bool, optional ``True`` to include values in the Basic Offset Table, ``False`` otherwise (default ``True``). If `fragments_per_frame` is not ``1`` then it's strongly recommended that this be ``True``. Returns ------- bytes The encapsulated pixel data. References ---------- DICOM Standard, Part 5, :dcm:`Section 7.5 ` and :dcm:`Annex A.4 ` See Also -------- :func:`~pydicom.encaps.encapsulate_buffer` :func:`~pydicom.encaps.encapsulate_extended` :func:`~pydicom.encaps.encapsulate_extended_buffer` """ nr_frames = len(frames) output = bytearray() # Add the Basic Offset Table Item # Add the tag output.extend(b"\xFE\xFF\x00\xE0") if has_bot: # Check that the 2**32 - 1 limit in BOT item lengths won't be exceeded total = (nr_frames - 1) * 8 + sum([len(f) for f in frames[:-1]]) if total > 2**32 - 1: raise ValueError( f"The total length of the encapsulated frame data ({total} " "bytes) will be greater than the maximum allowed by the Basic " f"Offset Table ({2**32 - 1} bytes), it's recommended that you " "use the Extended Offset Table instead (see the " "'encapsulate_extended' function for more information)" ) # Add the length output.extend(pack(" EncapsulatedBuffer: """Return an :class:`~pydicom.encaps.EncapsulatedBuffer` instance from `buffers`. .. versionadded:: 3.0 Examples -------- .. code-block:: python from pydicom import Dataset, FileMetaDataset from pydicom.encaps import encapsulate_buffer from pydicom.uid import JPEG2000Lossless # Open the compressed image frames as io.BufferedReader instances frame1 = open("frame1.j2k", "rb") frame2 = open("frame2.j2k", "rb") frame3 = open("frame3.j2k", "rb") ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEG2000Lossless ds.PixelData = encapsulate_buffer([frame1, frame2, frame3]) # Write the encapsulated buffer data to file ds.save_as("buffered_dataset.dcm") # Close the buffers frame1.close() frame2.close() frame3.close() Parameters ---------- buffers : list[io.BufferedIOBase] A list of objects inheriting :class:`io.BufferedIOBase` containing the compressed *Pixel Data* frames to be encapsulated. Returns ------- EncapsulatedBuffer A :class:`~pydicom.encaps.EncapsulatedBuffer` instance that can be used as the value for a *Pixel Data* element. See Also -------- :func:`~pydicom.encaps.encapsulate` :func:`~pydicom.encaps.encapsulate_extended` :func:`~pydicom.encaps.encapsulate_extended_buffer` """ return EncapsulatedBuffer(buffers, use_bot=has_bot) def encapsulate_extended(frames: list[bytes]) -> tuple[bytes, bytes, bytes]: """Return encapsulated image data and values for the Extended Offset Table elements. When using a compressed transfer syntax (such as RLE Lossless or one of JPEG formats) then any *Pixel Data* must be :dcm:`encapsulated `. When many large frames are to be encapsulated, the total length of encapsulated data may exceed the maximum offset available with the :dcm:`Basic Offset Table` (2**32 - 1 bytes). Under these circumstances you can: * Use :func:`~pydicom.encaps.encapsulate_extended` and add the :dcm:`Extended Offset Table` elements to your dataset (recommended) * Pass ``has_bot=False`` to :func:`~pydicom.encaps.encapsulate` Examples -------- .. code-block:: python from pydicom import Dataset, FileMetaDataset from pydicom.encaps import encapsulate_extended from pydicom.uid import JPEG2000Lossless # 'frames' is a list of image frames that have been each been encoded # separately using the compression method corresponding to the Transfer # Syntax UID frames: list[bytes] = [...] out: tuple[bytes, bytes, bytes] = encapsulate_extended(frames) ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEG2000Lossless ds.PixelData = out[0] ds.ExtendedOffsetTable = out[1] ds.ExtendedOffsetTableLengths = out[2] Parameters ---------- frames : list of bytes The compressed frame data to encapsulate, one frame per item. Returns ------- bytes, bytes, bytes The (encapsulated frames, extended offset table, extended offset table lengths). See Also -------- :func:`~pydicom.encaps.encapsulate` :func:`~pydicom.encaps.encapsulate_buffer` :func:`~pydicom.encaps.encapsulate_extended_buffer` """ nr_frames = len(frames) frame_lengths = [len(frame) for frame in frames] # Odd-length frames get padded to even length by `encapsulate()` frame_lengths = [ii + ii % 2 for ii in frame_lengths] frame_offsets = [0] for ii, length in enumerate(frame_lengths[:-1]): # Extra 8 bytes for the Item tag and length frame_offsets.append(frame_offsets[ii] + length + 8) offsets = pack(f"<{nr_frames}Q", *frame_offsets) lengths = pack(f"<{nr_frames}Q", *frame_lengths) return encapsulate(frames, has_bot=False), offsets, lengths def encapsulate_extended_buffer( buffers: list[BufferedIOBase], ) -> tuple[EncapsulatedBuffer, bytes, bytes]: """Return :class:`~pydicom.encaps.EncapsulatedBuffer` as well as encoded offsets and lengths for the Extended Offset Table elements. .. versionadded:: 3.0 Examples -------- .. code-block:: python from pydicom import Dataset, FileMetaDataset from pydicom.encaps import encapsulate_extended_buffer from pydicom.uid import JPEG2000Lossless # Open the compressed image frames as io.BufferedReader instances frame1 = open("frame1.j2k", "rb") frame2 = open("frame2.j2k", "rb") frame3 = open("frame3.j2k", "rb") out: tuple[EncapsulatedBuffer, bytes, bytes] = ( encapsulate_extended_buffer([frame1, frame2, frame3]) ) ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEG2000Lossless ds.PixelData = out[0] ds.ExtendedOffsetTable = out[1] ds.ExtendedOffsetTableLengths = out[2] # Write the encapsulated buffer data to file ds.save_as("buffered_dataset.dcm") # Close the buffers frame1.close() frame2.close() frame3.close() Parameters ---------- buffers : list[io.BufferedIOBase] A list of objects inheriting :class:`io.BufferedIOBase` containing the compressed *Pixel Data* frames to be encapsulated. Returns ------- tuple[EncapsulatedBuffer, bytes, bytes] The (:class:`~pydicom.encaps.EncapsulatedBuffer`, extended offset table, extended offset table lengths). See Also -------- :func:`~pydicom.encaps.encapsulate` :func:`~pydicom.encaps.encapsulate_buffer` :func:`~pydicom.encaps.encapsulate_extended` """ eb = EncapsulatedBuffer(buffers) return eb, eb.extended_offsets, eb.extended_lengths # Deprecated functions def _get_frame_offsets(fp: DicomIO) -> tuple[bool, list[int]]: """Return a list of the fragment offsets from the Basic Offset Table. .. deprecated:: 3.0 This function will be removed in v4.0, please use :func:`~pydicom.encaps.parse_basic_offsets` instead. **Basic Offset Table** The Basic Offset Table Item must be present and have a tag (FFFE,E000) and a length, however it may or may not have a value. Basic Offset Table with no value :: Item Tag | Length | FE FF 00 E0 00 00 00 00 Basic Offset Table with value (2 frames) :: Item Tag | Length | Offset 1 | Offset 2 | FE FF 00 E0 08 00 00 00 00 00 00 00 10 00 00 00 For single or multi-frame images with only one frame, the Basic Offset Table may or may not have a value. When it has no value then its length shall be ``0x00000000``. For multi-frame images with more than one frame, the Basic Offset Table should have a value containing concatenated 32-bit unsigned integer values that are the byte offsets to the first byte of the Item tag of the first fragment of each frame as measured from the first byte of the first item tag following the Basic Offset Table Item. All decoders, both for single and multi-frame images should accept both an empty Basic Offset Table and one containing offset values. .. versionchanged:: 1.4 Changed to return (is BOT empty, list of offsets). Parameters ---------- fp : filebase.DicomIO The encapsulated pixel data positioned at the start of the Basic Offset Table. ``fp.is_little_endian`` should be set to ``True``. Returns ------- bool, list of int Whether or not the BOT is empty, and a list of the byte offsets to the first fragment of each frame, as measured from the start of the first item following the Basic Offset Table item. Raises ------ ValueError If the Basic Offset Table item's tag is not (FFEE,E000) or if the length in bytes of the item's value is not a multiple of 4. References ---------- DICOM Standard, Part 5, :dcm:`Annex A.4 ` """ if not fp.is_little_endian: raise ValueError("'fp.is_little_endian' must be True") tag = Tag(fp.read_tag()) if tag != 0xFFFEE000: raise ValueError( f"Unexpected tag '{tag}' when parsing the Basic Offset Table item" ) length = fp.read_UL() if length % 4: raise ValueError( "The length of the Basic Offset Table item is not a multiple of 4" ) offsets = [] # Always return at least a 0 offset if length == 0: offsets.append(0) offsets.extend(fp.read_UL() for ii in range(length // 4)) return bool(length), offsets def _get_nr_fragments(fp: DicomIO) -> int: """Return the number of fragments in `fp`. .. deprecated:: 3.0 This function will be removed in v4.0, please use :func:`~pydicom.encaps.parse_fragments` instead. """ if not fp.is_little_endian: raise ValueError("'fp.is_little_endian' must be True") return parse_fragments(fp)[0] def _generate_pixel_data_fragment(fp: DicomIO) -> Iterator[bytes]: """Yield the encapsulated pixel data fragments. .. deprecated:: 3.0 This function will be remove in v4.0, please use :func:`~pydicom.encaps.generate_fragments` instead. For compressed (encapsulated) Transfer Syntaxes, the (7FE0,0010) *Pixel Data* element is encoded in an encapsulated format. **Encapsulation** The encoded pixel data stream is fragmented into one or more Items. The stream may represent a single or multi-frame image. Each *Data Stream Fragment* shall have tag of (FFFE,E000), followed by a 4 byte *Item Length* field encoding the explicit number of bytes in the Item. All Items containing an encoded fragment shall have an even number of bytes greater than or equal to 2, with the last fragment being padded if necessary. The first Item in the Sequence of Items shall be a 'Basic Offset Table', however the Basic Offset Table item value is not required to be present. It is assumed that the Basic Offset Table item has already been read prior to calling this function (and that `fp` is positioned past this item). The remaining items in the Sequence of Items are the pixel data fragments and it is these items that will be read and returned by this function. The Sequence of Items is terminated by a (FFFE,E0DD) *Sequence Delimiter Item* with an Item Length field of value ``0x00000000``. The presence or absence of the *Sequence Delimiter Item* in `fp` has no effect on the returned fragments. *Encoding* The encoding of the data shall be little endian. Parameters ---------- fp : filebase.DicomIO The encoded (7FE0,0010) *Pixel Data* element value, positioned at the start of the item tag for the first item after the Basic Offset Table item. ``fp.is_little_endian`` should be set to ``True``. Yields ------ bytes A pixel data fragment. Raises ------ ValueError If the data contains an item with an undefined length or an unknown tag. References ---------- DICOM Standard Part 5, :dcm:`Annex A.4 ` """ if not fp.is_little_endian: raise ValueError("'fp.is_little_endian' must be True") yield from generate_fragments(fp) def _generate_pixel_data_frame( bytestream: bytes, nr_frames: int | None = None ) -> Iterator[bytes]: """Yield complete frames from `buffer` as :class:`bytes`. .. deprecated:: 3.0 This function will be remove in v4.0, please use :func:`~pydicom.encaps.generate_frames` instead Parameters ---------- bytestream : bytes The value of the (7FE0,0010) *Pixel Data* element from an encapsulated dataset. The Basic Offset Table item should be present and the Sequence Delimiter item may or may not be present. nr_frames : int, optional Required for multi-frame data when the Basic Offset Table is empty and there are multiple frames. This should be the value of (0028,0008) *Number of Frames*. Yields ------ bytes A frame contained in the encapsulated pixel data. References ---------- DICOM Standard Part 5, :dcm:`Annex A ` """ for frame in generate_fragmented_frames(bytestream, number_of_frames=nr_frames): yield b"".join(frame) def _generate_pixel_data( bytestream: bytes, nr_frames: int | None = None ) -> Iterator[tuple[bytes, ...]]: """Yield an encapsulated pixel data frame. .. deprecated:: 3.0 Please use :func:`~pydicom.encaps.generate_fragmented_frames` instead. For the following transfer syntaxes, a fragment may not contain encoded data from more than one frame. However data from one frame may span multiple fragments. * 1.2.840.10008.1.2.4.50 - JPEG Baseline (Process 1) * 1.2.840.10008.1.2.4.51 - JPEG Baseline (Process 2 and 4) * 1.2.840.10008.1.2.4.57 - JPEG Lossless, Non-Hierarchical (Process 14) * 1.2.840.10008.1.2.4.70 - JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1]) * 1.2.840.10008.1.2.4.80 - JPEG-LS Lossless Image Compression * 1.2.840.10008.1.2.4.81 - JPEG-LS Lossy (Near-Lossless) Image Compression * 1.2.840.10008.1.2.4.90 - JPEG 2000 Image Compression (Lossless Only) * 1.2.840.10008.1.2.4.91 - JPEG 2000 Image Compression * 1.2.840.10008.1.2.4.92 - JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only) * 1.2.840.10008.1.2.4.93 - JPEG 2000 Part 2 Multi-component Image Compression For the following transfer syntaxes, each frame shall be encoded in one and only one fragment. * 1.2.840.10008.1.2.5 - RLE Lossless Parameters ---------- bytestream : bytes The value of the (7FE0,0010) *Pixel Data* element from an encapsulated dataset. The Basic Offset Table item should be present and the Sequence Delimiter item may or may not be present. nr_frames : int, optional Required for multi-frame data when the Basic Offset Table is empty and there are multiple frames. This should be the value of (0028,0008) *Number of Frames*. Yields ------- tuple of bytes An encapsulated pixel data frame, with the contents of the :class:`tuple` the frame's fragmented data. Notes ----- If the Basic Offset Table is empty and there are multiple fragments per frame then an attempt will be made to locate the frame boundaries by searching for the JPEG/JPEG-LS/JPEG2000 EOI/EOC marker (``0xFFD9``). If the marker is not present or the pixel data hasn't been compressed using one of the JPEG standards then the generated pixel data may be incorrect. References ---------- DICOM Standard Part 5, :dcm:`Annex A ` """ yield from generate_fragmented_frames(bytestream, number_of_frames=nr_frames) def _decode_data_sequence(data: bytes) -> list[bytes]: """Read encapsulated data and return a list of bytes. .. deprecated:: 3.0 This function will be removed in v4.0, Please use :func:`~pydicom.encaps.generate_frames` for generating frame data or :func:`~pydicom.encaps.generate_fragments` for generating fragment data. Parameters ---------- data : bytes The encapsulated data, typically the value from ``Dataset.PixelData``. Returns ------- list of bytes All fragments as a list of ``bytes``. """ # Convert data into a memory-mapped file with DicomBytesIO(data) as fp: # DICOM standard requires this fp.is_little_endian = True BasicOffsetTable = _read_item(fp) # NOQA seq = [] while True: item = _read_item(fp) # None is returned if get to Sequence Delimiter if not item: break seq.append(item) # XXX should return seq def _defragment_data(data: bytes) -> bytes: """Read encapsulated data and return the fragments as one continuous bytes. .. deprecated:: 3.0 This function will be removed in v4.0, Please use :func:`~pydicom.encaps.generate_frames` for generating frame data or :func:`~pydicom.encaps.generate_fragments` for generating fragment data. Parameters ---------- data : bytes The encapsulated pixel data fragments. Returns ------- bytes All fragments concatenated together. """ return b"".join(_decode_data_sequence(data)) def _read_item(fp: DicomIO) -> bytes | None: """Read and return a single Item in the fragmented data stream. .. deprecated:: 3.0 This function will be removed in v4.0, please use :func:`~pydicom.encaps.generate_fragments` instead. Parameters ---------- fp : filebase.DicomIO The file-like to read the item from. Returns ------- bytes The Item's raw bytes. """ logger = config.logger try: tag = fp.read_tag() # already read delimiter before passing data here # so should just run out except EOFError: return None # No more items, time for sequence to stop reading if tag == SequenceDelimiterTag: length = fp.read_UL() logger.debug("%04x: Sequence Delimiter, length 0x%x", fp.tell() - 8, length) if length != 0: logger.warning( "Expected 0x00000000 after delimiter, found 0x%x," " at data position 0x%x", length, fp.tell() - 4, ) return None if tag != ItemTag: logger.warning( "Expected Item with tag %s at data position 0x%x", ItemTag, fp.tell() - 4 ) length = fp.read_UL() else: length = fp.read_UL() logger.debug("%04x: Item, length 0x%x", fp.tell() - 8, length) if length == 0xFFFFFFFF: raise ValueError( "Encapsulated data fragment had Undefined Length" f" at data position 0x{fp.tell() - 4:x}" ) item_data = fp.read(length) return item_data _DEPRECATED = { "get_frame_offsets": _get_frame_offsets, "get_nr_fragments": _get_nr_fragments, "generate_pixel_data_fragment": _generate_pixel_data_fragment, "generate_pixel_data_frame": _generate_pixel_data_frame, "generate_pixel_data": _generate_pixel_data, "decode_data_sequence": _decode_data_sequence, "defragment_data": _defragment_data, "read_item": _read_item, "itemise_frame": itemize_frame, "itemise_fragment": itemize_fragment, } def __getattr__(name: str) -> Any: if name in _DEPRECATED and not config._use_future: warn_and_log( f"{name} is deprecated and will be removed in v4.0", DeprecationWarning, ) return _DEPRECATED[name] raise AttributeError(f"module {__name__!r} has no attribute {name!r}") pydicom-pydicom-20aa4b7/src/pydicom/encoders/000077500000000000000000000000001515706620200212635ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/encoders/__init__.py000066400000000000000000000013601515706620200233740ustar00rootroot00000000000000# TODO: remove module in v4.0 from typing import Any from pydicom import config from pydicom.misc import warn_and_log from pydicom.pixels import get_encoder as _get_encoder from pydicom.pixels.encoders import RLELosslessEncoder as _rle_encoder _DEPRECATED = { "get_encoder": _get_encoder, "RLELosslessEncoder": _rle_encoder, } def __getattr__(name: str) -> Any: if name in _DEPRECATED and not config._use_future: msg = ( f"The 'pydicom.encoders' module will be removed in v4.0, please use " f"'from pydicom.pixels import {name}' instead" ) warn_and_log(msg, DeprecationWarning) return _DEPRECATED[name] raise AttributeError(f"module {__name__!r} has no attribute {name!r}") pydicom-pydicom-20aa4b7/src/pydicom/env_info.py000066400000000000000000000033021515706620200216340ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """ Gather system information and version information for pydicom and auxiliary modules. The output is a GitHub-flavoured markdown table whose contents can help diagnose any perceived bugs in pydicom. This can be pasted directly into a new GitHub bug report. This file is intended to be run as an executable module. """ import importlib import platform import sys from types import ModuleType from typing import cast def main() -> None: version_rows = [("platform", platform.platform()), ("Python", sys.version)] modules = ( "pydicom", "gdcm", "jpeg_ls", "numpy", "PIL", "pylibjpeg", "openjpeg", "libjpeg", ) for module in modules: try: m = importlib.import_module(module) except ImportError: version = "_module not found_" else: version = extract_version(m) or "**cannot determine version**" version_rows.append((module, version)) print_table(version_rows) def print_table(version_rows: list[tuple[str, str]]) -> None: row_format = "{:12} | {}" print(row_format.format("module", "version")) print(row_format.format("------", "-------")) for module, version in version_rows: # Some version strings have multiple lines and need to be squashed print(row_format.format(module, version.replace("\n", " "))) def extract_version(module: ModuleType) -> str | None: if module.__name__ == "gdcm": return cast(str | None, getattr(module, "GDCM_VERSION", None)) return cast(str | None, getattr(module, "__version__", None)) if __name__ == "__main__": main() pydicom-pydicom-20aa4b7/src/pydicom/errors.py000066400000000000000000000014031515706620200213450ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Module for pydicom exception classes""" from typing import Any class InvalidDicomError(Exception): """Exception that is raised when the the file does not appear to be DICOM. Usually raised when the "DICM" prefix is not present at position 128 in the file. To force reading the file (because maybe it is a DICOM file without a header), use ``dcmread(..., force=True)``. """ def __init__(self, *args: Any) -> None: if not args: args = ("The specified file is not a valid DICOM file.",) Exception.__init__(self, *args) class BytesLengthException(Exception): """Exception that is raised for an unexpected number of bytes.""" pass pydicom-pydicom-20aa4b7/src/pydicom/examples/000077500000000000000000000000001515706620200212775ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/examples/__init__.py000066400000000000000000000033451515706620200234150ustar00rootroot00000000000000"""Module to support importing the datasets used by the documentation.""" from typing import Any, cast from pathlib import Path from pydicom.data import get_testdata_file from pydicom.filereader import dcmread # All datasets included here must be available in the package itself # NOT via the pydicom-data download method _DATASETS: dict[str, str] = { "ct": cast(str, get_testdata_file("CT_small.dcm")), "dicomdir": cast(str, get_testdata_file("DICOMDIR")), "jpeg2k": cast(str, get_testdata_file("examples_jpeg2k.dcm")), "mr": cast(str, get_testdata_file("MR_small.dcm")), "no_meta": cast(str, get_testdata_file("no_meta.dcm")), "overlay": cast(str, get_testdata_file("examples_overlay.dcm")), "palette_color": cast(str, get_testdata_file("examples_palette.dcm")), "rgb_color": cast(str, get_testdata_file("examples_rgb_color.dcm")), "rt_dose": cast(str, get_testdata_file("rtdose.dcm")), "rt_plan": cast(str, get_testdata_file("rtplan.dcm")), "rt_ss": cast(str, get_testdata_file("rtstruct.dcm")), "waveform": cast(str, get_testdata_file("waveform_ecg.dcm")), "ybr_color": cast(str, get_testdata_file("examples_ybr_color.dcm")), } def _get_path(name: str) -> Path: """Return the path to the example dataset with the attribute name `name` as :class:`pathlib.Path`. """ if name in _DATASETS: return Path(_DATASETS[name]) raise ValueError(f"No example dataset exists with the name '{name}'") def __getattr__(name: str) -> Any: """Return module level attributes.""" if name in _DATASETS: return dcmread(_DATASETS[name], force=True) if name == "get_path": return _get_path raise AttributeError(f"module '{__name__}' has no attribute '{name}'") pydicom-pydicom-20aa4b7/src/pydicom/filebase.py000066400000000000000000000240721515706620200216120ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Hold DicomFile class, which does basic I/O for a dicom file.""" from io import BytesIO import os from struct import Struct from types import TracebackType from typing import TYPE_CHECKING, cast, Any, TypeVar, Protocol if TYPE_CHECKING: # pragma: no cover from collections.abc import Callable ExitException = tuple[ type[BaseException] | None, BaseException | None, TracebackType | None ] Self = TypeVar("Self", bound="DicomIO") class ReadableBuffer(Protocol): def read(self, size: int = ..., /) -> bytes: ... # pragma: no cover def seek(self, offset: int, whence: int = ..., /) -> int: ... # pragma: no cover def tell(self) -> int: ... # pragma: no cover class WriteableBuffer(Protocol): def seek(self, offset: int, whence: int = ..., /) -> int: ... # pragma: no cover def tell(self) -> int: ... # pragma: no cover def write( self, b: bytes | bytearray | memoryview, / ) -> int: ... # pragma: no cover class DicomIO: """Wrapper for managing buffer-like objects used when reading or writing DICOM datasets. """ def __init__(self, buffer: ReadableBuffer | WriteableBuffer) -> None: """Create a new ``DicomIO`` instance. Parameters ---------- buffer : buffer-like object A buffer-like object that implements: * ``seek()`` and ``tell()`` methods with the same signatures as :meth:`io.IOBase.seek` and :meth:`io.IOBase.tell` * a ``read()`` method with the same signature as :meth:`io.RawIOBase.read` if it supports reading data from itself, and/or * a ``write()`` method with the same signature as :meth:`io.RawIOBase.write` if it supports writing data to itself If `buffer` supports reading it can be used with :func:`~pydicom.filereader.dcmread` as the source to decode a DICOM dataset from, and if it supports writing it can be used with :func:`~pydicom.filewriter.dcmwrite` as the destination for the encoded DICOM dataset. """ # Data packers/unpackers self._us_unpacker: Callable[[bytes], tuple[Any, ...]] self._us_packer: Callable[[int], bytes] self._ul_unpacker: Callable[[bytes], tuple[Any, ...]] self._ul_packer: Callable[[int], bytes] self._tag_unpacker: Callable[[bytes], tuple[Any, ...]] self._tag_packer: Callable[[int, int], bytes] # Store the encoding method self._implicit_vr: bool self._little_endian: bool # The buffer-like object being wrapped self._buffer = buffer # The filename associated with the buffer-like self._name: str | None = getattr(self._buffer, "name", None) # It's more efficient to replace the existing class methods # instead of wrapping them if hasattr(buffer, "read"): self.read = buffer.read if hasattr(buffer, "write"): self.write = buffer.write if hasattr(buffer, "close"): self.close = buffer.close # seek() and tell() are always required self.seek = buffer.seek self.tell = buffer.tell def close(self, *args: Any, **kwargs: Any) -> Any: """Close the buffer (if possible)""" pass def __enter__(self: Self) -> Self: return self def __exit__(self, *exc_info: ExitException) -> None: self.close() @property def is_little_endian(self) -> bool: """Get/set the endianness for encoding/decoding, ``True`` for little endian and ``False`` for big endian. """ if not hasattr(self, "_little_endian"): raise AttributeError( f"{type(self).__name__}.is_little_endian' has not been set" ) return self._little_endian @is_little_endian.setter def is_little_endian(self, value: bool) -> None: if not isinstance(value, bool): raise TypeError(f"'{type(self).__name__}.is_little_endian' must be bool") self._little_endian = value endianness = "><"[value] self._us_packer = Struct(f"{endianness}H").pack self._us_unpacker = Struct(f"{endianness}H").unpack self._ul_packer = Struct(f"{endianness}L").pack self._ul_unpacker = Struct(f"{endianness}L").unpack self._tag_packer = Struct(f"{endianness}2H").pack self._tag_unpacker = Struct(f"{endianness}2H").unpack @property def is_implicit_VR(self) -> bool: """Get/set the VR mode for encoding/decoding. ``True`` for implicit VR and ``False`` for explicit VR. """ if not hasattr(self, "_implicit_vr"): raise AttributeError( f"{type(self).__name__}.is_implicit_VR' has not been set" ) return self._implicit_vr @is_implicit_VR.setter def is_implicit_VR(self, value: bool) -> None: if not isinstance(value, bool): raise TypeError(f"'{type(self).__name__}.is_implicit_VR' must be bool") self._implicit_vr = value @property def name(self) -> str | None: """Return the value of the :attr:`~pydicom.filebase.DicomIO.parent`'s ``name`` attribute, or ``None`` if no such attribute. """ return self._name @name.setter def name(self, name: str) -> None: self._name = name @property def parent(self) -> ReadableBuffer | WriteableBuffer: """Return the buffer object being wrapped.""" return self._buffer def read(self, size: int = -1, /) -> bytes: """Read up to `size` bytes from the buffer and return them. If `size` is unspecified, all bytes until EOF are returned. Fewer than `size` bytes may be returned if the operating system call returns fewer than `size` bytes. """ raise TypeError( f"'{type(self).__name__}' cannot be used with " f"'{type(self._buffer).__name__}': object has no read() method" ) def read_exact(self, length: int, nr_retries: int = 3) -> bytes: """Return `length` bytes read from the buffer. Parameters ---------- length : int The number of bytes to be read. If ``None`` (default) then read all the bytes available. nr_retries : int, optional The number of tries to read data when the number of bytes read from the buffer is less than `length`. Default ``3``. Returns ------- bytes The read data. Raises ------ EOFError If unable to read `length` bytes. """ bytes_read = self.read(length) if len(bytes_read) == length: return bytes_read # Use a bytearray because concatenating bytes is expensive bytes_read = bytearray(bytes_read) attempts = 0 while (num_bytes := len(bytes_read)) < length and attempts < nr_retries: bytes_read += self.read(length - num_bytes) attempts += 1 if num_bytes == length: return bytes(bytes_read) raise EOFError( f"Unexpected end of file. Read {num_bytes} bytes of {length} " f"expected starting at position 0x{self.tell() - num_bytes:x}" ) def read_tag(self) -> tuple[int, int]: """Return a DICOM tag value read from the buffer.""" return cast( tuple[int, int], self._tag_unpacker(self.read_exact(4)), ) def read_UL(self) -> int: """Return a UL value read from the buffer.""" return cast(int, self._ul_unpacker(self.read(4))[0]) def read_US(self) -> int: """Return a US value read from the buffer.""" return cast(int, self._us_unpacker(self.read(2))[0]) def seek(self, offset: int, whence: int = os.SEEK_SET, /) -> int: """Change the buffer position to the given byte `offset`, relative to the position indicated by `whence` and return the new absolute position. """ raise NotImplementedError() # pragma: no cover def tell(self) -> int: """Return the current stream position of the buffer""" raise NotImplementedError() # pragma: no cover def write(self, b: bytes | bytearray | memoryview, /) -> int: """Write the bytes-like object `b` to the buffer and return the number of bytes written. """ raise TypeError( f"'{type(self).__name__}' cannot be used with " f"'{type(self._buffer).__name__}': object has no write() method" ) def write_tag(self, tag: int) -> None: """Write a DICOM tag to the buffer.""" self.write(self._tag_packer(tag >> 16, tag & 0xFFFF)) def write_UL(self, val: int) -> None: """Write a UL value to the buffer.""" self.write(self._ul_packer(val)) def write_US(self, val: int) -> None: """Write a US value to the buffer.""" self.write(self._us_packer(val)) class DicomFileLike(DicomIO): """Wrapper for file-likes to simplify encoding/decoding DICOM datasets. See Also -------- :class:`~pydicom.filebase.DicomIO` :class:`~pydicom.filebase.DicomBytesIO` """ pass def DicomFile(*args: Any, **kwargs: Any) -> DicomFileLike: """Return an opened :class:`~pydicom.filebase.DicomFileLike` from a file-like.""" return DicomFileLike(open(*args, **kwargs)) class DicomBytesIO(DicomIO): """Wrapper for :class:`io.BytesIO` to simplify encoding/decoding DICOM datasets. See Also -------- :class:`~pydicom.filebase.DicomIO` :class:`~pydicom.filebase.DicomFileLike` """ def __init__(self, initial_bytes: bytes | bytearray | memoryview = b"") -> None: """Create a new DicomBytesIO instance. Parameters ---------- buffer : bytes | bytearray | memoryview, optional The buffer to write to or read from, default is an empty buffer. """ buffer = BytesIO(initial_bytes) super().__init__(buffer) self.getvalue = buffer.getvalue pydicom-pydicom-20aa4b7/src/pydicom/filereader.py000066400000000000000000001257301515706620200221450ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Read a dicom media file""" # Need zlib and io.BytesIO for deflate-compressed file import os from struct import Struct, unpack from typing import BinaryIO, Any, cast from collections.abc import Callable, MutableSequence, Iterator import zlib from pydicom import config from pydicom.charset import default_encoding, convert_encodings from pydicom.config import logger from pydicom.datadict import _dictionary_vr_fast from pydicom.dataelem import ( DataElement, RawDataElement, convert_raw_data_element, empty_value_for_VR, ) from pydicom.dataset import Dataset, FileDataset, FileMetaDataset from pydicom.errors import InvalidDicomError from pydicom.filebase import ReadableBuffer, DicomBytesIO from pydicom.fileutil import ( read_undefined_length_value, path_from_pathlike, PathType, _unpack_tag, ) from pydicom.misc import size_in_bytes, warn_and_log from pydicom.sequence import Sequence from pydicom.tag import ( ItemTag, SequenceDelimiterTag, Tag, BaseTag, TagListType, ) import pydicom.uid from pydicom.util.hexutil import bytes2hex from pydicom.valuerep import EXPLICIT_VR_LENGTH_32, VR as VR_ ENCODED_VR = {vr.encode(default_encoding) for vr in VR_} def data_element_generator( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, stop_when: Callable[[BaseTag, str | None, int], bool] | None = None, defer_size: int | str | float | None = None, encoding: str | MutableSequence[str] = default_encoding, specific_tags: list[BaseTag | int] | None = None, ) -> Iterator[RawDataElement | DataElement]: """Create a generator to efficiently return the raw data elements. .. note:: This function is used internally - usually there is no need to call it from user code. To read data from a DICOM file, :func:`dcmread` shall be used instead. Parameters ---------- fp : file-like The file-like to read from. is_implicit_VR : bool ``True`` if the data is encoded as implicit VR, ``False`` otherwise. is_little_endian : bool ``True`` if the data is encoded as little endian, ``False`` otherwise. stop_when : None, callable, optional If ``None`` (default), then the whole file is read. A callable which takes tag, VR, length, and returns ``True`` or ``False``. If it returns ``True``, ``read_data_element`` will just return. defer_size : int, str or float, optional See :func:`dcmread` for parameter info. encoding : str | MutableSequence[str] Encoding scheme specific_tags : list or None See :func:`dcmread` for parameter info. Yields ------- RawDataElement or DataElement Yields DataElement for undefined length UN or SQ, RawDataElement otherwise. """ # Summary of DICOM standard PS3.5-2008 chapter 7: # If Implicit VR, data element is: # tag, 4-byte length, value. # The 4-byte length can be FFFFFFFF (undefined length)* # # If Explicit VR: # if OB, OW, OF, SQ, UN, or UT: # tag, VR, 2-bytes reserved (both zero), 4-byte length, value # For all but UT, the length can be FFFFFFFF (undefined length)* # else: (any other VR) # tag, VR, (2 byte length), value # * for undefined length, a Sequence Delimitation Item marks the end # of the Value Field. # Note, except for the special_VRs, both impl and expl VR use 8 bytes; # the special VRs follow the 8 bytes with a 4-byte length # With a generator, state is stored, so we can break down # into the individual cases, and not have to check them again for each # data element from pydicom.values import convert_string endian_chr = "><"[is_little_endian] # assign implicit VR struct to variable as use later if VR assumed missing implicit_VR_unpack = Struct(f"{endian_chr}HHL").unpack if is_implicit_VR: element_struct_unpack = implicit_VR_unpack else: # Explicit VR # tag, VR, 2-byte length (or 0 if special VRs) element_struct_unpack = Struct(f"{endian_chr}HH2sH").unpack extra_length_unpack = Struct(f"{endian_chr}L").unpack # for lookup speed # Make local variables so have faster lookup fp_read = fp.read fp_seek = fp.seek fp_tell = fp.tell logger_debug = logger.debug debugging = config.debugging defer_size = size_in_bytes(defer_size) tag_set: set[int] = {tag for tag in specific_tags} if specific_tags else set() has_tag_set = bool(tag_set) if has_tag_set: tag_set.add(0x00080005) # Specific Character Set while True: # VR: str | None # Read tag, VR, length, get ready to read value if len(bytes_read := fp_read(8)) < 8: return # at end of file if debugging: debug_msg = f"{fp.tell() - 8:08x}: {bytes2hex(bytes_read)}" if is_implicit_VR: # must reset VR each time; could have set last iteration (e.g. SQ) vr = None group, elem, length = element_struct_unpack(bytes_read) else: # explicit VR group, elem, vr, length = element_struct_unpack(bytes_read) # defend against switching to implicit VR, some writer do in SQ's # issue 1067, issue 1035 if vr in ENCODED_VR: # try most likely solution first vr = vr.decode(default_encoding) if vr in EXPLICIT_VR_LENGTH_32: bytes_read = fp_read(4) length = extra_length_unpack(bytes_read)[0] if debugging: debug_msg += " " + bytes2hex(bytes_read) elif not (b"AA" <= vr <= b"ZZ") and config.assume_implicit_vr_switch: # invalid VR, must be 2 cap chrs, assume implicit and continue if debugging: logger.warning( f"Unknown VR '0x{vr[0]:02x}{vr[1]:02x}' assuming " "implicit VR encoding" ) vr = None group, elem, length = implicit_VR_unpack(bytes_read) else: # Either an unimplemented VR or implicit VR encoding # Note that we treat an unimplemented VR as having a 2-byte # length, but that may not be correct vr = vr.decode(default_encoding) if debugging: logger.warning( f"Unknown VR '{vr}' assuming explicit VR encoding with " "2-byte length" ) if debugging: debug_msg = f"{debug_msg:<47s} ({group:04X},{elem:04X})" if not is_implicit_VR: debug_msg += f" {vr} " if length != 0xFFFFFFFF: debug_msg += f"Length: {length}" else: debug_msg += "Length: Undefined length (FFFFFFFF)" logger_debug(debug_msg) # Positioned to read the value, but may not want to -- check stop_when value_tell = fp_tell() tag = group << 16 | elem if tag == 0xFFFEE00D: # The item delimitation item of an undefined length dataset in # a sequence, length is 0 # If we hit this then we're at the end of the current dataset return if stop_when is not None: # XXX VR may be None here!! Should stop_when just take tag? if stop_when(BaseTag(tag), vr, length): if debugging: logger_debug( "Reading ended by stop_when callback. " "Rewinding to start of data element." ) rewind_length = 8 if not is_implicit_VR and vr in EXPLICIT_VR_LENGTH_32: rewind_length += 4 fp_seek(value_tell - rewind_length) return # Reading the value # First case (most common): reading a value with a defined length if length != 0xFFFFFFFF: # don't defer loading of Specific Character Set value as it is # needed immediately to get the character encoding for other tags if has_tag_set and tag not in tag_set: # skip the tag if not in specific tags fp_seek(fp_tell() + length) continue if ( defer_size is not None and length > defer_size and tag != 0x00080005 # charset ): # Flag as deferred by setting value to None, and skip bytes value = None if debugging: logger_debug( "Defer size exceeded. Skipping forward to next data element." ) fp_seek(fp_tell() + length) else: value = ( fp_read(length) if length > 0 else cast(bytes | None, empty_value_for_VR(vr, raw=True)) ) if debugging: dotdot = "..." if length > 20 else " " displayed_value = value[:20] if value else b"" logger_debug( "%08x: %-34s %s %r %s" % ( value_tell, bytes2hex(displayed_value), dotdot, displayed_value, dotdot, ) ) # If the tag is (0008,0005) Specific Character Set, then store it if tag == 0x00080005: # *Specific Character String* is b'' for empty value encoding = convert_string(cast(bytes, value) or b"", is_little_endian) # Store the encoding value in the generator # for use with future elements (SQs) encoding = convert_encodings(encoding) yield RawDataElement( BaseTag(tag), vr, length, value, value_tell, is_implicit_VR, is_little_endian, ) # Second case: undefined length - must seek to delimiter, # unless is SQ type, in which case is easier to parse it, because # undefined length SQs and items of undefined lengths can be nested # and it would be error-prone to read to the correct outer delimiter else: # VR UN with undefined length shall be handled as SQ # see PS 3.5, section 6.2.2 if vr == VR_.UN and config.settings.infer_sq_for_un_vr: vr = VR_.SQ # Try to look up type to see if is a SQ # if private tag, won't be able to look it up in dictionary, # in which case just ignore it and read the bytes unless it is # identified as a Sequence if vr is None or vr == VR_.UN and config.replace_un_with_known_vr: try: vr = _dictionary_vr_fast(tag) except KeyError: # Look ahead to see if it consists of items # and is thus a SQ next_tag = _unpack_tag(fp_read(4), endian_chr) # Rewind the file fp_seek(fp_tell() - 4) if next_tag == ItemTag: vr = VR_.SQ if vr == VR_.SQ: if debugging: logger_debug( f"{fp_tell():08X}: Reading/parsing undefined length sequence" ) seq = read_sequence( fp, is_implicit_VR, is_little_endian, length, encoding ) if has_tag_set and tag not in tag_set: continue yield DataElement( BaseTag(tag), vr, seq, value_tell, is_undefined_length=True ) else: if debugging: logger_debug("Reading undefined length data element") value = read_undefined_length_value( fp, is_little_endian, SequenceDelimiterTag, defer_size ) # tags with undefined length are skipped after read if has_tag_set and tag not in tag_set: continue yield RawDataElement( BaseTag(tag), vr, length, value, value_tell, is_implicit_VR, is_little_endian, ) def _is_implicit_vr( fp: BinaryIO, implicit_vr_is_assumed: bool, is_little_endian: bool, stop_when: Callable[[BaseTag, str | None, int], bool] | None, is_sequence: bool, ) -> bool: """Check if the real VR is explicit or implicit. Parameters ---------- fp : an opened file object implicit_vr_is_assumed : bool True if implicit VR is assumed. If this does not match with the real transfer syntax, a user warning will be issued. is_little_endian : bool True if file has little endian transfer syntax. Needed to interpret the first tag. stop_when : None, optional Optional call_back function which can terminate reading. Needed to check if the next tag still belongs to the read dataset. is_sequence : bool True if called for a sequence, False for a top-level dataset. Returns ------- True if implicit VR is used, False otherwise. """ # sequences do not switch from implicit to explicit encoding, # but they are allowed to use implicit encoding if the dataset # is encoded as explicit VR if is_sequence and implicit_vr_is_assumed: return True tag_bytes = fp.read(4) raw_vr = fp.read(2) if len(raw_vr) < 2: return implicit_vr_is_assumed # it is sufficient to check if the VR is in valid ASCII range, as it is # extremely unlikely that the tag length accidentally has such a # representation - this would need the first tag to be longer than 16kB # (e.g. it should be > 0x4141 = 16705 bytes) found_implicit = not (0x40 < raw_vr[0] < 0x5B and 0x40 < raw_vr[1] < 0x5B) if found_implicit != implicit_vr_is_assumed: # first check if the tag still belongs to the dataset if stop_when # is given - if not, the dataset is empty and we just return endian_chr = "<" if is_little_endian else ">" tag = _unpack_tag(tag_bytes, endian_chr) vr = raw_vr.decode(default_encoding) if stop_when is not None and stop_when(tag, vr, 0): return found_implicit # sequences with undefined length can be encoded in implicit VR, # see PS 3.5, section 6.2.2 if found_implicit and is_sequence: return True # got to the real problem - warn or raise depending on config found_vr = "implicit" if found_implicit else "explicit" expected_vr = "implicit" if not found_implicit else "explicit" msg = f"Expected {expected_vr} VR, but found {found_vr} VR" if config.settings.reading_validation_mode == config.RAISE: raise InvalidDicomError(msg) warn_and_log(f"{msg} - using {found_vr} VR for reading", UserWarning) return found_implicit def read_dataset( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, bytelength: int | None = None, stop_when: Callable[[BaseTag, str | None, int], bool] | None = None, defer_size: str | int | float | None = None, parent_encoding: str | MutableSequence[str] = default_encoding, specific_tags: list[BaseTag | int] | None = None, at_top_level: bool = True, ) -> Dataset: """Return a :class:`~pydicom.dataset.Dataset` instance containing the next dataset in the file. Parameters ---------- fp : file-like An opened file-like object. is_implicit_VR : bool ``True`` if file transfer syntax is implicit VR. is_little_endian : bool ``True`` if file has little endian transfer syntax. bytelength : int, None, optional ``None`` to read until end of file or ItemDelimiterTag, else a fixed number of bytes to read stop_when : None, optional Optional call_back function which can terminate reading. See help for :func:`data_element_generator` for details defer_size : int, str or float, optional Size to avoid loading large elements in memory. See :func:`dcmread` for more parameter info. parent_encoding : str or List[str] Optional encoding to use as a default in case (0008,0005) *Specific Character Set* isn't specified. specific_tags : list of BaseTag, optional See :func:`dcmread` for parameter info. at_top_level: bool If dataset is top level (not within a sequence). Used to turn off explicit VR heuristic within sequences Returns ------- dataset.Dataset A Dataset instance. See Also -------- :class:`~pydicom.dataset.Dataset` A collection (dictionary) of DICOM :class:`~pydicom.dataelem.DataElement` instances. """ raw_data_elements: dict[BaseTag, RawDataElement | DataElement] = {} fp_tell = fp.tell fp_start = fp.tell() is_implicit_VR = _is_implicit_vr( fp, is_implicit_VR, is_little_endian, stop_when, is_sequence=not at_top_level ) fp.seek(fp_start) de_gen = data_element_generator( fp, is_implicit_VR, is_little_endian, stop_when, defer_size, parent_encoding, specific_tags, ) try: if bytelength is None: raw_data_elements = {e.tag: e for e in de_gen} else: while fp_tell() - fp_start < bytelength: raw_data_element = next(de_gen) raw_data_elements[raw_data_element.tag] = raw_data_element except StopIteration: pass except EOFError as details: if config.settings.reading_validation_mode == config.RAISE: raise msg = str(details) + " in file " + getattr(fp, "name", "") warn_and_log(msg, UserWarning) except NotImplementedError as details: logger.error(details) ds = Dataset(raw_data_elements, parent_encoding=parent_encoding) encoding: str | MutableSequence[str] if 0x00080005 in raw_data_elements: elem = cast(RawDataElement, raw_data_elements[BaseTag(0x00080005)]) char_set = cast( str | MutableSequence[str] | None, convert_raw_data_element(elem).value ) encoding = convert_encodings(char_set) # -> List[str] else: encoding = parent_encoding # -> str | MutableSequence[str] ds.set_original_encoding(is_implicit_VR, is_little_endian, encoding) return ds def read_sequence( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, bytelength: int, encoding: str | MutableSequence[str], offset: int = 0, ) -> Sequence: """Read and return a :class:`~pydicom.sequence.Sequence` -- i.e. a :class:`list` of :class:`Datasets`. """ seq = [] # use builtin list to start for speed, convert to Sequence at end is_undefined_length = False if bytelength != 0: # SQ of length 0 possible (PS 3.5-2008 7.5.1a (p.40) if bytelength == 0xFFFFFFFF: is_undefined_length = True bytelength = 0 fp_tell = fp.tell # for speed in loop fpStart = fp_tell() while (not bytelength) or (fp_tell() - fpStart < bytelength): file_tell = fp_tell() dataset = read_sequence_item( fp, is_implicit_VR, is_little_endian, encoding, offset ) if dataset is None: # None is returned if hit Sequence Delimiter break dataset.file_tell = file_tell + offset seq.append(dataset) sequence = Sequence(seq) sequence.is_undefined_length = is_undefined_length return sequence def read_sequence_item( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, encoding: str | MutableSequence[str], offset: int = 0, ) -> Dataset | None: """Read and return a single :class:`~pydicom.sequence.Sequence` item, i.e. a :class:`~pydicom.dataset.Dataset`. """ seq_item_tell = fp.tell() + offset tag_length_format = "HHL" try: bytes_read = fp.read(8) group, element, length = unpack(tag_length_format, bytes_read) except BaseException: raise OSError(f"No tag to read at file position {fp.tell() + offset:X}") tag = (group, element) if tag == SequenceDelimiterTag: # No more items, time to stop reading if config.debugging: logger.debug(f"{fp.tell() - 8 + offset:08x}: End of Sequence") if length != 0: logger.warning( f"Expected 0x00000000 after delimiter, found 0x{length:X}, " f"at position 0x{fp.tell() - 4 + offset:X}" ) return None if config.debugging: if tag != ItemTag: # Flag the incorrect item encoding, will usually raise an # exception afterwards due to the misaligned format logger.warning( f"Expected sequence item with tag {ItemTag} at file position " f"0x{fp.tell() - 4 + offset:X}" ) else: logger.debug( f"{fp.tell() - 4 + offset:08x}: {bytes2hex(bytes_read)} " "Found Item tag (start of item)" ) if length == 0xFFFFFFFF: ds = read_dataset( fp, is_implicit_VR, is_little_endian, bytelength=None, parent_encoding=encoding, at_top_level=False, ) ds.is_undefined_length_sequence_item = True else: ds = read_dataset( fp, is_implicit_VR, is_little_endian, length, parent_encoding=encoding, at_top_level=False, ) ds.is_undefined_length_sequence_item = False if config.debugging: logger.debug(f"{fp.tell() + offset:08X}: Finished sequence item") ds.seq_item_tell = seq_item_tell return ds def _read_command_set_elements(fp: BinaryIO) -> Dataset: """Return a Dataset containing any Command Set (0000,eeee) elements in `fp`. Command Set elements are always Implicit VR Little Endian (DICOM Standard, Part 7, :dcm:`Section 6.3`). Once any Command Set elements are read `fp` will be positioned at the start of the next group of elements. Parameters ---------- fp : file-like The file-like positioned at the start of any command set elements. Returns ------- dataset.Dataset The command set elements as a Dataset instance. May be empty if no command set elements are present. """ def _not_group_0000(tag: BaseTag, vr: str | None, length: int) -> bool: """Return True if the tag is not in group 0x0000, False otherwise.""" return tag >> 16 != 0 return read_dataset( fp, is_implicit_VR=True, is_little_endian=True, stop_when=_not_group_0000 ) def _read_file_meta_info(fp: BinaryIO) -> FileMetaDataset: """Return a Dataset containing any File Meta (0002,eeee) elements in `fp`. File Meta elements are always Explicit VR Little Endian (DICOM Standard, Part 10, :dcm:`Section 7`). Once any File Meta elements are read `fp` will be positioned at the start of the next group of elements. Parameters ---------- fp : file-like The file-like positioned at the start of any File Meta Information group elements. Returns ------- dataset.Dataset The File Meta elements as a Dataset instance. May be empty if no File Meta are present. """ def _not_group_0002(tag: BaseTag, vr: str | None, length: int) -> bool: """Return True if the tag is not in group 0x0002, False otherwise.""" return tag >> 16 != 2 start_file_meta = fp.tell() file_meta = FileMetaDataset( read_dataset( fp, is_implicit_VR=False, is_little_endian=True, stop_when=_not_group_0002 ) ) file_meta.set_original_encoding( is_implicit_vr=False, is_little_endian=True, character_encoding=default_encoding ) if not file_meta._dict: return file_meta # Test the file meta for correct interpretation by requesting the first # data element: if it fails, retry loading the file meta with an # implicit VR (issue #503) try: file_meta[list(file_meta.elements())[0].tag] except NotImplementedError: fp.seek(start_file_meta) file_meta = FileMetaDataset( read_dataset( fp, is_implicit_VR=True, is_little_endian=True, stop_when=_not_group_0002, ) ) file_meta.set_original_encoding( is_implicit_vr=True, is_little_endian=True, character_encoding=default_encoding, ) # Log if the Group Length doesn't match actual length if "FileMetaInformationGroupLength" in file_meta: # FileMetaInformationGroupLength must be 12 bytes long and its value # counts from the beginning of the next element to the end of the # file meta elements actual_len = fp.tell() - (start_file_meta + 12) elem_len = file_meta.FileMetaInformationGroupLength if elem_len != actual_len: logger.info( "_read_file_meta_info: (0002,0000) 'File Meta Information " "Group Length' value doesn't match the actual File Meta " f"Information length ({elem_len} vs {actual_len} bytes)" ) return file_meta def read_file_meta_info(filename: PathType) -> FileMetaDataset: """Read and return the DICOM file meta information only. This function is meant to be used in user code, for quickly going through a series of files to find one which is referenced to a particular SOP, without having to read the entire files. """ with open(filename, "rb") as fp: read_preamble(fp, False) # if no header, raise exception return _read_file_meta_info(fp) def read_preamble(fp: BinaryIO, force: bool) -> bytes | None: """Return the 128-byte DICOM preamble in `fp` if present. `fp` should be positioned at the start of the file-like. If the preamble and prefix are found then after reading `fp` will be positioned at the first byte after the prefix (byte offset 133). If either the preamble or prefix are missing and `force` is ``True`` then after reading `fp` will be positioned at the start of the file-like. Parameters ---------- fp : file-like object The file-like to read the preamble from. force : bool Flag to force reading of a file even if no header is found. Returns ------- preamble : bytes or None The 128-byte DICOM preamble will be returned if the appropriate prefix ('DICM') is found at byte offset 128. Returns ``None`` if the 'DICM' prefix is not found and `force` is ``True``. Raises ------ InvalidDicomError If `force` is ``False`` and no appropriate header information found. Notes ----- Also reads past the 'DICM' marker. Rewinds file to the beginning if no header found. """ logger.debug("Reading File Meta Information preamble...") preamble = fp.read(128) if config.debugging: sample = bytes2hex(preamble[:8]) + "..." + bytes2hex(preamble[-8:]) logger.debug(f"{fp.tell() - 128:08x}: {sample}") logger.debug("Reading File Meta Information prefix...") magic = fp.read(4) if magic != b"DICM" and force: logger.info( "File is not conformant with the DICOM File Format: 'DICM' " "prefix is missing from the File Meta Information header " "or the header itself is missing. Assuming no header and " "continuing." ) fp.seek(0) return None if magic != b"DICM" and not force: raise InvalidDicomError( "File is missing DICOM File Meta Information header or the 'DICM' " "prefix is missing from the header. Use force=True to force " "reading." ) else: logger.debug(f"{fp.tell() - 4:08x}: 'DICM' prefix found") return preamble def _at_pixel_data(tag: BaseTag, vr: str | None, length: int) -> bool: return tag in {0x7FE00010, 0x7FE00009, 0x7FE00008} def read_partial( fileobj: BinaryIO, stop_when: Callable[[BaseTag, str | None, int], bool] | None = None, defer_size: int | str | float | None = None, force: bool = False, specific_tags: list[BaseTag | int] | None = None, ) -> FileDataset: """Parse a DICOM file until a condition is met. Parameters ---------- fileobj : a file-like object Note that the file will not close when the function returns. stop_when : Stop condition. See :func:`read_dataset` for more info. defer_size : int, str or float, optional See :func:`dcmread` for parameter info. force : bool See :func:`dcmread` for parameter info. specific_tags : list or None See :func:`dcmread` for parameter info. Notes ----- Use :func:`dcmread` unless you need to stop on some condition other than reaching pixel data. Returns ------- dataset.FileDataset The read dataset. See Also -------- dcmread More generic file reading function. """ # Read File Meta Information # Read preamble (if present) preamble = read_preamble(fileobj, force) # Read any File Meta Information group (0002,eeee) elements (if present) file_meta = _read_file_meta_info(fileobj) # Read Dataset # Read any Command Set group (0000,eeee) elements (if present) command_set = _read_command_set_elements(fileobj) # Check to see if there's anything left to read peek = fileobj.read(1) if peek != b"": fileobj.seek(-1, 1) # `filobj` should be positioned at the start of the dataset by this point. # Ensure we have appropriate values for `is_implicit_VR` and # `is_little_endian` before we try decoding. We assume an initial # transfer syntax of implicit VR little endian and correct it as necessary is_implicit_VR = True is_little_endian = True transfer_syntax = file_meta.get("TransferSyntaxUID") if peek == b"": # EOF pass elif transfer_syntax is None: # issue 258 # If no TransferSyntaxUID element then we have to try and figure out # the correct values for `is_little_endian` and `is_implicit_VR`. # Peek at the first 6 bytes to get the first element's tag group and # (possibly) VR group, _, vr = unpack("= 1024: is_little_endian = False elif transfer_syntax == pydicom.uid.ImplicitVRLittleEndian: pass elif transfer_syntax == pydicom.uid.ExplicitVRLittleEndian: is_implicit_VR = False elif transfer_syntax == pydicom.uid.ExplicitVRBigEndian: is_implicit_VR = False is_little_endian = False elif transfer_syntax == pydicom.uid.DeflatedExplicitVRLittleEndian: # See PS3.5 section A.5 # when written, the entire dataset following # the file metadata was prepared the normal way, # then "deflate" compression applied. # All that is needed here is to decompress and then # use as normal in a file-like object zipped = fileobj.read() name = getattr(fileobj, "name", None) # -MAX_WBITS part is from comp.lang.python answer: # groups.google.com/group/comp.lang.python/msg/e95b3b38a71e6799 unzipped = zlib.decompress(zipped, -zlib.MAX_WBITS) buffer = DicomBytesIO(unzipped) buffer.name = name fileobj = cast(BinaryIO, buffer) # a file-like object is_implicit_VR = False elif transfer_syntax in pydicom.uid.PrivateTransferSyntaxes: # Replace with the registered UID as it has the encoding information index = pydicom.uid.PrivateTransferSyntaxes.index(transfer_syntax) transfer_syntax = pydicom.uid.PrivateTransferSyntaxes[index] is_implicit_VR = transfer_syntax.is_implicit_VR is_little_endian = transfer_syntax.is_little_endian else: # Any other syntax should be Explicit VR Little Endian, # e.g. all Encapsulated (JPEG etc) are ExplVR-LE # by Standard PS 3.5-2008 A.4 (p63) is_implicit_VR = False # Try and decode the dataset # By this point we should be at the start of the dataset and have # the transfer syntax (whether read from the file meta or guessed at) try: dataset = read_dataset( fileobj, is_implicit_VR, is_little_endian, stop_when=stop_when, defer_size=defer_size, specific_tags=specific_tags, ) except EOFError: if config.settings.reading_validation_mode == config.RAISE: raise # warning already logged in read_dataset # Add the command set elements to the dataset (if any) if command_set: dataset.update(command_set) ds = FileDataset( fileobj, dataset, preamble, file_meta, is_implicit_VR, is_little_endian, ) # save the originally read transfer syntax properties in the dataset ds.set_original_encoding(is_implicit_VR, is_little_endian, dataset._character_set) return ds def dcmread( fp: PathType | BinaryIO | ReadableBuffer, defer_size: str | int | float | None = None, stop_before_pixels: bool = False, force: bool = False, specific_tags: TagListType | None = None, ) -> FileDataset: """Read and parse a DICOM dataset stored in the DICOM File Format. Read a DICOM dataset stored in accordance with the :dcm:`DICOM File Format `. If the dataset is not stored in accordance with the File Format (i.e. the preamble and prefix are missing, there are missing required Type 1 *File Meta Information Group* elements or the entire *File Meta Information* is missing) then you will have to set `force` to ``True``. Examples -------- Read and return a dataset stored in accordance with the DICOM File Format: >>> ds = pydicom.dcmread("CT_small.dcm") >>> ds.PatientName Read and return a dataset not in accordance with the DICOM File Format: >>> ds = pydicom.dcmread("rtplan.dcm", force=True) >>> ds.PatientName Use within a context manager: >>> with pydicom.dcmread("rtplan.dcm") as ds: ... ds.PatientName Parameters ---------- fp : str, PathLike, file-like or readable buffer A file-like object, a string containing the file name or the path to the file or a buffer-like object. The buffer-like object must have ``seek()``, ``read()`` and ``tell()`` methods and the caller is responsible for closing it (if required). defer_size : int, str or float, optional If not used then all elements are read into memory. If specified, then if a data element's stored value is larger than `defer_size`, the value is not read into memory until it is accessed in code. Should be the number of bytes to be read as :class:`int` or as a :class:`str` with units, e.g. ``'512 KB'``, ``'2 MB'``. stop_before_pixels : bool, optional If ``False`` (default), the full file will be read and parsed. Set ``True`` to stop before reading (7FE0,0010) *Pixel Data* (and all subsequent elements). force : bool, optional If ``False`` (default), raises an :class:`~pydicom.errors.InvalidDicomError` if the file is missing the *File Meta Information* header. Set to ``True`` to force reading even if no *File Meta Information* header is found. specific_tags : list of (int or str or 2-tuple of int), optional If used the only the supplied tags will be returned. The supplied elements can be tags or keywords. Note that the element (0008,0005) *Specific Character Set* is always returned if present - this ensures correct decoding of returned text values. Returns ------- FileDataset An instance of :class:`~pydicom.dataset.FileDataset` that represents a parsed DICOM file. Raises ------ InvalidDicomError If `force` is ``False`` and the file is not a valid DICOM file. TypeError If `fp` is ``None`` or of an unsupported type. See Also -------- pydicom.dataset.FileDataset Data class that is returned. pydicom.filereader.read_partial Only read part of a DICOM file, stopping on given conditions. """ # Open file if not already a file object caller_owns_file = True fp = path_from_pathlike(fp) if isinstance(fp, str): # caller provided a file name; we own the file handle caller_owns_file = False logger.debug(f"Reading file '{fp}'") fp = open(fp, "rb") elif ( fp is None or not hasattr(fp, "read") or not hasattr(fp, "seek") or not hasattr(fp, "tell") ): raise TypeError( "dcmread: Expected a file path, file-like or readable buffer, " f"but got {type(fp).__name__}" ) if config.debugging: logger.debug("\n" + "-" * 80) logger.debug("Call to dcmread()") logger.debug( f"filename: {getattr(fp, 'name', '')}, defer_size={defer_size}, " f"stop_before_pixels={stop_before_pixels}, force={force}, " f"specific_tags={specific_tags}" ) if caller_owns_file: logger.debug("Caller passed file object") else: logger.debug("Caller passed file name") logger.debug("-" * 80) if specific_tags: specific_tags = [Tag(t) for t in specific_tags] specific_tags = cast(list[BaseTag | int] | None, specific_tags) # Iterate through all items and store them --include file meta if present stop_when = None if stop_before_pixels: stop_when = _at_pixel_data try: dataset = read_partial( fp, stop_when, defer_size=size_in_bytes(defer_size), force=force, specific_tags=specific_tags, ) finally: if not caller_owns_file: fp.close() # XXX need to store transfer syntax etc. return dataset def data_element_offset_to_value(is_implicit_VR: bool, VR: str | None) -> int: """Return number of bytes from start of data element to start of value""" if is_implicit_VR: return 8 # tag of 4 plus 4-byte length if cast(str, VR) in EXPLICIT_VR_LENGTH_32: return 12 # tag 4 + 2 VR + 2 reserved + 4 length return 8 # tag 4 + 2 VR + 2 length def read_deferred_data_element( fileobj_type: Any, filename_or_obj: PathType | BinaryIO, timestamp: float | None, raw_data_elem: RawDataElement, ) -> RawDataElement: """Read the previously deferred value from the file into memory and return a raw data element. .. note: This is called internally by pydicom and will normally not be needed in user code. Parameters ---------- fileobj_type : type The type of the original file object. filename_or_obj : str or file-like The filename of the original file if one exists, or the file-like object where the data element persists. timestamp : float or None The time (as given by stat.st_mtime) the original file has been read, if not a file-like. raw_data_elem : dataelem.RawDataElement The raw data element with no value set. Returns ------- dataelem.RawDataElement The data element with the value set. Raises ------ OSError If `filename_or_obj` is ``None``. OSError If `filename_or_obj` is a filename and the corresponding file does not exist. ValueError If the VR or tag of `raw_data_elem` does not match the read value. """ if config.debugging: logger.debug(f"Reading deferred element {raw_data_elem.tag}") # If it wasn't read from a file, then return an error if filename_or_obj is None: raise OSError("Deferred read -- original filename not stored. Cannot re-open") # Check that the file is the same as when originally read is_filename = isinstance(filename_or_obj, str) if isinstance(filename_or_obj, str): if not os.path.exists(filename_or_obj): raise OSError( f"Deferred read -- original file {filename_or_obj} is missing" ) if timestamp is not None: statinfo = os.stat(filename_or_obj) if statinfo.st_mtime != timestamp: warn_and_log( "Deferred read warning -- file modification time has changed" ) # Open the file, position to the right place fp = fileobj_type(filename_or_obj, "rb") if is_filename else filename_or_obj is_implicit_VR = raw_data_elem.is_implicit_VR is_little_endian = raw_data_elem.is_little_endian offset = data_element_offset_to_value(is_implicit_VR, raw_data_elem.VR) # Seek back to the start of the deferred element fp.seek(raw_data_elem.value_tell - offset) elem_gen = data_element_generator( fp, is_implicit_VR, is_little_endian, defer_size=None ) # Read the data element and check matches what was stored before # The first element out of the iterator should be the same type as the # the deferred element == RawDataElement elem = cast(RawDataElement, next(elem_gen)) if is_filename: fp.close() if elem.VR != raw_data_elem.VR: raise ValueError( f"Deferred read VR {elem.VR} does not match original {raw_data_elem.VR}" ) if elem.tag != raw_data_elem.tag: raise ValueError( f"Deferred read tag {elem.tag!r} does not match " f"original {raw_data_elem.tag!r}" ) # Everything is ok, now this object should act like usual DataElement return elem pydicom-pydicom-20aa4b7/src/pydicom/fileset.py000066400000000000000000003124011515706620200214670ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """DICOM File-set handling.""" from collections.abc import Iterator, Iterable, Callable import copy import os from pathlib import Path import re import shutil from tempfile import TemporaryDirectory from typing import Optional, Union, Any, cast import uuid from pydicom.charset import default_encoding from pydicom.datadict import tag_for_keyword, dictionary_description from pydicom.dataelem import DataElement from pydicom.dataset import Dataset, FileMetaDataset, FileDataset from pydicom.filebase import DicomBytesIO, DicomFileLike from pydicom.filereader import dcmread from pydicom.filewriter import write_dataset, write_data_element, write_file_meta_info from pydicom.misc import warn_and_log from pydicom.tag import Tag, BaseTag import pydicom.uid as sop from pydicom.uid import ( generate_uid, UID, ExplicitVRLittleEndian, ImplicitVRLittleEndian, MediaStorageDirectoryStorage, ) # Regex for conformant File ID paths - PS3.10 Section 8.5 _RE_FILE_ID = re.compile("^[A-Z0-9_]*$") # Prefixes to use when generating File ID components _PREFIXES = { "PATIENT": "PT", "STUDY": "ST", "SERIES": "SE", "IMAGE": "IM", "RT DOSE": "RD", "RT STRUCTURE SET": "RS", "RT PLAN": "RP", "RT TREAT RECORD": "RX", "PRESENTATION": "PR", "WAVEFORM": "WV", "SR DOCUMENT": "SR", "KEY OBJECT DOC": "KY", "SPECTROSCOPY": "SP", "RAW DATA": "RW", "REGISTRATION": "RG", "FIDUCIAL": "FD", "HANGING PROTOCOL": "HG", "ENCAP DOC": "ED", "VALUE MAP": "VM", "STEREOMETRIC": "SX", "PALETTE": "PA", "IMPLANT": "IP", "IMPLANT ASSY": "IA", "IMPLANT GROUP": "IG", "PLAN": "PL", "MEASUREMENT": "MX", "SURFACE": "SF", "SURFACE SCAN": "SS", "TRACT": "TR", "ASSESSMENT": "AS", "RADIOTHERAPY": "RT", "PRIVATE": "P", } _FIRST_OFFSET = "OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity" _NEXT_OFFSET = "OffsetOfTheNextDirectoryRecord" _LOWER_OFFSET = "OffsetOfReferencedLowerLevelDirectoryEntity" _LAST_OFFSET = "OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity" def generate_filename( prefix: str = "", start: int = 0, alphanumeric: bool = False ) -> Iterator[str]: """Yield File IDs for a File-set. Maximum number of File IDs is: * Numeric: (10 ** (8 - `prefix`)) - `start` * Alphanumeric: (35 ** (8 - `prefix`)) - `start` .. versionchanged:: 3.0 The characters used when `alphanumeric` is ``True`` have been reduced to [0-9][A-I,K-Z] Parameters ---------- prefix : str, optional The prefix to use for all filenames, default (``""``). start : int, optional The starting index to use for the suffixes, (default ``0``). i.e. if you want to start at ``'00010'`` then `start` should be ``10``. alphanumeric : bool, optional If ``False`` (default) then only generate suffixes using the characters [0-9], otherwise use [0-9][A-I,K-Z]. Yields ------ str A unique filename with 8 characters, with each incremented by 1 from the previous one (i.e. ``'00000000'``, ``'00000001'``, ``'00000002'``, and so on). """ if len(prefix) > 7: raise ValueError("The 'prefix' must be less than 8 characters long") chars = "0123456789ABCDEFGHIKLMNOPQRSTUVWXYZ" if not alphanumeric: chars = chars[:10] idx = start b = len(chars) length = 8 - len(prefix) while idx < b**length: n = idx suffix = "" while n: suffix += chars[n % b] n //= b yield f"{prefix}{suffix[::-1]:>0{length}}" idx += 1 def is_conformant_file_id(path: Path) -> bool: """Return ``True`` if `path` is a conformant File ID. **Conformance** * :dcm:`No more than 8 components` (parts) in the path * :dcm:`No more than 8 characters per component` * :dcm:`Characters in a component must be ASCII` * :dcm:`Valid characters in a component are 0-9, A-Z and _ ` Parameters ---------- path : pathlib.Path The path to check, relative to the File-set root directory. Returns ------- bool ``True`` if `path` is conformant, ``False`` otherwise. """ # No more than 8 characters per component parts = path.parts if any([len(pp) > 8 for pp in parts]): return False # No more than 8 components if len(parts) > 8: return False # Characters in the path are ASCII chars = "".join(parts) try: chars.encode(encoding="ascii", errors="strict") except UnicodeEncodeError: return False # Characters are in [0-9][A-Z] and _ if re.match(_RE_FILE_ID, chars): return True return False class RecordNode(Iterable["RecordNode"]): """Representation of a DICOMDIR's directory record. Attributes ---------- children : list of RecordNode The current node's child nodes (if any) instance : FileInstance or None If the current node is a leaf node, a :class:`~pydicom.fileset.FileInstance` for the corresponding SOP Instance. """ def __init__(self, record: Dataset | None = None) -> None: """Create a new ``RecordNode``. Parameters ---------- record : pydicom.dataset.Dataset, optional A *Directory Record Sequence's* directory record. """ self.children: list[RecordNode] = [] self.instance: FileInstance | None = None self._parent: RecordNode | None = None self._record: Dataset if record: self._set_record(record) # When the record is encoded as part of the *Directory Record Sequence* # this is the offset to the start of the sequence item containing # the record - not guaranteed to be up-to-date self._offset = 0 # The offset to the start of the encoded record's *Offset of the # Next Directory Record* and *Offset of Referenced Lower Level # Directory Entity* values - use _encode_record() to set them self._offset_next = 0 self._offset_lower = 0 def add(self, leaf: "RecordNode") -> None: """Add a leaf to the tree. Parameters ---------- leaf : pydicom.fileset.RecordNode A leaf node (i.e. one with a :class:`~pydicom.fileset.FileInstance`) to be added to the tree (if not already present). """ # Move up to the branch's furthest ancestor with a directory record node = leaf.root if node is self: node = node.children[0] # Move back down, inserting at the point where the node is unique current = self.root while node in current and node.children: current = current[node] node = node.children[0] node.parent = current @property def ancestors(self) -> list["RecordNode"]: """Return a list of the current node's ancestors, ordered from nearest to furthest. """ return [nn for nn in self.reverse() if nn is not self] @property def component(self) -> str: """Return a File ID component as :class:`str` for the current node.""" if self.is_root: raise ValueError("The root node doesn't contribute a File ID component") prefix = _PREFIXES[self.record_type] if self.record_type == "PRIVATE": prefix = f"{prefix}{self.depth}" chars = "0123456789ABCDEFGHIKLMNOPQRSTUVWXYZ" if not self.file_set._use_alphanumeric: chars = chars[:10] suffix = "" n = self.index b = len(chars) while n: suffix += chars[n % b] n //= b idx = f"{suffix[::-1]:>0{8 - len(prefix)}}" return f"{prefix}{idx}" def __contains__(self, key: Union[str, "RecordNode"]) -> bool: """Return ``True`` if the current node has a child matching `key`.""" if isinstance(key, RecordNode): key = key.key return key in [child.key for child in self.children] def __delitem__(self, key: Union[str, "RecordNode"]) -> None: """Remove one of the current node's children and if the current node becomes childless recurse upwards and delete it from its parent. """ if isinstance(key, RecordNode): key = key.key if key not in self: raise KeyError(key) self.children = [ii for ii in self.children if ii.key != key] # Recurse upwards to the root, removing any empty nodes if not self.children and not self.is_root: del self.parent[self] @property def depth(self) -> int: "Return the number of nodes to the level below the tree root" return len(list(self.reverse())) - 1 def _encode_record(self, force_implicit: bool = False) -> int: """Encode the node's directory record. * Encodes the record as explicit VR little endian * Sets the ``RecordNode._offset_next`` and ``RecordNode._offset_lower`` attributes to the position of the start of the values of the *Offset of the Next Directory Record* and *Offset of Referenced Lower Level Directory Entity* elements. Note that the offsets are relative to the start of the current directory record. The values for the *Offset Of The Next Directory Record* and *Offset of Referenced Lower Level Directory Entity* elements are not guaranteed to be correct. Parameters ---------- force_implicit : bool, optional ``True`` to force using implicit VR encoding, which is non-conformant. Default ``False``. Returns ------- int The length of the encoded directory record. See Also -------- :meth:`~pydicom.fileset.RecordNode._update_record_offsets` """ fp = DicomBytesIO() fp.is_little_endian = True fp.is_implicit_VR = force_implicit encoding = self._record.get("SpecificCharacterSet", default_encoding) for tag in sorted(self._record.keys()): if tag.element == 0 and tag.group > 6: continue # (0004,1400) Offset Of The Next Directory Record # (0004,1420) Offset Of Referenced Lower Level Directory Entity # Offset from start of tag to start of value for VR UL is always 8 # however the absolute position may change with transfer syntax if tag == 0x00041400: self._offset_next = fp.tell() + 8 elif tag == 0x00041420: self._offset_lower = fp.tell() + 8 write_data_element(fp, self._record[tag], encoding) return len(fp.getvalue()) def file_id_path(self, root_path: Path) -> Path | None: """Return the *Referenced File ID* as a :class:`~pathlib.Path`. Params ------ root_path : Path The root path of the parent file set. Returns ------- pathlib.Path or None The *Referenced File ID* from the directory record as a :class:`pathlib.Path` or ``None`` if the element value is null. Raises ------ PermissionError If the file ID points to a path outside the fileset root path. AttributeError If the Referenced File ID is missing in the directory record. :meta private: """ if "ReferencedFileID" in self._record: elem = self._record["ReferencedFileID"] if elem.VM < 1: return None if elem.VM == 1: path = Path(cast(str, self._record.ReferencedFileID)) else: path = Path(*cast(list[str], self._record.ReferencedFileID)) if path is not None: if path.anchor or not ( (root_path / path).resolve().is_relative_to(root_path) ): raise PermissionError( f"ReferencedFileID ('{path}') must be inside the DICOMDIR root path" ) return path raise AttributeError("No 'Referenced File ID' in the directory record") @property def file_set(self) -> "FileSet": """Return the tree's :class:`~pydicom.fileset.FileSet`.""" return self.root.file_set def __getitem__(self, key: Union[str, "RecordNode"]) -> "RecordNode": """Return the current node's child using its :attr:`~pydicom.fileset.RecordNode.key` """ if isinstance(key, RecordNode): key = key.key for child in self.children: if key == child.key: return child raise KeyError(key) @property def has_instance(self) -> bool: """Return ``True`` if the current node corresponds to an instance.""" return self.instance is not None @property def index(self) -> int: """Return the index of the current node amongst its siblings.""" if not self.parent: return 0 return self.parent.children.index(self) @property def is_root(self) -> bool: """Return ``True`` if the current node is the tree's root node.""" return False def __iter__(self) -> Iterator["RecordNode"]: """Yield this node (unless it's the root node) and all nodes below it.""" if not self.is_root: yield self for child in self.children: yield from child @property def key(self) -> str: """Return a unique key for the node's record as :class:`str`.""" rtype = self.record_type if rtype == "PATIENT": # PS3.3, Annex F.5.1: Each Patient ID is unique within a File-set return cast(str, self._record.PatientID) if rtype == "STUDY": # PS3.3, Annex F.5.2: Type 1C if "StudyInstanceUID" in self._record: return cast(UID, self._record.StudyInstanceUID) else: return cast(UID, self._record.ReferencedSOPInstanceUIDInFile) if rtype == "SERIES": return cast(UID, self._record.SeriesInstanceUID) if rtype == "PRIVATE": return cast(UID, self._record.PrivateRecordUID) # PS3.3, Table F.3-3: Required if record references an instance try: return cast(UID, self._record.ReferencedSOPInstanceUIDInFile) except AttributeError as exc: raise AttributeError( f"Invalid '{rtype}' record - missing required element " "'Referenced SOP Instance UID in File'" ) from exc @property def next(self) -> Optional["RecordNode"]: """Return the node after the current one (if any), or ``None``.""" if not self.parent: return None try: return self.parent.children[self.index + 1] except IndexError: return None @property def parent(self) -> "RecordNode": """Return the current node's parent (if it has one).""" return cast("RecordNode", self._parent) @parent.setter def parent(self, node: "RecordNode") -> None: """Set the parent of the current node.""" self._parent = node if node is not None and self not in node.children: node.children.append(self) def prettify(self, indent_char: str = " ") -> list[str]: """Return the tree structure as a list of pretty strings, starting at the current node (unless the current node is the root node). Parameters ---------- indent_char : str, optional The characters to use to indent each level of the tree. """ def leaf_summary(node: "RecordNode", indent_char: str) -> list[str]: """Summarize the leaves at the current level.""" # Examples: # IMAGE: 15 SOP Instances (10 initial, 9 additions, 4 removals) # RTDOSE: 1 SOP Instance out = [] if not node.children: indent = indent_char * node.depth sibs = [ii for ii in node.parent if ii.has_instance] # Split into record types rtypes = {ii.record_type for ii in sibs} for record_type in sorted(rtypes): # nr = initial + additions nr = [ii for ii in sibs if ii.record_type == record_type] # All leaves should have a corresponding FileInstance add = len( [ ii for ii in nr if cast(FileInstance, ii.instance).for_addition ] ) rm = len( [ii for ii in nr if cast(FileInstance, ii.instance).for_removal] ) initial = len(nr) - add result = len(nr) - rm changes = [] if (add or rm) and initial > 0: changes.append(f"{initial} initial") if add: plural = "s" if add > 1 else "" changes.append(f"{add} addition{plural}") if rm: plural = "s" if rm > 1 else "" changes.append(f"{rm} removal{plural}") summary = ( f"{indent}{record_type}: {result} " f"SOP Instance{'' if result == 1 else 's'}" ) if changes: summary += f" ({', '.join(changes)})" out.append(summary) return out s = [] for node in self: indent = indent_char * node.depth if node.children: s.append(f"{indent}{node}") # Summarize any leaves at the next level for child in node.children: if child.has_instance: s.extend(leaf_summary(child, indent_char)) break elif node.depth == 0 and node.has_instance: node.instance = cast(FileInstance, node.instance) # Single-level records line = f"{indent}{node.record_type}: 1 SOP Instance" if node.instance.for_addition: line += " (to be added)" elif node.instance.for_removal: line += " (to be removed)" s.append(line) return s @property def previous(self) -> Optional["RecordNode"]: """Return the node before the current one (if any), or ``None``.""" if not self.parent: return None if self.index == 0: return None return self.parent.children[self.index - 1] def _set_record(self, ds: Dataset) -> None: """Set the node's initial directory record dataset. The record is used as a starting point when filling the DICOMDIR's *Directory Record Sequence* and is modified as required during encoding. Parameters ---------- ds : pydicom.dataset.Dataset Set the node's initial directory record dataset, must be conformant to :dcm:`Part 3, Annex F of the DICOM Standard `. """ offset = getattr(ds, "seq_item_tell", None) rtype = ds.get("DirectoryRecordType", None) rtype = f"{rtype} " if rtype else "" msg = f"The {rtype}directory record is missing" if offset: msg = f"The {rtype}directory record at offset {offset} is missing" keywords = ["DirectoryRecordType"] missing = [kw for kw in keywords if kw not in ds] if missing: msg = f"{msg} one or more required elements: {', '.join(missing)}" raise ValueError(msg) if _NEXT_OFFSET not in ds: setattr(ds, _NEXT_OFFSET, 0) if _LOWER_OFFSET not in ds: setattr(ds, _LOWER_OFFSET, 0) ds.RecordInUseFlag = 0xFFFF self._record = ds try: self.key except (AttributeError, ValueError) as exc: raise ValueError(f"{msg} a required element") from exc @property def record_type(self) -> str: """Return the record's *Directory Record Type* as :class:`str`.""" return cast(str, self._record.DirectoryRecordType) def remove(self, node: "RecordNode") -> None: """Remove a leaf from the tree Parameters ---------- node : pydicom.fileset.RecordNode The leaf node (i.e. one with a :class:`~pydicom.fileset.FileInstance`) to remove. """ if not node.has_instance: raise ValueError("Only leaf nodes can be removed") del node.parent[node] def reverse(self) -> Iterable["RecordNode"]: """Yield nodes up to the level below the tree's root node.""" node = self while node.parent: yield node node = node.parent if not node.is_root: yield node @property def root(self) -> "RecordNode": """Return the tree's root node.""" if self.parent: return self.parent.root return self def __str__(self) -> str: """Return a string representation of the node.""" if self.is_root: return "ROOT" ds = self._record record_type = f"{self.record_type}" s = [] if self.record_type == "PATIENT": s += [f"PatientID='{ds.PatientID}'", f"PatientName='{ds.PatientName}'"] elif self.record_type == "STUDY": s += [f"StudyDate={ds.StudyDate}", f"StudyTime={ds.StudyTime}"] if getattr(ds, "StudyDescription", None): s.append(f"StudyDescription='{ds.StudyDescription}'") elif self.record_type == "SERIES": s += [f"Modality={ds.Modality}", f"SeriesNumber={ds.SeriesNumber}"] if getattr(ds, "SeriesDescription", None): s.append(f"SeriesDescription='{ds.SeriesDescription}'") elif self.record_type == "IMAGE": s.append(f"InstanceNumber={ds.InstanceNumber}") else: s.append(f"{self.key}") return f"{record_type}: {', '.join(s)}" def _update_record_offsets(self) -> None: """Update the record's offset elements. Updates the values for *Offset of the Next Directory Record* and *Offset of Referenced Lower Level Directory Entity*, provided all of the nodes have had their *_offset* attribute set correctly. """ next_elem = self._record[_NEXT_OFFSET] next_elem.value = 0 if self.next: next_elem.value = self.next._offset lower_elem = self._record[_LOWER_OFFSET] lower_elem.value = 0 if self.children: self._record[_LOWER_OFFSET].value = self.children[0]._offset class RootNode(RecordNode): """The root node for the File-set's record tree.""" def __init__(self, fs: "FileSet") -> None: """Create a new root node. Parameters ---------- fs : pydicom.fileset.FileSet The File-set the record tree belongs to. """ super().__init__() self._fs = fs @property def file_set(self) -> "FileSet": """Return the tree's :class:`~pydicom.fileset.FileSet`.""" return self._fs @property def is_root(self) -> bool: """Return ``True`` if the current node is the tree's root node.""" return True class FileInstance: """Representation of a File in the File-set. Attributes ---------- node : pydicom.fileset.RecordNode The leaf record that references this instance. """ def __init__(self, node: RecordNode) -> None: """Create a new FileInstance. Parameters ---------- node : pydicom.fileset.RecordNode The record that references this instance. """ class Flags: add: bool remove: bool self._uuid = uuid.uuid4() self._flags = Flags() self._apply_stage("x") self._stage_path: Path | None = None self.node = node def _apply_stage(self, flag: str) -> None: """Apply staging to the instance. Parameters ---------- flag : str The staging to apply, one of ``'+'``, ``'-'`` or ``'x'``. This will flag the instance for addition to or removal from the File-set, or to reset the staging, respectively. """ # Clear flags if flag == "x": self._flags.add = False self._flags.remove = False self._stage_path = None elif flag == "+": # remove + add = no change if self._flags.remove: self._flags.remove = False self._stage_path = None else: self._flags.add = True self._stage_path = self.file_set._stage["path"] / f"{self._uuid}" elif flag == "-": # add + remove = no change if self._flags.add: self._flags.add = False self._stage_path = None else: self._flags.remove = True self._stage_path = None def __contains__(self, name: str | int) -> bool: """Return ``True`` if the element with keyword or tag `name` is in one of the corresponding directory records. Parameters ---------- name : str or int The element keyword or tag to search for. Returns ------- bool ``True`` if the corresponding element is present, ``False`` otherwise. """ try: self[name] except KeyError: return False return True @property def FileID(self) -> str: """Return the File ID of the referenced instance.""" root = self.node.root components = [ii.component for ii in self.node.reverse() if ii is not root] return os.fspath(Path(*components[::-1])) @property def file_set(self) -> "FileSet": """Return the :class:`~pydicom.fileset.FileSet` this instance belongs to. """ return self.node.file_set @property def for_addition(self) -> bool: """Return ``True`` if the instance has been staged for addition to the File-set. """ return self._flags.add @property def for_moving(self) -> bool: """Return ``True`` if the instance will be moved to a new location within the File-set. """ if self.for_addition: return False if self["ReferencedFileID"].VM == 1: file_id = self.FileID.split(os.path.sep) return [self.ReferencedFileID] != file_id return cast(bool, self.ReferencedFileID != self.FileID.split(os.path.sep)) @property def for_removal(self) -> bool: """Return ``True`` if the instance has been staged for removal from the File-set. """ return self._flags.remove def __getattribute__(self, name: str) -> Any: """Return the class attribute value for `name`. Parameters ---------- name : str An element keyword or a class attribute name. Returns ------- object If `name` matches a DICOM keyword and the element is present in one of the directory records then returns the corresponding element's value. Otherwise returns the class attribute's value (if present). Directory records are searched from the lowest (i.e. an IMAGE or similar record type) to the highest (PATIENT or similar). """ tag = tag_for_keyword(name) if tag is not None: tag = Tag(tag) for node in self.node.reverse(): if tag in node._record: return node._record[tag].value return super().__getattribute__(name) def __getitem__(self, key: str | int) -> DataElement: """Return the DataElement with keyword or tag `key`. Parameters ---------- key : str or int An element keyword or tag. Returns ------- pydicom.dataelem.DataElement The DataElement corresponding to `key`, if present in one of the directory records. Directory records are searched from the lowest (i.e. an IMAGE or similar record type) to the highest (PATIENT or similar). """ if isinstance(key, BaseTag): tag = key else: tag = Tag(key) if tag == 0x00080018: # SOP Instance UID tag = Tag(0x00041511) elif tag == 0x00080016: # SOP Class UID tag = Tag(0x00041510) elif tag == 0x00020010: # Transfer Syntax UID tag = Tag(0x00041512) for node in self.node.reverse(): if tag in node._record: return node._record[tag] raise KeyError(tag) @property def is_private(self) -> bool: """Return ``True`` if the instance is privately defined.""" return self.node.record_type == "PRIVATE" @property def is_staged(self) -> bool: """Return ``True`` if the instance is staged for moving, addition or removal """ return self.for_addition or self.for_moving or self.for_removal def load(self) -> Dataset: """Return the referenced instance as a :class:`~pydicom.dataset.Dataset`. """ if self.for_addition: return dcmread(cast(Path, self._stage_path)) return dcmread(self.path) @property def path(self) -> str: """Return the path to the corresponding instance as :class:`str`. Returns ------- str The absolute path to the corresponding instance. If the instance is staged for addition to the File-set this will be a path to the staged file in the temporary staging directory. """ if self.for_addition: return os.fspath(cast(Path, self._stage_path)) # If not staged for addition then File Set must exist on file system root_path = self.file_set.root_path return os.fspath(root_path / cast(Path, self.node.file_id_path(root_path))) @property def SOPClassUID(self) -> UID: """Return the *SOP Class UID* of the referenced instance.""" return cast(UID, self.ReferencedSOPClassUIDInFile) @property def SOPInstanceUID(self) -> UID: """Return the *SOP Instance UID* of the referenced instance.""" return cast(UID, self.ReferencedSOPInstanceUIDInFile) @property def TransferSyntaxUID(self) -> UID: """Return the *Transfer Syntax UID* of the referenced instance.""" return cast(UID, self.ReferencedTransferSyntaxUIDInFile) DSPathType = Dataset | str | os.PathLike class FileSet: """Representation of a DICOM File-set.""" def __init__(self, ds: DSPathType | None = None) -> None: """Create or load a File-set. Parameters ---------- ds : pydicom.dataset.Dataset, str or PathLike, optional If loading a File-set, the DICOMDIR dataset or the path to the DICOMDIR file. """ # The nominal path to the root of the File-set self._root_path: Path | None = None # The root node of the record tree used to fill out the DICOMDIR's # *Directory Record Sequence*. # The tree for instances currently in the File-set self._tree = RootNode(self) # For tracking changes to the File-set self._stage: dict[str, Any] = { "t": TemporaryDirectory(), "+": {}, # instances staged for addition "-": {}, # instances staged for removal "~": False, # instances staged for moving "^": False, # a File-set Identification module element has changed } self._stage["path"] = Path(self._stage["t"].name) # The DICOMDIR instance, not guaranteed to be up-to-date self._ds = Dataset() # The File-set's managed SOP Instances as list of FileInstance self._instances: list[FileInstance] = [] # Use alphanumeric or numeric File IDs self._use_alphanumeric = False # The File-set ID self._id: str | None = None # The File-set UID self._uid: UID | None = None # The File-set Descriptor File ID self._descriptor: str | None = None # The Specific Character Set of File-set Descriptor File self._charset: str | None = None # Check the DICOMDIR dataset and create the record tree if ds: self.load(ds) else: # New File-set self.UID = generate_uid() def add(self, ds_or_path: DSPathType) -> FileInstance: """Stage an instance for addition to the File-set. If the instance has been staged for removal then calling :meth:`~pydicom.fileset.FileSet.add` will cancel the staging and the instance will not be removed. Parameters ---------- ds_or_path : pydicom.dataset.Dataset, str or PathLike The instance to add to the File-set, either as a :class:`~pydicom.dataset.Dataset` or the path to the instance. Returns ------- FileInstance The :class:`~pydicom.fileset.FileInstance` that was added. See Also -------- :meth:`~pydicom.fileset.FileSet.add_custom` """ ds: Dataset | FileDataset if isinstance(ds_or_path, str | os.PathLike): ds = dcmread(ds_or_path) else: ds = ds_or_path key = ds.SOPInstanceUID have_instance = [ii for ii in self if ii.SOPInstanceUID == key] # If staged for removal, keep instead - check this now because # `have_instance` is False when instance staged for removal if key in self._stage["-"]: instance = self._stage["-"][key] del self._stage["-"][key] self._instances.append(instance) instance._apply_stage("+") return cast(FileInstance, instance) # The instance is already in the File-set (and not staged for removal) # May or may not be staged for addition/movement if have_instance: return have_instance[0] # If not already in the File-set, stage for addition # Create the directory records and tree nodes for the dataset # For instances that won't contain PRIVATE records we shouldn't have # to worry about exceeding the maximum component depth of 8 record_gen = self._recordify(ds) record = next(record_gen) parent = RecordNode(record) node = parent # Maybe only be a single record for record in record_gen: node = RecordNode(record) node.parent = parent parent = node instance = FileInstance(node) node.instance = instance self._tree.add(node) # Save the dataset to the stage self._stage["+"][instance.SOPInstanceUID] = instance self._instances.append(instance) instance._apply_stage("+") ds.save_as(instance.path, enforce_file_format=True) return cast(FileInstance, instance) def add_custom(self, ds_or_path: DSPathType, leaf: RecordNode) -> FileInstance: """Stage an instance for addition to the File-set using custom records. This method allows you to add a SOP instance and customize the directory records that will be used when writing the DICOMDIR file. It must be used when you require PRIVATE records and may be used instead of modifying :attr:`~pydicom.fileset.DIRECTORY_RECORDERS` with your own record definition functions when the default functions aren't suitable. The following elements will be added automatically to the supplied directory records if required and not present: * (0004,1400) *Offset of the Next Directory Record* * (0004,1410) *Record In-use Flag* * (0004,1420) *Offset of Referenced Lower-Level Directory Entity* * (0004,1500) *Referenced File ID* * (0004,1510) *Referenced SOP Class UID in File* * (0004,1511) *Referenced SOP Instance UID in File* * (0004,1512) *Referenced Transfer Syntax UID in File* If the instance has been staged for removal then calling :meth:`~pydicom.fileset.FileSet.add_custom` will cancel the staging and the instance will not be removed. Examples -------- Add a SOP Instance using a two record hierarchy of PATIENT -> PRIVATE .. code-block:: python from pydicom import Dataset, examples from pydicom.fileset import FileSet, RecordNode from pydicom.uid import generate_uid # The instance to be added ds = examples.ct # Define the leaf node (the PRIVATE record) record = Dataset() record.DirectoryRecordType = "PRIVATE" record.PrivateRecordUID = generate_uid() leaf_node = RecordNode(record) # Define the top node (the PATIENT record) record = Dataset() record.DirectoryRecordType = "PATIENT" record.PatientID = ds.PatientID record.PatientName = ds.PatientName top_node = RecordNode(record) # Set the node relationship leaf_node.parent = top_node # Add the instance to the File-set fs = FileSet() instance = fs.add_custom(ds, leaf_node) Parameters ---------- ds_or_path : pydicom.dataset.Dataset, str or PathLike The instance to add to the File-set, either as a :class:`~pydicom.dataset.Dataset` or the path to the instance. leaf : pydicom.fileset.RecordNode The leaf node for the instance, should have its ancestors nodes set correctly as well as their corresponding directory records. Should have no more than 7 ancestors due to the semantics used by :class:`~pydicom.fileset.FileSet` when creating the directory structure. Returns ------- FileInstance The :class:`~pydicom.fileset.FileInstance` that was added. See Also -------- :meth:`~pydicom.fileset.FileSet.add` """ ds: Dataset | FileDataset if isinstance(ds_or_path, str | os.PathLike): ds = dcmread(ds_or_path) else: ds = ds_or_path # Check the supplied nodes if leaf.depth > 7: raise ValueError( "The 'leaf' node must not have more than 7 ancestors as " "'FileSet' supports a maximum directory structure depth of 8" ) key = ds.SOPInstanceUID have_instance = [ii for ii in self if ii.SOPInstanceUID == key] # If staged for removal, keep instead - check this now because # `have_instance` is False when instance staged for removal if key in self._stage["-"]: instance = self._stage["-"][key] del self._stage["-"][key] self._instances.append(instance) instance._apply_stage("+") return cast(FileInstance, instance) if have_instance: return have_instance[0] # Ensure the leaf node's record contains the required elements leaf._record.ReferencedFileID = None leaf._record.ReferencedSOPClassUIDInFile = ds.SOPClassUID leaf._record.ReferencedSOPInstanceUIDInFile = key leaf._record.ReferencedTransferSyntaxUIDInFile = ds.file_meta.TransferSyntaxUID instance = FileInstance(leaf) leaf.instance = instance self._tree.add(leaf) # Save the dataset to the stage self._stage["+"][instance.SOPInstanceUID] = instance self._instances.append(instance) instance._apply_stage("+") ds.save_as(instance.path, enforce_file_format=True) return cast(FileInstance, instance) def clear(self) -> None: """Clear the File-set.""" self._tree.children = [] self._instances = [] self._root_path = None self._ds = Dataset() self._id = None self._uid = generate_uid() self._descriptor = None self._charset = None # Clean and reset the stage self._stage["+"] = {} self._stage["-"] = {} self._stage["~"] = False self._stage["^"] = False self._stage["t"].cleanup() self._stage["t"] = TemporaryDirectory() self._stage["path"] = Path(self._stage["t"].name) def copy(self, path: str | os.PathLike, force_implicit: bool = False) -> "FileSet": """Copy the File-set to a new root directory and return the copied File-set. Changes staged to the original :class:`~pydicom.fileset.FileSet` will be applied to the new File-set. The original :class:`~pydicom.fileset.FileSet` will remain staged. Parameters ---------- path : str or PathLike The root directory where the File-set is to be copied to. force_implicit : bool, optional If ``True`` force the DICOMDIR file to be encoded using *Implicit VR Little Endian* which is non-conformant to the DICOM Standard (default ``False``). Returns ------- pydicom.fileset.FileSet The copied File-set as a :class:`~pydicom.fileset.FileSet`. """ # !! We can't change anything public in the original FileSet !! path = Path(path) if self.path and Path(self.path) == path: raise ValueError("Cannot copy the File-set as the 'path' is unchanged") if len(self) > 10**6: self._use_alphanumeric = True if len(self) > 35**6: raise NotImplementedError( "pydicom doesn't support writing File-sets with more than " "1838265625 managed instances" ) # Removals are detached from the tree detached_nodes = [] for instance in self._stage["-"].values(): detached_nodes.append(instance.node) self._tree.remove(instance.node) continue file_ids = [] for instance in self: file_ids.append(instance.ReferencedFileID) dst = path / Path(instance.FileID) dst.parent.mkdir(parents=True, exist_ok=True) shutil.copyfile(instance.path, dst) instance.node._record.ReferencedFileID = instance.FileID.split(os.path.sep) # Create the DICOMDIR file p = path / "DICOMDIR" with open(p, "wb") as fp: f = DicomFileLike(fp) self._write_dicomdir(f, copy_safe=True, force_implicit=force_implicit) # Reset the *Referenced File ID* values # The order here doesn't matter because removed instances aren't # yielded by iter(self) for instance, file_id in zip(self, file_ids): instance.node._record.ReferencedFileID = file_id # Reattach the removed nodes for node in detached_nodes: self._tree.add(node) fs = FileSet() fs.load(p, raise_orphans=True) return fs def _create_dicomdir(self) -> Dataset: """Return a new minimal DICOMDIR dataset.""" ds = Dataset() ds.filename = None ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.file_meta.MediaStorageSOPInstanceUID = self.UID ds.file_meta.MediaStorageSOPClassUID = MediaStorageDirectoryStorage ds.FileSetID = self.ID ds.OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity = 0 ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity = 0 ds.FileSetConsistencyFlag = 0 ds.DirectoryRecordSequence = [] if self.descriptor_file_id: ds.FileSetDescriptorFileID = self.descriptor_file_id if self.descriptor_character_set: ds.SpecificCharacterSetOfFileSetDescriptorFile = ( self.descriptor_character_set ) return ds @property def descriptor_character_set(self) -> str | None: """Return the *Specific Character Set of File-set Descriptor File* (if available) or ``None``. """ return self._charset @descriptor_character_set.setter def descriptor_character_set(self, val: str | None) -> None: """Set the *Specific Character Set of File-set Descriptor File*. The descriptor file itself is used for user comments related to the File-set (e.g. a README file) and is up the user to create. Parameters ---------- val : str or None The value to use for the DICOMDIR's (0004,1142) *Specific Character Set of File-set Descriptor File*. See :dcm:`C.12.1.1.2 in Part 3 of the DICOM Standard ` for defined terms. See Also -------- :attr:`~pydicom.fileset.FileSet.descriptor_file_id` set the descriptor file ID for the file that uses the character set. """ if val == self._charset: return self._charset = val if self._ds: self._ds.SpecificCharacterSetOfFileSetDescriptorFile = val self._stage["^"] = True @property def descriptor_file_id(self) -> str | None: """Return the *File-set Descriptor File ID* (if available) or ``None``.""" return self._descriptor @descriptor_file_id.setter def descriptor_file_id(self, val: str | None) -> None: """Set the *File-set Descriptor File ID*. The descriptor file itself is used for user comments related to the File-set (e.g. a README file) and is up the user to create. Parameters ---------- val : str, list of str or None The value to use for the DICOMDIR's (0004,1141) *File-set Descriptor File ID*. Should be the relative path to the descriptor file and has a maximum length of 8 components, with each component up to 16 characters long. Raises ------ ValueError If `val` has more than 8 items or if each item is longer than 16 characters. See Also -------- :attr:`~pydicom.fileset.FileSet.descriptor_character_set` the character set used in the descriptor file, required if an expanded or replaced character set is used. """ if val == self._descriptor: return if val is None: pass elif isinstance(val, list): try: assert len(val) <= 8 for component in val: assert isinstance(component, str) assert 0 <= len(component) <= 16 except AssertionError: raise ValueError( "The 'File-set Descriptor File ID' has a maximum of 8 " "components, each between 0 and 16 characters long" ) # Push the value through Path to clean it up and check validity val = list(Path(*val).parts) elif isinstance(val, str): if not 0 <= len(val) <= 16: raise ValueError( "Each 'File-set Descriptor File ID' component has a " "maximum length of 16 characters" ) else: raise TypeError( "The 'DescriptorFileID' must be a str, list of str, or None" ) self._descriptor = val if self._ds: self._ds.FileSetDescriptorFileID = self._descriptor self._stage["^"] = True def find(self, load: bool = False, **kwargs: Any) -> list[FileInstance]: """Return matching instances in the File-set **Limitations** * Only single value matching is supported so neither ``PatientID=['1234567', '7654321']`` or ``PatientID='1234567', PatientID='7654321'`` will work (although the first example will work if the *Patient ID* is actually multi-valued). * Repeating group and private elements cannot be used when searching. Parameters ---------- load : bool, optional If ``True``, then load the SOP Instances belonging to the File-set and perform the search against their available elements. Otherwise (default) search only the elements available in the corresponding directory records (more efficient, but only a limited number of elements are available). **kwargs Search parameters, as element keyword=value (i.e. ``PatientID='1234567', StudyDescription="My study"``. Returns ------- list of pydicom.fileset.FileInstance A list of matching instances. """ if not kwargs: return self._instances[:] # Flag whether or not the query elements are in the DICOMDIR records has_elements = False def match(ds: Dataset | FileInstance, **kwargs: Any) -> bool: nonlocal has_elements if load: ds = ds.load() # Check that all query elements are present if all([kw in ds for kw in kwargs]): has_elements = True for kw, val in kwargs.items(): try: assert ds[kw].value == val except (AssertionError, KeyError): return False return True matches = [instance for instance in self if match(instance, **kwargs)] if not load and not has_elements: warn_and_log( "None of the records in the DICOMDIR dataset contain all " "the query elements, consider using the 'load' parameter " "to expand the search to the corresponding SOP instances" ) return matches def find_values( self, elements: str | int | list[str | int], instances: list[FileInstance] | None = None, load: bool = False, ) -> list[Any] | dict[str | int, list[Any]]: """Return a list of unique values for given element(s). Parameters ---------- elements : str, int or pydicom.tag.BaseTag, or list of these The keyword or tag of the element(s) to search for. instances : list of pydicom.fileset.FileInstance, optional Search within the given instances. If not used then all available instances will be searched. load : bool, optional If ``True``, then load the SOP Instances belonging to the File-set and perform the search against their available elements. Otherwise (default) search only the elements available in the corresponding directory records (more efficient, but only a limited number of elements are available). Returns ------- list of object(s), or dict of lists of object(s) * If single element was queried: A list of value(s) for the element available in the instances. * If list of elements was queried: A dict of element value pairs with lists of value(s) for the elements available in the instances. """ element_list = elements if isinstance(elements, list) else [elements] has_element = {element: False for element in element_list} results: dict[str | int, list[Any]] = {element: [] for element in element_list} iter_instances = instances or iter(self) instance: Dataset | FileInstance for instance in iter_instances: if load: instance = instance.load() for element in element_list: if element not in instance: continue has_element[element] = True val = instance[element].value # Not very efficient, but we can't use set if val not in results[element]: results[element].append(val) missing_elements = [element for element, v in has_element.items() if not v] if not load and missing_elements: warn_and_log( "None of the records in the DICOMDIR dataset contain " f"{missing_elements}, consider using the 'load' parameter " "to expand the search to the corresponding SOP instances" ) if not isinstance(elements, list): return results[element_list[0]] return results @property def ID(self) -> str | None: """Return the *File-set ID* (if available) or ``None``.""" return self._id @ID.setter def ID(self, val: str | None) -> None: """Set the File-set ID. Parameters ---------- val : str or None The value to use for the DICOMDIR's (0004,1130) *File-set ID*. Raises ------ ValueError If `val` is greater than 16 characters long. """ if val == self._id: return if val is None or 0 <= len(val) <= 16: self._id = val if self._ds: self._ds.FileSetID = val self._stage["^"] = True else: raise ValueError("The maximum length of the 'File-set ID' is 16 characters") @property def is_staged(self) -> bool: """Return ``True`` if the File-set is new or has changes staged.""" return any(self._stage[c] for c in "+-^~") def __iter__(self) -> Iterator[FileInstance]: """Yield :class:`~pydicom.fileset.FileInstance` from the File-set.""" yield from self._instances[:] def __len__(self) -> int: """Return the number of instances in the File-set.""" return len(self._instances) def load( self, ds_or_path: DSPathType, include_orphans: bool = True, raise_orphans: bool = False, ) -> None: """Load an existing File-set. Existing File-sets that do not use the same directory structure as *pydicom* will be staged to be moved to a new structure. This is because the DICOM Standard attaches no semantics to *how* the files in a File-set are to be structured so it's impossible to determine what the layout will be when changes are to be made. Parameters ---------- ds_or_path : pydicom.dataset.Dataset, str or PathLike An existing File-set's DICOMDIR, either as a :class:`~pydicom.dataset.Dataset` or the path to the DICOMDIR file as :class:`str` or pathlike. include_orphans : bool, optional If ``True`` (default) include instances referenced by orphaned directory records in the File-set. raise_orphans : bool, optional If ``True`` then raise an exception if orphaned directory records are found in the File-set (default ``False``). """ if isinstance(ds_or_path, Dataset): ds = ds_or_path else: ds = dcmread(ds_or_path) sop_class = ds.file_meta.get("MediaStorageSOPClassUID", None) if sop_class != MediaStorageDirectoryStorage: raise ValueError( "Unable to load the File-set as the supplied dataset is " "not a 'Media Storage Directory' instance" ) tsyntax = ds.file_meta.TransferSyntaxUID if tsyntax != ExplicitVRLittleEndian: warn_and_log( "The DICOMDIR dataset uses an invalid transfer syntax " f"'{tsyntax.name}' and will be updated to use 'Explicit VR " "Little Endian'" ) try: path = Path(ds.filename).resolve(strict=True) except FileNotFoundError: raise FileNotFoundError( "Unable to load the File-set as the 'filename' attribute " "for the DICOMDIR dataset is not a valid path: " f"{ds.filename}" ) except TypeError: # Custom message if DICOMDIR from bytes, etc raise TypeError( "Unable to load the File-set as the DICOMDIR dataset must " "have a 'filename' attribute set to the path of the " "DICOMDIR file" ) self.clear() self._id = cast(str | None, ds.get("FileSetID", None)) uid = cast(UID | None, ds.file_meta.get("MediaStorageSOPInstanceUID")) if not uid: uid = generate_uid() ds.file_meta.MediaStorageSOPInstanceUID = uid self._uid = uid self._descriptor = cast(str | None, ds.get("FileSetDescriptorFileID", None)) self._charset = cast( str | None, ds.get("SpecificCharacterSetOfFileSetDescriptorFile", None) ) self._root_path = path.parent self._ds = ds # Create the record tree self._parse_records(ds, include_orphans, raise_orphans) bad_instances = [] for instance in self: # Check that the referenced file exists file_id = self._file_id_path(instance.node) assert file_id is not None try: # self.path is already set at this point (self.root_path / file_id).resolve(strict=True) except FileNotFoundError: bad_instances.append(instance) warn_and_log( "The referenced SOP Instance for the directory record at " f"offset {instance.node._offset} does not exist: " f"{self.root_path / file_id}" ) continue # If the instance's existing directory structure doesn't match # the pydicom semantics then stage for movement if instance.for_moving: self._stage["~"] = True for instance in bad_instances: self._instances.remove(instance) def _file_id_path(self, node: RecordNode) -> Path | None: """Return the *Referenced File ID* from the given node as a :class:`~pathlib.Path`. Parameters ---------- node: RecordNode The node where the *Referenced File ID* resides. Returns ------- pathlib.Path or None The *Referenced File ID* from the directory record as a :class:`pathlib.Path` or ``None`` if the element value is null. Raises ------ PermissionError If the file ID points to a path outside the fileset root path. AttributeError If the Referenced File ID is missing in the directory record. """ return node.file_id_path(self.root_path) def _parse_records( self, ds: Dataset, include_orphans: bool, raise_orphans: bool = False ) -> None: """Parse the records in an existing DICOMDIR. Parameters ---------- ds : pydicom.dataset.Dataset The File-set's DICOMDIR dataset. include_orphans : bool If ``True`` then include within the File-set orphaned records that contain a valid (and unique) *Referenced File ID* element. Orphaned records are those that aren't placed within the *Directory Record Sequence* hierarchy. raise_orphans : bool, optional If ``True`` then raise an exception if orphaned directory records are found in the File-set (default ``False``). """ # First pass: get the offsets for each record records = {} for record in cast(Iterable[Dataset], ds.DirectoryRecordSequence): offset = cast(int, record.seq_item_tell) node = RecordNode(record) node._offset = offset records[offset] = node # Define the top-level nodes if records: node = records[ds[_FIRST_OFFSET].value] node.parent = self._tree while getattr(node._record, _NEXT_OFFSET, None): node = records[node._record[_NEXT_OFFSET].value] node.parent = self._tree # Second pass: build the record hierarchy # Records not in the hierarchy will be ignored # Branches without a valid leaf node File ID will be removed def recurse_node(node: RecordNode) -> None: child_offset = getattr(node._record, _LOWER_OFFSET, None) if child_offset: child = records[child_offset] child.parent = node next_offset = getattr(child._record, _NEXT_OFFSET, None) while next_offset: child = records[next_offset] child.parent = node next_offset = getattr(child._record, _NEXT_OFFSET, None) elif "ReferencedFileID" not in node._record: # No children = leaf node, leaf nodes must reference a File ID del node.parent[node] # The leaf node references the FileInstance if ( "ReferencedFileID" in node._record and self._file_id_path(node) is not None ): node.instance = FileInstance(node) self._instances.append(node.instance) for child in node.children: recurse_node(child) for node in self._tree.children: recurse_node(node) if len(records) == len(list(iter(self._tree))): return if raise_orphans: raise ValueError("The DICOMDIR contains orphaned directory records") # DICOMDIR contains orphaned records # Determine which nodes are both orphaned and reference an instance missing_set = set(records.keys()) - {ii._offset for ii in self._tree} missing = [records[o] for o in missing_set] missing = [r for r in missing if "ReferencedFileID" in r._record] if missing and not include_orphans: warn_and_log( f"The DICOMDIR has {len(missing)} orphaned directory records " "that reference an instance that will not be included in the " "File-set" ) return for node in missing: # Get the path to the orphaned instance original_value = node._record.ReferencedFileID if (file_id := self._file_id_path(node)) is None: continue # self.path is set for an existing File Set path = self.root_path / file_id if node.record_type == "PRIVATE": instance = self.add_custom(path, node) else: instance = self.add(path) # Because the record is new the Referenced File ID isn't set instance.node._record.ReferencedFileID = original_value @property def root_path(self) -> Path: """Return the absolute path to the File-set root directory as :class:`pathlib.Path`. Raises ------ AttributeError If the root path is not set. """ if self._root_path is None: raise AttributeError("No root path set in the File-set") return self._root_path @property def path(self) -> str | None: """Return the absolute path to the File-set root directory as :class:`str` (if set) or ``None`` otherwise. """ if self._root_path is not None: return os.fspath(self._root_path) return None def _recordify(self, ds: Dataset) -> Iterator[Dataset]: """Yield directory records for a SOP Instance. Parameters ---------- ds : pydicom.dataset.Dataset The SOP Instance to create DICOMDIR directory records for. Yields ------ ds : pydicom.dataset.Dataset A directory record for the instance, ordered from highest to lowest level. Raises ------ ValueError If unable to create the required directory records because of a missing required element or element value. """ # Single-level records: leaf record_type = _single_level_record_type(ds) if record_type != "PATIENT": try: record = DIRECTORY_RECORDERS[record_type](ds) except ValueError as exc: raise ValueError( f"Unable to use the default '{record_type}' " f"record creator: {exc}. See DICOM PS3.3 Section F.5. " "Either update the instance, " "define your own record creation function or use " "'FileSet.add_custom()' instead" ) from exc record.OffsetOfTheNextDirectoryRecord = 0 record.RecordInUseFlag = 0xFFFF record.OffsetOfReferencedLowerLevelDirectoryEntity = 0 record.DirectoryRecordType = record_type record.ReferencedFileID = None record.ReferencedSOPClassUIDInFile = ds.SOPClassUID record.ReferencedSOPInstanceUIDInFile = ds.SOPInstanceUID record.ReferencedTransferSyntaxUIDInFile = ds.file_meta.TransferSyntaxUID yield record return # Four-level records: PATIENT -> STUDY -> SERIES -> leaf records = [] leaf_type = _four_level_record_type(ds) for record_type in ["PATIENT", "STUDY", "SERIES", leaf_type]: try: record = DIRECTORY_RECORDERS[record_type](ds) except ValueError as exc: raise ValueError( f"Unable to use the default '{record_type}' " f"record creator: {exc}. See DICOM PS3.3 Section F.5. " "Either update the instance, " "define your own record creation function or use " "'FileSet.add_custom()' instead" ) from exc record.OffsetOfTheNextDirectoryRecord = 0 record.RecordInUseFlag = 0xFFFF record.OffsetOfReferencedLowerLevelDirectoryEntity = 0 record.DirectoryRecordType = record_type if "SpecificCharacterSet" in ds: record.SpecificCharacterSet = ds.SpecificCharacterSet records.append(record) # Add the instance referencing elements to the leaf leaf = records[3] leaf.ReferencedFileID = None leaf.ReferencedSOPClassUIDInFile = ds.SOPClassUID leaf.ReferencedSOPInstanceUIDInFile = ds.SOPInstanceUID leaf.ReferencedTransferSyntaxUIDInFile = ds.file_meta.TransferSyntaxUID yield from records def remove(self, instance: FileInstance | list[FileInstance]) -> None: """Stage instance(s) for removal from the File-set. If the instance has been staged for addition to the File-set, calling :meth:`~pydicom.fileset.FileSet.remove` will cancel the staging and the instance will not be added. Parameters ---------- instance : pydicom.fileset.FileInstance or a list of FileInstance The instance(s) to remove from the File-set. """ if isinstance(instance, list): for item in instance: self.remove(item) return if instance not in self._instances: raise ValueError("No such instance in the File-set") # If staged for addition, no longer add if instance.SOPInstanceUID in self._stage["+"]: leaf = instance.node del leaf.parent[leaf] del self._stage["+"][instance.SOPInstanceUID] # Delete file from stage try: Path(instance.path).unlink() except FileNotFoundError: pass instance._apply_stage("-") self._instances.remove(instance) # Stage for removal if not already done elif instance.SOPInstanceUID not in self._stage["-"]: instance._apply_stage("-") self._stage["-"][instance.SOPInstanceUID] = instance self._instances.remove(instance) def __str__(self) -> str: """Return a string representation of the FileSet.""" s = [ "DICOM File-set", f" Root directory: {self.path or '(no value available)'}", f" File-set ID: {self.ID or '(no value available)'}", f" File-set UID: {self.UID}", ( f" Descriptor file ID: " f"{self.descriptor_file_id or '(no value available)'}" ), ( f" Descriptor file character set: " f"{self.descriptor_character_set or '(no value available)'}" ), ] if self.is_staged: changes = [] if not self._ds: changes.append("DICOMDIR creation") else: changes.append("DICOMDIR update") if self._stage["~"]: changes.append("directory structure update") if self._stage["+"]: suffix = "s" if len(self._stage["+"]) > 1 else "" changes.append(f"{len(self._stage['+'])} addition{suffix}") if self._stage["-"]: suffix = "s" if len(self._stage["-"]) > 1 else "" changes.append(f"{len(self._stage['-'])} removal{suffix}") s.append(f" Changes staged for write(): {', '.join(changes)}") if not self._tree.children: return "\n".join(s) s.append("\n Managed instances:") s.extend([f" {ii}" for ii in self._tree.prettify()]) return "\n".join(s) @property def UID(self) -> UID: """Return the File-set's UID.""" return cast(UID, self._uid) @UID.setter def UID(self, uid: UID) -> None: """Set the File-set UID. Parameters ---------- uid : pydicom.uid.UID The UID to use as the new File-set UID. """ if uid == self._uid: return uid = UID(uid) assert uid.is_valid self._uid = uid if self._ds: self._ds.file_meta.MediaStorageSOPInstanceUID = uid self._stage["^"] = True def write( self, path: str | os.PathLike | None = None, use_existing: bool = False, force_implicit: bool = False, ) -> None: """Write the File-set, or changes to the File-set, to the file system. .. warning:: If modifying an existing File-set it's **strongly recommended** that you follow standard data management practices and ensure that you have an up-to-date backup of the original data. By default, for both new or existing File-sets, *pydicom* uses the following directory structure semantics when writing out changes: * For instances defined using the standard four-levels of directory records (i.e. PATIENT/STUDY/SERIES + one of the record types such as IMAGE or RT DOSE): ``PTxxxxxx/STxxxxxx/SExxxxxx/`` with a filename such as ``IMxxxxxx`` (for IMAGE), where the first two characters are dependent on the record type and ``xxxxxx`` is a numeric or alphanumeric index. * For instances defined using the standard one-level directory record (i.e. PALETTE, IMPLANT): a filename such as ``PAxxxxxx`` (for PALETTE). * For instances defined using PRIVATE directory records then the structure will be along the lines of ``P0xxxxxx/P1xxxxxx/P2xxxxxx`` for PRIVATE/PRIVATE/PRIVATE, ``PTxxxxxx/STxxxxxx/P2xxxxxx`` for PATIENT/STUDY/PRIVATE. When only changes to the DICOMDIR file are required or instances have only been removed from an existing File-set you can use the `use_existing` keyword parameter to keep the existing directory structure and only update the DICOMDIR file. Parameters ---------- path : str or PathLike, optional For new File-sets, the absolute path to the root directory where the File-set will be written. Using `path` with an existing File-set will raise :class:`ValueError`. use_existing : bool, optional If ``True`` and no instances have been added to the File-set (removals are OK), then only update the DICOMDIR file, keeping the current directory structure rather than converting everything to the semantics used by *pydicom* for File-sets (default ``False``). force_implicit : bool, optional If ``True`` force the DICOMDIR file to be encoded using *Implicit VR Little Endian* which is non-conformant to the DICOM Standard (default ``False``). Raises ------ ValueError If `use_existing` is ``True`` but instances have been staged for addition to the File-set. """ if not path and self.path is None: raise ValueError( "The path to the root directory is required for a new File-set" ) if path and self.path: raise ValueError( "The path for an existing File-set cannot be changed, use " "'FileSet.copy()' to write the File-set to a new location" ) if path: self._root_path = Path(path) # Don't write unless changed or new if not self.is_staged: return # Path to the DICOMDIR file root = self.root_path p = root / "DICOMDIR" # Re-use the existing directory structure if only moves or removals # are required and `use_existing` is True major_change = bool(self._stage["+"]) if use_existing and major_change: raise ValueError( "'Fileset.write()' called with 'use_existing' but additions " "to the File-set's managed instances are staged" ) if not use_existing: major_change |= self._stage["~"] # Worst case scenario if all instances in one directory if len(self) > 10**6: self._use_alphanumeric = True if len(self) > 35**6: raise NotImplementedError( "pydicom doesn't support writing File-sets with more than " "1838265625 managed instances" ) # Remove the removals - must be first because the File IDs will be # incorrect with the removals still in the tree for instance in self._stage["-"].values(): try: Path(instance.path).unlink() except FileNotFoundError: pass self._tree.remove(instance.node) if use_existing and not major_change: with open(p, "wb") as fp: f = DicomFileLike(fp) self._write_dicomdir(f, force_implicit=force_implicit) self.load(p, raise_orphans=True) return # We need to be careful not to overwrite the source file # for a different (later) instance # Check for collisions between the new and old File IDs # and copy any to the stage fout = {Path(ii.FileID) for ii in self} fin = { self._file_id_path(ii.node) for ii in self if ii.SOPInstanceUID not in self._stage["+"] } collisions = fout & fin for instance in [ ii for ii in self if self._file_id_path(ii.node) in collisions ]: self._stage["+"][instance.SOPInstanceUID] = instance instance._apply_stage("+") shutil.copyfile( root / cast(Path, self._file_id_path(instance.node)), instance.path, ) for instance in self: dst = root / instance.FileID dst.parent.mkdir(parents=True, exist_ok=True) fn: Callable src: Path | str if instance.SOPInstanceUID in self._stage["+"]: src = instance.path fn = shutil.copyfile else: src = root / cast(Path, self._file_id_path(instance.node)) fn = shutil.move fn(os.fspath(src), os.fspath(dst)) instance.node._record.ReferencedFileID = instance.FileID.split(os.path.sep) # Create the DICOMDIR file with open(p, "wb") as fp: f = DicomFileLike(fp) self._write_dicomdir(f, force_implicit=force_implicit) # Reload the File-set # We're doing things wrong if we have orphans so raise self.load(p, raise_orphans=True) def _write_dicomdir( self, fp: DicomFileLike, copy_safe: bool = False, force_implicit: bool = False ) -> None: """Encode and write the File-set's DICOMDIR dataset. Parameters ---------- fp : file-like The file-like to write the encoded DICOMDIR dataset to. Must have ``write()``, ``tell()`` and ``seek()`` methods. copy_safe : bool, optional If ``True`` then the function doesn't make any changes to the public parts of the current :class:`~pydicom.fileset.FileSet` instance. force_implicit : bool, optional Force encoding the DICOMDIR with 'Implicit VR Little Endian' which is non-conformant to the DICOM Standard (default ``False``). """ ds = self._ds if copy_safe or not ds: ds = self._create_dicomdir() # By default, always convert to the correct syntax ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian seq_offset = 12 if force_implicit: ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian seq_offset = 8 fp.is_implicit_VR = ds.file_meta.TransferSyntaxUID.is_implicit_VR fp.is_little_endian = ds.file_meta.TransferSyntaxUID.is_little_endian # Reset the offsets first_elem = ds[_FIRST_OFFSET] first_elem.value = 0 last_elem = ds[_LAST_OFFSET] last_elem.value = 0 # Write the preamble, DICM marker and File Meta fp.write(b"\x00" * 128 + b"DICM") write_file_meta_info(fp, ds.file_meta, enforce_standard=True) # Write the dataset # Write up to the *Offset of the First Directory Record...* element write_dataset(fp, ds[:0x00041200]) tell_offset_first = fp.tell() # Start of *Offset of the First...* # Write up to (but not including) the *Directory Record Sequence* write_dataset(fp, ds[0x00041200:0x00041220]) # Rebuild and encode the *Directory Record Sequence* # Step 1: Determine the offsets for all the records offset = fp.tell() + seq_offset # Start of the first seq. item tag for node in self._tree: # RecordNode._offset is the start of each record's seq. item tag node._offset = offset offset += 8 # a sequence item's (tag + length) # Copy safe - only modifies RecordNode._offset offset += node._encode_record(force_implicit) # If the sequence item has undefined length then it uses a # sequence item delimiter item if node._record.is_undefined_length_sequence_item: offset += 8 # Step 2: Update the records and add to *Directory Record Sequence* ds.DirectoryRecordSequence = [] for node in self._tree: record = node._record if not copy_safe: node._update_record_offsets() else: record = copy.deepcopy(record) next_elem = record[_NEXT_OFFSET] next_elem.value = 0 if node.next: next_elem.value = node.next._offset lower_elem = record[_LOWER_OFFSET] lower_elem.value = 0 if node.children: record[_LOWER_OFFSET].value = node.children[0]._offset cast(list[Dataset], ds.DirectoryRecordSequence).append(record) # Step 3: Encode *Directory Record Sequence* and the rest write_dataset(fp, ds[0x00041220:]) # Update the first and last record offsets if self._tree.children: first_elem.value = self._tree.children[0]._offset last_elem.value = self._tree.children[-1]._offset # Re-write the record offset pointer elements fp.seek(tell_offset_first) write_data_element(fp, first_elem) write_data_element(fp, last_elem) # Go to the end fp.seek(0, 2) # Functions for creating Directory Records def _check_dataset(ds: Dataset, keywords: list[str]) -> None: """Check the dataset module for the Type 1 `keywords`. Parameters ---------- ds : pydicom.dataset.Dataset The dataset to check. keywords : list of str The DICOM keywords for Type 1 elements that are to be checked. Raises ------ KeyError If an element is not in the dataset. ValueError If the element is present but has no value. """ for kw in keywords: tag = Tag(cast(int, tag_for_keyword(kw))) name = dictionary_description(tag) if kw not in ds: raise ValueError(f"The instance's {tag} '{name}' element is missing") if ds[kw].VM != 0: continue raise ValueError(f"The instance's {tag} '{name}' element cannot be empty") def _define_patient(ds: Dataset) -> Dataset: """Return a PATIENT directory record from `ds`.""" _check_dataset(ds, ["PatientID"]) record = Dataset() record.PatientName = ds.get("PatientName") record.PatientID = ds.PatientID return record def _define_study(ds: Dataset) -> Dataset: """Return a STUDY directory record from `ds`.""" _check_dataset(ds, ["StudyDate", "StudyTime", "StudyID"]) record = Dataset() record.StudyDate = ds.StudyDate record.StudyTime = ds.StudyTime record.StudyDescription = ds.get("StudyDescription") if "StudyInstanceUID" in ds: _check_dataset(ds, ["StudyInstanceUID"]) record.StudyInstanceUID = ds.StudyInstanceUID record.StudyID = ds.StudyID record.AccessionNumber = ds.get("AccessionNumber") return record def _define_series(ds: Dataset) -> Dataset: """Return a SERIES directory record from `ds`.""" _check_dataset(ds, ["Modality", "SeriesInstanceUID", "SeriesNumber"]) record = Dataset() record.Modality = ds.Modality record.SeriesInstanceUID = ds.SeriesInstanceUID record.SeriesNumber = ds.SeriesNumber return record def _define_image(ds: Dataset) -> Dataset: """Return an IMAGE directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber return record def _define_rt_dose(ds: Dataset) -> Dataset: """Return an RT DOSE directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "DoseSummationType"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.DoseSummationType = ds.DoseSummationType return record def _define_rt_structure_set(ds: Dataset) -> Dataset: """Return an RT STRUCTURE SET directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "StructureSetLabel"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.StructureSetLabel = ds.StructureSetLabel record.StructureSetDate = ds.get("StructureSetDate") record.StructureSetTime = ds.get("StructureSetTime") return record def _define_rt_plan(ds: Dataset) -> Dataset: """Return an RT PLAN directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "RTPlanLabel"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.RTPlanLabel = ds.RTPlanLabel record.RTPlanDate = ds.get("RTPlanDate") record.RTPlanTime = ds.get("RTPlanTime") return record def _define_rt_treatment_record(ds: Dataset) -> Dataset: """Return an RT TREAT RECORD directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.TreatmentDate = ds.get("TreatmentDate") record.TreatmentTime = ds.get("TreatmentTime") return record def _define_presentation(ds: Dataset) -> Dataset: """Return a PRESENTATION directory record from `ds`.""" _check_dataset( ds, [ "PresentationCreationDate", "PresentationCreationTime", "InstanceNumber", "ContentLabel", ], ) record = Dataset() record.PresentationCreationDate = ds.PresentationCreationDate record.PresentationCreationTime = ds.PresentationCreationTime # Content Identification Macro record.InstanceNumber = ds.InstanceNumber record.ContentLabel = ds.ContentLabel record.ContentDescription = ds.get("ContentDescription") record.ContentCreatorName = ds.get("ContentCreatorName") if "ReferencedSeriesSequence" in ds: _check_dataset(ds, ["ReferencedSeriesSequence"]) record.ReferencedSeriesSequence = ds.ReferencedSeriesSequence if "BlendingSequence" in ds: _check_dataset(ds, ["BlendingSequence"]) record.BlendingSequence = ds.BlendingSequence return record def _define_sr_document(ds: Dataset) -> Dataset: """Return a SR DOCUMENT directory record from `ds`.""" _check_dataset( ds, [ "InstanceNumber", "CompletionFlag", "VerificationFlag", "ContentDate", "ContentTime", "ConceptNameCodeSequence", ], ) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.CompletionFlag = ds.CompletionFlag record.VerificationFlag = ds.VerificationFlag record.ContentDate = ds.ContentDate record.ContentTime = ds.ContentTime if "VerificationDateTime" in ds: _check_dataset(ds, ["VerificationDateTime"]) record.VerificationDateTime = ds.VerificationDateTime record.ConceptNameCodeSequence = ds.ConceptNameCodeSequence if "ContentSequence" in ds: _check_dataset(ds, ["ContentSequence"]) record.ContentSequence = ds.ContentSequence return record def _define_key_object_doc(ds: Dataset) -> Dataset: """Return a KEY OBJECT DOC directory record from `ds`.""" _check_dataset( ds, [ "InstanceNumber", "ContentDate", "ContentTime", "ConceptNameCodeSequence", ], ) record = Dataset() record.ContentDate = ds.ContentDate record.ContentTime = ds.ContentTime record.InstanceNumber = ds.InstanceNumber record.ConceptNameCodeSequence = ds.ConceptNameCodeSequence if "ContentSequence" in ds: _check_dataset(ds, ["ContentSequence"]) record.ContentSequence = ds.ContentSequence return record def _define_spectroscopy(ds: Dataset) -> Dataset: """Return an SPECTROSCOPY directory record from `ds`.""" _check_dataset( ds, [ "ImageType", "ContentDate", "ContentTime", "InstanceNumber", "NumberOfFrames", "Rows", "Columns", "DataPointRows", "DataPointColumns", ], ) record = Dataset() record.ImageType = ds.ImageType record.ContentDate = ds.ContentDate record.ContentTime = ds.ContentTime record.InstanceNumber = ds.InstanceNumber if "ReferencedImageEvidenceSequence" in ds: _check_dataset(ds, ["ReferencedImageEvidenceSequence"]) record.ReferencedImageEvidenceSequence = ds.ReferencedImageEvidenceSequence record.NumberOfFrames = ds.NumberOfFrames record.Rows = ds.Rows record.Columns = ds.Columns record.DataPointRows = ds.DataPointRows record.DataPointColumns = ds.DataPointColumns return record def _define_hanging_protocol(ds: Dataset) -> Dataset: """Return a HANGING PROTOCOL directory record from `ds`.""" _check_dataset( ds, [ "HangingProtocolCreator", "HangingProtocolCreationDateTime", "HangingProtocolDefinitionSequence", "NumberOfPriorsReferenced", ], ) record = Dataset() record.HangingProtocolCreator = ds.HangingProtocolCreator record.HangingProtocolCreationDateTime = ds.HangingProtocolCreationDateTime record.HangingProtocolDefinitionSequence = ds.HangingProtocolDefinitionSequence record.NumberOfPriorsReferenced = ds.NumberOfPriorsReferenced record.HangingProtocolUserIdentificationCodeSequence = ds.get( "HangingProtocolUserIdentificationCodeSequence", [] ) return record def _define_encap_doc(ds: Dataset) -> Dataset: """Return an ENCAP DOC directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "MIMETypeOfEncapsulatedDocument"]) record = Dataset() record.ContentDate = ds.get("ContentDate") record.ContentTime = ds.get("ContentTime") record.InstanceNumber = ds.InstanceNumber record.DocumentTitle = ds.get("DocumentTitle") if "HL7InstanceIdentifier" in ds: _check_dataset(ds, ["HL7InstanceIdentifier"]) record.HL7InstanceIdentifier = ds.HL7InstanceIdentifier record.ConceptNameCodeSequence = ds.get("ConceptNameCodeSequence") record.MIMETypeOfEncapsulatedDocument = ds.MIMETypeOfEncapsulatedDocument return record def _define_palette(ds: Dataset) -> Dataset: """Return a PALETTE directory record from `ds`.""" _check_dataset(ds, ["ContentLabel"]) record = Dataset() record.ContentLabel = ds.ContentLabel record.ContentDescription = ds.get("ContentDescription") return record def _define_implant(ds: Dataset) -> Dataset: """Return a IMPLANT directory record from `ds`.""" _check_dataset(ds, ["Manufacturer", "ImplantName", "ImplantPartNumber"]) record = Dataset() record.Manufacturer = ds.Manufacturer record.ImplantName = ds.ImplantName if "ImplantSize" in ds: _check_dataset(ds, ["ImplantSize"]) record.ImplantSize = ds.ImplantSize record.ImplantPartNumber = ds.ImplantPartNumber return record def _define_implant_assy(ds: Dataset) -> Dataset: """Return a IMPLANT ASSY directory record from `ds`.""" _check_dataset( ds, ["ImplantAssemblyTemplateName", "Manufacturer", "ProcedureTypeCodeSequence"] ) record = Dataset() record.ImplantAssemblyTemplateName = ds.ImplantAssemblyTemplateName record.Manufacturer = ds.Manufacturer record.ProcedureTypeCodeSequence = ds.ProcedureTypeCodeSequence return record def _define_implant_group(ds: Dataset) -> Dataset: """Return a IMPLANT GROUP directory record from `ds`.""" _check_dataset(ds, ["ImplantTemplateGroupName", "ImplantTemplateGroupIssuer"]) record = Dataset() record.ImplantTemplateGroupName = ds.ImplantTemplateGroupName record.ImplantTemplateGroupIssuer = ds.ImplantTemplateGroupIssuer return record def _define_surface_scan(ds: Dataset) -> Dataset: """Return a SURFACE SCAN directory record from `ds`.""" _check_dataset(ds, ["ContentDate", "ContentTime"]) record = Dataset() record.ContentDate = ds.ContentDate record.ContentTime = ds.ContentTime return record def _define_assessment(ds: Dataset) -> Dataset: """Return a ASSESSMENT directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "InstanceCreationDate"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.InstanceCreationDate = ds.InstanceCreationDate record.InstanceCreationTime = ds.get("InstanceCreationTime") return record def _define_radiotherapy(ds: Dataset) -> Dataset: """Return a RADIOTHERAPY directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber if "UserContentLabel" in ds: _check_dataset(ds, ["UserContentLabel"]) record.UserContentLabel = ds.UserContentLabel if "UserContentLongLabel" in ds: _check_dataset(ds, ["UserContentLongLabel"]) record.UserContentLongLabel = ds.UserContentLongLabel record.ContentDescription = ds.get("ContentDescription") record.ContentCreatorName = ds.get("ContentCreatorName") return record def _define_generic_content(ds: Dataset) -> Dataset: """Return a WAVEFORM/RAW DATA directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "ContentDate", "ContentTime"]) record = Dataset() record.InstanceNumber = ds.InstanceNumber record.ContentDate = ds.ContentDate record.ContentTime = ds.ContentTime return record def _define_generic_content_id(ds: Dataset) -> Dataset: """Return a generic content identification directory record from `ds`.""" _check_dataset(ds, ["InstanceNumber", "ContentDate", "ContentTime", "ContentLabel"]) # Content Identification Macro record = Dataset() record.InstanceNumber = ds.InstanceNumber record.ContentDate = ds.ContentDate record.ContentTime = ds.ContentTime record.ContentLabel = ds.ContentLabel record.ContentDescription = ds.get("ContentDescription") record.ContentCreatorName = ds.get("ContentCreatorName") return record def _define_empty(ds: Dataset) -> Dataset: """Return an empty directory record from `ds`.""" return Dataset() DIRECTORY_RECORDERS = { "PATIENT": _define_patient, # TOP LEVEL "STUDY": _define_study, # INTERMEDIATE or LEAF "SERIES": _define_series, # INTERMEDIATE "IMAGE": _define_image, # LEAF "RT DOSE": _define_rt_dose, # LEAF "RT STRUCTURE SET": _define_rt_structure_set, # LEAF "RT PLAN": _define_rt_plan, # LEAF "RT TREAT RECORD": _define_rt_treatment_record, # LEAF "PRESENTATION": _define_presentation, # LEAF "WAVEFORM": _define_generic_content, # LEAF "SR DOCUMENT": _define_sr_document, # LEAF "KEY OBJECT DOC": _define_key_object_doc, # LEAF "SPECTROSCOPY": _define_spectroscopy, # LEAF "RAW DATA": _define_generic_content, # LEAF "REGISTRATION": _define_generic_content_id, # LEAF "FIDUCIAL": _define_generic_content_id, # LEAF "HANGING PROTOCOL": _define_hanging_protocol, # TOP LEVEL and LEAF "ENCAP DOC": _define_encap_doc, # LEAF "VALUE MAP": _define_generic_content_id, # LEAF "STEREOMETRIC": _define_empty, # LEAF "PALETTE": _define_palette, # TOP LEVEL and LEAF "IMPLANT": _define_implant, # TOP LEVEL and LEAF "IMPLANT ASSY": _define_implant_assy, # TOP LEVEL and LEAF "IMPLANT GROUP": _define_implant_group, # TOP LEVEL and LEAF "PLAN": _define_empty, # LEAF "MEASUREMENT": _define_generic_content_id, # LEAF "SURFACE": _define_generic_content_id, # LEAF "SURFACE SCAN": _define_surface_scan, # LEAF "TRACT": _define_generic_content_id, # LEAF "ASSESSMENT": _define_assessment, # LEAF "RADIOTHERAPY": _define_radiotherapy, # LEAF } """A :class:`dict` containing the directory record creation functions. The functions are used to create non-PRIVATE records for a given SOP Instance as ``{"RECORD TYPE": callable}``, where ``"RECORD TYPE"`` should match one of the allowable values - except PRIVATE - for (0004,1430) *Directory Record Type*. By overriding the function for a given record type you can customize the directory records that will be included in the DICOMDIR file. Example ------- .. code-block:: python from pydicom.fileset import DIRECTORY_RECORDERS, FileSet def my_recorder(ds: Dataset) -> Dataset: record = Dataset() record.OffsetOfTheNextDirectoryRecord = 0 record.RecordInUseFlag = 0xFFFF record.OffsetOfReferencedLowerLevelDirectoryEntity = 0 record.DirectoryRecordType = "PATIENT" if "SpecificCharacterSet" in ds: record.SpecificCharacterSet = ds.SpecificCharacterSet record.PatientName = ds.get("PatientName") record.PatientID = ds.PatientID return record DIRECTORY_RECORDERS["PATIENT"] = my_recorder # Use the updated directory recorder fs = FileSet() fs.add('my_instance.dcm') The function should take a single parameter which is the SOP Instance to be added to the File-set as a :class:`~pydicom.dataset.Dataset` and return a :class:`~pydicom.dataset.Dataset` with a single directory record matching the directory record type. See :dcm:`Annex F.3.2.2` for possible record types. For PRIVATE records you must use the :meth:`~pydicom.fileset.FileSet.add_custom` method instead. """ _SINGLE_LEVEL_SOP_CLASSES = { sop.HangingProtocolStorage: "HANGING PROTOCOL", sop.ColorPaletteStorage: "PALETTE", sop.GenericImplantTemplateStorage: "IMPLANT", sop.ImplantAssemblyTemplateStorage: "IMPLANT ASSY", sop.ImplantTemplateGroupStorage: "IMPLANT GROUP", } _FOUR_LEVEL_SOP_CLASSES = { sop.RTDoseStorage: "RT DOSE", sop.RTStructureSetStorage: "RT STRUCTURE SET", sop.RTBeamsTreatmentRecordStorage: "RT TREAT RECORD", sop.RTBrachyTreatmentRecordStorage: "RT TREAT RECORD", sop.RTTreatmentSummaryRecordStorage: "RT TREAT RECORD", sop.RTIonBeamsTreatmentRecordStorage: "RT TREAT RECORD", sop.GrayscaleSoftcopyPresentationStateStorage: "PRESENTATION", sop.ColorSoftcopyPresentationStateStorage: "PRESENTATION", sop.PseudoColorSoftcopyPresentationStateStorage: "PRESENTATION", sop.BlendingSoftcopyPresentationStateStorage: "PRESENTATION", sop.XAXRFGrayscaleSoftcopyPresentationStateStorage: "PRESENTATION", sop.BasicStructuredDisplayStorage: "PRESENTATION", sop.BasicVoiceAudioWaveformStorage: "WAVEFORM", sop.TwelveLeadECGWaveformStorage: "WAVEFORM", sop.GeneralECGWaveformStorage: "WAVEFORM", sop.AmbulatoryECGWaveformStorage: "WAVEFORM", sop.HemodynamicWaveformStorage: "WAVEFORM", sop.CardiacElectrophysiologyWaveformStorage: "WAVEFORM", sop.ArterialPulseWaveformStorage: "WAVEFORM", sop.RespiratoryWaveformStorage: "WAVEFORM", sop.GeneralAudioWaveformStorage: "WAVEFORM", sop.RoutineScalpElectroencephalogramWaveformStorage: "WAVEFORM", sop.ElectromyogramWaveformStorage: "WAVEFORM", sop.ElectrooculogramWaveformStorage: "WAVEFORM", sop.SleepElectroencephalogramWaveformStorage: "WAVEFORM", sop.MultichannelRespiratoryWaveformStorage: "WAVEFORM", sop.BodyPositionWaveformStorage: "WAVEFORM", sop.BasicTextSRStorage: "SR DOCUMENT", sop.EnhancedSRStorage: "SR DOCUMENT", sop.ComprehensiveSRStorage: "SR DOCUMENT", sop.MammographyCADSRStorage: "SR DOCUMENT", sop.ChestCADSRStorage: "SR DOCUMENT", sop.ProcedureLogStorage: "SR DOCUMENT", sop.XRayRadiationDoseSRStorage: "SR DOCUMENT", sop.SpectaclePrescriptionReportStorage: "SR DOCUMENT", sop.ColonCADSRStorage: "SR DOCUMENT", sop.MacularGridThicknessAndVolumeReportStorage: "SR DOCUMENT", sop.ImplantationPlanSRStorage: "SR DOCUMENT", sop.Comprehensive3DSRStorage: "SR DOCUMENT", sop.RadiopharmaceuticalRadiationDoseSRStorage: "SR DOCUMENT", sop.ExtensibleSRStorage: "SR DOCUMENT", sop.AcquisitionContextSRStorage: "SR DOCUMENT", sop.SimplifiedAdultEchoSRStorage: "SR DOCUMENT", sop.PatientRadiationDoseSRStorage: "SR DOCUMENT", sop.PlannedImagingAgentAdministrationSRStorage: "SR DOCUMENT", sop.PerformedImagingAgentAdministrationSRStorage: "SR DOCUMENT", sop.KeyObjectSelectionDocumentStorage: "KEY OBJECT DOC", sop.MRSpectroscopyStorage: "SPECTROSCOPY", sop.RawDataStorage: "RAW DATA", sop.SpatialRegistrationStorage: "REGISTRATION", sop.DeformableSpatialRegistrationStorage: "REGISTRATION", sop.SpatialFiducialsStorage: "FIDUCIAL", sop.RealWorldValueMappingStorage: "VALUE MAP", sop.StereometricRelationshipStorage: "STEREOMETRIC", sop.LensometryMeasurementsStorage: "MEASUREMENT", sop.AutorefractionMeasurementsStorage: "MEASUREMENT", sop.KeratometryMeasurementsStorage: "MEASUREMENT", sop.SubjectiveRefractionMeasurementsStorage: "MEASUREMENT", sop.VisualAcuityMeasurementsStorage: "MEASUREMENT", sop.OphthalmicAxialMeasurementsStorage: "MEASUREMENT", sop.OphthalmicVisualFieldStaticPerimetryMeasurementsStorage: "MEASUREMENT", sop.SurfaceSegmentationStorage: "SURFACE", sop.SurfaceScanMeshStorage: "SURFACE SCAN", sop.SurfaceScanPointCloudStorage: "SURFACE SCAN", sop.TractographyResultsStorage: "TRACT", sop.ContentAssessmentResultsStorage: "ASSESSMENT", } def _single_level_record_type(ds: Dataset) -> str: """Return a single-level *Directory Record Type* for `ds`.""" sop_class = cast(UID | None, getattr(ds, "SOPClassUID", None)) try: return _SINGLE_LEVEL_SOP_CLASSES[sop_class] # type: ignore[index] except KeyError: return "PATIENT" def _four_level_record_type(ds: Dataset) -> str: """Return the fourth-level *Directory Record Type* for `ds`.""" modality = getattr(ds, "Modality", None) if modality in ["RTINTENT", "RTSEGANN", "RTRAD"]: return "RADIOTHERAPY" if modality == "PLAN": return "PLAN" if "EncapsulatedDocument" in ds: return "ENCAP DOC" if "RTPlanLabel" in ds: return "RT PLAN" sop_class = cast(UID | None, getattr(ds, "SOPClassUID", None)) try: return _FOUR_LEVEL_SOP_CLASSES[sop_class] # type: ignore[index] except KeyError: return "IMAGE" pydicom-pydicom-20aa4b7/src/pydicom/fileutil.py000066400000000000000000000446551515706620200216660ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Functions for reading to certain bytes, e.g. delimiters.""" from collections.abc import Generator, Iterator from contextlib import contextmanager from io import BufferedIOBase import os from struct import pack, unpack from typing import BinaryIO, cast from pydicom.misc import size_in_bytes from pydicom.tag import TupleTag, Tag, SequenceDelimiterTag, ItemTag, BaseTag from pydicom.datadict import dictionary_description from pydicom.filebase import ReadableBuffer, WriteableBuffer from pydicom.config import logger, settings PathType = str | bytes | os.PathLike def absorb_delimiter_item( fp: BinaryIO, is_little_endian: bool, delimiter: BaseTag ) -> None: """Read (and ignore) undefined length sequence or item terminators.""" if is_little_endian: struct_format = " int | None: """Read in the file until a specific byte sequence found. Parameters ---------- fp : file-like The file-like to search. bytes_to_find : bytes Contains the bytes to find. Must be in correct endian order already. read_size : int Number of bytes to read at a time. rewind : bool Flag to rewind file reading position. Returns ------- found_at : int or None Position where byte sequence was found, else ``None``. """ data_start = fp.tell() search_rewind = len(bytes_to_find) - 1 found = False eof = False while not found: chunk_start = fp.tell() bytes_read = fp.read(read_size) if len(bytes_read) < read_size: # try again - if still don't get required amount, # this is the last block new_bytes = fp.read(read_size - len(bytes_read)) bytes_read += new_bytes if len(bytes_read) < read_size: eof = True # but will still check whatever we did get index = bytes_read.find(bytes_to_find) if index != -1: found = True elif eof: if rewind: fp.seek(data_start) return None else: # rewind a bit in case delimiter crossed read_size boundary fp.seek(fp.tell() - search_rewind) # if get here then have found the byte string found_at = chunk_start + index if rewind: fp.seek(data_start) else: fp.seek(found_at + len(bytes_to_find)) return found_at def read_undefined_length_value( fp: BinaryIO, is_little_endian: bool, delimiter_tag: BaseTag, defer_size: int | float | None = None, read_size: int = 1024 * 8, ) -> bytes | None: """Read until `delimiter_tag` and return the value up to that point. On completion, the file will be set to the first byte after the delimiter and its following four zero bytes. Parameters ---------- fp : file-like The file-like to read. is_little_endian : bool ``True`` if file transfer syntax is little endian, else ``False``. delimiter_tag : BaseTag Tag used as end marker for reading defer_size : int or None, optional Size to avoid loading large elements in memory. See :func:`~pydicom.filereader.dcmread` for more parameter info. read_size : int, optional Number of bytes to read at one time. Returns ------- delimiter : bytes or None The file delimiter. Raises ------ EOFError If EOF is reached before delimiter found. """ data_start = fp.tell() defer_size = size_in_bytes(defer_size) # It's common for an undefined length value item to be an # encapsulated pixel data as defined in PS3.5 section A.4. # Attempt to parse the data under that assumption, since the method # 1. is proof against coincidental embedded sequence delimiter tags # 2. avoids accumulating any data in memory if the element is large # enough to be deferred # 3. does not double-accumulate data (in chunks and then joined) # # Unfortunately, some implementations deviate from the standard and the # encapsulated pixel data-parsing algorithm fails. In that case, we fall # back to a method of scanning the entire element value for the # sequence delimiter, as was done historically. if delimiter_tag == SequenceDelimiterTag: was_value_found, value = _try_read_encapsulated_pixel_data( fp, is_little_endian, defer_size ) if was_value_found: return value search_rewind = 3 if is_little_endian: bytes_format = b"HH" bytes_to_find = pack(bytes_format, delimiter_tag.group, delimiter_tag.elem) found = False eof = False value_chunks = [] byte_count = 0 # for defer_size checks while not found: chunk_start = fp.tell() bytes_read = fp.read(read_size) if len(bytes_read) < read_size: # try again - if still don't get required amount, # this is the last block new_bytes = fp.read(read_size - len(bytes_read)) bytes_read += new_bytes if len(bytes_read) < read_size: eof = True # but will still check whatever we did get index = bytes_read.find(bytes_to_find) if index != -1: found = True new_bytes = bytes_read[:index] byte_count += len(new_bytes) if defer_size is None or byte_count < defer_size: value_chunks.append(new_bytes) fp.seek(chunk_start + index + 4) # rewind to end of delimiter length = fp.read(4) if length != b"\0\0\0\0": msg = ( "Expected 4 zero bytes after undefined length delimiter" " at pos {0:04x}" ) logger.error(msg.format(fp.tell() - 4)) elif eof: fp.seek(data_start) raise EOFError( f"End of file reached before delimiter {delimiter_tag!r} found" ) else: # rewind a bit in case delimiter crossed read_size boundary fp.seek(fp.tell() - search_rewind) # accumulate the bytes read (not including the rewind) new_bytes = bytes_read[:-search_rewind] byte_count += len(new_bytes) if defer_size is None or byte_count < defer_size: value_chunks.append(new_bytes) # if get here then have found the byte string if defer_size is not None and byte_count >= defer_size: return None else: return b"".join(value_chunks) def _try_read_encapsulated_pixel_data( fp: BinaryIO, is_little_endian: bool, defer_size: float | int | None = None, ) -> tuple[bool, bytes | None]: """Attempt to read an undefined length value item as if it were encapsulated pixel data as defined in PS3.5 section A.4. On success, the file will be set to the first byte after the delimiter and its following four zero bytes. If unsuccessful, the file will be left in its original position. Parameters ---------- fp : file-like The file-like to read. is_little_endian : bool ``True`` if the file transfer syntax is little endian, else ``False``. defer_size : int or None, optional Size to avoid loading large elements in memory. See :func:`~pydicom.filereader.dcmread` for more parameter info. Returns ------- bool, bytes Whether or not the value was parsed properly and, if it was, the value. """ if is_little_endian: tag_format = b"HH" length_format = b">L" sequence_delimiter_bytes = pack( tag_format, SequenceDelimiterTag.group, SequenceDelimiterTag.elem ) item_bytes = pack(tag_format, ItemTag.group, ItemTag.elem) data_start = fp.tell() byte_count = 0 while True: tag_bytes = fp.read(4) if len(tag_bytes) < 4: # End of file reached while scanning. # Maybe the sequence delimiter is missing or or maybe we read past # it due to an inaccurate length indicator for an element logger.debug( "End of input encountered while parsing undefined length " "value as encapsulated pixel data. Unable to find tag at " "position 0x%x. Falling back to byte by byte scan.", fp.tell() - len(tag_bytes), ) fp.seek(data_start) return (False, None) byte_count += 4 if tag_bytes == sequence_delimiter_bytes: break if tag_bytes == item_bytes: length_bytes = fp.read(4) if len(length_bytes) < 4: # End of file reached while scanning. # Maybe the sequence delimiter is missing or or maybe we read # past it due to an inaccurate length indicator for an element logger.debug( "End of input encountered while parsing undefined length " "value as encapsulated pixel data. Unable to find length " "for tag %s at position 0x%x. Falling back to byte by " "byte scan.", ItemTag, fp.tell() - len(length_bytes), ) fp.seek(data_start) return (False, None) byte_count += 4 length = unpack(length_format, length_bytes)[0] try: fp.seek(length, os.SEEK_CUR) except OverflowError: logger.debug( "Too-long length %04x for tag %s at position 0x%x found " "while parsing undefined length value as encapsulated " "pixel data. Falling back to byte-by-byte scan.", length, ItemTag, fp.tell() - 8, ) fp.seek(data_start) return (False, None) byte_count += length else: logger.debug( "Unknown tag bytes %s at position 0x%x found " "while parsing undefined length value as encapsulated " "pixel data. Falling back to byte-by-byte scan.", tag_bytes.hex(), fp.tell() - 4, ) fp.seek(data_start) return (False, None) length = fp.read(4) if length != b"\0\0\0\0": msg = "Expected 4 zero bytes after undefined length delimiter at pos {0:04x}" logger.debug(msg.format(fp.tell() - 4)) if defer_size is not None and defer_size <= byte_count: value = None else: fp.seek(data_start) value = fp.read(byte_count - 4) fp.seek(data_start + byte_count + 4) return (True, value) def find_delimiter( fp: BinaryIO, delimiter: BaseTag, is_little_endian: bool, read_size: int = 128, rewind: bool = True, ) -> int | None: """Return file position where 4-byte delimiter is located. Parameters ---------- delimiter : int The delimiter to search for. is_little_endian : bool ``True`` if little endian, ``False`` otherwise. read_size : int See :func:`find_bytes` for parameter info. rewind : bool Flag to rewind to initial position after searching. Returns ------- int or None Returns ``None`` if end of file is reached without finding the delimiter, otherwise the byte offset to the delimiter. """ struct_format = " int | None: """Search through the file to find the delimiter and return the length of the data element. Parameters ---------- fp : file-like The file-like to read. delimiter : See :func:`find_delimiter` for parameter info. is_little_endian : bool ``True`` if little endian, ``False`` otherwise. read_size : int See :func:`find_bytes` for parameter info. rewind : bool Flag to rewind to initial position after searching. Returns ------- int Byte offset to the delimiter. Notes ----- Note the data element that the delimiter starts is not read here, the calling routine must handle that. Delimiter must be 4 bytes long. """ data_start = fp.tell() delimiter_pos = find_delimiter(fp, delimiter, is_little_endian, rewind=rewind) if delimiter_pos is not None: return delimiter_pos - data_start return None def path_from_pathlike( file_object: PathType | BinaryIO | ReadableBuffer | WriteableBuffer, ) -> str | BinaryIO: """Returns the path if `file_object` is a path-like object, otherwise the original `file_object`. Parameters ---------- file_object: str or PathLike or file-like Returns ------- str or file-like the string representation of the given path object, or the object itself in case of an object not representing a path. """ try: return os.fspath(file_object) # type: ignore[arg-type] except TypeError: return cast(BinaryIO, file_object) def _unpack_tag(b: bytes, endianness: str) -> BaseTag: return TupleTag(cast(tuple[int, int], unpack(f"{endianness}HH", b))) def check_buffer(buffer: BufferedIOBase) -> None: """Raise an exception if `buffer` is not usable as an element value. Parameters ---------- buffer : io.BufferedIOBase The buffer to check, must be :meth:`~io.IOBase.readable`, :meth:`~io.IOBase.seekable` and not be :attr:`io.IOBase.closed`. """ if not isinstance(buffer, BufferedIOBase): raise TypeError("the buffer must inherit from 'io.BufferedIOBase'") if buffer.closed: raise ValueError("the buffer has been closed") # readable() covers read(), seekable() covers seek() and tell() if not buffer.readable() or not buffer.seekable(): raise ValueError("the buffer must be readable and seekable") @contextmanager def reset_buffer_position(buffer: BufferedIOBase) -> Generator[int, None, None]: """Yields the initial position of the buffer and return to that position on exiting the context. Parameters ---------- buffer : io.BufferedIOBase The buffer to use. Yields ------ int The initial position of the buffer. """ check_buffer(buffer) initial_offset = buffer.tell() yield initial_offset buffer.seek(initial_offset) def read_buffer( buffer: BufferedIOBase, *, chunk_size: int | None = None ) -> Iterator[bytes]: """Read data from `buffer`. The buffer is NOT returned to its starting position. Parameters ---------- buffer : io.BufferedIOBase The buffer to read from. chunk_size : int, optional The amount of bytes to read per iteration (default 8192). Fewer bytes may be yielded if there is insufficient remaining data in `buffer`. Yields ------- bytes Data read from the buffer of length up to the specified chunk_size. """ chunk_size = settings.buffered_read_size if chunk_size is None else chunk_size if chunk_size <= 0: raise ValueError( f"Invalid 'chunk_size' value '{chunk_size}', must be greater than 0" ) check_buffer(buffer) while chunk := buffer.read(chunk_size): if chunk: yield chunk def buffer_length(buffer: BufferedIOBase) -> int: """Return the total length of the buffer. Parameters ---------- buffer : io.BufferedIOBase The buffer to return the remaining length for. Returns ------- int The total length of the buffer. """ with reset_buffer_position(buffer): return buffer.seek(0, os.SEEK_END) def buffer_remaining(buffer: BufferedIOBase) -> int: """Return the remaining length of the buffer with respect to the current position. Parameters ---------- buffer : io.BufferedIOBase The buffer to return the remaining length for. Returns ------- int The remaining length of the buffer from the current position. """ with reset_buffer_position(buffer) as current_offset: return buffer.seek(0, os.SEEK_END) - current_offset def buffer_equality( buffer: BufferedIOBase, other: bytes | bytearray | BufferedIOBase, ) -> bool: """Return ``True`` if `buffer` and `other` are equal, ``False`` otherwise.""" if not isinstance(other, bytes | bytearray | BufferedIOBase): return False # Avoid reading the entire buffer object into memory with reset_buffer_position(buffer): buffer.seek(0) if isinstance(other, bytes | bytearray): start = 0 for data in read_buffer(buffer): nr_read = len(data) if other[start : start + nr_read] != data: return False start += nr_read return len(other) == start if buffer_length(buffer) != buffer_length(other): return False with reset_buffer_position(other): other.seek(0) for data_a, data_b in zip(read_buffer(buffer), read_buffer(other)): if data_a != data_b: return False return True pydicom-pydicom-20aa4b7/src/pydicom/filewriter.py000066400000000000000000001502461515706620200222170ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Functions related to writing DICOM data.""" from collections.abc import Sequence, MutableSequence, Iterable from copy import deepcopy from io import BufferedIOBase from struct import pack from typing import BinaryIO, Any, cast from collections.abc import Callable import zlib from pydicom import config from pydicom.charset import default_encoding, convert_encodings, encode_string from pydicom.dataelem import ( convert_raw_data_element, DataElement, RawDataElement, ) from pydicom.dataset import Dataset, validate_file_meta, FileMetaDataset from pydicom.filebase import DicomFile, DicomBytesIO, DicomIO, WriteableBuffer from pydicom.fileutil import ( path_from_pathlike, PathType, buffer_remaining, read_buffer, reset_buffer_position, ) from pydicom.misc import warn_and_log from pydicom.multival import MultiValue from pydicom.tag import ( Tag, BaseTag, ItemTag, ItemDelimiterTag, SequenceDelimiterTag, tag_in_exception, _LUT_DESCRIPTOR_TAGS, ) from pydicom.uid import ( DeflatedExplicitVRLittleEndian, UID, ImplicitVRLittleEndian, ExplicitVRBigEndian, ) from pydicom.valuerep import ( PersonName, IS, DSclass, DA, DT, TM, EXPLICIT_VR_LENGTH_32, VR, AMBIGUOUS_VR, CUSTOMIZABLE_CHARSET_VR, ) from pydicom.values import convert_numbers if config.have_numpy: import numpy # Ambiguous VR Correction # (0018,9810) Zero Velocity Pixel Value # (0022,1452) Mapped Pixel Value # (0028,0104)/(0028,0105) Smallest/Largest Valid Pixel Value # (0028,0106)/(0028,0107) Smallest/Largest Image Pixel Value # (0028,0108)/(0028,0109) Smallest/Largest Pixel Value in Series # (0028,0110)/(0028,0111) Smallest/Largest Image Pixel Value in Plane # (0028,0120) Pixel Padding Value # (0028,0121) Pixel Padding Range Limit # (0028,1101-1103) Red/Green/Blue Palette Color Lookup Table Descriptor # (0028,3002) LUT Descriptor # (0040,9216)/(0040,9211) Real World Value First/Last Value Mapped # (0060,3004)/(0060,3006) Histogram First/Last Bin Value _AMBIGUOUS_US_SS_TAGS = { 0x00189810, 0x00221452, 0x00280104, 0x00280105, 0x00280106, 0x00280107, 0x00280108, 0x00280109, 0x00280110, 0x00280111, 0x00280120, 0x00280121, 0x00281101, 0x00281102, 0x00281103, 0x00283002, 0x00409211, 0x00409216, 0x00603004, 0x00603006, } # (5400,0110) Channel Minimum Value # (5400,0112) Channel Maximum Value # (5400,100A) Waveform Padding Data # (5400,1010) Waveform Data _AMBIGUOUS_OB_OW_TAGS = {0x54000110, 0x54000112, 0x5400100A, 0x54001010} # (60xx,3000) Overlay Data _OVERLAY_DATA_TAGS = {x << 16 | 0x3000 for x in range(0x6000, 0x601F, 2)} def _correct_ambiguous_vr_element( elem: DataElement, ancestors: list[Dataset], is_little_endian: bool, ) -> DataElement: """Implementation for `correct_ambiguous_vr_element`. See `correct_ambiguous_vr_element` for description. """ # The zeroth dataset is the nearest, the last is the root dataset ds = ancestors[0] # 'OB or OW': 7fe0,0010 PixelData if elem.tag == 0x7FE00010: # Compressed Pixel Data # PS3.5 Annex A.4 # If encapsulated, VR is OB and length is undefined if elem.is_undefined_length: elem.VR = VR.OB elif ds.original_encoding[0]: # Non-compressed Pixel Data - Implicit Little Endian # PS3.5 Annex A1: VR is always OW elem.VR = VR.OW else: # Non-compressed Pixel Data - Explicit VR # PS3.5 Annex A.2: # If BitsAllocated is > 8 then VR shall be OW, # else may be OB or OW. # If we get here, the data has not been written before # or has been converted from Implicit Little Endian, # so we default to OB for BitsAllocated 1 or 8 elem.VR = VR.OW if cast(int, ds.BitsAllocated) > 8 else VR.OB # 'US or SS' and dependent on PixelRepresentation elif elem.tag in _AMBIGUOUS_US_SS_TAGS: # US if PixelRepresentation value is 0x0000, else SS # For references, see the list at # https://github.com/pydicom/pydicom/pull/298 # PixelRepresentation is usually set in the root dataset # If correcting during write, or after implicit read when the # element is on the same level as pixel representation pixel_rep = next( ( cast(int, x.PixelRepresentation) for x in ancestors if getattr(x, "PixelRepresentation", None) is not None ), None, ) if pixel_rep is None: # If correcting after implicit read when the element isn't # on the same level as pixel representation pixel_rep = next( (x._pixel_rep for x in ancestors if hasattr(x, "_pixel_rep")), None, ) if pixel_rep is None: # If no pixel data is present, none if these tags is used, # so we can just ignore a missing PixelRepresentation in this case pixel_rep = 1 if ( "PixelRepresentation" not in ds and "PixelData" not in ds or ds.PixelRepresentation == 0 ): pixel_rep = 0 elem.VR = VR.US if pixel_rep == 0 else VR.SS byte_type = "H" if pixel_rep == 0 else "h" if elem.VM == 0: return elem # Need to handle type check for elements with VM > 1 elem_value = elem.value if elem.VM == 1 else cast(Sequence[Any], elem.value)[0] if not isinstance(elem_value, int): elem.value = convert_numbers( cast(bytes, elem.value), is_little_endian, byte_type ) # 'OB or OW' and dependent on WaveformBitsAllocated elif elem.tag in _AMBIGUOUS_OB_OW_TAGS: # If WaveformBitsAllocated is > 8 then OW, otherwise may be # OB or OW. # See PS3.3 C.10.9.1. if ds.original_encoding[0]: elem.VR = VR.OW else: elem.VR = VR.OW if cast(int, ds.WaveformBitsAllocated) > 8 else VR.OB # 'US or OW': 0028,3006 LUTData elif elem.tag == 0x00283006: # First value in LUT Descriptor is how many values in # LUTData, if there's only one value then must be US # As per PS3.3 C.11.1.1.1 if cast(Sequence[int], ds.LUTDescriptor)[0] == 1: elem.VR = VR.US if elem.VM == 0: return elem elem_value = ( elem.value if elem.VM == 1 else cast(Sequence[Any], elem.value)[0] ) if not isinstance(elem_value, int): elem.value = convert_numbers( cast(bytes, elem.value), is_little_endian, "H" ) else: elem.VR = VR.OW # 'OB or OW': 60xx,3000 OverlayData and dependent on Transfer Syntax elif elem.tag in _OVERLAY_DATA_TAGS: # Implicit VR must be OW, explicit VR may be OB or OW # as per PS3.5 Section 8.1.2 and Annex A elem.VR = VR.OW return elem def correct_ambiguous_vr_element( elem: DataElement | RawDataElement, ds: Dataset, is_little_endian: bool, ancestors: list[Dataset] | None = None, ) -> DataElement | RawDataElement: """Attempt to correct the ambiguous VR element `elem`. When it's not possible to correct the VR, the element will be returned unchanged. Currently the only ambiguous VR elements not corrected for are all retired or part of DICONDE. If the VR is corrected and is 'US' or 'SS' then the value will be updated using the :func:`~pydicom.values.convert_numbers` function. .. versionchanged:: 3.0 The `ancestors` keyword argument was added. Parameters ---------- elem : dataelem.DataElement or dataelem.RawDataElement The element with an ambiguous VR. ds : dataset.Dataset The dataset containing `elem`. is_little_endian : bool The byte ordering of the values in the dataset. ancestors : list[pydicom.dataset.Dataset] | None A list of the ancestor datasets to look through when trying to find the relevant element value to use in VR correction. Should be ordered from closest to furthest. If ``None`` then will build itself automatically starting at `ds` (default). Returns ------- dataelem.DataElement or dataelem.RawDataElement The corrected element """ ancestors = [ds] if ancestors is None else ancestors if elem.VR in AMBIGUOUS_VR: # convert raw data elements before handling them if isinstance(elem, RawDataElement): elem = convert_raw_data_element(elem, ds=ds) ds.__setitem__(elem.tag, elem) try: _correct_ambiguous_vr_element(elem, ancestors, is_little_endian) except AttributeError as e: raise AttributeError( f"Failed to resolve ambiguous VR for tag {elem.tag}: {e}" ) return elem def correct_ambiguous_vr( ds: Dataset, is_little_endian: bool, ancestors: list[Dataset] | None = None, ) -> Dataset: """Iterate through `ds` correcting ambiguous VR elements (if possible). When it's not possible to correct the VR, the element will be returned unchanged. Currently the only ambiguous VR elements not corrected for are all retired or part of DICONDE. If the VR is corrected and is 'US' or 'SS' then the value will be updated using the :func:`~pydicom.values.convert_numbers` function. .. versionchanged:: 3.0 The `ancestors` keyword argument was added. Parameters ---------- ds : pydicom.dataset.Dataset The dataset containing ambiguous VR elements. is_little_endian : bool The byte ordering of the values in the dataset. ancestors : list[pydicom.dataset.Dataset] | None A list of the ancestor datasets to look through when trying to find the relevant element value to use in VR correction. Should be ordered from closest to furthest. If ``None`` then will build itself automatically starting at `ds` (default). Returns ------- ds : dataset.Dataset The corrected dataset Raises ------ AttributeError If a tag is missing in `ds` that is required to resolve the ambiguity. """ # Construct the tree if `ds` is the root level dataset # tree = Tree(ds) if tree is None else tree ancestors = [ds] if ancestors is None else ancestors # Iterate through the elements for elem in ds.elements(): # raw data element sequences can be written as they are, because we # have ensured that the transfer syntax has not changed at this point if elem.VR == VR.SQ: elem = ds[elem.tag] for item in cast(MutableSequence["Dataset"], elem.value): ancestors.insert(0, item) correct_ambiguous_vr(item, is_little_endian, ancestors) elif elem.VR in AMBIGUOUS_VR: correct_ambiguous_vr_element(elem, ds, is_little_endian, ancestors) del ancestors[0] return ds def write_numbers(fp: DicomIO, elem: DataElement, struct_format: str) -> None: """Write a "value" of type struct_format from the dicom file. "Value" can be more than one number. Parameters ---------- fp : file-like The file-like to write the encoded data to. elem : dataelem.DataElement The element to encode. struct_format : str The character format as used by the struct module. """ value = elem.value if value is None or value == "": return # don't need to write anything for no or empty value endianChar = "><"[fp.is_little_endian] format_string = endianChar + struct_format try: try: # works only if list, not if string or number value.append except AttributeError: # is a single value - the usual case fp.write(pack(format_string, value)) else: # Some ambiguous VR elements ignore the VR for part of the value # e.g. LUT Descriptor is 'US or SS' and VM 3, but the first and # third values are always US (the third should be <= 16, so SS is OK) if struct_format == "h" and elem.tag in _LUT_DESCRIPTOR_TAGS and value: fp.write(pack(f"{endianChar}H", value[0])) value = value[1:] fp.write(pack(f"{endianChar}{len(value)}{struct_format}", *value)) except Exception as exc: raise OSError(f"{exc}\nfor data_element:\n{elem}") def write_OBvalue(fp: DicomIO, elem: DataElement) -> None: """Write a data_element with VR of 'other byte' (OB).""" if elem.is_buffered: bytes_written = 0 buffer = cast(BufferedIOBase, elem.value) with reset_buffer_position(buffer): for chunk in read_buffer(buffer): bytes_written += fp.write(chunk) else: bytes_written = fp.write(cast(bytes, elem.value)) if bytes_written % 2: fp.write(b"\x00") def write_OWvalue(fp: DicomIO, elem: DataElement) -> None: """Write a data_element with VR of 'other word' (OW). Note: This **does not currently do the byte swapping** for Endian state. """ if elem.is_buffered: bytes_written = 0 buffer = cast(BufferedIOBase, elem.value) with reset_buffer_position(buffer): for chunk in read_buffer(buffer): bytes_written += fp.write(chunk) else: bytes_written = fp.write(cast(bytes, elem.value)) if bytes_written % 2: fp.write(b"\x00") def write_UI(fp: DicomIO, elem: DataElement) -> None: """Write a data_element with VR of 'unique identifier' (UI).""" write_string(fp, elem, "\0") # pad with 0-byte to even length def _is_multi_value(val: Any) -> bool: """Return True if `val` is a multi-value container.""" if config.have_numpy and isinstance(val, numpy.ndarray): return True return isinstance(val, MultiValue | list | tuple) def multi_string(val: str | Iterable[str]) -> str: """Put a string together with delimiter if has more than one value""" if _is_multi_value(val): return "\\".join(val) return cast(str, val) def write_PN( fp: DicomIO, elem: DataElement, encodings: list[str] | None = None ) -> None: if not encodings: encodings = [default_encoding] val: list[PersonName] if elem.VM == 1: val = [cast(PersonName, elem.value)] else: val = cast(list[PersonName], elem.value) enc = b"\\".join([elem.encode(encodings) for elem in val]) if len(enc) % 2 != 0: enc += b" " fp.write(enc) def write_string(fp: DicomIO, elem: DataElement, padding: str = " ") -> None: """Write a single or multivalued ASCII string.""" val = multi_string(cast(str | Iterable[str], elem.value)) if val is not None: if len(val) % 2 != 0: val += padding # pad to even length if isinstance(val, str): val = val.encode(default_encoding) # type: ignore[assignment] fp.write(val) # type: ignore[arg-type] def write_text( fp: DicomIO, elem: DataElement, encodings: list[str] | None = None ) -> None: """Write a single or multivalued text string.""" encodings = encodings or [default_encoding] val = elem.value if val is not None: if _is_multi_value(val): val = cast(Sequence[bytes] | Sequence[str], val) if isinstance(val[0], str): val = cast(Sequence[str], val) val = b"\\".join([encode_string(val, encodings) for val in val]) else: val = cast(Sequence[bytes], val) val = b"\\".join([val for val in val]) else: val = cast(bytes | str, val) if isinstance(val, str): val = encode_string(val, encodings) if len(val) % 2 != 0: val = val + b" " # pad to even length fp.write(val) def write_number_string(fp: DicomIO, elem: DataElement) -> None: """Handle IS or DS VR - write a number stored as a string of digits.""" # If the DS or IS has an original_string attribute, use that, so that # unchanged data elements are written with exact string as when read from # file val = elem.value if _is_multi_value(val): val = cast(Sequence[IS] | Sequence[DSclass], val) val = "\\".join( x.original_string if hasattr(x, "original_string") else str(x) for x in val ) else: val = cast(IS | DSclass, val) if hasattr(val, "original_string"): val = val.original_string else: val = str(val) if len(val) % 2 != 0: val = val + " " # pad to even length val = bytes(val, default_encoding) fp.write(val) def _format_DA(val: DA | None) -> str: if val is None: return "" if hasattr(val, "original_string"): return val.original_string return val.strftime("%Y%m%d") def write_DA(fp: DicomIO, elem: DataElement) -> None: val = elem.value if isinstance(val, str): write_string(fp, elem) else: if _is_multi_value(val): val = cast(Sequence[DA], val) val = "\\".join(x if isinstance(x, str) else _format_DA(x) for x in val) else: val = _format_DA(cast(DA, val)) if len(val) % 2 != 0: val = val + " " # pad to even length if isinstance(val, str): val = val.encode(default_encoding) fp.write(val) def _format_DT(val: DT | None) -> str: if val is None: return "" if hasattr(val, "original_string"): return val.original_string if val.microsecond > 0: return val.strftime("%Y%m%d%H%M%S.%f%z") return val.strftime("%Y%m%d%H%M%S%z") def write_DT(fp: DicomIO, elem: DataElement) -> None: val = elem.value if isinstance(val, str): write_string(fp, elem) else: if _is_multi_value(val): val = cast(Sequence[DT], val) val = "\\".join(x if isinstance(x, str) else _format_DT(x) for x in val) else: val = _format_DT(cast(DT, val)) if len(val) % 2 != 0: val = val + " " # pad to even length if isinstance(val, str): val = val.encode(default_encoding) fp.write(val) def _format_TM(val: TM | None) -> str: if val is None: return "" if hasattr(val, "original_string"): return val.original_string if val.microsecond > 0: return val.strftime("%H%M%S.%f") return val.strftime("%H%M%S") def write_TM(fp: DicomIO, elem: DataElement) -> None: val = elem.value if isinstance(val, str): write_string(fp, elem) else: if _is_multi_value(val): val = cast(Sequence[TM], val) val = "\\".join(x if isinstance(x, str) else _format_TM(x) for x in val) else: val = _format_TM(cast(TM, val)) if len(val) % 2 != 0: val = val + " " # pad to even length if isinstance(val, str): val = val.encode(default_encoding) fp.write(val) def write_data_element( fp: DicomIO, elem: DataElement | RawDataElement, encodings: str | list[str] | None = None, ) -> None: """Write the data_element to file fp according to dicom media storage rules. """ # Write element's tag fp.write_tag(elem.tag) # write into a buffer to avoid seeking back which can be expansive buffer = DicomBytesIO() buffer.is_little_endian = fp.is_little_endian buffer.is_implicit_VR = fp.is_implicit_VR vr: str | None = elem.VR if not fp.is_implicit_VR and vr and len(vr) != 2: msg = ( f"Cannot write ambiguous VR of '{vr}' for data element with " f"tag {elem.tag!r}.\nSet the correct VR before " f"writing, or use an implicit VR transfer syntax" ) raise ValueError(msg) if elem.is_raw: elem = cast(RawDataElement, elem) # raw data element values can be written as they are buffer.write(cast(bytes, elem.value)) is_undefined_length = elem.length == 0xFFFFFFFF else: elem = cast(DataElement, elem) if vr not in writers: raise NotImplementedError( f"write_data_element: unknown Value Representation '{vr}'" ) encodings = encodings or [default_encoding] encodings = convert_encodings(encodings) fn, param = writers[cast(VR, vr)] is_undefined_length = elem.is_undefined_length if not elem.is_empty: if vr in CUSTOMIZABLE_CHARSET_VR or vr == VR.SQ: fn(buffer, elem, encodings=encodings) # type: ignore[operator] else: # Many numeric types use the same writer but with # numeric format parameter if param is not None: fn(buffer, elem, param) # type: ignore[operator] elif not elem.is_buffered: # defer writing a buffered value until after we have written the # tag and length in the file fn(buffer, elem) # type: ignore[operator] # valid pixel data with undefined length shall contain encapsulated # data, e.g. sequence items - raise ValueError otherwise (see #238) if is_undefined_length and elem.tag == 0x7FE00010: if elem.is_buffered: value = cast(BufferedIOBase, elem.value) with reset_buffer_position(value): pixel_data_bytes = value.read(4) else: pixel_data_bytes = cast(bytes, elem.value)[:4] # Big endian encapsulation is non-conformant tag = b"\xFE\xFF\x00\xE0" if fp.is_little_endian else b"\xFF\xFE\xE0\x00" if not pixel_data_bytes.startswith(tag): raise ValueError( "The (7FE0,0010) 'Pixel Data' element value hasn't been " "encapsulated as required for a compressed transfer syntax - " "see pydicom.encaps.encapsulate() for more information" ) value_length = ( buffer.tell() if not elem.is_buffered else buffer_remaining(cast(BufferedIOBase, elem.value)) ) if ( not fp.is_implicit_VR and vr not in EXPLICIT_VR_LENGTH_32 and not is_undefined_length and value_length > 0xFFFF ): # see PS 3.5, section 6.2.2 for handling of this case warn_and_log( f"The value for the data element {elem.tag} exceeds the " f"size of 64 kByte and cannot be written in an explicit transfer " f"syntax. The data element VR is changed from '{vr}' to 'UN' " f"to allow saving the data." ) vr = VR.UN # write the VR for explicit transfer syntax if not fp.is_implicit_VR: vr = cast(str, vr) fp.write(bytes(vr, default_encoding)) if vr in EXPLICIT_VR_LENGTH_32: fp.write_US(0) # reserved 2 bytes if ( not fp.is_implicit_VR and vr not in EXPLICIT_VR_LENGTH_32 and not is_undefined_length ): fp.write_US(value_length) # Explicit VR length field is 2 bytes else: # write the proper length of the data_element in the length slot, # unless is SQ with undefined length. fp.write_UL(0xFFFFFFFF if is_undefined_length else value_length) # if the value is buffered, now we want to write the value directly to the fp if elem.is_buffered: fn(fp, elem) # type: ignore[operator] else: fp.write(buffer.getvalue()) if is_undefined_length: fp.write_tag(SequenceDelimiterTag) fp.write_UL(0) # 4-byte 'length' of delimiter data item EncodingType = tuple[bool | None, bool | None] def write_dataset( fp: DicomIO, dataset: Dataset, parent_encoding: str | list[str] = default_encoding ) -> int: """Encode `dataset` and write the encoded data to `fp`. *Encoding* The `dataset` is encoded as specified by (in order of priority): * ``fp.is_implicit_VR`` and ``fp.is_little_endian``. * ``dataset.is_implicit_VR`` and ``dataset.is_little_endian`` * If `dataset` has been decoded from a file or buffer then :attr:`~pydicom.dataset.Dataset.original_encoding`. Parameters ---------- fp : pydicom.filebase.DicomIO The file-like to write the encoded dataset to. dataset : pydicom.dataset.Dataset The dataset to be encoded. parent_encoding : str | List[str], optional The character set to use for encoding strings, defaults to ``"iso8859"``. Returns ------- int The number of bytes written to `fp`. """ # TODO: Update in v4.0 # In order of encoding priority fp_encoding: EncodingType = ( getattr(fp, "_implicit_vr", None), getattr(fp, "_little_endian", None), ) ds_encoding: EncodingType = (None, None) if not config._use_future: ds_encoding = (dataset.is_implicit_VR, dataset.is_little_endian) or_encoding = dataset.original_encoding if None in fp_encoding and None in ds_encoding and None in or_encoding: raise AttributeError( "'fp.is_implicit_VR' and 'fp.is_little_endian' attributes are required " ) if None in fp_encoding: if None not in ds_encoding: fp_encoding = ds_encoding elif None not in or_encoding: fp_encoding = or_encoding fp.is_implicit_VR, fp.is_little_endian = cast(tuple[bool, bool], fp_encoding) get_item: Callable[[BaseTag], DataElement | RawDataElement] = dataset.get_item # This function is doing some heavy lifting: # If implicit -> explicit, runs ambiguous VR correction # If implicit -> explicit, RawDataElements -> DataElement (VR lookup) # If charset changed, RawDataElements -> DataElement if ( fp_encoding != or_encoding or dataset.original_character_set != dataset._character_set ): dataset = correct_ambiguous_vr(dataset, fp.is_little_endian) # Use __getitem__ instead or get_item to force parsing of RawDataElements into DataElements, # so we can re-encode them with the correct charset and encoding get_item = dataset.__getitem__ dataset_encoding = cast( None | str | list[str], dataset.get("SpecificCharacterSet", parent_encoding) ) fpStart = fp.tell() # data_elements must be written in tag order for tag in sorted(dataset.keys()): # do not write retired Group Length (see PS3.5, 7.2) if tag.element == 0 and tag.group > 6: continue with tag_in_exception(tag): write_data_element(fp, get_item(tag), dataset_encoding) return fp.tell() - fpStart def write_sequence(fp: DicomIO, elem: DataElement, encodings: list[str]) -> None: """Write a sequence contained in `data_element` to the file-like `fp`. Parameters ---------- fp : file-like The file-like to write the encoded data to. data_element : dataelem.DataElement The sequence element to write to `fp`. encodings : list of str The character encodings to use on text values. """ # write_data_element has already written the VR='SQ' (if needed) and # a placeholder for length""" for ds in cast(Iterable[Dataset], elem.value): write_sequence_item(fp, ds, encodings) def write_sequence_item(fp: DicomIO, dataset: Dataset, encodings: list[str]) -> None: """Write a `dataset` in a sequence to the file-like `fp`. This is similar to writing a data_element, but with a specific tag for Sequence Item. See DICOM Standard, Part 5, :dcm:`Section 7.5`. Parameters ---------- fp : file-like The file-like to write the encoded data to. dataset : Dataset The :class:`Dataset` to write to `fp`. encodings : list of str The character encodings to use on text values. """ fp.write_tag(ItemTag) # marker for start of Sequence Item length_location = fp.tell() # save location for later. # will fill in real value later if not undefined length fp.write_UL(0xFFFFFFFF) write_dataset(fp, dataset, parent_encoding=encodings) if getattr(dataset, "is_undefined_length_sequence_item", False): fp.write_tag(ItemDelimiterTag) fp.write_UL(0) # 4-bytes 'length' field for delimiter item else: # we will be nice and set the lengths for the reader of this file location = fp.tell() fp.seek(length_location) fp.write_UL(location - length_location - 4) # 4 is length of UL fp.seek(location) # ready for next data_element def write_UN(fp: DicomIO, elem: DataElement) -> None: """Write a byte string for an DataElement of value 'UN' (unknown).""" fp.write(cast(bytes, elem.value)) def write_ATvalue(fp: DicomIO, elem: DataElement) -> None: """Write a data_element tag to a file.""" try: iter(cast(Sequence[Any], elem.value)) # see if is multi-valued AT; # Note will fail if Tag ever derived from true tuple rather than being # a long except TypeError: # make sure is expressed as a Tag instance tag = Tag(cast(int, elem.value)) fp.write_tag(tag) else: tags = [Tag(tag) for tag in cast(Sequence[int], elem.value)] for tag in tags: fp.write_tag(tag) def write_file_meta_info( fp: DicomIO, file_meta: FileMetaDataset, enforce_standard: bool = True ) -> None: """Write the File Meta Information elements in `file_meta` to `fp`. If `enforce_standard` is ``True`` then the file-like `fp` should be positioned past the 128 byte preamble + 4 byte prefix (which should already have been written). **DICOM File Meta Information Group Elements** From the DICOM standard, Part 10, :dcm:`Section 7.1`, any DICOM file shall contain a 128-byte preamble, a 4-byte DICOM prefix 'DICM' and (at a minimum) the following Type 1 DICOM Elements (from :dcm:`Table 7.1-1`): * (0002,0000) *File Meta Information Group Length*, UL, 4 * (0002,0001) *File Meta Information Version*, OB, 2 * (0002,0002) *Media Storage SOP Class UID*, UI, N * (0002,0003) *Media Storage SOP Instance UID*, UI, N * (0002,0010) *Transfer Syntax UID*, UI, N * (0002,0012) *Implementation Class UID*, UI, N If `enforce_standard` is ``True`` then (0002,0000) will be added/updated, (0002,0001) and (0002,0012) will be added if not already present and the other required elements will be checked to see if they exist. If `enforce_standard` is ``False`` then `file_meta` will be written as is after minimal validation checking. The following Type 3/1C Elements may also be present: * (0002,0013) *Implementation Version Name*, SH, N * (0002,0016) *Source Application Entity Title*, AE, N * (0002,0017) *Sending Application Entity Title*, AE, N * (0002,0018) *Receiving Application Entity Title*, AE, N * (0002,0102) *Private Information*, OB, N * (0002,0100) *Private Information Creator UID*, UI, N If `enforce_standard` is ``True`` then (0002,0013) will be added/updated. *Encoding* The encoding of the *File Meta Information* shall be *Explicit VR Little Endian*. Parameters ---------- fp : file-like The file-like to write the File Meta Information to. file_meta : pydicom.dataset.Dataset The File Meta Information elements. enforce_standard : bool If ``False``, then only the *File Meta Information* elements already in `file_meta` will be written to `fp`. If ``True`` (default) then a DICOM Standards conformant File Meta will be written to `fp`. Raises ------ ValueError If `enforce_standard` is ``True`` and any of the required *File Meta Information* elements are missing from `file_meta`, with the exception of (0002,0000), (0002,0001) and (0002,0012). ValueError If any non-Group 2 Elements are present in `file_meta`. """ validate_file_meta(file_meta, enforce_standard) if enforce_standard and "FileMetaInformationGroupLength" not in file_meta: # Will be updated with the actual length later file_meta.FileMetaInformationGroupLength = 0 # Write the File Meta Information Group elements # first write into a buffer to avoid seeking back, that can be # expansive and is not allowed if writing into a zip file buffer = DicomBytesIO() buffer.is_little_endian = True buffer.is_implicit_VR = False write_dataset(buffer, file_meta) # If FileMetaInformationGroupLength is present it will be the first written # element and we must update its value to the correct length. if "FileMetaInformationGroupLength" in file_meta: # Update the FileMetaInformationGroupLength value, which is the number # of bytes from the end of the FileMetaInformationGroupLength element # to the end of all the File Meta Information elements. # FileMetaInformationGroupLength has a VR of 'UL' and so has a value # that is 4 bytes fixed. The total length of when encoded as # Explicit VR must therefore be 12 bytes. file_meta.FileMetaInformationGroupLength = buffer.tell() - 12 buffer.seek(0) write_data_element(buffer, file_meta[0x00020000]) fp.write(buffer.getvalue()) def _determine_encoding( ds: Dataset, tsyntax: UID | None, implicit_vr: bool | None, little_endian: bool | None, force_encoding: bool, ) -> tuple[bool, bool]: """Return the encoding to use for `ds`. If `force_encoding` isn't ``True`` the priority is: 1. The encoding corresponding to `tsyntax` 2. The encoding set by `implicit_vr` and `little_endian` 3. `Dataset.is_implicit_VR` and `Dataset.is_little_endian` 4. `Dataset.original_encoding` If none of those are valid, raise an exception. If `force_encoding` is ``True`` then `implicit_vr` and `little_endian` are required. Parameters ---------- ds : pydicom.dataset.Dataset The dataset that is to be encoded. tsyntax : pydicom.uid.UID | None The dataset's public or private transfer syntax (if any). Private transfer syntaxes require `implicit_vr` and `little_endian` be used. implicit_vr : bool | None The VR encoding method (if supplied) little_endian : bool | None The encoding endianness (if supplied). force_encoding : bool If ``True`` then force the encoding to use `implicit_vr` and `little_endian`. Default ``False``. Returns ------- tuple[bool, bool] The encoding to use as ``[use implicit VR, use little endian]``. Raises ------ ValueError If unable to determine the encoding to use, if `transfer_syntax` is not a transfer syntax, or if there's an inconsistency between `transfer_syntax` and `implicit_vr` or `little_endian`. """ arg_encoding = (implicit_vr, little_endian) if force_encoding: if None in arg_encoding: raise ValueError( "'implicit_vr' and 'little_endian' are required if " "'force_encoding' is used" ) return cast(tuple[bool, bool], arg_encoding) # The default for little_endian is `None` so we can require the use of # args with `force_encoding`, but we actually default it to `True` # when `implicit_vr` is used as a fallback if implicit_vr is not None and little_endian is None: arg_encoding = (implicit_vr, True) ds_encoding: EncodingType = (None, None) if not config._use_future: ds_encoding = (ds.is_implicit_VR, ds.is_little_endian) fallback_encoding: EncodingType = (None, None) if None not in arg_encoding: fallback_encoding = arg_encoding elif None not in ds_encoding: fallback_encoding = ds_encoding elif None not in ds.original_encoding: fallback_encoding = ds.original_encoding if tsyntax is None: if None not in fallback_encoding: return cast(tuple[bool, bool], fallback_encoding) raise ValueError( "Unable to determine the encoding to use for writing the dataset, " "please set the file meta's Transfer Syntax UID or use the " "'implicit_vr' and 'little_endian' arguments" ) if tsyntax.is_private and not tsyntax.is_transfer_syntax: if None in fallback_encoding: raise ValueError( "The 'implicit_vr' and 'little_endian' arguments are required " "when using a private transfer syntax" ) return cast(tuple[bool, bool], fallback_encoding) if not tsyntax.is_transfer_syntax: raise ValueError( f"The Transfer Syntax UID '{tsyntax.name}' is not a valid " "transfer syntax" ) # Check that supplied args match transfer syntax if implicit_vr is not None and implicit_vr != tsyntax.is_implicit_VR: raise ValueError( f"The 'implicit_vr' value is not consistent with the required " f"VR encoding for the '{tsyntax.name}' transfer syntax" ) if little_endian is not None and little_endian != tsyntax.is_little_endian: raise ValueError( f"The 'little_endian' value is not consistent with the required " f"endianness for the '{tsyntax.name}' transfer syntax" ) return (tsyntax.is_implicit_VR, tsyntax.is_little_endian) def dcmwrite( filename: PathType | BinaryIO | WriteableBuffer, dataset: Dataset, /, __write_like_original: bool | None = None, *, implicit_vr: bool | None = None, little_endian: bool | None = None, enforce_file_format: bool = False, force_encoding: bool = False, overwrite: bool = True, **kwargs: Any, ) -> None: """Write `dataset` to `filename`, which can be a path, a file-like or a writeable buffer. .. versionchanged:: 3.0 Added the `enforce_file_format` and `overwrite` keyword arguments. .. deprecated:: 3.0 `write_like_original` is deprecated and will be removed in v4.0, use `enforce_file_format` instead. If `enforce_file_format` is ``True`` then an attempt will be made to write `dataset` using the :dcm:`DICOM File Format `, or raise an exception if unable to do so. If `enforce_file_format` is ``False`` (default) then `dataset` will be written as-is (after minimal validation checking) and may or may not contain all or parts of the *File Meta Information* and hence may or may not be conformant with the DICOM File Format. **DICOM File Format** The *DICOM File Format* consists of a 128-byte preamble, a 4 byte ``b'DICM'`` prefix, the *File Meta Information Group* elements and finally the encoded `dataset`. **Preamble and Prefix** The ``dataset.preamble`` attribute shall be 128-bytes long or ``None``. The actual preamble written depends on `enforce_file_format` and ``dataset.preamble`` (see the table below). +------------------+------------------------------+ | | enforce_file_format | +------------------+-------------+----------------+ | dataset.preamble | False | True | +==================+=============+================+ | None | no preamble | 128 0x00 bytes | +------------------+-------------+----------------+ | 128 bytes | dataset.preamble | +------------------+------------------------------+ The prefix shall be the bytestring ``b'DICM'`` and will be written if and only if the preamble is present. **File Meta Information Group Elements** The preamble and prefix are followed by a set of DICOM elements from the (0002,eeee) group. Some of these elements are required (Type 1) while others are optional (Type 3/1C). If `enforce_file_format` is ``False`` then the *File Meta Information Group* elements are all optional, otherwise an attempt will be made to add the required elements using `dataset`. See :func:`~pydicom.filewriter.write_file_meta_info` for more information on which elements are required. The *File Meta Information Group* elements must be included within their own :class:`~pydicom.dataset.FileMetaDataset` in the ``dataset.file_meta`` attribute. *Encoding* The preamble and prefix are encoding independent. The *File Meta Information Group* elements are encoded as *Explicit VR Little Endian* as required by the DICOM Standard. **Dataset** A DICOM Dataset representing a SOP Instance related to a DICOM Information Object Definition (IOD). It's up to the user to ensure `dataset` conforms to the requirements of the IOD. *Encoding* .. versionchanged:: 3.0 Added the `implicit_vr` and `little_endian` arguments. The `dataset` is encoded as specified by (in order of priority): * The encoding corresponding to the set *Transfer Syntax UID* in :attr:`~pydicom.dataset.FileDataset.file_meta`. * The `implicit_vr` and `little_endian` arguments * :attr:`~pydicom.dataset.Dataset.is_implicit_VR` and :attr:`~pydicom.dataset.Dataset.is_little_endian` * :attr:`~pydicom.dataset.Dataset.original_encoding` .. warning:: This function does not automatically convert `dataset` from little to big endian encoding (or vice versa). The endianness of values for elements with a VR of **OD**, **OF**, **OL**, **OW**, **OV** and **UN** must be converted manually prior to calling :func:`~pydicom.filewriter.dcmwrite`. Parameters ---------- filename : str, PathLike, file-like or writeable buffer File path, file-like or writeable buffer to write the encoded `dataset` to. If using a writeable buffer it must have ``write()``, ``seek()`` and ``tell()`` methods. dataset : pydicom.dataset.FileDataset The dataset to be encoded. write_like_original : bool, optional If ``True`` (default) then write `dataset` as-is, otherwise ensure that `dataset` is written in the DICOM File Format or raise an exception if that isn't possible. This parameter is deprecated, please use `enforce_file_format` instead. implicit_vr : bool, optional Required if `dataset` has no valid public *Transfer Syntax UID* set in the file meta and `dataset` has been created from scratch. If ``True`` then encode `dataset` using implicit VR, otherwise use explicit VR. little_endian : bool, optional Required if `dataset` has no valid public *Transfer Syntax UID* set in the file meta and `dataset` has been created from scratch. If ``True`` (default) then use little endian byte order when encoding `dataset`, otherwise use big endian. enforce_file_format : bool, optional If ``True`` then ensure `dataset` is written in the DICOM File Format or raise an exception if that isn't possible. If ``False`` (default) then write `dataset` as-is, preserving the following - which may result in a non-conformant file: - ``dataset.preamble``: if `dataset` has no preamble then none will be written - ``dataset.file_meta``: if `dataset` is missing any required *File Meta Information Group* elements then they will not be written. force_encoding : bool, optional If ``True`` then force the encoding to follow `implicit_vr` and `little_endian`. Cannot be used with `enforce_file_format`. Default ``False``. overwrite : bool, optional If ``False`` and `filename` is a :class:`str` or PathLike, then raise a :class:`FileExistsError` if a file already exists with the given filename (default ``True``). Raises ------ ValueError * If group ``0x0000`` *Command Set* elements are present in `dataset`. * If group ``0x0002`` *File Meta Information Group* elements are present in `dataset`. * If ``dataset.preamble`` exists but is not 128 bytes long. See Also -------- pydicom.dataset.Dataset Dataset class with relevant attributes and information. pydicom.dataset.Dataset.save_as Encode a dataset and write it to file, wraps ``dcmwrite()``. """ # TODO: Remove in v4.0 # Cover use of `write_like_original` as: # optional arg - dcmwrite(fp, ds, write_like_original=bool) # positional arg - dcmwrite(fp, ds, False) write_like_original: bool | None = kwargs.get("write_like_original", None) if None not in (__write_like_original, write_like_original): if config._use_future: raise TypeError( "'write_like_original' is no longer accepted as a positional " "or keyword argument, use 'enforce_file_format' instead" ) raise TypeError( "'write_like_original' cannot be used as both a positional " "and keyword argument" ) if write_like_original is None: write_like_original = __write_like_original if write_like_original is not None: if config._use_future: raise TypeError( "'write_like_original' is no longer accepted as a positional " "or keyword argument, use 'enforce_file_format' instead" ) warn_and_log( ( "'write_like_original' is deprecated and will be removed in " "v4.0, please use 'enforce_file_format' instead" ), DeprecationWarning, ) enforce_file_format = not write_like_original # Ensure kwargs only contains `write_like_original` keys = [x for x in kwargs.keys() if x != "write_like_original"] if keys: raise TypeError( f"Invalid keyword argument(s) for dcmwrite(): {', '.join(keys)}" ) cls_name = dataset.__class__.__name__ # Check for disallowed tags bad_tags = [x >> 16 for x in dataset._dict if x >> 16 in (0, 2)] if bad_tags: if 0 in bad_tags: raise ValueError( "Command Set elements (0000,eeee) are not allowed when using " "dcmwrite(), use write_dataset() instead" ) else: raise ValueError( "File Meta Information Group elements (0002,eeee) must be in a " f"FileMetaDataset instance in the '{cls_name}.file_meta' attribute" ) if force_encoding and enforce_file_format: raise ValueError("'force_encoding' cannot be used with 'enforce_file_format'") # Avoid making changes to the original File Meta Information file_meta = FileMetaDataset() if hasattr(dataset, "file_meta"): file_meta = deepcopy(dataset.file_meta) tsyntax: UID | None = file_meta.get("TransferSyntaxUID", None) # The dataset encoding method encoding = _determine_encoding( dataset, tsyntax, implicit_vr, little_endian, force_encoding, ) if not force_encoding and encoding == (True, False): raise ValueError( "Implicit VR and big endian is not a valid encoding combination" ) preamble = getattr(dataset, "preamble", None) if preamble and len(preamble) != 128: raise ValueError(f"'{cls_name}.preamble' must be 128-bytes long") if enforce_file_format: # A valid File Meta Information is required if tsyntax is None: if encoding == (True, True): file_meta.TransferSyntaxUID = ImplicitVRLittleEndian elif encoding == (False, False): file_meta.TransferSyntaxUID = ExplicitVRBigEndian tsyntax = file_meta.get("TransferSyntaxUID", None) # Ensure the file_meta Class and Instance UIDs are up to date # but don't overwrite if nothing is set in the dataset meta_class = file_meta.get("MediaStorageSOPClassUID", None) ds_class = dataset.get("SOPClassUID", None) if meta_class is None or (ds_class and ds_class != meta_class): file_meta.MediaStorageSOPClassUID = ds_class meta_instance = file_meta.get("MediaStorageSOPInstanceUID", None) ds_instance = dataset.get("SOPInstanceUID", None) if meta_instance is None or (ds_instance and ds_instance != meta_instance): file_meta.MediaStorageSOPInstanceUID = ds_instance # Will raise if the file meta isn't valid validate_file_meta(file_meta, enforce_standard=True) # A preamble is required if not preamble: preamble = b"\x00" * 128 if tsyntax and not tsyntax.is_private and tsyntax.is_transfer_syntax: # PS3.5 Annex A.4 - the length of encapsulated pixel data is undefined # and native pixel data uses actual length if "PixelData" in dataset: dataset["PixelData"].is_undefined_length = tsyntax.is_compressed caller_owns_file = True # Open file if not already a file object filename = path_from_pathlike(filename) if isinstance(filename, str): # A path-like to be written to file_mode = "xb" if not overwrite else "wb" fp: DicomIO = DicomFile(filename, file_mode) # caller provided a file name; we own the file handle caller_owns_file = False elif isinstance(filename, DicomIO): # A wrapped writeable buffer, don't wrap it again fp = filename else: # Anything else try: fp = DicomIO(filename) except AttributeError as exc: raise TypeError( "dcmwrite: Expected a file path, file-like or writeable buffer, " f"but got {type(filename).__name__}" ) from exc # Set the encoding of the buffer/file-like fp.is_implicit_VR, fp.is_little_endian = encoding try: if preamble: # Write the 'DICM' prefix if and only if we write the preamble fp.write(preamble) fp.write(b"DICM") if file_meta: # May be empty write_file_meta_info(fp, file_meta, enforce_standard=enforce_file_format) if tsyntax == DeflatedExplicitVRLittleEndian: # See PS3.5 section A.5 # When writing, the entire dataset following the file meta data # is encoded normally, then "deflate" compression applied buffer = DicomBytesIO() buffer.is_implicit_VR, buffer.is_little_endian = encoding write_dataset(buffer, dataset) # Compress the encoded data and write to file compressor = zlib.compressobj(wbits=-zlib.MAX_WBITS) deflated = bytearray(compressor.compress(buffer.getvalue())) deflated += compressor.flush() fp.write(deflated) if len(deflated) % 2: fp.write(b"\x00") else: write_dataset(fp, dataset) finally: if not caller_owns_file: fp.close() # Map each VR to a function which can write it # for write_numbers, the Writer maps to a tuple (function, struct_format) # (struct_format is python's struct module format) writers = { VR.AE: (write_string, None), VR.AS: (write_string, None), VR.AT: (write_ATvalue, None), VR.CS: (write_string, None), VR.DA: (write_DA, None), VR.DS: (write_number_string, None), VR.DT: (write_DT, None), VR.FD: (write_numbers, "d"), VR.FL: (write_numbers, "f"), VR.IS: (write_number_string, None), VR.LO: (write_text, None), VR.LT: (write_text, None), VR.OB: (write_OBvalue, None), VR.OD: (write_OWvalue, None), VR.OF: (write_OWvalue, None), VR.OL: (write_OWvalue, None), VR.OW: (write_OWvalue, None), VR.OV: (write_OWvalue, None), VR.PN: (write_PN, None), VR.SH: (write_text, None), VR.SL: (write_numbers, "l"), VR.SQ: (write_sequence, None), VR.SS: (write_numbers, "h"), VR.ST: (write_text, None), VR.SV: (write_numbers, "q"), VR.TM: (write_TM, None), VR.UC: (write_text, None), VR.UI: (write_UI, None), VR.UL: (write_numbers, "L"), VR.UN: (write_UN, None), VR.UR: (write_string, None), VR.US: (write_numbers, "H"), VR.UT: (write_text, None), VR.UV: (write_numbers, "Q"), VR.US_SS: (write_OWvalue, None), VR.US_OW: (write_OWvalue, None), VR.US_SS_OW: (write_OWvalue, None), VR.OB_OW: (write_OBvalue, None), } pydicom-pydicom-20aa4b7/src/pydicom/hooks.py000066400000000000000000000316431515706620200211650ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. from typing import Any, TYPE_CHECKING, Protocol from collections.abc import MutableSequence, Callable from pydicom import config from pydicom.datadict import dictionary_VR, private_dictionary_VR from pydicom.errors import BytesLengthException from pydicom.misc import warn_and_log from pydicom.tag import BaseTag, _LUT_DESCRIPTOR_TAGS from pydicom.valuerep import VR if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset from pydicom.dataelem import RawDataElement class RawDataHook(Protocol): def __call__( self, raw: RawDataElement, data: dict[str, Any], *, encoding: str | MutableSequence[str] | None = ..., ds: Dataset | None = ..., **kwargs: Any, ) -> None: ... class Hooks: """Management class for callback functions. .. versionadded:: 3.0 .. warning:: New instances of this class should not be created, instead use the instance imported with ``from pydicom.hooks import hooks``. **Available Hooks** For conversion of raw element data to :class:`~pydicom.dataelem.DataElement` using :func:`~pydicom.dataelem.convert_raw_data_element`: * ``"raw_element_vr"``: function to perform VR lookups for raw elements, default :func:`raw_element_vr`. * ``"raw_element_value"``: function to convert raw element values to types appropriate for the VR, default :func:`raw_element_value`. * ``"raw_element_kwargs"``: `kwargs` :class:`dict` passed to the callback functions. """ def __init__(self) -> None: """Initialize a new ``Hooks`` instance.""" self.raw_element_value: RawDataHook self.raw_element_vr: RawDataHook self.raw_element_kwargs: dict[str, Any] = {} def register_callback(self, hook: str, func: Callable) -> None: """Register the callback function `func` to a hook. Example ------- .. code-block:: python from pydicom import dcmread from pydicom.hooks import hooks, raw_element_value_fix_separator hooks.register_callback( "raw_element_value", raw_element_value_fix_separator ) kwargs = {"target_VRs": ("DS", "IS")} hooks.register_kwargs("raw_element_kwargs", kwargs) ds = dcmread("path/to/dataset.dcm") Parameters ---------- hook : str The name of the hook to register the function to, allowed values ``"raw_element_vr"`` and ``"raw_element_value"``. func : Callable The callback function to use with the hook. Only one callback function can be used per hook. For details on the required function signatures please see the documentation for the corresponding calling function. """ if not callable(func): raise TypeError("'func' must be a callable function") if hook == "raw_element_value": self.raw_element_value = func elif hook == "raw_element_vr": self.raw_element_vr = func else: raise ValueError(f"Unknown hook '{hook}'") def register_kwargs(self, hook: str, kwargs: dict[str, Any]) -> None: """Register a `kwargs` :class:`dict` to be passed to the corresponding callback function(s). Parameters ---------- hook : str The name of the hook to register `kwargs` to, allowed value ``"raw_element_kwargs"``. kwargs : dict[str, Any] A :class:`dict` containing keyword arguments to be passed to the hook's corresponding callback function(s). """ if not isinstance(kwargs, dict): raise TypeError(f"'kwargs' must be a dict, not '{type(kwargs).__name__}'") if hook == "raw_element_kwargs": self.raw_element_kwargs = kwargs else: raise ValueError(f"Unknown hook '{hook}'") def _private_vr_for_tag(ds: "Dataset | None", tag: BaseTag) -> str: """Return the VR for a known private tag, otherwise "UN". Parameters ---------- ds : Dataset, optional The dataset needed for the private creator lookup. If not given, "UN" is returned. tag : BaseTag The private tag to lookup. The caller has to ensure that the tag is private. Returns ------- str "LO" if the tag is a private creator, the VR of the private tag if found in the private dictionary, or "UN". """ if tag.is_private_creator: return VR.LO # invalid private tags are handled as UN if ds is not None and (tag.element & 0xFF00): private_creator_tag = tag.group << 16 | (tag.element >> 8) private_creator = ds.get(private_creator_tag, "") if private_creator: try: return private_dictionary_VR(tag, private_creator.value) except KeyError: pass return VR.UN def raw_element_vr( raw: "RawDataElement", data: dict[str, Any], *, encoding: str | MutableSequence[str] | None = None, ds: "Dataset | None" = None, **kwargs: Any, ) -> None: """Determine the VR to use for `raw`. .. versionadded:: 3.0 Default callback function for the ``"raw_element_vr"`` hook. Parameters ---------- raw : RawDataElement The raw data element to determine the VR for. data : dict[str, Any] A dict to store the results of the VR lookup, which should be added as ``{"VR": str}``. ds : pydicom.dataset.Dataset | None The dataset the element belongs to. **kwargs: dict[str, Any] Additional keyword arguments. """ vr = raw.VR if vr is None: # Can be if was implicit VR try: vr = dictionary_VR(raw.tag) except KeyError: # just read the bytes, no way to know what they mean if raw.tag.is_private: # for VR for private tags see PS3.5, 6.2.2 vr = _private_vr_for_tag(ds, raw.tag) # group length tag implied in versions < 3.0 elif raw.tag.element == 0: vr = VR.UL else: msg = f"VR lookup failed for the raw element with tag {raw.tag}" if config.settings.reading_validation_mode == config.RAISE: raise KeyError(msg) vr = VR.UN warn_and_log(f"{msg} - setting VR to 'UN'") elif vr == VR.UN and config.replace_un_with_known_vr: # handle rare case of incorrectly set 'UN' in explicit encoding # see also DataElement.__init__() if raw.tag.is_private: vr = _private_vr_for_tag(ds, raw.tag) elif raw.value is None or len(raw.value) < 0xFFFF: try: vr = dictionary_VR(raw.tag) except KeyError: pass data["VR"] = vr def raw_element_value( raw: "RawDataElement", data: dict[str, Any], *, encoding: str | MutableSequence[str] | None = None, ds: "Dataset | None" = None, **kwargs: Any, ) -> None: """Convert the encoded value for `raw` to an appropriate type. .. versionadded:: 3.0 Will set the VR to **UN** if unable to convert the value. Default callback function for the ``"raw_element_value"`` hook. Parameters ---------- raw : RawDataElement The raw data element to determine the value for. data : dict[str, Any] A dict to store the results of the value conversion, which should be added as ``{"value": Any}``. encoding : str | MutableSequence[str] | None The character set encoding to use for text VRs. **kwargs: dict[str, Any] Additional keyword arguments. """ from pydicom.values import convert_value vr = data["VR"] try: value = convert_value(vr, raw, encoding) except NotImplementedError as exc: raise NotImplementedError(f"{exc} in tag {raw.tag}") except BytesLengthException as exc: # Failed conversion, either raise or convert to a UN VR msg = ( f"{exc} This occurred while trying to parse {raw.tag} according " f"to VR '{raw.VR}'." ) if not config.convert_wrong_length_to_UN: raise BytesLengthException( f"{msg} To replace this error with a warning set " "pydicom.config.convert_wrong_length_to_UN = True." ) warn_and_log(f"{msg} Setting VR to 'UN'.") data["VR"] = VR.UN value = raw.value if raw.tag in _LUT_DESCRIPTOR_TAGS: # We only fix the first value as the third value is 8 or 16 if value and isinstance(value, list): try: if value[0] < 0: value[0] += 65536 except Exception: pass data["value"] = value def raw_element_value_fix_separator( raw: "RawDataElement", data: dict[str, Any], *, encoding: str | MutableSequence[str] | None = None, ds: "Dataset | None", separator: str | bytes = b",", target_VRs: tuple[str, ...] | None = None, **kwargs: Any, ) -> None: """Convenience function to fix values with an invalid multivalue separator. .. versionadded:: 3.0 Alternative callback function for the ``"raw_element_value"`` hook. Example ------- Fix **DS** and **IS** elements that use an invalid ":" character as the multivalue separator:: from pydicom import dcmread from pydicom.hooks import hooks, raw_element_value_fix_separator hooks.register_callback( "raw_element_value", raw_element_value_fix_separator, ) hooks.register_kwargs( "raw_element", {"target_VRs": ("DS", "IS"), "separator": b":"}, ) ds = dcmread("path/to/dataset.dcm") Parameters ---------- raw : RawDataElement The raw data element to determine the value for. data : dict[str, Any] A dict to store the results of the value conversion, which should be added as ``{"value": Any}``. encoding : str | MutableSequence[str] | None The character set encoding to use for text VRs. separator : str | bytes, optional The invalid separator character to be replaced by an ASCII backslash (0x5C). target_VRs : tuple[str, ...], optional The VRs the fix should apply. **kwargs: dict[str, Any] Additional keyword arguments. """ vr = data["VR"] if target_VRs and vr in target_VRs and isinstance(raw.value, bytes): if isinstance(separator, str): separator = separator.encode("ascii") raw = raw._replace(value=raw.value.replace(separator, b"\x5C")) raw_element_value(raw, data, encoding=encoding, ds=ds, **kwargs) def raw_element_value_retry( raw: "RawDataElement", data: dict[str, Any], *, encoding: str | MutableSequence[str] | None = None, ds: "Dataset | None", target_VRs: dict[str, tuple[str, ...]] | None = None, **kwargs: Any, ) -> None: """Convenience function to retry value conversion using a different VR. .. versionadded:: 3.0 Alternative callback function for the ``"raw_element_value"`` hook. Example ------- Retry the value conversion for **DS** elements using **US** or **SS**:: from pydicom import dcmread from pydicom.hooks import hooks, raw_element_value_retry hooks.register_callback( "raw_element_value", raw_element_value_retry, ) hooks.register_kwargs( "raw_element", {"target_VRs": {"DS": ("US", "SS")}}, ) ds = dcmread("path/to/dataset.dcm") Parameters ---------- raw : RawDataElement The raw data element to determine the value for. data : dict[str, Any] A dict to store the results of the value conversion, which should be added as ``{"value": Any}``. encoding : str | MutableSequence[str] | None The character set encoding to use for text VRs. target_VRs : dict[str, tuple[str, ...]], optional The ``{VRs the fix should apply: tuple of alternative VRs to try}``. **kwargs: dict[str, Any] Additional keyword arguments. """ from pydicom.values import convert_value try: raw_element_value(raw, data, encoding=encoding, ds=ds, **kwargs) except Exception as exc: vr = data["VR"] if target_VRs and vr in target_VRs: for candidate in target_VRs[vr]: try: data["value"] = convert_value(candidate, raw) data["VR"] = candidate return except Exception: pass raise exc hooks: Hooks = Hooks() """The global :class:`~pydicom.hooks.Hooks` singleton. .. versionadded:: 3.0 """ hooks.raw_element_value = raw_element_value hooks.raw_element_vr = raw_element_vr pydicom-pydicom-20aa4b7/src/pydicom/jsonrep.py000066400000000000000000000273071515706620200215240ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Methods for converting Datasets and DataElements to/from json""" import base64 from inspect import signature from typing import TypeAlias, Any, cast, TYPE_CHECKING from collections.abc import Callable from pydicom.misc import warn_and_log from pydicom.valuerep import FLOAT_VR, INT_VR, VR if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset JSON_VALUE_KEYS = ("Value", "BulkDataURI", "InlineBinary") def convert_to_python_number(value: Any, vr: str) -> Any: """When possible convert numeric-like values to either ints or floats based on their value representation. Parameters ---------- value : Any Value of the data element. vr : str Value representation of the data element. Returns ------- Any * If `value` is empty then returns the `value` unchanged. * If `vr` is an integer-like VR type then returns ``int`` or ``List[int]`` * If `vr` is a float-like VR type then returns ``float`` or ``List[float]`` * Otherwise returns `value` unchanged """ from pydicom.dataelem import empty_value_for_VR if value is None or "": return value number_type: type[int] | type[float] | None = None if vr in (INT_VR - {VR.AT}) | {VR.US_SS}: number_type = int if vr in FLOAT_VR: number_type = float if number_type is None: return value if isinstance(value, list | tuple): return [ number_type(v) if v is not None else empty_value_for_VR(vr) for v in value ] return number_type(value) OtherValueType = None | str | int | float PNValueType = None | str | dict[str, str] SQValueType = dict[str, Any] | None # Recursive ValueType: TypeAlias = PNValueType | SQValueType | OtherValueType InlineBinaryType: TypeAlias = str | list[str] BulkDataURIType: TypeAlias = str | list[str] JSONValueType = list[ValueType] | InlineBinaryType | BulkDataURIType BulkDataType = None | str | int | float | bytes BulkDataHandlerType = Callable[[str, str, str], BulkDataType] | None class JsonDataElementConverter: """Convert from a JSON struct to a :class:`DataElement`. References ---------- * :dcm:`Annex F of Part 18 of the DICOM Standard` * `JSON to Python object conversion table `_ """ def __init__( self, dataset_class: type["Dataset"], tag: str, vr: str, value: JSONValueType, value_key: str | None, bulk_data_uri_handler: ( BulkDataHandlerType | Callable[[str], BulkDataType] | None ) = None, ) -> None: """Create a new converter instance. Parameters ---------- dataset_class : dataset.Dataset derived class The class object to use for **SQ** element items. tag : str The data element's tag in uppercase hex format like ``"7FE00010"``. vr : str The data element value representation. value : str or List[None | str | int | float | dict] The attribute value for the JSON object's "Value", "InlineBinary" or "BulkDataURI" field. If there's no such attribute then `value` will be ``[""]``. value_key : str or None The attribute name for `value`, should be one of: ``{"Value", "InlineBinary", "BulkDataURI"}``. If the element's VM is ``0`` and none of the keys are used then will be ``None``. bulk_data_uri_handler: callable, optional Callable function that accepts either the `tag`, `vr` and the "BulkDataURI" `value`, or just the "BulkDataURI" `value` of the JSON representation of a data element and returns the actual value of that data element (retrieved via DICOMweb WADO-RS). If no `bulk_data_uri_handler` is specified (default) then the corresponding element will have an "empty" value such as ``""``, ``b""`` or ``None`` depending on the `vr` (i.e. the Value Multiplicity will be 0). """ self.dataset_class = dataset_class self.tag = tag self.vr = vr self.value = value self.value_key = value_key self.bulk_data_element_handler: BulkDataHandlerType handler = bulk_data_uri_handler if handler and len(signature(handler).parameters) == 1: # `handler` is Callable[[str], BulkDataType] def wrapper(tag: str, vr: str, value: str) -> BulkDataType: x = cast(Callable[[str], BulkDataType], handler) return x(value) self.bulk_data_element_handler = wrapper else: self.bulk_data_element_handler = cast(BulkDataHandlerType, handler) def get_element_values(self) -> Any: """Return a the data element value or list of values. Returns ------- None, str, float, int, bytes, dataset_class or a list of these The value or value list of the newly created data element. """ from pydicom.dataelem import empty_value_for_VR # An attribute with an empty value should have no "Value", # "BulkDataURI" or "InlineBinary" if self.value_key is None: return empty_value_for_VR(self.vr) if self.value_key == "Value": if not isinstance(self.value, list): raise TypeError( f"'{self.value_key}' of data element '{self.tag}' must be a list" ) if not self.value: return empty_value_for_VR(self.vr) val = cast(list[ValueType], self.value) element_value = [self.get_regular_element_value(v) for v in val] if len(element_value) == 1 and self.vr != VR.SQ: element_value = element_value[0] return convert_to_python_number(element_value, self.vr) # The value for "InlineBinary" shall be encoded as a base64 encoded # string, as shown in PS3.18, Table F.3.1-1, but the example in # PS3.18, Annex F.4 shows the string enclosed in a list. # We support both variants, as the standard is ambiguous here, # and do the same for "BulkDataURI". value = cast(str | list[str], self.value) if isinstance(value, list): value = value[0] if self.value_key == "InlineBinary": # The `value` should be a base64 encoded str if not isinstance(value, str): raise TypeError( f"Invalid attribute value for data element '{self.tag}' - " "the value for 'InlineBinary' must be str, not " f"{type(value).__name__}" ) return base64.b64decode(value) # bytes if self.value_key == "BulkDataURI": # The `value` should be a URI as a str if not isinstance(value, str): raise TypeError( f"Invalid attribute value for data element '{self.tag}' - " "the value for 'BulkDataURI' must be str, not " f"{type(value).__name__}" ) if self.bulk_data_element_handler is None: warn_and_log( "No bulk data URI handler provided for retrieval " f'of value of data element "{self.tag}"' ) return empty_value_for_VR(self.vr) return self.bulk_data_element_handler(self.tag, self.vr, value) raise ValueError( f"Unknown attribute name '{self.value_key}' for tag {self.tag}" ) def get_regular_element_value(self, value: ValueType) -> Any: """Return a the data element value created from a json "Value" entry. Parameters ---------- value : None, str, int, float or dict The data element's value from the json entry. Returns ------- None, str, int, float or Dataset A single value of the corresponding :class:`DataElement`. """ from pydicom.dataelem import empty_value_for_VR # Table F.2.3-1 has JSON type mappings if self.vr == VR.SQ: # Dataset # May be an empty dict value = cast(dict[str, Any], value) return self.get_sequence_item(value) if value is None: return empty_value_for_VR(self.vr) if self.vr == VR.PN: # str value = cast(dict[str, str], value) return self.get_pn_element_value(value) if self.vr == VR.AT: # Optional[int] # May be an empty str value = cast(str, value) try: return int(value, 16) except ValueError: warn_and_log(f"Invalid value '{value}' for AT element - ignoring it") return None return value def get_sequence_item(self, value: SQValueType) -> "Dataset": """Return a sequence item for the JSON dict `value`. Parameters ---------- value : dict or None The sequence item from the JSON entry. Returns ------- dataset_class The decoded dataset item. Raises ------ KeyError If the "vr" key is missing for a contained element """ from pydicom import DataElement from pydicom.dataelem import empty_value_for_VR ds = self.dataset_class() value = {} if value is None else value for key, val in value.items(): if "vr" not in val: raise KeyError(f"Data element '{self.tag}' must have key 'vr'") vr = val["vr"] unique_value_keys = tuple(set(val.keys()) & set(JSON_VALUE_KEYS)) if not unique_value_keys: # data element with no value elem = DataElement( tag=int(key, 16), value=empty_value_for_VR(vr), VR=vr ) else: value_key = unique_value_keys[0] elem = DataElement.from_json( self.dataset_class, key, vr, val[value_key], value_key, self.bulk_data_element_handler, ) ds.add(elem) return ds def get_pn_element_value(self, value: str | dict[str, str]) -> str: """Return a person name from JSON **PN** value as str. Values with VR PN have a special JSON encoding, see the DICOM Standard, Part 18, :dcm:`Annex F.2.2`. Parameters ---------- value : Dict[str, str] The person name components in the JSON entry. Returns ------- str The decoded PersonName object or an empty string. """ if not isinstance(value, dict): # Some DICOMweb services get this wrong, so we # workaround the issue and warn the user # rather than raising an error. warn_and_log( f"Value of data element '{self.tag}' with VR Person Name (PN) " "is not formatted correctly" ) return value if "Phonetic" in value: comps = ["", "", ""] elif "Ideographic" in value: comps = ["", ""] else: comps = [""] if "Alphabetic" in value: comps[0] = value["Alphabetic"] if "Ideographic" in value: comps[1] = value["Ideographic"] if "Phonetic" in value: comps[2] = value["Phonetic"] return "=".join(comps) pydicom-pydicom-20aa4b7/src/pydicom/misc.py000066400000000000000000000042421515706620200207700ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Miscellaneous helper functions""" import logging from itertools import groupby from pathlib import Path import warnings LOGGER = logging.getLogger("pydicom") _size_factors = { "kb": 1000, "mb": 1000 * 1000, "gb": 1000 * 1000 * 1000, "kib": 1024, "mib": 1024 * 1024, "gib": 1024 * 1024 * 1024, } def size_in_bytes(expr: int | float | str | None) -> None | float | int: """Return the number of bytes for `defer_size` argument in :func:`~pydicom.filereader.dcmread`. """ if expr is None or expr == float("inf"): return None if isinstance(expr, int | float): return expr try: return int(expr) except ValueError: pass value, unit = ("".join(g) for k, g in groupby(expr, str.isalpha)) if unit.lower() in _size_factors: return float(value) * _size_factors[unit.lower()] raise ValueError(f"Unable to parse length with unit '{unit}'") def is_dicom(file_path: str | Path) -> bool: """Return ``True`` if the file at `file_path` is a DICOM file. This function is a pared down version of :func:`~pydicom.filereader.read_preamble` meant for a fast return. The file is read for a conformant preamble ('DICM'), returning ``True`` if so, and ``False`` otherwise. This is a conservative approach. Parameters ---------- file_path : str The path to the file. See Also -------- filereader.read_preamble filereader.read_partial """ with open(file_path, "rb") as fp: fp.read(128) # preamble return fp.read(4) == b"DICM" def warn_and_log( msg: str, category: type[Warning] | None = None, stacklevel: int = 1 ) -> None: """Send warning message `msg` to the logger. Parameters ---------- msg : str The warning message. category : type[Warning] | None, optional The warning category class, defaults to ``UserWarning``. stacklevel : int, optional The stack level to refer to, relative to where `warn_and_log` is used. """ LOGGER.warning(msg) warnings.warn(msg, category, stacklevel=stacklevel + 1) pydicom-pydicom-20aa4b7/src/pydicom/multival.py000066400000000000000000000126701515706620200216760ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Code for multi-value data elements values, or any list of items that must all be the same type. """ from typing import overload, Any, cast, TypeVar from collections.abc import Iterable, Callable, MutableSequence, Iterator T = TypeVar("T") Self = TypeVar("Self", bound="ConstrainedList") class ConstrainedList(MutableSequence[T]): """A list of items that must all be of the same type.""" def __init__(self, iterable: Iterable[T] | None = None) -> None: """Create a new ConstrainedList. Parameters ---------- iterable : Iterable[T] An iterable such as a :class:`list` or :class:`tuple` containing the items to be used to create the ``ConstrainedList``. """ self._list: list[T] = [] if iterable is not None: self._list = [self._validate(item) for item in iterable] def append(self, item: T) -> None: """Append an item.""" self._list.append(self._validate(item)) def __delitem__(self, index: slice | int) -> None: """Remove the item(s) at `index`.""" del self._list[index] def extend(self, val: Iterable[T]) -> None: """Extend using an iterable containing the same types of item.""" if not hasattr(val, "__iter__"): raise TypeError("An iterable is required") self._list.extend([self._validate(item) for item in val]) def __eq__(self, other: Any) -> Any: """Return ``True`` if `other` is equal to self.""" return self._list == other @overload def __getitem__(self, index: int) -> T: pass # pragma: no cover @overload def __getitem__(self, index: slice) -> MutableSequence[T]: pass # pragma: no cover def __getitem__(self, index: slice | int) -> MutableSequence[T] | T: """Return item(s) from self.""" return self._list[index] def __iadd__(self: Self, other: Iterable[T]) -> Self: """Implement += [T, ...].""" if not hasattr(other, "__iter__"): raise TypeError("An iterable is required") self._list += [self._validate(item) for item in other] return self def insert(self, position: int, item: T) -> None: """Insert an `item` at `position`.""" self._list.insert(position, self._validate(item)) def __iter__(self) -> Iterator[T]: """Yield items.""" yield from self._list def __len__(self) -> int: """Return the number of contained items.""" return len(self._list) def __ne__(self, other: Any) -> Any: """Return ``True`` if `other` is not equal to self.""" return self._list != other @overload def __setitem__(self, idx: int, val: T) -> None: pass # pragma: no cover @overload def __setitem__(self, idx: slice, val: Iterable[T]) -> None: pass # pragma: no cover def __setitem__(self, index: slice | int, val: Iterable[T] | T) -> None: """Add item(s) at `index`.""" if isinstance(index, slice): val = cast(Iterable[T], val) self._list.__setitem__(index, [self._validate(item) for item in val]) else: val = cast(T, val) self._list.__setitem__(index, self._validate(val)) def _validate(self, item: Any) -> T: """Return items that have been validated as being of the expected type""" raise NotImplementedError( f"'{type(self).__name__}._validate()' must be implemented" ) class MultiValue(ConstrainedList[T]): """Class to hold any multi-valued DICOM value, or any list of items that are all of the same type. This class enforces that any items added to the list are of the correct type, by calling the constructor on any items that are added. Therefore, the constructor must behave nicely if passed an object that is already its type. The constructor should raise :class:`TypeError` if the item cannot be converted. Note, however, that DS and IS types can be a blank string ``''`` rather than an instance of their classes. """ def __init__( self, type_constructor: Callable[[Any], T], iterable: Iterable[Any], ) -> None: """Create a new :class:`MultiValue` from an iterable and ensure each item in the :class:`MultiValue` has the same type. Parameters ---------- type_constructor : callable A constructor for the required type for all items. Could be the class, or a factory function. Takes a single parameter and returns the input as the desired type (or raises an appropriate exception). iterable : iterable An iterable (e.g. :class:`list`, :class:`tuple`) of items to initialize the :class:`MultiValue` list. Each item in the iterable is passed to `type_constructor` and the returned value added to the :class:`MultiValue`. """ self._constructor = type_constructor super().__init__(iterable) def _validate(self, item: Any | T) -> T: return self._constructor(item) def sort(self, *args: Any, **kwargs: Any) -> None: self._list.sort(*args, **kwargs) def __str__(self) -> str: if not self: return "" lines = (f"{x!r}" if isinstance(x, str | bytes) else str(x) for x in self) return f"[{', '.join(lines)}]" __repr__ = __str__ pydicom-pydicom-20aa4b7/src/pydicom/overlays/000077500000000000000000000000001515706620200213255ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/overlays/__init__.py000066400000000000000000000000751515706620200234400ustar00rootroot00000000000000from pydicom.overlays.numpy_handler import get_overlay_array pydicom-pydicom-20aa4b7/src/pydicom/overlays/numpy_handler.py000066400000000000000000000230621515706620200245470ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. """Use the `numpy `_ package to convert supported *Overlay Data* to a :class:`numpy.ndarray`. **Supported data** The numpy handler supports the conversion of data in the (60xx,3000) *Overlay Data* element to a :class:`~numpy.ndarray` provided the related :dcm:`Overlay Plane` and :dcm:`Multi-frame Overlay` module elements have values given in the table below. +------------------------------------------------+--------------+ | Element | Supported | +-------------+---------------------------+------+ values | | Tag | Keyword | Type | | +=============+===========================+======+==============+ | (60xx,0010) | OverlayRows | 1 | N > 0 | +-------------+---------------------------+------+--------------+ | (60xx,0011) | OverlayColumns | 1 | N > 0 | +-------------+---------------------------+------+--------------+ | (60xx,0015) | NumberOfFramesInOverlay | 1 | N > 0 | +-------------+---------------------------+------+--------------+ | (60xx,0100) | OverlayBitsAllocated | 1 | 1 | +-------------+---------------------------+------+--------------+ | (60xx,0102) | OverlayBitPosition | 1 | 0 | +-------------+---------------------------+------+--------------+ """ from typing import TYPE_CHECKING, cast, Any try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.misc import warn_and_log from pydicom.pixels.utils import unpack_bits if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset from pydicom.dataelem import DataElement HANDLER_NAME = "Numpy Overlay" DEPENDENCIES = {"numpy": ("https://numpy.org/", "NumPy")} def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_NP def get_expected_length(elem: dict[str, Any], unit: str = "bytes") -> int: """Return the expected length (in terms of bytes or pixels) of the *Overlay Data*. +------------------------------------------------+-------------+ | Element | Required or | +-------------+---------------------------+------+ optional | | Tag | Keyword | Type | | +=============+===========================+======+=============+ | (60xx,0010) | OverlayRows | 1 | Required | +-------------+---------------------------+------+-------------+ | (60xx,0011) | OverlayColumns | 1 | Required | +-------------+---------------------------+------+-------------+ | (60xx,0015) | NumberOfFramesInOverlay | 1 | Required | +-------------+---------------------------+------+-------------+ Parameters ---------- elem : dict A :class:`dict` with the keys as the element keywords and values the corresponding element values (such as ``{'OverlayRows': 512, ...}``) for the elements listed in the table above. unit : str, optional If ``'bytes'`` then returns the expected length of the *Overlay Data* in whole bytes and NOT including an odd length trailing NULL padding byte. If ``'pixels'`` then returns the expected length of the *Overlay Data* in terms of the total number of pixels (default ``'bytes'``). Returns ------- int The expected length of the *Overlay Data* in either whole bytes or pixels, excluding the NULL trailing padding byte for odd length data. """ length: int = elem["OverlayRows"] * elem["OverlayColumns"] length *= elem["NumberOfFramesInOverlay"] if unit == "pixels": return length # Determine the nearest whole number of bytes needed to contain # 1-bit pixel data. e.g. 10 x 10 1-bit pixels is 100 bits, which # are packed into 12.5 -> 13 bytes return length // 8 + (length % 8 > 0) def reshape_overlay_array(elem: dict[str, Any], arr: "np.ndarray") -> "np.ndarray": """Return a reshaped :class:`numpy.ndarray` `arr`. +------------------------------------------------+--------------+ | Element | Supported | +-------------+---------------------------+------+ values | | Tag | Keyword | Type | | +=============+===========================+======+==============+ | (60xx,0010) | OverlayRows | 1 | N > 0 | +-------------+---------------------------+------+--------------+ | (60xx,0011) | OverlayColumns | 1 | N > 0 | +-------------+---------------------------+------+--------------+ | (60xx,0015) | NumberOfFramesInOverlay | 1 | N > 0 | +-------------+---------------------------+------+--------------+ Parameters ---------- elem : dict A :class:`dict` with the keys as the element keywords and values the corresponding element values (such as ``{'OverlayRows': 512, ...}``) for the elements listed in the table above. arr : numpy.ndarray A 1D array containing the overlay data. Returns ------- numpy.ndarray A reshaped array containing the overlay data. The shape of the array depends on the contents of the dataset: * For single frame data (rows, columns) * For multi-frame data (frames, rows, columns) References ---------- * DICOM Standard, Part 3, Sections :dcm:`C.9.2` and :dcm:`C.9.3` * DICOM Standard, Part 5, :dcm:`Section 8.2` """ if not HAVE_NP: raise ImportError("Numpy is required to reshape the overlay array.") nr_frames = elem["NumberOfFramesInOverlay"] nr_rows = elem["OverlayRows"] nr_columns = elem["OverlayColumns"] if nr_frames < 1: raise ValueError( f"Unable to reshape the overlay array as a value of {nr_frames} " "for (60xx,0015) 'Number of Frames in Overlay' is invalid." ) if nr_frames > 1: return arr.reshape(nr_frames, nr_rows, nr_columns) return arr.reshape(nr_rows, nr_columns) def get_overlay_array(ds: "Dataset", group: int) -> "np.ndarray": """Return a :class:`numpy.ndarray` of the *Overlay Data*. Parameters ---------- ds : Dataset The :class:`Dataset` containing an Overlay Plane module and the *Overlay Data* to be converted. group : int The group part of the *Overlay Data* element tag, e.g. ``0x6000``, ``0x6010``, etc. Must be between 0x6000 and 0x60FF. Returns ------- np.ndarray The contents of (`group`,3000) *Overlay Data* as an array. Raises ------ AttributeError If `ds` is missing a required element. ValueError If the actual length of the overlay data doesn't match the expected length. """ if not HAVE_NP: raise ImportError("The overlay data handler requires numpy") # Check required elements elem = { "OverlayData": ds.get((group, 0x3000), None), "OverlayBitsAllocated": ds.get((group, 0x0100), None), "OverlayRows": ds.get((group, 0x0010), None), "OverlayColumns": ds.get((group, 0x0011), None), } missing = [kk for kk, vv in elem.items() if vv is None] if missing: raise AttributeError( "Unable to convert the overlay data as the following required " f"elements are missing from the dataset: {', '.join(missing)}" ) # Grab the element values elem_values = {kk: vv.value for kk, vv in elem.items()} # Add in if not present nr_frames: DataElement | None = ds.get((group, 0x0015), None) if nr_frames is None: elem_values["NumberOfFramesInOverlay"] = 1 else: elem_values["NumberOfFramesInOverlay"] = nr_frames.value # Calculate the expected length of the pixel data (in bytes) # Note: this does NOT include the trailing null byte for odd length data expected_len = get_expected_length(elem_values) # Check that the actual length of the pixel data is as expected actual_length = len(cast(bytes, elem_values["OverlayData"])) # Correct for the trailing NULL byte padding for odd length data padded_expected_len = expected_len + expected_len % 2 if actual_length < padded_expected_len: if actual_length == expected_len: warn_and_log("The overlay data length is odd and misses a padding byte.") else: raise ValueError( "The length of the overlay data in the dataset " f"({actual_length} bytes) doesn't match the expected length " f"({padded_expected_len} bytes). The dataset may be corrupted " "or there may be an issue with the overlay data handler." ) elif actual_length > padded_expected_len: # PS 3.5, Section 8.1.1 warn_and_log( f"The length of the overlay data in the dataset ({actual_length} " "bytes) indicates it contains excess padding. " f"{actual_length - expected_len} bytes will be removed " "from the end of the data" ) # Unpack the pixel data into a 1D ndarray, skipping any trailing padding nr_pixels = get_expected_length(elem_values, unit="pixels") arr = cast("np.ndarray", unpack_bits(elem_values["OverlayData"])[:nr_pixels]) return reshape_overlay_array(elem_values, arr) pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/000077500000000000000000000000001515706620200234535ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/__init__.py000066400000000000000000000032711515706620200255670ustar00rootroot00000000000000# TODO: remove module in v4.0 from typing import Any from pydicom import config from pydicom.misc import warn_and_log from pydicom.pixels.processing import ( apply_color_lut as _apply_color_lut, apply_modality_lut as _apply_modality_lut, apply_voi_lut as _apply_voi_lut, apply_voi as _apply_voi, apply_windowing as _apply_windowing, convert_color_space as _convert_color_space, ) from pydicom.pixels.utils import ( expand_ybr422 as _expand_ybr422, pack_bits as _pack_bits, unpack_bits as _unpack_bits, ) _DEPRECATED = { "apply_color_lut": _apply_color_lut, "apply_modality_lut": _apply_modality_lut, "apply_rescale": _apply_modality_lut, "apply_voi_lut": _apply_voi_lut, "apply_voi": _apply_voi, "apply_windowing": _apply_windowing, "convert_color_space": _convert_color_space, "pack_bits": _pack_bits, "unpack_bits": _unpack_bits, } _DEPRECATED_UTIL = { "expand_ybr422": _expand_ybr422, } def __getattr__(name: str) -> Any: if name in _DEPRECATED and not config._use_future: msg = ( "The 'pydicom.pixel_data_handlers' module will be removed " f"in v4.0, please use 'from pydicom.pixels import {name}' instead" ) warn_and_log(msg, DeprecationWarning) return _DEPRECATED[name] if name in _DEPRECATED_UTIL and not config._use_future: msg = ( "The 'pydicom.pixel_data_handlers' module will be removed " f"in v4.0, please use 'from pydicom.pixels.utils import {name}' instead" ) warn_and_log(msg, DeprecationWarning) return _DEPRECATED_UTIL[name] raise AttributeError(f"module {__name__!r} has no attribute {name!r}") pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/gdcm_handler.py000066400000000000000000000230051515706620200264340ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Use the `GDCM `_ Python package to decode pixel transfer syntaxes. """ from copy import deepcopy import os from tempfile import NamedTemporaryFile from typing import TYPE_CHECKING, cast if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset try: import numpy HAVE_NP = True except ImportError: HAVE_NP = False try: import gdcm from gdcm import DataElement HAVE_GDCM = True HAVE_GDCM_IN_MEMORY_SUPPORT = hasattr(DataElement, "SetByteStringValue") except ImportError: HAVE_GDCM = False HAVE_GDCM_IN_MEMORY_SUPPORT = False from pydicom import config from pydicom.encaps import generate_frames, generate_fragmented_frames import pydicom.uid from pydicom.uid import UID, JPEG2000, JPEG2000Lossless from pydicom.pixels.utils import ( get_expected_length, pixel_dtype, get_j2k_parameters, get_nr_frames, ) HANDLER_NAME = "GDCM" DEPENDENCIES = { "numpy": ("https://numpy.org/", "NumPy"), "gdcm": ("https://sourceforge.net/projects/gdcm/", "GDCM"), } SUPPORTED_TRANSFER_SYNTAXES = [ pydicom.uid.JPEGBaseline8Bit, pydicom.uid.JPEGExtended12Bit, pydicom.uid.JPEGLossless, pydicom.uid.JPEGLosslessSV1, pydicom.uid.JPEGLSLossless, pydicom.uid.JPEGLSNearLossless, pydicom.uid.JPEG2000Lossless, pydicom.uid.JPEG2000, ] should_convert_these_syntaxes_to_RGB = [pydicom.uid.JPEGBaseline8Bit] def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_NP and HAVE_GDCM def needs_to_convert_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Pixel Data* should to be converted from YCbCr to RGB. This affects JPEG transfer syntaxes. """ return False def should_change_PhotometricInterpretation_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Photometric Interpretation* should be changed to RGB. This affects JPEG transfer syntaxes. """ return False def supports_transfer_syntax(transfer_syntax: UID) -> bool: """Return ``True`` if the handler supports the `transfer_syntax`. Parameters ---------- transfer_syntax : uid.UID The Transfer Syntax UID of the *Pixel Data* that is to be used with the handler. """ return transfer_syntax in SUPPORTED_TRANSFER_SYNTAXES def create_data_element(ds: "Dataset") -> "DataElement": """Return a ``gdcm.DataElement`` for the *Pixel Data*. Parameters ---------- ds : dataset.Dataset The :class:`~pydicom.dataset.Dataset` containing the *Pixel Data*. Returns ------- gdcm.DataElement The converted *Pixel Data* element. """ tsyntax = ds.file_meta.TransferSyntaxUID data_element = gdcm.DataElement(gdcm.Tag(0x7FE0, 0x0010)) if tsyntax.is_compressed: fragments = gdcm.SequenceOfFragments.New() nr_frames = get_nr_frames(ds, warn=False) fragment_gen = generate_fragmented_frames( ds.PixelData, number_of_frames=nr_frames ) for frame_fragments in fragment_gen: for fragment_data in frame_fragments: fragment = gdcm.Fragment() fragment.SetByteStringValue(fragment_data) fragments.AddFragment(fragment) data_element.SetValue(fragments.__ref__()) else: data_element.SetByteStringValue(ds.PixelData) return data_element def create_image(ds: "Dataset", data_element: "DataElement") -> "gdcm.Image": """Return a ``gdcm.Image``. Parameters ---------- ds : dataset.Dataset The :class:`~pydicom.dataset.Dataset` containing the Image Pixel module. data_element : gdcm.DataElement The ``gdcm.DataElement`` *Pixel Data* element. Returns ------- gdcm.Image """ image = gdcm.Image() number_of_frames = get_nr_frames(ds, warn=False) image.SetNumberOfDimensions(2 if number_of_frames == 1 else 3) image.SetDimensions((ds.Columns, ds.Rows, number_of_frames)) image.SetDataElement(data_element) pi_type = gdcm.PhotometricInterpretation.GetPIType(ds.PhotometricInterpretation) image.SetPhotometricInterpretation(gdcm.PhotometricInterpretation(pi_type)) tsyntax = ds.file_meta.TransferSyntaxUID ts_type = gdcm.TransferSyntax.GetTSType(str.__str__(tsyntax)) image.SetTransferSyntax(gdcm.TransferSyntax(ts_type)) pixel_format = gdcm.PixelFormat( ds.SamplesPerPixel, ds.BitsAllocated, ds.BitsStored, ds.HighBit, ds.PixelRepresentation, ) image.SetPixelFormat(pixel_format) if "PlanarConfiguration" in ds: image.SetPlanarConfiguration(ds.PlanarConfiguration) return image def _get_pixel_str_fileio(ds: "Dataset") -> str: """Return the pixel data from `ds` as a str. Used for GDCM < 2.8.8. Parameters ---------- ds : pydicom.dataset.Dataset The dataset to create the str from. Returns ------- str The UTF-8 encoded pixel data. """ reader = gdcm.ImageReader() fname = getattr(ds, "filename", None) if fname and isinstance(fname, str): reader.SetFileName(fname) if not reader.Read(): raise TypeError("GDCM could not read DICOM image") return cast(str, reader.GetImage().GetBuffer()) # Copy the relevant elements and write to a temporary file to avoid # having to deal with all the possible objects the dataset may # originate with new = ds.group_dataset(0x0028) new["PixelData"] = ds["PixelData"] # avoid ambiguous VR new.file_meta = ds.file_meta with NamedTemporaryFile("wb", delete=False) as t: new.save_as(t) reader.SetFileName(t.name) if not reader.Read(): raise TypeError("GDCM could not read DICOM image") pixel_str: str = reader.GetImage().GetBuffer() # Need to kill the gdcm.ImageReader to free file access reader = None os.remove(t.name) return pixel_str def get_pixeldata(ds: "Dataset") -> "numpy.ndarray": """Use the GDCM package to decode *Pixel Data*. Returns ------- numpy.ndarray A correctly sized (but not shaped) array of the entire data volume Raises ------ ImportError If the required packages are not available. TypeError If the image could not be read by GDCM or if the *Pixel Data* type is unsupported. AttributeError If the decoded amount of data does not match the expected amount. """ if not HAVE_GDCM: raise ImportError("The GDCM handler requires both gdcm and numpy") if HAVE_GDCM_IN_MEMORY_SUPPORT: gdcm_data_element = create_data_element(ds) gdcm_image = create_image(ds, gdcm_data_element) pixel_str = gdcm_image.GetBuffer() else: pixel_str = _get_pixel_str_fileio(ds) # GDCM returns char* as type str. Python decodes this to # unicode strings by default. # The SWIG docs mention that they always decode byte streams # as utf-8 strings, with the `surrogateescape` # error handler configured. # Therefore, we can encode them back to a bytearray # by using the same parameters. pixel_bytearray = pixel_str.encode("utf-8", "surrogateescape") # Here we need to be careful because in some cases, GDCM reads a # buffer that is too large, so we need to make sure we only include # the first n_rows * n_columns * dtype_size bytes. expected_length_bytes = get_expected_length(ds) if ds.PhotometricInterpretation == "YBR_FULL_422": # GDCM has already resampled the pixel data, see PS3.3 C.7.6.3.1.2 expected_length_bytes = expected_length_bytes // 2 * 3 if len(pixel_bytearray) > expected_length_bytes: # We make sure that all the bytes after are in fact zeros padding = pixel_bytearray[expected_length_bytes:] if numpy.any(numpy.frombuffer(padding, numpy.byte)): pixel_bytearray = pixel_bytearray[:expected_length_bytes] else: # We revert to the old behavior which should then result # in a Numpy error later on. pass numpy_dtype = pixel_dtype(ds) arr = numpy.frombuffer(pixel_bytearray, dtype=numpy_dtype) expected_length_pixels = get_expected_length(ds, "pixels") if arr.size != expected_length_pixels: raise AttributeError( f"Amount of pixel data {arr.size} does not match the " f"expected data {expected_length_pixels}" ) tsyntax = ds.file_meta.TransferSyntaxUID if config.APPLY_J2K_CORRECTIONS and tsyntax in [JPEG2000, JPEG2000Lossless]: nr_frames = get_nr_frames(ds) codestream = next(generate_frames(ds.PixelData, number_of_frames=nr_frames)) params = get_j2k_parameters(codestream) j2k_precision = cast(int, params.setdefault("precision", ds.BitsStored)) j2k_sign = params.setdefault("is_signed", None) if not j2k_sign and ds.PixelRepresentation == 1: # Convert unsigned J2K data to 2's complement shift = cast(int, ds.BitsAllocated) - j2k_precision # Need a copy of the pixel module to avoid modifying the original pixel_module = deepcopy(ds.group_dataset(0x0028)) pixel_module.PixelRepresentation = 0 dtype = pixel_dtype(pixel_module) arr = (arr.astype(dtype) << shift).astype(numpy_dtype) >> shift if should_change_PhotometricInterpretation_to_RGB(ds): ds.PhotometricInterpretation = "RGB" return cast("numpy.ndarray", arr.copy()) pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/jpeg_ls_handler.py000066400000000000000000000061671515706620200271570ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """ Use the `jpeg_ls (pyjpegls) `_ Python package to decode *Pixel Data*. """ from typing import TYPE_CHECKING, cast try: import numpy HAVE_NP = True except ImportError: HAVE_NP = False try: import jpeg_ls HAVE_JPEGLS = True except ImportError: HAVE_JPEGLS = False from pydicom.encaps import generate_frames from pydicom.pixels.utils import pixel_dtype, get_nr_frames import pydicom.uid if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset HANDLER_NAME = "JPEG-LS" DEPENDENCIES = { "numpy": ("https://numpy.org/", "NumPy"), "jpeg_ls": ("https://github.com/pydicom/pyjpegls", "pyjpegls"), } SUPPORTED_TRANSFER_SYNTAXES = [ pydicom.uid.JPEGLSLossless, pydicom.uid.JPEGLSNearLossless, ] def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_NP and HAVE_JPEGLS def needs_to_convert_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Pixel Data* should to be converted from YCbCr to RGB. This affects JPEG transfer syntaxes. """ return False def should_change_PhotometricInterpretation_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Photometric Interpretation* should be changed to RGB. This affects JPEG transfer syntaxes. """ return False def supports_transfer_syntax(transfer_syntax: pydicom.uid.UID) -> bool: """Return ``True`` if the handler supports the `transfer_syntax`. Parameters ---------- transfer_syntax : uid.UID The Transfer Syntax UID of the *Pixel Data* that is to be used with the handler. """ return transfer_syntax in SUPPORTED_TRANSFER_SYNTAXES def get_pixeldata(ds: "Dataset") -> "numpy.ndarray": """Return the *Pixel Data* as a :class:`numpy.ndarray`. Returns ------- numpy.ndarray A correctly sized (but not shaped) numpy array of the *Pixel Data*. Raises ------ ImportError If the required packages are not available. NotImplementedError If the transfer syntax is not supported. TypeError If the pixel data type is unsupported. """ tsyntax = ds.file_meta.TransferSyntaxUID if tsyntax not in SUPPORTED_TRANSFER_SYNTAXES: raise NotImplementedError( f"The jpeg_ls does not support this transfer syntax {tsyntax.name}" ) if not HAVE_JPEGLS: raise ImportError( "The jpeg_ls package is required to use pixel_array for this " f"transfer syntax {tsyntax.name}, and jpeg_ls could not be " "imported" ) pixel_bytes = bytearray() nr_frames = get_nr_frames(ds, warn=False) for frame in generate_frames(ds.PixelData, number_of_frames=nr_frames): im = jpeg_ls.decode(numpy.frombuffer(frame, dtype="u1")) pixel_bytes.extend(im.tobytes()) arr = numpy.frombuffer(pixel_bytes, pixel_dtype(ds)) if should_change_PhotometricInterpretation_to_RGB(ds): ds.PhotometricInterpretation = "RGB" return cast("numpy.ndarray", arr) pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/numpy_handler.py000066400000000000000000000273661515706620200267100ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Use the `numpy `_ package to convert supported pixel data to a :class:`numpy.ndarray`. **Supported transfer syntaxes** * 1.2.840.10008.1.2 : Implicit VR Little Endian * 1.2.840.10008.1.2.1 : Explicit VR Little Endian * 1.2.840.10008.1.2.1.99 : Deflated Explicit VR Little Endian * 1.2.840.10008.1.2.2 : Explicit VR Big Endian **Supported data** The numpy handler supports the conversion of data in the (7FE0,0008) *Float Pixel Data*, (7FE0,0009) *Double Float Pixel Data* and (7FE0,0010) *Pixel Data* elements to a :class:`~numpy.ndarray` provided the related :dcm:`Image Pixel`, :dcm:`Floating Point Image Pixel` or :dcm:`Double Floating Point Image Pixel` module elements have values given in the table below. +------------------------------------------------+---------------+----------+ | Element | Supported | | +-------------+---------------------------+------+ values | | | Tag | Keyword | Type | | | +=============+===========================+======+===============+==========+ | (0028,0002) | SamplesPerPixel | 1 | N | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0004) | PhotometricInterpretation | 1 | MONOCHROME1, | Required | | | | | MONOCHROME2, | | | | | | RGB, | | | | | | YBR_FULL, | | | | | | YBR_FULL_422 | | +-------------+---------------------------+------+---------------+----------+ | (0028,0006) | PlanarConfiguration | 1C | 0, 1 | Optional | +-------------+---------------------------+------+---------------+----------+ | (0028,0008) | NumberOfFrames | 1C | N | Optional | +-------------+---------------------------+------+---------------+----------+ | (0028,0010) | Rows | 1 | N | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0011) | Columns | 1 | N | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0100) | BitsAllocated | 1 | 1, 8, 16, 32, | Required | | | | | 64 | | +-------------+---------------------------+------+---------------+----------+ | (0028,0101) | BitsStored | 1 | 1, 8, 12, 16 | Optional | +-------------+---------------------------+------+---------------+----------+ | (0028,0103) | PixelRepresentation | 1C | 0, 1 | Optional | +-------------+---------------------------+------+---------------+----------+ """ from typing import TYPE_CHECKING, cast try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.misc import warn_and_log from pydicom.pixels.utils import ( pixel_dtype, get_expected_length, unpack_bits, ) import pydicom.uid if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset HANDLER_NAME = "Numpy" DEPENDENCIES = { "numpy": ("https://numpy.org/", "NumPy"), } SUPPORTED_TRANSFER_SYNTAXES = [ pydicom.uid.ExplicitVRLittleEndian, pydicom.uid.ImplicitVRLittleEndian, pydicom.uid.DeflatedExplicitVRLittleEndian, pydicom.uid.ExplicitVRBigEndian, ] def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_NP def supports_transfer_syntax(transfer_syntax: pydicom.uid.UID) -> bool: """Return ``True`` if the handler supports the `transfer_syntax`. Parameters ---------- transfer_syntax : uid.UID The Transfer Syntax UID of the *Pixel Data* that is to be used with the handler. """ return transfer_syntax in SUPPORTED_TRANSFER_SYNTAXES def needs_to_convert_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Pixel Data* should to be converted from YCbCr to RGB. This affects JPEG transfer syntaxes. """ return False def should_change_PhotometricInterpretation_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Photometric Interpretation* should be changed to RGB. This affects JPEG transfer syntaxes. """ return False def get_pixeldata(ds: "Dataset", read_only: bool = False) -> "np.ndarray": """Return a :class:`numpy.ndarray` of the pixel data. Parameters ---------- ds : Dataset The :class:`Dataset` containing an Image Pixel, Floating Point Image Pixel or Double Floating Point Image Pixel module and the *Pixel Data*, *Float Pixel Data* or *Double Float Pixel Data* to be converted. If (0028,0004) *Photometric Interpretation* is `'YBR_FULL_422'` then the pixel data will be resampled to 3 channel data as per Part 3, :dcm:`Annex C.7.6.3.1.2 ` of the DICOM Standard. read_only : bool, optional If ``False`` (default) then returns a writeable array that no longer uses the original memory. If ``True`` and the value of (0028,0100) *Bits Allocated* > 1 then returns a read-only array that uses the original memory buffer of the pixel data. If *Bits Allocated* = 1 then always returns a writeable array. Returns ------- np.ndarray The contents of (7FE0,0010) *Pixel Data*, (7FE0,0008) *Float Pixel Data* or (7FE0,0009) *Double Float Pixel Data* as a 1D array. Raises ------ AttributeError If `ds` is missing a required element. NotImplementedError If `ds` contains pixel data in an unsupported format. ValueError If the actual length of the pixel data doesn't match the expected length. """ transfer_syntax = ds.file_meta.TransferSyntaxUID # The check of transfer syntax must be first if transfer_syntax not in SUPPORTED_TRANSFER_SYNTAXES: raise NotImplementedError( "Unable to convert the pixel data as the transfer syntax " "is not supported by the numpy pixel data handler." ) # Check required elements keywords = ["PixelData", "FloatPixelData", "DoubleFloatPixelData"] px_keyword = [kw for kw in keywords if kw in ds] if len(px_keyword) != 1: raise AttributeError( "Unable to convert the pixel data: one of Pixel Data, Float " "Pixel Data or Double Float Pixel Data must be present in " "the dataset" ) # Attributes required by both Floating Point Image Pixel Module Attributes # and Image Pixel Description Macro Attributes required_elements = [ "BitsAllocated", "Rows", "Columns", "SamplesPerPixel", "PhotometricInterpretation", ] if px_keyword[0] == "PixelData": # Attributes required by Image Pixel Description Macro Attributes required_elements.extend(["PixelRepresentation", "BitsStored"]) missing = [elem for elem in required_elements if elem not in ds] if missing: raise AttributeError( "Unable to convert the pixel data as the following required " "elements are missing from the dataset: " + ", ".join(missing) ) if ds.SamplesPerPixel > 1: if not hasattr(ds, "PlanarConfiguration"): raise AttributeError( "Unable to convert the pixel data as the following " "conditionally required element is missing from the dataset: " "PlanarConfiguration" ) # May be Pixel Data, Float Pixel Data or Double Float Pixel Data pixel_data = getattr(ds, px_keyword[0]) # Calculate the expected length of the pixel data (in bytes) # Note: this does NOT include the trailing null byte for odd length data expected_len = get_expected_length(ds) # Check that the actual length of the pixel data is as expected actual_length = len(pixel_data) # Correct for the trailing NULL byte padding for odd length data padded_expected_len = expected_len + expected_len % 2 if actual_length < padded_expected_len: if actual_length == expected_len: warn_and_log("The odd length pixel data is missing a trailing padding byte") else: raise ValueError( f"The length of the pixel data in the dataset ({actual_length} bytes) " f"doesn't match the expected length ({padded_expected_len} bytes). " "The dataset may be corrupted or there may be an issue " "with the pixel data handler." ) elif actual_length > padded_expected_len: # PS 3.5, Section 8.1.1 msg = ( f"The length of the pixel data in the dataset ({actual_length} bytes) indicates " f"it contains excess padding. {actual_length - expected_len} bytes will be removed from the " "end of the data" ) # PS 3.3, Annex C.7.6.3 if ds.PhotometricInterpretation == "YBR_FULL_422": # Check to ensure we do have subsampled YBR 422 data ybr_full_length = expected_len / 2 * 3 + expected_len / 2 * 3 % 2 # >= as may also include excess padding if actual_length >= ybr_full_length: msg = ( "The Photometric Interpretation of the dataset is " "YBR_FULL_422, however the length of the pixel data " f"({actual_length} bytes) is a third larger than expected ({expected_len} bytes) " "which indicates that this may be incorrect. You may " "need to change the Photometric Interpretation to " "the correct value." ) warn_and_log(msg) # Unpack the pixel data into a 1D ndarray if ds.BitsAllocated == 1: # Skip any trailing padding bits nr_pixels = get_expected_length(ds, unit="pixels") arr = cast("np.ndarray", unpack_bits(pixel_data, as_array=True)[:nr_pixels]) else: # Skip the trailing padding byte(s) if present dtype = pixel_dtype(ds, as_float=("Float" in px_keyword[0])) if ( not ds.original_encoding[1] and dtype.itemsize == 1 and px_keyword[0] == "PixelData" and ds[0x7FE00010].VR == "OW" ): # handle the rare case that 1 byte pixels are encoded as OW # in Big Endian transfer syntax # Note: the host Endianness does not matter here; to be read # correctly for a 1 byte type the bytes must always be ordered # as Little Endian dtype16 = dtype.name[:-1] + "16" b = np.frombuffer(pixel_data, dtype=dtype16).byteswap().tobytes() arr = np.frombuffer(b[:expected_len], dtype=dtype) else: arr = np.frombuffer(pixel_data[:expected_len], dtype=dtype) if ds.PhotometricInterpretation == "YBR_FULL_422": # PS3.3 C.7.6.3.1.2: YBR_FULL_422 data needs to be resampled # Y1 Y2 B1 R1 -> Y1 B1 R1 Y2 B1 R1 out = np.zeros(expected_len // 2 * 3, dtype=dtype) out[::6] = arr[::4] # Y1 out[3::6] = arr[1::4] # Y2 out[1::6], out[4::6] = arr[2::4], arr[2::4] # B out[2::6], out[5::6] = arr[3::4], arr[3::4] # R arr = out if should_change_PhotometricInterpretation_to_RGB(ds): ds.PhotometricInterpretation = "RGB" if not read_only and ds.BitsAllocated > 1: return arr.copy() return arr pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/pillow_handler.py000066400000000000000000000171621515706620200270370ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Use the `pillow `_ Python package to decode *Pixel Data*. """ import io import logging from typing import TYPE_CHECKING, cast if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset try: import numpy HAVE_NP = True except ImportError: HAVE_NP = False try: from PIL import Image, features HAVE_PIL = True HAVE_JPEG = features.check_codec("jpg") HAVE_JPEG2K = features.check_codec("jpg_2000") except ImportError: HAVE_PIL = False HAVE_JPEG = False HAVE_JPEG2K = False from pydicom import config from pydicom.encaps import generate_frames from pydicom.misc import warn_and_log from pydicom.pixels.utils import ( pixel_dtype, get_j2k_parameters, get_nr_frames, ) from pydicom.uid import ( UID, JPEG2000, JPEG2000Lossless, JPEGBaseline8Bit, JPEGExtended12Bit, ) logger = logging.getLogger("pydicom") PillowJPEG2000TransferSyntaxes = [JPEG2000, JPEG2000Lossless] PillowJPEGTransferSyntaxes = [JPEGBaseline8Bit, JPEGExtended12Bit] PillowSupportedTransferSyntaxes = ( PillowJPEGTransferSyntaxes + PillowJPEG2000TransferSyntaxes ) HANDLER_NAME = "Pillow" DEPENDENCIES = { "numpy": ("https://numpy.org/", "NumPy"), "PIL": ("https://python-pillow.org/", "Pillow"), } def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_NP and HAVE_PIL def supports_transfer_syntax(transfer_syntax: UID) -> bool: """Return ``True`` if the handler supports the `transfer_syntax`. Parameters ---------- transfer_syntax : uid.UID The Transfer Syntax UID of the *Pixel Data* that is to be used with the handler. """ return transfer_syntax in PillowSupportedTransferSyntaxes def needs_to_convert_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Pixel Data* should to be converted from YCbCr to RGB. This affects JPEG transfer syntaxes. """ return False def should_change_PhotometricInterpretation_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Photometric Interpretation* should be changed to RGB. This affects JPEG transfer syntaxes. """ # return ds.SamplesPerPixel == 3 return False def _decompress_single_frame( data: bytes, transfer_syntax: str, photometric_interpretation: str ) -> "Image": """Decompresses a single frame of an encapsulated Pixel Data element. Parameters ---------- data: bytes Compressed pixel data transfer_syntax: str Transfer Syntax UID photometric_interpretation: str Photometric Interpretation Returns ------- PIL.Image Decompressed pixel data """ fio = io.BytesIO(data) image = Image.open(fio) # This hack ensures that RGB color images, which were not # color transformed (i.e. not transformed into YCbCr color space) # upon JPEG compression are decompressed correctly. # Since Pillow assumes that images were transformed into YCbCr color # space prior to compression, setting the value of "mode" to YCbCr # signals Pillow to not apply any color transformation upon # decompression. if ( transfer_syntax in PillowJPEGTransferSyntaxes and photometric_interpretation == "RGB" and "adobe_transform" not in image.info ): image.draft("YCbCr", image.size) return image def get_pixeldata(ds: "Dataset") -> "numpy.ndarray": """Return a :class:`numpy.ndarray` of the *Pixel Data*. Parameters ---------- ds : Dataset The :class:`Dataset` containing an Image Pixel module and the *Pixel Data* to be decompressed and returned. Returns ------- numpy.ndarray The contents of (7FE0,0010) *Pixel Data* as a 1D array. Raises ------ ImportError If Pillow is not available. NotImplementedError If the transfer syntax is not supported """ transfer_syntax = ds.file_meta.TransferSyntaxUID if not HAVE_PIL: raise ImportError( f"The pillow package is required to use pixel_array for " f"this transfer syntax {transfer_syntax.name}, and pillow could " f"not be imported." ) if not HAVE_JPEG and transfer_syntax in PillowJPEGTransferSyntaxes: raise NotImplementedError( f"The pixel data with transfer syntax {transfer_syntax.name}, " f"cannot be read because Pillow lacks the JPEG plugin" ) if not HAVE_JPEG2K and transfer_syntax in PillowJPEG2000TransferSyntaxes: raise NotImplementedError( f"The pixel data with transfer syntax {transfer_syntax.name}, " f"cannot be read because Pillow lacks the JPEG 2000 plugin" ) if transfer_syntax == JPEGExtended12Bit and ds.BitsAllocated != 8: raise NotImplementedError( f"{JPEGExtended12Bit} - {JPEGExtended12Bit.name} is only supported " "by Pillow if (0028,0100) Bits Allocated = 8" ) photometric_interpretation = cast(str, ds.PhotometricInterpretation) rows = cast(int, ds.Rows) columns = cast(int, ds.Columns) bits_stored = cast(int, ds.BitsStored) bits_allocated = cast(int, ds.BitsAllocated) nr_frames = get_nr_frames(ds, warn=False) pixel_bytes = bytearray() j2k_precision, j2k_sign = None, None for frame in generate_frames(ds.PixelData, number_of_frames=nr_frames): im = _decompress_single_frame( frame, transfer_syntax, photometric_interpretation ) if "YBR" in photometric_interpretation: im.draft("YCbCr", (rows, columns)) pixel_bytes.extend(im.tobytes()) if not j2k_precision: params = get_j2k_parameters(frame) j2k_precision = cast(int, params.setdefault("precision", bits_stored)) j2k_sign = params.setdefault("is_signed", None) logger.debug(f"Successfully read {len(pixel_bytes)} pixel bytes") arr = numpy.frombuffer(pixel_bytes, pixel_dtype(ds)) if transfer_syntax in PillowJPEG2000TransferSyntaxes: # Pillow converts N-bit data to 8- or 16-bit unsigned data, # See Pillow src/libImaging/Jpeg2KDecode.c::j2ku_gray_i shift = bits_allocated - bits_stored if j2k_precision and j2k_precision != bits_stored: warn_and_log( f"The (0028,0101) 'Bits Stored' value ({bits_stored}-bit) " f"doesn't match the JPEG 2000 data ({j2k_precision}-bit). " f"It's recommended that you change the 'Bits Stored' value" ) if config.APPLY_J2K_CORRECTIONS and j2k_precision: # Corrections based on J2K data shift = bits_allocated - j2k_precision if not j2k_sign and j2k_sign != ds.PixelRepresentation: # Convert unsigned J2K data to 2's complement arr = numpy.right_shift(arr, shift) else: if ds.PixelRepresentation == 1: # Pillow converts signed data to unsigned # so we need to undo this conversion arr -= numpy.uint32(2 ** (bits_allocated - 1)) if shift: arr = numpy.right_shift(arr, shift) else: # Corrections based on dataset elements if ds.PixelRepresentation == 1: arr -= numpy.uint32(2 ** (bits_allocated - 1)) if shift: arr = numpy.right_shift(arr, shift) if should_change_PhotometricInterpretation_to_RGB(ds): ds.PhotometricInterpretation = "RGB" return cast("numpy.ndarray", arr) pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/pylibjpeg_handler.py000066400000000000000000000254751515706620200275240ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Use the :gh:`pylibjpeg ` package to convert supported pixel data to a :class:`numpy.ndarray`. .. versionadded:: 2.1 **Supported data** The pylibjpeg handler supports the conversion of data in the (7FE0,0010) *Pixel Data* elements to a :class:`~numpy.ndarray` provided the related :dcm:`Image Pixel` module elements have values given in the table below. +------------------------------------------------+---------------+----------+ | Element | Supported | | +-------------+---------------------------+------+ values | | | Tag | Keyword | Type | | | +=============+===========================+======+===============+==========+ | (0028,0002) | SamplesPerPixel | 1 | 1, 3 | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0004) | PhotometricInterpretation | 1 | MONOCHROME1, | Required | | | | | MONOCHROME2, | | | | | | RGB, | | | | | | YBR_FULL, | | | | | | YBR_FULL_422, | | | | | | YBR_ICT, | | | | | | YBR_RCT | | +-------------+---------------------------+------+---------------+----------+ | (0028,0006) | PlanarConfiguration | 1C | 0, 1 | Optional | +-------------+---------------------------+------+---------------+----------+ | (0028,0008) | NumberOfFrames | 1C | N | Optional | +-------------+---------------------------+------+---------------+----------+ | (0028,0010) | Rows | 1 | N | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0011) | Columns | 1 | N | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0100) | BitsAllocated | 1 | 8, 16 | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0101) | BitsStored | 1 | Up to 16 | Required | +-------------+---------------------------+------+---------------+----------+ | (0028,0103) | PixelRepresentation | 1 | 0, 1 | Required | +-------------+---------------------------+------+---------------+----------+ .. versionchanged:: 2.2 Added support for *RLE Lossless* via the `pylibjpeg-rle` plugin. """ from copy import deepcopy import logging from typing import TYPE_CHECKING, cast from collections.abc import Iterable if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: import pylibjpeg # noqa: F401 HAVE_PYLIBJPEG = True except ImportError: HAVE_PYLIBJPEG = False if HAVE_PYLIBJPEG: from pylibjpeg.utils import get_pixel_data_decoders, Decoder try: import openjpeg # noqa: F401 HAVE_OPENJPEG = True except ImportError: HAVE_OPENJPEG = False try: import libjpeg # noqa: F401 HAVE_LIBJPEG = True except ImportError: HAVE_LIBJPEG = False try: import rle # noqa: F401 HAVE_RLE = True except ImportError: HAVE_RLE = False from pydicom import config from pydicom.encaps import generate_frames as frame_generator from pydicom.pixels.utils import ( pixel_dtype, get_expected_length, reshape_pixel_array, get_j2k_parameters, get_nr_frames, ) from pydicom.uid import ( JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, RLELossless, UID, ) LOGGER = logging.getLogger("pydicom") HANDLER_NAME = "pylibjpeg" if HAVE_PYLIBJPEG: _DECODERS = get_pixel_data_decoders() _LIBJPEG_SYNTAXES = [ JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, ] _OPENJPEG_SYNTAXES = [JPEG2000Lossless, JPEG2000] _RLE_SYNTAXES = [RLELossless] SUPPORTED_TRANSFER_SYNTAXES = _LIBJPEG_SYNTAXES + _OPENJPEG_SYNTAXES + _RLE_SYNTAXES DEPENDENCIES = {"numpy": ("https://numpy.org/", "NumPy")} def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_NP and HAVE_PYLIBJPEG def supports_transfer_syntax(tsyntax: UID) -> bool: """Return ``True`` if the handler supports the `tsyntax`. Parameters ---------- tsyntax : pydicom.uid.UID The *Transfer Syntax UID* of the *Pixel Data* that is to be used with the handler. """ return tsyntax in SUPPORTED_TRANSFER_SYNTAXES def needs_to_convert_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Pixel Data* should to be converted from YCbCr to RGB. This affects JPEG transfer syntaxes. """ return False def should_change_PhotometricInterpretation_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Photometric Interpretation* should be changed to RGB. This affects JPEG transfer syntaxes. """ return False def as_array(ds: "Dataset") -> "np.ndarray": """Return the entire *Pixel Data* as an :class:`~numpy.ndarray`. .. versionadded:: 2.1 Parameters ---------- ds : pydicom.dataset.Dataset The :class:`Dataset` containing an :dcm:`Image Pixel ` module and the *Pixel Data* to be converted. Returns ------- numpy.ndarray The contents of (7FE0,0010) *Pixel Data* as an :class:`~numpy.ndarray` with shape (rows, columns), (rows, columns, components), (frames, rows, columns), or (frames, rows, columns, components) depending on the dataset. """ return reshape_pixel_array(ds, get_pixeldata(ds)) def generate_frames(ds: "Dataset", reshape: bool = True) -> Iterable["np.ndarray"]: """Yield a *Pixel Data* frame from `ds` as an :class:`~numpy.ndarray`. .. versionadded:: 2.1 Parameters ---------- ds : pydicom.dataset.Dataset The :class:`Dataset` containing an :dcm:`Image Pixel ` module and the *Pixel Data* to be converted. reshape : bool, optional If ``True`` (default), then the returned :class:`~numpy.ndarray` will be reshaped to the correct dimensions. If ``False`` then no reshaping will be performed. Yields ------- numpy.ndarray A single frame of (7FE0,0010) *Pixel Data* as an :class:`~numpy.ndarray` with an appropriate dtype for the data. Raises ------ AttributeError If `ds` is missing a required element. RuntimeError If the plugin required to decode the pixel data is not installed. """ tsyntax = ds.file_meta.TransferSyntaxUID # The check of transfer syntax must be first if tsyntax not in _DECODERS: if tsyntax in _OPENJPEG_SYNTAXES: plugin = "pylibjpeg-openjpeg" elif tsyntax in _LIBJPEG_SYNTAXES: plugin = "pylibjpeg-libjpeg" else: plugin = "pylibjpeg-rle" raise RuntimeError( f"Unable to convert the Pixel Data as the '{plugin}' plugin is " f"not installed" ) # Check required elements required_elements = [ "BitsAllocated", "Rows", "Columns", "PixelRepresentation", "SamplesPerPixel", "PhotometricInterpretation", "PixelData", ] missing = [elem for elem in required_elements if elem not in ds] if missing: raise AttributeError( "Unable to convert the pixel data as the following required " f"elements are missing from the dataset: {', '.join(missing)}" ) decoder = cast(Decoder, _DECODERS[tsyntax]) LOGGER.debug(f"Decoding {tsyntax.name} encoded Pixel Data using {decoder}") nr_frames = get_nr_frames(ds, warn=False) # Need a copy of the pixel module to avoid modifying the original pixel_module = deepcopy(ds.group_dataset(0x0028)) dtype = pixel_dtype(ds) bits_stored = cast(int, ds.BitsStored) bits_allocated = cast(int, ds.BitsAllocated) for frame in frame_generator(ds.PixelData, number_of_frames=nr_frames): arr = decoder(frame, ds=pixel_module) if tsyntax in [JPEG2000, JPEG2000Lossless] and config.APPLY_J2K_CORRECTIONS: param = get_j2k_parameters(frame) j2k_sign = param.setdefault("is_signed", True) j2k_precision = cast(int, param.setdefault("precision", bits_stored)) shift = bits_allocated - j2k_precision if shift and not j2k_sign and j2k_sign != ds.PixelRepresentation: # Convert unsigned J2K data to 2s complement # Can only get here if parsed J2K codestream OK pixel_module.PixelRepresentation = 0 arr = arr.view(pixel_dtype(pixel_module)) arr = np.left_shift(arr, shift) arr = arr.astype(dtype) arr = np.right_shift(arr, shift) if arr.dtype != dtype: # Re-view as pylibjpeg returns a 1D uint8 ndarray arr = arr.view(dtype) if not reshape: yield arr continue if ds.SamplesPerPixel == 1: yield arr.reshape(ds.Rows, ds.Columns) else: if tsyntax == RLELossless: # RLE Lossless is Planar Configuration 1 arr = arr.reshape(ds.SamplesPerPixel, ds.Rows, ds.Columns) yield arr.transpose(1, 2, 0) else: # JPEG, JPEG-LS and JPEG 2000 are all Planar Configuration 0 yield arr.reshape(ds.Rows, ds.Columns, ds.SamplesPerPixel) def get_pixeldata(ds: "Dataset") -> "np.ndarray": """Return a :class:`numpy.ndarray` of the pixel data. .. versionadded:: 2.1 Parameters ---------- ds : pydicom.dataset.Dataset The :class:`Dataset` containing an :dcm:`Image Pixel ` module and the *Pixel Data* to be converted. Returns ------- numpy.ndarray The contents of (7FE0,0010) *Pixel Data* as a 1D array. """ expected_len = get_expected_length(ds, "pixels") frame_len = expected_len // get_nr_frames(ds) # Empty destination array for our decoded pixel data arr = np.empty(expected_len, pixel_dtype(ds)) generate_offsets = range(0, expected_len, frame_len) for frame, offset in zip(generate_frames(ds, False), generate_offsets): arr[offset : offset + frame_len] = frame return arr pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/rle_handler.py000066400000000000000000000337621515706620200263170ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Use the `numpy `_ package to convert RLE lossless *Pixel Data* to a :class:`numpy.ndarray`. **Supported transfer syntaxes** * 1.2.840.10008.1.2.5 : RLE Lossless **Supported data** The RLE handler supports the conversion of data in the (7FE0,0010) *Pixel Data* element to a numpy ndarray provided the related :dcm:`Image Pixel` module elements have values given in the table below. +------------------------------------------------+--------------+----------+ | Element | Supported | | +-------------+---------------------------+------+ values | | | Tag | Keyword | Type | | | +=============+===========================+======+==============+==========+ | (0028,0002) | SamplesPerPixel | 1 | N | Required | +-------------+---------------------------+------+--------------+----------+ | (0028,0006) | PlanarConfiguration | 1C | 1 | Optional | +-------------+---------------------------+------+--------------+----------+ | (0028,0008) | NumberOfFrames | 1C | N | Optional | +-------------+---------------------------+------+--------------+----------+ | (0028,0010) | Rows | 1 | N | Required | +-------------+---------------------------+------+--------------+----------+ | (0028,0011) | Columns | 1 | N | Required | +-------------+---------------------------+------+--------------+----------+ | (0028,0100) | BitsAllocated | 1 | 8, 16, 32 | Required | +-------------+---------------------------+------+--------------+----------+ | (0028,0103) | PixelRepresentation | 1 | 0, 1 | Required | +-------------+---------------------------+------+--------------+----------+ """ from struct import unpack from typing import TYPE_CHECKING, cast try: import numpy as np import numpy # noqa: F401 HAVE_RLE = True except ImportError: HAVE_RLE = False from pydicom.encaps import generate_frames from pydicom.misc import warn_and_log from pydicom.pixels.utils import pixel_dtype, get_nr_frames import pydicom.uid if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset HANDLER_NAME = "RLE Lossless" DEPENDENCIES = {"numpy": ("https://numpy.org/", "NumPy")} SUPPORTED_TRANSFER_SYNTAXES = [pydicom.uid.RLELossless] def is_available() -> bool: """Return ``True`` if the handler has its dependencies met.""" return HAVE_RLE def supports_transfer_syntax(transfer_syntax: str) -> bool: """Return ``True`` if the handler supports the `transfer_syntax`. Parameters ---------- transfer_syntax : uid.UID The Transfer Syntax UID of the *Pixel Data* that is to be used with the handler. """ return transfer_syntax in SUPPORTED_TRANSFER_SYNTAXES def needs_to_convert_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Pixel Data* should to be converted from YCbCr to RGB. This affects JPEG transfer syntaxes. """ return False def should_change_PhotometricInterpretation_to_RGB(ds: "Dataset") -> bool: """Return ``True`` if the *Photometric Interpretation* should be changed to RGB. This affects JPEG transfer syntaxes. """ return False def get_pixeldata(ds: "Dataset", rle_segment_order: str = ">") -> "np.ndarray": """Return an :class:`numpy.ndarray` of the *Pixel Data*. Parameters ---------- ds : dataset.Dataset The :class:`Dataset` containing an Image Pixel module and the RLE encoded *Pixel Data* to be converted. rle_segment_order : str The order of segments used by the RLE decoder when dealing with *Bits Allocated* > 8. Each RLE segment contains 8-bits of the pixel data, and segments are supposed to be ordered from MSB to LSB. A value of ``'>'`` means interpret the segments as being in big endian order (default) while a value of ``'<'`` means interpret the segments as being in little endian order which may be possible if the encoded data is non-conformant. Returns ------- numpy.ndarray The decoded contents of (7FE0,0010) *Pixel Data* as a 1D array. Raises ------ AttributeError If `ds` is missing a required element. NotImplementedError If `ds` contains pixel data in an unsupported format. ValueError If the actual length of the pixel data doesn't match the expected length. """ transfer_syntax = ds.file_meta.TransferSyntaxUID # The check of transfer syntax must be first if transfer_syntax not in SUPPORTED_TRANSFER_SYNTAXES: raise NotImplementedError( "Unable to convert the pixel data as the transfer syntax " "is not supported by the RLE pixel data handler." ) # Check required elements required_elements = [ "PixelData", "BitsAllocated", "Rows", "Columns", "PixelRepresentation", "SamplesPerPixel", ] missing = [elem for elem in required_elements if elem not in ds] if missing: raise AttributeError( "Unable to convert the pixel data as the following required " "elements are missing from the dataset: " + ", ".join(missing) ) nr_bits = cast(int, ds.BitsAllocated) nr_samples = cast(int, ds.SamplesPerPixel) nr_frames = get_nr_frames(ds, warn=False) rows = cast(int, ds.Rows) cols = cast(int, ds.Columns) # Decompress each frame of the pixel data pixel_data = bytearray() for frame in generate_frames(ds.PixelData, number_of_frames=nr_frames): im = _rle_decode_frame( frame, rows, cols, nr_samples, nr_bits, rle_segment_order ) pixel_data.extend(im) arr = np.frombuffer(pixel_data, pixel_dtype(ds)) if should_change_PhotometricInterpretation_to_RGB(ds): ds.PhotometricInterpretation = "RGB" return cast("np.ndarray", arr) def _parse_rle_header(header: bytes) -> list[int]: """Return a list of byte offsets for the segments in RLE data. **RLE Header Format** The RLE Header contains the number of segments for the image and the starting offset of each segment. Each of these numbers is represented as an unsigned long stored in little-endian. The RLE Header is 16 long words in length (i.e. 64 bytes) which allows it to describe a compressed image with up to 15 segments. All unused segment offsets shall be set to zero. As an example, the table below describes an RLE Header with 3 segments as would typically be used with 8-bit RGB or YCbCr data (with 1 segment per channel). +--------------+---------------------------------+------------+ | Byte offset | Description | Value | +==============+=================================+============+ | 0 | Number of segments | 3 | +--------------+---------------------------------+------------+ | 4 | Offset of segment 1, N bytes | 64 | +--------------+---------------------------------+------------+ | 8 | Offset of segment 2, M bytes | 64 + N | +--------------+---------------------------------+------------+ | 12 | Offset of segment 3 | 64 + N + M | +--------------+---------------------------------+------------+ | 16 | Offset of segment 4 (not used) | 0 | +--------------+---------------------------------+------------+ | ... | ... | 0 | +--------------+---------------------------------+------------+ | 60 | Offset of segment 15 (not used) | 0 | +--------------+---------------------------------+------------+ Parameters ---------- header : bytes The RLE header data (i.e. the first 64 bytes of an RLE frame). Returns ------- list of int The byte offsets for each segment in the RLE data. Raises ------ ValueError If there are more than 15 segments or if the header is not 64 bytes long. References ---------- DICOM Standard, Part 5, :dcm:`Annex G` """ if len(header) != 64: raise ValueError("The RLE header can only be 64 bytes long") nr_segments = unpack(" 15: raise ValueError( f"The RLE header specifies an invalid number of segments ({nr_segments})" ) offsets = unpack(f"<{nr_segments}L", header[4 : 4 * (nr_segments + 1)]) return list(offsets) def _rle_decode_frame( data: bytes, rows: int, columns: int, nr_samples: int, nr_bits: int, segment_order: str = ">", ) -> bytearray: """Decodes a single frame of RLE encoded data. Each frame may contain up to 15 segments of encoded data. Parameters ---------- data : bytes The RLE frame data rows : int The number of output rows columns : int The number of output columns nr_samples : int Number of samples per pixel (e.g. 3 for RGB data). nr_bits : int Number of bits per sample - must be a multiple of 8 segment_order : str The segment order of the `data`, '>' for big endian (default), '<' for little endian (non-conformant). Returns ------- bytearray The frame's decoded data in little endian and planar configuration 1 byte ordering (i.e. for RGB data this is all red pixels then all green then all blue, with the bytes for each pixel ordered from MSB to LSB when reading left to right). """ if nr_bits % 8: raise NotImplementedError( "Unable to decode RLE encoded pixel data with a (0028,0100) " f"'Bits Allocated' value of {nr_bits}" ) # Parse the RLE Header offsets = _parse_rle_header(data[:64]) nr_segments = len(offsets) # Check that the actual number of segments is as expected bytes_per_sample = nr_bits // 8 if nr_segments != nr_samples * bytes_per_sample: raise ValueError( "The number of RLE segments in the pixel data doesn't match the " f"expected amount ({nr_segments} vs. " f"{nr_samples * bytes_per_sample} segments)" ) # Ensure the last segment gets decoded offsets.append(len(data)) # Preallocate with null bytes decoded = bytearray(rows * columns * nr_samples * bytes_per_sample) # Example: # RLE encoded data is ordered like this (for 16-bit, 3 sample): # Segment: 0 | 1 | 2 | 3 | 4 | 5 # R MSB | R LSB | G MSB | G LSB | B MSB | B LSB # A segment contains only the MSB or LSB parts of all the sample pixels # To minimise the amount of array manipulation later, and to make things # faster we interleave each segment in a manner consistent with a planar # configuration of 1 (and use little endian byte ordering): # All red samples | All green samples | All blue # Pxl 1 Pxl 2 ... Pxl N | Pxl 1 Pxl 2 ... Pxl N | ... # LSB MSB LSB MSB ... LSB MSB | LSB MSB LSB MSB ... LSB MSB | ... # `stride` is the total number of bytes of each sample plane stride = bytes_per_sample * rows * columns for sample_number in range(nr_samples): le_gen = range(bytes_per_sample) byte_offsets = le_gen if segment_order == "<" else reversed(le_gen) for byte_offset in byte_offsets: # Decode the segment ii = sample_number * bytes_per_sample + byte_offset # ii is 1, 0, 3, 2, 5, 4 for the example above # This is where the segment order correction occurs segment = _rle_decode_segment(data[offsets[ii] : offsets[ii + 1]]) # Check that the number of decoded bytes is correct actual_length = len(segment) if actual_length < rows * columns: raise ValueError( "The amount of decoded RLE segment data doesn't match the " f"expected amount ({actual_length} vs. " f"{rows * columns} bytes)" ) elif actual_length != rows * columns: warn_and_log( "The decoded RLE segment contains non-conformant padding " f"- {actual_length} vs. {rows * columns} bytes expected" ) if segment_order == ">": byte_offset = bytes_per_sample - byte_offset - 1 # For 100 pixel/plane, 32-bit, 3 sample data, `start` will be # 0, 1, 2, 3, 400, 401, 402, 403, 800, 801, 802, 803 start = byte_offset + (sample_number * stride) decoded[start : start + stride : bytes_per_sample] = segment[ : rows * columns ] return decoded def _rle_decode_segment(data: bytes) -> bytearray: """Return a single segment of decoded RLE data as bytearray. Parameters ---------- data : bytes The segment data to be decoded. Returns ------- bytearray The decoded segment. """ data = bytearray(data) result = bytearray() pos = 0 result_extend = result.extend try: while True: # header_byte is N + 1 header_byte = data[pos] + 1 pos += 1 if header_byte > 129: # Extend by copying the next byte (-N + 1) times # however since using uint8 instead of int8 this will be # (256 - N + 1) times result_extend(data[pos : pos + 1] * (258 - header_byte)) pos += 1 elif header_byte < 129: # Extend by literally copying the next (N + 1) bytes result_extend(data[pos : pos + header_byte]) pos += header_byte except IndexError: pass return result pydicom-pydicom-20aa4b7/src/pydicom/pixel_data_handlers/util.py000066400000000000000000000073251515706620200250110ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. # TODO: remove module in v4.0 """Utility functions used in the pixel data handlers.""" from sys import byteorder from typing import Any try: import numpy as np except ImportError: pass from pydicom import config from pydicom.misc import warn_and_log from pydicom.pixels.processing import ( apply_color_lut as _apply_color_lut, apply_modality_lut as _apply_modality_lut, apply_voi_lut as _apply_voi_lut, apply_voi as _apply_voi, apply_windowing as _apply_windowing, convert_color_space as _convert_color_space, ) from pydicom.pixels.utils import ( expand_ybr422 as _expand_ybr422, get_expected_length as _get_expected_length, get_image_pixel_ids as _get_image_pixel_ids, get_j2k_parameters as _get_j2k_parameters, get_nr_frames as _get_nr_frames, pack_bits as _pack_bits, pixel_dtype as _pixel_dtype, reshape_pixel_array as _reshape_pixel_array, unpack_bits as _unpack_bits, ) def _dtype_corrected_for_endianness( is_little_endian: bool, numpy_dtype: "np.dtype" ) -> "np.dtype": """Return a :class:`numpy.dtype` corrected for system and :class:`Dataset` endianness. .. deprecated:: 3.0 This function will be removed in v4.0. Parameters ---------- is_little_endian : bool The endianness of the affected :class:`~pydicom.dataset.Dataset`. numpy_dtype : numpy.dtype The numpy data type used for the *Pixel Data* without considering endianness. Raises ------ ValueError If `is_little_endian` is ``None``, e.g. not initialized. Returns ------- numpy.dtype The numpy data type used for the *Pixel Data* without considering endianness. """ if is_little_endian is None: raise ValueError( "Dataset attribute 'is_little_endian' " "has to be set before writing the dataset" ) if is_little_endian != (byteorder == "little"): return numpy_dtype.newbyteorder("S") return numpy_dtype _DEPRECATED = { "apply_color_lut": _apply_color_lut, "apply_modality_lut": _apply_modality_lut, "apply_voi_lut": _apply_voi_lut, "apply_voi": _apply_voi, "apply_windowing": _apply_windowing, "convert_color_space": _convert_color_space, "pack_bits": _pack_bits, "unpack_bits": _unpack_bits, } _DEPRECATED_UTIL = { "expand_ybr422": _expand_ybr422, "get_expected_length": _get_expected_length, "get_image_pixel_ids": _get_image_pixel_ids, "get_j2k_parameters": _get_j2k_parameters, "get_nr_frames": _get_nr_frames, "pixel_dtype": _pixel_dtype, "reshape_pixel_array": _reshape_pixel_array, } def __getattr__(name: str) -> Any: if name in _DEPRECATED and not config._use_future: msg = ( "The 'pydicom.pixel_data_handlers' module will be removed " f"in v4.0, please use 'from pydicom.pixels import {name}' instead" ) warn_and_log(msg, DeprecationWarning) return _DEPRECATED[name] if name in _DEPRECATED_UTIL and not config._use_future: msg = ( "The 'pydicom.pixel_data_handlers' module will be removed " f"in v4.0, please use 'from pydicom.pixels.utils import {name}' instead" ) warn_and_log(msg, DeprecationWarning) return _DEPRECATED_UTIL[name] if name == "dtype_corrected_for_endianness" and not config._use_future: msg = ( "'dtype_corrected_for_endianness' is deprecated and will be " "removed in v4.0" ) warn_and_log(msg, DeprecationWarning) return _dtype_corrected_for_endianness raise AttributeError(f"module {__name__!r} has no attribute {name!r}") pydicom-pydicom-20aa4b7/src/pydicom/pixels/000077500000000000000000000000001515706620200207655ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/pixels/__init__.py000066400000000000000000000011461515706620200231000ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. from pydicom.pixels.decoders.base import get_decoder from pydicom.pixels.encoders.base import get_encoder from pydicom.pixels.processing import ( apply_color_lut, apply_icc_profile, apply_modality_lut, apply_presentation_lut, apply_rescale, apply_voi_lut, apply_voi, apply_windowing, convert_color_space, create_icc_transform, ) from pydicom.pixels.utils import ( as_pixel_options, compress, decompress, iter_pixels, pack_bits, pixel_array, set_pixel_data, unpack_bits, ) pydicom-pydicom-20aa4b7/src/pydicom/pixels/common.py000066400000000000000000000615051515706620200226360ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Common objects for pixel data handling.""" from enum import Enum, unique from importlib import import_module from typing import TYPE_CHECKING, Any, TypedDict from pydicom.misc import warn_and_log from pydicom.pixels.utils import as_pixel_options from pydicom.uid import UID if TYPE_CHECKING: # pragma: no cover from collections.abc import Callable from pydicom.dataset import Dataset from pydicom.pixels.decoders.base import DecodeOptions, DecodeFunction from pydicom.pixels.encoders.base import EncodeOptions, EncodeFunction Buffer = bytes | bytearray | memoryview class CoderBase: """Base class for Decoder and Encoder.""" def __init__(self, uid: UID, decoder: bool) -> None: """Create a new data decoder or encoder. Parameters ---------- uid : pydicom.uid.UID The supported *Transfer Syntax UID*. decoder : bool ``True`` for a decoder subclass, ``False`` for an encoder subclass. """ # The *Transfer Syntax UID* data will be encoded to self._uid = uid # Available plugins self._available: dict[str, Callable] = {} # Unavailable plugins - missing dependencies or other reason self._unavailable: dict[str, tuple[str, ...]] = {} # True for a Decoder class, False for an Encoder class self._decoder = decoder def add_plugin(self, label: str, import_path: tuple[str, str]) -> None: """Add a plugin to the class instance. .. warning:: This method is not thread-safe. The requirements for encoding plugins are available :doc:`here`, while the requirements for decoding plugins are available :doc:`here `. Only encoding plugins should be added to :class:`~pydicom.pixels.encoders.base.Encoder` class instances and only decoding plugins should be added to :class:`~pydicom.pixels.decoders.base.Decoder` class instances. Parameters ---------- label : str The label to use for the plugin, should be unique. import_path : Tuple[str, str] The module import path and the function's name (e.g. ``('pydicom.pixels.encoders.pylibjpeg', 'encode_pixel_data')`` or ``('pydicom.pixels.decoders.pylibjpeg', 'decode_pixel_data')``). Raises ------ ModuleNotFoundError If the module import path is incorrect or unavailable. AttributeError If the plugin's required functions and attributes aren't found in the module. """ if label in self._available or label in self._unavailable: raise ValueError( f"'{type(self).__name__}' already has a plugin named '{label}'" ) module = import_module(import_path[0]) # `is_available(UID)` is required for plugins if module.is_available(self.UID): self._available[label] = getattr(module, import_path[1]) else: # `DE/ENCODER_DEPENDENCIES[UID]` is required for plugins if self._decoder: deps = module.DECODER_DEPENDENCIES else: deps = module.ENCODER_DEPENDENCIES if self.UID not in deps: raise ValueError( f"The '{label}' plugin doesn't support '{self.UID.name}'" ) self._unavailable[label] = deps[self.UID] def add_plugins(self, plugins: list[tuple[str, tuple[str, str]]]) -> None: """Add multiple plugins to the class instance. .. warning:: This method is not thread-safe. The requirements for encoding plugins are available :doc:`here`, while the requirements for decoding plugins are available :doc:`here `. Only encoding plugins should be added to :class:`~pydicom.pixels.encoders.base.Encoder` class instances and only decoding plugins should be added to :class:`~pydicom.pixels.decoders.base.Decoder` class instances. Parameters ---------- plugins : list[tuple[str, tuple[str, str]]] A list of [label, import path] for the plugins, where: * `label` is the label to use for the plugin, which should be unique. * `import path` is the module import path and the function's name (e.g. ``('pydicom.pixels.encoders.pylibjpeg', 'encode_pixel_data')`` or ``('pydicom.pixels.decoders.pylibjpeg', 'decode_pixel_data')``). """ for label, import_path in plugins: self.add_plugin(label, import_path) @property def available_plugins(self) -> tuple[str, ...]: """Return a tuple containing available plugins.""" return tuple(sorted(self._available.keys())) @property def is_available(self) -> bool: """Return ``True`` if plugins are available that can be used to encode or decode data, ``False`` otherwise. """ if self._decoder and not self.UID.is_encapsulated: return True return bool(self._available) @property def is_encapsulated(self) -> bool: """Return ``True`` if the decoder is for an encapsulated transfer syntax, ``False`` otherwise. """ return self.UID.is_encapsulated @property def is_native(self) -> bool: """Return ``True`` if the decoder is for an native transfer syntax, ``False`` otherwise. """ return not self.is_encapsulated @property def missing_dependencies(self) -> list[str]: """Return nice strings for plugins with missing dependencies.""" s = [] for label, deps in self._unavailable.items(): if not deps: # A plugin might have no dependencies and be unavailable for # other reasons s.append(f"{label} - plugin indicating it is unavailable") elif len(deps) > 1: s.append(f"{label} - requires {', '.join(deps[:-1])} and {deps[-1]}") else: s.append(f"{label} - requires {deps[0]}") return s def remove_plugin(self, label: str) -> None: """Remove a plugin. .. warning:: This method is not thread-safe. Parameters ---------- label : str The label of the plugin to remove. """ if label in self._available: del self._available[label] elif label in self._unavailable: del self._unavailable[label] else: raise ValueError(f"Unable to remove '{label}', no such plugin'") @property def UID(self) -> UID: """Return the corresponding *Transfer Syntax UID* as :class:`~pydicom.uid.UID`.""" return self._uid def _validate_plugins( self, plugin: str = "" ) -> dict[str, "DecodeFunction"] | dict[str, "EncodeFunction"]: """Return available plugins. Parameters ---------- plugin : str, optional If not used (default) then return all available plugins, otherwise only return the plugin with a matching name (if it's available). Returns ------- dict[str, DecodeFunction] | dict[str, EncodeFunction] A dict of available {plugin name: decode/encode function} that can be used to decode/encode the corresponding pixel data. """ if self._decoder and not self.UID.is_encapsulated: return {} # type: ignore[return-value] if plugin: if plugin in self.available_plugins: return {plugin: self._available[plugin]} if deps := self._unavailable.get(plugin, None): missing = deps[0] if len(deps) > 1: missing = f"{', '.join(deps[:-1])} and {deps[-1]}" if self._decoder: raise RuntimeError( f"Unable to decompress '{self.UID.name}' pixel data because " f"the specified plugin is missing dependencies:\n\t{plugin} " f"- requires {missing}" ) raise RuntimeError( f"Unable to compress the pixel data using '{self.UID.name}' because " f"the specified plugin is missing dependencies:\n\t{plugin} " f"- requires {missing}" ) msg = ( f"No plugin named '{plugin}' has been added to '{self.UID.keyword}" f"{type(self).__name__}'" ) if self._available: msg += f", available plugins are: {', '.join(self.available_plugins)}" raise ValueError(msg) if self._available: return self._available.copy() missing = "\n".join([f"\t{s}" for s in self.missing_dependencies]) if self._decoder: raise RuntimeError( f"Unable to decompress '{self.UID.name}' pixel data because all " f"plugins are missing dependencies:\n{missing}" ) raise RuntimeError( f"Unable to compress the pixel data using '{self.UID.name}' because all " f"plugins are missing dependencies:\n{missing}" ) # TODO: Python 3.11 switch to StrEnum @unique class PhotometricInterpretation(str, Enum): """Values for (0028,0004) *Photometric Interpretation*""" # Standard Photometric Interpretations from C.7.6.3.1.2 in Part 3 MONOCHROME1 = "MONOCHROME1" MONOCHROME2 = "MONOCHROME2" PALETTE_COLOR = "PALETTE COLOR" RGB = "RGB" YBR_FULL = "YBR_FULL" YBR_FULL_422 = "YBR_FULL_422" YBR_ICT = "YBR_ICT" YBR_RCT = "YBR_RCT" HSV = "HSV" # Retired ARGB = "ARGB" # Retired CMYK = "CMYK" # Retired YBR_PARTIAL_422 = "YBR_PARTIAL_422" # Retired YBR_PARTIAL_420 = "YBR_PARTIAL_420" # Retired # TODO: no longer needed if StrEnum def __str__(self) -> str: return str.__str__(self) class RunnerBase: """Base class for the pixel data decoding/encoding process managers.""" def __init__(self, tsyntax: UID) -> None: """Create a new runner for encoding/decoding data. Parameters ---------- tsyntax : pydicom.uid.UID The transfer syntax UID corresponding to the pixel data to be decoded. """ # Runner options self._opts: DecodeOptions | EncodeOptions = {} self.set_option("transfer_syntax_uid", tsyntax) # Runner options that cannot be deleted, only modified self._undeletable: tuple[str, ...] = ("transfer_syntax_uid",) # The source type, one of "Dataset", "Buffer", "Array" or "BinaryIO" self._src_type = "UNDEFINED" @property def bits_allocated(self) -> int: """Return the expected number of bits allocated used by the data.""" if (value := self._opts.get("bits_allocated", None)) is not None: return value raise AttributeError("No value for 'bits_allocated' has been set") @property def bits_stored(self) -> int: """Return the expected number of bits stored used by the data.""" if (value := self._opts.get("bits_stored", None)) is not None: return value raise AttributeError("No value for 'bits_stored' has been set") @property def columns(self) -> int: """Return the expected number of columns in the data.""" if (value := self._opts.get("columns", None)) is not None: return value raise AttributeError("No value for 'columns' has been set") def del_option(self, name: str) -> None: """Delete option `name` from the runner.""" if name in self._undeletable: raise ValueError(f"Deleting '{name}' is not allowed") self._opts.pop(name, None) # type: ignore[misc] @property def extended_offsets( self, ) -> tuple[list[int], list[int]] | tuple[bytes, bytes] | None: """Return the extended offsets table and lengths Returns ------- tuple[list[int], list[int]] | tuple[bytes, bytes] | None Returns the extended offsets and lengths as either lists of int or their equivalent encoded values, or ``None`` if no extended offsets have been set. """ return self._opts.get("extended_offsets", None) def frame_length(self, unit: str = "bytes") -> int | float: """Return the expected length (in number of bytes or pixels) of each frame of pixel data. Parameters ---------- unit : str, optional If ``"bytes"`` then returns the expected length of the pixel data in whole bytes and NOT including an odd length trailing NULL padding byte. If ``"pixels"`` then returns the expected length of the pixel data in terms of the total number of pixels (default ``"bytes"``). Returns ------- int | float The expected length of a single frame of pixel data in either whole bytes or pixels, excluding the NULL trailing padding byte for odd length data. For "pixels", an integer will always be returned. For "bytes", a float will be returned for images with BitsAllocated of 1 whose frames do not consist of a whole number of bytes. """ length: int | float = self.rows * self.columns * self.samples_per_pixel if unit == "pixels": return length # Correct for the number of bytes per pixel if self.bits_allocated == 1: if self.transfer_syntax.is_encapsulated: # Determine the nearest whole number of bytes needed to contain # 1-bit pixel data. e.g. 10 x 10 1-bit pixels is 100 bits, # which are packed into 12.5 -> 13 bytes length = length // 8 + (length % 8 > 0) else: # For native, "bit-packed" pixel data, frames are not padded so # this may not be a whole number of bytes e.g. 10x10 = 100 # pixels images are packed into 12.5 bytes length = length / 8 if length.is_integer(): length = int(length) else: length *= self.bits_allocated // 8 # DICOM Standard, Part 4, Annex C.7.6.3.1.2 - native only if ( self.photometric_interpretation == PhotometricInterpretation.YBR_FULL_422 and not self.transfer_syntax.is_encapsulated ): length = length // 3 * 2 return length def get_option(self, name: str, default: Any = None) -> Any: """Return the value of the option `name`.""" return self._opts.get(name, default) @property def is_array(self) -> bool: """Return ``True`` if the pixel data source is an :class:`~numpy.ndarray`""" return self._src_type == "Array" @property def is_binary(self) -> bool: """Return ``True`` if the pixel data source is BinaryIO""" return self._src_type == "BinaryIO" @property def is_buffer(self) -> bool: """Return ``True`` if the pixel data source is a buffer-like""" return self._src_type == "Buffer" @property def is_dataset(self) -> bool: """Return ``True`` if the pixel data source is a :class:`~pydicom.dataset.Dataset`""" return self._src_type == "Dataset" @property def number_of_frames(self) -> int: """Return the expected number of frames in the data.""" if (value := self._opts.get("number_of_frames", None)) is not None: return value raise AttributeError("No value for 'number_of_frames' has been set") @property def options(self) -> "DecodeOptions | EncodeOptions": """Return a reference to the runner's options dict.""" return self._opts @property def photometric_interpretation(self) -> str: """Return the expected photometric interpretation of the data.""" if (value := self._opts.get("photometric_interpretation", None)) is not None: return value raise AttributeError("No value for 'photometric_interpretation' has been set") @property def pixel_keyword(self) -> str: """Return the expected pixel keyword of the data. Returns ------- str One of ``"PixelData"``, ``"FloatPixelData"``, ``"DoubleFloatPixelData"`` """ if (value := self._opts.get("pixel_keyword", None)) is not None: return value raise AttributeError("No value for 'pixel_keyword' has been set") @property def pixel_representation(self) -> int: """Return the expected pixel representation of the data.""" if (value := self._opts.get("pixel_representation", None)) is not None: return value raise AttributeError("No value for 'pixel_representation' has been set") @property def planar_configuration(self) -> int: """Return the expected planar configuration of the data.""" # Only required when number of samples is more than 1 # Uncompressed may be either 0 or 1 if (value := self._opts.get("planar_configuration", None)) is not None: return value # Planar configuration is not relevant for compressed syntaxes if self.transfer_syntax.is_compressed: return 0 raise AttributeError("No value for 'planar_configuration' has been set") @property def rows(self) -> int: """Return the expected number of rows in the data.""" if (value := self._opts.get("rows", None)) is not None: return value raise AttributeError("No value for 'rows' has been set") @property def samples_per_pixel(self) -> int: """Return the expected number of samples per pixel in the data.""" if (value := self._opts.get("samples_per_pixel", None)) is not None: return value raise AttributeError("No value for 'samples_per_pixel' has been set") def set_option(self, name: str, value: Any) -> None: """Set a runner option. Parameters ---------- name : str The name of the option to be set. value : Any The value of the option. """ if name == "number_of_frames": value = int(value) if isinstance(value, str) else value if value in (None, 0): warn_and_log( f"A value of '{value}' for (0028,0008) 'Number of Frames' is " "invalid, assuming 1 frame" ) value = 1 elif name == "photometric_interpretation": if value == "PALETTE COLOR": value = PhotometricInterpretation.PALETTE_COLOR try: value = PhotometricInterpretation[value] except KeyError: pass self._opts[name] = value # type: ignore[literal-required] def set_options(self, **kwargs: "DecodeOptions | EncodeOptions") -> None: """Set multiple runner options. Parameters ---------- kwargs : dict[str, Any] A dictionary containing the options as ``{name: value}``, where `name` is the name of the option and `value` is it's value. """ for name, value in kwargs.items(): self.set_option(name, value) def _set_options_ds(self, ds: "Dataset") -> None: """Set options using a dataset. Parameters ---------- ds : pydicom.dataset.Dataset The dataset to use. """ self.set_options(**as_pixel_options(ds)) @property def transfer_syntax(self) -> UID: """Return the expected transfer syntax corresponding to the data.""" return self._opts["transfer_syntax_uid"] def validate(self) -> None: """Validate the runner options and source data (if any).""" raise NotImplementedError( f"{type(self).__name__}.validate() has not been implemented" ) def _validate_options(self) -> None: """Validate the supplied options to ensure they meet requirements.""" prefix = "Missing required element: (0028" if self._opts.get("bits_allocated") is None: raise AttributeError(f"{prefix},0100) 'Bits Allocated'") if not 1 <= self.bits_allocated <= 64 or ( self.bits_allocated != 1 and self.bits_allocated % 8 ): raise ValueError( f"A (0028,0100) 'Bits Allocated' value of '{self.bits_allocated}' " "is invalid, it must be 1 or a multiple of 8 and in the range (1, 64)" ) if "Float" not in self.pixel_keyword: if self._opts.get("bits_stored") is None: raise AttributeError(f"{prefix},0101) 'Bits Stored'") if not 1 <= self.bits_stored <= self.bits_allocated <= 64: raise ValueError( f"A (0028,0101) 'Bits Stored' value of '{self.bits_stored}' is " "invalid, it must be in the range (1, 64) and no greater than " "the (0028,0100) 'Bits Allocated' value of " f"'{self.bits_allocated}'" ) if self._opts.get("columns") is None: raise AttributeError(f"{prefix},0011) 'Columns'") if not 0 < self.columns <= 2**16 - 1: raise ValueError( f"A (0028,0011) 'Columns' value of '{self.columns}' is invalid, " "it must be in the range (1, 65535)" ) # Number of Frames is conditionally required if self._opts.get("number_of_frames") is not None and self.number_of_frames < 1: raise ValueError( f"A (0028,0008) 'Number of Frames' value of '{self.number_of_frames}' " "is invalid, it must be greater than or equal to 1" ) if self._opts.get("photometric_interpretation") is None: raise AttributeError(f"{prefix},0004) 'Photometric Interpretation'") try: PhotometricInterpretation[self.photometric_interpretation] except KeyError: if self.photometric_interpretation != "PALETTE COLOR": raise ValueError( "Unknown (0028,0004) 'Photometric Interpretation' value " f"'{self.photometric_interpretation}'" ) kw = ("PixelData", "FloatPixelData", "DoubleFloatPixelData") if self.pixel_keyword not in kw: raise ValueError(f"Unknown 'pixel_keyword' value '{self.pixel_keyword}'") if self.pixel_keyword == "PixelData": if self._opts.get("pixel_representation") is None: raise AttributeError(f"{prefix},0103) 'Pixel Representation'") if self.pixel_representation not in (0, 1): raise ValueError( "A (0028,0103) 'Pixel Representation' value of " f"'{self.pixel_representation}' is invalid, it must be 0 or 1" ) if self._opts.get("rows") is None: raise AttributeError(f"{prefix},0010) 'Rows'") if not 0 < self.rows <= 2**16 - 1: raise ValueError( f"A (0028,0010) 'Rows' value of '{self.rows}' is invalid, it " "must be in the range (1, 65535)" ) if self._opts.get("samples_per_pixel") is None: raise AttributeError(f"{prefix},0002) 'Samples per Pixel'") if self.samples_per_pixel not in (1, 3): raise ValueError( f"A (0028,0002) 'Samples per Pixel' value of '{self.samples_per_pixel}' " "is invalid, it must be 1 or 3" ) if self.samples_per_pixel == 3: if self._opts.get("planar_configuration") is None: raise AttributeError(f"{prefix},0006) 'Planar Configuration'") if self.planar_configuration not in (0, 1): raise ValueError( "A (0028,0006) 'Planar Configuration' value of " f"'{self.planar_configuration}' is invalid, it must be 0 or 1" ) class RunnerOptions(TypedDict, total=False): """Options accepted by RunnerBase""" ## Pixel data description options # Required bits_allocated: int bits_stored: int columns: int number_of_frames: int photometric_interpretation: str pixel_keyword: str pixel_representation: int rows: int samples_per_pixel: int transfer_syntax_uid: UID # Conditionally required if samples_per_pixel > 1 planar_configuration: int # Optional # The Extended Offset Table values extended_offsets: tuple[bytes, bytes] | tuple[list[int], list[int]] pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/000077500000000000000000000000001515706620200225555ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/__init__.py000066400000000000000000000011021515706620200246600ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. from pydicom.pixels.decoders.base import ( ImplicitVRLittleEndianDecoder, ExplicitVRLittleEndianDecoder, ExplicitVRBigEndianDecoder, DeflatedExplicitVRLittleEndianDecoder, JPEGBaseline8BitDecoder, JPEGExtended12BitDecoder, JPEGLosslessDecoder, JPEGLosslessSV1Decoder, JPEGLSLosslessDecoder, JPEGLSNearLosslessDecoder, JPEG2000LosslessDecoder, JPEG2000Decoder, HTJ2KLosslessDecoder, HTJ2KLosslessRPCLDecoder, HTJ2KDecoder, RLELosslessDecoder, ) pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/base.py000066400000000000000000002476031515706620200240550ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Pixel data decoding.""" from collections.abc import Callable, Iterator, Iterable import logging from io import BufferedIOBase from math import ceil, floor import sys from typing import Any, BinaryIO, cast, TYPE_CHECKING try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import config from pydicom.encaps import get_frame, generate_frames from pydicom.misc import warn_and_log from pydicom.pixels.common import ( Buffer, RunnerBase, RunnerOptions, CoderBase, PhotometricInterpretation as PI, ) from pydicom.pixels.processing import convert_color_space from pydicom.pixels.utils import ( _get_jpg_parameters, get_j2k_parameters, ) from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRLittleEndian, ExplicitVRBigEndian, DeflatedExplicitVRLittleEndian, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, HTJ2KLossless, HTJ2KLosslessRPCL, HTJ2K, RLELossless, UID, JPEG2000TransferSyntaxes, JPEGLSTransferSyntaxes, JPEGTransferSyntaxes, ) if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset LOGGER = logging.getLogger(__name__) DecodeFunction = Callable[[bytes, "DecodeRunner"], bytes | bytearray] ProcessingFunction = Callable[ ["np.ndarray", "DecodeRunner", dict[str, str | int]], "np.ndarray" ] class DecodeOptions(RunnerOptions, total=False): """Options accepted by DecodeRunner and decoding plugins""" # The VR used for the pixel data - may be used with Explicit VR Big Endian pixel_vr: str # Allow returning/yielding excess frames when found allow_excess_frames: bool # (ndarray only) When *Bits Stored* != *Bits Allocated* perform bit shift # operations to avoid using the unused bits correct_unused_bits: bool ## Native transfer syntax decoding options # Return/yield a view of the original buffer where possible view_only: bool # (ndarray only) Force byte swapping on 8-bit values encoded as OW be_swap_ow: bool ## RLE decoding options # Segment ordering ">" for big endian (default) or "<" for little endian rle_segment_order: str # pydicom plugin byteorder: str # pylibjpeg + -rle plugin ## JPEG-LS decoding options # Use the JPEG-LS metadata to return an ndarray matched to the expected pixel # representation, otherwise return the decoded data as-is (ndarray only) apply_jls_sign_correction: bool ## JPEG2000/HTJ2K decoding options # Use the JPEG 2000 metadata to return an ndarray matched to the expected pixel # representation, otherwise return the decoded data as-is (ndarray only) apply_j2k_sign_correction: bool ## Processing options (ndarray only) as_rgb: bool # Make best effort to return RGB output force_rgb: bool # Force YBR to RGB conversion force_ybr: bool # Force RGB to YBR conversion def _process_color_space( arr: "np.ndarray", runner: "DecodeRunner", changes: dict[str, str | int] ) -> "np.ndarray": """Convert `arr` to a given color space, typically RGB.""" # If force_ybr then always do conversion (ignore as_rgb) force_ybr = runner.get_option("force_ybr", False) force_rgb = runner.get_option("force_rgb", False) if force_ybr and force_rgb: raise ValueError("'force_ybr' and 'force_rgb' cannot both be True") to_rgb = ( runner.photometric_interpretation in (PI.YBR_FULL, PI.YBR_FULL_422) and runner.get_option("as_rgb", False) ) or force_rgb if not arr.flags.writeable and (to_rgb or force_ybr): if runner.get_option("view_only", False): LOGGER.warning( "Unable to return an ndarray that's a view on the original " "buffer if applying a color space conversion" ) arr = arr.copy() # Converting to/from YBR_FULL and YBR_FULL_422 uses the same transformation if force_ybr: arr = convert_color_space(arr, PI.RGB, PI.YBR_FULL) changes["photometric_interpretation"] = PI.YBR_FULL elif to_rgb: arr = convert_color_space(arr, PI.YBR_FULL, PI.RGB) changes["photometric_interpretation"] = PI.RGB return arr def _correct_unused_bits( arr: "np.ndarray", runner: "DecodeRunner", log_warning: bool = True ) -> "np.ndarray": """Perform a bit-shift correction on `arr` to avoid using any unused bits""" # If *Bits Stored* < *Bits Allocated* then we (technically) always # need to shift because the values of the unused bits cannot be assumed # - PS3.5, Section 8.1.1 # e.g. For Bits Stored 5, Pixel Representation 1 we may have a signed value: # 0001 1001, however the 3 MSb should be ignored so bit shifting # (with a signed integer dtype) will give 0001 1001 -> 1100 1000 -> 1111 1001 # In practice this isn't usually necessary as most application will fill # the unused bits with values that produce the correct interpretation if ( log_warning and runner.get_option("view_only", False) and not runner.transfer_syntax.is_encapsulated and not arr.flags.writeable ): LOGGER.warning( "Unable to return an ndarray that's a view on the original buffer when " "(0028,0101) 'Bits Stored' doesn't equal (0028,0100) 'Bits Allocated' " "and 'correct_unused_bits=True'. In most cases you can pass " "'correct_unused_bits=False' instead to get a view if the uncorrected " "array is equivalent to the corrected one." ) if not arr.flags.writeable: arr = arr.copy() bit_shift = runner.bits_allocated - runner.bits_stored np.left_shift(arr, bit_shift, out=arr) np.right_shift(arr, bit_shift, out=arr) return arr def _apply_sign_correction(arr: "np.ndarray", runner: "DecodeRunner") -> "np.ndarray": """Convert `arr` to match the signedness required by the 'pixel_representation'.""" # JPEG 2000 Example: # Dataset: Pixel Representation 1, Bits Stored 13, Bits Allocated 16 # J2K codestream: precision 13, signedness 0 (i.e. unsigned) # # For the raw 13-bit signed integer (value -2000): # 1 1000 0011 0000 # # If the 13-bit signed integer is incorrectly encoded as an unsigned integer, # then after decoding the 16-bit signed value will be: # 0001 1000 0011 0000 (value 6192) # If it were encoded correctly as a signed integer it would instead be: # 1111 1000 0011 0000 (value -2000) # # To correct for this, we need to bit shift the incorrectly interpreted # 16-bit signed integer left by 3 bits: # 1100 0001 1000 0000 (value -16000) # And then right shift back 3 bits to get the final value: # 1111 1000 0011 0000 (value -2000) # # And similarly, when the Pixel Representation is 0 and J2K is signed, then # after decoding the 16-bit unsigned value will be: # 1111 1000 0011 0000 (value 63536) # If it were encoded correctly as an unsigned integer it would instead be: # 0001 1000 0011 0000 (value 6192) # Which can be fixed in the same way as for signed integers. if runner.transfer_syntax in JPEG2000TransferSyntaxes: j2k_signed = runner.get_option("j2k_is_signed", runner.pixel_representation) precision = runner.get_option("j2k_precision", runner.bits_stored) bit_shift = 8 * arr.dtype.itemsize - precision if bit_shift and j2k_signed != runner.pixel_representation: np.left_shift(arr, bit_shift, out=arr) np.right_shift(arr, bit_shift, out=arr) elif runner.transfer_syntax in JPEGLSTransferSyntaxes: # JPEG-LS has no way to track signedness, so signed integers are # always decoded as unsigned precision = runner.get_option("jls_precision", runner.bits_stored) bit_shift = 8 * arr.dtype.itemsize - precision if bit_shift: np.left_shift(arr, bit_shift, out=arr) np.right_shift(arr, bit_shift, out=arr) return arr # Allow customization of the image processors PROCESSORS: list[ProcessingFunction] = [_process_color_space] class DecodeRunner(RunnerBase): """Class for managing the pixel data decoding process. .. versionadded:: 3.0 This class is not intended to be used directly. For decoding pixel data use the :class:`~pydicom.pixels.decoders.base.Decoder` instance corresponding to the transfer syntax of the pixel data. """ def __init__(self, tsyntax: UID) -> None: """Create a new runner for decoding data encoded as `tsyntax`. Parameters ---------- tsyntax : pydicom.uid.UID The transfer syntax UID corresponding to the pixel data to be decoded. """ self._src: Buffer | BinaryIO self._src_type: str self._opts: DecodeOptions = { "transfer_syntax_uid": tsyntax, "as_rgb": True, "allow_excess_frames": True, } self._undeletable = ("transfer_syntax_uid", "pixel_keyword") self._decoders: dict[str, DecodeFunction] = {} self._previous: tuple[str, DecodeFunction] if self.transfer_syntax.is_encapsulated: self.set_option("pixel_keyword", "PixelData") else: self.set_option("view_only", False) if self.transfer_syntax in JPEG2000TransferSyntaxes: self.set_option("apply_j2k_sign_correction", True) elif self.transfer_syntax in JPEGLSTransferSyntaxes: self.set_option("apply_jls_sign_correction", True) else: self.set_option("correct_unused_bits", True) def _conform_jpg_colorspace(self, info: dict[str, Any]) -> None: """Conform the photometric interpretation to the JPEG/JPEG-LS codestream. Parameters ---------- info : dict[str, Any] A dictionary containing JPEG/JPEG-LS codestream metadata. """ if self.samples_per_pixel != 3: return pi = self.photometric_interpretation # Check the component IDs for RGB or rgb (in ASCII) has_rgb_ids = info.get("component_ids", None) in ([82, 71, 66], [114, 103, 98]) if has_rgb_ids and pi != PI.RGB: self.set_option("photometric_interpretation", PI.RGB) warn_and_log( f"The (0028,0004) 'Photometric Interpretation' value is '{pi}' " "however the encoded image's codestream uses component IDs that " "indicate it should be 'RGB'" ) return # A JFIF APP marker means the decoded image should be YBR colour space # https://www.w3.org/Graphics/JPEG/jfif.pdf cs = ( PI.YBR_FULL_422 if self.transfer_syntax == JPEGBaseline8Bit else PI.YBR_FULL ) for marker in info.get("app", {}).values(): if marker.startswith(b"JFIF") and "YBR" not in pi: self.set_option("photometric_interpretation", cs) warn_and_log( "The (0028,0004) 'Photometric Interpretation' value is " f"'{pi}' however the encoded image's codestream contains a " f"JFIF APP marker which indicates it should be '{cs}'" ) return def decode(self, index: int) -> bytes | bytearray: """Decode the frame of pixel data at `index`. Parameters ---------- index : int The index of the frame to be decoded. Returns ------- bytes | bytearray The decoded frame of pixel data. """ # For encapsulated data `self.src` should not be memoryview to avoid # creating a duplicate object in memory by the encapsulation functions src = get_frame( self.src, index, number_of_frames=self.number_of_frames, extended_offsets=self.extended_offsets, ) self._get_frame_info(src) return self._decode_frame(src) def _decode_frame(self, src: bytes) -> bytes | bytearray: """Return a decoded frame of pixel data. Parameters ---------- src : bytes An encoded frame of pixel data to be passed to the decoding plugins. Returns ------- bytes | bytearray The decoded frame. """ # If self._previous is not set then this is the first frame being decoded # If self._previous is set, then the previously successful decoder # has failed while decoding a frame and we are trying the other decoders failure_messages = [] for name, func in self._decoders.items(): try: # Attempt to decode the frame frame = func(src, self) # Decode success, if we were previously successful then # warn about the change to the new decoder if hasattr(self, "_previous") and self._previous[1] != func: warn_and_log( f"The decoding plugin has changed from '{self._previous[0]}' " f"to '{name}' during the decoding process - you may get " f"inconsistent inter-frame results, consider passing " f"'decoding_plugin=\"{name}\"' instead" ) self._previous = (name, func) return frame except Exception as exc: LOGGER.exception(exc) failure_messages.append(f"{name}: {exc}") messages = "\n ".join(failure_messages) raise RuntimeError( "Unable to decode as exceptions were raised by all available " f"plugins:\n {messages}" ) def get_data(self, src: Buffer | BinaryIO, offset: int, length: int) -> bytes: """Return `length` bytes from `src`, starting at `offset`. Parameters ---------- src : buffer-like | file-like The source of the data to be returned. If a file-like then the file position after reading will returned to the original offset. offset : int The starting offset of the data in `src`. length : int The number of bytes to try to return. Returns ------- bytes The data from `src`, may return fewer bytes if the end of `src` is reached before ``offset + length``. """ if self.is_dataset or self.is_buffer: src = cast(Buffer, src) return src[offset : offset + length] src = cast(BinaryIO, src) file_offset = src.tell() src.seek(offset) buffer = src.read(length) src.seek(file_offset) return buffer def _get_frame_info(self, src: bytes) -> None: """Parse a frame's codestream for JPEG-related parameters.""" if self.transfer_syntax in JPEG2000TransferSyntaxes: j2k_info = get_j2k_parameters(src) self.set_option( "j2k_is_signed", j2k_info.get("is_signed", self.pixel_representation) ) self.set_option( "j2k_precision", j2k_info.get("precision", self.bits_stored) ) elif self.transfer_syntax in JPEGLSTransferSyntaxes: jls_info = _get_jpg_parameters(src) self.set_option( "jls_precision", jls_info.get("precision", self.bits_stored) ) self._conform_jpg_colorspace(jls_info) elif self.transfer_syntax in JPEGTransferSyntaxes: jpg_info = _get_jpg_parameters(src) self._conform_jpg_colorspace(jpg_info) def iter_decode(self) -> Iterator[bytes | bytearray]: """Yield decoded frames from the encoded pixel data.""" if self.is_binary: file_offset = cast(BinaryIO, self.src).tell() # For encapsulated data `self.src` should not be memoryview as doing so # will create a duplicate object in memory by `generate_frames` # May yield more frames than `number_of_frames` for JPEG! encoded_frames = generate_frames( self.src, number_of_frames=self.number_of_frames, extended_offsets=self.extended_offsets, ) for index, src in enumerate(encoded_frames): self._get_frame_info(src) # Try the previously successful decoder first (if available) name, func = getattr(self, "_previous", (None, None)) if func: try: yield func(src, self) continue except Exception: LOGGER.warning( f"The decoding plugin '{name}' failed to decode the " f"frame at index {index}" ) # Otherwise try all decoders yield self._decode_frame(src) if self.is_binary: cast(BinaryIO, self.src).seek(file_offset) @property def pixel_dtype(self) -> "np.dtype": """Return a :class:`numpy.dtype` suitable for containing the decoded pixel data. """ if not HAVE_NP: raise ImportError("NumPy is required for 'DecodeRunner.pixel_dtype'") dtype: np.dtype pixel_keyword = self.pixel_keyword if pixel_keyword == "FloatPixelData": dtype = np.dtype("float32") elif pixel_keyword == "DoubleFloatPixelData": dtype = np.dtype("float64") else: # (0028,0103) Pixel Representation, US, 1 # 0x0000 - unsigned int # 0x0001 - 2's complement (signed int) dtype_str = "ui"[self.pixel_representation] # (0028,0100) Bits Allocated, US, 1 # PS3.5 8.1.1: Bits Allocated is either 1 or a multiple of 8 if self.bits_allocated == 1: dtype_str = "u1" elif self.bits_allocated > 0 and self.bits_allocated % 8 == 0: dtype_str += f"{self.bits_allocated // 8}" # Check to see if the dtype is valid for numpy try: dtype = np.dtype(dtype_str) except TypeError: raise NotImplementedError( f"The data type '{dtype_str}' needed to contain the pixel " "data is not supported by NumPy" ) # Correct for endianness of the system vs endianness of the dataset if self.transfer_syntax.is_little_endian != (sys.byteorder == "little"): # 'S' swap from current to opposite dtype = dtype.newbyteorder("S") return dtype def pixel_properties(self, as_frame: bool = False) -> dict[str, str | int]: """Return a dict containing the :dcm:`Image Pixel ` module related properties. Parameters ---------- as_frame : bool, optional If ``True`` then don't include properties that aren't appropriate for a single frame. Default ``False``. Returns ------- dict[str, str | int] A dict containing the values for: * `bits_allocated` * `bits_stored` * `columns` * `photometric_interpretation` * `samples_per_pixel` * `rows` * `number_of_frames` * `planar_configuration` (if `samples_per_pixel` > 1) * `pixel_representation` (if the pixel keyword is ``"PixelData"``) The returned values depend on whether or not this method is called before or after decoding the pixel data, as the decoding plugins and image processing functions may update the values as needed to reflect the corresponding decoded data. For example, if the pixel data is converted from the YCbCr to RGB color space then the `photometric_interpretation` value will be changed to match after the data has been decoded. """ d = { "bits_allocated": self.bits_allocated, "columns": self.columns, "number_of_frames": self.number_of_frames if not as_frame else 1, "photometric_interpretation": str(self.photometric_interpretation), "rows": self.rows, "samples_per_pixel": self.samples_per_pixel, } if self.samples_per_pixel > 1: d["planar_configuration"] = self.planar_configuration if self.pixel_keyword == "PixelData": d["bits_stored"] = self.bits_stored d["pixel_representation"] = self.pixel_representation return cast(dict[str, str | int], d) def process(self, arr: "np.ndarray") -> tuple["np.ndarray", dict[str, str | int]]: """Return `arr` after applying zero or more processing operations. Returns ------- numpy.ndarray The array with the applied processing. dict[str, int | str] A :class:`dict` containing any required changes to the image pixel properties due to the processing. """ changes: dict[str, str | int] = {} for func in PROCESSORS: arr = func(arr, self, changes) return arr, changes def reshape(self, arr: "np.ndarray", as_frame: bool = False) -> "np.ndarray": """Return a reshaped :class:`~numpy.ndarray` `arr`. Parameters ---------- arr : np.ndarray The 1D array to be reshaped. as_frame : bool, optional If ``True`` then treat `arr` as only containing a single frame's worth of pixel data, otherwise treat `arr` as containing the full amount of pixel data (default). Returns ------- np.ndarray A view of the input `arr` reshaped to: * (rows, columns) for single frame, single sample data * (rows, columns, samples) for single frame, multi-sample data * (frames, rows, columns) for multi-frame, single sample data * (frames, rows, columns, samples) for multi-frame, multi-sample data """ number_of_frames = self.number_of_frames samples_per_pixel = self.samples_per_pixel rows = self.rows columns = self.columns if not as_frame and number_of_frames > 1: # Multi-frame, single sample if samples_per_pixel == 1: return arr.reshape(number_of_frames, rows, columns) # Multi-frame, multiple samples, planar configuration 0 if self.planar_configuration == 0: return arr.reshape(number_of_frames, rows, columns, samples_per_pixel) # Multi-frame, multiple samples, planar configuration 1 arr = arr.reshape(number_of_frames, samples_per_pixel, rows, columns) return arr.transpose(0, 2, 3, 1) # Single frame, single sample if samples_per_pixel == 1: return arr.reshape(rows, columns) # Single frame, multiple samples, planar configuration 0 if self.planar_configuration == 0: return arr.reshape(rows, columns, samples_per_pixel) # Single frame, multiple samples, planar configuration 1 arr = arr.reshape(samples_per_pixel, rows, columns) return arr.transpose(1, 2, 0) def set_decoders(self, decoders: dict[str, DecodeFunction]) -> None: """Set the decoders use for decoding compressed pixel data. Parameters ---------- decoders : dict[str, DecodeFunction] A dict of {name: decoder function}. """ self._decoders = decoders if hasattr(self, "_previous"): del self._previous def _set_options_ds(self, ds: "Dataset") -> None: """Set options using a dataset. Parameters ---------- ds : pydicom.dataset.Dataset The dataset to use. """ super()._set_options_ds(ds) file_meta = getattr(ds, "file_meta", {}) if tsyntax := file_meta.get("TransferSyntaxUID", None): if tsyntax != self.transfer_syntax: raise ValueError( f"The dataset's transfer syntax '{tsyntax.name}' doesn't " "match the pixel data decoder" ) keywords = ["PixelData", "FloatPixelData", "DoubleFloatPixelData"] px_keyword = [kw for kw in keywords if kw in ds] if not px_keyword: raise AttributeError( "The dataset has no 'Pixel Data', 'Float Pixel Data' or 'Double " "Float Pixel Data' element, no pixel data to decode" ) if len(px_keyword) != 1: raise AttributeError( "One and only one of 'Pixel Data', 'Float Pixel Data' or " "'Double Float Pixel Data' may be present in the dataset" ) self.set_option("pixel_keyword", px_keyword[0]) self.set_option("pixel_vr", ds[px_keyword[0]].VR) def set_source(self, src: "Buffer | Dataset | BinaryIO") -> None: """Set the pixel data to be decoded. Parameters ---------- src : bytes | bytearray | memoryview | pydicom.dataset.Dataset If a buffer-like then the encoded pixel data, otherwise the :class:`~pydicom.dataset.Dataset` containing the pixel data and associated group ``0x0028`` elements. """ from pydicom.dataset import Dataset if isinstance(src, Dataset): self._set_options_ds(src) self._src = src[self.pixel_keyword].value if isinstance(self._src, BufferedIOBase): self._src_type = "BinaryIO" else: self._src_type = "Dataset" elif hasattr(src, "read"): self._src = src self._src_type = "BinaryIO" else: self._src = src self._src_type = "Buffer" @property def src(self) -> Buffer | BinaryIO: """Return the buffer-like or file-like containing the encoded pixel data.""" return self._src def __str__(self) -> str: """Return nice string output for the runner.""" s = [f"DecodeRunner for '{self.transfer_syntax.name}'"] s.append("Options") s.extend([f" {name}: {value}" for name, value in self.options.items()]) if self._decoders: s.append("Decoders") s.extend([f" {name}" for name in self._decoders]) return "\n".join(s) def _test_for(self, test: str) -> bool: """Return the result of `test` as :class:`bool`.""" if test == "be_swap_ow": if self.get_option("be_swap_ow"): return True return ( not self.transfer_syntax.is_little_endian and self.bits_allocated // 8 == 1 and self.pixel_keyword == "PixelData" and self.get_option("pixel_vr") == "OW" ) if test == "sign_correction": use_j2k_correction = ( self.transfer_syntax in JPEG2000TransferSyntaxes and self.photometric_interpretation in (PI.MONOCHROME1, PI.MONOCHROME2) and self.get_option("apply_j2k_sign_correction", False) ) use_jls_correction = ( self.transfer_syntax in JPEGLSTransferSyntaxes and self.pixel_representation == 1 and self.get_option("apply_jls_sign_correction", False) ) return use_j2k_correction or use_jls_correction if test == "shift_correction": return ( self.get_option("correct_unused_bits", False) and self.pixel_keyword == "PixelData" and self.bits_allocated > self.bits_stored ) raise ValueError(f"Unknown test '{test}'") def validate(self) -> None: """Validate the decoding options and source buffer (if any).""" self._validate_options() if self.is_dataset or self.is_buffer: self._validate_buffer() def _validate_buffer(self) -> None: """Validate the supplied buffer data.""" # Check that the actual length of the pixel data is as expected frame_length = self.frame_length(unit="bytes") expected = ceil(frame_length * self.number_of_frames) actual = len(cast(Buffer, self._src)) if self.transfer_syntax.is_encapsulated: if actual in (expected, expected + expected % 2): warn_and_log( "The number of bytes of compressed pixel data matches the " "expected number for uncompressed data - check that the " "transfer syntax has been set correctly" ) return # Correct for the trailing NULL byte padding for odd length data padded = expected + expected % 2 if actual < padded: if actual != expected: raise ValueError( f"The number of bytes of pixel data is less than expected " f"({actual} vs {padded} bytes) - the dataset may be " "corrupted, have an invalid group 0028 element value, or " "the transfer syntax may be incorrect" ) elif actual > padded: if self.photometric_interpretation == PI.YBR_FULL_422: # PS 3.3, Annex C.7.6.3 ybr_length = expected // 2 * 3 if actual >= ybr_length + ybr_length % 2: raise ValueError( "The number of bytes of pixel data is a third larger " f"than expected ({actual} vs {expected} bytes) which " "indicates the set (0028,0004) 'Photometric Interpretation' " "value of 'YBR_FULL_422' is incorrect and may need to be " "changed to either 'RGB' or 'YBR_FULL'" ) # Determine if there's sufficient padding to contain extra frames elif self.get_option("allow_excess_frames", False): whole_frames = actual // frame_length if whole_frames > self.number_of_frames: warn_and_log( "The number of bytes of pixel data is sufficient to contain " f"{whole_frames} frames which is larger than the given " f"(0028,0008) 'Number of Frames' value of {self.number_of_frames}. " "The returned data will include these extra frames and if it's " "correct then you should update 'Number of Frames' accordingly, " "otherwise pass 'allow_excess_frames=False' to return only " f"the first {self.number_of_frames} frames." ) self.set_option("number_of_frames", whole_frames) return # PS 3.5, Section 8.1.1 warn_and_log( f"The pixel data is {actual} bytes long, which indicates it " f"contains {actual - expected} bytes of excess padding to " "be removed" ) def _validate_options(self) -> None: """Validate the supplied options to ensure they meet minimum requirements.""" super()._validate_options() # The Extended Offset Table is optional if self.extended_offsets and len(self.extended_offsets[0]) != len( self.extended_offsets[1] ): warn_and_log( "The number of items in (7FE0,0001) 'Extended Offset Table' and " "(7FE0,0002) 'Extended Offset Table Lengths' don't match - the " "extended offset table will be ignored" ) self.del_option("extended_offsets") class Decoder(CoderBase): """Factory class for pixel data decoders. Every available ``Decoder`` instance in *pydicom* corresponds directly to a single DICOM *Transfer Syntax UID*, and provides a mechanism for decoding encoded source data using one or more :doc:`decoding plugins `. .. versionadded:: 3.0 """ def __init__(self, uid: UID) -> None: """Create a new data decoder. Parameters ---------- uid : pydicom.uid.UID The *Transfer Syntax UID* that the decoder supports. """ super().__init__(uid, decoder=True) def as_array( self, src: "Dataset | Buffer | BinaryIO", *, index: int | None = None, validate: bool = True, raw: bool = False, decoding_plugin: str = "", **kwargs: DecodeOptions, ) -> tuple["np.ndarray", dict[str, str | int]]: """Return decoded pixel data as :class:`~numpy.ndarray`. .. warning:: This method requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decoding. See the :doc:`pixel data decompression documentation ` for more information. **Processing** The following processing operations on the raw pixel data are always performed: * Natively encoded bit-packed pixel data for a :ref:`bits allocated ` of ``1`` will be unpacked. * Natively encoded pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL_422"`` will have it's sub-sampling removed. * The output array will be reshaped to the specified dimensions. * JPEG-LS or JPEG 2000 encoded data whose signedness doesn't match the expected :ref:`pixel representation` will be converted to match. If ``raw = False`` (the default) then the following processing operation will also be performed: * Pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL"`` or ``"YBR_FULL_422"`` will be converted to RGB. Parameters ---------- src : :class:`~pydicom.dataset.Dataset` | buffer-like | file-like Single or multi-frame pixel data as one of the following: * :class:`~pydicom.dataset.Dataset`: a dataset containing the pixel data to be decoded and the corresponding *Image Pixel* module elements. * :class:`bytes` | :class:`bytearray` | :class:`memoryview`: the encoded (and possibly encapsulated) pixel data to be decoded. * :class:`~typing.BinaryIO`: a file-like positioned at the start of the pixel data element's value. The position will be returned to the starting offset prior to returning the array. When `src` is not a :class:`~pydicom.dataset.Dataset` then a number of keyword parameters are also required. Please see the :doc:`decoding options documentation` for more information. index : int | None, optional If ``None`` (default) then return an array containing all the frames in the pixel data, otherwise return one containing only the frame from the specified `index`, which starts at 0 for the first frame. raw : bool, optional If ``True`` then return the decoded pixel data after only minimal processing (see the processing section above). If ``False`` (default) then additional processing may be applied to convert the pixel data to it's most commonly used form (such as converting from YCbCr to RGB). To return the raw pixel data with no processing whatsoever, use the :meth:`~pydicom.pixels.decoders.base.Decoder.as_buffer` method. validate : bool, optional If ``True`` (default) then validate the supplied decoding options and encoded pixel data prior to decoding, otherwise if ``False`` no validation will be performed. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one returned. For information on the available plugins for each decoder see the :doc:`API documentation`. **kwargs Optional keyword parameters for controlling decoding are also available, please see the :doc:`decoding options documentation ` for more information. Returns ------- numpy.ndarray One or more frames of decoded pixel data shaped as: * (rows, columns) for single frame, single sample data * (rows, columns, samples) for single frame, multi-sample data * (frames, rows, columns) for multi-frame, single sample data * (frames, rows, columns, samples) for multi-frame, multi-sample data The :class:`~numpy.dtype` for the array will have an :attr:`~numpy.dtype.itemsize` sufficient to contain pixels of at least :ref:`bits allocated`. A writeable :class:`~numpy.ndarray` is returned by default. For native transfer syntaxes with ``view_only=True``, a read-only :class:`~numpy.ndarray` will be returned if `src` is immutable. dict[str, str | int] The :dcm:`Image Pixel` module element values resulting from the decoding process that describe the array. See :meth:`DecodeRunner.pixel_properties() ` for the possible contents. """ if not HAVE_NP: raise ImportError( "NumPy is required when converting pixel data to an ndarray" ) if index is not None and index < 0: raise ValueError("'index' must be greater than or equal to 0") runner = DecodeRunner(self.UID) runner.set_source(src) runner.set_options(**kwargs) runner.set_decoders( cast( dict[str, "DecodeFunction"], self._validate_plugins(decoding_plugin), ), ) if config.debugging: LOGGER.debug(runner) if validate: runner.validate() if self.is_native: func = self._as_array_native as_writeable = not runner.get_option("view_only", False) else: func = self._as_array_encapsulated as_writeable = True as_frame = index is not None arr = runner.reshape(func(runner, index), as_frame=as_frame) if runner._test_for("sign_correction"): arr = _apply_sign_correction(arr, runner) elif runner._test_for("shift_correction"): arr = _correct_unused_bits(arr, runner) overrides: dict[str, str | int] = {} if not raw: # Processing may give us a new writeable array anyway, so do # it first to avoid an unnecessary ndarray.copy() arr, overrides = runner.process(arr) arr = arr.copy() if not arr.flags.writeable and as_writeable else arr # Multi-sample arrays are always returned *Planar Configuration* 0 if runner.samples_per_pixel > 1: overrides["planar_configuration"] = 0 pixel_properties = runner.pixel_properties(as_frame=as_frame) pixel_properties.update(overrides) return arr, pixel_properties @staticmethod def _as_array_encapsulated(runner: DecodeRunner, index: int | None) -> "np.ndarray": """Return compressed and encapsulated pixel data as :class:`~numpy.ndarray`. Parameters ---------- runner : pydicom.pixels.decoders.base.DecodeRunner The runner with the encoded data and decoding options. index : int | None The index of the frame to be returned, or ``None`` if all frames are to be returned Returns ------- numpy.ndarray A 1D array containing the pixel data. """ # The initial preallocated array uses an itemsize based off the dataset's # bits allocated value, however each decoded frame may use a smaller # itemsize (such as bits allocated 16 and JPEG with precision 8 only # returning 8-bit data rather than 16-bit) # We account for this by interpreting each frame using that decoded size, # inserting it into the preallocated array, then resetting at the end # so the returned image pixel dict matches the array original_bits_allocated = runner.bits_allocated pixels_per_frame = cast(int, runner.frame_length(unit="pixels")) number_of_frames = 1 if index is not None else runner.number_of_frames # Preallocate output array arr = np.empty(pixels_per_frame * number_of_frames, dtype=runner.pixel_dtype) # Return the specified frame only if index is not None: # The decoding plugin may alter runner.bits_allocated to give a # different dtype itemsize arr[:] = np.frombuffer(runner.decode(index=index), dtype=runner.pixel_dtype) runner.set_option("bits_allocated", original_bits_allocated) return arr # Return all frames frame_generator = runner.iter_decode() for idx in range(runner.number_of_frames): frame = next(frame_generator) start = idx * pixels_per_frame arr[start : start + pixels_per_frame] = np.frombuffer( frame, dtype=runner.pixel_dtype ) # Check to see if we have any more frames available # Should only apply to JPEG transfer syntaxes if runner.get_option("allow_excess_frames", False): excess = [] original_nr_frames = runner.number_of_frames for frame in frame_generator: if len(frame) == runner.frame_length(unit="bytes"): excess.append(np.frombuffer(frame, runner.pixel_dtype)) runner.set_option("number_of_frames", runner.number_of_frames + 1) if excess: warn_and_log( f"{len(excess) + original_nr_frames} frames have been found in " "the encapsulated pixel data, which is larger than the given " f"(0028,0008) 'Number of Frames' value of {original_nr_frames}. " "The returned data will include these extra frames and if it's " "correct then you should update 'Number of Frames' accordingly, " "otherwise pass 'allow_excess_frames=False' to return only the " f"first {original_nr_frames} frames." ) arr = np.concatenate([arr, *excess]) runner.set_option("bits_allocated", original_bits_allocated) return arr @staticmethod def _as_array_native(runner: DecodeRunner, index: int | None) -> "np.ndarray": """Return natively encoded pixel data from a buffer-like as :class:`~numpy.ndarray`. Parameters ---------- runner : pydicom.pixels.decoders.base.DecodeRunner The runner with the encoded data and decoding options. index : int | None The index of the frame to be returned, or ``None`` if all frames are to be returned Returns ------- numpy.ndarray A 1D array containing the pixel data. """ length_bytes = runner.frame_length(unit="bytes") length_pixels = int(runner.frame_length(unit="pixels")) dtype = runner.pixel_dtype src: memoryview | BinaryIO if runner.is_dataset or runner.is_buffer: src = memoryview(cast(Buffer, runner.src)) file_offset = 0 length_source: int | float = len(src) else: src = cast(BinaryIO, runner.src) # Should be the start of the pixel data element's value file_offset = src.tell() length_source = length_bytes * runner.number_of_frames if runner._test_for("be_swap_ow"): # Big endian 8-bit data may be encoded as OW # For example a 1 x 1 x 3 image will (presumably) be: # b"\x02\x01\x00\x03" instead of b"\x01\x02\x03\x00" # Note that the padding byte is displaced, so we need to # swap the bytes pairwise. # This will also affect the start and end of individual frames if runner.get_option("view_only", False): LOGGER.warning( "Unable to return an ndarray that's a view on the " "original buffer for 8-bit pixel data encoded as OW with " "'Explicit VR Big Endian'" ) # Since we are using 8 bit images, frames will always be an integer # number of bytes length_bytes = cast(int, length_bytes) length_source = cast(int, length_source) # ndarray.byteswap() creates a new memory object if index is not None: # Return specified frame only start_offset = file_offset + index * length_bytes if (start_offset + length_bytes) > file_offset + length_source: raise ValueError( f"There is insufficient pixel data to contain {index + 1} frames" ) if length_bytes % 2 == 0: # Even length frame: start and end correct frame = runner.get_data(src, start_offset, length_bytes) arr = np.frombuffer(frame, dtype="u2").byteswap() arr = arr.view(dtype) else: # Odd length frame # Even index: start correct, end incorrect # src[start:start + length + 1] -> ... -> arr[:-1] # Odd index: start incorrect, end correct # src[start - 1:start + length + 1] -> ... -> arr[1:] odd_index = index % 2 frame = runner.get_data( src, start_offset - odd_index, length_bytes + 1 ) arr = np.frombuffer(frame, dtype="u2").byteswap() arr = arr.view(dtype)[odd_index : None if odd_index else -1] else: # Return all frames length_bytes *= runner.number_of_frames buffer = runner.get_data( src, file_offset, length_bytes + length_bytes % 2 ) arr = np.frombuffer(buffer, dtype="u2").byteswap() arr = arr.view(dtype)[:length_bytes] else: if index is not None: start_offset = floor(file_offset + index * length_bytes) if (start_offset + length_bytes) > file_offset + length_source: raise ValueError( f"There is insufficient pixel data to contain {index + 1} frames" ) frame = runner.get_data(src, start_offset, ceil(length_bytes)) arr = np.frombuffer(frame, dtype=dtype) else: length_bytes *= runner.number_of_frames buffer = runner.get_data(src, file_offset, ceil(length_bytes)) arr = np.frombuffer(buffer, dtype=dtype) # Unpack bit-packed data (if required) if runner.bits_allocated == 1: if runner.get_option("view_only", False): LOGGER.warning( "Unable to return an ndarray that's a view on the " "original buffer for bit-packed pixel data" ) # Number of bits to remove from the start after unpacking in bit_offset_start = 0 if index is None: length_pixels *= runner.number_of_frames else: bit_offset_start = (index * length_pixels) % 8 unpacked = np.unpackbits( arr, bitorder="little", count=ceil(length_bytes) * 8 ) # May need to remove bits from the beginning or end if frame # boundaries are not byte-aligned unpacked = unpacked[bit_offset_start : bit_offset_start + length_pixels] return unpacked if runner.photometric_interpretation != PI.YBR_FULL_422: return arr # Expand YBR_FULL_422 (if required) if runner.get_option("view_only", False): LOGGER.warning( "Unable to return an ndarray that's a view on the original " "buffer for uncompressed pixel data with a photometric " "interpretation of 'YBR_FULL_422'" ) # PS3.3 C.7.6.3.1.2: YBR_FULL_422 data needs to be resampled # Y1 Y2 B1 R1 -> Y1 B1 R1 Y2 B1 R1 out = np.empty(arr.shape[0] // 2 * 3, dtype=dtype) out[::6] = arr[::4] # Y1 out[3::6] = arr[1::4] # Y2 out[1::6], out[4::6] = arr[2::4], arr[2::4] # B out[2::6], out[5::6] = arr[3::4], arr[3::4] # R runner.set_option("photometric_interpretation", PI.YBR_FULL) return out def as_buffer( self, src: "Dataset | Buffer | BinaryIO", *, index: int | None = None, validate: bool = True, decoding_plugin: str = "", **kwargs: Any, ) -> tuple[Buffer, dict[str, str | int]]: """Return the raw decoded pixel data as a buffer-like. .. warning:: This method should only be used by advanced users who understand the intricacies of converting raw decoded DICOM pixel data to a usable form. It may also require the installation of additional packages to perform the actual pixel data decoding (see the :doc:`pixel data decompression documentation` for more information). Parameters ---------- src : :class:`~pydicom.dataset.Dataset` | buffer-like | file-like Single or multi-frame pixel data as one of the following: * :class:`~pydicom.dataset.Dataset`: a dataset containing the pixel data to be decoded and the corresponding *Image Pixel* module elements. * :class:`bytes` | :class:`bytearray` | :class:`memoryview`: the encoded (and possibly encapsulated) pixel data to be decoded. * :class:`~typing.BinaryIO`: a file-like positioned at the start of the pixel data element's value. The position will be returned to the starting offset prior to returning the buffer. When `src` is not a :class:`~pydicom.dataset.Dataset` then a number of keyword parameters are also required. Please see the :doc:`decoding options documentation` for more information. index : int | None, optional If ``None`` (default) then return a buffer-like containing all the frames in the pixel data, otherwise return one containing only the frame from the specified `index`, which starts at 0 for the first frame. validate : bool, optional If ``True`` (default) then validate the supplied decoding options and encoded pixel data prior to decoding, otherwise if ``False`` no validation will be performed. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one returned. For information on the available plugins for each decoder see the :doc:`API documentation`. **kwargs Optional keyword parameters for controlling decoding are also available, please see the :doc:`decoding options documentation ` for more information. Returns ------- bytes | bytearray | memoryview One or more frames of raw decoded pixel data. For natively encoded pixel data when `src` is a buffer-like the same type in `src` will be returned, except if `view_only` is ``True`` in which case a :class:`memoryview` on the original buffer will be returned instead. If `src` is a file-like then :class:`bytes` will always be returned. 8-bit pixel data encoded as **OW** using *Explicit VR Big Endian* will be returned as-is and may need byte-swapping. To facilitate this an extra byte before the expected start (for an odd `index`) or after the expected end (for an even `index`) is returned if the frame contains an odd number of pixels. dict[str, str | int] The :dcm:`Image Pixel` module element values resulting from the decoding process that describe the decoded pixel data. See :meth:`DecodeRunner.pixel_properties() ` for the possible contents. """ runner = DecodeRunner(self.UID) runner.set_source(src) runner.set_options(**kwargs) runner.set_decoders( cast( dict[str, "DecodeFunction"], self._validate_plugins(decoding_plugin), ), ) if validate: runner.validate() if self.is_native: buffer = self._as_buffer_native(runner, index) else: buffer = self._as_buffer_encapsulated(runner, index) return buffer, runner.pixel_properties(as_frame=index is not None) @staticmethod def _as_buffer_encapsulated( runner: DecodeRunner, index: int | None ) -> bytes | bytearray: """ "Return the raw decoded pixel data as a buffer-like. Parameters ---------- runner : pydicom.pixels.decoders.base.DecodeRunner The runner with the encoded data and decoding options. index : int | None The index of the frame to be returned, or ``None`` if all frames are to be returned Returns ------- bytes | bytearray A buffer-like containing the decoded pixel data. """ # Return the specified frame only if index is not None: frame = runner.decode(index=index) length_bytes = runner.frame_length(unit="bytes") if (actual := len(frame)) != length_bytes: raise ValueError( "Unexpected number of bytes in the decoded frame with index " f"{index} ({actual} bytes actual vs {length_bytes} expected)" ) return frame # Return all frames frames = [] bits_allocated = [] frame_generator = runner.iter_decode() for idx in range(runner.number_of_frames): frame = next(frame_generator) bits_allocated.append(runner.bits_allocated) length_bytes = runner.frame_length(unit="bytes") if (actual := len(frame)) != length_bytes: raise ValueError( "Unexpected number of bytes in the decoded frame with index " f"{idx} ({actual} bytes actual vs {length_bytes} expected)" ) frames.append(frame) # Check to see if we have any more frames available # Should only apply to JPEG transfer syntaxes if runner.get_option("allow_excess_frames", False): excess = [] original_nr_frames = runner.number_of_frames for frame in frame_generator: if len(frame) == runner.frame_length(unit="bytes"): excess.append(frame) runner.set_option("number_of_frames", runner.number_of_frames + 1) bits_allocated.append(runner.bits_allocated) if excess: warn_and_log( f"{len(excess) + len(frames)} frames have been found in the " "encapsulated pixel data, which is larger than the given " f"(0028,0008) 'Number of Frames' value of {original_nr_frames}. " "The returned data will include these extra frames and if it's " "correct then you should update 'Number of Frames' accordingly, " "otherwise pass 'allow_excess_frames=False' to return only the " f"first {original_nr_frames} frames." ) frames.extend(excess) # Each frame may have been encoded using a different precision. On # decoding this may result in different container sizes per frame # (such as 7-bit and 12-bit precisions being decoded as 8-bit and # 16-bit respectively, even if *Bits Stored* is 12). In that case we # pad to match the largest container size. if len(set(bits_allocated)) != 1: target = max(bits_allocated) target_step = target // 8 for idx, (actual, frame) in enumerate(zip(bits_allocated, frames)): if actual != target: LOGGER.debug(f"Padding frame {idx} from {actual} to {target}-bit") actual_step = actual // 8 # Preallocate the new buffer and copy from original to new out = bytearray(len(frame) // actual_step * target_step) for offset in range(actual_step): out[offset::target_step] = frame[offset::actual_step] frames[idx] = out runner.set_option("bits_allocated", target) return b"".join(b for b in frames) @staticmethod def _as_buffer_native(runner: DecodeRunner, index: int | None) -> Buffer: """ "Return the raw encoded pixel data as a buffer-like. Parameters ---------- runner : pydicom.pixels.decoders.base.DecodeRunner The runner with the encoded data and decoding options. index : int | None The index of the frame to be returned, or ``None`` if all frames are to be returned Returns ------- bytes | bytearray | memoryview A buffer-like containing the decoded pixel data. Will return the same type as in the buffer containing the pixel data unless `view_only` is ``True`` in which case a :class:`memoryview` of the original buffer will be returned instead. Notes ----- For certain images, those with BitsAllocated=1, multiple frames and number of pixels per frame that is not a multiple of 8, it is not possible to isolate a buffer to a single frame because frame boundaries may occur within the middle a byte. If a single frame is requested (via ``index``) for these cases, the buffer returned will consist of the smallest set of bytes required to entirely contain the requested frame. However, the first and last byte may also contain information on pixel values in neighboring frames. """ length_bytes = runner.frame_length(unit="bytes") src: Buffer | BinaryIO if runner.is_dataset or runner.is_buffer: if runner.get_option("view_only", False): src = memoryview(cast(Buffer, runner.src)) else: src = cast(Buffer, runner.src) file_offset = 0 length_source: int | float = len(src) else: src = cast(BinaryIO, runner.src) file_offset = src.tell() length_source = length_bytes * runner.number_of_frames if runner._test_for("be_swap_ow"): # Since we are using 8 bit images, frames will always be an integer # number of bytes length_bytes = cast(int, length_bytes) length_source = cast(int, length_source) # Big endian 8-bit data encoded as OW if index is not None: # Return specified frame only start_offset = file_offset + index * length_bytes if start_offset + length_bytes > file_offset + length_source: raise ValueError( f"There is insufficient pixel data to contain {index + 1} frames" ) if length_bytes % 2 == 0: # Even length frame: start and end correct return runner.get_data(src, start_offset, length_bytes) # Odd length frame # Even index: start correct, end incorrect # -> src[start:start + length + 1] # Odd index: start incorrect, end correct # -> src[start - 1:start + length + 1] return runner.get_data(src, start_offset - index % 2, length_bytes + 1) # Return all frames length_bytes *= runner.number_of_frames return runner.get_data(src, file_offset, length_bytes + length_bytes % 2) if index is not None: # Return specified frame only start_offset = floor(file_offset + index * length_bytes) if start_offset + length_bytes > file_offset + length_source: raise ValueError( f"There is insufficient pixel data to contain {index + 1} frames" ) return runner.get_data(src, start_offset, ceil(length_bytes)) # Return all frames length_bytes *= runner.number_of_frames return runner.get_data(src, file_offset, ceil(length_bytes)) def iter_array( self, src: "Dataset | Buffer | BinaryIO", *, indices: Iterable[int] | None = None, raw: bool = False, validate: bool = True, decoding_plugin: str = "", **kwargs: Any, ) -> Iterator[tuple["np.ndarray", dict[str, str | int]]]: """Yield pixel data frames as :class:`~numpy.ndarray`. .. warning:: This method requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decoding. See the :doc:`pixel data decompression documentation ` for more information. **Processing** The following processing operations on the raw pixel data are always performed: * Natively encoded bit-packed pixel data for a :ref:`bits allocated ` of ``1`` will be unpacked. * Natively encoded pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL_422"`` will have it's sub-sampling removed. * The output array will be reshaped to the specified dimensions. * JPEG-LS or JPEG 2000 encoded data whose signedness doesn't match the expected :ref:`pixel representation` will be converted to match. If ``raw = False`` (the default) then the following processing operation will also be performed: * Pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL"`` or ``"YBR_FULL_422"`` will be converted to ``"RGB"``. Parameters ---------- src : :class:`~pydicom.dataset.Dataset` | buffer-like | file-like Single or multi-frame pixel data as one of the following: * :class:`~pydicom.dataset.Dataset`: a dataset containing the pixel data to be decoded and the corresponding *Image Pixel* module elements. * :class:`bytes` | :class:`bytearray` | :class:`memoryview`: the encoded (and possibly encapsulated) pixel data to be decoded. * :class:`~typing.BinaryIO`: a file-like positioned at the start of the pixel data element's value. The position will be returned to the starting offset only after all frames have been yielded. When `src` is not a :class:`~pydicom.dataset.Dataset` then a number of keyword parameters are also required. Please see the :doc:`decoding options documentation` for more information. indices : Iterable[int] | None, optional If ``None`` (default) then iterate through the entire pixel data, otherwise only iterate through the frames specified by `indices`. raw : bool, optional If ``True`` then yield the decoded pixel data after only minimal processing (see the processing section above). If ``False`` (default) then additional processing may be applied to convert the pixel data to it's most commonly used form (such as converting from YCbCr to RGB). To yield frames of pixel data with no processing whatsoever, use the :meth:`~pydicom.pixels.decoders.base.Decoder.iter_buffer` method. validate : bool, optional If ``True`` (default) then validate the supplied decoding options and encoded pixel data prior to decoding, otherwise if ``False`` no validation will be performed. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one yielded. For information on the available plugins for each decoder see the :doc:`API documentation`. **kwargs Optional keyword parameters for controlling decoding are also available, please see the :doc:`decoding options documentation ` for more information. Yields ------ numpy.ndarray A single frame of decoded and reshaped pixel data, with shape: * (rows, columns) for single sample data * (rows, columns, samples) for multi-sample data The :class:`~numpy.dtype` for the array will have an :attr:`~numpy.dtype.itemsize` sufficient to contain pixels of at least :ref:`bits allocated`. A writeable :class:`~numpy.ndarray` is returned by default. For native transfer syntaxes with ``view_only=True`` a read-only :class:`~numpy.ndarray` will be yielded if `src` is immutable. dict[str, str | int] The :dcm:`Image Pixel` module element values resulting from the decoding process that describe the array. See :meth:`DecodeRunner.pixel_properties() ` for the possible contents. """ if not HAVE_NP: raise ImportError( "NumPy is required when converting pixel data to an ndarray" ) runner = DecodeRunner(self.UID) runner.set_source(src) runner.set_options(**kwargs) runner.set_decoders( cast( dict[str, "DecodeFunction"], self._validate_plugins(decoding_plugin), ), ) if config.debugging: LOGGER.debug(runner) if validate: runner.validate() if self.is_native: func = self._as_array_native as_writeable = not runner.get_option("view_only", False) else: func = self._as_array_encapsulated as_writeable = True log_warning = True if self.is_encapsulated and not indices: for frame in runner.iter_decode(): arr = np.frombuffer(frame, dtype=runner.pixel_dtype) arr = runner.reshape(arr, as_frame=True) if runner._test_for("sign_correction"): arr = _apply_sign_correction(arr, runner) elif runner._test_for("shift_correction"): arr = _correct_unused_bits(arr, runner, log_warning=log_warning) log_warning = False overrides: dict[str, str | int] = {} if not raw: # Processing may give us a new writeable array anyway, so do # it first to avoid an unnecessary ndarray.copy() arr, overrides = runner.process(arr) arr = arr if arr.flags.writeable else arr.copy() # Multi-sample arrays are always returned *Planar Configuration* 0 if runner.samples_per_pixel > 1: overrides["planar_configuration"] = 0 pixel_properties = runner.pixel_properties(as_frame=True) pixel_properties.update(overrides) yield arr, pixel_properties return indices = indices if indices else range(runner.number_of_frames) for index in indices: arr = runner.reshape(func(runner, index), as_frame=True) if runner._test_for("sign_correction"): arr = _apply_sign_correction(arr, runner) elif runner._test_for("shift_correction"): arr = _correct_unused_bits(arr, runner, log_warning=log_warning) log_warning = False overrides = {} if not raw: arr, overrides = runner.process(arr) arr = arr.copy() if not arr.flags.writeable and as_writeable else arr if runner.samples_per_pixel > 1: overrides["planar_configuration"] = 0 pixel_properties = runner.pixel_properties(as_frame=True) pixel_properties.update(overrides) yield arr, pixel_properties def iter_buffer( self, src: "Dataset | Buffer | BinaryIO", *, indices: Iterable[int] | None = None, validate: bool = True, decoding_plugin: str = "", **kwargs: Any, ) -> Iterator[tuple[Buffer, dict[str, str | int]]]: """Yield raw decoded pixel data frames as a buffer-like. .. warning:: This method should only be used by advanced users who understand the intricacies of converting raw decoded DICOM pixel data to a usable form. It may also require the installation of additional packages to perform the actual pixel data decoding (see the :doc:`pixel data decompression documentation` for more information). Parameters ---------- src : :class:`~pydicom.dataset.Dataset` | buffer-like | file-like Single or multi-frame pixel data as one of the following: * :class:`~pydicom.dataset.Dataset`: a dataset containing the pixel data to be decoded and the corresponding *Image Pixel* module elements. * :class:`bytes` | :class:`bytearray` | :class:`memoryview`: the encoded (and possibly encapsulated) pixel data to be decoded. * :class:`~typing.BinaryIO`: a file-like positioned at the start of the pixel data element's value. The position will be returned to the starting offset only after all frames have been yielded. When `src` is not a :class:`~pydicom.dataset.Dataset` then a number of keyword parameters are also required. Please see the :doc:`decoding options documentation` for more information. indices : Iterable[int] | None, optional If ``None`` (default) then iterate through the entire pixel data, otherwise only iterate through the frames specified by `indices`. validate : bool, optional If ``True`` (default) then validate the supplied decoding options and encoded pixel data prior to decoding, otherwise if ``False`` no validation will be performed. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one yielded. For information on the available plugins for each decoder see the :doc:`API documentation`. **kwargs Optional keyword parameters for controlling decoding are also available, please see the :doc:`decoding options documentation ` for more information. Yields ------- bytes | bytearray | memoryview A single frame of decoded pixel data. * For natively encoded pixel data when `src` is a buffer-like the same type in `src` will be yielded, except if `view_only` is ``True`` in which case a :class:`memoryview` on the original buffer will be yielded instead. If `src` is a file-like then :class:`bytes` will always be yielded. * Encapsulated pixel data will be yielded as :class:`bytearray`. 8-bit pixel data encoded as **OW** using *Explicit VR Big Endian* will be yielded as-is and may need byte-swapping. To facilitate this an extra byte before the expected start (for an odd `index`) or after the expected end (for an even `index`) is yielded if the frame contains an odd number of pixels. dict[str, str | int] The :dcm:`Image Pixel` module element values resulting from the decoding process that describe the decoded frame of pixel data. See :meth:`DecodeRunner.pixel_properties() ` for the possible contents. """ runner = DecodeRunner(self.UID) runner.set_source(src) runner.set_options(**kwargs) runner.set_decoders( cast( dict[str, "DecodeFunction"], self._validate_plugins(decoding_plugin), ), ) if validate: runner.validate() if self.is_encapsulated and not indices: for buffer in runner.iter_decode(): yield buffer, runner.pixel_properties(as_frame=True) return if self.is_native: func = self._as_buffer_native else: func = self._as_buffer_encapsulated indices = indices if indices else range(runner.number_of_frames) for index in indices: yield func(runner, index), runner.pixel_properties(as_frame=True) # Decoder names should be f"{UID.keyword}Decoder" # Uncompressed transfer syntaxes need no plugins ImplicitVRLittleEndianDecoder = Decoder(ImplicitVRLittleEndian) ExplicitVRLittleEndianDecoder = Decoder(ExplicitVRLittleEndian) ExplicitVRBigEndianDecoder = Decoder(ExplicitVRBigEndian) DeflatedExplicitVRLittleEndianDecoder = Decoder(DeflatedExplicitVRLittleEndian) # Compressed transfer syntaxes JPEGBaseline8BitDecoder = Decoder(JPEGBaseline8Bit) JPEGBaseline8BitDecoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pillow", ("pydicom.pixels.decoders.pillow", "_decode_frame")), ] ) JPEGExtended12BitDecoder = Decoder(JPEGExtended12Bit) JPEGExtended12BitDecoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pillow", ("pydicom.pixels.decoders.pillow", "_decode_frame")), ] ) JPEGLosslessDecoder = Decoder(JPEGLossless) JPEGLosslessDecoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ] ) JPEGLosslessSV1Decoder = Decoder(JPEGLosslessSV1) JPEGLosslessSV1Decoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ] ) JPEGLSLosslessDecoder = Decoder(JPEGLSLossless) JPEGLSLosslessDecoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pyjpegls", ("pydicom.pixels.decoders.pyjpegls", "_decode_frame")), ] ) JPEGLSNearLosslessDecoder = Decoder(JPEGLSNearLossless) JPEGLSNearLosslessDecoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pyjpegls", ("pydicom.pixels.decoders.pyjpegls", "_decode_frame")), ] ) JPEG2000LosslessDecoder = Decoder(JPEG2000Lossless) JPEG2000LosslessDecoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pillow", ("pydicom.pixels.decoders.pillow", "_decode_frame")), ] ) JPEG2000Decoder = Decoder(JPEG2000) JPEG2000Decoder.add_plugins( [ ("gdcm", ("pydicom.pixels.decoders.gdcm", "_decode_frame")), ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pillow", ("pydicom.pixels.decoders.pillow", "_decode_frame")), ] ) HTJ2KLosslessDecoder = Decoder(HTJ2KLossless) HTJ2KLosslessDecoder.add_plugin( "pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame") ) HTJ2KLosslessRPCLDecoder = Decoder(HTJ2KLosslessRPCL) HTJ2KLosslessRPCLDecoder.add_plugin( "pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame") ) HTJ2KDecoder = Decoder(HTJ2K) HTJ2KDecoder.add_plugin( "pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame") ) RLELosslessDecoder = Decoder(RLELossless) RLELosslessDecoder.add_plugins( [ ("pylibjpeg", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")), ("pydicom", ("pydicom.pixels.decoders.rle", "_decode_frame")), ] ) # Available pixel data decoders _PIXEL_DATA_DECODERS = { # UID: (decoder, 'versionadded') ImplicitVRLittleEndian: (ImplicitVRLittleEndianDecoder, "3.0"), ExplicitVRLittleEndian: (ExplicitVRLittleEndianDecoder, "3.0"), DeflatedExplicitVRLittleEndian: (DeflatedExplicitVRLittleEndianDecoder, "3.0"), ExplicitVRBigEndian: (ExplicitVRBigEndianDecoder, "3.0"), JPEGBaseline8Bit: (JPEGBaseline8BitDecoder, "3.0"), JPEGExtended12Bit: (JPEGExtended12BitDecoder, "3.0"), JPEGLossless: (JPEGLosslessDecoder, "3.0"), JPEGLosslessSV1: (JPEGLosslessSV1Decoder, "3.0"), JPEGLSLossless: (JPEGLSLosslessDecoder, "3.0"), JPEGLSNearLossless: (JPEGLSNearLosslessDecoder, "3.0"), JPEG2000Lossless: (JPEG2000LosslessDecoder, "3.0"), JPEG2000: (JPEG2000Decoder, "3.0"), HTJ2KLossless: (HTJ2KLosslessDecoder, "3.0"), HTJ2KLosslessRPCL: (HTJ2KLosslessRPCLDecoder, "3.0"), HTJ2K: (HTJ2KDecoder, "3.0"), RLELossless: (RLELosslessDecoder, "3.0"), } def _build_decoder_docstrings() -> None: """Override the default Decoder docstring.""" for dec, versionadded in _PIXEL_DATA_DECODERS.values(): uid = dec.UID available = dec._available.keys() unavailable = dec._unavailable.keys() plugins = list(available) + list(unavailable) s = [f"A pixel data decoder for *{uid.name}* - ``{uid}``"] s.append("") s.append(f".. versionadded:: {versionadded}") s.append("") if plugins: s.append(f"Available decoding plugins: {', '.join(sorted(plugins))}.") s.append("") s.append( "Plugin-specific options are given in the :doc:`decoder " "options documentation`." ) s.append("") s.append( "See the :class:`~pydicom.pixels.decoders.base.Decoder` " "reference for instance methods and attributes." ) dec.__doc__ = "\n".join(s) _build_decoder_docstrings() def get_decoder(uid: str) -> Decoder: """Return the pixel data decoder corresponding to `uid`. .. versionadded:: 3.0 +-----------------------------------------------------------------------------+ | Supported Transfer Syntaxes | +--------------------------------------+----------------------------+---------+ | Name | UID | Version | | | | added | +======================================+============================+=========+ | *Implicit VR Little Endian* | 1.2.840.10008.1.2 | 3.0 | +--------------------------------------+----------------------------+---------+ | *Explicit VR Little Endian* | 1.2.840.10008.1.2.1 | 3.0 | +--------------------------------------+----------------------------+---------+ | *Deflated Explicit VR Little Endian* | 1.2.840.10008.1.2.1.2.1.99 | 3.0 | +--------------------------------------+----------------------------+---------+ | *Explicit VR Big Endian* | 1.2.840.10008.1.2.2 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG Baseline 8-bit* | 1.2.840.10008.1.2.4.50 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG Extended 12-bit* | 1.2.840.10008.1.2.4.51 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG Lossless P14* | 1.2.840.10008.1.2.4.57 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG Lossless SV1* | 1.2.840.10008.1.2.4.70 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG-LS Lossless* | 1.2.840.10008.1.2.4.80 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG-LS Near Lossless* | 1.2.840.10008.1.2.4.81 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG2000 Lossless* | 1.2.840.10008.1.2.4.90 | 3.0 | +--------------------------------------+----------------------------+---------+ | *JPEG2000* | 1.2.840.10008.1.2.4.91 | 3.0 | +--------------------------------------+----------------------------+---------+ | *HTJ2K Lossless* | 1.2.840.10008.1.2.4.201 | 3.0 | +--------------------------------------+----------------------------+---------+ | *HTJ2K Lossless RPCL* | 1.2.840.10008.1.2.4.202 | 3.0 | +--------------------------------------+----------------------------+---------+ | *HTJ2K* | 1.2.840.10008.1.2.4.203 | 3.0 | +--------------------------------------+----------------------------+---------+ | *RLE Lossless* | 1.2.840.10008.1.2.5 | 3.0 | +--------------------------------------+----------------------------+---------+ """ uid = UID(uid) try: return _PIXEL_DATA_DECODERS[uid][0] except KeyError: raise NotImplementedError( f"No pixel data decoders have been implemented for '{uid.name}'" ) pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/gdcm.py000066400000000000000000000110271515706620200240420ustar00rootroot00000000000000# Copyright 2024 pydicom authors. See LICENSE file for details. """Use GDCM to decompress encoded *Pixel Data*. This module is not intended to be used directly. """ from typing import cast from pydicom import uid from pydicom.pixels.decoders.base import DecodeRunner from pydicom.pixels.common import PhotometricInterpretation as PI try: import gdcm GDCM_VERSION = tuple(int(x) for x in gdcm.Version.GetVersion().split(".")) HAVE_GDCM = True except ImportError: HAVE_GDCM = False DECODER_DEPENDENCIES = { uid.JPEGBaseline8Bit: ("gdcm>=3.0.10",), uid.JPEGExtended12Bit: ("gdcm>=3.0.10",), uid.JPEGLossless: ("gdcm>=3.0.10",), uid.JPEGLosslessSV1: ("gdcm>=3.0.10",), uid.JPEGLSLossless: ("gdcm>=3.0.10",), uid.JPEGLSNearLossless: ("gdcm>=3.0.10",), uid.JPEG2000Lossless: ("gdcm>=3.0.10",), uid.JPEG2000: ("gdcm>=3.0.10",), } def is_available(uid: str) -> bool: """Return ``True`` if a pixel data decoder for `uid` is available for use, ``False`` otherwise. """ if not HAVE_GDCM or GDCM_VERSION < (3, 0): return False return uid in DECODER_DEPENDENCIES def _decode_frame(src: bytes, runner: DecodeRunner) -> bytes: """Return the decoded `src` as :class:`bytes`. Parameters ---------- src : bytes An encoded pixel data frame. runner : pydicom.pixels.decoders.base.DecodeRunner The runner managing the decoding. Returns ------- bytes The decoded pixel data frame. """ tsyntax = runner.transfer_syntax photometric_interpretation = runner.photometric_interpretation bits_stored = runner.bits_stored if tsyntax == uid.JPEGExtended12Bit and bits_stored != 8: raise NotImplementedError( "GDCM does not support 'JPEG Extended' for samples with 12-bit precision" ) if ( tsyntax == uid.JPEGLSNearLossless and runner.pixel_representation == 1 and bits_stored < 8 ): raise ValueError( "Unable to decode signed lossy JPEG-LS pixel data with a sample " "precision less than 8 bits" ) if tsyntax in uid.JPEGLSTransferSyntaxes and bits_stored in (6, 7): raise ValueError( "Unable to decode unsigned JPEG-LS pixel data with a sample " "precision of 6 or 7 bits" ) fragment = gdcm.Fragment() fragment.SetByteStringValue(src) fragments = gdcm.SequenceOfFragments.New() fragments.AddFragment(fragment) elem = gdcm.DataElement(gdcm.Tag(0x7FE0, 0x0010)) elem.SetValue(fragments.__ref__()) img = gdcm.Image() img.SetNumberOfDimensions(2) img.SetDimensions((runner.columns, runner.rows, 1)) img.SetDataElement(elem) pi_type = gdcm.PhotometricInterpretation.GetPIType(photometric_interpretation) img.SetPhotometricInterpretation(gdcm.PhotometricInterpretation(pi_type)) if runner.samples_per_pixel > 1: img.SetPlanarConfiguration(runner.planar_configuration) ts_type = gdcm.TransferSyntax.GetTSType(str.__str__(tsyntax)) img.SetTransferSyntax(gdcm.TransferSyntax(ts_type)) if tsyntax in uid.JPEGLSTransferSyntaxes: # GDCM always returns JPEG-LS data as color-by-pixel runner.set_option("planar_configuration", 0) bits_stored = runner.get_option("jls_precision", bits_stored) if 0 < bits_stored <= 8: runner.set_option("bits_allocated", 8) elif 8 < bits_stored <= 16: runner.set_option("bits_allocated", 16) if tsyntax in uid.JPEG2000TransferSyntaxes: # GDCM pixel container size is based on precision bits_stored = runner.get_option("j2k_precision", bits_stored) if 0 < bits_stored <= 8: runner.set_option("bits_allocated", 8) elif 8 < bits_stored <= 16: runner.set_option("bits_allocated", 16) elif 16 < bits_stored <= 32: runner.set_option("bits_allocated", 32) pixel_format = gdcm.PixelFormat( runner.samples_per_pixel, runner.bits_allocated, bits_stored, bits_stored - 1, runner.pixel_representation, ) img.SetPixelFormat(pixel_format) # GDCM returns char* as str, so re-encode it to bytes frame = img.GetBuffer().encode("utf-8", "surrogateescape") # GDCM returns YBR_ICT and YBR_RCT as RGB if tsyntax in uid.JPEG2000TransferSyntaxes and photometric_interpretation in ( PI.YBR_ICT, PI.YBR_RCT, ): runner.set_option("photometric_interpretation", PI.RGB) return cast(bytes, frame) pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/pillow.py000066400000000000000000000111201515706620200244300ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Use Pillow to decompress encoded *Pixel Data*. This module is not intended to be used directly. """ from io import BytesIO from typing import cast from pydicom import uid from pydicom.pixels.utils import _passes_version_check from pydicom.pixels.common import PhotometricInterpretation as PI from pydicom.pixels.decoders.base import DecodeRunner try: from PIL import Image, features except ImportError: pass try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False DECODER_DEPENDENCIES = { uid.JPEGBaseline8Bit: ("pillow>=10.0",), uid.JPEGExtended12Bit: ("pillow>=10.0",), uid.JPEG2000Lossless: ("numpy", "pillow>=10.0"), uid.JPEG2000: ("numpy", "pillow>=10.0"), } _LIBJPEG_SYNTAXES = [uid.JPEGBaseline8Bit, uid.JPEGExtended12Bit] _OPENJPEG_SYNTAXES = [uid.JPEG2000Lossless, uid.JPEG2000] def is_available(uid: str) -> bool: """Return ``True`` if a pixel data decoder for `uid` is available for use, ``False`` otherwise. """ if not _passes_version_check("PIL", (10, 0)): return False if uid in _LIBJPEG_SYNTAXES: return bool(features.check_codec("jpg")) # type: ignore[no-untyped-call] if uid in _OPENJPEG_SYNTAXES: return bool(features.check_codec("jpg_2000")) and HAVE_NP # type: ignore[no-untyped-call] return False def _decode_frame(src: bytes, runner: DecodeRunner) -> bytes: """Return the decoded image data in `src` as a :class:`bytes`.""" tsyntax = runner.transfer_syntax # libjpeg only supports 8-bit JPEG Extended (can be 8 or 12 in the JPEG standard) if tsyntax == uid.JPEGExtended12Bit and runner.bits_stored != 8: raise NotImplementedError( "Pillow does not support 'JPEG Extended' for samples with 12-bit precision" ) image = Image.open(BytesIO(src), formats=("JPEG", "JPEG2000")) if tsyntax in _LIBJPEG_SYNTAXES: if runner.samples_per_pixel != 1: # If the Adobe APP14 marker is not present then Pillow assumes # that JPEG images were transformed into YCbCr color space prior # to compression, so setting the image mode to YCbCr signals we # don't want any color transformations. # Any color transformations would be inconsistent with the # behavior required by the `raw` flag if "adobe_transform" not in image.info: image.draft("YCbCr", image.size) # type: ignore[no-untyped-call] return cast(bytes, image.tobytes()) # JPEG 2000 # The precision from the J2K codestream is more appropriate because the # decoder will use it to create the output integers precision = runner.get_option("j2k_precision", runner.bits_stored) # pillow's pixel container size is based on precision if 0 < precision <= 8: runner.set_option("bits_allocated", 8) elif 8 < precision <= 16: # Pillow converts >= 9-bit RGB/YCbCr data to 8-bit if runner.samples_per_pixel > 1: raise ValueError( f"Pillow cannot decode {precision}-bit multi-sample data correctly" ) runner.set_option("bits_allocated", 16) else: raise ValueError( "only (0028,0101) 'Bits Stored' values of up to 16 are supported" ) # Pillow converts N-bit signed/unsigned data to 8- or 16-bit unsigned data # See Pillow src/libImaging/Jpeg2KDecode.c::j2ku_gray_i buffer = bytearray(image.tobytes()) # so the array is writeable del image dtype = runner.pixel_dtype arr = np.frombuffer(buffer, dtype=f"u{dtype.itemsize}") is_signed = runner.pixel_representation if runner.get_option("apply_j2k_sign_correction", False): is_signed = runner.get_option("j2k_is_signed", is_signed) if is_signed and runner.pixel_representation == 1: # Re-view the unsigned integers as signed # e.g. [0, 127, 128, 255] -> [0, 127, -128, -1] arr = arr.view(dtype) # Level-shift to match the unsigned integers range # e.g. [0, 127, -128, -1] -> [-128, -1, 0, 127] arr -= np.int32(2 ** (runner.bits_allocated - 1)) if bit_shift := (runner.bits_allocated - precision): # Bit shift to undo the upscaling of N-bit to 8- or 16-bit np.right_shift(arr, bit_shift, out=arr) # pillow returns YBR_ICT and YBR_RCT as RGB if runner.photometric_interpretation in (PI.YBR_ICT, PI.YBR_RCT): runner.set_option("photometric_interpretation", PI.RGB) return cast(bytes, arr.tobytes()) pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/pyjpegls.py000066400000000000000000000026311515706620200247660ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Use pyjpegls to decompress encoded *Pixel Data*. This module is not intended to be used directly. """ from typing import cast from pydicom import uid from pydicom.pixels.utils import _passes_version_check from pydicom.pixels.decoders.base import DecodeRunner try: import jpeg_ls except ImportError: pass DECODER_DEPENDENCIES = { uid.JPEGLSLossless: ("numpy", "pyjpegls>=1.2"), uid.JPEGLSNearLossless: ("numpy", "pyjpegls>=1.2"), } def is_available(uid: str) -> bool: """Return ``True`` if the decoder has its dependencies met, ``False`` otherwise""" return _passes_version_check("jpeg_ls", (1, 2)) def _decode_frame(src: bytes, runner: DecodeRunner) -> bytearray: """Return the decoded image data in `src` as a :class:`bytearray`.""" buffer, info = jpeg_ls.decode_pixel_data(src) # Interleave mode 0 is colour-by-plane, 1 and 2 are colour-by-pixel if info["components"] > 1: if info["interleave_mode"] == 0: runner.set_option("planar_configuration", 1) else: runner.set_option("planar_configuration", 0) precision = info["bits_per_sample"] if 0 < precision <= 8: runner.set_option("bits_allocated", 8) elif 8 < precision <= 16: runner.set_option("bits_allocated", 16) return cast(bytearray, buffer) pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/pylibjpeg.py000066400000000000000000000103271515706620200251170ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Use pylibjpeg to decompress encoded *Pixel Data*. This module is not intended to be used directly. """ from typing import cast from pydicom import uid from pydicom.pixels.decoders.base import DecodeRunner from pydicom.pixels.utils import _passes_version_check from pydicom.pixels.common import PhotometricInterpretation as PI try: from pylibjpeg.utils import get_pixel_data_decoders, Decoder # {UID: {plugin name: function}} _DECODERS = cast( dict[uid.UID, dict[str, "Decoder"]], get_pixel_data_decoders(version=2) ) except ImportError: _DECODERS = {} DECODER_DEPENDENCIES = { uid.JPEGBaseline8Bit: ("pylibjpeg>=2.0", "pylibjpeg-libjpeg>=2.1"), uid.JPEGExtended12Bit: ("pylibjpeg>=2.0", "pylibjpeg-libjpeg>=2.1"), uid.JPEGLossless: ("pylibjpeg>=2.0", "pylibjpeg-libjpeg>=2.1"), uid.JPEGLosslessSV1: ("pylibjpeg>=2.0", "pylibjpeg-libjpeg>=2.1"), uid.JPEGLSLossless: ("pylibjpeg>=2.0", "pylibjpeg-libjpeg>=2.1"), uid.JPEGLSNearLossless: ("pylibjpeg>=2.0", "pylibjpeg-libjpeg>=2.1"), uid.JPEG2000Lossless: ("pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.0"), uid.JPEG2000: ("pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.0"), uid.HTJ2KLossless: ("pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.0"), uid.HTJ2KLosslessRPCL: ("pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.0"), uid.HTJ2K: ("pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.0"), uid.RLELossless: ("pylibjpeg>=2.0", "pylibjpeg-rle>=2.0"), } _LIBJPEG_SYNTAXES = [ uid.JPEGBaseline8Bit, uid.JPEGExtended12Bit, uid.JPEGLossless, uid.JPEGLosslessSV1, uid.JPEGLSLossless, uid.JPEGLSNearLossless, ] _OPENJPEG_SYNTAXES = [ uid.JPEG2000Lossless, uid.JPEG2000, uid.HTJ2KLossless, uid.HTJ2KLosslessRPCL, uid.HTJ2K, ] _RLE_SYNTAXES = [uid.RLELossless] def is_available(uid: str) -> bool: """Return ``True`` if the decoder has its dependencies met, ``False`` otherwise""" if not _passes_version_check("pylibjpeg", (2, 0)): return False if uid in _LIBJPEG_SYNTAXES: return _passes_version_check("libjpeg", (2, 0, 2)) if uid in _OPENJPEG_SYNTAXES: return _passes_version_check("openjpeg", (2, 0)) if uid in _RLE_SYNTAXES: return _passes_version_check("rle", (2, 0)) return False def _decode_frame(src: bytes, runner: DecodeRunner) -> bytearray: # type: ignore[return] """Return the decoded image data in `src` as a :class:`bytearray`.""" tsyntax = runner.transfer_syntax # Currently only one pylibjpeg plugin is available per UID # so decode using the first available decoder for _, func in sorted(_DECODERS[tsyntax].items()): # `version=2` to return frame as bytearray frame = cast(bytearray, func(src, version=2, **runner.options)) # pylibjpeg-rle returns decoded data as planar configuration 1 if tsyntax == uid.RLELossless: runner.set_option("planar_configuration", 1) if tsyntax in _OPENJPEG_SYNTAXES: # pylibjpeg-openjpeg returns YBR_ICT and YBR_RCT as RGB if runner.photometric_interpretation in (PI.YBR_ICT, PI.YBR_RCT): runner.set_option("photometric_interpretation", PI.RGB) # pylibjpeg-openjpeg pixel container size is based on J2K precision precision = runner.get_option("j2k_precision", runner.bits_stored) if 0 < precision <= 8: runner.set_option("bits_allocated", 8) elif 8 < precision <= 16: runner.set_option("bits_allocated", 16) elif 16 < precision <= 32: runner.set_option("bits_allocated", 32) if tsyntax in uid.JPEGLSTransferSyntaxes: # pylibjpeg-libjpeg always returns JPEG-LS data as color-by-pixel runner.set_option("planar_configuration", 0) # pylibjpeg-libjpeg pixel container size is based on JPEG-LS precision precision = runner.get_option("jls_precision", runner.bits_stored) if 0 < precision <= 8: runner.set_option("bits_allocated", 8) elif 8 < precision <= 16: runner.set_option("bits_allocated", 16) return frame pydicom-pydicom-20aa4b7/src/pydicom/pixels/decoders/rle.py000066400000000000000000000226471515706620200237240ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Use Python to decode RLE Lossless encoded *Pixel Data*. This module is not intended to be used directly. """ from struct import unpack from pydicom.misc import warn_and_log from pydicom.pixels.decoders.base import DecodeRunner from pydicom.uid import RLELossless DECODER_DEPENDENCIES = {RLELossless: ()} def is_available(uid: str) -> bool: """Return ``True`` if a pixel data decoder for `uid` is available for use, ``False`` otherwise. """ return uid in DECODER_DEPENDENCIES def _decode_frame(src: bytes, runner: DecodeRunner) -> bytearray: """Wrapper for use with the decoder interface. Parameters ---------- src : bytes A single frame of RLE encoded data. runner : pydicom.pixels.decoders.base.DecodeRunner Required parameters: * `rows`: int * `columns`: int * `samples_per_pixel`: int * `bits_allocated`: int Optional parameters: * `rle_segment_order`: str, "<" for little endian segment order, or ">" for big endian (default) Returns ------- bytearray The decoded frame, ordered as planar configuration 1. """ frame = _rle_decode_frame( src, runner.rows, runner.columns, runner.samples_per_pixel, runner.bits_allocated, runner.get_option("rle_segment_order", ">"), ) # Update the runner options to ensure the reshaping is correct # Only do this if we successfully decoded the frame runner.set_option("planar_configuration", 1) return frame def _rle_decode_frame( src: bytes, rows: int, columns: int, nr_samples: int, nr_bits: int, segment_order: str = ">", ) -> bytearray: """Decodes a single frame of RLE encoded data. Each frame may contain up to 15 segments of encoded data. Parameters ---------- src : bytes The RLE frame data rows : int The number of output rows columns : int The number of output columns nr_samples : int Number of samples per pixel (e.g. 3 for RGB data). nr_bits : int Number of bits per sample - must be a multiple of 8 segment_order : str The segment order of the `data`, '>' for big endian (default), '<' for little endian (non-conformant). Returns ------- bytearray The frame's decoded data in little endian and planar configuration 1 byte ordering (i.e. for RGB data this is all red pixels then all green then all blue, with the bytes for each pixel ordered from MSB to LSB when reading left to right). """ if nr_bits % 8: raise NotImplementedError( f"Unable to decode RLE encoded pixel data with {nr_bits} bits allocated" ) # Parse the RLE Header offsets = _rle_parse_header(src[:64]) nr_segments = len(offsets) # Check that the actual number of segments is as expected bytes_per_sample = nr_bits // 8 if nr_segments != nr_samples * bytes_per_sample: raise ValueError( "The number of RLE segments in the pixel data doesn't match the " f"expected amount ({nr_segments} vs. {nr_samples * bytes_per_sample} " "segments)" ) # Ensure the last segment gets decoded offsets.append(len(src)) # Preallocate with null bytes decoded = bytearray(rows * columns * nr_samples * bytes_per_sample) # Example: # RLE encoded data is ordered like this (for 16-bit, 3 sample): # Segment: 0 | 1 | 2 | 3 | 4 | 5 # R MSB | R LSB | G MSB | G LSB | B MSB | B LSB # A segment contains only the MSB or LSB parts of all the sample pixels # To minimise the amount of array manipulation later, and to make things # faster we interleave each segment in a manner consistent with a planar # configuration of 1 (and use little endian byte ordering): # All red samples | All green samples | All blue # Pxl 1 Pxl 2 ... Pxl N | Pxl 1 Pxl 2 ... Pxl N | ... # LSB MSB LSB MSB ... LSB MSB | LSB MSB LSB MSB ... LSB MSB | ... # `stride` is the total number of bytes of each sample plane stride = bytes_per_sample * rows * columns for sample_number in range(nr_samples): le_gen = range(bytes_per_sample) byte_offsets = le_gen if segment_order == "<" else reversed(le_gen) for byte_offset in byte_offsets: # Decode the segment ii = sample_number * bytes_per_sample + byte_offset # ii is 1, 0, 3, 2, 5, 4 for the example above # This is where the segment order correction occurs segment = _rle_decode_segment(src[offsets[ii] : offsets[ii + 1]]) # Check that the number of decoded bytes is correct actual_length = len(segment) if actual_length < rows * columns: raise ValueError( "The amount of decoded RLE segment data doesn't match the " f"expected amount ({actual_length} vs. {rows * columns} bytes)" ) elif actual_length != rows * columns: warn_and_log( "The decoded RLE segment contains non-conformant padding " f"- {actual_length} vs. {rows * columns} bytes expected" ) if segment_order == ">": byte_offset = bytes_per_sample - byte_offset - 1 # For 100 pixel/plane, 32-bit, 3 sample data, `start` will be # 0, 1, 2, 3, 400, 401, 402, 403, 800, 801, 802, 803 start = byte_offset + (sample_number * stride) decoded[start : start + stride : bytes_per_sample] = segment[ : rows * columns ] return decoded def _rle_decode_segment(src: bytes) -> bytearray: """Return a single segment of decoded RLE data as bytearray. Parameters ---------- buffer : bytes The segment data to be decoded. Returns ------- bytearray The decoded segment. """ result = bytearray() pos = 0 result_extend = result.extend try: while True: # header_byte is N + 1 header_byte = src[pos] + 1 pos += 1 if header_byte > 129: # Extend by copying the next byte (-N + 1) times # however since using uint8 instead of int8 this will be # (256 - N + 1) times result_extend(src[pos : pos + 1] * (258 - header_byte)) pos += 1 elif header_byte < 129: # Extend by literally copying the next (N + 1) bytes result_extend(src[pos : pos + header_byte]) pos += header_byte except IndexError: pass return result def _rle_parse_header(header: bytes) -> list[int]: """Return a list of byte offsets for the segments in RLE data. **RLE Header Format** The RLE Header contains the number of segments for the image and the starting offset of each segment. Each of these numbers is represented as an unsigned long stored in little-endian. The RLE Header is 16 long words in length (i.e. 64 bytes) which allows it to describe a compressed image with up to 15 segments. All unused segment offsets shall be set to zero. As an example, the table below describes an RLE Header with 3 segments as would typically be used with 8-bit RGB or YCbCr data (with 1 segment per channel). +--------------+---------------------------------+------------+ | Byte offset | Description | Value | +==============+=================================+============+ | 0 | Number of segments | 3 | +--------------+---------------------------------+------------+ | 4 | Offset of segment 1, N bytes | 64 | +--------------+---------------------------------+------------+ | 8 | Offset of segment 2, M bytes | 64 + N | +--------------+---------------------------------+------------+ | 12 | Offset of segment 3 | 64 + N + M | +--------------+---------------------------------+------------+ | 16 | Offset of segment 4 (not used) | 0 | +--------------+---------------------------------+------------+ | ... | ... | 0 | +--------------+---------------------------------+------------+ | 60 | Offset of segment 15 (not used) | 0 | +--------------+---------------------------------+------------+ Parameters ---------- header : bytes The RLE header data (i.e. the first 64 bytes of an RLE frame). Returns ------- list of int The byte offsets for each segment in the RLE data. Raises ------ ValueError If there are more than 15 segments or if the header is not 64 bytes long. References ---------- DICOM Standard, Part 5, :dcm:`Annex G` """ if len(header) != 64: raise ValueError("The RLE header can only be 64 bytes long") nr_segments = unpack(" 15: raise ValueError( f"The RLE header specifies an invalid number of segments ({nr_segments})" ) return list(unpack(f"<{nr_segments}L", header[4 : 4 * (nr_segments + 1)])) pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/000077500000000000000000000000001515706620200225675ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/__init__.py000066400000000000000000000003671515706620200247060ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. from pydicom.pixels.encoders.base import ( RLELosslessEncoder, JPEGLSLosslessEncoder, JPEGLSNearLosslessEncoder, JPEG2000LosslessEncoder, JPEG2000Encoder, ) pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/base.py000066400000000000000000001043101515706620200240520ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Pixel data encoding.""" from collections.abc import Callable, Iterator, Iterable import logging import math import sys from typing import Any, cast, TYPE_CHECKING try: import numpy as np except ImportError: pass from pydicom import config from pydicom.pixels.common import Buffer, RunnerBase, CoderBase, RunnerOptions from pydicom.uid import ( UID, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, RLELossless, JPEGLSTransferSyntaxes, ) if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset LOGGER = logging.getLogger(__name__) EncodeFunction = Callable[[bytes, "EncodeRunner"], bytes | bytearray] class EncodeOptions(RunnerOptions, total=False): """Options accepted by EncodeRunner and encoding plugins""" # The byte order used by the raw pixel data sent to the encoder # ">" for big endian, "<" for little endian (default) byteorder: str ## Transfer Syntax specific options # JPEG-LS Near Lossless # The maximum allowable error in *unsigned* pixel intensity jls_error: int # JPEG 2000 # Either j2k_cr or j2k_psnr is required # The compression ratio for each quality layer, should be in decreasing order j2k_cr: list[float] # The peak signal-to-noise ratio for each layer, should be in increasing order j2k_psnr: list[float] class EncodeRunner(RunnerBase): """Class for managing the pixel data encoding process. .. versionadded:: 3.0 This class is not intended to be used directly. For encoding pixel data use the :class:`~pydicom.pixels.encoders.base.Encoder` instance corresponding to the transfer syntax of the pixel data. """ def __init__(self, tsyntax: UID) -> None: """Create a new runner for encoding data as `tsyntax`. Parameters ---------- tsyntax : pydicom.uid.UID The transfer syntax UID corresponding to the pixel data to be encoded. """ self._src: Buffer | np.ndarray self._src_type: str self._opts: EncodeOptions = { "transfer_syntax_uid": tsyntax, "byteorder": "<", "pixel_keyword": "PixelData", } self._undeletable = ("transfer_syntax_uid", "pixel_keyword", "byteorder") self._encoders: dict[str, EncodeFunction] = {} def encode(self, index: int | None) -> bytes: """Return an encoded frame of pixel data as :class:`bytes`. Parameters ---------- index : int | None If `index` is ``None`` then the pixel data only contains one frame, otherwise `index` is the frame number to be encoded. Returns ------ bytes The encoded pixel data frame. """ failure_messages = [] for name, func in self._encoders.items(): try: return func(self.get_frame(index), self) except Exception as exc: LOGGER.exception(exc) failure_messages.append(f"{name}: {exc}") messages = "\n ".join(failure_messages) raise RuntimeError( "Unable to encode as exceptions were raised by all available " f"plugins:\n {messages}" ) def get_frame(self, index: int | None) -> bytes: """Return a frame's worth of uncompressed pixel data as :class:`bytes`. Parameters ---------- index : int | None If the pixel data only has one from then use ``None``, otherwise `index` is the index of the frame to be returned. """ if self.is_array: return self._get_frame_array(index) frame = self._get_frame_buffer(index) return bytes(frame) if not isinstance(frame, bytes) else frame def _get_frame_array(self, index: int | None) -> bytes: """Return a frame's worth of uncompressed pixel data from an ndarray.""" # Grab the frame so that subsequent array manipulations minimize # the memory usage arr = cast(np.ndarray, self.src[index] if index is not None else self.src) # The ndarray containing the pixel data may use a larger container # than is strictly needed: e.g. 32 bits allocated with 7 bits stored. # However the encoders expect data to be sized appropriately # for the sample precision, so we may need to downscale if self.bits_stored <= 8: itemsize = 1 elif 8 < self.bits_stored <= 16: itemsize = 2 elif 16 < self.bits_stored <= 32: itemsize = 4 elif 32 < self.bits_stored <= 64: itemsize = 8 if arr.dtype.itemsize != itemsize: arr = arr.astype(f"{arr.dtype.kind}{itemsize}") # JPEG-LS allows different ordering of the input image data via the # interleave mode (ILV) parameter. ILV 0 matches a planar configuration # of 1 and requires shape (samples, rows, columns). ILV 1 and 2 match # planar configuration 0 so no further action is needed if ( self.transfer_syntax in JPEGLSTransferSyntaxes and self.samples_per_pixel == 3 and self.planar_configuration == 1 ): arr = arr.transpose(2, 0, 1) return cast(bytes, arr.tobytes()) def _get_frame_buffer(self, index: int | None) -> bytes | bytearray: """Return a frame's worth of uncompressed pixel data from buffer-like.""" # The encoded pixel data may use a larger container than is strictly # needed: e.g. 32 bits allocated with 7 bits stored # However the encoders typically expect data to be sized appropriately # for the sample precision, so we need to downscale to: # 0 < precision <= 8: an 8-bit container (char) # 8 < precision <= 16: a 16-bit container (short) # 16 < precision <= 32: a 32-bit container (int/long) # 32 < precision <= 64: a 64-bit container (long long) bytes_per_frame = cast(int, self.frame_length(unit="bytes")) start = 0 if index is None else index * bytes_per_frame src = cast(bytes, self.src[start : start + bytes_per_frame]) # Resize the data to fit the appropriate container expected_length = cast(int, self.frame_length(unit="pixels")) bytes_per_pixel = len(src) // expected_length # 1 byte/px actual if self.bits_stored <= 8: # If not 1 byte/px then must be 2, 3, 4, 5, 6, 7 or 8 # but only the first byte is relevant return src if bytes_per_pixel == 1 else src[::bytes_per_pixel] # 2 bytes/px actual if 8 < self.bits_stored <= 16: if bytes_per_pixel == 2: return src # If not 2 bytes/px then must be 3, 4, 5, 6, 7 or 8 # but only the first 2 bytes are relevant out = bytearray(expected_length * 2) out[::2] = src[::bytes_per_pixel] out[1::2] = src[1::bytes_per_pixel] return out # 3 or 4 bytes/px actual if 16 < self.bits_stored <= 32: if bytes_per_pixel == 4: return src # If not 4 bytes/px then must be 3, 5, 6, 7 or 8 # but only the first 3 or 4 bytes are relevant out = bytearray(expected_length * 4) out[::4] = src[::bytes_per_pixel] out[1::4] = src[1::bytes_per_pixel] out[2::4] = src[2::bytes_per_pixel] if bytes_per_pixel > 3: out[3::4] = src[3::bytes_per_pixel] return out # 32 < bits_stored <= 64 (maximum allowed) # 5, 6, 7 or 8 bytes/px actual if bytes_per_pixel == 8: return src # If not 8 bytes/px then must be 5, 6 or 7 out = bytearray(expected_length * 8) out[::8] = src[::bytes_per_pixel] out[1::8] = src[1::bytes_per_pixel] out[2::8] = src[2::bytes_per_pixel] out[3::8] = src[3::bytes_per_pixel] out[4::8] = src[4::bytes_per_pixel] if bytes_per_pixel == 5: return out out[5::8] = src[5::bytes_per_pixel] if bytes_per_pixel == 6: return out # 7 bytes/px out[6::8] = src[6::bytes_per_pixel] return out def set_encoders(self, encoders: dict[str, EncodeFunction]) -> None: """Set the encoders use for encoding compressed pixel data. Parameters ---------- encoders : dict[str, EncodeFunction] A dict of {name: encoder function}. """ self._encoders = encoders def set_source(self, src: "np.ndarray | Dataset | Buffer") -> None: """Set the pixel data to be encoded. Parameters ---------- src : bytes | bytearray | memoryview | pydicom.dataset.Dataset | numpy.ndarray * If a buffer-like then the encoded pixel data * If a :class:`~pydicom.dataset.Dataset` then a dataset containing the pixel data and associated group ``0x0028`` elements. * If a :class:`numpy.ndarray` then an array containing the image data. """ from pydicom.dataset import Dataset if isinstance(src, Dataset): self._set_options_ds(src) self._src = src.PixelData self._src_type = "Dataset" elif isinstance(src, (bytes | bytearray | memoryview)): self._src = src self._src_type = "Buffer" elif isinstance(src, np.ndarray): # Ensure the array is in the required byte order (little-endian) sys_endianness = "<" if sys.byteorder == "little" else ">" # `byteorder` may be # '|': none available, such as for 8 bit -> ignore # '=': native system endianness -> change to '<' or '>' # '<' or '>': little or big byteorder = src.dtype.byteorder byteorder = sys_endianness if byteorder == "=" else byteorder if byteorder == ">": src = src.astype(src.dtype.newbyteorder("<")) self._src = src self._src_type = "Array" else: raise TypeError( "'src' must be bytes, numpy.ndarray or pydicom.dataset.Dataset, " f"not '{src.__class__.__name__}'" ) @property def src(self) -> "Buffer | np.ndarray": """Return the buffer-like or :class:`numpy.ndarray` containing the pixel data.""" return self._src def __str__(self) -> str: """Return nice string output for the runner.""" s = [f"EncodeRunner for '{self.transfer_syntax.name}'"] s.append("Options") s.extend([f" {name}: {value}" for name, value in self.options.items()]) if self._encoders: s.append("Encoders") s.extend([f" {name}" for name in self._encoders]) return "\n".join(s) def validate(self) -> None: """Validate the encoding options and source pixel data.""" self._validate_options() if self.is_dataset or self.is_buffer: self._validate_buffer() else: self._validate_array() # UID specific validation based on Section 8 of Part 5 self._validate_encoding_profile() def _validate_array(self) -> None: """Check that the ndarray matches the supplied options.""" arr = cast(np.ndarray, self.src) shape = arr.shape dtype = arr.dtype if len(shape) not in (2, 3, 4): raise ValueError(f"Unable to encode {len(shape)}D ndarrays") # `arr` may be (for planar configuration 0): # (rows, columns) # (rows, columns, planes) # (frames, rows, columns) # (frames, rows, columns, planes) expected = [ self.number_of_frames, self.rows, self.columns, self.samples_per_pixel, ] expected = expected[1:] if expected[0] == 1 else expected expected = expected[:-1] if expected[-1] in (None, 1) else expected if shape != tuple(expected): raise ValueError( f"Mismatch between the expected ndarray shape {tuple(expected)} " f"and the actual shape {shape}" ) # Check dtype is int or uint ui = [ np.issubdtype(dtype, np.unsignedinteger), np.issubdtype(dtype, np.signedinteger), ] if not any(ui): raise ValueError( f"The ndarray's dtype '{dtype}' is not supported, must be a " "signed or unsigned integer type" ) # Check dtype is consistent with the *Pixel Representation* is_signed = self.pixel_representation == 1 if not ui[is_signed]: s = ["unsigned", "signed"][is_signed] raise ValueError( f"The ndarray's dtype '{dtype}' is not consistent with a (0028,0103) " f"'Pixel Representation' of '{self.pixel_representation}' ({s} integers)" ) # Check the dtype's itemsize is at least as large as *Bits Allocated* if dtype.itemsize < math.ceil(self.bits_allocated / 8): raise ValueError( f"The ndarray's dtype '{dtype}' is not consistent with a (0028,0100) " f"'Bits Allocated' value of '{self.bits_allocated}'" ) # Check the pixel data values are consistent with *Bits Stored* amax, amin = arr.max(), arr.min() if is_signed: minimum = -(2 ** (self.bits_stored - 1)) maximum = 2 ** (self.bits_stored - 1) - 1 else: minimum, maximum = 0, 2**self.bits_stored - 1 if amax > maximum or amin < minimum: raise ValueError( "The ndarray contains values that are outside the allowable " f"range of ({minimum}, {maximum}) for a (0028,0101) 'Bits " f"Stored' value of '{self.bits_stored}'" ) if self.transfer_syntax == JPEGLSNearLossless and is_signed: # JPEG-LS doesn't track signedness, so with lossy encoding of # signed data it's possible to flip from a negative to a positive # value (or vice versa) due to the introduced error. # The only way to avoid this is to limit pixel values to the # range (minimum + jls_error, maximum - jls_error), where # `jls_error` is the JPEG-LS 'NEAR' parameter and `minimum` # and `maximum` are the min/max possible values for a given # sample precision error = self.get_option("jls_error", 0) within = amax <= (maximum - error) and amin >= (minimum + error) if error and not within: raise ValueError( "The supported range of pixel values when performing lossy " "JPEG-LS encoding of signed integers with a (0028,0103) 'Bits " f"Stored' value of '{self.bits_stored}' and a 'jls_error' " f"of '{error}' is ({minimum + error}, {maximum - error})" ) def _validate_buffer(self) -> None: """Validate the supplied pixel data buffer.""" # Check the length is at least as long as required length_bytes = self.frame_length(unit="bytes") expected = length_bytes * self.number_of_frames if (actual := len(self.src)) < expected: raise ValueError( "The length of the uncompressed pixel data doesn't match the " f"expected length - {actual} bytes actual vs. {expected} expected" ) def _validate_encoding_profile(self) -> None: """Perform UID specific validation of encoding parameters based on Part 5, Section 8 of the DICOM Standard. Encoding profiles should be: Tuple[str, int, Iterable[int], Iterable[int], Iterable[int]] as ( PhotometricInterpretation, SamplesPerPixel, PixelRepresentation, BitsAllocated, BitsStored ) """ if self.transfer_syntax not in ENCODING_PROFILES: return # Test each profile and see if it matches source parameters profile = ENCODING_PROFILES[self.transfer_syntax] for pi, spp, px_repr, bits_a, bits_s in profile: try: assert self.photometric_interpretation == pi assert self.samples_per_pixel == spp assert self.pixel_representation in px_repr assert self.bits_allocated in bits_a assert self.bits_stored in bits_s except AssertionError: continue return raise ValueError( "One or more of the following values is not valid for pixel data " f"encoded with '{self.transfer_syntax.name}':\n" f" (0028,0002) Samples per Pixel: {self.samples_per_pixel}\n" " (0028,0006) Photometric Interpretation: " f"{self.photometric_interpretation}\n" f" (0028,0100) Bits Allocated: {self.bits_allocated}\n" f" (0028,0101) Bits Stored: {self.bits_stored}\n" f" (0028,0103) Pixel Representation: {self.pixel_representation}\n" "See Part 5, Section 8.2 of the DICOM Standard for more information" ) class Encoder(CoderBase): """Factory class for data encoders. Every available ``Encoder`` instance in *pydicom* corresponds directly to a single DICOM *Transfer Syntax UID*, and provides a mechanism for converting raw unencoded source data to meet the requirements of that transfer syntax using one or more :doc:`encoding plugins `. .. versionadded:: 2.2 """ def __init__(self, uid: UID) -> None: """Create a new data encoder. Parameters ---------- uid : pydicom.uid.UID The *Transfer Syntax UID* that the encoder supports. """ super().__init__(uid, decoder=False) def encode( self, src: "bytes | np.ndarray | Dataset", *, index: int | None = None, validate: bool = True, encoding_plugin: str = "", **kwargs: Any, ) -> bytes: """Return an encoded frame of the pixel data in `src` as :class:`bytes`. .. warning:: With the exception of *RLE Lossless*, this method requires the installation of additional packages to perform the actual pixel data encoding. See the :doc:`encoding documentation ` for more information. Parameters ---------- src : bytes, numpy.ndarray or pydicom.dataset.Dataset Single or multi-frame pixel data as one of the following: * :class:`~numpy.ndarray`: the uncompressed pixel data, should be :attr:`shaped` as: * (rows, columns) for single frame, single sample data. * (rows, columns, planes) for single frame, multi-sample data. * (frames, rows, columns) for multi-frame, single sample data. * (frames, rows, columns, planes) for multi-frame and multi-sample data. * :class:`~pydicom.dataset.Dataset`: the dataset containing the uncompressed *Pixel Data* to be encoded. * :class:`bytes`: the uncompressed little-endian ordered pixel data. `src` should use 1, 2, 4 or 8 bytes per pixel, whichever of these is sufficient for the (0028,0103) *Bits Stored* value. index : int, optional Required when `src` contains multiple frames, this is the index of the frame to be encoded. validate : bool, optional If ``True`` (default) then validate the supplied encoding options and pixel data prior to encoding, otherwise if ``False`` no validation will be performed. encoding_plugin : str, optional The name of the pixel data encoding plugin to use. If `encoding_plugin` is not specified then all available plugins will be tried (default). For information on the available plugins for each encoder see the :mod:`API documentation`. **kwargs The following keyword parameters are required when `src` is :class:`bytes` or :class:`~numpy.ndarray`: * ``'rows'``: :class:`int` - the number of rows of pixels in `src`, maximum 65535. * ``'columns'``: :class:`int` - the number of columns of pixels in `src`, maximum 65535. * ``'number_of_frames'``: :class:`int` - the number of frames in `src`. * ``'samples_per_pixel'``: :class:`int` - the number of samples per pixel in `src`, should be 1 or 3. * ``'bits_allocated'``: :class:`int` - the number of bits used to contain each pixel, should be a multiple of 8. * ``'bits_stored'``: :class:`int` - the number of bits actually used per pixel. For example, an ``ndarray`` `src` might have a :class:`~numpy.dtype` of ``'uint16'`` (range 0 to 65535) but only contain 12-bit pixel values (range 0 to 4095). * ``'pixel_representation'``: :class:`int` - the type of data being encoded, ``0`` for unsigned, ``1`` for 2's complement (signed) * ``'photometric_interpretation'``: :class:`str` - the intended color space of the *encoded* pixel data, such as ``'YBR_FULL'``. Optional keyword parameters for the encoding plugin may also be present. See the :doc:`encoding plugin options ` for more information. Returns ------- bytes The encoded pixel data. """ if index is not None and index < 0: raise ValueError("'index' must be greater than or equal to 0") runner = EncodeRunner(self.UID) runner.set_source(src) runner.set_options(**kwargs) runner.set_encoders( cast( dict[str, "EncodeFunction"], self._validate_plugins(encoding_plugin), ), ) if config.debugging: LOGGER.debug(runner) if validate: runner.validate() if runner.number_of_frames > 1 and index is None: raise ValueError( "The 'index' of the frame to be encoded is required for " "multi-frame pixel data" ) return runner.encode(index) def iter_encode( self, src: "bytes | np.ndarray | Dataset", *, validate: bool = True, encoding_plugin: str = "", **kwargs: Any, ) -> Iterator[bytes]: """Yield encoded frames of the pixel data in `src` as :class:`bytes`. .. warning:: With the exception of *RLE Lossless*, this method requires the installation of additional packages to perform the actual pixel data encoding. See the :doc:`encoding documentation ` for more information. Parameters ---------- src : bytes, numpy.ndarray or pydicom.dataset.Dataset Single or multi-frame pixel data as one of the following: * :class:`~numpy.ndarray`: the uncompressed pixel data, should be :attr:`shaped` as: * (rows, columns) for single frame, single sample data. * (rows, columns, planes) for single frame, multi-sample data. * (frames, rows, columns) for multi-frame, single sample data. * (frames, rows, columns, planes) for multi-frame and multi-sample data. * :class:`~pydicom.dataset.Dataset`: the dataset containing the uncompressed *Pixel Data* to be encoded. * :class:`bytes`: the uncompressed little-endian ordered pixel data. `src` should use 1, 2, 4 or 8 bytes per pixel, whichever of these is sufficient for the (0028,0103) *Bits Stored* value. validate : bool, optional If ``True`` (default) then validate the supplied encoding options and pixel data prior to encoding, otherwise if ``False`` no validation will be performed. encoding_plugin : str, optional The name of the pixel data encoding plugin to use. If `encoding_plugin` is not specified then all available plugins will be tried (default). For information on the available plugins for each encoder see the :mod:`API documentation`. **kwargs The following keyword parameters are required when `src` is :class:`bytes` or :class:`~numpy.ndarray`: * ``'rows'``: :class:`int` - the number of rows of pixels in `src`, maximum 65535. * ``'columns'``: :class:`int` - the number of columns of pixels in `src`, maximum 65535. * ``'number_of_frames'``: :class:`int` - the number of frames in `src`. * ``'samples_per_pixel'``: :class:`int` - the number of samples per pixel in `src`, should be 1 or 3. * ``'bits_allocated'``: :class:`int` - the number of bits used to contain each pixel, should be a multiple of 8. * ``'bits_stored'``: :class:`int` - the number of bits actually used per pixel. For example, an ``ndarray`` `src` might have a :class:`~numpy.dtype` of ``'uint16'`` (range 0 to 65535) but only contain 12-bit pixel values (range 0 to 4095). * ``'pixel_representation'``: :class:`int` - the type of data being encoded, ``0`` for unsigned, ``1`` for 2's complement (signed) * ``'photometric_interpretation'``: :class:`str` - the intended color space of the encoded pixel data, such as ``'YBR_FULL'``. Optional keyword parameters for the encoding plugin may also be present. See the :doc:`encoding plugin options ` for more information. Yields ------ bytes An encoded frame of pixel data. """ runner = EncodeRunner(self.UID) runner.set_source(src) runner.set_options(**kwargs) runner.set_encoders( cast( dict[str, "EncodeFunction"], self._validate_plugins(encoding_plugin), ), ) if config.debugging: LOGGER.debug(runner) if validate: runner.validate() if runner.number_of_frames == 1: yield runner.encode(None) return for index in range(runner.number_of_frames): yield runner.encode(index) # UID: [ # Photometric Interpretation (the intended value *after* encoding), # Samples per Pixel, # Pixel Representation, # Bits Allocated, # Bits Stored, # ] ProfileType = tuple[str, int, Iterable[int], Iterable[int], Iterable[int]] ENCODING_PROFILES: dict[UID, list[ProfileType]] = { JPEGBaseline8Bit: [ # 1.2.840.10008.1.2.4.50: Table 8.2.1-1 in PS3.5 ("MONOCHROME1", 1, (0,), (8,), (8,)), ("MONOCHROME2", 1, (0,), (8,), (8,)), ("YBR_FULL_422", 3, (0,), (8,), (8,)), ("RGB", 3, (0,), (8,), (8,)), ], JPEGExtended12Bit: [ # 1.2.840.10008.1.2.4.51: Table 8.2.1-1 in PS3.5 ("MONOCHROME1", 1, (0,), (8,), (8,)), ("MONOCHROME1", 1, (0,), (16,), (12,)), ("MONOCHROME2", 1, (0,), (8,), (8,)), ("MONOCHROME2", 1, (0,), (16,), (12,)), ], JPEGLossless: [ # 1.2.840.10008.1.2.4.57: Table 8.2.1-2 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16), range(1, 17)), ("MONOCHROME2", 1, (0, 1), (8, 16), range(1, 17)), ("PALETTE COLOR", 1, (0,), (8, 16), range(1, 17)), ("YBR_FULL", 3, (0,), (8, 16), range(1, 17)), ("RGB", 3, (0,), (8, 16), range(1, 17)), ], JPEGLosslessSV1: [ # 1.2.840.10008.1.2.4.70: Table 8.2.1-2 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16), range(1, 17)), ("MONOCHROME2", 1, (0, 1), (8, 16), range(1, 17)), ("PALETTE COLOR", 1, (0,), (8, 16), range(1, 17)), ("YBR_FULL", 3, (0,), (8, 16), range(1, 17)), ("RGB", 3, (0,), (8, 16), range(1, 17)), ], JPEGLSLossless: [ # 1.2.840.10008.1.2.4.80: Table 8.2.3-1 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16), range(2, 17)), ("MONOCHROME2", 1, (0, 1), (8, 16), range(2, 17)), ("PALETTE COLOR", 1, (0,), (8, 16), range(2, 17)), ("YBR_FULL", 3, (0,), (8,), range(2, 9)), ("RGB", 3, (0,), (8, 16), range(2, 17)), ], JPEGLSNearLossless: [ # 1.2.840.10008.1.2.4.81: Table 8.2.3-1 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16), range(2, 17)), ("MONOCHROME2", 1, (0, 1), (8, 16), range(2, 17)), ("YBR_FULL", 3, (0,), (8,), range(2, 9)), ("RGB", 3, (0,), (8, 16), range(2, 17)), ], JPEG2000Lossless: [ # 1.2.840.10008.1.2.4.90: Table 8.2.4-1 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16, 24, 32, 40), range(1, 39)), ("MONOCHROME2", 1, (0, 1), (8, 16, 24, 32, 40), range(1, 39)), ("PALETTE COLOR", 1, (0,), (8, 16), range(1, 17)), ("YBR_RCT", 3, (0,), (8, 16, 24, 32, 40), range(1, 39)), ("RGB", 3, (0,), (8, 16, 24, 32, 40), range(1, 39)), ("YBR_FULL", 3, (0,), (8, 16, 24, 32, 40), range(1, 39)), ], JPEG2000: [ # 1.2.840.10008.1.2.4.91: Table 8.2.4-1 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16, 24, 32, 40), range(1, 39)), ("MONOCHROME2", 1, (0, 1), (8, 16, 24, 32, 40), range(1, 39)), ("YBR_ICT", 3, (0,), (8, 16, 24, 32, 40), range(1, 39)), ("RGB", 3, (0,), (8, 16, 24, 32, 40), range(1, 39)), ("YBR_FULL", 3, (0,), (8, 16, 24, 32, 40), range(1, 39)), ], RLELossless: [ # 1.2.840.10008.1.2.5: Table 8.2.2-1 in PS3.5 ("MONOCHROME1", 1, (0, 1), (8, 16), range(1, 17)), ("MONOCHROME2", 1, (0, 1), (8, 16), range(1, 17)), ("PALETTE COLOR", 1, (0,), (8, 16), range(1, 17)), ("YBR_FULL", 3, (0,), (8,), range(1, 9)), ("RGB", 3, (0,), (8, 16), range(1, 17)), ], } # Encoder names should be f"{UID.keyword}Encoder" RLELosslessEncoder = Encoder(RLELossless) RLELosslessEncoder.add_plugins( [ ("gdcm", ("pydicom.pixels.encoders.gdcm", "encode_pixel_data")), ("pylibjpeg", ("pydicom.pixels.encoders.pylibjpeg", "_encode_frame")), ("pydicom", ("pydicom.pixels.encoders.native", "_encode_frame")), ], ) JPEGLSLosslessEncoder = Encoder(JPEGLSLossless) JPEGLSLosslessEncoder.add_plugin( "pyjpegls", ("pydicom.pixels.encoders.pyjpegls", "_encode_frame") ) JPEGLSNearLosslessEncoder = Encoder(JPEGLSNearLossless) JPEGLSNearLosslessEncoder.add_plugin( "pyjpegls", ("pydicom.pixels.encoders.pyjpegls", "_encode_frame") ) JPEG2000LosslessEncoder = Encoder(JPEG2000Lossless) JPEG2000LosslessEncoder.add_plugin( "pylibjpeg", ("pydicom.pixels.encoders.pylibjpeg", "_encode_frame") ) JPEG2000Encoder = Encoder(JPEG2000) JPEG2000Encoder.add_plugin( "pylibjpeg", ("pydicom.pixels.encoders.pylibjpeg", "_encode_frame") ) # Available pixel data encoders _PIXEL_DATA_ENCODERS = { # UID: (encoder, 'versionadded') RLELossless: (RLELosslessEncoder, "2.2"), JPEGLSLossless: (JPEGLSLosslessEncoder, "3.0"), JPEGLSNearLossless: (JPEGLSNearLosslessEncoder, "3.0"), JPEG2000Lossless: (JPEG2000LosslessEncoder, "3.0"), JPEG2000: (JPEG2000Encoder, "3.0"), } def _build_encoder_docstrings() -> None: """Override the default Encoder docstring.""" plugin_doc_links = { "pydicom": ":ref:`pydicom `", "pylibjpeg": ":ref:`pylibjpeg `", "gdcm": ":ref:`gdcm `", "pyjpegls": ":ref:`pyjpegls `", } for enc, versionadded in _PIXEL_DATA_ENCODERS.values(): uid = enc.UID available = enc._available.keys() unavailable = enc._unavailable.keys() plugins = list(available) + list(unavailable) plugins = [plugin_doc_links[name] for name in sorted(plugins)] s = [f"A *Pixel Data* encoder for *{uid.name}* - ``{uid}``"] s.append("") s.append(f".. versionadded:: {versionadded}") s.append("") s.append(f"Encoding plugins: {', '.join(plugins)}") s.append("") s.append( "See the :class:`~pydicom.pixels.encoders.base.Encoder` " "reference for instance methods and attributes." ) enc.__doc__ = "\n".join(s) _build_encoder_docstrings() def get_encoder(uid: str) -> Encoder: """Return the pixel data encoder corresponding to `uid`. .. versionadded:: 2.2 +--------------------------------------------------+----------------+ | Transfer Syntax | Version added | +-------------------------+------------------------+ + | Name | UID | | +=========================+========================+================+ | *JPEG-LS Lossless* | 1.2.840.10008.1.2.4.80 | 3.0 | +-------------------------+------------------------+----------------+ | *JPEG-LS Near Lossless* | 1.2.840.10008.1.2.4.81 | 3.0 | +-------------------------+------------------------+----------------+ | *JPEG 2000 Lossless* | 1.2.840.10008.1.2.4.90 | 3.0 | +-------------------------+------------------------+----------------+ | *JPEG 2000* | 1.2.840.10008.1.2.4.91 | 3.0 | +-------------------------+------------------------+----------------+ | *RLE Lossless* | 1.2.840.10008.1.2.5 | 2.2 | +-------------------------+------------------------+----------------+ """ uid = UID(uid) try: return _PIXEL_DATA_ENCODERS[uid][0] except KeyError: raise NotImplementedError( f"No pixel data encoders have been implemented for '{uid.name}'" ) pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/gdcm.py000066400000000000000000000107761515706620200240660ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Interface for *Pixel Data* encoding, not intended to be used directly.""" from typing import cast from pydicom.pixels.encoders.base import EncodeRunner from pydicom.uid import RLELossless try: import gdcm GDCM_VERSION = tuple(int(x) for x in gdcm.Version.GetVersion().split(".")) HAVE_GDCM = True except ImportError: HAVE_GDCM = False ENCODER_DEPENDENCIES = { RLELossless: ("gdcm>=3.0.10",), } def is_available(uid: str) -> bool: """Return ``True`` if a pixel data encoder for `uid` is available for use, ``False`` otherwise. """ if not HAVE_GDCM or GDCM_VERSION < (3, 0, 10): return False return uid in ENCODER_DEPENDENCIES def encode_pixel_data(src: bytes, runner: EncodeRunner) -> bytes: """Return the encoded image data in `src`. Parameters ---------- src : bytes The raw image frame data to be encoded. runner : pydicom.pixels.encoders.base.EncodeRunner The runner managing the encoding process. Returns ------- bytes The encoded image data. """ byteorder = runner.get_option("byteorder", "<") if byteorder == ">": raise ValueError("Unsupported option \"byteorder = '>'\"") return _ENCODERS[runner.transfer_syntax](src, runner) def _rle_encode(src: bytes, runner: EncodeRunner) -> bytes: """Return RLE encoded image data from `src`. Parameters ---------- src : bytes The raw image frame data to be encoded. runner : pydicom.pixels.encoders.base.EncodeRunner The runner managing the encoding process. Returns ------- bytes The encoded image data. """ if runner.bits_allocated > 32: raise ValueError("Unable to encode more than 32-bit data") # Create a gdcm.Image with the uncompressed `src` data pi = gdcm.PhotometricInterpretation.GetPIType(runner.photometric_interpretation) # GDCM's null photometric interpretation gets used for invalid values if pi == gdcm.PhotometricInterpretation.PI_END: raise ValueError( f"Invalid photometric interpretation '{runner.photometric_interpretation}'" ) # `src` uses little-endian byte ordering ts = gdcm.TransferSyntax.ImplicitVRLittleEndian # Must use ImageWriter().GetImage() to create a gdcmImage # also have to make sure `writer` doesn't go out of scope writer = gdcm.ImageWriter() image = writer.GetImage() image.SetNumberOfDimensions(2) image.SetDimensions((runner.columns, runner.rows, 1)) image.SetPhotometricInterpretation(gdcm.PhotometricInterpretation(pi)) image.SetTransferSyntax(gdcm.TransferSyntax(ts)) pixel_format = gdcm.PixelFormat( runner.samples_per_pixel, runner.bits_allocated, runner.bits_stored, runner.bits_stored - 1, runner.pixel_representation, ) image.SetPixelFormat(pixel_format) if runner.samples_per_pixel > 1: # Default `src` is planar configuration 0 (i.e. R1 G1 B1 R2 G2 B2) image.SetPlanarConfiguration(0) # Add the Pixel Data element and set the value to `src` elem = gdcm.DataElement(gdcm.Tag(0x7FE0, 0x0010)) elem.SetByteStringValue(src) image.SetDataElement(elem) # Converts an image to match the set transfer syntax converter = gdcm.ImageChangeTransferSyntax() # Set up the converter with the intended transfer syntax... rle = gdcm.TransferSyntax.GetTSType(runner.transfer_syntax) converter.SetTransferSyntax(gdcm.TransferSyntax(rle)) # ...and image to be converted converter.SetInput(image) # Perform the conversion, returns bool # 'PALETTE COLOR' and a lossy transfer syntax will return False result = converter.Change() if not result: raise RuntimeError( "ImageChangeTransferSyntax.Change() returned a failure result" ) # A new gdcmImage with the converted pixel data element image = converter.GetOutput() # The element's value is the encapsulated encoded pixel data seq = image.GetDataElement().GetSequenceOfFragments() # RLECodec::Code() uses only 1 fragment per frame if seq is None or seq.GetNumberOfFragments() != 1: # Covers both no sequence and unexpected number of fragments raise RuntimeError("Unexpected number of fragments found in the 'Pixel Data'") fragment = seq.GetFragment(0).GetByteValue().GetBuffer() return cast(bytes, fragment.encode("utf-8", "surrogateescape")) _ENCODERS = {RLELossless: _rle_encode} pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/native.py000066400000000000000000000122031515706620200244250ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Interface for *Pixel Data* encoding, not intended to be used directly.""" from itertools import groupby import math from struct import pack from pydicom.pixels.encoders.base import EncodeRunner from pydicom.uid import RLELossless ENCODER_DEPENDENCIES = {RLELossless: ()} def is_available(uid: str) -> bool: """Return ``True`` if a pixel data encoder for `uid` is available for use, ``False`` otherwise. """ return True def _encode_frame(src: bytes, runner: EncodeRunner) -> bytes: """Wrapper for use with the encoder interface. Parameters ---------- src : bytes A single frame of little-endian ordered image data to be RLE encoded. runner : pydicom.pixels.encoders.base.EncodeRunner The runner managing the encoding process. Returns ------- bytes An RLE encoded frame. """ if runner.get_option("byteorder", "<") == ">": raise ValueError("Unsupported option \"byteorder = '>'\"") bytes_allocated = math.ceil(runner.bits_allocated / 8) nr_segments = bytes_allocated * runner.samples_per_pixel if nr_segments > 15: raise ValueError( "Unable to encode as the DICOM standard only allows " "a maximum of 15 segments in RLE encoded data" ) rle_data = bytearray() seg_lengths = [] columns = runner.columns for sample_nr in range(runner.samples_per_pixel): for byte_offset in reversed(range(bytes_allocated)): idx = byte_offset + bytes_allocated * sample_nr segment = _encode_segment(src[idx::nr_segments], columns) rle_data.extend(segment) seg_lengths.append(len(segment)) # Add the number of segments to the header rle_header = bytearray(pack(" bytearray: """Return `src` as an RLE encoded bytearray. Each row of the image is encoded separately as required by the DICOM Standard. Parameters ---------- src : bytes The little-endian ordered data to be encoded, representing a Byte Segment as in the DICOM Standard, Part 5, :dcm:`Annex G.2`. columns : int The number of columns in the image. Returns ------- bytearray The RLE encoded segment, following the format specified by the DICOM Standard. Odd length encoded segments are padded by a trailing ``0x00`` to be even length. """ out = bytearray() for idx in range(0, len(src), columns): out.extend(_encode_row(src[idx : idx + columns])) # Pad odd length data with a trailing 0x00 byte out.extend(b"\x00" * (len(out) % 2)) return out def _encode_row(src: bytes) -> bytes: """Return `src` as RLE encoded bytes. Parameters ---------- src : bytes The little-endian ordered data to be encoded. Returns ------- bytes The RLE encoded row, following the format specified by the DICOM Standard, Part 5, :dcm:`Annex G` Notes ----- * 2-byte repeat runs are always encoded as Replicate Runs rather than only when not preceded by a Literal Run as suggested by the Standard. """ out: list[int] = [] out_append = out.append out_extend = out.extend literal = [] for _, iter_group in groupby(src): group = list(iter_group) if len(group) == 1: literal.append(group[0]) else: if literal: # Literal runs nr_full_runs, len_partial_run = divmod(len(literal), 128) for idx in range(nr_full_runs): idx *= 128 out_append(127) out_extend(literal[idx : idx + 128]) if len_partial_run: out_append(len_partial_run - 1) out_extend(literal[-len_partial_run:]) literal = [] # Replicate runs nr_full_runs, len_partial_run = divmod(len(group), 128) if nr_full_runs: out_extend((129, group[0]) * nr_full_runs) if len_partial_run > 1: out_extend((257 - len_partial_run, group[0])) elif len_partial_run == 1: # Literal run - only if last replicate part is length 1 out_extend((0, group[0])) # Final literal run if literal isn't followed by a replicate run for ii in range(0, len(literal), 128): _run = literal[ii : ii + 128] out_append(len(_run) - 1) out_extend(_run) return pack(f"{len(out)}B", *out) pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/pyjpegls.py000066400000000000000000000031261515706620200250000ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Use pyjpegls to compress *Pixel Data*. This module is not intended to be used directly. """ from typing import cast from pydicom import uid from pydicom.pixels.encoders.base import EncodeRunner from pydicom.pixels.utils import _passes_version_check try: import jpeg_ls except ImportError: pass ENCODER_DEPENDENCIES = { uid.JPEGLSLossless: ("numpy", "pyjpegls>=1.3"), uid.JPEGLSNearLossless: ("numpy", "pyjpegls>=1.3"), } def is_available(uid: str) -> bool: """Return ``True`` if the decoder has its dependencies met, ``False`` otherwise""" return _passes_version_check("jpeg_ls", (1, 3)) def _encode_frame(src: bytes, runner: EncodeRunner) -> bytearray: """Return the image data in `src` as a JPEG-LS encoded codestream.""" lossy_error = runner.get_option("jls_error", 0) if lossy_error and runner.transfer_syntax == uid.JPEGLSLossless: raise ValueError( f"A 'jls_error' value of '{lossy_error}' is being used with a " "transfer syntax of 'JPEG-LS Lossless' - did you mean to use " "'JPEG-LS Near Lossless' instead?" ) opts = { "rows": runner.rows, "columns": runner.columns, "samples_per_pixel": runner.samples_per_pixel, "bits_stored": runner.bits_stored, } if runner.samples_per_pixel > 1: opts["planar_configuration"] = runner.planar_configuration return cast( bytearray, jpeg_ls.encode_pixel_data(src, lossy_error=lossy_error, **opts) ) pydicom-pydicom-20aa4b7/src/pydicom/pixels/encoders/pylibjpeg.py000066400000000000000000000052331515706620200251310ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Interface for *Pixel Data* encoding, not intended to be used directly.""" from typing import cast from pydicom.pixels.encoders.base import EncodeRunner from pydicom.pixels.common import PhotometricInterpretation as PI from pydicom.pixels.utils import _passes_version_check from pydicom import uid try: from pylibjpeg.utils import get_pixel_data_encoders, Encoder _ENCODERS = get_pixel_data_encoders() except ImportError: _ENCODERS = {} ENCODER_DEPENDENCIES = { uid.JPEG2000Lossless: ("numpy", "pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.2"), uid.JPEG2000: ("numpy", "pylibjpeg>=2.0", "pylibjpeg-openjpeg>=2.2"), uid.RLELossless: ("numpy", "pylibjpeg>=2.0", "pylibjpeg-rle>=2.0"), } _OPENJPEG_SYNTAXES = [uid.JPEG2000Lossless, uid.JPEG2000] _RLE_SYNTAXES = [uid.RLELossless] def is_available(uid: str) -> bool: """Return ``True`` if a pixel data encoder for `uid` is available for use, ``False`` otherwise. """ if not _passes_version_check("pylibjpeg", (2, 0)): return False if uid in _OPENJPEG_SYNTAXES: return _passes_version_check("openjpeg", (2, 2)) if uid in _RLE_SYNTAXES: return _passes_version_check("rle", (2, 0)) return False def _encode_frame(src: bytes, runner: EncodeRunner) -> bytes | bytearray: """Return `src` as an encoded codestream.""" encoder = cast(Encoder, _ENCODERS[runner.transfer_syntax]) tsyntax = runner.transfer_syntax if tsyntax == uid.RLELossless: return cast(bytes, encoder(src, **runner.options)) opts = dict(runner.options) if runner.photometric_interpretation == PI.RGB: opts["use_mct"] = False cr = opts.pop("compression_ratios", opts.get("j2k_cr", None)) psnr = opts.pop("signal_noise_ratios", opts.get("j2k_psnr", None)) if tsyntax == uid.JPEG2000Lossless: if cr or psnr: raise ValueError( "A lossy configuration option is being used with a transfer " "syntax of 'JPEG 2000 Lossless' - did you mean to use 'JPEG " "2000' instead?" ) return cast(bytes, encoder(src, **opts)) if not cr and not psnr: raise ValueError( "The 'JPEG 2000' transfer syntax requires a lossy configuration " "option such as 'j2k_cr' or 'j2k_psnr'" ) if cr and psnr: raise ValueError( "Multiple lossy configuration options are being used with the " "'JPEG 2000' transfer syntax, please specify only one" ) cs = encoder(src, **opts, compression_ratios=cr, signal_noise_ratios=psnr) return cast(bytes, cs) pydicom-pydicom-20aa4b7/src/pydicom/pixels/processing.py000066400000000000000000001224651515706620200235250ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Pixel data processing functions.""" from io import BytesIO from struct import unpack, unpack_from from typing import TYPE_CHECKING, cast try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: import PIL from PIL import ImageCms HAVE_PIL = True except ImportError: HAVE_PIL = False from pydicom.data import get_palette_files from pydicom.misc import warn_and_log from pydicom.uid import UID from pydicom.valuerep import VR if TYPE_CHECKING: # pragma: no cover from collections.abc import Iterable from pydicom.dataset import Dataset _CMS_COLOR_SPACES = {"SRGB": "sRGB", "XYZ": "XYZ", "LAB": "LAB"} _CMS_INTENTS = { 0: "procedural", 1: "relative colorimetric", 2: "saturation", 3: "absolute colorimetric", } def apply_color_lut( arr: "np.ndarray", ds: "Dataset | None" = None, palette: str | UID | None = None ) -> "np.ndarray": """Apply a color palette lookup table to `arr`. If (0028,1201-1203) *Palette Color Lookup Table Data* are missing then (0028,1221-1223) *Segmented Palette Color Lookup Table Data* must be present and vice versa. The presence of (0028,1204) *Alpha Palette Color Lookup Table Data* or (0028,1224) *Alpha Segmented Palette Color Lookup Table Data* is optional. Use of this function with the :dcm:`Enhanced Palette Color Lookup Table Module` or :dcm:`Supplemental Palette Color LUT Module` is not currently supported. Parameters ---------- arr : numpy.ndarray The pixel data to apply the color palette to. ds : dataset.Dataset, optional Required if `palette` is not supplied. A :class:`~pydicom.dataset.Dataset` containing a suitable :dcm:`Image Pixel` or :dcm:`Palette Color Lookup Table` Module. palette : str or uid.UID, optional Required if `ds` is not supplied. The name of one of the :dcm:`well-known` color palettes defined by the DICOM Standard. One of: ``'HOT_IRON'``, ``'PET'``, ``'HOT_METAL_BLUE'``, ``'PET_20_STEP'``, ``'SPRING'``, ``'SUMMER'``, ``'FALL'``, ``'WINTER'`` or the corresponding well-known (0008,0018) *SOP Instance UID*. Returns ------- numpy.ndarray The RGB or RGBA pixel data as an array of ``np.uint8`` or ``np.uint16`` values, depending on the 3rd value of (0028,1201) *Red Palette Color Lookup Table Descriptor*. References ---------- * :dcm:`Image Pixel Module` * :dcm:`Supplemental Palette Color LUT Module` * :dcm:`Enhanced Palette Color LUT Module` * :dcm:`Palette Colour LUT Module` * :dcm:`Supplemental Palette Color LUTs ` """ # Note: input value (IV) is the stored pixel value in `arr` # LUTs[IV] -> [R, G, B] values at the IV pixel location in `arr` if not ds and not palette: raise ValueError("Either 'ds' or 'palette' is required") if palette: # Well-known palettes are all 8-bits per entry datasets = { "1.2.840.10008.1.5.1": "hotiron.dcm", "1.2.840.10008.1.5.2": "pet.dcm", "1.2.840.10008.1.5.3": "hotmetalblue.dcm", "1.2.840.10008.1.5.4": "pet20step.dcm", "1.2.840.10008.1.5.5": "spring.dcm", "1.2.840.10008.1.5.6": "summer.dcm", "1.2.840.10008.1.5.7": "fall.dcm", "1.2.840.10008.1.5.8": "winter.dcm", } if not UID(palette).is_valid: try: uids = { "HOT_IRON": "1.2.840.10008.1.5.1", "PET": "1.2.840.10008.1.5.2", "HOT_METAL_BLUE": "1.2.840.10008.1.5.3", "PET_20_STEP": "1.2.840.10008.1.5.4", "SPRING": "1.2.840.10008.1.5.5", "SUMMER": "1.2.840.10008.1.5.6", "FALL": "1.2.840.10008.1.5.8", "WINTER": "1.2.840.10008.1.5.7", } palette = uids[palette] except KeyError: raise ValueError(f"Unknown palette '{palette}'") try: from pydicom import dcmread fname = datasets[palette] ds = dcmread(get_palette_files(fname)[0]) except KeyError: raise ValueError(f"Unknown palette '{palette}'") ds = cast("Dataset", ds) # C.8.16.2.1.1.1: Supplemental Palette Color LUT # TODO: Requires greyscale visualisation pipeline if getattr(ds, "PixelPresentation", None) in ["MIXED", "COLOR"]: raise ValueError( "Use of this function with the Supplemental Palette Color Lookup " "Table Module is not currently supported" ) if "RedPaletteColorLookupTableDescriptor" not in ds: raise ValueError("No suitable Palette Color Lookup Table Module found") # All channels are supposed to be identical lut_desc = cast(list[int], ds.RedPaletteColorLookupTableDescriptor) # A value of 0 = 2^16 entries nr_entries = lut_desc[0] or 2**16 # May be negative if Pixel Representation is 1 first_map = lut_desc[1] # Actual bit depth may be larger (8 bit entries in 16 bits allocated) nominal_depth = lut_desc[2] dtype = np.dtype(f"uint{nominal_depth:.0f}") luts: list[bytes] = [] if "RedPaletteColorLookupTableData" in ds: # LUT Data is described by PS3.3, C.7.6.3.1.6 r_lut = cast(bytes, ds.RedPaletteColorLookupTableData) g_lut = cast(bytes, ds.GreenPaletteColorLookupTableData) b_lut = cast(bytes, ds.BluePaletteColorLookupTableData) a_lut = cast( bytes | None, getattr(ds, "AlphaPaletteColorLookupTableData", None) ) actual_depth = len(r_lut) / nr_entries * 8 dtype = np.dtype(f"uint{actual_depth:.0f}") luts.extend( np.frombuffer(lut_bytes, dtype=dtype) for lut_bytes in (r_lut, g_lut, b_lut, a_lut) if lut_bytes ) elif "SegmentedRedPaletteColorLookupTableData" in ds: # Segmented LUT Data is described by PS3.3, C.7.9.2 r_lut = cast(bytes, ds.SegmentedRedPaletteColorLookupTableData) g_lut = cast(bytes, ds.SegmentedGreenPaletteColorLookupTableData) b_lut = cast(bytes, ds.SegmentedBluePaletteColorLookupTableData) a_lut = cast( bytes | None, getattr(ds, "SegmentedAlphaPaletteColorLookupTableData", None) ) if hasattr(ds, "file_meta"): is_little_endian = ds.file_meta._tsyntax_encoding[1] else: is_little_endian = ds.original_encoding[1] if is_little_endian is None: raise AttributeError( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in " f"'{type(ds).__name__}.file_meta'" ) endianness = "><"[is_little_endian] byte_depth = nominal_depth // 8 fmt = "B" if byte_depth == 1 else "H" actual_depth = nominal_depth for seg in (r_lut, g_lut, b_lut, a_lut): if seg: len_seg = len(seg) // byte_depth s_fmt = f"{endianness}{len_seg}{fmt}" lut_ints = _expand_segmented_lut(unpack(s_fmt, seg), s_fmt) luts.append(np.asarray(lut_ints, dtype=dtype)) else: raise ValueError("No suitable Palette Color Lookup Table Module found") if actual_depth not in [8, 16]: raise ValueError( f"The bit depth of the LUT data '{actual_depth:.1f}' " "is invalid (only 8 or 16 bits per entry allowed)" ) lut_lengths = [len(ii) for ii in luts] if not all(ii == lut_lengths[0] for ii in lut_lengths[1:]): raise ValueError("LUT data must be the same length") # IVs < `first_map` get set to first LUT entry (i.e. index 0) clipped_iv = np.zeros(arr.shape, dtype=dtype) # IVs >= `first_map` are mapped by the Palette Color LUTs # `first_map` may be negative, positive or 0 mapped_pixels = arr >= first_map clipped_iv[mapped_pixels] = arr[mapped_pixels] - np.int32(first_map) # IVs > number of entries get set to last entry np.clip(clipped_iv, 0, nr_entries - 1, out=clipped_iv) # Output array may be RGB or RGBA out = np.empty(list(arr.shape) + [len(luts)], dtype=dtype) for ii, lut in enumerate(luts): out[..., ii] = lut[clipped_iv] return out def apply_icc_profile( arr: "np.ndarray", ds: "Dataset | None" = None, transform: "PIL.ImageCms.ImageCmsTransform | None" = None, intent: int | None = None, color_space: str | None = None, ) -> "np.ndarray": """Apply an `ICC Profile `_ to `arr`, either from the dataset `ds` or an existing Pillow color transformation object `transform`. .. versionadded:: 3.0 .. warning:: This function requires `NumPy `_ and `Pillow `_. Parameters ---------- arr : numpy.ndarray 8-bit RGB pixel data to apply an ICC profile to, shaped as either (rows, columns, samples) or (frames, rows, columns, samples). ds : pydicom.dataset.Dataset, optional Required if `transform` is not supplied, a :class:`~pydicom.dataset.Dataset` containing elements from the :dcm:`ICC Profile` module. transform : PIL.ImageCms.ImageCmsTransform, optional An :class:`~PIL.ImageCms.ImageCmsTransform` instance such as is returned by the :func:`create_icc_transform` function. Required if `ds` is not used and recommended when the same ICC profile is to be re-used on multiple ndarrays. intent : int, optional If `transform` is not supplied this is the rendering intent of the transformation that will be created from `ds`, one of: * ``0``: perceptual * ``1``: relative colorimetric * ``2``: saturation * ``3``: absolute colorimetric If no `intent` is specified then the default rendering intent in the ICC profile will be used. color_space : str, optional If `transform` is not supplied this is the output color space to use for the transformation created from `ds`. If not used then defaults to the (0028,2002) *Color Space* value if its present in `ds`, otherwise defaults to ``"sRGB"``. If used then it will override the (0028,2002) *Color Space* element value (if present). Must be one of the :func:`supported Pillow color spaces `, although in practice only ``"sRGB"`` is likely to be used. Returns ------- np.ndarray The input ndarray with the color transformation applied in-place. """ if not HAVE_PIL: raise ImportError("Pillow is required to apply an ICC profile to an ndarray") # One of 'ds' or 'transform', but not both if ds is None and not transform: raise ValueError("Either 'ds' or 'transform' must be supplied") if ds is not None and transform: raise ValueError("Only one of 'ds' and 'transform' should be used, not both") if arr.ndim not in (3, 4): raise ValueError(f"The ndarray must have 3 or 4 dimensions, not {arr.ndim}") if arr.shape[-1] != 3: raise ValueError( "Invalid ndarray shape, must be (rows, columns, 3) or (frames, rows, " f"columns, 3), not {arr.shape}" ) if not transform: transform = create_icc_transform( ds=ds, intent=intent, color_space=color_space, ) if arr.ndim == 4: for idx, frame in enumerate(arr): im = PIL.Image.fromarray(frame) # type: ignore[no-untyped-call] ImageCms.applyTransform(im, transform, inPlace=True) arr[idx] = np.array(im) return arr im = PIL.Image.fromarray(arr) # type: ignore[no-untyped-call] ImageCms.applyTransform(im, transform, inPlace=True) arr[...] = np.array(im) return arr def apply_modality_lut(arr: "np.ndarray", ds: "Dataset") -> "np.ndarray": """Apply a modality lookup table or rescale operation to `arr`. Parameters ---------- arr : numpy.ndarray The :class:`~numpy.ndarray` to apply the modality LUT or rescale operation to. ds : dataset.Dataset A dataset containing a :dcm:`Modality LUT Module `. Returns ------- numpy.ndarray An array with applied modality LUT or rescale operation. If (0028,3000) *Modality LUT Sequence* is present then returns an array of ``np.uint8`` or ``np.uint16``, depending on the 3rd value of (0028,3002) *LUT Descriptor*. If (0028,1052) *Rescale Intercept* and (0028,1053) *Rescale Slope* are present then returns an array of ``np.float64``. If neither are present then `arr` will be returned unchanged. Notes ----- When *Rescale Slope* and *Rescale Intercept* are used, the output range is from (min. pixel value * Rescale Slope + Rescale Intercept) to (max. pixel value * Rescale Slope + Rescale Intercept), where min. and max. pixel value are determined from (0028,0101) *Bits Stored* and (0028,0103) *Pixel Representation*. References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.11.1 ` * DICOM Standard, Part 4, :dcm:`Annex N.2.1.1 ` """ if ds.get("ModalityLUTSequence"): item = cast(list["Dataset"], ds.ModalityLUTSequence)[0] nr_entries = cast(list[int], item.LUTDescriptor)[0] or 2**16 first_map = cast(list[int], item.LUTDescriptor)[1] nominal_depth = cast(list[int], item.LUTDescriptor)[2] dtype = f"uint{nominal_depth}" # Ambiguous VR, US or OW unc_data: Iterable[int] if item["LUTData"].VR == VR.OW: if hasattr(ds, "file_meta"): is_little_endian = ds.file_meta._tsyntax_encoding[1] else: is_little_endian = ds.original_encoding[1] if is_little_endian is None: raise AttributeError( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in " f"'{type(ds).__name__}.file_meta'" ) endianness = "><"[is_little_endian] unpack_fmt = f"{endianness}{nr_entries}H" unc_data = unpack(unpack_fmt, cast(bytes, item.LUTData)) else: unc_data = cast(list[int], item.LUTData) lut_data: np.ndarray = np.asarray(unc_data, dtype=dtype) # IVs < `first_map` get set to first LUT entry (i.e. index 0) clipped_iv = np.zeros(arr.shape, dtype=arr.dtype) # IVs >= `first_map` are mapped by the Modality LUT # `first_map` may be negative, positive or 0 mapped_pixels = arr >= first_map clipped_iv[mapped_pixels] = arr[mapped_pixels] - first_map # IVs > number of entries get set to last entry np.clip(clipped_iv, 0, nr_entries - 1, out=clipped_iv) return lut_data[clipped_iv] elif "RescaleSlope" in ds and "RescaleIntercept" in ds: arr = arr.astype(np.float64) * cast(float, ds.RescaleSlope) arr += cast(float, ds.RescaleIntercept) return arr def apply_presentation_lut(arr: "np.ndarray", ds: "Dataset") -> "np.ndarray": """Apply a Presentation LUT to `arr` and return the P-values. Parameters ---------- arr : numpy.ndarray The :class:`~numpy.ndarray` to apply the presentation LUT operation to. ds : dataset.Dataset A dataset containing :dcm:`Presentation LUT Module ` elements. Returns ------- numpy.ndarray If a Presentation LUT Module is present in `ds` then returns an array of P-values, otherwise returns `arr` unchanged. Notes ----- If the dataset the *Pixel Data* originated from contains a Modality LUT and/or VOI LUT then they must be applied before the Presentation LUT. See Also -------- :func:`~pydicom.pixels.processing.apply_modality_lut` :func:`~pydicom.pixels.processing.apply_voi_lut` """ if "PresentationLUTSequence" in ds: item = ds.PresentationLUTSequence[0] # nr_entries is the number of entries in the LUT # first_map is the first input value mapped and shall always be 0 # bit_depth is number of bits for each entry, up to 16 nr_entries, first_map, bit_depth = item.LUTDescriptor nr_entries = 2**16 if nr_entries == 0 else nr_entries itemsize = 8 if bit_depth <= 8 else 16 nr_bytes = nr_entries * (itemsize // 8) # P-values to be mapped to the input, always unsigned # LUTData is (US or OW) elem = item["LUTData"] if elem.VR == VR.US: lut = np.asarray(elem.value, dtype="u2") else: lut = np.frombuffer(item.LUTData[:nr_bytes], dtype=f"uint{itemsize}") # Set any unused bits to an appropriate value if bit_shift := itemsize - bit_depth: if not lut.flags.writeable: lut = lut.copy() np.left_shift(lut, bit_shift, out=lut) np.right_shift(lut, bit_shift, out=lut) # Linearly scale `arr` to quantize it to `nr_entries` values arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() / (nr_entries - 1) arr = arr.astype("uint16") return cast("np.ndarray", lut[arr]) if "PresentationLUTShape" in ds: transform = ds.PresentationLUTShape.strip().upper() if transform not in ("IDENTITY", "INVERSE"): raise NotImplementedError( "A (2050,0020) 'Presentation LUT Shape' value of " f"'{ds.PresentationLUTShape}' is not supported" ) if transform == "INVERSE": arr = arr.max() - arr return arr apply_rescale = apply_modality_lut def apply_voi_lut( arr: "np.ndarray", ds: "Dataset", index: int = 0, prefer_lut: bool = True ) -> "np.ndarray": """Apply a VOI lookup table or windowing operation to `arr`. .. versionchanged:: 2.1 Added the `prefer_lut` keyword parameter Parameters ---------- arr : numpy.ndarray The :class:`~numpy.ndarray` to apply the VOI LUT or windowing operation to. ds : dataset.Dataset A dataset containing a :dcm:`VOI LUT Module`. If (0028,3010) *VOI LUT Sequence* is present then returns an array of ``np.uint8`` or ``np.uint16``, depending on the 3rd value of (0028,3002) *LUT Descriptor*. If (0028,1050) *Window Center* and (0028,1051) *Window Width* are present then returns an array of ``np.float64``. If neither are present then `arr` will be returned unchanged. index : int, optional When the VOI LUT Module contains multiple alternative views, this is the index of the view to return (default ``0``). prefer_lut : bool When the VOI LUT Module contains both *Window Width*/*Window Center* and *VOI LUT Sequence*, if ``True`` (default) then apply the VOI LUT, otherwise apply the windowing operation. Returns ------- numpy.ndarray An array with applied VOI LUT or windowing operation. Notes ----- When the dataset requires a modality LUT or rescale operation as part of the Modality LUT module then that must be applied before any windowing operation. See Also -------- :func:`~pydicom.pixels.processing.apply_modality_lut` :func:`~pydicom.pixels.processing.apply_voi` :func:`~pydicom.pixels.processing.apply_windowing` References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.11.2 ` * DICOM Standard, Part 3, :dcm:`Annex C.8.11.3.1.5 ` * DICOM Standard, Part 4, :dcm:`Annex N.2.1.1 ` """ valid_voi = False if ds.get("VOILUTSequence"): ds.VOILUTSequence = cast(list["Dataset"], ds.VOILUTSequence) valid_voi = None not in [ ds.VOILUTSequence[0].get("LUTDescriptor", None), ds.VOILUTSequence[0].get("LUTData", None), ] valid_windowing = None not in [ ds.get("WindowCenter", None), ds.get("WindowWidth", None), ] if valid_voi and valid_windowing: if prefer_lut: return apply_voi(arr, ds, index) return apply_windowing(arr, ds, index) if valid_voi: return apply_voi(arr, ds, index) if valid_windowing: return apply_windowing(arr, ds, index) return arr def apply_voi(arr: "np.ndarray", ds: "Dataset", index: int = 0) -> "np.ndarray": """Apply a VOI lookup table to `arr`. .. versionadded:: 2.1 See :func:`~pydicom.pixels.processing.apply_voi_lut` for applying *Window Width*/*Window Center* as a fallback if no *VOI LUT Sequence* is present. Parameters ---------- arr : numpy.ndarray The :class:`~numpy.ndarray` to apply the VOI LUT to. ds : dataset.Dataset A dataset containing a :dcm:`VOI LUT Module`. If (0028,3010) *VOI LUT Sequence* is present then returns an array of ``np.uint8`` or ``np.uint16``, depending on the 3rd value of (0028,3002) *LUT Descriptor*, otherwise `arr` will be returned unchanged. index : int, optional When the VOI LUT Module contains multiple alternative views, this is the index of the view to return (default ``0``). Returns ------- numpy.ndarray An array with applied VOI LUT. See Also -------- :func:`~pydicom.pixels.processing.apply_modality_lut` :func:`~pydicom.pixels.processing.apply_windowing` :func:`~pydicom.pixels.processing.apply_voi_lut` References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.11.2 ` * DICOM Standard, Part 3, :dcm:`Annex C.8.11.3.1.5 ` * DICOM Standard, Part 4, :dcm:`Annex N.2.1.1 ` """ if not ds.get("VOILUTSequence"): return arr if not np.issubdtype(arr.dtype, np.integer): warn_and_log( "Applying a VOI LUT on a float input array may give incorrect results" ) # VOI LUT Sequence contains one or more items item = cast(list["Dataset"], ds.VOILUTSequence)[index] lut_descriptor = cast(list[int], item.LUTDescriptor) nr_entries = lut_descriptor[0] or 2**16 first_map = lut_descriptor[1] # PS3.3 C.8.11.3.1.5: may be 8, 10-16 nominal_depth = lut_descriptor[2] if nominal_depth in list(range(10, 17)): dtype = "uint16" elif nominal_depth == 8: dtype = "uint8" else: raise NotImplementedError( f"'{nominal_depth}' bits per LUT entry is not supported" ) # Ambiguous VR, US or OW unc_data: Iterable[int] if item["LUTData"].VR == VR.OW: if hasattr(ds, "file_meta"): is_little_endian = ds.file_meta._tsyntax_encoding[1] else: is_little_endian = ds.original_encoding[1] if is_little_endian is None: raise AttributeError( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in " f"'{type(ds).__name__}.file_meta'" ) unpack_fmt = f"{'><'[is_little_endian]}{nr_entries}H" unc_data = unpack_from(unpack_fmt, cast(bytes, item.LUTData)) else: unc_data = cast(list[int], item.LUTData) lut_data: np.ndarray = np.asarray(unc_data, dtype=dtype) # IVs < `first_map` get set to first LUT entry (i.e. index 0) clipped_iv = np.zeros(arr.shape, dtype=dtype) # IVs >= `first_map` are mapped by the VOI LUT # `first_map` may be negative, positive or 0 mapped_pixels = arr >= first_map clipped_iv[mapped_pixels] = arr[mapped_pixels] - first_map # IVs > number of entries get set to last entry np.clip(clipped_iv, 0, nr_entries - 1, out=clipped_iv) return cast("np.ndarray", lut_data[clipped_iv]) def apply_windowing(arr: "np.ndarray", ds: "Dataset", index: int = 0) -> "np.ndarray": """Apply a windowing operation to `arr`. .. versionadded:: 2.1 Parameters ---------- arr : numpy.ndarray The :class:`~numpy.ndarray` to apply the windowing operation to. ds : dataset.Dataset A dataset containing a :dcm:`VOI LUT Module`. If (0028,1050) *Window Center* and (0028,1051) *Window Width* are present then returns an array of ``np.float64``, otherwise `arr` will be returned unchanged. index : int, optional When the VOI LUT Module contains multiple alternative views, this is the index of the view to return (default ``0``). Returns ------- numpy.ndarray An array with applied windowing operation. Notes ----- When the dataset requires a modality LUT or rescale operation as part of the Modality LUT module then that must be applied before any windowing operation. See Also -------- :func:`~pydicom.pixels.processing.apply_modality_lut` :func:`~pydicom.pixels.processing.apply_voi` :func:`~pydicom.pixels.processing.apply_voi_lut` References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.11.2 ` * DICOM Standard, Part 3, :dcm:`Annex C.8.11.3.1.5 ` * DICOM Standard, Part 4, :dcm:`Annex N.2.1.1 ` """ if "WindowWidth" not in ds and "WindowCenter" not in ds: return arr if ds.PhotometricInterpretation not in ["MONOCHROME1", "MONOCHROME2"]: raise ValueError( "When performing a windowing operation only 'MONOCHROME1' and " "'MONOCHROME2' are allowed for (0028,0004) Photometric " "Interpretation" ) # May be LINEAR (default), LINEAR_EXACT, SIGMOID or not present, VM 1 voi_func = cast(str, getattr(ds, "VOILUTFunction", "LINEAR")).upper() # VR DS, VM 1-n elem = ds["WindowCenter"] center = cast(list[float], elem.value)[index] if elem.VM > 1 else elem.value center = cast(float, center) elem = ds["WindowWidth"] width = cast(list[float], elem.value)[index] if elem.VM > 1 else elem.value width = cast(float, width) # The output range depends on whether or not a modality LUT or rescale # operation has been applied ds.BitsStored = cast(int, ds.BitsStored) y_min: float y_max: float if ds.get("ModalityLUTSequence"): # Unsigned - see PS3.3 C.11.1.1.1 y_min = 0 item = cast(list["Dataset"], ds.ModalityLUTSequence)[0] bit_depth = cast(list[int], item.LUTDescriptor)[2] y_max = 2**bit_depth - 1 elif ds.PixelRepresentation == 0: # Unsigned y_min = 0 y_max = 2**ds.BitsStored - 1 else: # Signed y_min = -(2 ** (ds.BitsStored - 1)) y_max = 2 ** (ds.BitsStored - 1) - 1 slope = ds.get("RescaleSlope", None) intercept = ds.get("RescaleIntercept", None) if slope is not None and intercept is not None: ds.RescaleSlope = cast(float, ds.RescaleSlope) ds.RescaleIntercept = cast(float, ds.RescaleIntercept) # Otherwise its the actual data range y_min = y_min * ds.RescaleSlope + ds.RescaleIntercept y_max = y_max * ds.RescaleSlope + ds.RescaleIntercept y_range = y_max - y_min arr = arr.astype("float64") if voi_func in ["LINEAR", "LINEAR_EXACT"]: # PS3.3 C.11.2.1.2.1 and C.11.2.1.3.2 if voi_func == "LINEAR": if width < 1: raise ValueError( "The (0028,1051) Window Width must be greater than or " "equal to 1 for a 'LINEAR' windowing operation" ) center -= 0.5 width -= 1 elif width <= 0: raise ValueError( "The (0028,1051) Window Width must be greater than 0 " "for a 'LINEAR_EXACT' windowing operation" ) below = arr <= (center - width / 2) above = arr > (center + width / 2) between = np.logical_and(~below, ~above) arr[below] = y_min arr[above] = y_max if between.any(): arr[between] = ((arr[between] - center) / width + 0.5) * y_range + y_min elif voi_func == "SIGMOID": # PS3.3 C.11.2.1.3.1 if width <= 0: raise ValueError( "The (0028,1051) Window Width must be greater than 0 " "for a 'SIGMOID' windowing operation" ) arr = y_range / (1 + np.exp(-4 * (arr - center) / width)) + y_min else: raise ValueError(f"Unsupported (0028,1056) VOI LUT Function value '{voi_func}'") return arr def convert_color_space( arr: "np.ndarray", current: str, desired: str, per_frame: bool = False ) -> "np.ndarray": """Convert the image(s) in `arr` from one color space to another. .. versionchanged:: 2.2 Added `per_frame` keyword parameter. Parameters ---------- arr : numpy.ndarray The image(s) as :class:`numpy.ndarray` with :attr:`~numpy.ndarray.shape` (frames, rows, columns, 3) or (rows, columns, 3) and a 'uint8' :class:`~numpy.dtype` (unsigned 8-bit). current : str The current color space, should be a valid value for (0028,0004) *Photometric Interpretation*. One of ``'RGB'``, ``'YBR_FULL'``, ``'YBR_FULL_422'``. desired : str The desired color space, should be a valid value for (0028,0004) *Photometric Interpretation*. One of ``'RGB'``, ``'YBR_FULL'``, ``'YBR_FULL_422'``. per_frame : bool, optional If ``True`` and the input array contains multiple frames then process each frame individually and update `arr` in-place to reduce memory usage. Default ``False``. Returns ------- numpy.ndarray The image(s) converted to the desired color space. If `per_frame` is ``False`` (the default) then a new :class:`~numpy.ndarray` will be returned, otherwise `arr` will be updated in-place. References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.7.6.3.1.2` * ISO/IEC 10918-5:2012 (`ITU T.871 `_), Section 7 """ if arr.dtype != np.dtype("u1"): raise ValueError( f"Invalid ndarray.dtype '{arr.dtype}' for color space conversion, " "must be 'uint8' or an equivalent" ) def _no_change(arr: "np.ndarray") -> "np.ndarray": return arr _converters = { "YBR_FULL_422": { "YBR_FULL_422": _no_change, "YBR_FULL": _no_change, "RGB": _convert_YBR_FULL_to_RGB, }, "YBR_FULL": { "YBR_FULL": _no_change, "YBR_FULL_422": _no_change, "RGB": _convert_YBR_FULL_to_RGB, }, "RGB": { "RGB": _no_change, "YBR_FULL": _convert_RGB_to_YBR_FULL, "YBR_FULL_422": _convert_RGB_to_YBR_FULL, }, } try: converter = _converters[current][desired] except KeyError: raise NotImplementedError( f"Conversion from {current} to {desired} is not supported." ) if len(arr.shape) == 4 and per_frame: for idx, frame in enumerate(arr): arr[idx] = converter(frame) return arr return converter(arr) def _convert_RGB_to_YBR_FULL(arr: "np.ndarray") -> "np.ndarray": """Return an ndarray converted from RGB to YBR_FULL color space. Parameters ---------- arr : numpy.ndarray An ndarray of an 8-bit per channel images in RGB color space. Returns ------- numpy.ndarray The array in YBR_FULL color space. References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.7.6.3.1.2` * ISO/IEC 10918-5:2012 (`ITU T.871 `_), Section 7 """ orig_dtype = arr.dtype rgb_to_ybr = np.asarray( [ [+0.299, -0.299 / 1.772, +0.701 / 1.402], [+0.587, -0.587 / 1.772, -0.587 / 1.402], [+0.114, +0.886 / 1.772, -0.114 / 1.402], ], dtype=np.float32, ) arr = np.matmul(arr, rgb_to_ybr, dtype=np.float32) arr += [0.5, 128.5, 128.5] # Round(x) -> floor of (arr + 0.5) : 0.5 added in previous step np.floor(arr, out=arr) # Max(0, arr) -> 0 if 0 >= arr, arr otherwise # Min(arr, 255) -> arr if arr <= 255, 255 otherwise np.clip(arr, 0, 255, out=arr) return arr.astype(orig_dtype) def _convert_YBR_FULL_to_RGB(arr: "np.ndarray") -> "np.ndarray": """Return an ndarray converted from YBR_FULL to RGB color space. Parameters ---------- arr : numpy.ndarray An ndarray of an 8-bit per channel images in YBR_FULL color space. Returns ------- numpy.ndarray The array in RGB color space. References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.7.6.3.1.2` * ISO/IEC 10918-5:2012, Section 7 """ orig_dtype = arr.dtype ybr_to_rgb = np.asarray( [ [1.000, 1.000, 1.000], [0.000, -0.114 * 1.772 / 0.587, 1.772], [1.402, -0.299 * 1.402 / 0.587, 0.000], ], dtype=np.float32, ) arr = arr.astype(np.float32) arr -= [0, 128, 128] # Round(x) -> floor of (arr + 0.5) np.matmul(arr, ybr_to_rgb, out=arr) arr += 0.5 np.floor(arr, out=arr) # Max(0, arr) -> 0 if 0 >= arr, arr otherwise # Min(arr, 255) -> arr if arr <= 255, 255 otherwise np.clip(arr, 0, 255, out=arr) return arr.astype(orig_dtype) def create_icc_transform( ds: "Dataset | None" = None, icc_profile: bytes = b"", intent: int | None = None, color_space: str | None = None, ) -> "PIL.ImageCms.ImageCmsTransform": """Return a Pillow color transformation object from either the dataset `ds` or an ICC profile `icc_profile`. .. versionadded:: 3.0 .. warning:: This function requires `NumPy `_ and `Pillow `_. Parameters ---------- ds : pydicom.dataset.Dataset, optional Required if `icc_profile` is not supplied, a :class:`~pydicom.dataset.Dataset` containing elements from the :dcm:`ICC Profile` module. icc_profile : bytes, optional Required if `ds` is not supplied, an ICC profile encoded as :class:`bytes`. intent : int, optional The rendering intent of the transformation, one of: * ``0``: perceptual * ``1``: relative colorimetric * ``2``: saturation * ``3``: absolute colorimetric If no `intent` is specified then the default rendering intent in the ICC profile will be used. color_space : str, optional The output color space to use for the transformation created from `ds`. If not used then defaults to the (0028,2002) *Color Space* value if its present in `ds`, otherwise defaults to ``"sRGB"``. If used then it will override the (0028,2002) *Color Space* element value (if present). Must be one of the :func:`supported Pillow color spaces`, although in practice only ``"sRGB"`` is likely to be used. Returns ------- PIL.ImageCms.ImageCmsTransform A color transformation object that can be used with :func:`apply_icc_profile`. """ if not HAVE_PIL: raise ImportError("Pillow is required to create a color transformation object") if ds is None and not icc_profile: raise ValueError("Either 'ds' or 'icc_profile' must be supplied") if ds and icc_profile: raise ValueError("Only one of 'ds' and 'icc_profile' should be used, not both") icc_profile = getattr(ds, "ICCProfile", icc_profile) if not icc_profile: raise ValueError("No (0028,2000) 'ICC Profile' element was found in 'ds'") # If ColorSpace is in `ds` try and use that, but allow override via `color_space` cs = color_space if color_space else getattr(ds, "ColorSpace", "sRGB") if cs and cs.upper() not in _CMS_COLOR_SPACES: if not color_space: msg = ( f"The (0028,2002) 'Color Space' value '{cs}' is not supported by " "Pillow, please use the 'color_space' argument to specify a " "supported value" ) else: msg = ( f"Unsupported 'color_space' value '{cs}', must be 'sRGB', 'LAB' or " "'XYZ'" ) raise ValueError(msg) # Conform the supplied color space to the value required by Pillow cs = _CMS_COLOR_SPACES[cs.upper()] profile = ImageCms.ImageCmsProfile(BytesIO(icc_profile)) intent = intent if intent else ImageCms.getDefaultIntent(profile) if intent not in _CMS_INTENTS: raise ValueError(f"Invalid 'intent' value '{intent}', must be 0, 1, 2 or 3") return ImageCms.buildTransform( outputProfile=ImageCms.createProfile(cs), # type: ignore[arg-type] inputProfile=profile, inMode="RGB", outMode="RGB", renderingIntent=ImageCms.Intent(intent), ) def _expand_segmented_lut( data: tuple[int, ...], fmt: str, nr_segments: int | None = None, last_value: int | None = None, ) -> list[int]: """Return a list containing the expanded lookup table data. Parameters ---------- data : tuple of int The decoded segmented palette lookup table data. May be padded by a trailing null. fmt : str The format of the data, should contain `'B'` for 8-bit, `'H'` for 16-bit, `'<'` for little endian and `'>'` for big endian. nr_segments : int, optional Expand at most `nr_segments` from the data. Should be used when the opcode is ``2`` (indirect). If used then `last_value` should also be used. last_value : int, optional The previous value in the expanded lookup table. Should be used when the opcode is ``2`` (indirect). If used then `nr_segments` should also be used. Returns ------- list of int The reconstructed lookup table data. References ---------- * DICOM Standard, Part 3, Annex C.7.9 """ # Indirect segment byte offset is dependent on endianness for 8-bit # Little endian: e.g. 0x0302 0x0100, big endian, e.g. 0x0203 0x0001 indirect_ii = [3, 2, 1, 0] if "<" in fmt else [2, 3, 0, 1] lut: list[int] = [] offset = 0 segments_read = 0 # Use `offset + 1` to account for possible trailing null # can do this because all segment types are longer than 2 while offset + 1 < len(data): opcode = data[offset] length = data[offset + 1] offset += 2 if opcode == 0: # C.7.9.2.1: Discrete segment lut.extend(data[offset : offset + length]) offset += length elif opcode == 1: # C.7.9.2.2: Linear segment if lut: y0 = lut[-1] elif last_value: # Indirect segment with linear segment at 0th offset y0 = last_value else: raise ValueError( "Error expanding a segmented palette color lookup table: " "the first segment cannot be a linear segment" ) y1 = data[offset] offset += 1 if y0 == y1: lut.extend([y1] * length) else: step = (y1 - y0) / length vals = np.around(np.linspace(y0 + step, y1, length)) lut.extend([int(vv) for vv in vals]) elif opcode == 2: # C.7.9.2.3: Indirect segment if not lut: raise ValueError( "Error expanding a segmented palette color lookup table: " "the first segment cannot be an indirect segment" ) if "B" in fmt: # 8-bit segment entries ii = [data[offset + vv] for vv in indirect_ii] byte_offset = (ii[0] << 8 | ii[1]) << 16 | (ii[2] << 8 | ii[3]) offset += 4 else: # 16-bit segment entries byte_offset = data[offset + 1] << 16 | data[offset] offset += 2 lut.extend(_expand_segmented_lut(data[byte_offset:], fmt, length, lut[-1])) else: raise ValueError( "Error expanding a segmented palette lookup table: " f"unknown segment type '{opcode}'" ) segments_read += 1 if segments_read == nr_segments: return lut return lut pydicom-pydicom-20aa4b7/src/pydicom/pixels/utils.py000066400000000000000000002232061515706620200225040ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Utilities for pixel data handling.""" from collections.abc import Iterable, Iterator, ByteString import importlib import logging from pathlib import Path from struct import unpack, Struct from sys import byteorder from typing import BinaryIO, Any, cast, TYPE_CHECKING try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.charset import default_encoding from pydicom._dicom_dict import DicomDictionary from pydicom.encaps import encapsulate, encapsulate_extended from pydicom.misc import warn_and_log from pydicom.tag import BaseTag from pydicom.uid import ( UID, JPEGLSNearLossless, JPEG2000, ExplicitVRLittleEndian, generate_uid, ) from pydicom.valuerep import VR if TYPE_CHECKING: # pragma: no cover from os import PathLike from pydicom.dataset import Dataset LOGGER = logging.getLogger(__name__) # All non-retired group 0x0028 elements _GROUP_0028 = { k for k, v in DicomDictionary.items() if k >> 16 == 0x0028 and v[3] == "" } # The minimum required Image Pixel module elements used by encoding/decoding _IMAGE_PIXEL = { 0x00280002: "samples_per_pixel", 0x00280004: "photometric_interpretation", 0x00280006: "planar_configuration", 0x00280008: "number_of_frames", 0x00280010: "rows", 0x00280011: "columns", 0x00280100: "bits_allocated", 0x00280101: "bits_stored", 0x00280103: "pixel_representation", } # Default tags to look for with pixel_array() and iter_pixels() _DEFAULT_TAGS = {k for k in _IMAGE_PIXEL.keys()} | {0x7FE00001, 0x7FE00002} _PIXEL_KEYWORDS = { (0x7FE0, 0x0008): "FloatPixelData", (0x7FE0, 0x0009): "DoubleFloatPixelData", (0x7FE0, 0x0010): "PixelData", } # Lookup table for unpacking bit-packed data _UNPACK_LUT: dict[int, bytes] = { k: bytes(int(s) for s in reversed(f"{k:08b}")) for k in range(256) } # JPEG/JPEG-LS SOF markers _SOF = { b"\xFF\xC0", b"\xFF\xC1", b"\xFF\xC2", b"\xFF\xC3", b"\xFF\xC5", b"\xFF\xC6", b"\xFF\xC7", b"\xFF\xC9", b"\xFF\xCA", b"\xFF\xCB", b"\xFF\xCD", b"\xFF\xCE", b"\xFF\xCF", b"\xFF\xF7", } # JPEG APP markers, all in range (0xFFE0, 0xFFEF) _APP = {x.to_bytes(length=2, byteorder="big") for x in range(0xFFE0, 0xFFF0)} _UNPACK_SHORT = Struct(">H").unpack def _array_common( f: BinaryIO, specific_tags: list[BaseTag | int], **kwargs: Any ) -> tuple["Dataset", dict[str, Any]]: """Return a dataset from `f` and a corresponding decoding options dict. Parameters ---------- f : BinaryIO The opened file-like containing the DICOM dataset, positioned at the start of the file. specific_tags : list[BaseTag | int] A list of additional tags to be read from the dataset and possibly returned via the `ds_out` dataset. kwargs : dict[str, Any] Required and optional arguments for the pixel data decoding functions. Returns ------- tuple[Dataset, dict[str, Any]] * A dataset containing the group 0x0028 elements, the extended offset elements (if any) and elements from `specific_tags`. * The required and optional arguments for the pixel data decoding functions. """ from pydicom.filereader import ( read_preamble, _read_file_meta_info, read_dataset, _at_pixel_data, ) # Read preamble (if present) read_preamble(f, force=True) # Read the File Meta (if present) file_meta = _read_file_meta_info(f) tsyntax = kwargs.setdefault( "transfer_syntax_uid", file_meta.get("TransferSyntaxUID", None), ) if not tsyntax: raise AttributeError( "'transfer_syntax_uid' is required if the dataset in 'src' is not " "in the DICOM File Format" ) tsyntax = UID(tsyntax) # Get the *Image Pixel* module 0028 elements, any extended offsets and # any other tags wanted by the user ds = read_dataset( f, is_implicit_VR=tsyntax.is_implicit_VR, is_little_endian=tsyntax.is_little_endian, stop_when=_at_pixel_data, specific_tags=specific_tags, ) ds.file_meta = file_meta opts = as_pixel_options(ds, **kwargs) opts["transfer_syntax_uid"] = tsyntax # We are either at the start of the element tag for a pixel data # element or at EOF because there were none try: data = f.read(8) assert len(data) == 8 except Exception: raise AttributeError( "The dataset in 'src' has no 'Pixel Data', 'Float Pixel Data' or " "'Double Float Pixel Data' element, no pixel data to decode" ) endianness = "><"[tsyntax.is_little_endian] if tsyntax.is_implicit_VR: vr = None group, elem, length = unpack(f"{endianness}HHL", data) else: # Is always 32-bit extended length for pixel data VRs group, elem, vr, length = unpack(f"{endianness}HH2sH", data) opts["pixel_vr"] = vr.decode(default_encoding) unpack(f"{endianness}L", f.read(4)) # We should now be positioned at the start of the pixel data value opts["pixel_keyword"] = _PIXEL_KEYWORDS[(group, elem)] return ds, opts def as_pixel_options(ds: "Dataset", **kwargs: Any) -> dict[str, Any]: """Return a dict containing the image pixel element values from `ds`. .. versionadded:: 3.0 Parameters ---------- ds : pydicom.dataset.Dataset A dataset containing Image Pixel module elements. **kwargs A :class:`dict` containing (key, value) pairs to be used to override the values taken from `ds`. For example, if ``kwargs = {'rows': 64}`` then the returned :class:`dict` will have a 'rows' value of 64 rather than whatever ``ds.Rows`` may be. Returns ------- dict[str, Any] A dictionary which may contain the following keys, depending on which elements are present in `ds` and the contents of `kwargs`: * `samples_per_pixel` * `photometric_interpretation` * `planar_configuration` * `number_of_frames` (always present) * `rows` * `columns` * `bits_allocated` * `bits_stored` * `pixel_representation` """ opts = { attr: ds[tag].value for tag, attr in _IMAGE_PIXEL.items() if tag in ds._dict } # Ensure we have a valid 'number_of_frames' if 0x00280008 not in ds._dict: opts["number_of_frames"] = 1 nr_frames = opts["number_of_frames"] nr_frames = int(nr_frames) if isinstance(nr_frames, str) else nr_frames if nr_frames in (None, 0): warn_and_log( f"A value of '{nr_frames}' for (0028,0008) 'Number of Frames' is invalid, " "assuming 1 frame" ) nr_frames = 1 opts["number_of_frames"] = nr_frames # Extended Offset Table if 0x7FE00001 in ds._dict and 0x7FE00001 in ds._dict: opts["extended_offsets"] = ( ds.ExtendedOffsetTable, ds.ExtendedOffsetTableLengths, ) opts.update(kwargs) return opts def compress( ds: "Dataset", transfer_syntax_uid: str, arr: "np.ndarray | None" = None, *, encoding_plugin: str = "", encapsulate_ext: bool = False, generate_instance_uid: bool = True, jls_error: int | None = None, j2k_cr: list[float] | None = None, j2k_psnr: list[float] | None = None, **kwargs: Any, ) -> "Dataset": """Compress uncompressed pixel data and update `ds` in-place with the resulting :dcm:`encapsulated` codestream. .. versionadded:: 3.0 The dataset `ds` must already have the following :dcm:`Image Pixel` module elements present with correct values that correspond to the resulting compressed pixel data: * (0028,0002) *Samples per Pixel* * (0028,0004) *Photometric Interpretation* * (0028,0008) *Number of Frames* (if more than 1 frame will be present) * (0028,0010) *Rows* * (0028,0011) *Columns* * (0028,0100) *Bits Allocated* * (0028,0101) *Bits Stored* * (0028,0103) *Pixel Representation* If *Samples per Pixel* is greater than 1 then the following element is also required: * (0028,0006) *Planar Configuration* This method will add the file meta dataset if none is present and add or modify the following elements: * (0002,0010) *Transfer Syntax UID* * (7FE0,0010) *Pixel Data* If the compressed pixel data is too large for encapsulation using a basic offset table then an :dcm:`extended offset table ` will also be used, in which case the following elements will also be added: * (7FE0,0001) *Extended Offset Table* * (7FE0,0002) *Extended Offset Table Lengths* If `generate_instance_uid` is ``True`` (default) then a new (0008,0018) *SOP Instance UID* value will be generated. **Supported Transfer Syntax UIDs** +-----------------------------------------------+-----------+----------------------------------+ | UID | Plugins | Encoding Guide | +------------------------+----------------------+ | | | Name | Value | | | +========================+======================+===========+==================================+ | *JPEG-LS Lossless* |1.2.840.10008.1.2.4.80| pyjpegls | :doc:`JPEG-LS | +------------------------+----------------------+ | ` | | *JPEG-LS Near Lossless*|1.2.840.10008.1.2.4.81| | | +------------------------+----------------------+-----------+----------------------------------+ | *JPEG 2000 Lossless* |1.2.840.10008.1.2.4.90| pylibjpeg | :doc:`JPEG 2000 | +------------------------+----------------------+ | ` | | *JPEG 2000* |1.2.840.10008.1.2.4.91| | | +------------------------+----------------------+-----------+----------------------------------+ | *RLE Lossless* | 1.2.840.10008.1.2.5 | pydicom, | :doc:`RLE Lossless | | | | pylibjpeg,| ` | | | | gdcm | | +------------------------+----------------------+-----------+----------------------------------+ Examples -------- Compress the existing uncompressed *Pixel Data* in place: >>> from pydicom import examples >>> from pydicom.pixels import compress >>> from pydicom.uid import RLELossless >>> ds = examples.ct >>> compress(ds, RLELossless) >>> ds.save_as("ct_rle_lossless.dcm") Parameters ---------- ds : pydicom.dataset.Dataset The dataset to be compressed. transfer_syntax_uid : pydicom.uid.UID The UID of the :dcm:`transfer syntax` to use when compressing the pixel data. arr : numpy.ndarray, optional Compress the uncompressed pixel data in `arr` and use it to set the *Pixel Data*. If `arr` is not used then the existing uncompressed *Pixel Data* in the dataset will be compressed instead. The :attr:`~numpy.ndarray.shape`, :class:`~numpy.dtype` and contents of the array should match the dataset. encoding_plugin : str, optional Use `encoding_plugin` to compress the pixel data. See the :doc:`user guide ` for a list of plugins available for each UID and their dependencies. If not specified then all available plugins will be tried (default). encapsulate_ext : bool, optional If ``True`` then force the addition of an extended offset table. If ``False`` (default) then an extended offset table will be added if needed for large amounts of compressed *Pixel Data*, otherwise just the basic offset table will be used. generate_instance_uid : bool, optional If ``True`` (default) then generate a new (0008,0018) *SOP Instance UID* value for the dataset using :func:`~pydicom.uid.generate_uid`, otherwise keep the original value. jls_error : int, optional **JPEG-LS Near Lossless only**. The allowed absolute compression error in the pixel values. j2k_cr : list[float], optional **JPEG 2000 only**. A list of the compression ratios to use for each quality layer. There must be at least one quality layer and the minimum allowable compression ratio is ``1``. When using multiple quality layers they should be ordered in decreasing value from left to right. For example, to use 2 quality layers with 20x and 5x compression ratios then `j2k_cr` should be ``[20, 5]``. Cannot be used with `j2k_psnr`. j2k_psnr : list[float], optional **JPEG 2000 only**. A list of the peak signal-to-noise ratios (in dB) to use for each quality layer. There must be at least one quality layer and when using multiple quality layers they should be ordered in increasing value from left to right. For example, to use 2 quality layers with PSNR of 80 and 300 then `j2k_psnr` should be ``[80, 300]``. Cannot be used with `j2k_cr`. **kwargs Optional keyword parameters for the encoding plugin may also be present. See the :doc:`encoding plugins options ` for more information. """ from pydicom.dataset import FileMetaDataset from pydicom.pixels import get_encoder # Disallow overriding the dataset's image pixel module element values for option in _IMAGE_PIXEL.values(): kwargs.pop(option, None) uid = UID(transfer_syntax_uid) encoder = get_encoder(uid) if not encoder.is_available: missing = "\n".join([f" {s}" for s in encoder.missing_dependencies]) raise RuntimeError( f"The pixel data encoder for '{uid.name}' is unavailable because all " f"of its plugins are missing dependencies:\n{missing}" ) if uid == JPEGLSNearLossless and jls_error is not None: kwargs["jls_error"] = jls_error if uid == JPEG2000: if j2k_cr is not None: kwargs["j2k_cr"] = j2k_cr if j2k_psnr is not None: kwargs["j2k_psnr"] = j2k_psnr if arr is None: # Check the dataset compression state file_meta = ds.get("file_meta", {}) tsyntax = file_meta.get("TransferSyntaxUID", "") if not tsyntax: raise AttributeError( "Unable to determine the initial compression state of the dataset " "as there's no (0002,0010) 'Transfer Syntax UID' element in the " "dataset's 'file_meta' attribute" ) if tsyntax.is_compressed: raise ValueError("Only uncompressed datasets may be compressed") # Encode the current uncompressed *Pixel Data* frame_iterator = encoder.iter_encode( ds, encoding_plugin=encoding_plugin, **kwargs ) else: # Encode from an array - no need to check dataset compression state # because we'll be using new pixel data opts = as_pixel_options(ds, **kwargs) frame_iterator = encoder.iter_encode( arr, encoding_plugin=encoding_plugin, **opts ) # Encode! encoded = [f for f in frame_iterator] # Encapsulate the encoded *Pixel Data* nr_frames = len(encoded) total = (nr_frames - 1) * 8 + sum([len(f) for f in encoded[:-1]]) if encapsulate_ext or total > 2**32 - 1: ( ds.PixelData, ds.ExtendedOffsetTable, ds.ExtendedOffsetTableLengths, ) = encapsulate_extended(encoded) else: ds.PixelData = encapsulate(encoded) # PS3.5 Annex A.4 - encapsulated pixel data uses undefined length elem = ds["PixelData"] elem.is_undefined_length = True # PS3.5 Section 8.2 and Annex A.4 - encapsulated pixel data uses OB elem.VR = VR.OB # Clear `pixel_array` as lossy compression may give different results ds._pixel_array = None ds._pixel_id = {} # Set the correct *Transfer Syntax UID* if not hasattr(ds, "file_meta"): ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = uid if generate_instance_uid: instance_uid = generate_uid() ds.SOPInstanceUID = instance_uid ds.file_meta.MediaStorageSOPInstanceUID = instance_uid return ds def decompress( ds: "Dataset", *, as_rgb: bool = True, generate_instance_uid: bool = True, decoding_plugin: str = "", **kwargs: Any, ) -> "Dataset": """Perform an in-place decompression of a dataset with a compressed *Transfer Syntax UID*. .. versionadded:: 3.0 .. warning:: This function requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decoding. See the :doc:`pixel data decompression documentation ` for more information. * The dataset's *Transfer Syntax UID* will be set to *Explicit VR Little Endian*. * The *Pixel Data* will be decompressed in its entirety and the *Pixel Data* element's value updated with the uncompressed data, padded to an even length. * The *Pixel Data* element's VR will be set to **OB** if *Bits Allocated* <= 8, otherwise it will be set to **OW**. * The :attr:`DataElement.is_undefined_length ` attribute for the *Pixel Data* element will be set to ``False``. * Any :dcm:`image pixel` module elements may be modified as required to match the uncompressed *Pixel Data*. * If `generate_instance_uid` is ``True`` (default) then a new (0008,0018) *SOP Instance UID* value will be generated. Parameters ---------- ds : pydicom.dataset.Dataset A dataset containing compressed *Pixel Data* to be decoded and the corresponding *Image Pixel* module elements, along with a :attr:`~pydicom.dataset.FileDataset.file_meta` attribute containing a suitable (0002,0010) *Transfer Syntax UID*. as_rgb : bool, optional if ``True`` (default) then convert pixel data with a YCbCr :ref:`photometric interpretation` such as ``"YBR_FULL_422"`` to RGB. generate_instance_uid : bool, optional If ``True`` (default) then generate a new (0008,0018) *SOP Instance UID* value for the dataset using :func:`~pydicom.uid.generate_uid`, otherwise keep the original value. decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one yielded. For information on the available plugins for each decoder see the :doc:`API documentation`. kwargs : dict[str, Any], optional Optional keyword parameters for the decoding plugin may also be present. See the :doc:`decoding plugins options ` for more information. Returns ------- pydicom.dataset.Dataset The dataset `ds` decompressed in-place. """ # TODO: v4.0 remove support for `pixel_data_handlers` module from pydicom.pixels import get_decoder if "PixelData" not in ds: raise AttributeError( "Unable to decompress as the dataset has no (7FE0,0010) 'Pixel Data' element" ) file_meta = ds.get("file_meta", {}) tsyntax = file_meta.get("TransferSyntaxUID", "") if not tsyntax: raise AttributeError( "Unable to determine the initial compression state as there's no " "(0002,0010) 'Transfer Syntax UID' element in the dataset's 'file_meta' " "attribute" ) uid = UID(tsyntax) if not uid.is_compressed: raise ValueError("The dataset is already uncompressed") use_pdh = kwargs.get("use_pdh", False) frames: list[bytes] if use_pdh: ds.convert_pixel_data(decoding_plugin) frames = [ds.pixel_array.tobytes()] else: decoder = get_decoder(uid) if not decoder.is_available: missing = "\n".join([f" {s}" for s in decoder.missing_dependencies]) raise RuntimeError( f"Unable to decompress as the plugins for the '{uid.name}' decoder " f"are all missing dependencies:\n{missing}" ) # Disallow decompression of individual frames kwargs.pop("index", None) frame_generator = decoder.iter_array( ds, decoding_plugin=decoding_plugin, as_rgb=as_rgb, **kwargs, ) frames = [] for arr, image_pixel in frame_generator: frames.append(arr.tobytes()) # Part 5, Section 8.1.1: 32-bit Value Length field value_length = sum(len(frame) for frame in frames) if value_length >= 2**32 - 1: raise ValueError( "Unable to decompress as the length of the uncompressed pixel data " "will be greater than the maximum allowed by the DICOM Standard" ) # Pad with 0x00 if odd length nr_frames = len(frames) if value_length % 2: frames.append(b"\x00") elem = ds["PixelData"] elem.value = b"".join(frame for frame in frames) elem.is_undefined_length = False elem.VR = VR.OB if ds.BitsAllocated <= 8 else VR.OW # Update the transfer syntax ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian if generate_instance_uid: instance_uid = generate_uid() ds.SOPInstanceUID = instance_uid ds.file_meta.MediaStorageSOPInstanceUID = instance_uid if not use_pdh: # Update the image pixel elements ds.PhotometricInterpretation = image_pixel["photometric_interpretation"] if cast(int, image_pixel["samples_per_pixel"]) > 1: ds.PlanarConfiguration = cast(int, image_pixel["planar_configuration"]) if "NumberOfFrames" in ds or nr_frames > 1: ds.NumberOfFrames = nr_frames ds._pixel_array = None ds._pixel_id = {} return ds def expand_ybr422(src: ByteString, bits_allocated: int) -> bytes: """Return ``YBR_FULL_422`` data expanded to ``YBR_FULL``. Uncompressed datasets with a (0028,0004) *Photometric Interpretation* of ``"YBR_FULL_422"`` are subsampled in the horizontal direction by halving the number of Cb and Cr pixels (i.e. there are two Y pixels for every Cb and Cr pixel). This function expands the ``YBR_FULL_422`` data to remove the subsampling and the output is therefore ``YBR_FULL``. Parameters ---------- src : bytes or bytearray The YBR_FULL_422 pixel data to be expanded. bits_allocated : int The number of bits used to store each pixel, as given by (0028,0100) *Bits Allocated*. Returns ------- bytes The expanded data (as YBR_FULL). """ # YBR_FULL_422 is Y Y Cb Cr (i.e. 2 Y pixels for every Cb and Cr pixel) n_bytes = bits_allocated // 8 length = len(src) // 2 * 3 dst = bytearray(length) step_src = n_bytes * 4 step_dst = n_bytes * 6 for ii in range(n_bytes): c_b = src[2 * n_bytes + ii :: step_src] c_r = src[3 * n_bytes + ii :: step_src] dst[0 * n_bytes + ii :: step_dst] = src[0 * n_bytes + ii :: step_src] dst[1 * n_bytes + ii :: step_dst] = c_b dst[2 * n_bytes + ii :: step_dst] = c_r dst[3 * n_bytes + ii :: step_dst] = src[1 * n_bytes + ii :: step_src] dst[4 * n_bytes + ii :: step_dst] = c_b dst[5 * n_bytes + ii :: step_dst] = c_r return bytes(dst) def get_expected_length(ds: "Dataset", unit: str = "bytes") -> int: """Return the expected length (in terms of bytes or pixels) of the *Pixel Data*. +------------------------------------------------+-------------+ | Element | Required or | +-------------+---------------------------+------+ optional | | Tag | Keyword | Type | | +=============+===========================+======+=============+ | (0028,0002) | SamplesPerPixel | 1 | Required | +-------------+---------------------------+------+-------------+ | (0028,0004) | PhotometricInterpretation | 1 | Required | +-------------+---------------------------+------+-------------+ | (0028,0008) | NumberOfFrames | 1C | Optional | +-------------+---------------------------+------+-------------+ | (0028,0010) | Rows | 1 | Required | +-------------+---------------------------+------+-------------+ | (0028,0011) | Columns | 1 | Required | +-------------+---------------------------+------+-------------+ | (0028,0100) | BitsAllocated | 1 | Required | +-------------+---------------------------+------+-------------+ Parameters ---------- ds : Dataset The :class:`~pydicom.dataset.Dataset` containing the Image Pixel module and *Pixel Data*. unit : str, optional If ``'bytes'`` then returns the expected length of the *Pixel Data* in whole bytes and NOT including an odd length trailing NULL padding byte. If ``'pixels'`` then returns the expected length of the *Pixel Data* in terms of the total number of pixels (default ``'bytes'``). Returns ------- int The expected length of the *Pixel Data* in either whole bytes or pixels, excluding the NULL trailing padding byte for odd length data. """ rows = cast(int, ds.Rows) columns = cast(int, ds.Columns) samples_per_pixel = cast(int, ds.SamplesPerPixel) bits_allocated = cast(int, ds.BitsAllocated) length = rows * columns * samples_per_pixel length *= get_nr_frames(ds) if unit == "pixels": return length # Correct for the number of bytes per pixel if bits_allocated == 1: # Determine the nearest whole number of bytes needed to contain # 1-bit pixel data. e.g. 10 x 10 1-bit pixels is 100 bits, which # are packed into 12.5 -> 13 bytes length = length // 8 + (length % 8 > 0) else: length *= bits_allocated // 8 # DICOM Standard, Part 4, Annex C.7.6.3.1.2 if ds.PhotometricInterpretation == "YBR_FULL_422": length = length // 3 * 2 return length def get_image_pixel_ids(ds: "Dataset") -> dict[str, int]: """Return a dict of the pixel data affecting element's :func:`id` values. +------------------------------------------------+ | Element | +-------------+---------------------------+------+ | Tag | Keyword | Type | +=============+===========================+======+ | (0028,0002) | SamplesPerPixel | 1 | +-------------+---------------------------+------+ | (0028,0004) | PhotometricInterpretation | 1 | +-------------+---------------------------+------+ | (0028,0006) | PlanarConfiguration | 1C | +-------------+---------------------------+------+ | (0028,0008) | NumberOfFrames | 1C | +-------------+---------------------------+------+ | (0028,0010) | Rows | 1 | +-------------+---------------------------+------+ | (0028,0011) | Columns | 1 | +-------------+---------------------------+------+ | (0028,0100) | BitsAllocated | 1 | +-------------+---------------------------+------+ | (0028,0101) | BitsStored | 1 | +-------------+---------------------------+------+ | (0028,0103) | PixelRepresentation | 1 | +-------------+---------------------------+------+ | (7FE0,0008) | FloatPixelData | 1C | +-------------+---------------------------+------+ | (7FE0,0009) | DoubleFloatPixelData | 1C | +-------------+---------------------------+------+ | (7FE0,0010) | PixelData | 1C | +-------------+---------------------------+------+ Parameters ---------- ds : Dataset The :class:`~pydicom.dataset.Dataset` containing the pixel data. Returns ------- dict A dict containing the :func:`id` values for the elements that affect the pixel data. """ keywords = [ "SamplesPerPixel", "PhotometricInterpretation", "PlanarConfiguration", "NumberOfFrames", "Rows", "Columns", "BitsAllocated", "BitsStored", "PixelRepresentation", "FloatPixelData", "DoubleFloatPixelData", "PixelData", ] return {kw: id(getattr(ds, kw, None)) for kw in keywords} def get_j2k_parameters(codestream: bytes) -> dict[str, Any]: """Return a dict containing JPEG 2000 component parameters. .. versionadded:: 2.1 Parameters ---------- codestream : bytes The JPEG 2000 (ISO/IEC 15444-1) codestream to be parsed. Returns ------- dict A dict containing parameters for the first component sample in the JPEG 2000 `codestream`, or an empty dict if unable to parse the data. Available parameters are ``{"precision": int, "is_signed": bool}``. """ offset = 0 info: dict[str, Any] = {"jp2": False} # Account for the JP2 header (if present) # The first box is always 12 bytes long if codestream.startswith(b"\x00\x00\x00\x0C\x6A\x50\x20\x20"): info["jp2"] = True total_length = len(codestream) offset = 12 # Iterate through the boxes, looking for the jp2c box while offset < total_length: length = int.from_bytes(codestream[offset : offset + 4], byteorder="big") if codestream[offset + 4 : offset + 8] == b"\x6A\x70\x32\x63": # The offset to the start of the J2K codestream offset += 8 break offset += length try: # First 2 bytes must be the SOC marker - if not then wrong format if codestream[offset : offset + 2] != b"\xff\x4f": return {} # SIZ is required to be the second marker - Figure A-3 in 15444-1 if codestream[offset + 2 : offset + 4] != b"\xff\x51": return {} # See 15444-1 A.5.1 for format of the SIZ box and contents ssiz = codestream[offset + 42] if ssiz & 0x80: info["precision"] = (ssiz & 0x7F) + 1 info["is_signed"] = True return info info["precision"] = ssiz + 1 info["is_signed"] = False return info except (IndexError, TypeError): pass return {} def _get_jpg_parameters(src: bytes) -> dict[str, Any]: """Return a dict containing JPEG or JPEG-LS encoding parameters. Parameters ---------- src : bytes The JPEG (ISO/IEC 10918-1) or JPEG-LS (ISO/IEC 14495-1) codestream to be parsed. Returns ------- dict[str, int | dict[bytes, bytes] | list[int]] A dict containing JPEG or JPEG-LS encoding parameters or an empty dict if unable to parse the data. Available parameters are: * ``precision``: int * ``height``: int * ``width``: int * ``components``: int * ``component_ids``: list[int] * ``app``: dict[bytes: bytes] * ``interleave_mode``: int, JPEG-LS only * ``lossy_error``: int, JPEG-LS only """ info: dict[str, Any] = {} try: # First 2 bytes should be the SOI marker - otherwise wrong format # or non-conformant (JFIF or SPIFF header) if src[0:2] != b"\xFF\xD8": return info # Skip to the SOF0 to SOF15 (JPEG) or SOF55 (JPEG-LS) marker # We skip through any other segments except APP as they sometimes # contain color space information (such as Adobe's APP14) offset = 2 app_markers = {} while (marker := src[offset : offset + 2]) not in _SOF: length = _UNPACK_SHORT(src[offset + 2 : offset + 4])[0] if marker in _APP: # `length` counts from the first byte of the APP length app_markers[marker] = src[offset + 4 : offset + 2 + length] offset += length + 2 # at the start of the next marker if app_markers: info["app"] = app_markers # SOF segment layout is identical for JPEG and JPEG-LS # 2 byte SOF marker # 2 bytes header length # 1 byte precision (bits stored) # 2 bytes rows # 2 bytes columns # 1 byte number of components in frame (samples per pixel) # for _ in range(number of components): # 1 byte component ID # 4/4 bits horizontal/vertical sampling factors # 1 byte table selector offset += 2 # at the start of the SOF length info["precision"] = src[offset + 2] info["height"] = _UNPACK_SHORT(src[offset + 3 : offset + 5])[0] info["width"] = _UNPACK_SHORT(src[offset + 5 : offset + 7])[0] info["components"] = src[offset + 7] # Parse the component IDs - these are sometimes used to denote the color # space of the input by using ASCII codes for the IDs (such as R G B) offset += 8 # start of the component IDs info["component_ids"] = [] for _ in range(info["components"]): info["component_ids"].append(src[offset]) offset += 3 # `offset` is at the start of the next marker # If JPEG then return if marker != b"\xFF\xF7": return info # Skip to the SOS marker while src[offset : offset + 2] != b"\xFF\xDA": offset += _UNPACK_SHORT(src[offset + 2 : offset + 4])[0] + 2 # `offset` is at the start of the SOS marker # SOS segment layout is the same for JPEG and JPEG-LS # 2 byte SOS marker # 2 bytes header length # 1 byte number of components in scan # for _ in range(number of components): # 1 byte scan component ID selector # 4/4 bits DC/AC entropy table selectors # 1 byte start spectral selector (JPEG) or NEAR (JPEG-LS) # 1 byte end spectral selector (JPEG) or ILV (JPEG-LS) # 4/4 bits approx bit high/low offset += 5 + src[offset + 4] * 2 info["lossy_error"] = src[offset] info["interleave_mode"] = src[offset + 1] except Exception: return {} return info def get_nr_frames(ds: "Dataset", warn: bool = True) -> int: """Return NumberOfFrames or 1 if NumberOfFrames is None or 0. Parameters ---------- ds : dataset.Dataset The :class:`~pydicom.dataset.Dataset` containing the Image Pixel module corresponding to the data in `arr`. warn : bool If ``True`` (the default), a warning is issued if NumberOfFrames has an invalid value. Returns ------- int An integer for the NumberOfFrames or 1 if NumberOfFrames is None or 0 """ nr_frames: int | None = getattr(ds, "NumberOfFrames", 1) # 'NumberOfFrames' may exist in the DICOM file but have value equal to None if not nr_frames: # None or 0 if warn: warn_and_log( f"A value of {nr_frames} for (0028,0008) 'Number of Frames' is " "non-conformant. It's recommended that this value be " "changed to 1" ) nr_frames = 1 return nr_frames def iter_pixels( src: "str | PathLike[str] | BinaryIO | Dataset", *, ds_out: "Dataset | None" = None, specific_tags: list[BaseTag | int] | None = None, indices: Iterable[int] | None = None, raw: bool = False, decoding_plugin: str = "", **kwargs: Any, ) -> Iterator["np.ndarray"]: """Yield decoded pixel data frames from `src` as :class:`~numpy.ndarray`. .. versionadded:: 3.0 .. warning:: This function requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decompression. See the :doc:`pixel data decompression documentation ` for more information. **Memory Usage** To minimize memory usage `src` should be the path to the dataset or a `file-like object `_ containing the dataset. **Processing** The following processing operations on the raw pixel data are always performed: * Natively encoded bit-packed pixel data for a :ref:`bits allocated ` of ``1`` will be unpacked. * Natively encoded pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL_422"`` will have it's sub-sampling removed. * The output array will be reshaped to the specified dimensions. * JPEG-LS or JPEG 2000 encoded data whose signedness doesn't match the expected :ref:`pixel representation` will be converted to match. If ``raw = False`` (the default) then the following processing operation will also be performed: * Pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL"`` or ``"YBR_FULL_422"`` will be converted to ``"RGB"``. Examples -------- Read a DICOM dataset then iterate through all the pixel data frames:: from pydicom import dcmread from pydicom.pixels import iter_pixels ds = dcmread("path/to/dataset.dcm") for arr in iter_pixels(ds): print(arr.shape) Iterate through all the pixel data frames in a dataset while minimizing memory usage:: from pydicom.pixels import iter_pixels for arr in iter_pixels("path/to/dataset.dcm"): print(arr.shape) Iterate through the even frames for a dataset with 10 frames:: from pydicom.pixels import iter_pixels with open("path/to/dataset.dcm", "rb") as f: for arr in iter_pixels(f, indices=range(0, 10, 2)): print(arr.shape) Parameters ---------- src : str | PathLike[str] | file-like | pydicom.dataset.Dataset * :class:`str` | :class:`os.PathLike`: the path to a DICOM dataset containing pixel data, or * file-like: a `file-like object `_ in 'rb' mode containing the dataset. * :class:`~pydicom.dataset.Dataset`: a dataset instance ds_out : pydicom.dataset.Dataset, optional A :class:`~pydicom.dataset.Dataset` that will be updated with the non-retired group ``0x0028`` image pixel module elements and the group ``0x0002`` file meta information elements from the dataset in `src`. **Only available when `src` is a path or file-like.** specific_tags : list[int | pydicom.tag.BaseTag], optional A list of additional tags from the dataset in `src` to be added to the `ds_out` dataset. indices : Iterable[int] | None, optional If ``None`` (default) then iterate through the entire pixel data, otherwise only iterate through the frames specified by `indices`. raw : bool, optional If ``True`` then yield the decoded pixel data after only minimal processing (see the processing section above). If ``False`` (default) then additional processing may be applied to convert the pixel data to it's most commonly used form (such as converting from YCbCr to RGB). decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one yielded. For information on the available plugins for each decoder see the :doc:`API documentation`. **kwargs Optional keyword parameters for controlling decoding are also available, please see the :doc:`decoding options documentation ` for more information. Yields ------- numpy.ndarray A single frame of decoded pixel data with shape: * (rows, columns) for single sample data * (rows, columns, samples) for multi-sample data A writeable :class:`~numpy.ndarray` is yielded by default. For native transfer syntaxes with ``view_only=True`` a read-only :class:`~numpy.ndarray` will be yielded. """ from pydicom.dataset import Dataset from pydicom.pixels import get_decoder if isinstance(src, Dataset): ds: Dataset = src file_meta = getattr(ds, "file_meta", {}) if not (tsyntax := file_meta.get("TransferSyntaxUID", None)): raise AttributeError( "Unable to decode the pixel data as the dataset's 'file_meta' " "has no (0002,0010) 'Transfer Syntax UID' element" ) try: decoder = get_decoder(tsyntax) except NotImplementedError: raise NotImplementedError( "Unable to decode the pixel data as a (0002,0010) 'Transfer Syntax " f"UID' value of '{tsyntax.name}' is not supported" ) opts = as_pixel_options(ds, **kwargs) iterator = decoder.iter_array( ds, indices=indices, validate=True, raw=raw, decoding_plugin=decoding_plugin, **opts, ) for arr, _ in iterator: yield arr return f: BinaryIO if not hasattr(src, "read"): path = Path(src).resolve(strict=True) f = path.open("rb") else: f = cast(BinaryIO, src) file_offset = f.tell() f.seek(0) tags = _DEFAULT_TAGS if ds_out is not None: tags = set(specific_tags) if specific_tags else set() tags = tags | _GROUP_0028 | {0x7FE00001, 0x7FE00002} try: ds, opts = _array_common(f, list(tags), **kwargs) if isinstance(ds_out, Dataset): ds_out.file_meta = ds.file_meta ds_out.set_original_encoding(*ds.original_encoding) ds_out._dict.update(ds._dict) tsyntax = opts["transfer_syntax_uid"] try: decoder = get_decoder(tsyntax) except NotImplementedError: raise NotImplementedError( "Unable to decode the pixel data as a (0002,0010) 'Transfer Syntax " f"UID' value of '{tsyntax.name}' is not supported" ) iterator = decoder.iter_array( f, indices=indices, validate=True, raw=raw, decoding_plugin=decoding_plugin, **opts, ) for arr, _ in iterator: yield arr finally: # Close the open file only if we were the ones that opened it if not hasattr(src, "read"): f.close() else: f.seek(file_offset) def pack_bits(arr: "np.ndarray", pad: bool = True) -> bytes: """Pack a binary :class:`numpy.ndarray` for use with *Pixel Data*. Should be used in conjunction with (0028,0100) *Bits Allocated* = 1. .. versionchanged:: 2.1 Added the `pad` keyword parameter and changed to allow `arr` to be 2 or 3D. Parameters ---------- arr : numpy.ndarray The :class:`numpy.ndarray` containing 1-bit data as ints. `arr` must only contain integer values of 0 and 1 and must have an 'uint' or 'int' :class:`numpy.dtype`. For the sake of efficiency it's recommended that the length of `arr` be a multiple of 8 (i.e. that any empty bit-padding to round out the byte has already been added). The input `arr` should either be shaped as (rows, columns) or (frames, rows, columns) or the equivalent 1D array used to ensure that the packed data is in the correct order. pad : bool, optional If ``True`` (default) then add a null byte to the end of the packed data to ensure even length, otherwise no padding will be added. Returns ------- bytes The bit packed data. Raises ------ ValueError If `arr` contains anything other than 0 or 1. References ---------- DICOM Standard, Part 5, :dcm:`Section 8.1.1` and :dcm:`Annex D` """ if arr.shape == (0,): return b"" # Test array if not np.array_equal(arr, arr.astype(bool)): raise ValueError( "Only binary arrays (containing ones or zeroes) can be packed." ) if len(arr.shape) > 1: arr = arr.ravel() # The array length must be a multiple of 8, pad the end if arr.shape[0] % 8: arr = np.append(arr, np.zeros(8 - arr.shape[0] % 8)) arr = np.packbits(arr.astype("u1"), bitorder="little") packed: bytes = arr.tobytes() if pad: return packed + b"\x00" if len(packed) % 2 else packed return packed def _passes_version_check(package_name: str, minimum_version: tuple[int, ...]) -> bool: """Return True if `package_name` is available and its version is greater or equal to `minimum_version` """ try: module = importlib.import_module(package_name, "__version__") return tuple(int(x) for x in module.__version__.split(".")) >= minimum_version except Exception as exc: LOGGER.debug(exc) return False def pixel_array( src: "str | PathLike[str] | BinaryIO | Dataset", *, ds_out: "Dataset | None" = None, specific_tags: list[int] | None = None, index: int | None = None, raw: bool = False, decoding_plugin: str = "", **kwargs: Any, ) -> "np.ndarray": """Return decoded pixel data from `src` as :class:`~numpy.ndarray`. .. versionadded:: 3.0 .. warning:: This function requires `NumPy `_ and may require the installation of additional packages to perform the actual pixel data decompression. See the :doc:`pixel data decompression documentation ` for more information. **Memory Usage** To minimize memory usage `src` should be the path to the dataset or a `file-like object `_ containing the dataset. **Processing** The following processing operations on the raw pixel data are always performed: * Natively encoded bit-packed pixel data for a :ref:`bits allocated ` of ``1`` will be unpacked. * Natively encoded pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL_422"`` will have it's sub-sampling removed. * The output array will be reshaped to the specified dimensions. * JPEG-LS or JPEG 2000 encoded data whose signedness doesn't match the expected :ref:`pixel representation` will be converted to match. If ``raw = False`` (the default) then the following processing operation will also be performed: * Pixel data with a :ref:`photometric interpretation ` of ``"YBR_FULL"`` or ``"YBR_FULL_422"`` will be converted to RGB. Examples -------- Read a DICOM dataset and return the entire pixel data:: from pydicom import dcmread from pydicom.pixels import pixel_array ds = dcmread("path/to/dataset.dcm") arr = pixel_array(ds) Return the entire pixel data from a dataset while minimizing memory usage:: from pydicom.pixels import pixel_array arr = pixel_array("path/to/dataset.dcm") Return the 3rd frame of a dataset containing at least 3 frames while minimizing memory usage:: from pydicom.pixels import pixel_array with open("path/to/dataset.dcm", "rb") as f: arr = pixel_array(f, index=2) # 'index' starts at 0 Parameters ---------- src : str | PathLike[str] | file-like | pydicom.dataset.Dataset * :class:`str` | :class:`os.PathLike`: the path to a DICOM dataset containing pixel data, or * file-like: a `file-like object `_ in 'rb' mode containing the dataset. * :class:`~pydicom.dataset.Dataset`: a dataset instance ds_out : pydicom.dataset.Dataset, optional A :class:`~pydicom.dataset.Dataset` that will be updated with the non-retired group ``0x0028`` image pixel module elements and the group ``0x0002`` file meta information elements from the dataset in `src`. **Only available when `src` is a path or file-like.** specific_tags : list[int | pydicom.tag.BaseTag], optional A list of additional tags from the dataset in `src` to be added to the `ds_out` dataset. index : int | None, optional If ``None`` (default) then return an array containing all the frames in the pixel data, otherwise return only the frame from the specified `index`, which starts at 0 for the first frame. raw : bool, optional If ``True`` then return the decoded pixel data after only minimal processing (see the processing section above). If ``False`` (default) then additional processing may be applied to convert the pixel data to it's most commonly used form (such as converting from YCbCr to RGB). decoding_plugin : str, optional The name of the decoding plugin to use when decoding compressed pixel data. If no `decoding_plugin` is specified (default) then all available plugins will be tried and the result from the first successful one returned. For information on the available plugins for each decoder see the :doc:`API documentation`. **kwargs Optional keyword parameters for controlling decoding, please see the :doc:`decoding options documentation` for more information. Returns ------- numpy.ndarray One or more frames of decoded pixel data with shape: * (rows, columns) for single frame, single sample data * (rows, columns, samples) for single frame, multi-sample data * (frames, rows, columns) for multi-frame, single sample data * (frames, rows, columns, samples) for multi-frame, multi-sample data A writeable :class:`~numpy.ndarray` is returned by default. For native transfer syntaxes with ``view_only=True`` a read-only :class:`~numpy.ndarray` will be returned. """ from pydicom.dataset import Dataset from pydicom.pixels import get_decoder if isinstance(src, Dataset): ds: Dataset = src file_meta = getattr(ds, "file_meta", {}) if not (tsyntax := file_meta.get("TransferSyntaxUID", None)): raise AttributeError( "Unable to decode the pixel data as the dataset's 'file_meta' " "has no (0002,0010) 'Transfer Syntax UID' element" ) try: decoder = get_decoder(tsyntax) except NotImplementedError: raise NotImplementedError( "Unable to decode the pixel data as a (0002,0010) 'Transfer Syntax " f"UID' value of '{tsyntax.name}' is not supported" ) opts = as_pixel_options(ds, **kwargs) return decoder.as_array( ds, index=index, validate=True, raw=raw, decoding_plugin=decoding_plugin, **opts, )[0] f: BinaryIO if not hasattr(src, "read"): path = Path(src).resolve(strict=True) f = path.open("rb") else: f = cast(BinaryIO, src) file_offset = f.tell() f.seek(0) tags = _DEFAULT_TAGS if ds_out is not None: tags = set(specific_tags) if specific_tags else set() tags = tags | _GROUP_0028 | {0x7FE00001, 0x7FE00002} try: ds, opts = _array_common(f, list(tags), **kwargs) tsyntax = opts["transfer_syntax_uid"] try: decoder = get_decoder(tsyntax) except NotImplementedError: raise NotImplementedError( "Unable to decode the pixel data as a (0002,0010) 'Transfer Syntax " f"UID' value of '{tsyntax.name}' is not supported" ) arr, _ = decoder.as_array( f, index=index, validate=True, raw=raw, decoding_plugin=decoding_plugin, **opts, # type: ignore[arg-type] ) finally: # Close the open file only if we were the ones that opened it if not hasattr(src, "read"): f.close() else: f.seek(file_offset) if isinstance(ds_out, Dataset): ds_out.file_meta = ds.file_meta ds_out.set_original_encoding(*ds.original_encoding) ds_out._dict.update(ds._dict) return arr def pixel_dtype(ds: "Dataset", as_float: bool = False) -> "np.dtype": """Return a :class:`numpy.dtype` for the pixel data in `ds`. Suitable for use with IODs containing the Image Pixel module (with ``as_float=False``) and the Floating Point Image Pixel and Double Floating Point Image Pixel modules (with ``as_float=True``). +------------------------------------------+------------------+ | Element | Supported | +-------------+---------------------+------+ values | | Tag | Keyword | Type | | +=============+=====================+======+==================+ | (0028,0101) | BitsAllocated | 1 | 1, 8, 16, 32, 64 | +-------------+---------------------+------+------------------+ | (0028,0103) | PixelRepresentation | 1 | 0, 1 | +-------------+---------------------+------+------------------+ Parameters ---------- ds : Dataset The :class:`~pydicom.dataset.Dataset` containing the pixel data you wish to get the data type for. as_float : bool, optional If ``True`` then return a float dtype, otherwise return an integer dtype (default ``False``). Float dtypes are only supported when (0028,0101) *Bits Allocated* is 32 or 64. Returns ------- numpy.dtype A :class:`numpy.dtype` suitable for containing the pixel data. Raises ------ NotImplementedError If the pixel data is of a type that isn't supported by either numpy or *pydicom*. """ if not HAVE_NP: raise ImportError("Numpy is required to determine the dtype.") # Prefer Transfer Syntax UID, fall back to the original encoding if hasattr(ds, "file_meta"): is_little_endian = ds.file_meta._tsyntax_encoding[1] else: is_little_endian = ds.original_encoding[1] if is_little_endian is None: raise AttributeError( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in " f"'{type(ds).__name__}.file_meta'" ) if not as_float: # (0028,0103) Pixel Representation, US, 1 # Data representation of the pixel samples # 0x0000 - unsigned int # 0x0001 - 2's complement (signed int) pixel_repr = cast(int, ds.PixelRepresentation) if pixel_repr == 0: dtype_str = "uint" elif pixel_repr == 1: dtype_str = "int" else: raise ValueError( "Unable to determine the data type to use to contain the " f"Pixel Data as a value of '{pixel_repr}' for '(0028,0103) " "Pixel Representation' is invalid" ) else: dtype_str = "float" # (0028,0100) Bits Allocated, US, 1 # The number of bits allocated for each pixel sample # PS3.5 8.1.1: Bits Allocated shall either be 1 or a multiple of 8 # For bit packed data we use uint8 bits_allocated = cast(int, ds.BitsAllocated) if bits_allocated == 1: dtype_str = "uint8" elif bits_allocated > 0 and bits_allocated % 8 == 0: dtype_str += str(bits_allocated) else: raise ValueError( "Unable to determine the data type to use to contain the " f"Pixel Data as a value of '{bits_allocated}' for '(0028,0100) " "Bits Allocated' is invalid" ) # Check to see if the dtype is valid for numpy try: dtype = np.dtype(dtype_str) except TypeError: raise NotImplementedError( f"The data type '{dtype_str}' needed to contain the Pixel Data " "is not supported by numpy" ) # Correct for endianness of the system vs endianness of the dataset if is_little_endian != (byteorder == "little"): # 'S' swap from current to opposite dtype = dtype.newbyteorder("S") return dtype def reshape_pixel_array(ds: "Dataset", arr: "np.ndarray") -> "np.ndarray": """Return a reshaped :class:`numpy.ndarray` `arr`. +------------------------------------------+-----------+----------+ | Element | Supported | | +-------------+---------------------+------+ values | | | Tag | Keyword | Type | | | +=============+=====================+======+===========+==========+ | (0028,0002) | SamplesPerPixel | 1 | N > 0 | Required | +-------------+---------------------+------+-----------+----------+ | (0028,0006) | PlanarConfiguration | 1C | 0, 1 | Optional | +-------------+---------------------+------+-----------+----------+ | (0028,0008) | NumberOfFrames | 1C | N > 0 | Optional | +-------------+---------------------+------+-----------+----------+ | (0028,0010) | Rows | 1 | N > 0 | Required | +-------------+---------------------+------+-----------+----------+ | (0028,0011) | Columns | 1 | N > 0 | Required | +-------------+---------------------+------+-----------+----------+ (0028,0008) *Number of Frames* is required when *Pixel Data* contains more than 1 frame. (0028,0006) *Planar Configuration* is required when (0028,0002) *Samples per Pixel* is greater than 1. For certain compressed transfer syntaxes it is always taken to be either 0 or 1 as shown in the table below. +---------------------------------------------+-----------------------+ | Transfer Syntax | Planar Configuration | +------------------------+--------------------+ | | UID | Name | | +========================+====================+=======================+ | 1.2.840.10008.1.2.4.50 | JPEG Baseline | 0 | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.4.57 | JPEG Lossless, | 0 | | | Non-hierarchical | | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.4.70 | JPEG Lossless, | 0 | | | Non-hierarchical, | | | | SV1 | | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.4.80 | JPEG-LS Lossless | 0 | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.4.81 | JPEG-LS Lossy | 0 | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.4.90 | JPEG 2000 Lossless | 0 | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.4.91 | JPEG 2000 Lossy | 0 | +------------------------+--------------------+-----------------------+ | 1.2.840.10008.1.2.5 | RLE Lossless | 1 | +------------------------+--------------------+-----------------------+ .. versionchanged:: 2.1 JPEG-LS transfer syntaxes changed to *Planar Configuration* of 0 Parameters ---------- ds : dataset.Dataset The :class:`~pydicom.dataset.Dataset` containing the Image Pixel module corresponding to the data in `arr`. arr : numpy.ndarray The 1D array containing the pixel data. Returns ------- numpy.ndarray A reshaped array containing the pixel data. The shape of the array depends on the contents of the dataset: * For single frame, single sample data (rows, columns) * For single frame, multi-sample data (rows, columns, samples) * For multi-frame, single sample data (frames, rows, columns) * For multi-frame, multi-sample data (frames, rows, columns, samples) References ---------- * DICOM Standard, Part 3, :dcm:`Annex C.7.6.3.1` * DICOM Standard, Part 5, :dcm:`Section 8.2` """ if not HAVE_NP: raise ImportError("Numpy is required to reshape the pixel array.") nr_frames = get_nr_frames(ds) nr_samples = cast(int, ds.SamplesPerPixel) if nr_samples < 1: raise ValueError( f"Unable to reshape the pixel array as a value of {nr_samples} " "for (0028,0002) 'Samples per Pixel' is invalid." ) # Valid values for Planar Configuration are dependent on transfer syntax if nr_samples > 1: transfer_syntax = ds.file_meta.TransferSyntaxUID if transfer_syntax in [ "1.2.840.10008.1.2.4.50", "1.2.840.10008.1.2.4.57", "1.2.840.10008.1.2.4.70", "1.2.840.10008.1.2.4.80", "1.2.840.10008.1.2.4.81", "1.2.840.10008.1.2.4.90", "1.2.840.10008.1.2.4.91", ]: planar_configuration = 0 elif transfer_syntax in ["1.2.840.10008.1.2.5"]: planar_configuration = 1 else: planar_configuration = ds.PlanarConfiguration if planar_configuration not in [0, 1]: raise ValueError( "Unable to reshape the pixel array as a value of " f"{planar_configuration} for (0028,0006) 'Planar " "Configuration' is invalid." ) rows = cast(int, ds.Rows) columns = cast(int, ds.Columns) if nr_frames > 1: # Multi-frame if nr_samples == 1: # Single sample arr = arr.reshape(nr_frames, rows, columns) else: # Multiple samples, usually 3 if planar_configuration == 0: arr = arr.reshape(nr_frames, rows, columns, nr_samples) else: arr = arr.reshape(nr_frames, nr_samples, rows, columns) arr = arr.transpose(0, 2, 3, 1) else: # Single frame if nr_samples == 1: # Single sample arr = arr.reshape(rows, columns) else: # Multiple samples, usually 3 if planar_configuration == 0: arr = arr.reshape(rows, columns, nr_samples) else: arr = arr.reshape(nr_samples, rows, columns) arr = arr.transpose(1, 2, 0) return arr def set_pixel_data( ds: "Dataset", arr: "np.ndarray", photometric_interpretation: str, bits_stored: int, *, generate_instance_uid: bool = True, ) -> None: """Use an :class:`~numpy.ndarray` to set a dataset's *Pixel Data* and related Image Pixel module elements. .. versionadded:: 3.0 The following :dcm:`Image Pixel` module elements values will be added, updated or removed as necessary: * (0028,0002) *Samples per Pixel* using a value corresponding to `photometric_interpretation`. * (0028,0004) *Photometric Interpretation* from `photometric_interpretation`. * (0028,0006) *Planar Configuration* will be added and set to ``0`` if *Samples per Pixel* is > 1, otherwise it will be removed. * (0028,0008) *Number of Frames* from the array :attr:`~numpy.ndarray.shape`, however it will be removed if `arr` only contains a single frame. * (0028,0010) *Rows* and (0028,0011) *Columns* from the array :attr:`~numpy.ndarray.shape`. * (0028,0100) *Bits Allocated* from the array :class:`~numpy.dtype`. * (0028,0101) *Bits Stored* and (0028,0102) *High Bit* from `bits_stored`. * (0028,0103) *Pixel Representation* from the array :class:`~numpy.dtype`. In addition: * The *Transfer Syntax UID* will be set to *Explicit VR Little Endian* if it doesn't already exist or uses a compressed (encapsulated) transfer syntax. * If `generate_instance_uid` is ``True`` (default) then the *SOP Instance UID* will be added or updated. Parameters ---------- ds : pydicom.dataset.Dataset The little endian encoded dataset to be modified. arr : np.ndarray An array with :class:`~numpy.dtype` uint8, uint16, int8 or int16. The array must be shaped as one of the following: * (rows, columns) for a single frame of grayscale data. * (frames, rows, columns) for multi-frame grayscale data. * (rows, columns, samples) for a single frame of multi-sample data such as RGB. * (frames, rows, columns, samples) for multi-frame, multi-sample data. photometric_interpretation : str The value to use for (0028,0004) *Photometric Interpretation*. Valid values are ``"MONOCHROME1"``, ``"MONOCHROME2"``, ``"PALETTE COLOR"``, ``"RGB"``, ``"YBR_FULL"``, ``"YBR_FULL_422"``. bits_stored : int The value to use for (0028,0101) *Bits Stored*. Must be no greater than the number of bits used by the :attr:`~numpy.dtype.itemsize` of `arr`. generate_instance_uid : bool, optional If ``True`` (default) then add or update the (0008,0018) *SOP Instance UID* element with a value generated using :func:`~pydicom.uid.generate_uid`. """ from pydicom.dataset import FileMetaDataset from pydicom.pixels.common import PhotometricInterpretation as PI if (elem := ds.get(0x7FE00008, None)) or (elem := ds.get(0x7FE00009, None)): raise AttributeError( f"The dataset has an existing {elem.tag} '{elem.name}' element which " "indicates the (0008,0016) 'SOP Class UID' value is not suitable for a " f"dataset with 'Pixel Data'. The '{elem.name}' element should be deleted " "and the 'SOP Class UID' changed." ) if not hasattr(ds, "file_meta"): ds.file_meta = FileMetaDataset() tsyntax = ds.file_meta.get("TransferSyntaxUID", None) if tsyntax and not tsyntax.is_little_endian: raise NotImplementedError( f"The dataset's transfer syntax '{tsyntax.name}' is big-endian, " "which is not supported" ) # Make no changes to the dataset until after validation checks have passed! changes: dict[str, tuple[str, Any]] = {} shape, ndim, dtype = arr.shape, arr.ndim, arr.dtype if dtype.kind not in ("u", "i") or dtype.itemsize not in (1, 2): raise ValueError( f"Unsupported ndarray dtype '{dtype}', must be int8, int16, uint8 or " "uint16" ) # Use `photometric_interpretation` to determine *Samples Per Pixel* # Don't support retired (such as CMYK) or inappropriate values (such as YBR_RCT) interpretations: dict[str, int] = { PI.MONOCHROME1: 1, PI.MONOCHROME2: 1, PI.PALETTE_COLOR: 1, PI.RGB: 3, PI.YBR_FULL: 3, PI.YBR_FULL_422: 3, } try: nr_samples = interpretations[photometric_interpretation] except KeyError: raise ValueError( "Unsupported 'photometric_interpretation' value " f"'{photometric_interpretation}'" ) if nr_samples == 1: if ndim not in (2, 3): raise ValueError( f"An ndarray with '{photometric_interpretation}' data must have 2 or 3 " f"dimensions, not {ndim}" ) # ndim = 3 is (frames, rows, columns), else (rows, columns) changes["NumberOfFrames"] = ("+", shape[0]) if ndim == 3 else ("-", None) changes["Rows"] = ("+", shape[1] if ndim == 3 else shape[0]) changes["Columns"] = ("+", shape[2] if ndim == 3 else shape[1]) else: if ndim not in (3, 4): raise ValueError( f"An ndarray with '{photometric_interpretation}' data must have 3 or 4 " f"dimensions, not {ndim}" ) if shape[-1] != nr_samples: raise ValueError( f"An ndarray with '{photometric_interpretation}' data must have shape " f"(rows, columns, 3) or (frames, rows, columns, 3), not {shape}" ) # ndim = 3 is (rows, columns, samples), else (frames, rows, columns, samples) changes["NumberOfFrames"] = ("-", None) if ndim == 3 else ("+", shape[0]) changes["Rows"] = ("+", shape[0] if ndim == 3 else shape[1]) changes["Columns"] = ("+", shape[1] if ndim == 3 else shape[2]) if not 0 < bits_stored <= dtype.itemsize * 8: raise ValueError( f"Invalid 'bits_stored' value '{bits_stored}', must be greater than 0 and " "less than or equal to the number of bits for the ndarray's itemsize " f"'{arr.dtype.itemsize * 8}'" ) # Check values in `arr` are in the range allowed by `bits_stored` actual_min, actual_max = arr.min(), arr.max() allowed_min = 0 if dtype.kind == "u" else -(2 ** (bits_stored - 1)) allowed_max = ( 2**bits_stored - 1 if dtype.kind == "u" else 2 ** (bits_stored - 1) - 1 ) if actual_min < allowed_min or actual_max > allowed_max: raise ValueError( f"The range of values in the ndarray [{actual_min}, {actual_max}] is " f"greater than that allowed by the 'bits_stored' value [{allowed_min}, " f"{allowed_max}]" ) changes["SamplesPerPixel"] = ("+", nr_samples) changes["PlanarConfiguration"] = ("+", 0) if nr_samples > 1 else ("-", None) changes["PhotometricInterpretation"] = ("+", photometric_interpretation) changes["BitsAllocated"] = ("+", dtype.itemsize * 8) changes["BitsStored"] = ("+", bits_stored) changes["HighBit"] = ("+", bits_stored - 1) changes["PixelRepresentation"] = ("+", 0 if dtype.kind == "u" else 1) # Update the Image Pixel module elements for keyword, (operation, value) in changes.items(): if operation == "+": setattr(ds, keyword, value) elif operation == "-" and keyword in ds: del ds[keyword] # Part 3, C.7.6.3.1.2: YBR_FULL_422 data needs to be downsampled if photometric_interpretation == PI.YBR_FULL_422: # Y1 B1 R1 Y2 B1 R1 -> Y1 Y2 B1 R1 arr = arr.ravel() out = np.empty(arr.size // 3 * 2, dtype=dtype) out[::4] = arr[::6] # Y1 out[1::4] = arr[3::6] # Y2 out[2::4] = arr[1::6] # B out[3::4] = arr[2::6] # R arr = out # Update the Pixel Data data = arr.tobytes() ds.PixelData = data if len(data) % 2 == 0 else b"".join((data, b"\x00")) elem = ds["PixelData"] elem.VR = VR.OB if ds.BitsAllocated <= 8 else VR.OW elem.is_undefined_length = False ds._pixel_array = None ds._pixel_id = {} if not tsyntax or tsyntax.is_compressed: ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian if generate_instance_uid: instance_uid = generate_uid() ds.SOPInstanceUID = instance_uid ds.file_meta.MediaStorageSOPInstanceUID = instance_uid def unpack_bits(src: bytes, as_array: bool = True) -> "np.ndarray | bytes": """Unpack the bit-packed data in `src`. Suitable for use when (0028,0011) *Bits Allocated* or (60xx,0100) *Overlay Bits Allocated* is 1. If `NumPy `_ is available then it will be used to unpack the data, otherwise only the standard library will be used, which is about 20 times slower. .. versionchanged:: 2.3 Added the `as_array` keyword parameter, support for unpacking without NumPy, and added :class:`bytes` as a possible return type Parameters ---------- src : bytes The bit-packed data. as_array : bool, optional If ``False`` then return the unpacked data as :class:`bytes`, otherwise return a :class:`numpy.ndarray` (default, requires NumPy). Returns ------- bytes or numpy.ndarray The unpacked data as an :class:`numpy.ndarray` (if NumPy is available and ``as_array == True``) or :class:`bytes` otherwise. Raises ------ ValueError If `as_array` is ``True`` and NumPy is not available. References ---------- DICOM Standard, Part 5, :dcm:`Section 8.1.1` and :dcm:`Annex D` """ if HAVE_NP: arr = np.frombuffer(src, dtype="u1") arr = np.unpackbits(arr, bitorder="little") return arr if as_array else arr.tobytes() if as_array: raise ValueError("unpack_bits() requires NumPy if 'as_array = True'") return b"".join(map(_UNPACK_LUT.__getitem__, src)) pydicom-pydicom-20aa4b7/src/pydicom/py.typed000066400000000000000000000000001515706620200211460ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/sequence.py000066400000000000000000000061571515706620200216540ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Define the Sequence class, which contains a sequence DataElement's items. Sequence is a list of pydicom Dataset objects. """ from typing import cast, Any, TypeVar from collections.abc import Iterable from pydicom.dataset import Dataset from pydicom.multival import ConstrainedList # Python 3.11 adds typing.Self, until then... Self = TypeVar("Self", bound="Sequence") class Sequence(ConstrainedList[Dataset]): """Class to hold multiple :class:`~pydicom.dataset.Dataset` in a :class:`list`.""" def __init__(self, iterable: Iterable[Dataset] | None = None) -> None: """Initialize a list of :class:`~pydicom.dataset.Dataset`. Parameters ---------- iterable : Iterable[Dataset] | None An iterable object (e.g. :class:`list`, :class:`tuple`) containing :class:`~pydicom.dataset.Dataset`. If not used then an empty :class:`Sequence` is generated. """ # We add this extra check to throw a relevant error. Without it, the # error will be simply that a Sequence must contain Datasets (since a # Dataset IS iterable). This error, however, doesn't inform the user # that the actual issue is that their Dataset needs to be INSIDE an # iterable object if isinstance(iterable, Dataset): raise TypeError("The Sequence constructor requires an iterable") # If True, SQ element uses an undefined length of 0xFFFFFFFF self.is_undefined_length: bool super().__init__(iterable) def extend(self, val: Iterable[Dataset]) -> None: """Extend the :class:`~pydicom.sequence.Sequence` using an iterable of :class:`~pydicom.dataset.Dataset` instances. """ if isinstance(val, Dataset): raise TypeError("An iterable of 'Dataset' is required") super().extend(val) def __iadd__(self: Self, other: Iterable[Dataset]) -> Self: """Implement Sequence() += [Dataset()].""" if isinstance(other, Dataset): raise TypeError("An iterable of 'Dataset' is required") return super().__iadd__(other) def __setitem__(self, index: slice | int, val: Iterable[Dataset] | Dataset) -> None: """Add item(s) to the Sequence at `index`.""" if isinstance(index, slice): if isinstance(val, Dataset): raise TypeError("Can only assign an iterable of 'Dataset'") super().__setitem__(index, val) else: super().__setitem__(index, cast(Dataset, val)) def __str__(self) -> str: """String description of the Sequence.""" return f"[{''.join([str(x) for x in self])}]" def __repr__(self) -> str: """String representation of the Sequence.""" return f"<{self.__class__.__name__}, length {len(self)}>" @staticmethod def _validate(item: Any) -> Dataset: """Check that `item` is a :class:`~pydicom.dataset.Dataset` instance.""" if isinstance(item, Dataset): return item raise TypeError("Sequence contents must be 'Dataset' instances.") pydicom-pydicom-20aa4b7/src/pydicom/sr/000077500000000000000000000000001515706620200201055ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/sr/__init__.py000066400000000000000000000001371515706620200222170ustar00rootroot00000000000000from pydicom.sr.codedict import codes, Collection, Concepts from pydicom.sr.coding import Code pydicom-pydicom-20aa4b7/src/pydicom/sr/_cid_dict.py000066400000000000000000035254471515706620200224040ustar00rootroot00000000000000# Auto-generated by generate_concept_dicts.py. # Dict with cid number as keys; value format is: # {scheme designator: # scheme_designator: ...} name_for_cid = {} cid_concepts = {} name_for_cid[2] = "AnatomicModifier" cid_concepts[2] = { "DCM": ["Median"], "SCT": [ "Peripheral", "Basal", "Bilateral", "Right", "Surface", "Caudal", "Posterior", "Vertical", "Sagittal", "Left", "External", "Unilateral", "Superior", "IntraArticular", "Edge", "Distal", "Proximal", "Axial", "Marginal", "Preaxial", "Deep", "Subcapsular", "Lateral", "Inferior", "Capsular", "Anterior", "Intermediate", "Transverse", "Cephalic", "Anterolateral", "Central", "Hilar", "Apical", "ExtraArticular", "Postaxial", "Horizontal", "Posterolateral", "Afferent", "Superficial", "Gutter", "Coronal", "Efferent", "Internal", "Medial", "Longitudinal", ], } name_for_cid[4] = "AnatomicRegion" cid_concepts[4] = { "SCT": [ "LeftHypochondriacRegion", "SubclavianVein", "ExternalIliacArtery", "BoneOfLowerLimb", "TruncusCoeliacus", "BasilarArtery", "ParanasalSinus", "ApexOfRightVentricle", "WristJoint", "Phantom", "FontanelOfSkull", "Mouth", "GenicularArtery", "LeftVentricleInflow", "SigmoidColon", "PharynxAndLarynx", "CarotidArtery", "Cheek", "UmbilicalArtery", "PrimitiveAorta", "LeftVentricleOutflowTract", "RadialArtery", "Intracranial", "RightFemoralArtery", "JawRegion", "LeftFemoralArtery", "LumenOfBloodVessel", "Calcaneus", "EndoEsophageal", "AntecubitalVein", "Mandible", "Parasternal", "BroadLigament", "PatentDuctusArteriosus", "MesentericVein", "IntraThoracic", "Pelvis", "PulmonaryVein", "CoronaryArtery", "UpperLimb", "ExternalIliacVein", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "SubclavianArtery", "Flank", "Maxilla", "Lung", "SacroCoccygealSpine", "OphthalmicArtery", "Nose", "PancreaticDuct", "Hand", "BrachialVein", "RightUpperQuadrantOfAbdomen", "Eye", "Prostate", "ElbowJoint", "HepaticArtery", "Back", "FacialBones", "Sternum", "PeronealArtery", "NeckAndChest", "RightVentricleOutflowTract", "Duodenum", "RightHypochondriacRegion", "SuperiorLeftPulmonaryVein", "BileDuct", "SystemicCollateralArteryToLung", "UpperOuterQuadrantOfBreast", "AbdomenAndPelvis", "LumbarArtery", "PancreaticDuctAndBileDuctSystems", "ApexOfLeftVentricle", "Cornea", "Larynx", "PulmonaryArtery", "FemoralArtery", "Ovary", "IliacVein", "Skull", "EndoUrethral", "Thyroid", "Head", "AdrenalGland", "AcromioclavicularJoint", "UmbilicalRegion", "Calyx", "CongenitalCoronaryArteryFistulaToRightVentricle", "PosteriorMedialTributary", "SternoclavicularJoint", "ThoracoLumbarSpine", "EndoNasopharyngeal", "EsophagusStomachAndDuodenum", "Breast", "Neck", "Finger", "Submental", "CranialVenousSystem", "PoplitealFossa", "PulmonaryArteryConduit", "RightAtrium", "RightVentricle", "CommonVentricle", "Coccyx", "HeadAndNeck", "Hypopharynx", "Ventricle", "Uterus", "TemporomandibularJoint", "TracheaAndBronchus", "HepaticVein", "Testis", "InternalMammaryArtery", "Bladder", "Vulva", "LargeIntestine", "Forearm", "Face", "Spine", "Foot", "NeckChestAndAbdomen", "ExternalCarotidArtery", "SuperiorMesentericArtery", "MuscleOfUpperLimb", "PosteriorTibialArtery", "FemoralVein", "RightAuricularAppendage", "IntraAbdominopelvic", "Zygoma", "InnominateVein", "Abdomen", "SuperficialFemoralArtery", "UterusAndFallopianTubes", "LowerLimb", "PosteriorCommunicationArtery", "JuxtaposedAtrialAppendage", "AorticArch", "VertebralColumnAndCranium", "Jejunum", "ChestAbdomenAndPelvis", "AbdominalAorta", "EndoCardiac", "TarsalJoint", "Scalp", "CephalicVein", "Tongue", "LingualArtery", "GastricVein", "CongenitalCoronaryArteryFistulaToRightAtrium", "Fibula", "OrbitalStructure", "Penis", "InferiorCardiacVein", "Baffle", "LacrimalArtery", "OccipitalArtery", "EndoVascular", "Sclera", "Brain", "SystemicVenousAtrium", "Parathyroid", "LiverAndBiliaryStructure", "AnomalousPulmonaryVein", "SuprasternalNotch", "Perineum", "EndoRectal", "Femur", "AnteriorCardiacVein", "Pancreas", "LeftAtrium", "CerebralArtery", "Scapula", "InferiorMesentericArtery", "EndoRenal", "GreatSaphenousVein", "OmentalBursa", "BladderAndUrethra", "CervicalSpine", "IliacAndOrFemoralArtery", "InternalCarotidArtery", "EndoUreteric", "Sacrum", "SmallIntestine", "InternalAuditoryCanal", "SuperiorRightPulmonaryVein", "IntraArticular", "RenalPelvis", "InferiorVenaCava", "RightPulmonaryArtery", "Axilla", "Retroperitoneum", "Thymus", "VenousNetwork", "CommonAtrium", "Humerus", "Ilium", "AorticFistula", "LeftLumbarRegion", "SuperiorThyroidArtery", "IliacArtery", "NasalBone", "AnteriorTibialArtery", "Cervix", "TruncusArteriosusCommunis", "EndoArterial", "CommonCarotidArtery", "Joint", "Buttock", "SubmandibularArea", "OpticCanal", "Aorta", "SuperficialTemporalArtery", "EndoVenous", "MastoidBone", "CongenitalCoronaryArteryFistulaToLeftVentricle", "NeckChestAbdomenAndPelvis", "Thigh", "Spleen", "ChestAndAbdomen", "InferiorRightPulmonaryVein", "Trachea", "BodyConduit", "LowerOuterQuadrantOfBreast", "AnkleJoint", "EndoVesical", "Mediastinum", "Cerebellum", "RightVentricleInflow", "MesentericArtery", "PoplitealArtery", "LeftLowerQuadrantOfAbdomen", "UpperUrinaryTract", "PulmonaryVenousAtrium", "Bronchus", "SesamoidBonesOfFoot", "InternalIliacArtery", "PulmonaryChamberOfCorTriatriatum", "CommonBileDuct", "SuperiorVenaCava", "UlnarArtery", "LeftVentricle", "AnteriorSpinalArtery", "LumbarRegion", "Omentum", "AnusRectumAndSigmoidColon", "SplenicVein", "Colon", "SubmandibularGland", "ThoracicSpine", "SaphenousVein", "Gallbladder", "InnominateArtery", "SplenicArtery", "RenalArtery", "HipJoint", "UpperArm", "Extremity", "Thorax", "FacialArtery", "EpigastricRegion", "AzygosVein", "BrachialArtery", "CervicoThoracicSpine", "Liver", "RightLumbarRegion", "Hip", "Rib", "BoneOfUpperLimb", "EndoVaginal", "PelvisAndLowerExtremities", "LowerInnerQuadrantOfBreast", "Clavicle", "ParotidGland", "CommonFemoralArtery", "IntraPelvic", "Stomach", "Subxiphoid", "UpperInnerQuadrantOfBreast", "AnteriorCommunicatingArtery", "CongenitalCoronaryArteryFistulaToLeftAtrium", "RightInguinalRegion", "ThoracicAorta", "VenaCava", "CoronarySinus", "AxillaryArtery", "LeftPulmonaryArtery", "BiliaryTract", "ApexOfLung", "Ileum", "Atrium", "Knee", "VertebralArtery", "RightLowerQuadrantOfAbdomen", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "InternalJugularVein", "EyeRegion", "LacrimalArteryOfRightEye", "SacroiliacJoint", "Anus", "UmbilicalVein", "EntireBody", "CommonIliacVein", "InguinalRegion", "EndoNasal", "HypogastricRegion", "Thumb", "LumbarSpine", "GreatCardiacVein", "PrimitivePulmonaryArtery", "SellaTurcica", "PortalVein", "Scrotum", "InferiorLeftPulmonaryVein", "LowerLeg", "RenalVein", "BoydPerforatingVein", "Ear", "SupraclavicularRegionOfNeck", "CommonIliacArtery", "Toe", "Shoulder", "SpinalCord", "CardiacSeptumProsthesis", "LeftAuricularAppendage", "CircleOfWillis", "LeftInguinalRegion", "Eyelid", "MuscleOfLowerLimb", "LeftUpperQuadrantOfAbdomen", "AscendingAorta", "HunterianPerforatingVein", "HypochondriacRegion", "ProfundaFemorisArtery", "Pharynx", "ExternalAuditoryCanal", "AxillaryVein", "Patella", "Nasopharynx", "OccipitalVein", "LumboSacralSpine", "DoddPerforatingVein", ] } name_for_cid[5] = "TransducerApproach" cid_concepts[5] = { "SCT": [ "Peripheral", "Ascending", "Superior", "FourthIntercostalSpace", "Distal", "PiaMater", "Proximal", "Lateral", "Inferior", "Capsular", "Subcostal", "WaterBagProsthesisForImagingProcedure", "EleventhIntercostalSpace", "FifthIntercostalSpace", "SalineBagProsthesisForImagingProcedure", "MidLongitudinal", "FirstIntercostalSpace", "Intercostal", "EighthIntercostalSpace", "DuraMater", "Internal", "Descending", "Midline", "Right", "Surface", "Caudal", "Posterior", "Left", "External", "SixthIntercostalSpace", "SecondIntercostalSpace", "Parasagittal", "Intraluminal", "Anterior", "Transverse", "GelProsthesisForImagingProcedure", "Cranial", "NinthIntercostalSpace", "Central", "SeventhIntercostalSpace", "Apical", "Parenchyma", "ThirdIntercostalSpace", "SubcutaneousTissue", "Lumen", "ExternalProsthesisForSonographicProcedureStandOff", "ContactWith", "Medial", "TenthIntercostalSpace", ] } name_for_cid[6] = "TransducerOrientation" cid_concepts[6] = { "SCT": [ "FiveChamber", "LongAxis", "OffAxis", "Parasagittal", "FourChamber", "ShortAxis", "TwoChamber", "Oblique", "Sagittal", "Coronal", "Transverse", "Longitudinal", ] } name_for_cid[7] = "UltrasoundBeamPath" cid_concepts[7] = { "SCT": [ "TransGastric", "TransUrethral", "TransMural", "TransHepatic", "TransAbdominal", "TransVaginal", "TransThecal", "TransVesical", "TransSplenic", "TransPleural", "TransRectal", "TransEsophageal", "TransPancreatic", "TransRenal", "TransOrbital", "TransTemporal", ] } name_for_cid[8] = "AngiographicInterventionalDevice" cid_concepts[8] = { "DCM": ["Sphere"], "SCT": [ "RotationalAtherectomyDevice", "GuidingCatheter", "Glue", "EmbolizationBall", "PercutaneousTransluminalAngioplastyBalloon", "AtherectomyDevice", "EmbolizationCoil", "EmbolizationParticulate", "Laser", "Catheter", "MeasuringRuler", "Stent", "DetachableBalloon", ], } name_for_cid[9] = "ImageGuidedTherapeuticProcedure" cid_concepts[9] = { "SCT": [ "Thoracentesis", "StentPlacement", "CatheterManipulation", "OcclusionOfCatheter", "UltrasonicGuidanceForAmniocentesis", "Amniocentesis", "AtherectomyByRotaryCutter", "PercutaneousRemovalOfIntravascularForeignBody", "AmnioinfusionInjectionOfAmnion", "Irrigation", "Vasoconstriction", "Fetocide", "PercutaneousInsertionOfIntravascularFilter", "IntraArterialInfusionOfThrombolyticAgent", "RemovalOfCatheter", "AtherectomyByLaser", "CatheterReplacement", "Catheterization", "IntrauterineCordocentesis", "TranscatheterTherapyForEmbolization", "Biopsy", "Atherectomy", "SelectiveEmbolizationOfArtery", "RemovalOfForeignBody", "ProstaglandinInjection", "PercutaneousTransluminalBalloonAngioplasty", "FailedAttemptedProcedure", "IntrauterineTransfusion", "TranscatheterDeploymentOfDetachableBalloon", "BreechVersionObstetricalVersion", "Vasodilatation", ] } name_for_cid[10] = "InterventionalDrug" cid_concepts[10] = { "NCIt": ["CardiotonicAgent"], "SCT": [ "Nitroglycerin", "Streptokinase", "HemostaticAgent", "AntihemophilicFactorPreparation", "UrokinasePreparation", "Verapamil", "Propranolol", "Thromboplastin", "LidocaineHydrochloride", "AntiHeparinAgent", "Vasodilator", "DiureticAgent", "GlucagonPreparation", "ThrombolyticAgent", "Fibrinolysin", "Ethanol", "Nifedipine", "Coagulant", "AnticoagulantAgent", "Warfarin", "AntiarrhythmicDrug", "InotropicAgent", "Heparin", "BetaBlockerContainingProduct", "ThrombinPreparation", "CentrallyActingHypotensiveAgent", "ProtamineSulfate", "ProstaglandinE1", "AlphaAdrenergicBlockingAgent", "Epinephrine", "Phentolamine", "TolazolineHydrocholoride", "Atropine", "Antihistamine", "Quinidine", "Dextran", "Papaverine", "MethyleneBlue", "LidocaineContainingProduct", "Digoxin", "CardiacAdrenergicBlockingAgent", "HypotensiveAgent", "AstringentDrug", "HumanFibrinogen", ], } name_for_cid[11] = "AdministrationRoute" cid_concepts[11] = { "DCM": ["RetroOrbitalRoute"], "NCIt": ["ExtraluminalRoute", "IntraepithelialRoute", "TransluminalRoute"], "SCT": [ "IntraluminalRoute", "TopicalRoute", "IntrathecalRoute", "OralRoute", "IntramuscularRoute", "IntravenousRoute", "SubcutaneousRoute", "IntracorpusCavernosumRoute", "ByInhalation", "IntraArterialRoute", "IntraArticularRoute", "IntracardiacRoute", "IntraventricularRouteCardiac", "IntracutaneousRoute", "IntramedullaryRoute", "NasalRoute", "PerRectum", "IntratumorRoute", "IntraperitonealRoute", "VaginalRoute", "IntracoronaryRoute", ], } name_for_cid[12] = "ImagingContrastAgent" cid_concepts[12] = { "RADLEX": ["NonIonicIodinatedContrastAgent", "IonicIodinatedContrastAgent"], "RXNORM": ["MangafodipirTrisodium"], "SCT": [ "Iophendylate", "Iodipamide", "Bunamiodyl", "GadobenateDimeglumine", "Gadodiamide", "Gadofosveset", "Iohexol", "SodiumAcetrizoate", "Propyliodone", "ContrastAgent", "GadoterateMeglumine", "Iothalamate", "MeglumineDiatrizoate", "Gadobutrol", "Diatrizoate", "NonRadiopaqueMedium", "ChloriodizedOil", "Air", "Iopamidol", "Iopromide", "IopanoicAcid", "Metrizoate", "SodiumIodomethamate", "MeglumineIodipamide", "GadopentetateDimeglumine", "Ioxilan", "Ioversol", "Iodixanol", "Metrizamide", "Ipodate", "BariumSulfate", "Oxygen", "SodiumTyropanoate", "Water", "IodoalphionicAcid", "Iodopyracet", "SodiumDiprotrizoate", "Iodophthalein", "GadoxetateDisodium", "Gadoversetamide", "IodamideMeglumine", "SodiumIodipamide", "Gadoteridol", "IophenoxicAcid", "Ioxaglate", "IodizedOil", "CarbonDioxide", "GadoliniumContainingProduct", ], } name_for_cid[13] = "ImagingContrastAgentIngredient" cid_concepts[13] = { "SCT": [ "Gadolinium", "Barium", "Iodine", "Iron", "CarbonDioxide", "Oxygen", "Air", "Water", "Xenon", ] } name_for_cid[18] = "RadiopharmaceuticalIsotope" cid_concepts[18] = { "DCM": ["_191mIridium"], "NCIt": ["_166Holmium"], "SCT": [ "_22Sodium", "_113mIndium", "_42Potassium", "_97Ruthenium", "_201Thallium", "_188Rhenium", "_198Gold", "_199Gold", "_75Selenium", "_153Gadolinium", "_24Sodium", "_153Samarium", "_57Cobalt", "_59Iron", "_67Gallium", "_18Fluorine", "_64Copper", "_32Phosphorus", "_111Indium", "_186Rhenium", "_81mKrypton", "_178Tantalum", "_43Potassium", "_67Copper", "_125Iodine", "_89Strontium", "_90Yttrium", "_127Xenon", "_87mStrontium", "_203Lead", "_169Ytterbium", "_223Radium", "_14Carbon", "_133Xenon", "_177Lutetium", "_51Chromium", "_85Strontium", "_58Cobalt", "_99mTechnetium", "_133Barium", "_123Iodine", "_60Cobalt", "_85Krypton", "_131Iodine", ], } name_for_cid[19] = "PatientOrientation" cid_concepts[19] = {"NCIt": ["Erect"], "SCT": ["Recumbent", "SemiErect"]} name_for_cid[20] = "PatientOrientationModifier" cid_concepts[20] = { "SCT": [ "CurledUp", "SemiProne", "Anatomical", "Supine", "LateralDecubitus", "KneeChest", "Kneeling", "Lithotomy", "Prone", "Standing", "LeftLateralDecubitus", "StoopedOver", "RightLateralDecubitus", "InverseTrendelenburg", "Sitting", "Frog", "Trendelenburg", "Lordotic", ] } name_for_cid[21] = "PatientEquipmentRelationship" cid_concepts[21] = { "DCM": ["LeftFirst", "RightFirst", "PosteriorFirst", "AnteriorFirst"], "SCT": ["Headfirst", "FeetFirst", "TransverseBodyPosition", "ObliqueBodyPosition"], } name_for_cid[23] = "CranioCaudadAngulation" cid_concepts[23] = {"SCT": ["Caudal", "Cephalic"]} name_for_cid[25] = "Radiopharmaceutical" cid_concepts[25] = { "DCM": ["Lutetium177NAcetylaspartylglutamate", "IodinatedI125DPA713"], "MSH": ["Technetium99mTRODAT1"], "NCIt": ["Technetium99mTrofolastat"], "SCT": [ "TechnetiumTc99mTetrofosmin", "IodinatedI131Albumin", "FerrousChlorideFe59", "Indium113mChloride", "SodiumIodideI131", "Chromium51Chloride", "Indium111RedCellLabel", "DiagnosticRadioisotope", "SodiumIodideI123", "Carbon14DXylose", "Iodine131Polyvinylpyrrolidone", "TechnetiumTc99mSulfurColloid", "TechnetiumTc99mTeboroxime", "Technetium99mPhytate", "TechnetiumTc99mIronAscorbate", "StrontiumNitrateSr87", "Iodine1233IodobenzylguanidineMIBG", "TechnetiumTc99mSestamibi", "RoseBengalSodiumI131", "Copper64Acetate", "Indium113mPentetate", "TechnetiumTc99mMedronate", "TechnetiumTc99mSuccimer", "TechnetiumTc99mSerumAlbumin", "IodinatedI131AggregatedAlbumin", "SodiumFluorideF18", "SodiumPertechnetateTc99m", "StrontiumNitrateSr85", "TechnetiumTc99mDisofenin", "Indium111Pentetreotide", "TechnetiumTc99mMebrofenin", "IodinatedI131GammaGlobulin", "Radium223Dichloride", "Indium111Chloride", "SodiumChromateCr51", "TechnetiumTc99mStannousEtidronate", "FluorodeoxyglucoseF18", "Indium111FeOHGreaterThan3LesserThan", "TechnetiumTc99mLidofenin", "SelenomethionioneSe75", "FibrinogenI123", "TechnetiumTc99mTaggedRedCells", "TechnetiumTc99mOxidronate", "IodinatedI125Povidone", "IodohippurateI123Sodium", "Iodine1313IodobenzylguanidineMIBG", "TechnetiumTc99cAlbuminMicrospheres", "StrontiumChlorideSr87", "Technetium99mLabeledCarbon", "Selenium75HCAT", "TechnetiumTc99mDepreotide", "StrontiumChlorideSr85", "ChromicPhosphateP32", "TechnetiumTc99mPyrophosphate", "IothalamateSodiumI125", "CyanocobalaminCo57", "Indium111Transferrin", "CyanocobalaminCo58", "Technetium99mStannousColloid", "Yttrium90Microspheres", "Indium111Oxyquinoline", "Indium111Pentetate", "Copper67Ceruloplasmin", "Xenon133Gas", "Technetium99mMercaptoacetylTriglycineMAG3", "SodiumChlorideNa24", "Carbon14Triolein", "Krypton81m", "IodohippurateI131Sodium", "StrontiumChlorideSr89", "Copper64Versenate", "IodohippurateI125Sodium", "PotassiumCarbonateK42", "IofetamineI123Hydrochloride", "TechnetiumTc99mPentetate", "IodocholesterolI131", "Chromium51Albumin", "TechnetiumTc99mBicisate", "Iodine123154Iodophenyl3RSMethylpentadecanoicAcid", "TechnetiumTc99mMicroaggregatedAlbumin", "TechnetiumTc99mExametazime", "Indium111CapromabPendetide", "TherapeuticRadioisotope", "Technetium99mNPyridoxyl5Methyltryptophan", "TechnetiumTc99mSodiumGlucoheptonate", "PotassiumChlorideK42", "PentetateCalciumTrisodiumYb169", "FerrousCitrateFe59", "Technetium99mGalactosylHumanSerumAlbuminDiethylenetriamine", "CyanocobalaminCo60", "OleicAcidI125", "TechnetiumTc99mAggregatedAlbumin", "IodinatedI125SodiumIodine", "SodiumPhosphateP32", "PotassiumChlorideK43", "ThallousChlorideTl201", "Lutetium177DOTATATE", "IodinatedI125HumanSerumAlbumin", "IronFe59LabeledDextran", "IodinatedI125Albumin", "IoflupaneI123", "Indium113mBleomycin", "FerrousSulfateFe59", "Gallium67Citrate", "TechnetiumTc99mNSubstitutedIminodiacetate", "SodiumChlorideNa22", ], } name_for_cid[26] = "NuclearMedicineProjection" cid_concepts[26] = { "SCT": [ "MedialLateralEmissiveProjection", "SagittalObliqueAxisEmissiveProjection", "LeftLateralEmissiveProjection", "VerticalLongAxis", "HorizontalLongAxis", "Sagittal", "RightPosteriorObliqueEmissiveProjection", "LeftAnteriorObliqueEmissiveProjection", "PosteriorProjection", "AnteriorProjection", "Axial", "LateralMedialEmissiveProjection", "RightAnteriorObliqueEmissiveProjection", "LeftPosteriorObliqueEmissiveProjection", "ShortAxis", "MedioLateralObliqueEmissiveProjection", "Lateral", "RightLateralEmissiveProjection", "LateroMedialObliqueEmissiveProjection", "Coronal", "ObliqueAxialEmissiveProjection", "Transverse", ] } name_for_cid[27] = "BasicCardiacView" cid_concepts[27] = {"SCT": ["VerticalLongAxis", "ShortAxis", "HorizontalLongAxis"]} name_for_cid[29] = "AcquisitionModality" cid_concepts[29] = { "DCM": [ "BoneMineralDensitometry", "Electrooculography", "SlideMicroscopy", "OphthalmicPhotography", "Electrocardiography", "GeneralMicroscopy", "XRayAngiography", "ExternalCameraPhotography", "Dermoscopy", "IntravascularUltrasound", "ComputedRadiography", "ComputedTomography", "Photoacoustic", "OpticalSurfaceScanner", "Thermography", "Lensometry", "OphthalmicTomographyEnFace", "HemodynamicWaveform", "OpticalCoherenceTomography", "UltrasoundBoneDensitometry", "Diaphanography", "PositronEmissionTomography", "CardiacElectrophysiology", "LaserScan", "PanoramicXRay", "OphthalmicMapping", "OphthalmicTomographyBScanVolumeAnalysis", "OphthalmicVisualField", "DigitalRadiography", "OphthalmicTomography", "Mammography", "Ultrasound", "Electromyography", "IntravascularOpticalCoherenceTomography", "MagneticResonance", "IntraOralRadiography", "Electroencephalography", "RTImage", "VisualAcuity", "RespiratoryWaveform", "Endoscopy", "Autorefraction", "PositionSensor", "RadiographicImaging", "Radiofluoroscopy", "Keratometry", "OphthalmicAxialMeasurements", "NuclearMedicine", "BiomagneticImaging", "SubjectiveRefraction", "ConfocalMicroscopy", ] } name_for_cid[30] = "DICOMDevice" cid_concepts[30] = { "DCM": [ "BoneMineralDensitometry", "Electrooculography", "SlideMicroscopy", "OphthalmicPhotography", "FilmDigitizer", "Workstation", "Electrocardiography", "GeneralMicroscopy", "XRayAngiography", "ExternalCameraPhotography", "Dermoscopy", "IntravascularUltrasound", "ComputedRadiography", "ComputationServer", "MediaCreationDevice", "ComputedTomography", "Photoacoustic", "OpticalSurfaceScanner", "Thermography", "Lensometry", "OphthalmicTomographyEnFace", "HemodynamicWaveform", "OpticalCoherenceTomography", "_3DManufacturingModelingSystem", "UltrasoundBoneDensitometry", "Diaphanography", "PositronEmissionTomography", "CardiacElectrophysiology", "LaserScan", "HardCopyPrintServer", "PanoramicXRay", "OphthalmicMapping", "OphthalmicTomographyBScanVolumeAnalysis", "OphthalmicVisualField", "DigitalRadiography", "OphthalmicTomography", "Mammography", "Ultrasound", "Electromyography", "IntravascularOpticalCoherenceTomography", "DepartmentSystemScheduler", "ProcedureLogging", "MagneticResonance", "IntraOralRadiography", "ComputerAssistedDetectionDiagnosis", "Electroencephalography", "RTImage", "VisualAcuity", "RespiratoryWaveform", "Endoscopy", "Autorefraction", "PositionSensor", "RadiographicImaging", "Radiofluoroscopy", "Keratometry", "Archive", "ImageCapture", "AutomatedSlideStainer", "OphthalmicAxialMeasurements", "NuclearMedicine", "RadiationTherapyDevice", "BiomagneticImaging", "SubjectiveRefraction", "ConfocalMicroscopy", ] } name_for_cid[31] = "AbstractPrior" cid_concepts[31] = { "DCM": [ "AtLastAppointment", "OnDischargeFromUnit", "OnDischarge", "PostIntervention", "PreIntervention", "OnAdmissionToUnit", ], "SCT": [ "Intraoperative", "PreOperative", "OnAdmission", "PreAdmission", "PreDose", "PostOperative", "PostDose", ], } name_for_cid[32] = "NonAcquisitionModality" cid_concepts[32] = { "DCM": [ "Registration", "Segmentation", "TextureMap", "BasicVoiceAudio", "RTDose", "DocumentProducer", "StereometricRelationship", "RTTreatmentRecord", "HardCopy", "CTProtocol", "RTPlan", "AutomatedSlideStainer", "StructuredReportDocument", "SpatialFiducialsProducer", "ModelFor3DManufacturing", "RTStructureSet", "Plan", "PresentationState", "Other", "KeyObjectSelection", "IntraocularLensCalculation", "ContentAssessmentResult", "RealWorldValueMap", ] } name_for_cid[33] = "Modality" cid_concepts[33] = { "DCM": [ "BoneMineralDensitometry", "Electrooculography", "SlideMicroscopy", "StructuredReportDocument", "SpatialFiducialsProducer", "OphthalmicPhotography", "Other", "KeyObjectSelection", "Electrocardiography", "GeneralMicroscopy", "XRayAngiography", "IntraocularLensCalculation", "ExternalCameraPhotography", "ContentAssessmentResult", "Dermoscopy", "IntravascularUltrasound", "ComputedRadiography", "ComputedTomography", "Photoacoustic", "OpticalSurfaceScanner", "Thermography", "Registration", "Lensometry", "TextureMap", "RTDose", "OphthalmicTomographyEnFace", "HardCopy", "RTPlan", "HemodynamicWaveform", "OpticalCoherenceTomography", "UltrasoundBoneDensitometry", "ModelFor3DManufacturing", "Diaphanography", "PresentationState", "PositronEmissionTomography", "CardiacElectrophysiology", "LaserScan", "PanoramicXRay", "OphthalmicMapping", "OphthalmicTomographyBScanVolumeAnalysis", "OphthalmicVisualField", "DigitalRadiography", "OphthalmicTomography", "DocumentProducer", "RTTreatmentRecord", "Mammography", "Ultrasound", "Electromyography", "IntravascularOpticalCoherenceTomography", "RTStructureSet", "MagneticResonance", "IntraOralRadiography", "Electroencephalography", "RTImage", "VisualAcuity", "RespiratoryWaveform", "Endoscopy", "RealWorldValueMap", "Autorefraction", "PositionSensor", "Segmentation", "RadiographicImaging", "Radiofluoroscopy", "BasicVoiceAudio", "Keratometry", "StereometricRelationship", "CTProtocol", "AutomatedSlideStainer", "OphthalmicAxialMeasurements", "NuclearMedicine", "Plan", "BiomagneticImaging", "SubjectiveRefraction", "ConfocalMicroscopy", ] } name_for_cid[42] = "NumericValueQualifier" cid_concepts[42] = { "DCM": [ "ValueUnknown", "NegativeInfinity", "ValueIndeterminate", "NotANumber", "DivideByZero", "PositiveInfinity", "Overflow", "Underflow", "MeasurementNotAttempted", "MeasurementFailure", "ValueOutOfRange", "CalculationFailure", ] } name_for_cid[43] = "NumericValueFailureQualifier" cid_concepts[43] = { "DCM": [ "NegativeInfinity", "NotANumber", "DivideByZero", "PositiveInfinity", "Overflow", "Underflow", "MeasurementFailure", "ValueOutOfRange", "CalculationFailure", ] } name_for_cid[44] = "NumericValueUnknownQualifier" cid_concepts[44] = { "DCM": ["ValueUnknown", "ValueIndeterminate", "MeasurementNotAttempted"] } name_for_cid[50] = "InstanceAvailabilityStatus" cid_concepts[50] = {"DCM": ["Unavailable", "Nearline", "Offline", "Online"]} name_for_cid[60] = "ImagingAgentAdministrationAdverseEvent" cid_concepts[60] = { "DCM": ["ExtravasationVisibleInImage", "PatientConditionPreventedContinuing"], "SCT": [ "PallorPaleComplexion", "InjectionSiteNerveDamage", "InjectionSiteFibrosis", "InjectionSiteExtravasation", "Cough", "ChillsAndFever", "InjectionSiteHypersensitivity", "InjectionSitePigmentationChange", "InjectionSiteScar", "InjectionSiteIrritation", "NauseaAndVomiting", "Sweating", "InjectionSiteAnesthesia", "FacialSwelling", "InjectionSiteInduration", "InjectionSiteUrticaria", "Bronchospasm", "InjectionSiteMalabsorption", "InjectionSiteSterileAbscess", "Headache", "SensationOfBeingWarm", "TachycardiaBradycardia", "InjectionSiteNecrosis", "Anxiety", "InjectionSiteDermatitis", "InjectionSiteDisorder", "Shaking", "InjectionSiteBruising", "DrugInducedFlushing", "CardiacArrhythmia", "LaryngealEdema", "InjectionSiteThrombosis", "InjectionSiteAbscess", "DrugInducedDizziness", "CardiorespiratoryArrest", "InjectionSiteCyst", "Hypertension", "InjectionSiteEdema", "Dyspnea", "InjectionSiteAtrophy", "DrugInducedHypotension", "InjectionSiteBurning", "InjectionSiteHemorrhage", "InjectionSiteUlcer", "EpilepticConvulsions", "Itching", "DrugRash", "InjectionSiteInflammation", "InjectionSiteInfection", "Hypotension", "DiffuseInflammatoryErythema", "TasteSenseAltered", "InjectionSiteParesthesia", "NasalCongestion", "NoMotorResponseToCommand", "InjectionSitePain", "InjectionSiteMass", "InjectionSiteGranuloma", ], } name_for_cid[62] = "ImagingAgentAdministrationPhaseType" cid_concepts[62] = { "DCM": [ "AutomaticProgrammedAdministrationPhase", "AutomaticProgrammedDelayPhase", "AutomatedManualInjectPhase", "AutomaticProgrammedWaitPhase", ] } name_for_cid[63] = "ImagingAgentAdministrationMode" cid_concepts[63] = {"DCM": ["ManualAdministration", "AutomatedAdministration"]} name_for_cid[64] = "ImagingAgentAdministrationPatientState" cid_concepts[64] = { "DCM": [ "AcuteUnilateralRenalBlockage", "LowThyroidUptake", "HighThyroidUptake", "SeverelyJaundiced", "PatientAllergicToMediaContrast", ], "SCT": [ "Cardiomyopathy", "MalignantEpithelialNeoplasmOfThyroid", "HistoryOfHypertension", "HistoryOfDiabetesMellitus", "AnginaPectoris", "Paraproteinemia", "HistoryOfCongestiveHeartFailure", "PulmonaryHypertension", "MultipleMyeloma", "Anxiety", "Asthma", "HistoryOfBetaBlockingAgentsTherapy", "HistoryOfRenalFailure", "AorticStenosis", "AbnormalRenalFunction", ], } name_for_cid[65] = "ImagingAgentAdministrationPremedication" cid_concepts[65] = { "SCT": [ "Alfentanil", "Remifentanil", "Propofol", "Midazolam", "Sufentanil", "Methylprednisolone", "HydrocortisoneSodiumSuccinate", "DexamethasoneSodiumPhosphate_Inactive", "Papaverine", "Diphenhydramine", "MethylprednisoloneSodiumPhosphate", "H1Antihistamine", "Prednisone", "Ephedrine", ] } name_for_cid[66] = "ImagingAgentAdministrationMedication" cid_concepts[66] = { "SCT": ["Alfentanil", "Remifentanil", "Propofol", "Midazolam", "Sufentanil"] } name_for_cid[67] = "ImagingAgentAdministrationCompletionStatus" cid_concepts[67] = { "DCM": [ "TerminatedDueToFlowRateAboveTerminationLimit", "TerminatedDueToConsumableRemoval", "TerminatedDueToPressureAboveTerminationLimit", "TerminatedDueToCriticalBatteryLevel", "TerminatedByScanner", "TerminatedDueToAirDetected", "TerminatedDueToRequestFromOperator", "TerminatedDueToInjectorCommunicationLoss", "TerminatedDueToExcessiveDurationPause", "TerminatedDueToUnspecifiedInjectorFailure", ], "SCT": ["Complete"], } name_for_cid[68] = "ImagingAgentAdministrationPharmaceuticalPresentationUnit" cid_concepts[68] = { "SCT": ["ParenteralEnteralSolutionBag", "SyringeUnit", "Cartridge", "Bottle"] } name_for_cid[69] = "ImagingAgentAdministrationConsumable" cid_concepts[69] = {"SCT": ["Syringe", "Catheter", "Needle", "Tube", "Bottle"]} name_for_cid[70] = "Flush" cid_concepts[70] = {"MSH": ["LactatedRingerS"], "SCT": ["Dextran", "Saline"]} name_for_cid[71] = "ImagingAgentAdministrationInjectorEventType" cid_concepts[71] = { "DCM": [ "TerminatedDueToUnspecifiedInjectorFailure", "SyringeDetached", "SyringeAttached", "KeepVeinOpenEnded", "KeepVeinOpenStarted", "ManualHoldStarted", "ProgrammedHoldStarted", "TerminatedHoldDueToTimeout", "ManualResumeFromHold", "FlowRateAboveAdjustmentLimit", "AirDetected", "FlowRateAboveWarningLimit", "PressureAboveAdjustmentLimit", "PressureAboveWarningLimit", "TerminatedDueToFlowRateAboveTerminationLimit", "TerminatedDueToConsumableRemoval", "TerminatedDueToPressureAboveTerminationLimit", "TerminatedDueToCriticalBatteryLevel", "FixedDurationPauseEnded", "TerminatedByScanner", "EquipmentFailure", "TerminatedDueToAirDetected", "TerminatedDueToRequestFromOperator", "TerminatedDueToInjectorCommunicationLoss", "TerminatedDueToExcessiveDurationPause", "ResourceInadequate", ] } name_for_cid[72] = "ImagingAgentAdministrationStepType" cid_concepts[72] = { "DCM": [ "DiagnosticAdministration", "TransitTimeTestInjection", "PatencyTestInjection", "FlushAdministration", ] } name_for_cid[73] = "BolusShapingCurve" cid_concepts[73] = {"DCM": ["LinearCurve", "NegativeExponential"]} name_for_cid[74] = "ImagingAgentAdministrationConsumableCatheterType" cid_concepts[74] = { "SCT": [ "PeripheralIntravenousCatheter", "CentralVenousCatheter", "ImplantableVenousAccessPort", "RectalCatheter", ] } name_for_cid[75] = "LowHighorEqual" cid_concepts[75] = {"SCT": ["Low", "High", "Equal"]} name_for_cid[76] = "PremedicationType" cid_concepts[76] = { "DCM": ["ContrastReactionProphylacticAgent", "PreMedication"], "SCT": ["Sedative", "Antiemetic"], } name_for_cid[83] = "RealWorldValueMappingUnit" cid_concepts[83] = { "UCUM": [ "MicromolePerMinutePerMilliliter", "SquareCentimeterPerMilliliter", "SquareCentimeter", "MilliliterPerGram", "StandardizedUptakeValueBodySurfaceArea", "StandardizedUptakeValueLeanBodyMassJanma", "ProportionalToCounts", "Counts", "Percent", "MilliliterPerMinutePerGram", "StandardizedUptakeValueBodyWeight", "MicromolePerMilliliter", "HounsfieldUnit", "ProportionalToCountsPerSecond", "MilligramsPerMinutePerMilliliter", "StandardizedUptakeValueIdealBodyWeight", "PerCentimeter", "BecquerelsPerMilliliter", "CountsPerSecond", "StandardizedUptakeValueLeanBodyMassJames", "StandardizedUptakeValueLeanBodyMassJames128Multiplier", ] } name_for_cid[84] = "PETUnit" cid_concepts[84] = { "UCUM": [ "MicromolePerMinutePerMilliliter", "SquareCentimeterPerMilliliter", "SquareCentimeter", "MilliliterPerGram", "StandardizedUptakeValueBodySurfaceArea", "StandardizedUptakeValueLeanBodyMassJanma", "ProportionalToCounts", "Counts", "Percent", "MilliliterPerMinutePerGram", "StandardizedUptakeValueBodyWeight", "MicromolePerMilliliter", "ProportionalToCountsPerSecond", "MilligramsPerMinutePerMilliliter", "StandardizedUptakeValueIdealBodyWeight", "PerCentimeter", "BecquerelsPerMilliliter", "CountsPerSecond", "StandardizedUptakeValueLeanBodyMassJames", "StandardizedUptakeValueLeanBodyMassJames128Multiplier", ] } name_for_cid[85] = "SUVUnit" cid_concepts[85] = { "UCUM": [ "StandardizedUptakeValueIdealBodyWeight", "StandardizedUptakeValueBodySurfaceArea", "StandardizedUptakeValueLeanBodyMassJanma", "StandardizedUptakeValueBodyWeight", "StandardizedUptakeValueLeanBodyMassJames", "StandardizedUptakeValueLeanBodyMassJames128Multiplier", ] } name_for_cid[91] = "FunctionalConditionPresentDuringAcquisition" cid_concepts[91] = { "DCM": ["DuringVoiding", "PostVoiding", "PriorToVoiding"], "SCT": [ "WeightBearing", "DrugInfusion", "LegUp", "ValsalvaManeuver", "Phonation", "PostVolumeChallenge", "HeldVentilation", "HeadUp", "VagalStimulation", "Pacing", "NegativeLowerBodyPressure", "Handgrip", "HeldInspiration", "ExerciseChallenge", ], } name_for_cid[92] = "JointPositionDuringAcquisition" cid_concepts[92] = { "DCM": ["NeutralMusculoskeletalPosition"], "SCT": [ "Torsion", "ExternalRotation", "Pronation", "Flexion", "InternalRotation", "Abduction", "Extension", "Adduction", "Supination", ], } name_for_cid[93] = "JointPositioningMethod" cid_concepts[93] = {"SCT": ["PassiveMovement", "ManipulationOfJoint"]} name_for_cid[94] = "PhysicalForceAppliedDuringAcquisition" cid_concepts[94] = {"SCT": ["TractionAction", "RotationAction", "CompressionAction"]} name_for_cid[100] = "QuantitativeDiagnosticImagingProcedure" cid_concepts[100] = { "DCM": ["MultiparametricMRIOfWholeBody", "MultiparametricMRI"], "LN": [ "XRUnspecifiedBodyRegion", "NMUnspecifiedBodyRegion", "PETWholeBody", "SPECTBrain", "MRIUnspecifiedBodyRegion", "PETUnspecifiedBodyRegion", "CTUnspecifiedBodyRegion", "CTPerfusionHeadWithContrastIV", ], "RADLEX": ["NMHeadPerfusionBrainPETCTAV45"], "SCT": [ "DynamicMagneticResonanceImagingOfKnee", "DynamicMagneticResonanceImagingOfPelvis", "PETCTFDGImagingOfWholeBody", "MultiparametricMRIOfProstate", "MagneticResonanceImagingGuidance", "ImagingProcedure", "PETCTMETImagingOfWholeBody", "Angiography", ], } name_for_cid[101] = "ImagingProcedure" cid_concepts[101] = {} name_for_cid[210] = "QualitativeEvaluationModifierType" cid_concepts[210] = {"SCT": ["TopographicalModifier", "Laterality"]} name_for_cid[211] = "QualitativeEvaluationModifierValue" cid_concepts[211] = { "DCM": ["Median"], "NCIt": ["Middle"], "SCT": [ "Bilateral", "Central", "Right", "Posterior", "Left", "Unilateral", "Superior", "Distal", "Proximal", "MidLongitudinal", "Lateral", "Inferior", "Anterior", ], } name_for_cid[212] = "GenericAnatomicLocationModifier" cid_concepts[212] = { "DCM": ["Median"], "NCIt": ["Middle"], "SCT": [ "Distal", "Proximal", "MidLongitudinal", "Central", "Lateral", "Posterior", "Inferior", "Anterior", "Superior", ], } name_for_cid[217] = "VisualExplanation" cid_concepts[217] = { "DCM": ["GradientWeightedClassActivation", "ClassActivation", "Saliency"] } name_for_cid[218] = "QuantitativeImageFeature" cid_concepts[218] = { "DCM": [ "WaterFatOutOfPhase", "FractionalOccupancySegmentation", "WaterFatInPhase", "FractionalProbabilisticSegmentation", "BinarySegmentation", "WaterFraction", "MRSignalIntensity", "XRayAttenuation", "FatFraction", "YBRICTCRComponent", "YBRICTCBComponent", "YBRICTYComponent", "YBRPARTIALCRComponent", "YBRPARTIALCBComponent", "YBRPARTIALYComponent", "RootAngularSecondMomentOfGLCM", "Echogenicity", "YBRRCTCRComponent", "YBRRCTCBComponent", "YBRRCTYComponent", "RGBRComponent", "UltrasoundAttenuation", "SpeedOfSound", "Perfusion", "Elasticity", "YBRFULLCRComponent", "FractalDimension", "YBRFULLCBComponent", "YBRFULLYComponent", "RGBBComponent", "RGBGComponent", "CreatineCholineCitrateRatio", "MagnetizationTransferRatio", "CreatineAndCholine", "LipidAndLactate", "SpatialDisplacementYComponent", "SpatialDisplacementXComponent", "NuclearMedicineTomographicActivity", "NuclearMedicineProjectionActivity", "FlowVariance", "FlowVelocity", "TissueVelocity", "IndexedHemodynamicResistance", "HemodynamicResistance", "SpatialDisplacementZComponent", "AttenuationCoefficient", "Ktrans", "Kep", "Ve", "Suvbsa", "Suvibw", "SuvlbmJanma", "SuvlbmJames128", "StandardizedUptakeValue", "Suvbw", "Suvlbm", "ApparentDiffusionCoefficient", "DiffusionWeighted", "LineSegmentLength", "AcetabularAngle", "VolumeRatio", "VolumeOfSphere", "DiffusionCoefficient", "VolumeOfCircumscribedSphere", "VolumeOfEllipsoid", "VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions", "VolumeEstimatedFromTwoNonCoplanar2DRegions", "VolumeEstimatedFromSingle2DRegion", "PathLength", "VolumeOfBoundingThreeDimensionalRegion", "R2Coefficient", "ChiSquare", "DW", "AIC", "BIC", "Distance", "Height", "RelativeLinearStoppingPower", "TauM", "Vp", "EquivalentDose", "GradientWeightedClassActivation", "ClassActivation", "AbsorbedDose", "Saliency", "IAUC90BN", "IAUC180BN", "IAUC", "IAUC60", "IAUC90", "IAUC180", "IAUCBN", "IAUC60BN", "GlutamateAndGlutamine", "CholineCreatineRatio", "NAcetylaspartateCreatineRatio", "NAcetylaspartateCholineRatio", "Tmax", "R2Star", "VolumetricDiffusionDxzComponent", "MagneticSusceptibility", "VolumetricDiffusionDxyComponent", "VolumetricDiffusionDxxComponent", "RelativeRegionalBloodFlow", "RelativeRegionalBloodVolume", "BloodOxygenationLevel", "T2StarWeightedDynamicContrastEnhancedMRSignalIntensity", "T2WeightedDynamicContrastEnhancedMRSignalIntensity", "AbsoluteRegionalBloodFlow", "T1WeightedDynamicContrastEnhancedMRSignalIntensity", "AbsoluteRegionalBloodVolume", "VolumetricDiffusionDzzComponent", "OxygenExtractionFraction", "R1", "VolumetricDiffusionDyzComponent", "R2", "VolumetricDiffusionDyyComponent", "VelocityEncoded", "ZScore", "ContrastAgentAngioMRSignalIntensity", "SpinTaggingPerfusionMRSignalIntensity", "RelativeAnisotropy", "FractionalAnisotropy", "FieldMapMRSignalIntensity", "T2StarWeightedMRSignalIntensity", "T2WeightedMRSignalIntensity", "T1WeightedMRSignalIntensity", "ProtonDensityWeightedMRSignalIntensity", "TimeOfFlightAngioMRSignalIntensity", "T1", "T2Star", "T2", "TimeCourseOfSignal", "TemperatureEncoded", "StudentTTest", "TimeToPeak", "SignalToNoise", "TemporalDerivativeThreshold", "MaximumSlope", "MaximumDifference", "TracerConcentration", "TimeOfPeakConcentration", "BolusArrivalTime", "TimeOfLeadingHalfPeakConcentration", "MeanTransitTime", "KurtosisDiffusionCoefficient", "GammaDistributionScaleParameter", "NegativeEnhancementIntegral", "GammaDistributionShapeParameter", "GammaDistributionMode", "DistributedDiffusionCoefficient", "RCoefficient", "AnomalousExponentParameter", "ProtonDensity", "SignalChange", "MonoExponentialApparentDiffusionCoefficient", "SlowDiffusionCoefficient", "FastDiffusionCoefficient", "FastDiffusionCoefficientFraction", ], "IBSI": [ "LongRunHighGrayLevelEmphasis", "IntensityHistogramMedian", "GreyLevelNonUniformityOfDistanceZoneCounts", "SurfaceToVolumeRatio", "InverseVarianceOfGLCM", "DependenceCountPercentage", "FirstMeasureOfInformationCorrelationOfGLCM", "ZoneSizeNonuniformity", "DependenceCountEnergy", "MoranIIndex", "InverseDifferenceOfGLCM", "JointAverageOfGLCM", "InverseDifferenceMomentOfGLCM", "IntensityHistogram90thPercentile", "NormalizedGrayLevelNonuniformityOfSizeZoneCounts", "IntensityHistogramMedianAbsoluteDeviation", "ShortRunLowGrayLevelEmphasis", "SizeZonePercentage", "GrayLevelVarianceInRuns", "IntensityHistogramRobustMeanAbsoluteDeviation", "Compactness1", "HighDependenceHighGreyLevelEmphasis", "IntensityHistogramMinimumGradientGrayLevel", "GreyLevelVarianceOfNGLDM", "DistanceZonePercentage", "AutocorrelationOfGLCM", "LongRunsEmphasis", "NormalizedRunLengthNonuniformity", "DependenceCountVariance", "ClusterTendencyOfGLCM", "LowGreyLevelZoneEmphasis", "DifferenceAverageOfGLCM", "SumAverageOfGLCM", "IntensityHistogramQuartileCoefficientOfDispersion", "LargeDistanceEmphasis", "NormalizedGreyLevelNonUniformityOfNGLDM", "SumVarianceOfGLCM", "IntensityHistogramEntropy", "IntensityHistogramUniformity", "LargeDistanceHighGreyLevelEmphasis", "SmallZoneHighGrayLevelEmphasis", "DissimilarityOfGLCM", "Maximum3DDiameterOfAMesh", "GearyCMeasure", "LowGreyLevelCountEmphasis", "LargeZoneEmphasis", "RunEntropy", "VolumeOfMesh", "ZoneDistanceVariance", "LowGrayLevelRunEmphasis", "Flatness", "DifferenceVarianceOfGLCM", "CorrelationOfGLCM", "BusynessOfNGTDM", "IntensityHistogramKurtosis", "StrengthOfNGTDM", "AreaDensityInMinimumVolumeEnclosingEllipsoid", "GreyLevelNonUniformityOfNGLDM", "Compactness2", "JointEntropyOfGLCM", "LargeDistanceLowGreyLevelEmphasis", "VolumeFromVoxelSummation", "SecondMeasureOfInformationCorrelationOfGLCM", "SmallZoneLowGrayLevelEmphasis", "MajorAxisIn3DLength", "NormalizedZoneDistanceNonUniformity", "LowGrayLevelZoneEmphasis", "ZoneSizeVariance", "NormalizedZoneSizeNonuniformity", "IntensityHistogramRange", "AreaDensityInApproximateEnclosingEllipsoid", "CoarsenessOfNGTDM", "LowDependenceLowGreyLevelEmphasis", "DependenceCountNonUniformityNormalized", "ContrastOfNGTDM", "GrayLevelVarianceInSizeZones", "IntensityHistogramMinimumGradient", "ClusterShadeOfGLCM", "ClusterProminenceOfGLCM", "IntensityHistogramVariance", "IntensityHistogramMeanAbsoluteDeviation", "IntensityHistogramInterquartileRange", "ContrastOfGLCM", "SmallZoneEmphasis", "SmallDistanceLowGreyLevelEmphasis", "LowDependenceHighGreyLevelEmphasis", "AreaDensityInOrientedMinimumBoundingBox", "HighGrayLevelZoneEmphasis", "SurfaceAreaOfMesh", "IntensityHistogram10thPercentile", "VolumeDensityInFrameOfReferenceAxisAlignedBoundingBox", "Asphericity", "VolumeDensityInOrientedMinimumBoundingBox", "DependenceCountEntropy", "VolumeDensityInApproximateEnclosingEllipsoid", "RunPercentage", "IntensityHistogramSkewness", "IntensityHistogramMaximumGradient", "LargeZoneLowGrayLevelEmphasis", "HighGreyLevelCountEmphasis", "HighDependenceLowGreyLevelEmphasis", "IntensityHistogramMaximumGrayLevel", "LowDependenceEmphasis", "Elongation", "LongRunLowGrayLevelEmphasis", "HighGrayLevelRunEmphasis", "ShortRunsEmphasis", "HighDependenceEmphasis", "ShortRunHighGrayLevelEmphasis", "SphericalDisproportion", "GrayLevelNonuniformityOfSizeZoneCounts", "RunLengthNonuniformity", "IntensityHistogramMean", "RunLengthVariance", "ZoneDistanceEntropy", "CentreOfMassShift", "ComplexityOfNGTDM", "GreyLevelVarianceInDistanceZones", "ZoneDistanceNonUniformity", "IntensityHistogramMode", "JointMaximumOfGLCM", "LeastAxisIn3DLength", "HighGreyLevelZoneEmphasis", "MinorAxisIn3DLength", "IntegratedIntensity", "LargeZoneHighGrayLevelEmphasis", "AngularSecondMomentOfGLCM", "Sphericity", "NormalizedInverseDifferenceMomentOfGLCM", "VolumeDensityInMinimumVolumeEnclosingEllipsoid", "JointVarianceOfGLCM", "AreaDensityInConvexHull", "NormalizedGrayLevelNonuniformityInRuns", "IntensityHistogramMaximumGradientGrayLevel", "IntensityHistogramMinimumGrayLevel", "NormalizedInverseDifferenceOfGLCM", "GrayLevelNonuniformityInRuns", "ZoneSizeEntropy", "SmallDistanceHighGreyLevelEmphasis", "DifferenceEntropyOfGLCM", "AreaDensityInFrameOfReferenceAxisAlignedBoundingBox", "SmallDistanceEmphasis", "VolumeDensityInConvexHull", "IntensityHistogramCoefficientOfVariation", "DependenceCountNonUniformity", "SumEntropyOfGLCM", "NormalizedGreyLevelNonUniformityOfDistanceZoneCounts", ], "SCT": [ "Lipid", "DiameterOfCircumscribedCircle", "Depth", "PowerDoppler", "Perimeter", "CobbAngle", "Lactate", "Length", "Inositol", "PerpendicularAxis", "Radius", "AreaOfDefinedRegion", "Width", "Volume", "Fat", "Area", "NAcetylaspartate", "Creatine", "Glutamine", "MinorAxis", "Diameter", "Tuarine", "Citrate", "MajorAxis", "LongAxis", "Circumference", "Water", "Choline", "ShortAxis", ], } name_for_cid[219] = "GeometryGraphicalRepresentation" cid_concepts[219] = { "DCM": [ "CenterOfMass", "GeometricCenterpoint", "SeedPoint", "Centerline", "Center", "BoundaryPoint", "Outline", "RepresentativePoint", ], "SCT": ["BoundedBy"], } name_for_cid[220] = "SignificanceLevel" cid_concepts[220] = { "SCT": [ "Significant", "SignificanceUndetermined", "MostSignificant", "HighlySignificant", "NotSignificant", ] } name_for_cid[221] = "MeasurementRangeConcept" cid_concepts[221] = { "DCM": [ "PercentileRankingOfMeasurement", "ZScoreOfMeasurement", "StandardDeviationOfPopulation", "_2SigmaDeviationOfPopulation", "InterquartileRangeToMedianRatioOfPopulation", "InterquartileRangeOfPopulation", ], "SCT": [ "_1SigmaLowerValueOfPopulation", "_2SigmaLowerValueOfPopulation", "_5thPercentileValueOfPopulation", "_10thPercentileValueOfPopulation", "_1SigmaUpperValueOfPopulation", "_2SigmaUpperValueOfPopulation", "MeanValueOfPopulation", "_95thPercentileValueOfPopulation", "_90thPercentileValueOfPopulation", "MedianValueOfPopulation", ], } name_for_cid[222] = "Normality" cid_concepts[222] = { "SCT": [ "AbnormallyHigh", "Abnormal", "AbnormallyLow", "Normal", "NormalityUndetermined", ] } name_for_cid[223] = "NormalRangeValue" cid_concepts[223] = {"SCT": ["NormalRangeLowerLimit", "NormalRangeUpperLimit"]} name_for_cid[224] = "SelectionMethod" cid_concepts[224] = { "DCM": ["MostRecentValueChosen", "MeanValueChosen", "UserChosenValue"] } name_for_cid[225] = "MeasurementUncertaintyConcept" cid_concepts[225] = { "SCT": [ "RangeOfUpperMeasurementUncertainty", "RangeOfMeasurementUncertainty", "RangeOfLowerMeasurementUncertainty", ] } name_for_cid[226] = "PopulationStatisticalDescriptor" cid_concepts[226] = { "DCM": [ "StandardDeviationOfPopulation", "_2SigmaDeviationOfPopulation", "InterquartileRangeToMedianRatioOfPopulation", "InterquartileRangeOfPopulation", ], "SCT": [ "_1SigmaLowerValueOfPopulation", "_2SigmaLowerValueOfPopulation", "_5thPercentileValueOfPopulation", "_10thPercentileValueOfPopulation", "_1SigmaUpperValueOfPopulation", "_2SigmaUpperValueOfPopulation", "MeanValueOfPopulation", "_95thPercentileValueOfPopulation", "_90thPercentileValueOfPopulation", "MedianValueOfPopulation", ], } name_for_cid[227] = "SampleStatisticalDescriptor" cid_concepts[227] = {"DCM": ["PercentileRankingOfMeasurement", "ZScoreOfMeasurement"]} name_for_cid[228] = "EquationorTable" cid_concepts[228] = { "DCM": [ "TableOfValues", "TableOfValuesCitation", "MethodCitation", "Equation", "EquationCitation", ] } name_for_cid[230] = "YesNo" cid_concepts[230] = {"SCT": ["Yes", "No", "Undetermined"]} name_for_cid[231] = "YesNoOnly" cid_concepts[231] = {"SCT": ["Yes", "No"]} name_for_cid[240] = "PresentAbsent" cid_concepts[240] = {"SCT": ["Absent", "Present", "Undetermined"]} name_for_cid[241] = "PresentAbsentOnly" cid_concepts[241] = {"SCT": ["Absent", "Present"]} name_for_cid[242] = "NormalAbnormal" cid_concepts[242] = {"SCT": ["Abnormal", "Normal", "NormalityUndetermined"]} name_for_cid[244] = "Laterality" cid_concepts[244] = {"SCT": ["Bilateral", "Right", "Left", "Unilateral"]} name_for_cid[245] = "LateralitywithMedian" cid_concepts[245] = { "DCM": ["Median"], "SCT": ["Bilateral", "Right", "Left", "Unilateral"], } name_for_cid[246] = "RelativeLaterality" cid_concepts[246] = {"SCT": ["Contralateral", "Ipsilateral"]} name_for_cid[247] = "LateralityLeftRightOnly" cid_concepts[247] = {"SCT": ["Right", "Left"]} name_for_cid[250] = "PositiveNegative" cid_concepts[250] = {"SCT": ["Negative", "Positive"]} name_for_cid[251] = "ComplicationSeverity" cid_concepts[251] = {"SCT": ["Minor", "Major"]} name_for_cid[252] = "SMLSizeDescriptor" cid_concepts[252] = {"SCT": ["Medium", "Small", "Large"]} name_for_cid[270] = "ObserverType" cid_concepts[270] = {"DCM": ["Person", "Device"]} name_for_cid[271] = "ObservationSubjectClass" cid_concepts[271] = {"DCM": ["Fetus", "Specimen", "Patient", "DeviceSubject"]} name_for_cid[272] = "SpecificObservationSubjectClass" cid_concepts[272] = { "DCM": ["ImageFrame", "Study", "Patient", "Series"], "NCIt": ["ImagingRegionOfInterest", "Image"], "SCT": ["Waveform"], } name_for_cid[280] = "LongitudinalTemporalEventType" cid_concepts[280] = {"DCM": ["Baseline"], "NCIt": ["Enrollment"]} name_for_cid[300] = "MultienergyRelevantMaterial" cid_concepts[300] = { "SCT": [ "Silicon", "Yttrium", "Iodine", "UricAcid", "Iron", "CobaltChromiumAlloy", "Silicone", "Hafnium", "Tantalum", "Water", "Fat", "Gold", "Calcium", "Barium", "Gadolinium", "RenalStone", "NickelCobaltChromium", "Bismuth", "CalciumHydroxyapatite", "Titanium", "Platinum", "Silver", "AluminumOxide", ] } name_for_cid[301] = "MultienergyMaterialUnit" cid_concepts[301] = { "DCM": ["ModifiedHounsfieldUnit", "EffectiveAtomicNumber"], "UCUM": [ "MilligramsPerCubicCentimeter", "HounsfieldUnit", "ElectronDensity", "Percent", "MilligramsPerMilliliter", ], } name_for_cid[400] = "AuditEventID" cid_concepts[400] = { "DCM": [ "ApplicationActivity", "ProcedureRecord", "PatientRecord", "NetworkEntry", "Import", "Export", "DICOMStudyDeleted", "DICOMInstancesTransferred", "DICOMInstancesAccessed", "UserAuthentication", "BeginTransferringDICOMInstances", "SecurityAlert", "AuditLogUsed", "Query", "OrderRecord", ] } name_for_cid[401] = "AuditEventTypeCode" cid_concepts[401] = { "DCM": [ "AuditRecordingStopped", "UseOfRestrictedFunction", "SoftwareConfiguration", "HardwareConfiguration", "RemoteServiceOperationStarted", "EmergencyOverrideStopped", "UserSecurityAttributesChanged", "SecurityRolesChanged", "ObjectSecurityAttributesChanged", "AuditRecordingStarted", "Login", "AuthorizationDecision", "ApplicationStop", "AuthenticationDecision", "ApplicationStart", "LocalServiceOperationStopped", "LocalServiceOperationStarted", "RemoteServiceOperationStopped", "SecurityConfiguration", "NetworkConfiguration", "EmergencyOverrideStarted", "NodeAuthentication", "Detach", "AccessControlDecision", "Attach", "SessionStop", "Logout", "SessionStart", ] } name_for_cid[402] = "AuditActiveParticipantRoleIDCode" cid_concepts[402] = { "DCM": [ "SourceMedia", "DestinationMedia", "SourceRoleID", "DestinationRoleID", "ApplicationLauncher", "Application", ] } name_for_cid[403] = "SecurityAlertTypeCode" cid_concepts[403] = { "DCM": [ "AuditRecordingStopped", "UseOfRestrictedFunction", "SoftwareConfiguration", "HardwareConfiguration", "RemoteServiceOperationStarted", "EmergencyOverrideStopped", "UserSecurityAttributesChanged", "SecurityRolesChanged", "ObjectSecurityAttributesChanged", "AuditRecordingStarted", "Login", "AuthorizationDecision", "ApplicationStop", "AuthenticationDecision", "ApplicationStart", "LocalServiceOperationStopped", "LocalServiceOperationStarted", "RemoteServiceOperationStopped", "SecurityConfiguration", "NetworkConfiguration", "EmergencyOverrideStarted", "NodeAuthentication", "Detach", "AccessControlDecision", "Attach", "SessionStop", "Logout", "SessionStart", ] } name_for_cid[404] = "AuditParticipantObjectIDTypeCode" cid_concepts[404] = {"DCM": ["StudyInstanceUID", "NodeID", "SOPClassUID"]} name_for_cid[405] = "MediaTypeCode" cid_concepts[405] = { "DCM": [ "PaperDocument", "URI", "SecureDigitalCard", "MultiMediaCard", "CompactFlash", "DVD", "CD", "Film", "Email", "USBDiskEmulation", ] } name_for_cid[501] = "VolumetricViewDescription" cid_concepts[501] = { "DCM": ["ApicalFourChamberRVFocused", "ApicalFourChamberRVModified"], "SCT": [ "RightPosteriorOblique", "LeftLateralEmissiveProjection", "ParasternalLongAxisViewOfTheRVOutflowTract", "ParasternalShortAxisAtThePapillaryMuscleLevel", "Tangential", "CranioCaudal", "LateroMedialOblique", "Acanthioparietal", "SuprasternalSagittalView", "Orbitoparietal", "PosteriorProjection", "FiveChamber", "ObliqueCranioCaudal", "OffAxis", "LateralOblique", "RightOblique", "Lateral", "MedioLateralObliqueProjection", "Verticosubmental", "MedialLateralEmissiveProjection", "Frontal", "HorizontalLongAxis", "ParietoOrbital", "ParasternalShortAxisAtTheAorticValveLevel", "SubcostalShortAxisViewAtPapillaryMuscleLevel", "AnteroPosterior", "SubcostalShortAxisViewAtVenousInflowLevel", "LeftPosteriorObliqueEmissiveProjection", "ParasternalShortAxisAtTheLevelOfTheMitralChords", "LeftPosteriorOblique", "ParasternalLongAxis", "ObliqueCaudoCranial", "SuprasternalShortAxis", "SagittalObliqueAxisEmissiveProjection", "VerticalLongAxis", "Sagittal", "LeftAnteriorObliqueEmissiveProjection", "SuprasternalLongAxis", "TransesophagealShortAxisView", "Axial", "Plantodorsal", "RightLateralEmissiveProjection", "SuprasternalLongAxisViewOfAorticArch", "CaudoCranial", "TissueSpecimen", "SubcostalLongAxis", "LeftLateral", "LateralMedial", "Dorsoplantar", "ObliqueProjection", "AnteriorProjection", "LateroMedialObliqueEmissiveProjection", "ObliqueAxial", "Coronal", "SubcostalShortAxis", "LongAxis", "RightAnteriorObliqueEmissiveProjection", "RightVentricularInflowTractView", "TwoChamber", "RightLateral", "ObliqueAxialEmissiveProjection", "SubcostalObliqueCoronalView", "Parietoacanthial", "PosteroAnterior", "Submentovertical", "AnteroPosteriorOblique", "RightPosteriorObliqueEmissiveProjection", "LeftOblique", "SubcostalShortAxisViewAtMitralValveLevel", "MedialOblique", "FrontalObliqueAxial", "FrontalOblique", "FourChamber", "RightVentricularOutflowTractView", "ParasternalShortAxis", "ParasternalShortAxisAtTheMitralValveLevel", "SubcostalViewOfCardiacOutletsDirectedAnteriorly", "PosteroAnteriorOblique", "AxialProjection", "OcclusalProjection", "SuprasternalCoronalView", "Parasagittal", "LeftAnteriorOblique", "ParasternalLongAxisViewOfTheRVInflowTract", "Oblique", "Transverse", "RightAnteriorOblique", "ApicalLongAxis", "SubcostalShortAxisViewAtAorticValveLevel", "SagittalObliqueAxial", "LateralMedialEmissiveProjection", "MedioLateralProjection", "ShortAxis", "MedioLateralObliqueEmissiveProjection", "LateralProjection", "Longitudinal", ], } name_for_cid[502] = "VolumetricViewModifier" cid_concepts[502] = { "DCM": ["Crosstable"], "SCT": [ "Transoral", "Caudal", "Sagittal", "Caudad", "FiveChamber", "LongAxis", "OffAxis", "Parasagittal", "Transforamenal", "FourChamber", "ShortAxis", "TwoChamber", "Oblique", "Cephalad", "Coronal", "Transthoracic", "Transverse", "Transorbital", "MouthClosed", "Cephalic", "Longitudinal", ], } name_for_cid[601] = "BiosafetyLevel" cid_concepts[601] = { "SCT": ["BiosafetyLevel2", "BiosafetyLevel1", "BiosafetyLevel4", "BiosafetyLevel3"] } name_for_cid[602] = "BiosafetyControlReason" cid_concepts[602] = { "SCT": ["BiohazardousMaterial", "Carcinogen", "PatientImmunocompromised"], "UMLS": ["TransgenicAnimal"], } name_for_cid[603] = "AnimalRoomType" cid_concepts[603] = { "DCM": ["AnimalHousingRoom", "PreparationRoom", "ImagingProcedureRoom"], "SCT": ["InductionRoom", "IsolationRoom", "RecoveryRoom"], } name_for_cid[604] = "DeviceReuse" cid_concepts[604] = {"DCM": ["Unused", "Reused"]} name_for_cid[605] = "AnimalBeddingMaterial" cid_concepts[605] = { "DCM": [ "AspenShavingBedding", "CornCobBedding", "PaperBasedBedding", "PineChipBedding", "PineShavingBedding", "AspenChipBedding", ] } name_for_cid[606] = "AnimalShelterType" cid_concepts[606] = {"DCM": ["Igloo", "RedTranslucentIgloo"], "SCT": ["None_"]} name_for_cid[607] = "AnimalFeedType" cid_concepts[607] = {"DCM": ["NIH31", "NIH07", "AIN76", "AIN93G", "AIN93M"]} name_for_cid[608] = "AnimalFeedSource" cid_concepts[608] = { "DCM": ["LocallyManufacturedProduct"], "UMLS": ["CommercialProduct"], } name_for_cid[609] = "AnimalFeedingMethod" cid_concepts[609] = { "DCM": ["FoodTreat"], "NCIt": ["AdLibitum"], "SCT": ["Gavage"], "UMLS": ["RestrictedDiet"], } name_for_cid[610] = "WaterType" cid_concepts[610] = { "DCM": ["ReverseOsmosisPurifiedWater", "ReverseOsmosisPurifiedHclAcidifiedWater"], "SCT": ["TapWater", "DistilledWater"], } name_for_cid[611] = "AnesthesiaCategoryCodeTypeforSmallAnimalAnesthesia" cid_concepts[611] = { "SCT": [ "MonitoredAnesthesiaCareMAC", "GeneralAnesthesia", "LocalAnesthesia", "Sedation", "SpinalAnesthesia", "EpiduralAnesthesia", "RegionalAnesthesia", "TopicalLocalAnesthesia", ] } name_for_cid[612] = "AnesthesiaCategoryCodeTypefromAnesthesiaQualityInitiative" cid_concepts[612] = { "SCT": [ "MonitoredAnesthesiaCareMAC", "GeneralAnesthesia", "LocalAnesthesia", "Sedation", "SpinalAnesthesia", "EpiduralAnesthesia", "RegionalAnesthesia", "TopicalLocalAnesthesia", ] } name_for_cid[613] = "AnesthesiaInductionCodeTypeforSmallAnimalAnesthesia" cid_concepts[613] = { "SCT": [ "IntramuscularRoute", "PerRectum", "IntravenousRoute", "IntraperitonealRoute", "ByInhalation", ] } name_for_cid[614] = "AnesthesiaInductionCodeTypefromAnesthesiaQualityInitiative" cid_concepts[614] = { "SCT": ["IntramuscularRoute", "PerRectum", "IntravenousRoute", "ByInhalation"] } name_for_cid[615] = "AnesthesiaMaintenanceCodeTypeforSmallAnimalAnesthesia" cid_concepts[615] = { "SCT": [ "InhalationAnesthesiaSystemClosedRebreathingPrimaryAgent", "InhalationAnesthesiaSystemClosedNoRebreathingPrimaryAgent", ] } name_for_cid[616] = "AnesthesiaMaintenanceCodeTypefromAnesthesiaQualityInitiative" cid_concepts[616] = { "SCT": [ "InhalationAnesthesiaSystemClosedRebreathingPrimaryAgent", "InhalationAnesthesiaSystemClosedNoRebreathingPrimaryAgent", ] } name_for_cid[617] = "AirwayManagementMethodCodeTypeforSmallAnimalAnesthesia" cid_concepts[617] = { "DCM": ["NoseCone", "NasalCannula"], "SCT": [ "ViaTracheostomy", "AnestheticFaceMask", "ArtificialRespiration", "ControlledVentilation", "OxygenTherapy", "IntubationOfRespiratoryTract", "LaryngealMaskAirwayLMA", ], } name_for_cid[618] = "AirwayManagementMethodCodeTypefromAnesthesiaQualityInitiative" cid_concepts[618] = { "DCM": ["NasalCannula"], "SCT": [ "ViaTracheostomy", "AnestheticFaceMask", "ArtificialRespiration", "ControlledVentilation", "OxygenTherapy", "IntubationOfRespiratoryTract", "LaryngealMaskAirwayLMA", ], } name_for_cid[619] = "AirwayManagementSubMethodCodeTypeforSmallAnimalAnesthesia" cid_concepts[619] = { "SCT": [ "ContinuousFlowApneicVentilation", "HighFrequencyVentilation", "TranstrachealJetVentilation", ], "UMLS": ["InverseRatioVentilation"], } name_for_cid[620] = "AirwayManagementSubMethodCodeTypefromAnesthesiaQualityInitiative" cid_concepts[620] = { "SCT": [ "ContinuousFlowApneicVentilation", "HighFrequencyVentilation", "TranstrachealJetVentilation", ], "UMLS": ["InverseRatioVentilation"], } name_for_cid[621] = "MedicationTypeforSmallAnimalAnesthesia" cid_concepts[621] = { "DCM": ["CarrierGas"], "SCT": [ "CaloricAgent", "CarbapenemAntibiotic", "BetaLactamAntibiotic", "AminoglycosideAntibiotic", "Potassium", "LocalAnesthetic", "Anticoagulant", "PenicillinAntibiotic", "ThyroidHormone", "MetronidazoleAntibiotic", "Calcium", "Magnesium", "AntidiureticHormone", "Oxytocic", "InotropicAgent", "Antiarrhythmic", "Barbiturate", "Benzodiazepine", "EstrogenReceptorAgonist", "Decongestant", "SulfonamideAntibiotic", "OcularLubricant", "Diuretic", "VancomycinAntibiotic", "Antifungal", "Hypoglycemic", "Steroid", "CephalosporinAntibiotic", "LowMolecularWeightHeparin", "RespiratoryStimulant", "Anticholinergic", "NeuromuscularBlockingNMBNonDepolarizing", "DrugDiluent", "GeneralAnesthetic", "HaemostaticAgent", "MacrolideAntibiotic", "Antihypertensive", "Antibiotic", "HistomineReceptorAntagonist", "AdrenergicAgent", "QuinoloneAntibiotic", "NSAID", "Vitamin", "Antiemetic", "BloodProduct", "AntiHeparinAgent", "Vasodilator", "BenzodiazepineAntagonist", "CalciumChannelBlocker", "CholinergicAgent", "PlasmaExpander", "Anticonvulsant", "BetaBlocker", "Bronchodilator", "TetracyclineAntibiotic", "SkeletalMuscleRelaxant", "NarcoticOpiateAntagonist", "LincomycinAntibiotic", "NeuromuscularBlockingNMBDepolarizing", "Vasopressor", "LinezolidAntibiotic", "GastrointestinalProkinetic", "Analgesic", ], "UMLS": ["H2Antagonist", "NarcoticAnalgesic", "Antihypoglycemic"], } name_for_cid[622] = "MedicationTypeCodeTypefromAnesthesiaQualityInitiative" cid_concepts[622] = { "SCT": [ "CaloricAgent", "CarbapenemAntibiotic", "BetaLactamAntibiotic", "AminoglycosideAntibiotic", "Potassium", "LocalAnesthetic", "Anticoagulant", "PenicillinAntibiotic", "ThyroidHormone", "MetronidazoleAntibiotic", "Calcium", "Magnesium", "AntidiureticHormone", "Oxytocic", "InotropicAgent", "Antiarrhythmic", "Barbiturate", "Benzodiazepine", "EstrogenReceptorAgonist", "Decongestant", "SulfonamideAntibiotic", "OcularLubricant", "Diuretic", "VancomycinAntibiotic", "Antifungal", "Hypoglycemic", "Steroid", "CephalosporinAntibiotic", "LowMolecularWeightHeparin", "RespiratoryStimulant", "Anticholinergic", "NeuromuscularBlockingNMBNonDepolarizing", "DrugDiluent", "GeneralAnesthetic", "HaemostaticAgent", "MacrolideAntibiotic", "Antihypertensive", "Antibiotic", "HistomineReceptorAntagonist", "AdrenergicAgent", "QuinoloneAntibiotic", "NSAID", "Vitamin", "Antiemetic", "BloodProduct", "AntiHeparinAgent", "Vasodilator", "BenzodiazepineAntagonist", "CalciumChannelBlocker", "CholinergicAgent", "PlasmaExpander", "Anticonvulsant", "BetaBlocker", "Bronchodilator", "TetracyclineAntibiotic", "SkeletalMuscleRelaxant", "NarcoticOpiateAntagonist", "LincomycinAntibiotic", "NeuromuscularBlockingNMBDepolarizing", "Vasopressor", "LinezolidAntibiotic", "GastrointestinalProkinetic", "Analgesic", ], "UMLS": ["H2Antagonist", "NarcoticAnalgesic", "Antihypoglycemic"], } name_for_cid[623] = "MedicationforSmallAnimalAnesthesia" cid_concepts[623] = { "SCT": [ "Chloroform", "Succinylcholine", "Pancuronium", "Lidocaine", "Pentobarbital", "Xylazine", "Chlorpromazine", "Diazepam", "Enflurane", "Urethane", "Acepromazine", "Thiamylal", "Sevoflurane", "Etomidate", "Tribromoethanol", "Methohexital", "Bupivacaine", "LidocainePrilocaine", "Azaperone", "Halothane", "Tiletamine", "Zolazepam", "Isoflurane", "Propofol", "Midazolam", "Desflurane", "Alphachloralose", "ChloralHydrate", "Methoxyflurane", "Alphadolone", "Butabarbital", "Ketamine", "DiethylEther", "MedicalAir", "Thiopental", "CarbonDioxide", "Droperidol", "NitrousOxide", "OxygenGas", ], "UMLS": ["RoomAir", "Alphaxalone", "Fluanisone", "Metomidate"], } name_for_cid[624] = "InhalationalAnesthesiaAgentforSmallAnimalAnesthesia" cid_concepts[624] = { "SCT": [ "Chloroform", "Isoflurane", "Methoxyflurane", "Enflurane", "DiethylEther", "CarbonDioxide", "Desflurane", "Halothane", "Sevoflurane", "NitrousOxide", ] } name_for_cid[625] = "InjectableAnesthesiaAgentforSmallAnimalAnesthesia" cid_concepts[625] = { "SCT": [ "Pentobarbital", "Xylazine", "Diazepam", "Propofol", "Urethane", "Midazolam", "Thiamylal", "Etomidate", "Alphachloralose", "ChloralHydrate", "Tribromoethanol", "Methohexital", "Alphadolone", "Butabarbital", "Ketamine", "Thiopental", "Azaperone", "Droperidol", "Tiletamine", "Zolazepam", ], "UMLS": ["Alphaxalone", "Fluanisone", "Metomidate"], } name_for_cid[626] = "PremedicationAgentforSmallAnimalAnesthesia" cid_concepts[626] = {"SCT": ["Chlorpromazine", "Acepromazine"]} name_for_cid[627] = "NeuromuscularBlockingAgentforSmallAnimalAnesthesia" cid_concepts[627] = {"SCT": ["Succinylcholine", "Pancuronium"]} name_for_cid[628] = "AncillaryMedicationsforSmallAnimalAnesthesia" cid_concepts[628] = {} name_for_cid[629] = "CarrierGasesforSmallAnimalAnesthesia" cid_concepts[629] = {"SCT": ["MedicalAir", "OxygenGas"], "UMLS": ["RoomAir"]} name_for_cid[630] = "LocalAnestheticsforSmallAnimalAnesthesia" cid_concepts[630] = {"SCT": ["Lidocaine", "Bupivacaine", "LidocainePrilocaine"]} name_for_cid[631] = "ProcedurePhaseRequiringAnesthesia" cid_concepts[631] = { "SCT": [ "AfterProcedure", "BeforeProcedure", "Intraoperative", "Preoperative", "Postoperative", "DuringProcedure", ] } name_for_cid[632] = "SurgicalProcedurePhaseRequiringAnesthesia" cid_concepts[632] = {"SCT": ["Intraoperative", "Preoperative", "Postoperative"]} name_for_cid[634] = "AnimalHandlingPhase" cid_concepts[634] = { "DCM": [ "InHomeCage", "DuringTransport", "StagingPriorToImaging", "PreparationForImaging", ], "SCT": ["AnesthesiaInduction", "ImagingProcedure"], "UMLS": ["AnesthesiaRecoveryPeriod"], } name_for_cid[635] = "HeatingMethod" cid_concepts[635] = { "DCM": [ "HeatedWaterBlanket", "PreHeatedPad", "Unheated", "ForcedAirHeater", "HeatedImagingDevice", "HeatedPatientSupport", ], "SCT": [ "NonElectricHeatingPad", "ForcedAirWarmingBlanket", "ElectricHeatingPad", "WarmerDevice", "AirHeatingPad", "ElectricBlanket", "WarmingBlanket", ], "UMLS": ["HeatLamp"], } name_for_cid[636] = "TemperatureSensorDeviceComponentTypeforSmallAnimalProcedure" cid_concepts[636] = { "DCM": ["CarrierTemperatureSensor"], "SCT": ["RectalTemperature"], "UMLS": ["Thermography"], } name_for_cid[637] = "ExogenousSubstanceType" cid_concepts[637] = { "DCM": ["TumorGraft"], "SCT": ["Fibril", "Virus", "Cytokine", "Toxin", "GraftMaterial"], } name_for_cid[638] = "ExogenousSubstance" cid_concepts[638] = { "DCM": [ "NonUterineLeiomyosarcoma", "HumanAlphaSynucleinPreformedFibrils", "MouseAlphaSynucleinPreformedFibrils", "HumanTauPreformedFibrils", "MouseTauPreformedFibrils", ], "NCIt": [ "BronchioloalveolarAdenocarcinoma", "SoftTissueSarcomaExcludingRhabdomyosarcoma", ], "PUBCHEM_CID": ["_6Hydroxydopamine"], "SCT": [ "CarcinosarcomaOfUterus", "NonSmallCellCarcinoma", "Osteosarcoma", "SquamousCellCarcinomaOfLung", "AmelanoticMelanoma", "SpindleCellCarcinoma", "TransitionalCellCarcinoma", "Lipopolysaccharide", "Carcinosarcoma", "TumorNecrosisFactorAlpha", "EwingSarcomaPeripheralNeuroectodermalTumor", "BladderCancer", "CancerOfColon", "VascularEndothelialGrowthFactor", "CancerOfCervix", "NeuroendocrineTumor", "LungCancer", "InterferonGamma", "RenalCellCarcinoma", "Sarcoma", "AdenocarcinomaOfRectum", "SquamousCellCarcinomaOfMouth", "SquamousCellCarcinomaOfAnus", "CancerOfSalivaryGland", "Carcinoma", "SquamousCellCarcinomaOfHeadAndNeck", "Lysophosphatidylcholine", "InfiltratingDuctalCarcinomaOfBreast", "MalignantMesothelioma", "Cystadenocarcinoma", "SarcomaOfSoftTissue", "NonSmallCellLungCancer", "AdenoAssociatedVirusGroup", "SmallCellCarcinoma", "AdenocarcinomaOfLargeIntestine", "Fibrosarcoma", "MerkelCellCarcinoma", "Astrocytoma", "Adenocarcinoma", "MixedSmallCellCarcinoma", "Glioblastoma", "AdenocarcinomaOfLung", "SquamousCellCarcinomaOfSkin", "MalignantMelanoma", "LargeCellCarcinoma", "SquamousCellCarcinoma", "PapillaryThyroidCarcinoma", "EwingSarcoma", "MalignantPeripheralNerveSheathTumor", "OvarianCancer", "SquamousCellCarcinomaOfLaryngealCartilage", "AlveolarSoftPartSarcoma", "Leukemia", "AdenocarcinomaOfPancreas", "TheilerMurineEncephalomyelitisVirus", ], "UMLS": ["EthidiumBromide"], } name_for_cid[639] = "TumorGraftHistologicType" cid_concepts[639] = { "DCM": ["NonUterineLeiomyosarcoma"], "NCIt": [ "BronchioloalveolarAdenocarcinoma", "SoftTissueSarcomaExcludingRhabdomyosarcoma", ], "SCT": [ "CarcinosarcomaOfUterus", "NonSmallCellCarcinoma", "Osteosarcoma", "SquamousCellCarcinomaOfLung", "AmelanoticMelanoma", "SpindleCellCarcinoma", "TransitionalCellCarcinoma", "Carcinosarcoma", "EwingSarcomaPeripheralNeuroectodermalTumor", "BladderCancer", "CancerOfColon", "CancerOfCervix", "NeuroendocrineTumor", "LungCancer", "RenalCellCarcinoma", "Sarcoma", "AdenocarcinomaOfRectum", "SquamousCellCarcinomaOfMouth", "SquamousCellCarcinomaOfAnus", "CancerOfSalivaryGland", "Carcinoma", "SquamousCellCarcinomaOfHeadAndNeck", "InfiltratingDuctalCarcinomaOfBreast", "MalignantMesothelioma", "Cystadenocarcinoma", "SarcomaOfSoftTissue", "NonSmallCellLungCancer", "SmallCellCarcinoma", "AdenocarcinomaOfLargeIntestine", "Fibrosarcoma", "MerkelCellCarcinoma", "Astrocytoma", "Adenocarcinoma", "MixedSmallCellCarcinoma", "Glioblastoma", "AdenocarcinomaOfLung", "SquamousCellCarcinomaOfSkin", "MalignantMelanoma", "LargeCellCarcinoma", "SquamousCellCarcinoma", "PapillaryThyroidCarcinoma", "EwingSarcoma", "MalignantPeripheralNerveSheathTumor", "OvarianCancer", "SquamousCellCarcinomaOfLaryngealCartilage", "AlveolarSoftPartSarcoma", "Leukemia", "AdenocarcinomaOfPancreas", ], } name_for_cid[640] = "Fibril" cid_concepts[640] = { "DCM": [ "HumanAlphaSynucleinPreformedFibrils", "MouseAlphaSynucleinPreformedFibrils", "HumanTauPreformedFibrils", "MouseTauPreformedFibrils", ] } name_for_cid[641] = "Virus" cid_concepts[641] = { "SCT": ["TheilerMurineEncephalomyelitisVirus", "AdenoAssociatedVirusGroup"] } name_for_cid[642] = "Cytokine" cid_concepts[642] = { "SCT": [ "InterferonGamma", "VascularEndothelialGrowthFactor", "TumorNecrosisFactorAlpha", ] } name_for_cid[643] = "Toxin" cid_concepts[643] = { "PUBCHEM_CID": ["_6Hydroxydopamine"], "SCT": ["Lysophosphatidylcholine", "Lipopolysaccharide"], "UMLS": ["EthidiumBromide"], } name_for_cid[644] = "ExogenousSubstanceAdministrationSite" cid_concepts[644] = { "NCIt": ["MouseMammaryFatPad"], "SCT": ["Liver", "BoneMarrow", "Tumor", "Brain", "Flank"], } name_for_cid[645] = "ExogenousSubstanceOriginTissue" cid_concepts[645] = { "DCM": ["EmbryonicKidney", "BoneAndSoftTissue"], "SCT": [ "Lung", "PulmonaryMetastasis", "Breast", "AsciticFluid", "Mesothelium", "PleuralEffusion", "Mouth", "Skin", "Prostate", "PeripheralNerveMyelinSheath", "LymphoidTissue", "LymphNode", "HeadAndNeck", "Colon", "Uterus", "CentralNervousSystem", "SoftTissue", "SalivaryGland", "Cervix", "Bladder", "ConnectiveTissue", "Brain", "Larynx", "Lymph", "Rectum", "BoneTissue", "Ovary", "Pancreas", "Anus", "Thyroid", "Kidney", "Metastasis", ], } name_for_cid[646] = "PreclinicalSmallAnimalImagingProcedure" cid_concepts[646] = { "DCM": ["SPECTOfWholeBody", "SPECTCTOfWholeBody"], "LN": [ "MRIWholeBody", "HeadCT", "RadionuclideScanOfWholeBody", "BrainMRI", "RadionuclideBrainScan", "PETWholeBody", "WholeBodyCT", "BrainPET", "BrainSPECT", ], "SCT": ["UltrasonographyOfTotalBody"], } name_for_cid[647] = "PositionReferenceIndicatorforFrameofReference" cid_concepts[647] = {"FMA": ["Bregma", "Lambda"]} name_for_cid[701] = "ContentAssessmentType" cid_concepts[701] = { "DCM": ["RTPreTreatmentConsistencyCheck", "RTPreTreatmentDoseCheck"] } name_for_cid[702] = "RTContentAssessmentType" cid_concepts[702] = { "DCM": ["RTPreTreatmentConsistencyCheck", "RTPreTreatmentDoseCheck"] } name_for_cid[703] = "AssessmentBasis" cid_concepts[703] = {"DCM": ["AssessmentByRules", "AssessmentByComparison"]} name_for_cid[800] = "ProtocolAssertion" cid_concepts[800] = { "DCM": [ "ApprovedForUseInTheClinicalTrial", "IneligibleForReimbursement", "ApprovedForUseAtTheInstitution", "EligibleForReimbursementOnPerPatientBasis", "DisapprovedForUseOnPregnantPatients", "AppropriateForTheDevice", "ApprovedForUseOnPregnantPatients", "OutsideOperationalLimitsOfTheDevice", "OptimizedForTheDeviceInstance", "InappropriateForTheDevice", "InsideOperationalLimitsOfTheDevice", "DisapprovedForAnyUse", "NotOptimizedForTheDeviceInstance", "InconsistentWithLabelingOfTheDevice", "ApprovedForExperimentalUse", "InappropriateForTheIndications", "DeprecatedProtocol", "ConsistentWithLabelingOfTheDevice", "DisapprovedForUseInTheClinicalTrial", "EligibleForReimbursement", "AppropriateForTheIndications", "DisapprovedForUseAtTheInstitution", "DisapprovedForExperimentalUse", ] } name_for_cid[1000] = "CTTransversePlaneReferenceBasis" cid_concepts[1000] = { "DCM": ["AcquiredVolume"], "FMA": ["Nasion"], "SCT": [ "KneeJoint", "TemporalBone", "Sacrum", "LevelOfL1L2IntervertebralDisc", "ApexOfHeart", "SternoclavicularJoint", "LevelOfT7T8IntervertebralDisc", "OrthopedicDevice", "C1Vertebra", "LevelOfC5C6IntervertebralDisc", "WristJoint", "LevelOfT11T12IntervertebralDisc", "Ischium", "Diaphragm", "LevelOfT3T4IntervertebralDisc", "CarotidArtery", "LevelOfT2T3IntervertebralDisc", "Talus", "FemoralHead", "MaxillarySinus", "LevelOfT10T11IntervertebralDisc", "MalleolarStructureOfTibia", "LevelOfT6T7IntervertebralDisc", "LevelOfC2C3IntervertebralDisc", "Mandible", "Metacarpal", "Foot", "CommonIliacArteryBifurcation", "LevelOfC6C7IntervertebralDisc", "MastoidBone", "XiphoidProcess", "Acetabulum", "LevelOfL4L5IntervertebralDisc", "ForamenMagnum", "AnkleJoint", "LevelOfL5S1IntervertebralDisc", "LevelOfT9T10IntervertebralDisc", "Lung", "LevelOfT5T6IntervertebralDisc", "PituitaryFossa", "LevelOfL3L4IntervertebralDisc", "SymphysisPubis", "LevelOfT12L1IntervertebralDisc", "TibialPlateau", "LesserTrochanter", "AorticArch", "Carina", "LevelOfC3C4IntervertebralDisc", "Heart", "Toe", "ShoulderRegionStructure", "ElbowJoint", "MorphologicallyAbnormalStructure", "LateralCanthus", "Sternum", "ThoracicInlet", "IliacCrest", "OrbitalStructure", "LevelOfT8T9IntervertebralDisc", "LevelOfL2L3IntervertebralDisc", "HipJoint", "LevelOfC7T1IntervertebralDisc", "LevelOfC4C5IntervertebralDisc", "MastoidCellsAndAntra", "SuprasternalNotch", "FrontalSinus", "CardiacPacemaker", "Skull", "Pancreas", "LevelOfT4T5IntervertebralDisc", "InternalAuditoryMeatus", "Liver", "LevelOfT1T2IntervertebralDisc", "CoronaryArteryGraft", "ExternalAuditoryMeatus", "VertexOfHead", "Scapula", "Patella", "Kidney", "AdrenalGland", "StentDevice", "AcromioclavicularJoint", "Scaphoid", "ImplantDevice", ], } name_for_cid[1001] = "AnatomicalReferenceBasis" cid_concepts[1001] = { "FMA": ["Nasion"], "SCT": [ "KneeJoint", "TemporalBone", "Sacrum", "LevelOfL1L2IntervertebralDisc", "ApexOfHeart", "SternoclavicularJoint", "LevelOfT7T8IntervertebralDisc", "C1Vertebra", "LevelOfC5C6IntervertebralDisc", "WristJoint", "LevelOfT11T12IntervertebralDisc", "Ischium", "Diaphragm", "LevelOfT3T4IntervertebralDisc", "CarotidArtery", "LevelOfT2T3IntervertebralDisc", "Talus", "FemoralHead", "MaxillarySinus", "LevelOfT10T11IntervertebralDisc", "MalleolarStructureOfTibia", "LevelOfT6T7IntervertebralDisc", "LevelOfC2C3IntervertebralDisc", "Mandible", "Metacarpal", "Foot", "CommonIliacArteryBifurcation", "LevelOfC6C7IntervertebralDisc", "MastoidBone", "XiphoidProcess", "Acetabulum", "LevelOfL4L5IntervertebralDisc", "ForamenMagnum", "AnkleJoint", "LevelOfL5S1IntervertebralDisc", "LevelOfT9T10IntervertebralDisc", "Lung", "LevelOfT5T6IntervertebralDisc", "PituitaryFossa", "LevelOfL3L4IntervertebralDisc", "SymphysisPubis", "LevelOfT12L1IntervertebralDisc", "TibialPlateau", "LesserTrochanter", "AorticArch", "Carina", "LevelOfC3C4IntervertebralDisc", "Heart", "Toe", "ShoulderRegionStructure", "ElbowJoint", "LateralCanthus", "Sternum", "ThoracicInlet", "IliacCrest", "OrbitalStructure", "LevelOfT8T9IntervertebralDisc", "LevelOfL2L3IntervertebralDisc", "HipJoint", "LevelOfC7T1IntervertebralDisc", "LevelOfC4C5IntervertebralDisc", "MastoidCellsAndAntra", "SuprasternalNotch", "FrontalSinus", "Skull", "Pancreas", "LevelOfT4T5IntervertebralDisc", "InternalAuditoryMeatus", "Liver", "LevelOfT1T2IntervertebralDisc", "CoronaryArteryGraft", "ExternalAuditoryMeatus", "VertexOfHead", "Scapula", "Patella", "Kidney", "AdrenalGland", "AcromioclavicularJoint", "Scaphoid", ], } name_for_cid[1002] = "AnatomicalReferenceBasisHead" cid_concepts[1002] = { "FMA": ["Nasion"], "SCT": [ "TemporalBone", "MaxillarySinus", "PituitaryFossa", "Mandible", "MastoidCellsAndAntra", "MastoidBone", "FrontalSinus", "Skull", "InternalAuditoryMeatus", "CarotidArtery", "ExternalAuditoryMeatus", "VertexOfHead", "ForamenMagnum", "LateralCanthus", "OrbitalStructure", ], } name_for_cid[1003] = "AnatomicalReferenceBasisSpine" cid_concepts[1003] = { "SCT": [ "LevelOfT9T10IntervertebralDisc", "LevelOfT8T9IntervertebralDisc", "LevelOfT5T6IntervertebralDisc", "LevelOfL1L2IntervertebralDisc", "LevelOfL2L3IntervertebralDisc", "LevelOfL3L4IntervertebralDisc", "LevelOfT7T8IntervertebralDisc", "LevelOfC7T1IntervertebralDisc", "LevelOfT10T11IntervertebralDisc", "LevelOfT12L1IntervertebralDisc", "LevelOfT6T7IntervertebralDisc", "LevelOfC2C3IntervertebralDisc", "LevelOfC4C5IntervertebralDisc", "C1Vertebra", "LevelOfC5C6IntervertebralDisc", "LevelOfT11T12IntervertebralDisc", "LevelOfC6C7IntervertebralDisc", "LevelOfC3C4IntervertebralDisc", "LevelOfT3T4IntervertebralDisc", "LevelOfT4T5IntervertebralDisc", "LevelOfT1T2IntervertebralDisc", "LevelOfL4L5IntervertebralDisc", "LevelOfT2T3IntervertebralDisc", "LevelOfL5S1IntervertebralDisc", ] } name_for_cid[1004] = "AnatomicalReferenceBasisChest" cid_concepts[1004] = { "SCT": [ "Lung", "ApexOfHeart", "SternoclavicularJoint", "AorticArch", "Carina", "SuprasternalNotch", "Diaphragm", "Heart", "XiphoidProcess", "CoronaryArteryGraft", "ShoulderRegionStructure", "Scapula", "AcromioclavicularJoint", "Sternum", "ThoracicInlet", ] } name_for_cid[1005] = "AnatomicalReferenceBasisAbdomen/Pelvis" cid_concepts[1005] = { "SCT": [ "FemoralHead", "Sacrum", "SymphysisPubis", "HipJoint", "LesserTrochanter", "Ischium", "CommonIliacArteryBifurcation", "Pancreas", "Acetabulum", "Liver", "Kidney", "AdrenalGland", "IliacCrest", ] } name_for_cid[1006] = "AnatomicalReferenceBasisExtremity" cid_concepts[1006] = { "SCT": [ "Foot", "KneeJoint", "Toe", "MalleolarStructureOfTibia", "TibialPlateau", "ElbowJoint", "Patella", "WristJoint", "AnkleJoint", "Metacarpal", "Scaphoid", "Talus", ] } name_for_cid[1010] = "ReferenceGeometryPlane" cid_concepts[1010] = { "DCM": [ "PlaneThroughDistalExtent", "PlaneThroughProximalExtent", "PlaneThroughLateralExtent", "PlaneThroughMedialExtent", "PlaneThroughRightmostExtent", "PlaneThroughLeftmostExtent", "PlaneThroughPosteriorExtent", "PlaneThroughAnteriorExtent", "PlaneThroughCenter", "PlaneThroughInferiorExtent", "PlaneThroughSuperiorExtent", ] } name_for_cid[1011] = "ReferenceGeometryPoint" cid_concepts[1011] = {"DCM": ["CenterOfMass", "GeometricCenterpoint"]} name_for_cid[1015] = "PatientAlignmentMethod" cid_concepts[1015] = {"DCM": ["LaserCrossHairs"]} name_for_cid[1200] = "ContraindicationsForCTImaging" cid_concepts[1200] = { "SCT": ["ContrastMediaAllergy", "PatientCurrentlyPregnant", "ImpairedRenalFunction"] } name_for_cid[1201] = "ContraindicationsForXAImaging" cid_concepts[1201] = { "SCT": [ "ContrastMediaAllergy", "BloodCoagulationDisorders", "CardiacArrhythmia", "PatientCurrentlyPregnant", "Sepsis", "ImpairedRenalFunction", ] } name_for_cid[3000] = "AudioChannelSource" cid_concepts[3000] = { "DCM": [ "PhysiologicalAudioSignal", "Phonocardiogram", "OperatorNarrative", "Voice", "DopplerAudio", "AmbientRoomEnvironment", ] } name_for_cid[3001] = "ECGLead" cid_concepts[3001] = { "MDC": [ "FrankLeadC", "FrankLeadA", "FrankLeadM", "FrankLeadF", "ChestManubriumLeadPerV5Placement", "LeftArmLead", "CanineSixthLeftIntercostalSpaceAtCostochondralJunction", "RightArmLead", "LeftLegLead", "CanineOverDorsalSpinousProcessOf7thThoracicVertebra", "FrankLeadI", "FrankLeadE", "DerivedLeadV5", "DerivedLeadV6", "FrankLeadH", "DerivedLeadI", "DerivedLeadII", "DerivedLeadV1", "DerivedLeadV2", "DerivedLeadV3", "DerivedLeadV4", "EASILeadAS", "EASILeadAI", "EASIUpperSternumLead", "AuxiliaryBipolarLead4", "EASILeadES", "RightLegLead", "CanineFifthRightIntercostalSpaceNearEdgeOfSternum", "CanineSixthLeftIntercostalSpaceNearEdgeOfSternum", "LeadI", "UnspecifiedLead", "LeadV1", "LeadII", "LeadV3", "LeadV2", "LeadV5", "LeadV4", "LeadV7", "LeadV6", "DerivedLeadAvf", "AvrAugmentedVoltageRight", "ChestManubriumLeadPerV6Placement", "AvlAugmentedVoltageLeft", "DerivedLeadIII", "AvfAugmentedVoltageFoot", "DerivedLeadAvr", "Avr", "DerivedLeadAvl", "LeadV8", "LeadV9", "LeadV8R", "LeadV9R", "LeadIII", "AuxiliaryBipolarLead3", "LeadCR5", "ModifiedLimbLead", "AuxiliaryBipolarLead1", "AuxiliaryBipolarLead2", "ChestManubriumLeadPerV7Placement", "DefibrillatorLeadAnteriorLateral", "LeadCH5", "ExternalPacingLeadAnteriorPosterior", "AuxiliaryUnipolarLead1", "NegativeRightInfraclavicularFossa", "AuxiliaryUnipolarLead2", "NegativeLowRightScapulaLead", "AuxiliaryUnipolarLead3", "AuxiliaryUnipolarLead4", "LeadDNehbDorsal", "LeadANehbAnterior", "LeadJNehbInferior", "ChestLead", "PrecordialLead", "LeadVRNonaugmentedVoltageVectorOfRA", "LeadVLNonaugmentedVoltageVectorOfLA", "ChestManubriumLeadPerV2Placement", "LeadV7R", "ChestManubriumLeadPerV3Placement", "LeadX", "ChestManubriumLeadPerV4Placement", "LeadY", "LeadZ", "ChestLeadPerV5AndV5RPlacement", "ChestLeadPerV6AndV6RPlacement", "ChestLeadPerV7AndV8RPlacement", "ChestManubriumLead", "ChestManubriumLeadPerV1Placement", "ModifiedChestLeadPerV4Placement", "ChestLeadPerV2AndV2RPlacement", "ModifiedChestLeadPerV5Placement", "ChestLeadPerV3AndV3RPlacement", "ModifiedChestLeadPerV6Placement", "ChestLeadSymmetricPlacement", "ChestLeadPerV4AndV4RPlacement", "LeadV2R", "ChestLeadPerV1AndV1RPlacement", "LeadV3R", "LeadV4R", "LeadV5R", "LeadV6R", "LeadVFNonaugmentedVoltageVectorOfLL", "ModifiedChestLead", "ModifiedChestLeadPerV1Placement", "ModifiedChestLeadPerV2Placement", "ModifiedChestLeadPerV3Placement", ] } name_for_cid[3003] = "HemodynamicWaveformSource" cid_concepts[3003] = { "SCT": [ "HemodynamicOxygenSaturationWaveform", "LeftAtriumPressureWaveform", "RightVentriclePressureWaveform", "ThermalCardiacOutputWaveform", "HemodynamicPressureWaveform", "PulmonaryValvePullbackPressureWaveform", "TemperatureWaveform", "PulmonaryCapillaryWedgePressureWaveform", "ArterialPressureWaveform", "TricuspidValvePullbackPressureWaveform", "AorticPressureWaveform", "FemoralArteryPressureWaveform", "HemodynamicFlowWaveform", "LeftVentriclePressureWaveform", "RightAtriumPressureWaveform", "DyeDilutionCardiacOutputWaveform", "MitralValvePullbackPressureWaveform", "AorticValvePullbackPressureWaveform", "HemodynamicWaveform", "RespirationImpedanceWaveform", "HemodynamicImpedanceWaveform", "CentralVenousPressureWaveform", "PulmonaryArteryOxygenSaturationWaveform", "PulmonaryArteryWedgePressureWaveform", "PulmonaryArteryPressureWaveform", ] } name_for_cid[3004] = "ArterialPulseWaveform" cid_concepts[3004] = {"DCM": ["ArterialPulseWaveform"]} name_for_cid[3005] = "RespirationWaveform" cid_concepts[3005] = { "DCM": [ "Airflow", "CO2Respiration", "AirflowCPAP", "CO2TrendSideStream", "CO2TrendMainStream", "CO2WaveformSideStream", "EsophagealPressure", "PAPTidalVolume", "RespirationWaveform", "PAPLeakPressure", "PAPPressure", "ThoracicRespiratoryPVDF", "AbdominalRespiratoryInductance", "ThoracicRespiratoryInductance", "RespiratoryPressure", "AbdominalRespiratoryEffort", "ThoracicRespiratoryEffort", "AbdominalRespiratoryPVDF", "CO2TrendEndTidalMainStream", "CO2WaveformEndTidalMainStream", "CO2Transcutaneous", "RespiratoryEffort", "AirflowNasalProng", "AirflowThermocouple", "CO2WaveformMainStream", "AirflowThermistor", "CO2TrendEndTidalSideStream", "CO2WaveformEndTidalSideStream", "AirflowPVDF", ] } name_for_cid[3010] = "CardiovascularAnatomicStructure" cid_concepts[3010] = { "SCT": [ "InternalCarotidArtery", "SubclavianVein", "ExternalIliacArtery", "TruncusCoeliacus", "BasilarArtery", "ApexOfRightVentricle", "SuperiorRightPulmonaryVein", "InferiorVenaCava", "RightPulmonaryArtery", "GenicularArtery", "LeftVentricleInflow", "VenousNetwork", "CarotidArtery", "CommonAtrium", "UmbilicalArtery", "PrimitiveAorta", "AorticFistula", "LeftVentricleOutflowTract", "RadialArtery", "RightFemoralArtery", "SuperiorThyroidArtery", "IliacArtery", "LeftFemoralArtery", "AnteriorTibialArtery", "TruncusArteriosusCommunis", "Artery", "AntecubitalVein", "CommonCarotidArtery", "Aorta", "PatentDuctusArteriosus", "SuperficialTemporalArtery", "MesentericVein", "Vein", "CongenitalCoronaryArteryFistulaToLeftVentricle", "PulmonaryVein", "InferiorRightPulmonaryVein", "CoronaryArtery", "ExternalIliacVein", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "SubclavianArtery", "BodyConduit", "OphthalmicArtery", "RightVentricleInflow", "MesentericArtery", "PoplitealArtery", "PulmonaryVenousAtrium", "BrachialVein", "InternalIliacArtery", "PulmonaryChamberOfCorTriatriatum", "SuperiorVenaCava", "UlnarArtery", "LeftVentricle", "AnteriorSpinalArtery", "HepaticArtery", "SplenicVein", "PeronealArtery", "RightVentricleOutflowTract", "SaphenousVein", "InnominateArtery", "SplenicArtery", "RenalArtery", "SuperiorLeftPulmonaryVein", "SystemicCollateralArteryToLung", "FacialArtery", "LumbarArtery", "ApexOfLeftVentricle", "AzygosVein", "FemoralArtery", "PulmonaryArtery", "BrachialArtery", "IliacVein", "CongenitalCoronaryArteryFistulaToRightVentricle", "PosteriorMedialTributary", "CommonFemoralArtery", "PulmonaryArteryConduit", "RightAtrium", "AnteriorCommunicatingArtery", "CongenitalCoronaryArteryFistulaToLeftAtrium", "RightVentricle", "ThoracicAorta", "CommonVentricle", "VenaCava", "CoronarySinus", "AxillaryArtery", "LeftPulmonaryArtery", "HepaticVein", "InternalMammaryArtery", "VertebralArtery", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "InternalJugularVein", "LacrimalArteryOfRightEye", "ExternalCarotidArtery", "SuperiorMesentericArtery", "UmbilicalVein", "CommonIliacVein", "PosteriorTibialArtery", "FemoralVein", "RightAuricularAppendage", "GreatCardiacVein", "InnominateVein", "PrimitivePulmonaryArtery", "SuperficialFemoralArtery", "PortalVein", "InferiorLeftPulmonaryVein", "PosteriorCommunicationArtery", "JuxtaposedAtrialAppendage", "AorticArch", "RenalVein", "BoydPerforatingVein", "AbdominalAorta", "CommonIliacArtery", "CephalicVein", "LingualArtery", "GastricVein", "CongenitalCoronaryArteryFistulaToRightAtrium", "InferiorCardiacVein", "Baffle", "LeftAuricularAppendage", "LacrimalArtery", "OccipitalArtery", "SystemicVenousAtrium", "AscendingAorta", "HunterianPerforatingVein", "AnomalousPulmonaryVein", "AnteriorCardiacVein", "ProfundaFemorisArtery", "LeftAtrium", "CerebralArtery", "AxillaryVein", "InferiorMesentericArtery", "GreatSaphenousVein", "OccipitalVein", "DoddPerforatingVein", ] } name_for_cid[3011] = "ElectrophysiologyAnatomicLocation" cid_concepts[3011] = { "SCT": [ "GreatCardiacVein", "LateralHighRightAtrium", "LowRightAtrium", "RightVentricleInflow", "InferiorLeftPulmonaryVein", "ApexOfRightVentricle", "SuperiorRightPulmonaryVein", "PurkinjeFibers", "LeftPosteriorDivisionOfLeftBranchAtrioventricularBundle", "MitralRing", "RightAtrium", "LeftVentricleInflow", "RightVentricle", "LeftVentricle", "CommonVentricle", "MiddleCardiacVein", "PulmonicRing", "CoronarySinus", "HighRightAtrium", "AtrioventricularNode", "LeftVentricleOutflowTract", "MidRightAtrium", "TricuspidRing", "RightVentricleOutflowTract", "TendonOfTodaro", "SuperiorLeftPulmonaryVein", "LeftAuricularAppendage", "Epicardium", "RightBranchOfAtrioventricularBundle", "AccessoryAtrioventricularBundle", "ApexOfLeftVentricle", "OstiumOfCoronarySinus", "RightAtrioventricularOstium", "LeftAnteriorDivisionOfLeftBranchAtrioventricularBundle", "LeftAtrium", "PulmonaryVein", "InferiorRightPulmonaryVein", "LeftBranchOfAtrioventricularBundle", "RightAuricularAppendage", "AtrioventricularBundle", "SinoAtrialNode", ] } name_for_cid[3014] = "CoronaryArterySegment" cid_concepts[3014] = { "BARI": [ "_2ndMarginalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_1stMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "PosteriorDescendingSeptalPerforators", ], "SCT": [ "ProximalRightCoronaryArtery", "_3rdLeftPosterolateralCoronaryArtery", "RightPosteriorAVCoronaryArtery", "ProximalCircumflexCoronaryArtery", "_2ndMarginalCoronaryArtery", "MidCircumflexCoronaryArtery", "_1stLeftPosterolateralCoronaryArtery", "IntermediateArteryRamus", "LeftMainCoronaryArteryOstium", "DistalLeftAnteriorDescendingCoronaryArtery", "RightCoronaryArteryOstium", "LeftMainCoronaryArtery", "_2ndLeftPosterolateralCoronaryArtery", "DistalRightCoronaryArtery", "MarginalCoronaryArtery", "_2ndRightPosterolateralCoronaryArtery", "PosteriorDescendingRightCoronaryArtery", "LeftPosteriorDescendingCircumflexCoronaryArtery", "_1stMarginalCoronaryArtery", "ProximalLeftAnteriorDescendingCoronaryArtery", "_3rdDiagonalCoronaryArtery", "_1stSeptalCoronaryArtery", "_3rdMarginalCoronaryArtery", "_1stDiagonalCoronaryArtery", "MidRightCoronaryArtery", "_2ndDiagonalCoronaryArtery", "AVGrooveContinuationOfCircumflexArtery", "DistalCircumflexCoronaryArtery", "MidLeftAnteriorDescendingCoronaryArtery", "_1stRightPosterolateralCoronaryArtery", "_3rdRightPosterolateralCoronaryArtery", ], } name_for_cid[3015] = "CoronaryArtery" cid_concepts[3015] = { "BARI": [ "_2ndMarginalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_1stMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "PosteriorDescendingSeptalPerforators", ], "SCT": [ "ProximalRightCoronaryArtery", "_3rdLeftPosterolateralCoronaryArtery", "RightPosteriorAVCoronaryArtery", "ProximalCircumflexCoronaryArtery", "_2ndMarginalCoronaryArtery", "MidCircumflexCoronaryArtery", "_1stLeftPosterolateralCoronaryArtery", "IntermediateArteryRamus", "CircumflexCoronaryArtery", "LeftMainCoronaryArteryOstium", "DistalLeftAnteriorDescendingCoronaryArtery", "RightCoronaryArteryOstium", "LeftCoronaryArtery", "LeftMainCoronaryArtery", "_2ndLeftPosterolateralCoronaryArtery", "DistalRightCoronaryArtery", "MarginalCoronaryArtery", "_2ndRightPosterolateralCoronaryArtery", "PosteriorDescendingRightCoronaryArtery", "LeftAnteriorDescendingCoronaryArtery", "LeftPosteriorDescendingCircumflexCoronaryArtery", "_1stMarginalCoronaryArtery", "ProximalLeftAnteriorDescendingCoronaryArtery", "_3rdDiagonalCoronaryArtery", "_1stSeptalCoronaryArtery", "RightCoronaryArtery", "_3rdMarginalCoronaryArtery", "_1stDiagonalCoronaryArtery", "MidRightCoronaryArtery", "_2ndDiagonalCoronaryArtery", "AVGrooveContinuationOfCircumflexArtery", "DistalCircumflexCoronaryArtery", "MidLeftAnteriorDescendingCoronaryArtery", "CoronaryArteryGraft", "LeftPosterolateralCircumflexCoronaryArtery", "_1stRightPosterolateralCoronaryArtery", "_3rdRightPosterolateralCoronaryArtery", "PosterolateralBranchOfRightCoronaryArtery", ], } name_for_cid[3016] = "MajorCoronaryArtery" cid_concepts[3016] = { "SCT": [ "CircumflexCoronaryArtery", "LeftAnteriorDescendingCoronaryArtery", "RightCoronaryArtery", "LeftCoronaryArtery", "LeftMainCoronaryArtery", ] } name_for_cid[3019] = "CardiovascularAnatomicStructureModifier" cid_concepts[3019] = { "DCM": [ "GraftToCitedSegmentDistalSection", "GraftToCitedSegmentProximalSection", "GraftToCitedSegmentMidSection", "Median", "AneurysmOnCitedVessel", ], "NCIt": ["Middle"], "SCT": [ "EntireVessel", "Central", "Right", "Posterior", "Left", "Superior", "Distal", "Proximal", "MidLongitudinal", "Lateral", "Inferior", "GraftToDistalAnastomosis", "Ostium", "Anterior", "GraftToProximalAnastomosis", ], } name_for_cid[3020] = "AssessmentfromCADRADS™" cid_concepts[3020] = { "DCM": [ "NNonDiagnosticStudy", "_5TotalCoronaryOcclusion", "_3ModerateStenosis", "_2MildNonObstructiveCAD", "_1MinimalNonObstructiveCAD", "_0DocumentedAbsenceOfCAD", "_4SevereStenosis", ] } name_for_cid[3021] = "CADRADS™StenosisAssessmentModifier" cid_concepts[3021] = {"DCM": ["_4BSevereStenosis", "_4ASevereStenosis"]} name_for_cid[3022] = "CADRADS™AssessmentModifier" cid_concepts[3022] = { "DCM": ["SStent", "NNonDiagnosticSegments", "VVulnerablePlaque", "GGraft"] } name_for_cid[3030] = "EEGLead" cid_concepts[3030] = { "DCM": ["Fp10", "Fp9", "PO10", "PO9", "AF10", "AF9", "O10", "O9"], "MDC": [ "P4", "F6", "TP7", "Oz", "CP1", "AF8", "FC6", "P6", "F8", "P5", "T10", "F7", "C6", "Sp2", "PO4", "FT8", "PO3", "Iz", "FT7", "TP8", "CP2", "Sp1", "Cpz", "P3", "T6", "F5", "C4", "T9", "P2", "F4", "Poz", "FC5", "Pg1", "Pg2", "Pz", "C5", "AF4", "FC4", "AF7", "A2", "FC3", "CP6", "F2", "T1", "Fcz", "P1", "T4", "T2", "FC2", "AF3", "F3", "C2", "T5", "Cz", "C3", "O2", "F9", "Fp2", "F10", "PO7", "Fpz", "FT9", "TP10", "FC1", "CP4", "TP9", "CP3", "Fp1", "T3", "Fz", "C1", "P10", "P9", "A1", "Afz", "CP5", "PO8", "F1", "FT10", "Nz", "O1", ], } name_for_cid[3031] = "LeadLocationNearorinMuscle" cid_concepts[3031] = { "MDC": [ "MusculusPeroneusBrevis", "MusculusPeroneusLongusRight", "MusculustricepsSurae", "MusculusPeroneusBrevisRight", "MusculusPeroneusBrevisLeft", "MusculustricepsSuraeRight", "MusculustricepsSuraeLeft", "MusculusExtensorHallucisLongusLeft", "MusculusExtensorHallucisLongus", "MusculusExtensorHallucisLongusRight", "MusculusPeroneusLongusLeft", "MusculusPeroneusLongus", "MusculusRectusSuperiorRight", "MusculusRectusSuperiorLeft", "MusculusCricothyroideusRight", "MusculusRectusSuperior", "MusculusCricothyroideusLeft", "MusculusCricothyroideus", "MusculusRectusInferiorRight", "MusculusRectusInferiorLeft", "MusculusTyroartenoideusRight", "MusculusRectusInferior", "MusculusTyroartenoideusLeft", "MusculusTyroartenoideus", "MusculusRectusMedialisLeft", "MusculusRectusMedialis", "MusculiColliLeft", "MusculiColli", "MusculusGenioglossus", "MusculusSemispinalisLeft", "MusculusSemispinalis", "MusculiLinguaeRight", "MusculusSpinalisCapitisRight", "MusculiLaringis", "MusculusSemispinalisThoracisLeft", "MusculiCapitisRight", "MusculusSemispinalisThoracis", "MusculiCapitisLeft", "MusculusGenioglossusRight", "MusculiCapitis", "MusculusGenioglossusLeft", "MusculusSemispinalisRight", "MusculiBulbiRight", "MusculiBulbiLeft", "MusculiLaringisRight", "MusculiBulbi", "MusculiLaringisLeft", "MusculusSemispinalisThoracisRight", "MusculusObliquusInferior", "MusculiFacialesEtMasticatores", "MusculusObliquusInferiorRight", "MusculusObliquusInferiorLeft", "MusculusOccipitofrontalisVenterFrontalis", "MusculiFacialesEtMasticatoresRight", "MusculiFacialesEtMasticatoresLeft", "MusculusOccipitofrontalisVenterFrontalisLeft", "MusculiColliRight", "MusculusRectusLateralisLeft", "PlatysmaRight", "MusculusRectusLateralis", "PlatysmaLeft", "Platysma", "MusculusRectusMedialisRight", "MusculusObliquusSuperiorLeft", "MusculusCapitisLongusRight", "MusculusObliquusSuperior", "MusculusCapitisLongusLeft", "MusculusCapitisLongus", "MusculusRectusLateralisRight", "MusculusObliquusSuperiorRight", "MusculusOccipitofrontalisVenterFrontalisRight", "MusculusOrbicularisOculiRight", "MusculusOrbicularisOculiLeft", "MusculusOrbicularisOculi", "MusculusOrbicularisOculiParsOrbitalisRight", "MusculusOrbicularisOculiParsOrbitalisLeft", "MusculusOrbicularisOculiParsOrbitalis", "MusculusMylohyoideusLeft", "MusculusPectoralisMinorRight", "MusculusMylohyoideus", "MusculusPectoralisMinorLeft", "MusculusAnconeusRight", "MusculusPectoralisMinor", "MusculusAnconeusLeft", "MusculiInterosseiPalmaresRight", "MusculusDigastricusVenterPosteriorRight", "MusculusAnconeus", "MusculiInterosseiPalmaresLeft", "MusculusExtensorDigitorumLongusRight", "MusculusMylohyoideusRight", "MusculusSubclaviusLeft", "MusculusPronatorTeresRight", "MusculusSubclavius", "MusculusPronatorTeresLeft", "MusculusPronatorTeres", "MusculiDorsi", "MusculusSerratusAnteriorLeft", "MusculusFlexorCarpiRadialisRight", "MusculusAuricularisPosteriorRight", "MusculusSerratusAnterior", "MusculusFlexorCarpiRadialisLeft", "MusculusAuricularisPosteriorLeft", "MusculusFlexorCarpiRadialis", "MusculusAuricularisPosterior", "MusculusSubclaviusRight", "MusculusDigastricusRight", "MusculusTricepsBrachiiCaputLaterale", "MusculiLumbricalesLeft", "MusculusDigastricusLeft", "MusculiInterspinalesLumborumRight", "MusculiLumbricales", "MusculusSemimembranosusLeft", "MusculusDigastricus", "MusculiInterspinalesLumborumLeft", "MusculusTricepsBrachiiCaputLongumRight", "MusculusSemimembranosus", "MusculiInterspinalesLumborum", "MusculusTricepsBrachiiCaputLongumLeft", "MusculusOpponensDigitiMinimiRight", "MusculusDigastricusVenterAnteriorLeft", "MusculusDigastricusVenterAnterior", "MusculiThoracisLeft", "MusculiThoracis", "MusculusTricepsBrachiiCaputLateraleLeft", "MusculiThoracisRight", "MusculiInterosseiDorsales", "MusculusTibialisAnteriorLeft", "MusculusTricepsBrachiiCaputLateraleRight", "MusculusTibialisAnterior", "MusculiLumbricalesRight", "MusculusSemimembranosusRight", "MusculusDigastricusVenterPosteriorLeft", "MusculusPectoralisMajorRight", "MusculiInterosseiPalmares", "MusculusExtensorDigitorumLongusLeft", "MusculusDigastricusVenterPosterior", "MusculusPectoralisMajorLeft", "MusculusTricepsBrachiiCaputMedialeRight", "MusculusExtensorDigitorumLongus", "MusculusPectoralisMajor", "MusculusTricepsBrachiiCaputMedialeLeft", "MusculiInterosseiDorsalesRight", "MusculusDigastricusVenterAnteriorRight", "MusculusTricepsBrachiiCaputMediale", "MusculiInterosseiDorsalesLeft", "MusculusTibialisAnteriorRight", "MusculusZygomaticusMajorRight", "MusculusZygomaticusMajorLeft", "MusculusTrapeziusRight", "MusculusZygomaticusMajor", "MusculusTrapeziusLeft", "MusculiAbdominisRight", "MusculusTrapezius", "MusculiAbdominisLeft", "MusculusFlexorDigitorumSuperficialisRight", "MusculusFlexorDigitorumProfundus", "MusculusZygomaticusMinorLeft", "MusculusLatissimusDorsiRight", "MusculusFlexorPollicisLongus", "MusculusZygomaticusMinor", "MusculusLatissimusDorsiLeft", "MusculusRectusAbdominisRight", "MusculusLatissimusDorsi", "MusculusRectusAbdominisLeft", "MusculusFlexorDigitorumProfundusRight", "MusculusRectusAbdominis", "MusculusFlexorDigitorumProfundusLeft", "MusculusLevatorLabiiSuperiorisLeft", "MusculusRhomboideusMajorRight", "MusculusPronatorQuadratus", "MusculusLevatorLabiiSuperioris", "MusculusRhomboideusMajorLeft", "MusculusObliquusExternusAbdominisRight", "MusculusRhomboideusMajor", "MusculusObliquusExternusAbdominisLeft", "MusculusFlexorPollicisLongusRight", "MusculusZygomaticusMinorRight", "MusculusObliquusExternusAbdominis", "MusculusFlexorPollicisLongusLeft", "MusculiIntercostalesLeft", "MusculusOrbicularisOrisRight", "MusculiIntercostales", "MusculusPalmarisLongusLeft", "MusculusOrbicularisOrisLeft", "MusculiDorsiRight", "MusculusPalmarisLongus", "MusculusOrbicularisOris", "MusculiDorsiLeft", "MusculusSerratusAnteriorRight", "MusculusDepressorAnguliOrisLeft", "MusculusDepressorAnguliOris", "MusculusDepressorAnguliOrisRight", "Diaphragma", "MusculusFlexorCarpiUlnarisLeft", "MusculusIliopsoasRight", "MusculusFlexorCarpiUlnaris", "MusculusIliopsoasLeft", "MusculiIntercostalesRight", "MusculusIliopsoas", "MusculusPalmarisLongusRight", "MusculusRisoriusRight", "MusculiAbdominis", "MusculusFlexorDigitorumSuperficialisLeft", "MusculusGluteusMaximusRight", "MusculusRisoriusLeft", "MusculusFlexorDigitorumSuperficialis", "MusculusGluteusMaximusLeft", "MusculusRisorius", "DiaphragmaRight", "MusculusGluteusMaximus", "DiaphragmaLeft", "MusculusFlexorCarpiUlnarisRight", "MusculusLevatorAnguliOrisRight", "MusculusLevatorAnguliOrisLeft", "MusculusSerratusPosteriorRight", "MusculusSpleniusCapitis", "MusculiDiaphragmatisPelvisLeft", "MusculiDiaphragmatisPelvis", "MusculusSpleniusCervicis", "MusculusPuborectalisLeft", "MusculusBuccinatorRight", "MusculusPuborectalis", "MusculusBuccinatorLeft", "MusculusSpleniusCapitisRight", "MusculusBuccinator", "MusculusSpleniusCapitisLeft", "MusculiDiaphragmatisPelvisRight", "MusculusSplenius", "MusculusCoccygeusLeft", "MusculusMentalisRight", "MusculusCoccygeus", "MusculusMentalisLeft", "MusculusSpleniusCervicisRight", "MusculusMentalis", "MusculusSpleniusCervicisLeft", "MusculusPuborectalisRight", "MusculusLevatorLabiiSuperiorisAlaequeNasiLeft", "MusculusLevatorLabiiSuperiorisAlaequeNasi", "MusculusRhomboideusMinorLeft", "MusculusRhomboideusMinor", "MusculusObliquusInternusAbdominisLeft", "MusculusLevatorLabiiSuperiorisRight", "MusculusObliquusInternusAbdominis", "MusculusPronatorQuadratusLeft", "MusculusObliquusInternusAbdominisRight", "MusculusPronatorQuadratusRight", "MusculusDepressorLabiiInferioris", "MusculusLevatorScapulaeLeft", "MusculusTransversusAbdominisRight", "MusculusLevatorScapulae", "MusculusTransversusAbdominisLeft", "MusculusBrachioradialisRight", "MusculusLevatorLabiiSuperiorisAlaequeNasiRight", "MusculusTransversusAbdominis", "MusculusBrachioradialisLeft", "MusculusRhomboideusMinorRight", "MusculusBrachioradialis", "MusculusLevatorAnguliOris", "MusculusSerratusPosteriorLeft", "MusculusQuadratusLumborumRight", "MusculusSerratusPosterior", "MusculusQuadratusLumborumLeft", "MusculusExtensorCarpiRadialisLongusRight", "MusculusDepressorLabiiInferiorisRight", "MusculusQuadratusLumborum", "MusculusExtensorCarpiRadialisLongusLeft", "MusculusDepressorLabiiInferiorisLeft", "MusculusLevatorScapulaeRight", "MusculusExtensorCarpiRadialisLongus", "MusculusPterygoideusLateralisLeft", "MusculusSpinalisThoracisRight", "MusculusPterygoideusLateralis", "MusculusSpinalisThoracisLeft", "MusculusSpinalisThoracis", "MusculusPterygoideusMedialisLeft", "MusculusSpinalisCervicisRight", "MusculusPterygoideusMedialis", "MusculusSpinalisCervicisLeft", "MusculusSpinalisCervicis", "MusculusPterygoideusLateralisRight", "MusculiLinguaeLeft", "MusculiLinguae", "MusculusSpinalisCapitisLeft", "MusculusSpinalisCapitis", "MusculusPterygoideusMedialisRight", "MusculusMasseterLeft", "MusculusMasseter", "MusculusSpleniusLeft", "MusculusMasseterRight", "MusculusSphincterAni", "MusculusSpleniusRight", "MusculusCoccygeusRight", "MusculusTemporalisRight", "MusculusSphincterAniExternus", "MusculusTemporalisLeft", "MusculusErectorSpinaeRight", "MusculusTemporalis", "MusculusErectorSpinaeLeft", "MusculusErectorSpinae", "MusculusPterygoideusRight", "MusculusPterygoideusLeft", "MusculusSpinalisRight", "MusculusPterygoideus", "MusculusSpinalisLeft", "MusculusSpinalis", "MusculusPiriformisLeft", "MusculusSoleusRight", "MusculusPiriformis", "MusculusSoleusLeft", "MusculusSoleus", "MusculusTensorFasciaeLataeRight", "MusculusObturatorLeft", "MusculusPlantarisRight", "MusculusObturator", "MusculusPlantarisLeft", "MusculusPlantaris", "MusculusPiriformisRight", "MusculusObturatorRight", "MusculusGmellus", "MusculusPopliteusLeft", "MusculusPopliteus", "MusculusGluteusMediusRight", "MusculusGluteusMediusLeft", "MusculusGastrocnemiusRight", "MusculusGluteusMedius", "MusculusGastrocnemiusLeft", "MusculusGastrocnemius", "MusculusGluteusMinimusRight", "MusculusGluteusMinimusLeft", "MusculusGastrocnemiusCaputLateraleRight", "MusculusGluteusMinimus", "MusculusGastrocnemiusCaputLateraleLeft", "MusculusGastrocnemiusCaputLaterale", "MusculusTensorFasciaeLataeLeft", "MusculusTensorFasciaeLatae", "MusculusGastrocnemiusCaputMedialeLeft", "MusculusGastrocnemiusCaputMediale", "MusculusGastrocnemiusCaputMedialeRight", "MusculusExtensorCarpiUlnarisRight", "MusculusExtensorDigitorumBrevis", "MusculusExtensorCarpiUlnarisLeft", "MusculusQuadricepsFemorisRight", "MusculusExtensorCarpiUlnaris", "MusculusQuadricepsFemorisLeft", "MusculusExtensorHallucisBrevisRight", "MusculusQuadricepsFemoris", "MusculusExtensorHallucisBrevisLeft", "MusculusSupinatorRight", "MusculusSupinatorLeft", "MusculusRectusFemorisRight", "MusculusSupinator", "MusculusRectusFemorisLeft", "MusculusExtensorDigitorumBrevisRight", "MusculusRectusFemoris", "MusculusExtensorDigitorumBrevisLeft", "MusculiMembriSuperioris", "MusculusAbductorPollicisLongussLeft", "MusculusVastusLateralisRight", "MusculusAbductorPollicisLonguss", "MusculusVastusLateralisLeft", "MusculusAbductorHallucisRight", "MusculusVastusLateralis", "MusculusAbductorHallucisLeft", "MusculusAbductorHallucis", "MusculusQuadratusFemoris", "MusculusTibialisPosteriorLeft", "MusculusExtensorCarpiRadialisBrevisRight", "MusculusTibialisPosterior", "MusculusExtensorCarpiRadialisBrevisLeft", "MusculusGmellusRight", "MusculusExtensorCarpiRadialisBrevis", "MusculusGmellusLeft", "MusculusPopliteusRight", "MusculusSartorius", "MusculusFlexorDigitorumLongusLeft", "MusculusExtensorDigitorumRight", "MusculusFlexorDigitorumLongus", "MusculusExtensorDigitorumLeft", "MusculusQuadratusFemorisRight", "MusculusExtensorDigitorum", "MusculusQuadratusFemorisLeft", "MusculusTibialisPosteriorRight", "MusculusExtensorDigitiMinimiLeft", "MusculusExtensorDigitiMinimi", "MusculusSartoriusLeft", "MusculusExtensorDigitiMinimiRight", "MusculusExtensorHallucisBrevis", "MusculusSartoriusRight", "MusculusFlexorDigitorumLongusRight", "MusculusPalmarisBrevis", "MusculusAdductorLongusLeft", "MusculusFlexorDigitiMinimiBrevisFootRight", "MusculusInfraspinatusRight", "MusculusAdductorLongus", "MusculusFlexorDigitiMinimiBrevisFootLeft", "MusculusInfraspinatusLeft", "MusculusExtensorIndicisRight", "MusculusFlexorDigitiMinimiBrevisFoot", "MusculusInfraspinatus", "MusculusExtensorIndicisLeft", "MusculusPectineusRight", "MusculusTeresMinorRight", "MusculusTeresMinorLeft", "MusculusPalmarisBrevisRight", "MusculusTeresMinor", "MusculusPalmarisBrevisLeft", "MusculusAdductorLongusRight", "MusculusAdductorBrevis", "MusculusQuadratusPlantaeLeft", "MusculusQuadratusPlantae", "MusculusSemispinalisCervicisLeft", "MusculusTeresMajorRight", "MusculusAdductorMagnus", "MusculiLunbricalesLeft", "MusculusSemispinalisCervicis", "MusculusTeresMajorLeft", "MusculusAbductorPollicisBrevisRight", "MusculiLunbricales", "MusculusTeresMajor", "MusculusAbductorPollicisBrevisLeft", "MusculusAdductorBrevisRight", "MusculusAbductorPollicisBrevis", "MusculusAdductorBrevisLeft", "MusculusQuadratusPlantaeRight", "MusculusDeltoideus", "MusculusExtensorPollicisBrevisLeft", "MusculusVastusIntermediusRight", "MusculusExtensorPollicisBrevis", "MusculusVastusIntermediusLeft", "MusculusFlexorHallucisBrevisRight", "MusculiMembriSuperioriRight", "MusculusVastusIntermedius", "MusculusFlexorHallucisBrevisLeft", "MusculiMembriSuperiorisLeft", "MusculusAbductorPollicisLongussRight", "MusculusFlexorHallucisBrevis", "MusculusSupraspinatus", "MusculusExtensorPollicisLongusLeft", "MusculusExtensorPollicisLongus", "MusculusVastusMedialisLeft", "MusculusDeltoideusRight", "MusculusVastusMedialis", "MusculusAdductorHallucisLeft", "MusculusDeltoideusLeft", "MusculusExtensorPollicisBrevisRight", "MusculusAdductorHallucis", "MusculusSupraspinatusLeft", "MusculusAdductorHallucisRight", "MusculusExtensorIndicis", "MusculusPectineusLeft", "MusculusAbductorDigitiMinimiFootRight", "MusculusSupraspinatusRight", "MusculusPectineus", "MusculusAbductorDigitiMinimiFootLeft", "MusculusExtensorPollicisLongusRight", "MusculusAbductorDigitiMinimiFoot", "MusculusVastusMedialisRight", "MusculiInterspinalesCervicis", "MusculusCoracobrachialisLeft", "MusculusAbductorDigitiMinimiHandRight", "MusculusCoracobrachialis", "MusculusAbductorDigitiMinimiHandLeft", "MusculusBicepsFemorisCaputLongumRight", "MusculiInterpsinalesRight", "MusculusAbductorDigitiMinimiHand", "MusculusBicepsFemorisCaputLongumLeft", "MusculiInterspinalesLeft", "MusculusBrachialisRight", "MusculusBicepsFemorisCaputLongum", "MusculiInterspinalesCervicisRight", "MusculiInterspinalesCervicisLeft", "MusculusCoracobrachialisRight", "MusculusTricepsBrachii", "MusculusFlexorDigitiMinimiBrevisHandLeft", "MusculusBicepsFemorisCaputBreveRight", "MusculusFlexorDigitiMinimiBrevisHand", "MusculusBicepsFemorisCaputBreveLeft", "MusculusBicepsFemorisCaputBreve", "MusculusSternocleidomastoideusRight", "MusculusTricepsBrachiiCaputLongum", "MusculusOpponensDigitiMinimiLeft", "MusculusSemitendinosusRight", "MusculusSternocleidomastoideusLeft", "MusculiInterspinalesThoracisRight", "MusculusOpponensDigitiMinimi", "MusculusSemitendinosusLeft", "MusculusSternocleidomastoideus", "MusculiInterspinalesThoracisLeft", "MusculusTricepsBrachiiRight", "MusculusSemitendinosus", "MusculiInterspinalesThoracis", "MusculusTricepsBrachiiLeft", "MusculusFlexorDigitiMinimiBrevisHandRight", "MusculusSemispinalisCapitisLeft", "MusculusSubscapularisRight", "MusculusGracilis", "MusculusInterosseiDorsalesLeft", "MusculusSemispinalisCapitis", "MusculusSubscapularisLeft", "MusculusFlexorPollicisBrevisRight", "MusculusInterosseiDorsales", "MusculusSubscapularis", "MusculusFlexorPollicisBrevisLeft", "MusculusAdductorMagnusRight", "MusculusSemispinalisCervicisRight", "MusculusFlexorPollicisBrevis", "MusculusAdductorMagnusLeft", "MusculiLunbricalesRight", "MusculiMultifidiiLeft", "MusculiMultifidii", "MusculusBicepsBrachiiLeft", "MusculusBicepsBrachii", "MusculusOpponensPollicisLeft", "MusculusSemispinalisCapitisRight", "MusculusOpponensPollicis", "MusculusGracilisLeft", "MusculusOpponensPollicisRight", "MusculusInterosseiPlantares", "MusculusGracilisRight", "MusculusInterosseiDorsalesRight", "MusculiInterspinales", "MusculusBrachialisLeft", "MusculusAdductorPollicisRight", "MusculusBrachialis", "MusculusAdductorPollicisLeft", "MusculusBicepsFemorisRight", "MusculiMultifidiiRight", "MusculusAdductorPollicis", "MusculusBicepsFemorisLeft", "MusculusInterosseiPlantaresRight", "MusculusBicepsBrachiiRight", "MusculusBicepsFemoris", "MusculusInterosseiPlantaresLeft", ] } name_for_cid[3032] = "LeadLocationNearPeripheralNerve" cid_concepts[3032] = { "MDC": [ "NervusMaxillarisLeft", "NervusMaxillaris", "NervusSupraorbitalisRight", "NervusMaxillarisRight", "NervusSupraorbitalisLeft", "RamusPalmarisNerviUlnarisLeft", "NervusSupraorbitalis", "RamusPalmarisNerviUlnaris", "NervusOphtalmicusRight", "NervusUlnarisNerviDigitalesPalmaresPropriiLeft", "NervusUlnarisNerviDigitalesPalmaresProprii", "RamusPalmarisNerviUlnarisRight", "NervusRadialisLeft", "NervusRadialis", "NervusUlnarisNerviDigitalesPalmaresPropriiRight", "NervusMedianusNerviDigitalesPalmaresPropriiLeft", "NervusMedianusNerviDigitalesPalmaresProprii", "NervusAbducensVI", "NervusMandibularisRight", "NervusMandibularisLeft", "NervusAbducensVILeft", "NervusInfraorbitalis", "NervusMandibularis", "NervusMedianusNerviDigitalesPalmaresPropriiRight", "NervusInfraorbitalisRight", "NervusInfraorbitalisLeft", "NervusUlnarisRight", "NervusUlnarisLeft", "NervusUlnaris", "RamusDorsalisNerviUlnarisRight", "RamusDorsalisNerviUlnarisLeft", "RamusDorsalisNerviUlnaris", "NerviCraniales", "NerviCranialesLeft", "NervusVestibulocochlearisVIIIRight", "NervusVestibulocochlearisVIIILeft", "NervusVestibulocochlearisVIII", "NervusAbducensVIRight", "NervusFacialisVIIRight", "NervusAxillarisRight", "NervusFacialisVIILeft", "NervusAxillarisLeft", "NervusFacialisVII", "NervusAxillaris", "NervusSaphenus", "NerviThoraciciRight", "NerviThoraciciLeft", "NerviThoracici", "NerviSacralesAtNervusCoccygeus", "NerviLumbalesLeft", "NervusSaphenusRight", "NerviLumbales", "NervusSaphenusLeft", "NervusGlossopharingeusIXLeft", "NervusGlossopharingeusIX", "NervusVestibularisRight", "NervusVestibularisLeft", "NervusVestibularis", "NervusCochlearisRight", "NervusRadialisRamusSuperficialis", "NervusCochlearisLeft", "NervusCochlearis", "NervusRadialisRight", "NerviSubscapulares", "NervusRadialisRamusSuperficialisRight", "NervusRadialisRamusSuperficialisLeft", "NerviSubscapularesRight", "NerviSubscapularesLeft", "NervusFibularisCommunisRight", "NervusFibularisCommunisLeft", "NervusFibularisCommunis", "NervusAcessoriusXIRadicesCranialesRight", "NervusVagusXLeft", "NervusIliohypogastricusLeft", "NervusVagusX", "NervusIliohypogastricus", "NervusGlossopharingeusIXRight", "NervusAcessoriusXIRadicesCranialesLeft", "NervusIlioInguinalisLeft", "NervusAcessoriusXIRadicesCraniales", "NervusIlioInguinalis", "NervusVagusXRight", "NervusIliohypogastricusRight", "PlexusBrachialisLeft", "NervusCutaneusFemorisLateralisLeft", "NervusFibularisProfundusRight", "PlexusBrachialis", "NervusCutaneusFemorisLateralis", "NervusFibularisProfundusLeft", "NervusFibularisProfundus", "NervusIlioInguinalisRight", "NervusThoracicusLongusLeft", "NervusFibularisSuperficialisRight", "NervusThoracicusLongus", "NervusFibularisSuperficialisLeft", "NervusFibularisSuperficialis", "PlexusBrachialisRight", "PlexusSacralis", "NerviSacralesAtNervusCoccygeusRight", "NerviSacralesAtNervusCoccygeusLeft", "PlexusSacralisLeft", "NerviSpinalesLeft", "NervusHypoglossusXII", "NerviLumbalesRight", "NervusAcessoriusXIRadicesSpinalesRight", "NervusAcessoriusXIRadicesSpinalesLeft", "NerviSpinales", "PlexusLumbosacralisRight", "PlexusLumbosacralisLeft", "NervusHypoglossusXIIRight", "PlexusLumbosacralis", "NervusHypoglossusXIILeft", "PlexusLumbalisRight", "PlexusLumbalisLeft", "PlexusSacralisRight", "PlexusLumbalis", "NervusAcessoriusXIRadicesSpinales", "NervusIschiadicusRight", "NervusIschiadicusLeft", "NervusIschiadicus", "NervusCutaneusAntebrachiiMedialisRight", "NervusCutaneusAntebrachiiMedialisLeft", "NervusPlantarisMedialisRight", "NervusOpticusIIRight", "NervusOpticusIILeft", "NervusOpticusII", "NervusOculomotoriusIIIRight", "NervusOculomotoriusIIILeft", "NervusOculomotoriusIII", "NerviCervicalesRight", "NerviCervicalesLeft", "NerviCervicales", "NervusPlantarisLateralis", "NerviCranialesRight", "NervusPhrenicusRight", "NervusPhrenicusLeft", "NervusPhrenicus", "NervusPudendus", "NervusMedianusRight", "NervusMedianusLeft", "NervusPlantarisLateralisRight", "NervusMedianus", "NervusPlantarisLateralisLeft", "NerviSpinalesRight", "RamusPalmarisNerviMedianiRight", "RamusPalmarisNerviMedianiLeft", "NervusPudendusRight", "RamusPalmarisNerviMediani", "NervusPudendusLeft", "NervusMusculocutaneusLeft", "NervusMusculocutaneus", "NervusTibialisLeft", "NervusTibialis", "NervusThoracicusLongusRight", "NervusTrigeminusVRight", "NervusTrigeminusVLeft", "NervusTrigeminusV", "NervusOphtalmicusLeft", "NervusOphtalmicus", "NervusObturatorius", "NervusCutaneusFemorisLateralisRight", "NervusTrochlearisIVRight", "NervusFemoralis", "NervusTrochlearisIVLeft", "NervusTrochlearisIV", "NervusObturatoriusRight", "NervusObturatoriusLeft", "NervusCutaneusAntebrachiiLateralis", "NervusSurealisLeft", "NervusSurealis", "NervusMusculocutaneusRight", "NervusFemoralisRight", "NervusFemoralisLeft", "NervusTibialisRight", "NervusCutaneusAntebrachiiMedialis", "NervusPlantarisMedialisLeft", "NervusPlantarisMedialis", "NervusCutaneusAntebrachiiLateralisRight", "NervusCutaneusAntebrachiiLateralisLeft", "NervusSurealisRight", ] } name_for_cid[3033] = "EOGLead" cid_concepts[3033] = { "MDC": [ "Er3", "El5", "Er6", "E0", "Erl", "Er5", "Ell", "Elb", "El1", "Er2", "Erb", "El4", "El7", "Er1", "Era", "El3", "Er4", "El6", "Er7", "Ela", "El2", ] } name_for_cid[3034] = "BodyPositionChannel" cid_concepts[3034] = { "DCM": ["PatientPosition", "PatientElevation", "PatientRotationLongitudinal"] } name_for_cid[3035] = "EEGAnnotation–NeurophysiologicEnumeration" cid_concepts[3035] = { "DCM": ["SleepStageN3", "SleepStageN2", "SleepStageN1", "LineNoiseArtifact"], "MDC": [ "ExternalInterferenceArtifactualActivity", "PeriodicMovementsOfSleepWithArousals", "FastIrregularEyeMovements", "SharpAppearingOrEpileptiformActivity", "SleepSpindle", "BackgroundActivityDelta", "PeriodicTriphasicWaves", "PhantomSpikeAndWaveActivity", "RhythmicSharpWaves", "SharpTransient", "PulseArtifactualActivity", "MyogenicHemifacialSpasms", "PeriodicBurstsWithSuppressions", "SleepSawtoothWave", "SleepStageUnstageable", "BackgroundActivityGamma", "EyeRelatedActivityElectroretinogram", "RapidEyeMovements", "EyeRelatedActivity", "ExtraocularMuscleActivity", "EpilepticOrPotentiallyEpileptogenicSpike", "Wicket", "QuasiperiodicCerebralSharpWaves", "BackgroundActivityBisynchronousDelta", "RespiratoryArtifactualActivity", "BurstSuppression", "MyogenicPalatalMyoclonus", "ElectrodeInstrumentalArtifactualActivity", "MultipleSpike", "PeriodicCerebralComplexes", "EyeRelatedPhotodrivingActivity", "SleepStageShift", "ECGArtifactualActivity", "BackgroundActivityAlpha", "MyogenicNoncerebralActivity", "_14And6HzPositiveBursts", "EyeBlinks", "SleepVWave", "ArtifactualActivity", "SleepStageWake", "PeriodicEpileptiformDischarges", "MyogenicTremorActivity", "EyeRelatedPhotomyogenicActivity", "BackgroundActivityBeta", "SpikeAndWaveComplex", "EpilepticOrPotentiallyEpileptogenicActivity", "SleepArousal", "BackgroundMuActivity", "MovementArtifactualActivity", "SleepStageREMWithSleepSpindle", "PeriodicAndQuasiperiodicCerebralActivity", "ZetaWave", "SleepKComplex", "BackgroundActivitySlowFusedTransients", "BackgroundActivity", "MyoclonicActivity", "LambdaWave", "NystagmoidEyeMovements", "SleepStageREM", "MultipleIndependentSpikesAndAsynchronousSlowWaves", "MyogenicNoncerebralMyokymia", "SmallSharpSpike", "PeriodicSharpWaves", "SleepFWave", "BackgroundActivityArrhythmicDelta", "GlossokineticArtifactualActivity", "PeriodicMovementsOfSleep", "AtypicalSpikeAndWaveComplex", "SleepAwakening", "AlphadeltaSleep", "BackgroundActivityTheta", "SleepStageUnspecified", "QuasiperiodicTriphasicWaves", "EpilepticOrPotentiallyEpileptogenicSharpWave", "PositiveOccipitalSharpTransientOfSleep", "BackgroundActivityBisynchronousTheta", "SharpAndSlowWaveComplex", "TriphasicWave", "SleepActivityAndEvent", "SwallowingAndChewingArtifactualActivity", "MyogenicNoncerebralFacialSynkinesis", "SlowEyeMovements", "SweatOfGalvanicArtifactualActivity", "BackgroundActivitySigma", "EyeRelatedPhotoparadoxysmalActivity", "PeriodicSuppressions", ], "SCT": ["Drowsy"], } name_for_cid[3036] = "EMGAnnotation–NeurophysiologicalEnumeration" cid_concepts[3036] = { "MDC": [ "EMGEndplateNoise", "EMGDoubletWaveform", "EMGComplexRepetitiveDischarge", "EMGFibrillationPotential", "EMGUnspecifiedWaveform", "EMGPositiveSharpWave", "EMGUnspecifiedIterativeDischarge", "EMGMotorUnitPotential", "EMGMyotonicDischarge", "EMGInsertionalActivity", "EMGWaveformAfterDischarge", "EMGEndplateSpike", "EMGTripletWaveform", "EMGMyokymicDischarge", "EMGMultipletWaveform", "EMGCrampDischarge", "EMGWaveformUnderVoluntaryControl", "EMGFasciculationPotential", ] } name_for_cid[3037] = "EOGAnnotation–NeurophysiologicalEnumeration" cid_concepts[3037] = { "MDC": [ "EyesOpen", "SlowEyeMovement", "EyeBlink", "EyesClosed", "REM", "OtherEyeMovement", "Saccade", ] } name_for_cid[3038] = "PatternEvent" cid_concepts[3038] = { "DCM": ["HyperventilationEnd", "HyperventilationBegin", "PostHyperventilation"], "MDC": [ "AtrialFlutter", "SpikesAndWaves", "ClinicalSeizureDischarge", "Grade1AVBlock", "ArrhythmiaEvent", "Grade2AVBlock", "ThirdDegreeAVBlock", "IrregularHeartRate", "Desaturation", "AtrialFibrillation", "IrregularRhythm", "SupraventricularExtrasystole", "Apnea", "Apnea30Sec", "SharpSpikes", "PacerArtifact", "Bradycardia", "Asystole", "Apnea15Sec", "SinusTachycardia", ], "SCT": ["Hyperventilation"], } name_for_cid[3039] = "DevicerelatedandEnvironmentrelatedEvent" cid_concepts[3039] = { "DCM": [ "PreamplifierDisconnected", "EventButtonTest", "EventButtonPressed", "BreakoutBoxDisconnected", "BreakoutBoxConnected", "VideoRecordingOn", "TapTestEnd", "TapTestBegin", "PreamplifierConnected", "VideoRecordingOff", ], "MDC": ["PowerLineProblem", "Artifact", "LeadDisconnected", "PowerSupplyProblem"], } name_for_cid[3040] = "EEGAnnotationNeurologicalMonitoringMeasurement" cid_concepts[3040] = {"MDC": ["Arousal", "CircumHead"]} name_for_cid[3041] = "NeurophysiologicStimulationMode" cid_concepts[3041] = {"MDC": ["FlashStimulus"]} name_for_cid[3042] = "AnalogWaveformFilter" cid_concepts[3042] = { "DCM": [ "EllipticFilter", "ChebyshevFilter", "ButterworthFilter", "MDerivedFilter", "KTypeFilter", "GaussianFilter", "BesselFilter", "ZobelFilter", "BodeFilter", "DoubleMDerivedFilter", ] } name_for_cid[3043] = "DigitalWaveformFilter" cid_concepts[3043] = {"DCM": ["BiquadFilter", "IIRFilter", "CICFilter", "FIRFilter"]} name_for_cid[3044] = "WaveformFilterLookupTableInputFrequencyUnit" cid_concepts[3044] = { "DCM": ["HzAngular", "HzNormalized"], "UCUM": ["RadiansPerSecond", "Hz"], } name_for_cid[3045] = "WaveformFilterLookupTableOutputMagnitudeUnit" cid_concepts[3045] = { "DCM": ["MagnitudeNormalized"], "UCUM": ["Microvolt", "DecibelsMillivolt", "Millivolt", "DecibelsMicrovolt"], } name_for_cid[3046] = "SleepStage" cid_concepts[3046] = { "DCM": ["SleepStageN3", "SleepStageN2", "SleepStageN1"], "MDC": [ "SleepAwakening", "AlphadeltaSleep", "SleepStageUnspecified", "SleepSpindle", "SleepArousal", "SleepStageREMWithSleepSpindle", "PositiveOccipitalSharpTransientOfSleep", "SleepKComplex", "SleepActivityAndEvent", "SleepStageShift", "SleepStageREM", "SleepSawtoothWave", "SleepStageUnstageable", "SleepVWave", "SleepStageWake", "SleepFWave", ], } name_for_cid[3047] = "WaveformAnnotationClassification" cid_concepts[3047] = { "DCM": [ "EEGAnnotation", "PatternEvent", "PatientConsciousness", "DeviceRelatedAndEnvironmentRelatedEvent", "EOGAnnotation", "EMGAnnotation", ] } name_for_cid[3048] = "WaveformAnnotationsDocumentTitle" cid_concepts[3048] = { "DCM": [ "NeurophysiologyAutomatedAnalysisAnnotations", "NeurophysiologyPostHocReviewAnnotations", "NeurophysiologyRecordingAnnotations", ] } name_for_cid[3049] = "EEGProcedure" cid_concepts[3049] = { "SCT": ["ScalpEEG", "EEG", "AmbulatoryEEG", "VideoEEG", "SleepEEG"] } name_for_cid[3050] = "PatientConsciousness" cid_concepts[3050] = {"SCT": ["Asleep", "Awake", "Drowsy"]} name_for_cid[3083] = "UnitRadioactivity" cid_concepts[3083] = {"UCUM": ["Millicurie", "Becquerel", "Megabecquerel"]} name_for_cid[3090] = "TimeSynchronizationChannelType" cid_concepts[3090] = { "DCM": [ "XRayOnTrigger", "XRayFluoroscopyOnSignal", "DigitalTimecodeNOS", "IRIGBTimecode", "ECGBasedGatingSignalProcessed", ] } name_for_cid[3101] = "CardiacProceduralStateValue" cid_concepts[3101] = { "DCM": ["ReinjectionState", "DelayedRedistributionState", "RedistributionState"], "SCT": ["CardiacStressState", "RestingState"], } name_for_cid[3102] = "Rest/StressState" cid_concepts[3102] = {"DCM": ["CardiacStressState"], "SCT": ["RestingState"]} name_for_cid[3104] = "CardiacSynchronizationTechnique" cid_concepts[3104] = { "DCM": ["ProspectiveGating", "RealTimeAcquisition", "Paced", "RetrospectiveGating"] } name_for_cid[3106] = "PETCardiologyProtocol" cid_concepts[3106] = { "DCM": [ "PETMyocardialViabilityRestAndStress", "PETMyocardialViabilityRestOnly", "PETMyocardialViabilityStressOnly", "PETMyocardialPerfusionRestAndStress", "PETMyocardialPerfusionRestOnly", "PETMyocardialPerfusionStressOnly", ] } name_for_cid[3107] = "PETCardiologyRadiopharmaceutical" cid_concepts[3107] = {"SCT": ["_82Rubidium", "FluorodeoxyglucoseF18", "_13Nitrogen"]} name_for_cid[3108] = "NM/PETProcedure" cid_concepts[3108] = { "SCT": [ "PETHeartStudy", "PETBrainStudy", "RadioisotopeStudyOfRespiratorySystem", "PETStudyForLocalizationOfTumor", "RadioisotopeStudyOfGenitourinarySystem", "PETBreastStudy", "RadioisotopeStudyOfMusculoskeletalSystem", "RadioisotopeStudyOfHematopoieticSystem", "RadioisotopeStudyOfGastrointestinalSystem", "NuclearMedicineCardiovascularStudy", "RadioisotopeStudyOfEndocrineSystem", "RadionuclideStudyForLocalizationOfInflammatoryDisease", "RadionuclideLocalizationOfTumor", ] } name_for_cid[3110] = "NuclearCardiologyProtocol" cid_concepts[3110] = { "DCM": [ "StressTechnetiumRestTechnetium1DayProcedure", "NMMyocardialViabilityProcedure", "RestTechnetiumStressTechnetium1DayProcedure", "RestTechnetiumStressTechnetium2DayProcedure", "RestThalliumStressTechnetiumProcedure", ], "SCT": ["StressThalliumProcedure"], } name_for_cid[3111] = "NuclearCardiologyRadiopharmaceutical" cid_concepts[3111] = {"SCT": ["Tc99mTetrofosmin", "Thallium201", "Tc99mSestamibi"]} name_for_cid[3112] = "AttenuationCorrection" cid_concepts[3112] = { "DCM": [ "CTBasedAttenuationCorrection", "NoAttenuationCorrection", "AlgorithmicAttenuationCorrection", "NMTransmissionAttenuationCorrection", ] } name_for_cid[3113] = "PerfusionDefectType" cid_concepts[3113] = { "DCM": ["FalsePositiveDefectFinding"], "SCT": [ "PartiallyReversibleMyocardialPerfusionDefect", "FixedMyocardialPerfusionDefect", "ReversibleMyocardialPerfusionDefect", ], } name_for_cid[3114] = "StudyQuality" cid_concepts[3114] = { "DCM": [ "PoorImageQuality", "ExcellentImageQuality", "GoodImageQuality", "UnusableQualityRendersImageUnusable", ] } name_for_cid[3115] = "StressImagingQualityIssue" cid_concepts[3115] = { "DCM": [ "BreastAttenuation", "DiaphragmaticAttenuation", "BodyHabitusAttenuation", "MotionBlur", ], "SCT": ["SubdiaphragmaticUptake"], } name_for_cid[3116] = "NMExtracardiacFinding" cid_concepts[3116] = { "SCT": [ "IncreasedLungUptake", "AbnormalExtracardiacUptake", "NormalExtracardiacUptake", ] } name_for_cid[3117] = "AttenuationCorrectionMethod" cid_concepts[3117] = {"DCM": ["OSEMAlgorithm", "ChangMethod"]} name_for_cid[3118] = "LevelofRisk" cid_concepts[3118] = { "SCT": [ "ModerateToHighRisk", "HighRisk", "LowToModerateRisk", "ModerateRisk", "NormalRisk", "LowRisk", "UncertainRisk", ] } name_for_cid[3119] = "LVFunction" cid_concepts[3119] = {"SCT": ["Normal", "ImpairedLeftVentricularFunction"]} name_for_cid[3120] = "PerfusionFinding" cid_concepts[3120] = {"SCT": ["Abnormal", "Equivocal", "MyocardialPerfusionNormal"]} name_for_cid[3121] = "PerfusionMorphology" cid_concepts[3121] = { "SCT": ["MyocardialIschemia", "MyocardialInfarction", "MixedIschemiaAndInfarction"] } name_for_cid[3122] = "VentricularEnlargement" cid_concepts[3122] = { "SCT": [ "MarkedlyEnlargedCardiacChamber", "MildlyEnlargedCardiacChamber", "ModeratelyEnlargedCardiacChamber", "NormalSizeCardiacChamber", ] } name_for_cid[3200] = "StressTestProcedure" cid_concepts[3200] = { "SCT": [ "ExerciseStressTest", "PharmacologicStressTest", "PacedStressTest", "PharmacologicAndExerciseStressTest", ] } name_for_cid[3201] = "IndicationsforStressTest" cid_concepts[3201] = { "SCT": [ "AbnormalExerciseToleranceTest", "ConductionDisorderOfTheHeart", "Palpitations", "PreOperative", "AnginaPectoris", "Syncope", "HeartFailure", "PostPTCA", "AbnormalECG", "CoronaryArteryDisease", "SupraventricularTachycardia", "HistoryOfCABG", "LeftBundleBranchBlock", "ValvularHeartDisease", "ChestPain", "Hypertension", "OccupationalRequirement", "HistoryOfMyocardialInfarction", "HeartDiseaseRiskFactors", "Dyspnea", ] } name_for_cid[3202] = "ChestPain" cid_concepts[3202] = { "DCM": ["AnginalEquivalent"], "SCT": [ "AtypicalAngina", "TypicalAngina", "NoncardiacChestPain", "ChestPainNotPresent", "StableAngina", "UnstableAngina", ], } name_for_cid[3203] = "ExerciserDevice" cid_concepts[3203] = {"SCT": ["BicycleErgometer", "Treadmill", "ArmErgometer"]} name_for_cid[3204] = "StressAgent" cid_concepts[3204] = { "SCT": [ "Dobutamine", "Adenosine", "Dipyridamole", "Atropine", "AdenosineA2ReceptorAgonist", ] } name_for_cid[3205] = "IndicationsforPharmacologicalStressTest" cid_concepts[3205] = { "DCM": ["PatientWeightExceedsEquipmentLimit"], "SCT": [ "RecentMyocardialInfarction", "Asthenia", "AtaxiaOrIncoordination", "OpenWoundOfLowerLimb", "Cachexia", "TransientLimbParalysis", "PatientHasPacemaker", "FractureOfLowerLimb", "DependenceOnEnablingMachineOrDevice", "PeripheralVascularDisease", "LeftBundleBranchBlock", "ParalyticSyndrome", "GaitProblem", "RequestByPhysician", "PulmonaryDisease", "LowerLimbAmputation", "CannotReachTargetHeartRate", ], } name_for_cid[3206] = "NoninvasiveCardiacImagingProcedure" cid_concepts[3206] = { "SCT": [ "SPECT", "PETHeartStudy", "CardiacBloodPoolImaging", "NuclearMedicineCardiovascularStudy", "CardiacMRI", "Echocardiography", ] } name_for_cid[3207] = "StressTestProcedurePhase" cid_concepts[3207] = { "SCT": [ "CardiacStressState", "Hyperventilation", "PeakCardiacStressState", "CardiacStressRecoveryState", "RestingState", ] } name_for_cid[3208] = "ExerciseECGSummaryCode" cid_concepts[3208] = { "SCT": [ "ExerciseECGAbnormal", "ExerciseECGEquivocal", "ExerciseECGNormal", "NotPerformed", ] } name_for_cid[3209] = "StressImagingSummaryCode" cid_concepts[3209] = { "SCT": [ "ImagingResultEquivocal", "ImagingResultNormal", "ImagingResultAbnormal", "NotPerformed", ] } name_for_cid[3210] = "SpeedofResponse" cid_concepts[3210] = {"SCT": ["Normal", "Blunted", "Accentuated"]} name_for_cid[3211] = "BPResponse" cid_concepts[3211] = {"SCT": ["Normal", "Blunted", "Hypertensive", "Hypotensive"]} name_for_cid[3212] = "TreadmillSpeed" cid_concepts[3212] = {"UCUM": ["KilometersPerHour", "MilesPerHour"]} name_for_cid[3213] = "StressHemodynamicFinding" cid_concepts[3213] = { "SCT": [ "ExertionalHypotension", "ChronotropicIncompetence", "ExertionalHypertension", ] } name_for_cid[3215] = "PerfusionFindingMethod" cid_concepts[3215] = {"SCT": ["ECGAnalysis", "ImageAnalysis"]} name_for_cid[3217] = "ComparisonFinding" cid_concepts[3217] = { "DCM": ["AgreementWithPriorFindings", "DisagreementWithPriorFindings"] } name_for_cid[3220] = "StressSymptom" cid_concepts[3220] = { "DCM": ["AnginalEquivalent"], "SCT": [ "Dizziness", "Nausea", "Claudication", "AtypicalAngina", "TypicalAngina", "Syncope", "Flushing", "Fatigue", "NoncardiacChestPain", "UnstableAngina", "ChestPain", "ChestPainNotPresent", "ChestDiscomfort", "Dyspnea", "StableAngina", ], } name_for_cid[3221] = "StressTestTerminationReason" cid_concepts[3221] = { "SCT": [ "HypotensiveEpisode", "EndOfProtocol", "HypertensiveEpisode", "ConductionDisorderOfTheHeart", "TargetHeartRateAchieved", "Claudication", "ChestPain", "Syncope", "AbnormalECG", "Fatigue", "PatientRefusedExerciseTest", "Dyspnea", ] } name_for_cid[3227] = "QTcMeasurement" cid_concepts[3227] = { "MDC": [ "QtcPerLeadUsingFredericiaFormula", "QtcIntervalPerLead", "QtcIntervalGlobal", "QtcGlobalUsingFredericiaFormula", "QtcGlobalUsingBazettFormula", "QtcPerLeadUsingBazettFormula", ] } name_for_cid[3228] = "ECGTimingMeasurement" cid_concepts[3228] = { "MDC": [ "PDurationGlobal", "PPIntervalGlobal", "PPIntervalPerLead", "QTIntervalGlobal", "QRSDurationPerLead", "QTIntervalPerLead", "PDurationPerLead", "QRSDurationGlobal", "PRIntervalGlobal", "PRIntervalPerLead", "RRIntervalPerLead", "RRIntervalGlobal", ] } name_for_cid[3229] = "ECGAxisMeasurement" cid_concepts[3229] = {"MDC": ["QRSAxis", "PAxis", "TAxis"]} name_for_cid[3230] = "ECGFinding" cid_concepts[3230] = { "SCT": [ "VentricularFibrillation", "VentricularPreExcitation", "AtrialPrematureContraction", "STSegmentDepression", "RightBundleBranchBlock", "SecondDegreeAtrioventricularBlock", "VentricularPrematureContraction", "ThirdDegreeAtrioventricularBlock", "SecondarySTTAbnormality", "ECGNormal", "EarlyRepolarization", "NonSustainedVentricularTachycardia", "IntraventricularConductionDisturbance", "AtrialFibrillation", "BifascicularBlock", "VentricularTachycardia", "STSegmentElevation", "SupraventricularTachycardia", "LeftAnteriorFascicularBlock", "IncompleteRightBundleBranchBlock", "LeftBundleBranchBlock", "IncompleteLeftBundleBranchBlock", "FirstDegreeAtrioventricularBlock", "NonspecificSTTAbnormality", "LeftPosteriorFascicularBlock", ] } name_for_cid[3231] = "STSegmentFinding" cid_concepts[3231] = { "DCM": [ "StronglyPositive", "StronglyPositiveSTElevation", "NonDiagnosticRestingSTAbnormalities", "NonDiagnosticVentricularPacingOrLBBB", "NonDiagnosticLowHeartRate", ], "SCT": ["WeaklyPositive", "STIntervalNormal", "Positive"], } name_for_cid[3232] = "STSegmentLocation" cid_concepts[3232] = { "SCT": [ "LeftVentricleLateralSegment", "LeftVentricleInferiorSegment", "LeftVentricleApicalSegment", "LeftVentricleSeptalSegment", "LeftVentricleAnteriorSegment", ] } name_for_cid[3233] = "STSegmentMorphology" cid_concepts[3233] = { "DCM": [ "STDepressionHorizontal", "STDepressionUpsloping", "STDepressionDownsloping", ], "SCT": ["STSegmentElevation", "STSegmentDepression"], } name_for_cid[3234] = "EctopicBeatMorphology" cid_concepts[3234] = { "SCT": [ "VentricularTachycardiaPolymorphic", "VentricularBigeminy", "VentricularTachycardia", "UnifocalPvcs", "MultifocalPvcs", ] } name_for_cid[3235] = "PerfusionComparisonFinding" cid_concepts[3235] = { "SCT": [ "ResolutionOfIschemia", "MoreIschemia", "NewIschemia", "LessIschemia", "NoChange", "NewInfarction", ] } name_for_cid[3236] = "ToleranceComparisonFinding" cid_concepts[3236] = {"SCT": ["DecreasedTolerance", "NoChange", "IncreasedTolerance"]} name_for_cid[3237] = "WallMotionComparisonFinding" cid_concepts[3237] = { "SCT": ["NewWallMotionAbnormality", "NoChange", "ImprovementOfWallMotion"] } name_for_cid[3238] = "StressScoringScale" cid_concepts[3238] = { "DCM": [ "STHRIndex", "RatioOfAchievedToPredictedFunctionalCapacity", "AerobicIndex", "RatioOfAchievedToPredictedMaximalOxygenConsumption", ], "SCT": ["DukeTreadmillScore"], } name_for_cid[3239] = "PerceivedExertionScale" cid_concepts[3239] = {"DCM": ["BorgCR10Scale", "BorgRPEScale"]} name_for_cid[3240] = "ElectrophysiologyMeasurementFunction/Technique" cid_concepts[3240] = { "DCM": [ "PacingElectricalStimulusVoltage", "MonopoleSignal", "HisBundleElectrogram", "DifferentialSignal", "VoltageMeasurementByMappingCatheter", "VoltageMeasurementByBasketCatheter", "VoltageMeasurement", "RadioFrequencyAblationPower", ] } name_for_cid[3241] = "HemodynamicMeasurementTechnique" cid_concepts[3241] = { "SCT": [ "ThermistorCatheterMethod", "TipManometerMethod", "FiberopticCatheterMethod", "DopplerCatheterMethod", "FluidFilledCatheterMethod", "AveragedHemodynamicMeasurementMethod", "PulmonaryCapillaryWedgeMethod", "ConductanceCatheterMethod", "StaticCatheterMethod", "CompositeHemodynamicMeasurementMethod", "WedgeMethod", "ComputedHemodynamicMeasurementMethod", "DualCatheterMethod", "PullbackMethod", ] } name_for_cid[3250] = "CatheterizationProcedurePhase" cid_concepts[3250] = { "SCT": [ "CardiacCatheterizationBaselinePhase", "CardiacCatheterizationImageAcquisitionPhase", "CatheterizationOfBothLeftAndRightHeartWithGraft", "TransseptalCatheterization", "DrugInfusionChallenge", "CardiacCatheterizationInterventionPhase", "CardiacCatheterizationTherapyPhase", "CatheterizationOfBothLeftAndRightHeartWithoutGraft", "CardiacCatheterizationPostContrastPhase", "RestingState", "CardiacCatheterizationPreInterventionPhase", "CardiacCatheterizationTestChallengePhase", "CatheterizationOfLeftHeart", "CardiacCatheterizationPostInterventionPhase", "CardiacCatheterizationBailoutPhase", "CatheterizationOfRightHeart", "ExerciseChallenge", ] } name_for_cid[3254] = "ElectrophysiologyProcedurePhase" cid_concepts[3254] = { "SCT": [ "AtrialEffectiveRefractoryPeriodEvaluationOf", "PostDefibrillationProcedurePhase", "VentricularEffectiveRefractoryPeriodEvaluationOf", "ElectrophysiologyProcedureBaselinePhase", "CarotidSinusMassageProcedurePhase", "PostAblationPhase", "ElectrophysiologyMappingPhase", "SinusNodeRecoveryTimeEvaluationOf", "RadiofrequencyAblationProcedurePhase", ] } name_for_cid[3261] = "StressProtocol" cid_concepts[3261] = { "SCT": [ "StressTestUsingBicycleErgometer", "EllestadProtocol", "PharmacologicStressProtocol", "DobutamineStressProtocol", "NaughtonProtocol", "PepperProtocol", "AdenosineStressProtocol", "StressTestUsingCardiacPacing", "PharmacologicAndExerciseStressTest", "ModifiedNaughtonProtocol", "DipyridamoleStressProtocol", "RampProtocol", "ExerciseStressECGTest", "BalkeProtocol", "ModifiedBruceProtocol", "BruceProtocol", ] } name_for_cid[3262] = "ECGPatientStateValue" cid_concepts[3262] = { "SCT": [ "BaselineState", "ExerciseState", "SupineBodyPosition", "PostExerciseState", "RestingState", ] } name_for_cid[3263] = "ElectrodePlacementValue" cid_concepts[3263] = { "MDC": [ "_12LeadFromLimbLeadsIIIAndOneOrMoreVLeads", "Unspecified12LeadSystem", "Standard12LeadAndXYZ", "Standard12LeadPositionsElectrodesPlacedIndividually", "Standard12LeadAndNEHB", "MasonLikarLeadPositionsElectrodesPlacedIndividually", "Standard12LeadAndCC5CM5ML", "MasonLikarLeadPositionsV1V6InElectrodePad", "Standard12LeadAndCM5CC5CH5", "_12LeadElectrodePad", "_12LeadDerivedFromFrankXYZLeads", "Standard12LeadWithExtraLeadsToTheRightAndOrLeftSides", "Standard12LeadExtendedToTheRightByV5RV4RV3R", "_12LeadDerivedFromNonStandardLeads", "Standard12LeadExtendedToTheLeftByV7V8V9", "_12LeadForBicycleExerciseTestingLimbLeadsOnBackOfPatient", "Standard12LeadPositionsOneIntercostalSpaceHigher", "UnspecifiedXYZLeadSystem", "FrankXYZLeadSystem", "McfeeParungaoXYZLeadSystem", "CubeXYZLeadSystem", "BipolarUncorrectedXYZLeadSystem", "PseudoOrthogonalXYZLeadSystem", "XYZLeadsDerivedFromStandard12Lead", "NEHBLeadSystem", "_3LeadSystemCC5CM5ML", "_3LeadSystemCC5CM5CH5", "_12LeadFromFrankLeadsXYZLeadsByDowerTransformation", "_12LeadFromEASILeadsESASAIByDowerEASITransformation", ] } name_for_cid[3271] = "HemodynamicPhysiologicalChallenge" cid_concepts[3271] = { "SCT": [ "LegUp", "ValsalvaManeuver", "PostVolumeChallenge", "HeldVentilation", "DrugInfusion", "HeadUp", "VagalStimulation", "Pacing", "NegativeLowerBodyPressure", "Handgrip", "HeldInspiration", "ExerciseChallenge", ] } name_for_cid[3335] = "ECGAnnotation" cid_concepts[3335] = { "MDC": [ "CalibrationPulse", "AtriumAntitachycardiaPaceSpike", "AberratedAtrialPrematureBeatAshmanBeat", "PreExcitationBeat", "LeftVentricleAntibradycardiaPaceSpike", "LeftPosteriorFascicularBlockBeat", "AtrialFlutterWave", "AbnormalBeat", "EntireBeatPonToToffExcludingU", "UWave", "LeftBundleBranchBlockBeat", "TWaveChange", "JPoint", "TransthoracicCardioversionSpike", "NoNoise", "VentricleDefibrillationSpike", "LeftAtriumAntibradycardiaPaceSpike", "NoECGSignalIsAvailable", "SWave", "QSWave", "FusionOfVentricularAndNormalBeat", "AtrialPrematureContraction", "BilateralBundleBranchBlockBeat", "DefibrillationSpike", "AtriumCardioversionSpike", "ModerateNoiseBeatsCanBeDetectedButCannotBeClassified", "IsoelectricRegionFromGlobalQRSOnsetToSpecificLeadOnset", "IncompleteRightBundleBranchBlockBeat", "VentricularAntibradycardiaPaceSpike", "VentricularEscapeBeat", "TWaveSecondDeflectionInTWave", "PacemakerLearningBeat", "IsolatedQRSLikeArtifact", "WolfParkinsonTypeBQRSNegativeInV1V2", "AtriumAntibradycardiaPaceSpike", "VentricleAntitachycardiaPaceSpike", "PRSegment", "EntireQRSExcludingPTAndU", "TransthoracicAntibradycardiaPaceSpike", "VentricularFlutterWave", "OsborneWave", "Notch", "QWave", "BifascicularBlockBeat", "SWaveThirdDeflectionInSWave", "DominantBeat", "PWaveSecondDeflectionInPWave", "RWaveSecondDeflectionInRWave", "IncompleteLeftBundleBranchBlockBeat", "RightVentricleAntibradycardiaPaceSpike", "AtriumDefibrillationSpike", "ROnTPrematureVentricularBeat", "PacemakerFusionBeat", "LownGanongLevineSyndromeNormalQRS", "TransthoracicDefibrillationSpike", "AtrialEscapeBeat", "NonConductedPWave", "AntitachycardiaPaceSpike", "JunctionalNodalPrematureContraction", "WolfParkinsonWhiteSyndromeLessSpecific", "IntraventricularConductionDisturbance", "IsoelectricPointOrSegment", "LeftAnteriorFascicularBlockBeat", "EntireBeatQonToToffExcludingPAndU", "DeltaWave", "STChange", "NormalBeatSinusBeatNormalConduction", "RightAtriumAntibradycardiaPaceSpike", "SWaveSecondDeflectionInSWave", "VentricleCardioversionSpike", "PWave", "RWave", "WolfParkinsonTypeAQRSPositiveInV1V2", "VentricularPrematureContractionBeat", "STMeasurementPoint", "AntibradycardiaPaceSpike", "SupraventricularPrematureContraction", "CardioversionSpike", "TrifascicularBlockBeat", "RightBundleBranchBlockBeat", "STSegment", "TUFusedWave", "IsoelectricRegionFromSpecificLeadQRSOffsetToGlobalOffset", "SevereNoiseBeatsCannotBeDetectedOrClassified", "TWave", "VentricularActivationTime", "TransthoracicAntitachycardiaPaceSpike", "JunctionalNodalEscapeBeat", "UnclassifiableBeat", "RWaveThirdDeflectionInRWave", "SupraventricularEscapeBeat", "PWaveThirdDeflectionInPWave", ] } name_for_cid[3337] = "HemodynamicAnnotation" cid_concepts[3337] = { "DCM": [ "BeatsDetectedRejected", "AWavePeakPressure", "_70PercentOfThermalDyeDilutionCO", "ValveOpen", "BeatsDetectedAccepted", "AWavePressureAverage", "VWavePeakPressure", "_35PercentOfThermalDyeDilutionCO", "ValveClose", "VWavePressureAverage", "StartOfInspiration", "VMaxMyocardial", "StartOfThermalCO", "EndOfSystole", "Tau", "IndicatorMeanTransitTime", "MaxNegDpDt", "StartOfExpiration", "PeakOfThermalCardiacOutputBolus", "EndOfExpiration", "MaxDpDt", "EndOfInspiration", ], "SCT": [ "AverageDiastolicBloodPressure", "MinimumDiastolicBloodPressure", "MaximumSystolicBloodPressure", "MeanBloodPressure", "EndDiastole", "AverageSystolicBloodPressure", ], } name_for_cid[3339] = "ElectrophysiologyAnnotation" cid_concepts[3339] = { "DCM": [ "StimulationAtRate4Interval", "AblationOff", "StimulationAtRate3Interval", "StimulationAtRate2Interval", "AblationOn", "StartOfAtrialContraction", "SWave", "StimulationAtRate1Interval", "StartOfAtrialContractionSubsequent", "PWave", "VWave", "HISBundleWave", "TWave", "RWave", "QWave", "VWaveOfNextBeat", ] } name_for_cid[3400] = "ProcedureLogTitle" cid_concepts[3400] = {"DCM": ["CathLabProcedureLog"]} name_for_cid[3401] = "LogNoteType" cid_concepts[3401] = { "DCM": [ "PatientStatusOrEvent", "ProcedureNote", "NursingNote", "PhysicianNote", "TechNote", ] } name_for_cid[3402] = "PatientStatusandEvent" cid_concepts[3402] = { "DCM": [ "PatientPronouncedDead", "PatientTransferredToMorgue", "PatientGivenPostProcedureInstruction", "PatientDischargedFromDepartment", "PatientTransferredToCCU", "HemostasisNotAchievedOozing", "HemostasisNotAchievedActivelyBleeding", "PatientTransferredToHoldingArea", "PatientDisconnectedFromContinuousMonitoring", "PatientTransferredToSurgery", "HemostasisAchieved", "PatientHasRespiratoryDifficulty", "PatientCoughed", "PatientConnectedToContinuousMonitoring", "PatientAssistedToTable", "PatientUnresponsive", "PatientPreppedAndDraped", "PatientAdvanceDirectiveGiven", "PatientSedated", "NilPerOsNPOStatusConfirmed", "PatientAsleep", "PatientGivenPreProcedureInstruction", "PatientAlert", "PatientInformedConsentGiven", "PatientRestless", "PatientCalledToProcedureRoom", "PatientReportsChestPain", "PatientAdmittedToProcedureRoom", "PatientReportsNoPain", "PatientReportsNausea", "PatientReportsDiscomfort", "PatientDisoriented", ] } name_for_cid[3403] = "PercutaneousEntry" cid_concepts[3403] = { "SCT": [ "ViaFemoralVein", "ViaFemoralArtery", "ViaArtery", "ViaBrachialArtery", "ViaArmVein", "ViaRadialArtery", "ViaVein", ] } name_for_cid[3404] = "StaffAction" cid_concepts[3404] = { "DCM": [ "OfficeCalled", "PageSentTo", "ConsultationWith", "PersonnelArrived", "PersonnelDeparted", ] } name_for_cid[3405] = "ProcedureActionValue" cid_concepts[3405] = { "DCM": [ "ArterialConduitAngiography", "VascularIntervention", "MyocardialBiopsy", "AorticIntervention", "SeptalDefectIntervention", "ValvularIntervention", ], "SCT": [ "CardiacCatheterizationBaselinePhase", "TransthoracicEchocardiography", "StentPlacement", "CardiacVentriculography", "TransseptalCatheterization", "DrugInfusionChallenge", "AtherectomyByRotaryCutter", "PercutaneousRemovalOfIntravascularForeignBody", "CardiacCatheterizationInterventionPhase", "CardiacCatheterizationTherapyPhase", "LeftVentriculography", "CatheterizationOfBothLeftAndRightHeartWithoutGraft", "IntravascularUltrasound", "CardiacCatheterizationPostContrastPhase", "Aortography", "CatheterizationOfLeftHeart", "CardiacCatheterizationPostInterventionPhase", "PercutaneousInsertionOfIntravascularFilter", "CardiacCatheterizationImageAcquisitionPhase", "CatheterizationOfBothLeftAndRightHeartWithGraft", "AtherectomyByLaser", "RightVentriculography", "TranscatheterTherapyForEmbolization", "RestingState", "CardiacCatheterizationPreInterventionPhase", "Atherectomy", "SelectiveEmbolizationOfArtery", "IntracardiacEchocardiography", "CoronaryArteriography", "CardiacCatheterizationTestChallengePhase", "PercutaneousTransluminalBalloonAngioplasty", "EpicardialEchocardiography", "BypassGraftAngiography", "CardiacCatheterizationBailoutPhase", "Angiography", "TransesophagealEchocardiography", "TranscatheterDeploymentOfDetachableBalloon", "CatheterizationOfRightHeart", "ExerciseChallenge", ], } name_for_cid[3406] = "NoncoronaryTranscatheterIntervention" cid_concepts[3406] = { "DCM": [ "VascularIntervention", "MyocardialBiopsy", "AorticIntervention", "SeptalDefectIntervention", "ValvularIntervention", ] } name_for_cid[3407] = "ObjectReferencePurpose" cid_concepts[3407] = { "DCM": [ "PriorReportForCurrentPatient", "PreProcedureLog", "AnalysisOrMeasurementsForCurrentProcedure", ] } name_for_cid[3408] = "ConsumableAction" cid_concepts[3408] = { "DCM": [ "RemainingConsumableDisposed", "ConsumableUnusable", "ConsumableTakenFromInventory", "ConsumableReturnedToInventory", ] } name_for_cid[3409] = "Drug/ContrastAdministration" cid_concepts[3409] = { "DCM": [ "DrugStart", "DrugEnd", "InfusateStart", "InfusateEnd", "ContrastEnd", "ContrastAdministered", "DrugAdministered", "ContrastStart", ] } name_for_cid[3410] = "Drug/ContrastNumericParameter" cid_concepts[3410] = { "DCM": [ "UndilutedDoseAdministered", "Concentration", "VolumeAdministered", "MassAdministered", "VolumeUnadministeredOrDiscarded", "QuantityAdministered", "RateOfAdministration", "DurationOfAdministration", ] } name_for_cid[3411] = "IntracoronaryDevice" cid_concepts[3411] = { "SCT": [ "SalineThrombectomy", "RotationalAtherectomyDevice", "GuidingCatheter", "PercutaneousTransluminalAngioplastyBalloon", "GuideWire", "IntracoronaryPressureGuideWire", "IntravascularOpticalCoherenceTomographyDevice", "CuttingBalloonAngioplastyCBADevice", "Laser", "IntracoronaryDopplerGuideWire", "IntravascularUltrasoundIVUSDevice", "RadiofrequencyAblationDevice", "Stent", "BrachytherapyDevice", "TransluminalExtractionCatheterTEC", "DirectionalCoronaryAtherectomyDCADevice", ] } name_for_cid[3412] = "InterventionAction/Status" cid_concepts[3412] = { "DCM": [ "StentReExpanded", "ObjectRemoved", "AngioplastyBalloonDeflated", "DeviceDeployed", "GuidewireCrossingLesionSuccessful", "InterventionalDeviceWithdrawn", "AngioplastyBalloonInflated", "InterventionalDevicePlaced", "GuidewireCrossingLesionUnsuccessful", "InterventionPerformed", "RadiationApplied", "RadiationRemoved", "InterventionalDevicePlacementUnsuccessful", ] } name_for_cid[3413] = "AdverseOutcome" cid_concepts[3413] = { "DCM": ["DeathDuringCatheterization"], "SCT": [ "LossOfDistalPulse", "Pseudoaneurysm", "EmergencyPercutaneousCoronaryIntervention", "CardiogenicShock", "ConductionDisorderOfTheHeart", "ContrastMediaAdverseReaction", "ArterialDissection", "CardiacTamponade", "CardiacArrest", "AVFistula", "CongestiveHeartFailure", "CerebrovascularAccidentOrStroke", "OcclusionOfArtery", "EmergencyCoronaryArteryBypass", "RenalFailure", "Bleeding", ], } name_for_cid[3414] = "ProcedureUrgency" cid_concepts[3414] = { "SCT": [ "EmergentProcedure", "UrgentProcedure", "ElectiveProcedure", "SalvageProcedure", ] } name_for_cid[3415] = "CardiacRhythm" cid_concepts[3415] = { "MDC": [ "AVDissociation", "VentricularCouplet", "FirstDegreeAVBlock", "NonRespiratorySinusArrhythmia", "VentricularParasystole", "NonsustainedVentricularTachycardia", "AVJunctionalNodalEscapeRhythm", "IrregularRhythmLowHeartRate", "WolfParkinsonWhiteSyndrome", "BrachycardiaAny", "LownGanongLevineSyndrome", "CompleteAVDissociation", "AutomaticAtrialTachycardia", "SecondDegreeAVBlockTypeIIMobitzTypeII", "AtrialEctopicRhythm", "TorsadesDePointesVentricularTachycardia", "SinusArrhythmia", "WanderingSinusPacemakerWithinTheSinusNode", "AcceleratedIdioventricularRhythm", "SustainedMonomorphicVentricularTachycardia", "WolfParkinsonTypeA", "AcceleratedAVJunctionalNodalRhythm", "VentricularBigeminy", "CalibrationSignal", "SinusBradycardia", "AVReciprocatingTachycardia", "SupraventricularAtrialOrJunctionalEctopicRhythm", "VentricularRhythm", "VentricularFlutter", "SupraventricularParoxsysmalTachycardia", "VentricularDemandModePacing", "SecondDegreeSABlockTypeII", "AVDissociationWithInterference", "ParoxsysmalAtrialTachycardia", "VentricularRun", "SecondDegreeAVBlock", "LowHeartRateVariability", "PreExcitation", "RespiratorySinusArrhythmia", "IdioventricularVentricularEscapeRhythm", "VentricularFibrillation", "AsystoleRhythm", "AVJunctionalNodalRhythm", "SinusRhythm", "FirstDegreeSABlock", "TWaveAlternans", "AtrialFlutterRhythm", "ThirdDegreeAVBlockCompleteAVBlock", "AtrialBigeminy", "AtrialDemandModePacing", "VentricularTrigeminy", "ReentrantAVNodalTachycardia", "JunctionalTachycardia", "SinusTachycardiaRhythm", "SupraventricularTachycardia", "AntiTachycardiaPacing", "IsorhythmicAVDissociation", "MultifocalAtrialTachycardia", "VentricularTachycardia", "SecondDegreeAVBlockTypeIWenckebachOrMobitzTypeI", "WanderingPacemakerBetweenTheSinusNodeAndTheAVNode", "PolymorphicVentricularTachycardia", "WolfParkinsonTypeB", "SlowVentricularTachycardiaIdioventricularTachycardia", "ThirdDegreeSABlockCompleteSABlock", "NormalSinusRhythm", "SecondDegreeSABlockTypeIWenckebach", "AtrialFibrillationRhythm", "AtrialTachycardia", ] } name_for_cid[3416] = "RespirationRhythm" cid_concepts[3416] = { "SCT": [ "GaspingRespiration", "RespirationIntermittent", "AbnormalRespiratoryRhythm", "NormalRespiratoryRhythm", "IrregularBreathing", ] } name_for_cid[3418] = "LesionRisk" cid_concepts[3418] = {} name_for_cid[3419] = "FindingTitle" cid_concepts[3419] = {"DCM": ["Recommendation", "Impression", "Finding"]} name_for_cid[3421] = "ProcedureAction" cid_concepts[3421] = { "DCM": [ "SuspendProcedureAction", "ResumeProcedureAction", "StartProcedureAction", "EndProcedureAction", ] } name_for_cid[3422] = "DeviceUseAction" cid_concepts[3422] = { "DCM": ["DeviceCrossedLesion"], "SCT": [ "DeviceUsed", "DeviceAtSiteOfInterest", "DeviceAppliedToPatient", "DeviceWithdrawnRemoved", "DeviceInsertedIntoSheath", "DeviceCrossedSeptum", ], } name_for_cid[3423] = "NumericDeviceCharacteristic" cid_concepts[3423] = { "DCM": ["TransmitFrequency", "CatheterCurve", "InterMarkerDistance"], "SCT": ["Length", "Diameter", "Volume"], } name_for_cid[3425] = "InterventionParameter" cid_concepts[3425] = { "SCT": [ "AblationPower", "AblationFrequency", "AngioplastyInflationPressure", "AngioplastyInflationDuration", "RotationalAtherectomySpeed", "DeliveredRadiationDose", ] } name_for_cid[3426] = "ConsumablesParameter" cid_concepts[3426] = { "DCM": ["LotIdentifier", "UnitSerialIdentifier", "DescriptionOfMaterial"] } name_for_cid[3427] = "EquipmentEvent" cid_concepts[3427] = { "DCM": [ "EquipmentFailure", "EquipmentRemoved", "EquipmentBroughtToProcedureRoom", "EquipmentReady", ] } name_for_cid[3428] = "CardiovascularImagingProcedure" cid_concepts[3428] = { "DCM": ["ArterialConduitAngiography"], "SCT": [ "TransthoracicEchocardiography", "CardiacVentriculography", "RightVentriculography", "LeftVentriculography", "IntravascularUltrasound", "IntracardiacEchocardiography", "CoronaryArteriography", "Aortography", "EpicardialEchocardiography", "BypassGraftAngiography", "Angiography", "TransesophagealEchocardiography", ], } name_for_cid[3429] = "CatheterizationDevice" cid_concepts[3429] = { "DCM": ["Bioptome"], "SCT": [ "SwannGanzCatheter", "FiberopticCatheter", "IntracoronaryPressureGuideWire", "IntravascularOpticalCoherenceTomographyDevice", "CuttingBalloonAngioplastyCBADevice", "Laser", "ThermistorCatheter", "BrachytherapyDevice", "FluidFilledCatheter", "DirectionalCoronaryAtherectomyDCADevice", "SalineThrombectomy", "RotationalAtherectomyDevice", "GuidingCatheter", "PercutaneousTransluminalAngioplastyBalloon", "GuideWire", "TipManometer", "IntracoronaryDopplerGuideWire", "Sheath", "IntravascularUltrasoundIVUSDevice", "TransseptalCatheter", "RadiofrequencyAblationDevice", "Stent", "TransluminalExtractionCatheterTEC", "IntraAorticBalloonPumpIABP", ], } name_for_cid[3430] = "DateTimeQualifier" cid_concepts[3430] = {"DCM": ["DatetimeUnsynchronized", "DatetimeEstimated"]} name_for_cid[3440] = "PeripheralPulseLocation" cid_concepts[3440] = { "SCT": [ "FemoralArtery", "BrachialArtery", "UlnarArtery", "CarotidArtery", "DorsalisPedisArtery", "PoplitealArtery", "PosteriorTibialArtery", "RadialArtery", ] } name_for_cid[3441] = "PatientAssessment" cid_concepts[3441] = { "LN": ["RespirationRhythm", "CardiacRhythm"], "SCT": [ "RespirationAssessment", "PatientMentalStateAssessment", "SkinConditionAssessment", ], } name_for_cid[3442] = "PeripheralPulseMethod" cid_concepts[3442] = {"SCT": ["Doppler", "Palpation"]} name_for_cid[3446] = "SkinCondition" cid_concepts[3446] = { "DCM": [ "SkinConditionMottled", "SkinConditionPale", "SkinConditionDiaphoretic", "SkinConditionFlush", "SkinConditionDry", "SkinConditionClammy", "SkinConditionCool", "SkinConditionCold", "SkinConditionWarm", ] } name_for_cid[3448] = "AirwayAssessment" cid_concepts[3448] = { "DCM": [ "AirwaySeverelyObstructed", "AirwayUnobstructed", "AirwayPartiallyObstructed", ] } name_for_cid[3451] = "CalibrationObject" cid_concepts[3451] = {"DCM": ["Sphere"], "SCT": ["Catheter", "MeasuringRuler"]} name_for_cid[3452] = "CalibrationMethod" cid_concepts[3452] = { "DCM": ["GeometricNonIsocenter", "CalibrationObjectUsed", "GeometricIsocenter"] } name_for_cid[3453] = "CardiacVolumeMethod" cid_concepts[3453] = { "DCM": [ "AreaLengthDodge", "AreaLengthKennedy", "Parallelepiped", "TSPyramid", "TwoChamber", "MultipleSlices", "Boak", "AreaLengthWynne", ] } name_for_cid[3455] = "IndexMethod" cid_concepts[3455] = {"DCM": ["BSA1Point219"], "LN": ["BSA"]} name_for_cid[3456] = "SubsegmentMethod" cid_concepts[3456] = {"DCM": ["UserSelectedMethod", "EquidistantMethod"]} name_for_cid[3458] = "ContourRealignment" cid_concepts[3458] = {"DCM": ["LongAxisBased", "NoRealignment", "CenterOfGravity"]} name_for_cid[3460] = "CircumferentialExtent" cid_concepts[3460] = {"DCM": ["RCARegionInRAOProjection", "LADRegionInRAOProjection"]} name_for_cid[3461] = "RegionalExtent" cid_concepts[3461] = { "DCM": [ "MultipleRCARegionInRAOProjection", "SingleRCARegionInRAOProjection", "MultipleLADRegionInRAOProjection", "SingleLADRegionInRAOProjection", "CFXRegionInLAOProjection", "LADRegionInLAOProjection", "RCARegionInLAOProjection", ] } name_for_cid[3462] = "ChamberIdentification" cid_concepts[3462] = { "SCT": ["RightAtrium", "RightVentricle", "LeftVentricle", "LeftAtrium"] } name_for_cid[3463] = "VentricleIdentification" cid_concepts[3463] = {"SCT": ["RightVentricle", "LeftVentricle"]} name_for_cid[3465] = "QAReferenceMethod" cid_concepts[3465] = { "DCM": ["CurveFittedReference", "InterpolatedLocalReference", "MeanLocalReference"] } name_for_cid[3466] = "PlaneIdentification" cid_concepts[3466] = { "SCT": [ "AnteroPosterior", "LeftAnteriorOblique", "LeftLateral", "CaudalRAO", "RightAnteriorOblique", "CranialRAO", "CaudalLAO", "CranialLAO", ] } name_for_cid[3467] = "EjectionFraction" cid_concepts[3467] = { "DCM": ["LeftAtrialEjectionFractionByAngiography"], "LN": [ "RightVentricularEjectionFractionByAngiography", "LeftVentricularEjectionFractionByAngiography", ], } name_for_cid[3468] = "EDVolume" cid_concepts[3468] = { "DCM": ["LeftAtrialEDVolume"], "LN": ["RightVentricularEDVolume", "LeftVentricularEDVolume"], } name_for_cid[3469] = "ESVolume" cid_concepts[3469] = { "DCM": ["LeftAtrialESVolume"], "LN": ["RightVentricularESVolume", "LeftVentricularESVolume"], } name_for_cid[3470] = "VesselLumenCrosssectionalAreaCalculationMethod" cid_concepts[3470] = {"DCM": ["DensitometricMethod", "CircularMethod"]} name_for_cid[3471] = "EstimatedVolume" cid_concepts[3471] = { "DCM": [ "VolumeEstimatedFromTwoNonCoplanar2DRegions", "VolumeEstimatedFromSingle2DRegion", ] } name_for_cid[3472] = "CardiacContractionPhase" cid_concepts[3472] = {"SCT": ["Diastolic", "Systolic"]} name_for_cid[3480] = "IVUSProcedurePhase" cid_concepts[3480] = { "SCT": [ "CardiacCatheterizationPostInterventionPhase", "CardiacCatheterizationPreInterventionPhase", ] } name_for_cid[3481] = "IVUSDistanceMeasurement" cid_concepts[3481] = { "DCM": ["PlaquePlusMediaThickness", "LumenPerimeter", "EEMDiameter"], "SCT": ["StentDiameter", "VesselLumenDiameter"], } name_for_cid[3482] = "IVUSAreaMeasurement" cid_concepts[3482] = { "DCM": [ "InStentNeointimalCrossSectionalArea", "EEMCrossSectionalArea", "PlaquePlusMediaCrossSectionalArea", ], "SCT": ["VesselLumenCrossSectionalArea", "StentCrossSectionalArea"], } name_for_cid[3483] = "IVUSLongitudinalMeasurement" cid_concepts[3483] = { "DCM": ["StentGap", "CalciumLength"], "SCT": ["StentLength", "StenoticLesionLength"], } name_for_cid[3484] = "IVUSIndex/Ratio" cid_concepts[3484] = { "DCM": [ "LumenShapeIndex", "StentSymmetryIndex", "StentExpansionIndex", "PlaquePlusMediaEccentricityIndex", "RemodelingIndex", "LumenEccentricityIndex", "StentDiameterRatio", "EEMDiameterRatio", "LumenDiameterRatio", ] } name_for_cid[3485] = "IVUSVolumeMeasurement" cid_concepts[3485] = { "DCM": [ "NativePlaqueVolume", "TotalPlaqueVolume", "InStentNeointimalVolume", "EEMVolume", "LumenVolume", ], "SCT": ["StentVolume"], } name_for_cid[3486] = "VascularMeasurementSite" cid_concepts[3486] = { "DCM": [ "SiteOfLumenMaximum", "SiteOfLumenMinimum", "ProximalReference", "DistalReference", ] } name_for_cid[3487] = "IntravascularVolumetricRegion" cid_concepts[3487] = { "DCM": [ "DistalStentMargin", "StentedRegion", "ProximalStentMargin", "EntirePullback", ], "SCT": ["Lesion", "MorphologicallyAbnormalStructure", "CulpritLesion"], } name_for_cid[3488] = "Min/Max/Mean" cid_concepts[3488] = {"SCT": ["Minimum", "Maximum", "Mean"]} name_for_cid[3489] = "CalciumDistribution" cid_concepts[3489] = {"SCT": ["Deep", "Superficial"]} name_for_cid[3491] = "IVUSLesionMorphology" cid_concepts[3491] = { "DCM": [ "InStentNeointima", "SoftPlaque", "VulnerablePlaque", "ErodedPlaque", "NecroticLipidicPlaque", "PlaqueRupture", "FalseLumen", "FibroLipidicPlaque", ], "SCT": [ "VascularCalcification", "PseudoAneurysm", "Eccentric", "PlaqueUlceration", "Concentric", "ArterialTrueAneurysm", "Thrombus", "FibrousPlaque", ], } name_for_cid[3492] = "VascularDissectionClassification" cid_concepts[3492] = { "DCM": [ "MedialDissection", "IntraStentDissection", "AdventitialDissection", "IntimalDissection", ], "SCT": ["IntramuralHematoma"], } name_for_cid[3493] = "IVUSRelativeStenosisSeverity" cid_concepts[3493] = {"DCM": ["T2Secondary", "T3Secondary", "T1Worst", "T4Secondary"]} name_for_cid[3494] = "IVUSNonMorphologicalFinding" cid_concepts[3494] = { "DCM": ["TrueLumen"], "SCT": [ "ArterialBloodStasis", "AcquiredIncompleteStentApposition", "IncompleteStentApposition", ], } name_for_cid[3495] = "IVUSPlaqueComposition" cid_concepts[3495] = { "DCM": ["NecroticLipidicPlaque", "FibroLipidicPlaque"], "SCT": ["VascularCalcification", "Thrombus", "FibrousPlaque"], } name_for_cid[3496] = "IVUSFiducialPoint" cid_concepts[3496] = { "SCT": [ "VascularCalcification", "Vein", "VesselOrigin", "Stent", "FibrousPlaque", "CollateralBranchOfVessel", ] } name_for_cid[3497] = "IVUSArterialMorphology" cid_concepts[3497] = { "DCM": ["NecroticLipidicPlaque", "FibroLipidicPlaque"], "SCT": [ "LumenOfArtery", "VascularCalcification", "Thrombus", "ExternalElasticMembrane", "FibrousPlaque", ], } name_for_cid[3500] = "PressureUnit" cid_concepts[3500] = {"UCUM": ["MillimetersHg", "Kilopascal"]} name_for_cid[3502] = "HemodynamicResistanceUnit" cid_concepts[3502] = {"UCUM": ["WoodU", "PRU", "DynScm5"]} name_for_cid[3503] = "IndexedHemodynamicResistanceUnit" cid_concepts[3503] = {"UCUM": ["WoodUM2", "DynScm5M2", "PRUPerSquareMeter"]} name_for_cid[3510] = "CatheterSizeUnit" cid_concepts[3510] = {"UCUM": ["French", "Millimeter"]} name_for_cid[3515] = "SpecimenCollection" cid_concepts[3515] = { "SCT": [ "BloodSamplingFromExtracorporealBloodCircuit", "SpecimenCollection", "CollectionOfBloodSpecimenForLaboratory", ] } name_for_cid[3520] = "BloodSourceType" cid_concepts[3520] = { "SCT": [ "SystemicArteryBlood", "PulmonaryVeinBlood", "MixedVenousBlood", "PulmonaryArteryBlood", ] } name_for_cid[3524] = "BloodGasPressure" cid_concepts[3524] = { "LN": [ "BloodCarbonDioxidePartialPressure", "BloodOxygenPartialPressure", "VenousOxygenPartialPressure", "OxygenPartialPressureAt50PercentSaturationP50", "ArterialOxygenPartialPressureAt50PercentSaturation", "VenousBloodCarbonDioxidePartialPressure", "VenousOxygenPartialPressureAt50PercentSaturation", "ArterialOxygenPartialPressure", "ArterialBloodCarbonDioxidePartialPressure", ] } name_for_cid[3525] = "BloodGasContent" cid_concepts[3525] = { "DCM": ["BloodOxygenContent"], "LN": [ "ArterialOxygenContent", "PulmonaryArteryMainOxygenContent", "PulmonaryWedgeOxygenContent", "ArterialBloodCarbonDioxideContent", "BloodCarbonDioxideContent", "VenousBloodCarbonDioxideContent", "AorticRootOxygenContent", "VenousOxygenContent", ], } name_for_cid[3526] = "BloodGasSaturation" cid_concepts[3526] = { "DCM": ["BloodCarbonDioxideSaturation"], "LN": [ "CapillaryBloodOxygenSaturation", "ArterialOxygenSaturation", "VenousOxygenSaturation", "CapillaryBloodOxygenSaturationByOximetry", "BloodOxygenSaturation", ], } name_for_cid[3527] = "BloodBaseExcess" cid_concepts[3527] = { "LN": ["BloodBaseExcess", "VenousBloodBaseExcess", "ArterialBloodBaseExcess"] } name_for_cid[3528] = "BloodpH" cid_concepts[3528] = {"LN": ["BloodPh", "VenousBloodPh", "ArterialBloodPh"]} name_for_cid[3529] = "Arterial/VenousContent" cid_concepts[3529] = { "DCM": ["PulmonaryArterialContentFcpa", "PulmonaryVenousContentFcpv"], "LN": ["ArterialContentFca", "VenousContentFcv"], } name_for_cid[3530] = "OxygenAdministrationAction" cid_concepts[3530] = {"DCM": ["BeginOxygenAdministration", "EndOxygenAdministration"]} name_for_cid[3531] = "OxygenAdministration" cid_concepts[3531] = { "DCM": ["OxygenAdministrationByVentilator"], "SCT": ["OxygenAdministrationByMask", "OxygenAdministrationByNasalCannula"], } name_for_cid[3550] = "CirculatorySupportAction" cid_concepts[3550] = {"DCM": ["EndCirculatorySupport", "BeginCirculatorySupport"]} name_for_cid[3551] = "VentilationAction" cid_concepts[3551] = {"DCM": ["EndVentilation", "BeginVentilation"]} name_for_cid[3552] = "PacingAction" cid_concepts[3552] = {"DCM": ["EndPacing", "BeginPacing"]} name_for_cid[3553] = "CirculatorySupport" cid_concepts[3553] = { "SCT": [ "ExternalCounterPulsation", "LeftVentricularAssistDevice", "CardiopulmonaryBypass", "IntraAorticBalloonPump", "ExtraCorporealCirculation", ] } name_for_cid[3554] = "Ventilation" cid_concepts[3554] = { "SCT": ["PressureSupportVentilator", "AmbuBag", "VolumeSupportVentilator"] } name_for_cid[3555] = "Pacing" cid_concepts[3555] = { "SCT": [ "AtrialPacing", "TemporaryTranscutaneousPacing", "PacingWithMagnet", "Pacing", "AVSequentialPacing", "VentricularPacing", ] } name_for_cid[3560] = "BloodPressureMethod" cid_concepts[3560] = {"SCT": ["BloodPressureCuffMethod"]} name_for_cid[3600] = "RelativeTime" cid_concepts[3600] = {"SCT": ["During", "After", "Before"]} name_for_cid[3602] = "HemodynamicPatientState" cid_concepts[3602] = { "SCT": [ "BaselineState", "ExerciseState", "SupineBodyPosition", "RestingState", "PostExerciseState", ] } name_for_cid[3604] = "ArterialLesionLocation" cid_concepts[3604] = { "BARI": [ "_1stDiagonalCoronaryArteryLaterals", "_1stMarginalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", ], "SCT": [ "InternalCarotidArtery", "ProximalRightCoronaryArtery", "RightPosteriorAVCoronaryArtery", "BasilarArtery", "LateralPlantarArtery", "MidCircumflexCoronaryArtery", "RightPulmonaryArtery", "IntermediateArteryRamus", "GeniculateArtery", "CarotidArtery", "UmbilicalArtery", "NeoAorta", "AorticFistula", "RadialArtery", "RightFemoralArtery", "SuperiorThyroidArtery", "IliacArtery", "LeftFemoralArtery", "DistalRightCoronaryArtery", "LeftAnteriorDescendingCoronaryArtery", "TruncusArteriosusCommunis", "Artery", "CommonCarotidArtery", "_3rdMarginalCoronaryArtery", "Aorta", "PatentDuctusArteriosus", "SuperficialTemporalArtery", "MidRightCoronaryArtery", "FistulaCoronaryToLeftVentricle", "CoronaryArtery", "LeftPosterolateralCircumflexCoronaryArtery", "StructureOfDescendingThoracicAorta", "PulmonaryArteriovenousFistula", "SubclavianArtery", "TibialArtery", "_3rdLeftPosterolateralCoronaryArtery", "OphthalmicArtery", "MesentericArtery", "MedialPlantarArtery", "PoplitealArtery", "LeftMainCoronaryArteryOstium", "AnteriorSpinalArtery", "HepaticArtery", "PeronealArtery", "_2ndRightPosterolateralCoronaryArtery", "BrachiocephalicTrunk", "LeftPosteriorDescendingCircumflexCoronaryArtery", "RenalArtery", "_1stMarginalCoronaryArtery", "SystemicCollateralArteryToLung", "FacialArtery", "LumbarArtery", "FemoralArtery", "PulmonaryArtery", "BrachialArtery", "_2ndDiagonalCoronaryArtery", "DistalCircumflexCoronaryArtery", "MidLeftAnteriorDescendingCoronaryArtery", "CoronaryArteryGraft", "FistulaCoronaryToRightAtrium", "FistulaCoronaryToRightVentricle", "CommonFemoralArtery", "_1stLeftPosterolateralCoronaryArtery", "PulmonaryArteryConduit", "CircumflexCoronaryArtery", "AnteriorCommunicatingArtery", "FistulaCoronaryToLeftAtrium", "ThoracicAorta", "DistalLeftAnteriorDescendingCoronaryArtery", "PulmonaryVeinWedge", "RightCoronaryArteryOstium", "LeftCoronaryArtery", "AxillaryArtery", "LeftPulmonaryArtery", "MarginalCoronaryArtery", "InternalMammaryArtery", "ProximalLeftAnteriorDescendingCoronaryArtery", "VertebralArtery", "_3rdDiagonalCoronaryArtery", "AVGrooveContinuationOfCircumflexArtery", "_3rdRightPosterolateralCoronaryArtery", "PosterolateralBranchOfRightCoronaryArtery", "NeonatalPulmonaryArteryPrimitivePA", "SuperficialFemoralArtery", "ProximalCircumflexCoronaryArtery", "_2ndMarginalCoronaryArtery", "PosteriorCommunicatingArtery", "AorticArch", "AbdominalAorta", "LingualArtery", "LeftMainCoronaryArtery", "_2ndLeftPosterolateralCoronaryArtery", "PosteriorDescendingRightCoronaryArtery", "Baffle", "LacrimalArtery", "OccipitalArtery", "_1stSeptalCoronaryArtery", "RightCoronaryArtery", "AscendingAorta", "_1stDiagonalCoronaryArtery", "ProfundaFemorisArtery", "CerebralArtery", "_1stRightPosterolateralCoronaryArtery", ], } name_for_cid[3606] = "ArterialSourceLocation" cid_concepts[3606] = { "SCT": [ "InternalCarotidArtery", "BasilarArtery", "CommonFemoralArtery", "LateralPlantarArtery", "RightPulmonaryArtery", "PulmonaryArteryConduit", "AnteriorCommunicatingArtery", "FistulaCoronaryToLeftAtrium", "GeniculateArtery", "ThoracicAorta", "CarotidArtery", "UmbilicalArtery", "NeoAorta", "PulmonaryVeinWedge", "AorticFistula", "RadialArtery", "RightFemoralArtery", "SuperiorThyroidArtery", "IliacArtery", "LeftFemoralArtery", "AxillaryArtery", "LeftPulmonaryArtery", "InternalMammaryArtery", "TruncusArteriosusCommunis", "Artery", "VertebralArtery", "CommonCarotidArtery", "Aorta", "PatentDuctusArteriosus", "SuperficialTemporalArtery", "FistulaCoronaryToLeftVentricle", "CoronaryArtery", "StructureOfDescendingThoracicAorta", "PulmonaryArteriovenousFistula", "SubclavianArtery", "NeonatalPulmonaryArteryPrimitivePA", "TibialArtery", "SuperficialFemoralArtery", "OphthalmicArtery", "MesentericArtery", "MedialPlantarArtery", "PosteriorCommunicatingArtery", "PoplitealArtery", "AorticArch", "AbdominalAorta", "LingualArtery", "AnteriorSpinalArtery", "HepaticArtery", "PeronealArtery", "Baffle", "BrachiocephalicTrunk", "RenalArtery", "SystemicCollateralArteryToLung", "FacialArtery", "LacrimalArtery", "LumbarArtery", "OccipitalArtery", "AscendingAorta", "FemoralArtery", "PulmonaryArtery", "BrachialArtery", "ProfundaFemorisArtery", "CerebralArtery", "FistulaCoronaryToRightAtrium", "FistulaCoronaryToRightVentricle", ] } name_for_cid[3607] = "VenousSourceLocation" cid_concepts[3607] = { "SCT": [ "InnominateVein", "SubclavianVein", "PosteriorMedialTributary", "PortalVein", "BrachialVein", "InferiorVenaCava", "RenalVein", "BoydPerforatingVein", "SuperiorVenaCava", "CephalicVein", "CentralVenousSystem", "GastricVein", "SplenicVein", "SaphenousVein", "HepaticVein", "AntecubitalVein", "BasilicVein", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "HunterianPerforatingVein", "InternalJugularVein", "AnomalousPulmonaryVein", "AzygosVein", "MesentericVein", "Vein", "UmbilicalVein", "AxillaryVein", "PulmonaryVein", "FemoralVein", "GreatSaphenousVein", "DoddPerforatingVein", ] } name_for_cid[3608] = "AtrialSourceLocation" cid_concepts[3608] = { "SCT": [ "RightAtrium", "PulmonaryCapillaryWedge", "Baffle", "LeftAtrium", "CommonAtrium", "JuxtaposedAppendage", "CoronarySinus", "SystemicVenousAtrium", "PulmonaryVenousAtrium", "PulmonaryArteryWedge", "PulmonaryChamberInCorTriatriatum", ] } name_for_cid[3609] = "VentricularSourceLocation" cid_concepts[3609] = { "SCT": [ "RightVentricleOutflowTract", "LeftVentricleInflow", "RightVentricle", "LeftVentricle", "RightVentricleInflow", "CommonVentricle", "LeftVentricleApex", "RightVentricleApex", "LeftVentricleOutflowTract", ] } name_for_cid[3610] = "GradientSourceLocation" cid_concepts[3610] = { "SCT": [ "TricuspidValve", "RightVentricleOutflowTract", "PulmonaryValve", "PulmonaryArtery", "CoarctationOfAorta", "AorticValve", "AtrialSeptalDefect", "MitralValve", "VentricularSeptalDefect", "LeftVentricleOutflowTract", ] } name_for_cid[3611] = "PressureMeasurement" cid_concepts[3611] = { "DCM": [ "XDescentPressure", "YDescentPressure", "VentricularEndDiastolicPressure", "AWavePeakPressure", "PressureAtDpDtMax", "VWavePeakPressure", "ZPointPressure", "GradientPressureAverage", "GradientPressurePeak", "CWavePressure", ], "LN": ["IntravascularDiastolicBloodPressure", "IntravascularSystolicBloodPressure"], "SCT": [ "AverageDiastolicBloodPressure", "MinimumDiastolicBloodPressure", "AverageSystolicBloodPressure", "MaximumSystolicBloodPressure", "MeanBloodPressure", ], } name_for_cid[3612] = "BloodVelocityMeasurement" cid_concepts[3612] = { "DCM": [ "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ] } name_for_cid[3613] = "HemodynamicTimeMeasurement" cid_concepts[3613] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RightVentricularFillingTime", "LeftVentricularFillingTime", "RightVentricularEjectionTime", "LeftVentricularEjectionTime", "RRInterval", ] } name_for_cid[3614] = "NonmitralValveArea" cid_concepts[3614] = { "DCM": ["DerivedNonValveArea"], "SCT": ["TricuspidValveArea", "PulmonicValveArea", "AorticValveArea"], } name_for_cid[3615] = "ValveArea" cid_concepts[3615] = { "DCM": ["DerivedNonValveArea"], "SCT": [ "MitralValveArea", "TricuspidValveArea", "PulmonicValveArea", "AorticValveArea", ], } name_for_cid[3616] = "HemodynamicPeriodMeasurement" cid_concepts[3616] = { "SCT": [ "PulmonarySystolicEjectionPeriodSepp", "AorticSystolicEjectionPeriodSepa", "DerivedPeriodNonValve", "TricuspidDiastolicFillingPeriodDfpt", "MitralDiastolicFillingPeriodDfpm", ] } name_for_cid[3617] = "ValveFlow" cid_concepts[3617] = { "SCT": [ "DerivedFlowNonValve", "AorticValveFlow", "MitralValveFlow", "TricuspidValveFlow", "PulmonaryValveFlow", ] } name_for_cid[3618] = "HemodynamicFlow" cid_concepts[3618] = {"DCM": ["SystemicFlow", "PulmonaryFlow"]} name_for_cid[3619] = "HemodynamicResistanceMeasurement" cid_concepts[3619] = { "DCM": ["TotalVascularResistance", "TotalPulmonaryResistance"], "SCT": ["PulmonaryVascularResistance", "SystemicVascularResistance"], } name_for_cid[3620] = "HemodynamicRatio" cid_concepts[3620] = { "DCM": [ "DiastolicSystolicVelocityRatio", "HyperemicRatio", "CoronaryFlowReserve", "HemodynamicResistanceIndex", ], "LN": ["TibialBrachialIndex"], "SCT": [ "FractionalFlowReserve", "FractionalFlowReserveUsingIntracoronaryBolus", "PulmonarySystemicFlowRatio", "PulsatilityIndex", "FractionalFlowReserveUsingIntravenousInfusion", ], } name_for_cid[3621] = "FractionalFlowReserve" cid_concepts[3621] = { "SCT": [ "FractionalFlowReserve", "FractionalFlowReserveUsingIntracoronaryBolus", "FractionalFlowReserveUsingIntravenousInfusion", ] } name_for_cid[3627] = "MeasurementType" cid_concepts[3627] = { "SCT": [ "Estimated", "PeakToPeak", "Measured", "Mode", "VisualEstimation", "BestValue", "Calculated", "Mean", "PointSourceMeasurement", "Median", ] } name_for_cid[3628] = "CardiacOutputMethod" cid_concepts[3628] = {"SCT": ["ThermalBath", "ThermalInline", "DyeDilution"]} name_for_cid[3629] = "ProcedureIntent" cid_concepts[3629] = { "DCM": ["QualityControlIntent"], "SCT": [ "DiagnosticIntent", "StagingIntent", "TherapeuticIntent", "CurativeIntent", "ProphylacticIntent", "AdjunctIntent", "ForensicIntent", "NeoAdjuvantIntent", "SupportiveIntent", "GuidanceIntent", "PalliativeIntent", "AdjuvantIntent", "CombinedDiagnosticAndTherapeuticIntent", "ScreeningIntent", "PreventiveIntent", ], } name_for_cid[3630] = "CardiovascularAnatomicLocation" cid_concepts[3630] = { "SCT": [ "SubclavianVein", "InternalCarotidArtery", "PulmonaryValve", "BasilarArtery", "AorticValve", "LateralPlantarArtery", "RightVentricleApex", "InferiorVenaCava", "RightPulmonaryArtery", "LeftVentricleInflow", "GeniculateArtery", "CentralVenousSystem", "CarotidArtery", "CommonAtrium", "UmbilicalArtery", "NeoAorta", "AorticFistula", "LeftVentricleOutflowTract", "RadialArtery", "RightFemoralArtery", "SuperiorThyroidArtery", "IliacArtery", "LeftFemoralArtery", "TruncusArteriosusCommunis", "Artery", "AntecubitalVein", "CommonCarotidArtery", "Aorta", "PatentDuctusArteriosus", "SuperficialTemporalArtery", "MesentericVein", "Vein", "FistulaCoronaryToLeftVentricle", "PulmonaryVein", "CoronaryArtery", "StructureOfDescendingThoracicAorta", "PulmonaryArteriovenousFistula", "SubclavianArtery", "TibialArtery", "RightVentricleInflow", "OphthalmicArtery", "MesentericArtery", "MedialPlantarArtery", "PoplitealArtery", "PulmonaryVenousAtrium", "BrachialVein", "PulmonaryChamberInCorTriatriatum", "PulmonaryCapillaryWedge", "SuperiorVenaCava", "LeftVentricle", "AnteriorSpinalArtery", "HepaticArtery", "SplenicVein", "PeronealArtery", "RightVentricleOutflowTract", "SaphenousVein", "BrachiocephalicTrunk", "RenalArtery", "SystemicCollateralArteryToLung", "FacialArtery", "LumbarArtery", "LeftVentricleApex", "VentricularSeptalDefect", "AzygosVein", "PulmonaryArtery", "FemoralArtery", "BrachialArtery", "FistulaCoronaryToRightAtrium", "MitralValve", "FistulaCoronaryToRightVentricle", "PosteriorMedialTributary", "CoarctationOfAorta", "CommonFemoralArtery", "PulmonaryArteryConduit", "TricuspidValve", "RightAtrium", "AnteriorCommunicatingArtery", "FistulaCoronaryToLeftAtrium", "RightVentricle", "ThoracicAorta", "CommonVentricle", "AtrialSeptalDefect", "PulmonaryVeinWedge", "CoronarySinus", "AxillaryArtery", "LeftPulmonaryArtery", "HepaticVein", "InternalMammaryArtery", "VertebralArtery", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "InternalJugularVein", "UmbilicalVein", "FemoralVein", "InnominateVein", "NeonatalPulmonaryArteryPrimitivePA", "SuperficialFemoralArtery", "PortalVein", "PosteriorCommunicatingArtery", "JuxtaposedAppendage", "AorticArch", "RenalVein", "BoydPerforatingVein", "AbdominalAorta", "CephalicVein", "LingualArtery", "GastricVein", "Baffle", "LacrimalArtery", "BasilicVein", "OccipitalArtery", "SystemicVenousAtrium", "HunterianPerforatingVein", "AscendingAorta", "AnomalousPulmonaryVein", "ProfundaFemorisArtery", "LeftAtrium", "CerebralArtery", "AxillaryVein", "GreatSaphenousVein", "PulmonaryArteryWedge", "DoddPerforatingVein", ] } name_for_cid[3640] = "Hypertension" cid_concepts[3640] = {"SCT": ["PulmonaryHypertension", "SystemicArterialHypertension"]} name_for_cid[3641] = "HemodynamicAssessment" cid_concepts[3641] = { "SCT": [ "PulmonaryVascularResistance", "LeftVentricularSystolicPressure", "RightAtrialPressure", "LeftVentricularEndDiastolicPressure", "RightVentricularEndDiastolicPressure", "PulmonaryCapillaryWedgePressure", "RightVentricularSystolicPressure", "DiastolicPressure", "PulmonaryArteryPressure", "VascularResistanceFunction", ] } name_for_cid[3642] = "DegreeFinding" cid_concepts[3642] = { "SCT": ["SeverelyElevated", "Decreased", "Elevated", "NormalRange"] } name_for_cid[3651] = "HemodynamicMeasurementPhase" cid_concepts[3651] = { "SCT": [ "CardiacCatheterizationBaselinePhase", "CardiacCatheterizationTestChallengePhase", "CardiacCatheterizationGradientAssessmentPhase", "DrugInfusionChallenge", "CardiacCatheterizationPostInterventionPhase", "CardiacCatheterizationPostContrastPhase", "RestingState", "ExerciseChallenge", ] } name_for_cid[3663] = "BodySurfaceAreaEquation" cid_concepts[3663] = { "DCM": [ "BSAEquals0Point038189WT0Point423HT0Point362", "BSAEquals13210Point3433WT", "BSAEquals0Point010265WT0Point423HT0Point651", "BSAEquals0Point0004688WT0Point8168To0Point0154LogWT", "BSAEquals0Point008883WT0Point444HT0Point663", "BSAEquals0Point024265WT0Point5378Htcm0Point3964", "BSAEqualsHTWT360Point5", "BSAEquals0Point007358WT0Point425HT0Point725", "BSAEquals0Point007184WT0Point425HT0Point725", "BSAEquals0Point0235WT0Point51456Htcm0Point42246", "BSAEquals0Point003207WT0Point7285To0Point0188LogWTHT0Point3", "BSAEquals0Point009568WT0Point473HT0Point655", ] } name_for_cid[3664] = "OxygenConsumptionEquation/Table" cid_concepts[3664] = { "DCM": [ "VO2EqualsVestpd10FIO2FE02", "Vo2maleEqualsBSA138Point111Point49LogeAge0Point378Hrf", "Vo2femaleEqualsBSA138Point117Point04LogeAge0Point378Hrf", "FleischTable", "BoothbyTable", "VO2Equals176BSA", "RobertsonReidTable", "VO2Equals152BSA", "VO2Equals175BSA", ] } name_for_cid[3666] = "P50Equation" cid_concepts[3666] = { "DCM": [ "IfAgeLesserThan30DayP50Equals24Point6", "IfAgeLesserThan18YearsP50Equals27Point2", "IfPremAgeLesserThan3DaysP50Equals19Point9", "IfAgeLesserThan1DayP50Equals21Point6", "IfAgeGreaterThan60YearsP50Equals29Point3", "IfAgeLesserThan40YearsP50Equals27Point4", ] } name_for_cid[3667] = "FraminghamScore" cid_concepts[3667] = { "DCM": [ "ComparativeLow10YearCHDRisk", "_10YearCHDRisk", "ComparativeAverage10YearCHDRisk", ] } name_for_cid[3668] = "FraminghamTable" cid_concepts[3668] = { "DCM": [ "TotalCholesterolScoreSheetForWomen", "LDLCholesterolScoreSheetForWomen", "TotalCholesterolScoreSheetForMen", "LDLCholesterolScoreSheetForMen", ] } name_for_cid[3670] = "ECGProcedureType" cid_concepts[3670] = {"SCT": ["_15LeadECG", "_12LeadECG", "_18LeadECG"]} name_for_cid[3671] = "ReasonforECGStudy" cid_concepts[3671] = { "SCT": [ "PreSurgeryTesting", "RoutineProcedure", "EmergencyDepartmentPatientVisit", "EmergencyProcedure", "ProcedureInCardiacCareUnit", "EvaluationOfMurmur", "OutpatientProcedure", ] } name_for_cid[3676] = "LeadMeasurementTechnique" cid_concepts[3676] = { "SCT": ["Representative", "SingleBeats", "Averaged", "Routine", "Median"] } name_for_cid[3677] = "SummaryCodesECG" cid_concepts[3677] = { "DCM": ["NonDiagnosticECG"], "SCT": ["BorderlineNormalECG", "ECGEquivocal", "ECGNormal", "AbnormalECG"], } name_for_cid[3678] = "QTCorrectionAlgorithm" cid_concepts[3678] = { "DCM": [ "FraminghamQtcAlgorithm", "HodgesQTCorrectionAlgorithm", "FridericiaQtcAlgorithm", "BazettQTCorrectionAlgorithm", ] } name_for_cid[3680] = "ECGLeadNoiseDescription" cid_concepts[3680] = {"MDC": ["ModerateNoise", "SevereNoise", "NoNoise", "NoSignal"]} name_for_cid[3687] = "ElectrophysiologyWaveformDuration" cid_concepts[3687] = { "MDC": [ "R3DurationPerLead", "POnsetToP1DurationPerLead", "S3DurationPerLead", "PQSegmentTimePeriodPerLead", "PPTimePeriodPerLead", "QRSDurationPerLead", "VentricularActivationTimePerLead", "S1DurationPerLead", "QTUTimePeriodPerLead", "PDurationPerLead", "POnsetToP2DurationPerLead", "R2DurationPerLead", "POffsetToQRSOnsetDurationPerLead", "S2DurationPerLead", "RRTimePeriodPerLead", "R1DurationPerLead", "POnsetToP3DurationPerLead", "QDurationPerLead", "PQTimePeriodPerLead", "QTDurationPerLead", ] } name_for_cid[3688] = "ElectrophysiologyWaveformVoltage" cid_concepts[3688] = { "MDC": [ "PMinimumAmplitudePerLead", "R1AmplitudePerLead", "S2AmplitudePerLead", "AmplitudeAt20msIntoSTSegmentPerLead", "STAmplitudePerLead", "TMinimumAmplitudePerLead", "SAmplitudePerLead", "S1AmplitudePerLead", "AmplitudeAt40msIntoSTSegmentPerLead", "QAmplitudePerLead", "RAmplitudePerLead", "R3AmplitudePerLead", "AmplitudeAt60msIntoSTSegmentPerLead", "TMaximumAmplitudePerLead", "JPointAmplitudePerLead", "R2AmplitudePerLead", "P3AmplitudePerLead", "AmplitudeAt80msIntoSTSegmentPerLead", "S3AmplitudePerLead", "PMaximumAmplitudePerLead", ] } name_for_cid[3689] = "ECGGlobalWaveformDuration" cid_concepts[3689] = { "MDC": [ "PDurationGlobal", "PPTimePeriodGlobal", "RRTimePeriodGlobal", "QTDurationGlobal", "PQSegmentTimePeriodGlobal", "QRSDurationGlobal", "PQTimePeriodGlobal", "PRTimePeriodGlobal", "QTUTimePeriodGlobal", ] } name_for_cid[3690] = "ECGControlNumericVariable" cid_concepts[3690] = { "MDC": [ "LowPassFilterCutoffFreq", "InterpolatorSNR", "NotchFilterFrequency", "SampleRate", "NotchFilterBandwidth", "Sensitivity", "ZeroOffset", "PadValue", "TimeSkew", "SampleSkew", "TimeOffset", ] } name_for_cid[3691] = "ECGControlTextVariable" cid_concepts[3691] = { "MDC": [ "Interpolator", "HighPassFilter", "InterpolatorDescription", "HighPassFilterDescription", "NotchFilter", "NotchFilterDescription", "BaselineDescription", "LowPassFilter", ] } name_for_cid[3700] = "CathDiagnosis" cid_concepts[3700] = { "SCT": [ "AorticDissection", "Arrhythmia", "VentricularFibrillation", "RecurrentAnginaPostStent", "PericardialTamponade", "AorticValveDisease", "UnstableAnginaProgressiveAngina", "MitralRegurgitation", "PulmonaryHypertension", "PulmonaryEdema", "MitralStenosis", "AtrialSeptalDefect", "PericardialDisease", "AcuteVentricularSeptalRupture", "PostInfarctionAngina", "MitralValveProlapse", "StableAngina", "HeartDiseaseCongenital", "AtypicalChestPain", "RecurrentAnginaPostRotationalAtherectomy", "PulmonicValveDisease", "AorticAneurysm", "AorticInsufficiency", "AtrialFibrillation", "CardiogenicShock", "TricuspidValveDisease", "RecurrentAnginaPostDCA", "Myocarditis", "VentricularTachycardia", "HypertensiveHeartDisease", "RecurrentAnginaPostPTCA", "CongestiveCardiomyopathy", "VentricularSeptalDefect", "CoronaryArteryDisease", "AcuteMyocardialInfarction", "SilentIschemia", "RestrictiveCardiomyopathy", "HypertrophicObstructiveCardiomyopathy", "SPMIPositiveStressForIschemia", "AtypicalAnginaVariantAngina", "CongestiveHeartFailure", "SubacuteBacterialEndocarditis", "AorticStenosis", "MitralValveDisease", "TricuspidRegurgitation", "AcuteMitralRegurgitation", "RecurrentAnginaPostCABG", "ConstrictivePericarditis", ] } name_for_cid[3701] = "CardiacValve/Tract" cid_concepts[3701] = { "SCT": [ "TricuspidValve", "PulmonaryValve", "AorticValve", "MitralValve", "LeftVentricleOutflowTract", ] } name_for_cid[3703] = "WallMotion" cid_concepts[3703] = { "DCM": ["NotVisualized"], "SCT": [ "ModerateHypokinesis", "HyperkineticRegion", "Hypokinesis", "SevereHypokinesis", "Unknown", "NormalWallMotion", "MildHypokinesis", "Akinesis", "NotEvaluated", "Dyskinesis", ], } name_for_cid[3704] = "MyocardiumWallMorphologyFinding" cid_concepts[3704] = { "DCM": ["ScarredMyocardium", "ThinningMyocardium", "NormalMyocardium"], "SCT": ["VentricularAneurysm"], } name_for_cid[3705] = "ChamberSize" cid_concepts[3705] = { "SCT": [ "MarkedlyEnlargedCardiacChamber", "MildlyEnlargedCardiacChamber", "AbnormallySmallCardiacChamber", "ModeratelyEnlargedCardiacChamber", "NormalSizeCardiacChamber", ] } name_for_cid[3706] = "OverallContractility" cid_concepts[3706] = { "SCT": ["Hypokinesis", "Hyperkinesis", "Akinesis", "NormalWallContractility"] } name_for_cid[3707] = "VSDDescription" cid_concepts[3707] = {"SCT": ["NonRestrictive", "Membranous", "Restrictive", "None_"]} name_for_cid[3709] = "AorticRootDescription" cid_concepts[3709] = { "SCT": [ "EnlargedAorticRoot", "RupturedSinusOfValsalva", "PostStenoticDilation", "NormalAorticRoot", "AneurysmOfAorticRoot", "AnnularAbscessOfAorticRoot", ] } name_for_cid[3710] = "CoronaryDominance" cid_concepts[3710] = { "SCT": [ "BalancedCoronaryDominance", "LeftCoronaryDominance", "RightCoronaryDominance", ] } name_for_cid[3711] = "ValvularAbnormality" cid_concepts[3711] = { "DCM": ["HeartValveFlail"], "SCT": [ "Regurgitation", "CalcifiedHeartValve", "HeartValveStenosis", "ValvularEndocarditis", "ImmobileHeartValve", ], } name_for_cid[3712] = "VesselDescriptor" cid_concepts[3712] = { "SCT": [ "DiffuseDisease", "Calcified", "Stented", "Restenotic", "Tortuous", "Stenotic", "Culprit", "Bifurcation", "LuminalIrregularities", "Aneurysmal", "Thrombus", "MuscleBridge", "Ulcerated", "Ectatic", ] } name_for_cid[3713] = "TIMIFlowCharacteristic" cid_concepts[3713] = { "SCT": [ "_1PenetrationWithoutPerfusion", "_2PartialPerfusion", "_3CompletePerfusion", "_0NoPerfusion", ] } name_for_cid[3714] = "Thrombus" cid_concepts[3714] = { "SCT": ["PossibleThrombus", "SevereThrombus", "NoThrombus", "DefiniteThrombus"] } name_for_cid[3715] = "LesionMargin" cid_concepts[3715] = { "SCT": ["Smooth", "MultipleIrregularities", "Ulcerative", "Irregular"] } name_for_cid[3716] = "Severity" cid_concepts[3716] = { "SCT": [ "Moderate", "Mild", "MildToModerate", "ModerateToSevere", "None_", "Fatal", "Severe", ] } name_for_cid[3717] = "LeftVentricleMyocardialWall17SegmentModel" cid_concepts[3717] = { "SCT": [ "LeftVentricleMidAnteriorSegment", "LeftVentricleBasalAnteroseptalSegment", "LeftVentricleBasalInferolateralSegment", "LeftVentricleBasalInferoseptalSegment", "LeftVentricleMidInferiorSegment", "LeftVentricleApicalInferiorSegment", "LeftVentricleApicalLateralSegment", "LeftVentricleApicalAnteriorSegment", "ApexOfLeftVentricle", "LeftVentricleBasalAnteriorSegment", "LeftVentricleApicalSeptalSegment", "LeftVentricleBasalAnterolateralSegment", "LeftVentricleBasalInferiorSegment", "LeftVentricleMidInferolateralSegment", "LeftVentricleMidAnterolateralSegment", "LeftVentricleMidInferoseptalSegment", "LeftVentricleMidAnteroseptalSegment", ] } name_for_cid[3718] = "MyocardialWallSegmentsinProjection" cid_concepts[3718] = { "SCT": [ "MyocardiumOfPosterolateralRegion", "MyocardiumOfApexOfHeart", "MyocardiumOfInferolateralRegion", "LeftVentricleBasalAnteriorSegment", "LeftVentricleApicalSeptalSegment", "MyocardiumOfDiaphragmaticRegion", "LeftVentricleBasalInferiorSegment", "MyocardiumOfAnterolateralRegion", ] } name_for_cid[3719] = "CanadianClinicalClassification" cid_concepts[3719] = { "SCT": [ "AnginaClassII", "AnginaClassI", "AnginaClassIV", "AnginaClassIII", "ChestPainNotPresent", ] } name_for_cid[3721] = "CardiovascularSurgery" cid_concepts[3721] = { "SCT": [ "CorrectionOfCongenitalCardiovascularDeformity", "CoronaryArteryBypassGraft", "OperationOnHeartValve", "HeartTransplant", "ImplantationOfCardiacPacemaker", "AbdominalAorticAneurysmStenting", "PercutaneousCoronaryIntervention", "ImplantationOfAutomaticCardiacDefibrillator", "AblationOperationForArrhythmia", ] } name_for_cid[3722] = "DiabeticTherapy" cid_concepts[3722] = { "SCT": [ "DiabeticOnOralTreatment", "DiabeticOnInsulin", "DiabeticOnDietaryTreatment", ] } name_for_cid[3723] = "MIType" cid_concepts[3723] = { "SCT": ["NonSTElevationMyocardialInfarction", "STElevationMyocardialInfarction"] } name_for_cid[3724] = "SmokingHistory" cid_concepts[3724] = {"SCT": ["CurrentSmoker", "NoHistoryOfSmoking", "FormerSmoker"]} name_for_cid[3726] = "CoronaryInterventionIndication" cid_concepts[3726] = { "DCM": ["CoronaryLesionGreaterThanEquals50PercentStenosis"], "SCT": ["CardiogenicShock"], } name_for_cid[3727] = "CatheterizationIndication" cid_concepts[3727] = { "SCT": [ "Cardiomyopathy", "HeartDisease", "ValvularHeartDisease", "CardiogenicShock", "ConductionDisorderOfTheHeart", "IschemicHeartDisease", "HeartTransplant", "CardiacFunctionTestAbnormal", "HeartDiseaseCongenital", ] } name_for_cid[3728] = "CathFinding" cid_concepts[3728] = { "SCT": [ "AcuteMitralRegurgitationFromChordalRupture", "NormalLeftVentricularSystolicFunctionAndWallMotion", "MildIntimalCoronaryIrregularitiesNoSignificantStenoses", "NormalRightHeartHemodynamics", "MultiVesselCoronaryArteryDisease", "SignificantCoronaryBypassGraftDisease", "PericardialTamponade", "MitralRegurgitation", "PulmonaryHypertension", "MitralStenosis", "SingleVesselCoronaryArteryDisease", "AtrialSeptalDefect", "AcuteMitralRegurgitationFromPapillaryMuscleDysfunction", "AcuteVentricularSeptalRupture", "TripleVesselCoronaryArteryDisease", "MitralValveProlapse", "HeartDiseaseCongenital", "NormalLeftHeartHemodynamics", "AorticInsufficiency", "NormalCoronaryArteries", "DepressionOfLeftVentricularSystolicFunction", "DoubleVesselCoronaryArteryDisease", "AcuteMitralRegurgitationFromChordalDysfunction", "HypertensiveHeartDisease", "CongestiveCardiomyopathy", "VentricularSeptalDefect", "NormalLeftAndRightHeartHemodynamics", "LeftMainCoronaryArteryDisease", "RestrictiveCardiomyopathy", "HypertrophicCardiomyopathyWithObstruction", "HypertrophicCardiomyopathyWithoutObstruction", "AcuteMitralRegurgitationFromPapillaryMuscleRupture", "AorticStenosis", "ConstrictivePericarditis", ] } name_for_cid[3729] = "AdmissionStatus" cid_concepts[3729] = { "SCT": ["HospitalAdmissionElective", "EmergencyDepartment", "Transfer"] } name_for_cid[3730] = "InsurancePayor" cid_concepts[3730] = {} name_for_cid[3733] = "PrimaryCauseofDeath" cid_concepts[3733] = {} name_for_cid[3735] = "AcuteCoronarySyndromeTimePeriod" cid_concepts[3735] = {} name_for_cid[3736] = "NYHAClassification" cid_concepts[3736] = { "SCT": ["NYHAClassII", "NYHAClassIII", "NYHAClassI", "NYHAClassIV"] } name_for_cid[3737] = "IschemiaNoninvasiveTest" cid_concepts[3737] = {} name_for_cid[3738] = "PreCathAnginaType" cid_concepts[3738] = {} name_for_cid[3739] = "CathProcedureType" cid_concepts[3739] = { "DCM": ["PercutaneousCoronaryIntervention"], "SCT": [ "CatheterizationOfBothLeftAndRightHeartWithGraft", "CatheterizationOfLeftHeart", "CatheterizationOfBothLeftAndRightHeartWithoutGraft", "CatheterizationOfRightHeart", ], } name_for_cid[3740] = "ThrombolyticAdministration" cid_concepts[3740] = { "SCT": [ "ThrombolyticAgentContraindicated", "AdministeredLessThan3HoursBeforePCI", "AdministeredBetween3And6HoursBeforePCI", "AdministeredBetween6HoursAnd7DaysBeforePCI", ] } name_for_cid[3741] = "LabVisitMedicationAdministration" cid_concepts[3741] = { "SCT": [ "Contraindicated", "AdministeredAfterLabVisit", "AdministeredBeforeLabVisit", "AdministeredDuringLabVisit", ] } name_for_cid[3742] = "PCIMedicationAdministration" cid_concepts[3742] = { "SCT": [ "Contraindicated", "AdministeredAfterPercutaneousCoronaryIntervention", "AdministeredDuringPercutaneousCoronaryIntervention", "NotAdministered", "AdministeredPriorToPercutaneousCoronaryIntervention", ] } name_for_cid[3743] = "Clopidogrel/TiclopidineAdministration" cid_concepts[3743] = { "SCT": [ "Contraindicated", "AdministeredAfterPercutaneousCoronaryIntervention", "NotAdministered", "AdministeredLessThan72HoursBeforePCI", ] } name_for_cid[3744] = "EFTestingMethod" cid_concepts[3744] = { "SCT": [ "CardiacVentriculography", "RadionuclideVentriculography", "Echocardiography", ] } name_for_cid[3745] = "CalculationMethod" cid_concepts[3745] = {"SCT": ["Estimated", "Calculated"]} name_for_cid[3746] = "PercutaneousEntrySite" cid_concepts[3746] = { "SCT": [ "ViaFemoralVein", "ViaFemoralArtery", "ViaArtery", "ViaBrachialArtery", "ViaArmVein", "ViaRadialArtery", "ViaVein", ] } name_for_cid[3747] = "PercutaneousClosure" cid_concepts[3747] = {} name_for_cid[3748] = "AngiographicEFTestingMethod" cid_concepts[3748] = {"DCM": ["BiPlaneAngiography", "SinglePlaneAngiography"]} name_for_cid[3749] = "PCIProcedureResult" cid_concepts[3749] = {} name_for_cid[3750] = "PreviouslyDilatedLesion" cid_concepts[3750] = {} name_for_cid[3752] = "GuidewireCrossing" cid_concepts[3752] = { "DCM": ["GuidewireCrossingLesionSuccessful", "GuidewireCrossingLesionUnsuccessful"] } name_for_cid[3754] = "VascularComplication" cid_concepts[3754] = { "SCT": [ "LossOfDistalPulse", "Pseudoaneurysm", "AVFistula", "ArterialDissection", "OcclusionOfArtery", "Bleeding", ] } name_for_cid[3755] = "CathComplication" cid_concepts[3755] = { "SCT": [ "EmergencyPercutaneousCoronaryIntervention", "CardiogenicShock", "ConductionDisorderOfTheHeart", "ContrastMediaAdverseReaction", "CongestiveHeartFailure", "CerebrovascularAccidentOrStroke", "CardiacTamponade", "EmergencyCoronaryArteryBypass", "RenalFailure", "CardiacArrest", ] } name_for_cid[3756] = "CardiacPatientRiskFactor" cid_concepts[3756] = { "SCT": [ "ConductionDisorderOfTheHeart", "HistoryOfHypertension", "HistoryOfDiabetes", "HistoryOfCongestiveHeartFailure", "PeripheralVascularDisease", "InsulinDependentMotherIDM", "HIVPositive", "HistoryOfChronicLungDisease", "HistoryOfHypercholesterolemia", "HistoryOfRenalFailure", "HistoryOfCerebrovascularDisease", "HistoryOfMyocardialInfarction", ], "UMLS": ["InfantOfMotherWithGestationalDiabetes"], } name_for_cid[3757] = "CardiacDiagnosticProcedure" cid_concepts[3757] = { "SCT": [ "CardiacCT", "ExerciseStressEchocardiography", "SPECT", "TransthoracicEchocardiography", "PETHeartStudy", "CardiacCTForCalciumScoring", "CardiacCathCoronaryAngiogramAndLeftVentriculogram", "PharmacologicalStressTest", "CardiacBloodPoolImaging", "StressTestUsingCardiacPacing", "CardiacCatheterization", "RadionuclideMyocardialPerfusionStudy", "PharmacologicAndExerciseStressTest", "CardiacCatheterizationCoronaryAngiogram", "PerfusionImaging", "CTAngiographyOfCoronaryArteries", "CardiacMRIStress", "ExerciseToleranceTest", "RadionuclideAngiocardiography", "NuclearMedicineCardiovascularStudy", "MagneticResonanceAngiography", "TransesophagealEchocardiography", "CardiacMRI", "Echocardiography", ] } name_for_cid[3758] = "CardiovascularFamilyHistory" cid_concepts[3758] = { "SCT": [ "NoFamilyHistoryOfCardiovascularDisease", "FamilyHistoryOfDiabetesMellitus", "FamilyHistoryOfCoronaryArteriosclerosis", "NoFamilyHistoryOfDiabetes", "FamilyHistoryUnknown", "FamilyHistoryOfCardiovascularDisease", "FamilyHistoryOfMyocardialInfarction", ] } name_for_cid[3760] = "HypertensionTherapy" cid_concepts[3760] = { "SCT": [ "BetaBlockerContainingProduct", "DiureticAgent", "NitrateVasodilator", "AngiotensinIIReceptorAntagonist", "ACEInhibitor", "CalciumChannelBlockerContainingProduct", ] } name_for_cid[3761] = "AntilipemicAgent" cid_concepts[3761] = { "NCIt": ["Fibrate"], "SCT": ["FishOils", "Statins", "AnionExchangeResin", "BileAcidSequestrant"], } name_for_cid[3762] = "AntiarrhythmicAgent" cid_concepts[3762] = { "SCT": [ "ClassIIIAntiarrhythmicAgent", "ClassIIAntiarrhythmicAgent", "ClassIVAntiarrhythmicAgent", "ClassIAntiarrhythmicAgent", ] } name_for_cid[3764] = "MyocardialInfarctionTherapy" cid_concepts[3764] = { "SCT": [ "InsertionOfCoronaryArteryStent", "ThrombolyticTherapy", "CoronaryArteryBypassGraft", "PercutaneousCoronaryIntervention", ] } name_for_cid[3769] = "ConcernType" cid_concepts[3769] = { "SCT": [ "Problem", "Complaint", "FindingReportedByPatientInformant", "Disease", "FunctionalPerformanceAndActivity", "Finding", ] } name_for_cid[3770] = "ProblemStatus" cid_concepts[3770] = { "SCT": [ "Suspected", "ActiveProblem", "InactiveProblem", "KnownAbsent", "Recurrent", "WellControlled", "Chronic", "Intermittent", "ProblemResolved", ] } name_for_cid[3772] = "HealthStatus" cid_concepts[3772] = { "SCT": [ "LostToFollowUp", "Disabled", "Deceased", "SymptomFree", "Alive", "ChronicallyIll", "AliveAndWell", "InRemission", "SeverelyDisabled", "SeverelyIll", ] } name_for_cid[3773] = "UseStatus" cid_concepts[3773] = {"SCT": ["Suspended", "Ended", "InProgress"]} name_for_cid[3774] = "SocialHistory" cid_concepts[3774] = { "SCT": [ "Nutrition", "TobaccoSmokingBehavior", "Exercise", "AlcoholConsumption", "DrugMisuseBehavior", ] } name_for_cid[3777] = "ImplantedDevice" cid_concepts[3777] = { "SCT": [ "ImplantableDefibrillator", "CardiacPacemaker", "LeftVentricularAssistDevice", "InsulinPump", ] } name_for_cid[3778] = "Stage" cid_concepts[3778] = { "SCT": ["Stage1", "Stage5", "Stage0", "Stage4", "Stage2", "Stage3"] } name_for_cid[3781] = "LeftVentricleMyocardialWall18SegmentModel" cid_concepts[3781] = { "DCM": [ "LeftVentricleApicalAnterolateralSegment", "LeftVentricleApicalInferolateralSegment", "LeftVentricleApicalInferoseptalSegment", "LeftVentricleApicalAnteroseptalSegment", ], "SCT": [ "LeftVentricleMidAnteriorSegment", "LeftVentricleBasalAnteroseptalSegment", "LeftVentricleBasalInferolateralSegment", "LeftVentricleBasalInferoseptalSegment", "LeftVentricleMidInferiorSegment", "LeftVentricleApicalInferiorSegment", "LeftVentricleApicalAnteriorSegment", "LeftVentricleBasalAnteriorSegment", "LeftVentricleBasalAnterolateralSegment", "LeftVentricleBasalInferiorSegment", "LeftVentricleMidInferolateralSegment", "LeftVentricleMidAnterolateralSegment", "LeftVentricleMidInferoseptalSegment", "LeftVentricleMidAnteroseptalSegment", ], } name_for_cid[3782] = "LeftVentricleBasalWall6Segments" cid_concepts[3782] = { "SCT": [ "LeftVentricleBasalAnteroseptalSegment", "LeftVentricleBasalInferolateralSegment", "LeftVentricleBasalInferoseptalSegment", "LeftVentricleBasalAnteriorSegment", "LeftVentricleBasalAnterolateralSegment", "LeftVentricleBasalInferiorSegment", ] } name_for_cid[3783] = "LeftVentricleMidlevelWall6Segments" cid_concepts[3783] = { "SCT": [ "LeftVentricleMidAnteriorSegment", "LeftVentricleMidInferolateralSegment", "LeftVentricleMidAnterolateralSegment", "LeftVentricleMidInferiorSegment", "LeftVentricleMidInferoseptalSegment", "LeftVentricleMidAnteroseptalSegment", ] } name_for_cid[3784] = "LeftVentricleApicalWall4Segments" cid_concepts[3784] = { "SCT": [ "LeftVentricleApicalInferiorSegment", "LeftVentricleApicalLateralSegment", "LeftVentricleApicalAnteriorSegment", "LeftVentricleApicalSeptalSegment", ] } name_for_cid[3785] = "LeftVentricleApicalWall6Segments" cid_concepts[3785] = { "DCM": [ "LeftVentricleApicalAnterolateralSegment", "LeftVentricleApicalInferolateralSegment", "LeftVentricleApicalInferoseptalSegment", "LeftVentricleApicalAnteroseptalSegment", ], "SCT": ["LeftVentricleApicalInferiorSegment", "LeftVentricleApicalAnteriorSegment"], } name_for_cid[3802] = "PlaqueStructure" cid_concepts[3802] = { "SCT": [ "Mixed", "NonCalcified", "Hyperplasia", "Fibrous", "PathologicCalcification", "FattyDegeneration", ] } name_for_cid[3804] = "StenosisMeasurementMethod" cid_concepts[3804] = { "DCM": ["ECST", "NASCET", "AreaBasedMethod", "DiameterBasedMethod"] } name_for_cid[3805] = "StenosisType" cid_concepts[3805] = { "SCT": [ "Embolism", "Thrombosis", "Entrapment", "Fibrous", "Compression", "ArterioscleroticVascularDisease", "Vasculitis", "CysticAdventitialDisease", "RaynaudDisease", ] } name_for_cid[3806] = "StenosisShape" cid_concepts[3806] = {"SCT": ["Eccentric", "Concentric"]} name_for_cid[3807] = "VolumeMeasurementMethod" cid_concepts[3807] = { "DCM": ["VolumeBasedMethod", "AreaBasedMethod", "DiameterBasedMethod"] } name_for_cid[3808] = "AneurysmType" cid_concepts[3808] = { "SCT": [ "SaccularAneurysm", "RupturedAneurysm", "TraumaticAneurysm", "DissectingAneurysm", "SerpentineAneurysm", "RacemoseAneurysm", "CalcifiedAneurysm", "MiliaryAneurysm", "MultipleAneurysm", "InflammatoryAbdominalAorticAneurysm", "CirsoidAneurysm", "FusiformAneurysm", "ThrombosedAneurysm", "ExpandingAneurysm", "CylindroidAneurysm", "VaricoseAneurysm", "MycoticAneurysm", "MixedAneurysm", ] } name_for_cid[3809] = "AssociatedCondition" cid_concepts[3809] = {"SCT": ["TraumaticAbnormality", "MarfanSyndrome"]} name_for_cid[3810] = "VascularMorphology" cid_concepts[3810] = { "SCT": [ "Embolism", "Pseudoaneurysm", "ArterialDissection", "Stenosis", "Plaque", "Tortuosity", "Dilatation", "VascularCoiling", "Angioma", "VascularSclerosis", "ArteriovenousFistula", "Diverticulum", "Thrombus", "FibromuscularDysplasia", "Aneurysm", "Occlusion", "Stent", ] } name_for_cid[3813] = "StentFinding" cid_concepts[3813] = { "DCM": ["StentFracture", "StentDisintegration", "Endoleak"], "SCT": ["Hypoplasia", "MigrationOfImplantOrInternalDevice", "Stenosis"], } name_for_cid[3814] = "StentComposition" cid_concepts[3814] = {"SCT": ["MetalStent", "PlasticStent"]} name_for_cid[3815] = "SourceofVascularFinding" cid_concepts[3815] = { "SCT": [ "Embolism", "AfterProcedure", "Trauma", "Hyperplasia", "Tumor", "ThromboticDisorder", "Surgical", "Vasculitis", ] } name_for_cid[3817] = "VascularSclerosisType" cid_concepts[3817] = { "SCT": [ "VascularWallDegeneration", "Arteriosclerosis", "Phlebosclerosis", "UlceratedAtheromatousPlaque", "ComplicatedAtheromatousPlaque", "AdventitialDegeneration", "ElasticVascularSclerosis", "Fibroelastosis", "Arteriolosclerosis", "AtheroscleroticFibrousPlaque", "Atheroma", "FocalFibroelastosis", "CysticMedicalNecrosis", "FattyStreaks", "CalcifiedAtheromatousPlaque", "ArteriosclerosisWithFibrinoidNecrosis", "DiffuseFibroelastosis", ] } name_for_cid[3820] = "NoninvasiveVascularProcedure" cid_concepts[3820] = { "SCT": [ "CTArteriographyOfAbdominalAortaWithContrast", "CardiovascularCT", "PeripheralAngiography", "CTOfAbdominalAorta", "CTOfAbdominalAortaWithoutContrast", "VascularMRI", "TrunkAngiography", "CardiacMRI", ] } name_for_cid[3821] = "PapillaryMuscleIncluded/Excluded" cid_concepts[3821] = {"DCM": ["PapillaryMuscleIncluded", "PapillaryMuscleExcluded"]} name_for_cid[3823] = "RespiratoryStatus" cid_concepts[3823] = { "DCM": ["CentralBreathingPosition"], "SCT": [ "ValsalvaManeuver", "Expiration", "ShallowBreathing", "Inspiration", "AutonomousBreathing", ], } name_for_cid[3826] = "HeartRhythm" cid_concepts[3826] = { "SCT": ["VentricularArrhythmia", "NormalSinusRhythm", "AtrialArrhythmia"] } name_for_cid[3827] = "VesselSegment" cid_concepts[3827] = { "BARI": [ "_1stMarginalCoronaryArteryLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", "_1stDiagonalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "_3rdDiagonalCoronaryArteryLaterals", ], "SCT": [ "ProfundaFemorisVein", "SubclavianVein", "ExternalIliacArtery", "ProximalRightCoronaryArtery", "CeliacAxis", "OvarianVein", "PosteriorCerebralArtery", "BasilarArtery", "DeepPalmarVenousArch", "LateralCalfPerforator", "MidCircumflexCoronaryArtery", "CentralRetinalVein", "IntermediateArteryRamus", "GastricArtery", "FourthLumbarArtery", "SmallestCardiacVein", "ThirdLumbarArtery", "UmbilicalArtery", "RadialArtery", "SolealVein", "LobarArtery", "ThighPerforator", "MidRightCoronaryArtery", "RightBranchOfHepaticArtery", "ExternalIliacVein", "SubclavianArtery", "CentralRetinalArtery", "_3rdLeftPosterolateralCoronaryArtery", "OphthalmicArtery", "SegmentalArtery", "BrachialVein", "LeftMainCoronaryArteryOstium", "SuperficialPalmarArch", "OvarianArtery", "PeronealArtery", "SuperficialFemoralVein", "LeftPosteriorDescendingCircumflexCoronaryArtery", "SuperiorLeftPulmonaryVein", "_1stMarginalCoronaryArtery", "SuperiorMesentericVein", "LumbarArtery", "PeronealVein", "MidLeftAnteriorDescendingCoronaryArtery", "AtrioventricularVein", "CoronaryArteryGraft", "InfraRenalAorta", "PulmonaryVeinGreatVessel", "CarotidBulb", "PoplitealVein", "GiacominiVein", "InternalCarotidArteryC5Segment", "DistalLeftAnteriorDescendingCoronaryArtery", "RightPulmonaryVein", "RightCoronaryArteryOstium", "MarginalCoronaryArtery", "HepaticVein", "ProximalLeftAnteriorDescendingCoronaryArtery", "ExternalCarotidArtery", "SuperiorMesentericArtery", "PosteriorTibialArtery", "GreatSaphenousVeinOfThigh", "PosterolateralBranchOfRightCoronaryArtery", "LeftHepaticVein", "InnominateVein", "SuperficialFemoralArtery", "ProximalCircumflexCoronaryArtery", "_2ndMarginalCoronaryArtery", "PosteriorCommunicatingArtery", "LeftBranchOfHepaticArtery", "ArcuateArteryOfTheKidney", "AbdominalAorta", "RightHepaticVein", "GastrocnemiusVein", "CephalicVein", "GastricVein", "LeftMainCoronaryArtery", "LeftMainBranchOfPortalVein", "InferiorRightHepaticVein", "VentricularVein", "CarotidSiphon", "PlantarArterialArch", "AnteriorPosteriorCerebralArteryBifurcation", "AtrialVein", "_1stDiagonalCoronaryArtery", "AnteriorCardiacVein", "InterlobularArteryOfKidney", "LesserSaphenousVein", "InferiorMesentericArtery", "DigitalArteryOfHand", "GreatSaphenousVein", "SecondLumbarArtery", "_1stRightPosterolateralCoronaryArtery", "InternalCarotidArtery", "RightPosteriorAVCoronaryArtery", "UlnarVein", "SuperiorRightPulmonaryVein", "InferiorVenaCava", "ProperHepaticArtery", "InterlobarArteryOfKidney", "AnteriorMiddleCerebralArteryBifurcation", "PerforatingArteryOfKidney", "InternalCarotidArteryC6Segment", "DistalRightCoronaryArtery", "AnteriorTibialArtery", "LeftAnteriorDescendingCoronaryArtery", "CommonCarotidArtery", "GreatSaphenousVeinOfCalf", "LeftPulmonaryVein", "_3rdMarginalCoronaryArtery", "CommonIliacArteryBifurcation", "MiddleHepaticVein", "RightMainBranchOfPortalVein", "RadialVein", "InferiorRightPulmonaryVein", "LeftPosterolateralCircumflexCoronaryArtery", "CommonHepaticArtery", "UterineArtery", "FirstLumbarArtery", "PoplitealArtery", "MiddleCerebralArteryM1Segment", "InternalIliacArtery", "SuperiorVenaCava", "UlnarArtery", "SixthLumbarArtery", "PosteriorArchVein", "SplenicVein", "CarotidBifurcation", "SaphenousVein", "_2ndRightPosterolateralCoronaryArtery", "SplenicArtery", "InnominateArtery", "RenalArtery", "GastroduodenalArtery", "AccessoryRenalArtery", "AzygosVein", "BrachialArtery", "_2ndDiagonalCoronaryArtery", "DistalCircumflexCoronaryArtery", "DorsalisPedisArtery", "CommonFemoralArtery", "SmallCardiacVein", "SuperficialPalmarVenousArch", "CommonFemoralVein", "_1stLeftPosterolateralCoronaryArtery", "CircumflexCoronaryArtery", "InferiorMesentericVein", "AnteriorCommunicatingArtery", "MedianCubitalVein", "CoronarySinus", "HilarArtery", "TerminalInternalCarotidArtery", "LeftCoronaryArtery", "AxillaryArtery", "VertebralArtery", "_3rdDiagonalCoronaryArtery", "TransjugularIntrahepaticPortosystemicShunt", "SaphenofemoralJunction", "SupraRenalAorta", "InternalJugularVein", "CockettPerforatingVein", "AVGrooveContinuationOfCircumflexArtery", "UmbilicalVein", "CommonIliacVein", "PosteriorCerebralArteryP1Segment", "TesticularArtery", "_3rdRightPosterolateralCoronaryArtery", "GreatCardiacVein", "PortalVein", "InferiorLeftPulmonaryVein", "AnteriorCerebralArtery", "RenalVein", "InternalIliacVein", "BoydPerforatingVein", "IlealVein", "CommonIliacArtery", "MiddleCardiacVein", "_2ndLeftPosterolateralCoronaryArtery", "MiddleCerebralArteryM2Segment", "MiddleCerebralArtery", "PosteriorCerebralArteryP2Segment", "PosteriorDescendingRightCoronaryArtery", "TesticularVein", "AnteriorTibialVein", "PosteriorTibialVein", "SaphenopoplitealJunction", "BasilicVein", "_1stSeptalCoronaryArtery", "RightCoronaryArtery", "HunterianPerforatingVein", "DeepPalmarArchOfRadialArtery", "ProfundaFemorisArtery", "FifthLumbarArtery", "AxillaryVein", ], } name_for_cid[3829] = "PulmonaryArtery" cid_concepts[3829] = { "SCT": [ "TrunkOfPulmonaryArtery", "PulmonaryValveSinuses", "RightPulmonaryArtery", "SuprapulmonicValveArea", "LeftPulmonaryArtery", ] } name_for_cid[3831] = "StenosisLength" cid_concepts[3831] = {"SCT": ["Long", "Short"]} name_for_cid[3832] = "StenosisGrade" cid_concepts[3832] = {"SCT": ["Moderate", "Mild", "Severe"]} name_for_cid[3833] = "CardiacEjectionFraction" cid_concepts[3833] = { "LN": [ "LeftVentricularEjectionFractionByCT", "RightVentricularEjectionFractionByMR", "LeftVentricularEjectionFractionByMR", "RightVentricularEjectionFractionByCT", ] } name_for_cid[3835] = "CardiacVolumeMeasurement" cid_concepts[3835] = { "DCM": ["LeftAtrialEDVolume", "LeftAtrialESVolume"], "LN": [ "RightVentricularESVolume", "LeftVentricularESVolume", "RightVentricularEDVolume", "LeftVentricularEDVolume", ], "SCT": ["StrokeVolume"], } name_for_cid[3836] = "TimebasedPerfusionMeasurement" cid_concepts[3836] = { "DCM": [ "SignalTimeToPeak", "SignalIncreaseStartTime", "SignalEarliestPeakTime", "SignalBaselineStart", "SignalBaselineEnd", ] } name_for_cid[3837] = "FiducialFeature" cid_concepts[3837] = { "SCT": ["CommonIliacBifurcation", "RenalArtery", "Ostium", "AorticBifurcation"] } name_for_cid[3838] = "DiameterDerivation" cid_concepts[3838] = { "DCM": ["AnteriorPosterior"], "SCT": ["Minimum", "Maximum", "Mean", "Transverse"], } name_for_cid[3839] = "CoronaryVein" cid_concepts[3839] = { "SCT": [ "GreatCardiacVein", "AnteriorCardiacVein", "VentricularVein", "AtrioventricularVein", "SmallCardiacVein", "SmallestCardiacVein", "MiddleCardiacVein", "CoronarySinus", "AtrialVein", "AzygosVein", ] } name_for_cid[3840] = "PulmonaryVein" cid_concepts[3840] = { "SCT": [ "PulmonaryVeinGreatVessel", "SuperiorLeftPulmonaryVein", "InferiorLeftPulmonaryVein", "RightPulmonaryVein", "InferiorRightPulmonaryVein", "LeftPulmonaryVein", "SuperiorRightPulmonaryVein", ] } name_for_cid[3843] = "MyocardialSubsegment" cid_concepts[3843] = {"SCT": ["Endocardial", "Epicardial"]} name_for_cid[3850] = "ContrastBolusSubstance" cid_concepts[3850] = { "MSH": ["LactatedRingerS"], "RADLEX": ["NonIonicIodinatedContrastAgent", "IonicIodinatedContrastAgent"], "RXNORM": ["MangafodipirTrisodium"], "SCT": [ "Iophendylate", "Iodipamide", "Bunamiodyl", "GadobenateDimeglumine", "Gadodiamide", "Gadofosveset", "Iohexol", "SodiumAcetrizoate", "Propyliodone", "ContrastAgent", "GadoterateMeglumine", "Iothalamate", "MeglumineDiatrizoate", "Gadobutrol", "Diatrizoate", "NonRadiopaqueMedium", "ChloriodizedOil", "Air", "Iopamidol", "Iopromide", "IopanoicAcid", "Metrizoate", "SodiumIodomethamate", "MeglumineIodipamide", "GadopentetateDimeglumine", "Ioxilan", "Ioversol", "Iodixanol", "Metrizamide", "Ipodate", "BariumSulfate", "Oxygen", "SodiumTyropanoate", "Water", "Saline", "IodoalphionicAcid", "Iodopyracet", "SodiumDiprotrizoate", "Iodophthalein", "GadoxetateDisodium", "Gadoversetamide", "IodamideMeglumine", "SodiumIodipamide", "Gadoteridol", "IophenoxicAcid", "Dextran", "Ioxaglate", "IodizedOil", "CarbonDioxide", "GadoliniumContainingProduct", ], } name_for_cid[4005] = "PartialViewSectionforMammography" cid_concepts[4005] = { "SCT": [ "Central", "Posterior", "Lateral", "Inferior", "Anterior", "Superior", "Medial", ] } name_for_cid[4009] = "DXAnatomyImaged" cid_concepts[4009] = { "SCT": [ "BoneOfLowerLimb", "Ureter", "Sacrum", "SmallIntestine", "ParanasalSinus", "InternalAuditoryCanal", "WristJoint", "Phantom", "Humerus", "Ilium", "JawRegion", "Calcaneus", "NasalBone", "Esophagus", "Mandible", "OpticCanal", "MastoidBone", "NeckChestAbdomenAndPelvis", "Thigh", "Pelvis", "ChestAndAbdomen", "Trachea", "UpperLimb", "AnkleJoint", "Maxilla", "Mediastinum", "SacroCoccygealSpine", "PancreaticDuct", "Hand", "UpperUrinaryTract", "Bronchus", "SesamoidBonesOfFoot", "CommonBileDuct", "Eye", "Prostate", "ElbowJoint", "FacialBones", "Colon", "Sternum", "SubmandibularGland", "ThoracicSpine", "NeckAndChest", "Duodenum", "Gallbladder", "BileDuct", "HipJoint", "UpperArm", "Extremity", "AbdomenAndPelvis", "Chest", "PancreaticDuctAndBileDuctSystems", "Larynx", "CervicoThoracicSpine", "Skull", "Urethra", "Hip", "Rib", "BoneOfUpperLimb", "Head", "AcromioclavicularJoint", "PelvisAndLowerExtremities", "Clavicle", "ParotidGland", "SternoclavicularJoint", "ThoracoLumbarSpine", "Breast", "EsophagusStomachAndDuodenum", "Neck", "Finger", "Stomach", "Coccyx", "HeadAndNeck", "TemporomandibularJoint", "BiliaryTract", "ApexOfLung", "Ileum", "Bladder", "Knee", "LargeIntestine", "Forearm", "EyeRegion", "Spine", "Foot", "NeckChestAndAbdomen", "SacroiliacJoint", "Anus", "MuscleOfUpperLimb", "EntireBody", "Thumb", "LumbarSpine", "Zygoma", "Abdomen", "SellaTurcica", "UterusAndFallopianTubes", "LowerLimb", "LowerLeg", "VertebralColumnAndCranium", "Jejunum", "ChestAbdomenAndPelvis", "Heart", "TarsalJoint", "Toe", "Shoulder", "Fibula", "OrbitalStructure", "MuscleOfLowerLimb", "LiverAndBiliaryStructure", "Femur", "Rectum", "Pancreas", "Scapula", "Patella", "LumboSacralSpine", "CervicalSpine", ] } name_for_cid[4010] = "DXView" cid_concepts[4010] = { "SCT": [ "RightPosteriorOblique", "ObliqueCaudoCranial", "PosteroAnteriorOblique", "AxialProjection", "Sagittal", "Tangential", "CranioCaudal", "LateroMedialOblique", "Acanthioparietal", "Orbitoparietal", "OcclusalProjection", "ObliqueCranioCaudal", "Plantodorsal", "LeftAnteriorOblique", "LateralOblique", "RightOblique", "MedioLateralObliqueProjection", "RightLateral", "CaudoCranial", "Verticosubmental", "TissueSpecimen", "Frontal", "LeftLateral", "Parietoacanthial", "PosteroAnterior", "RightAnteriorOblique", "Submentovertical", "AnteroPosteriorOblique", "LateralMedial", "LeftOblique", "Dorsoplantar", "ParietoOrbital", "ObliqueProjection", "MedialOblique", "FrontalObliqueAxial", "SagittalObliqueAxial", "AnteroPosterior", "MedioLateralProjection", "FrontalOblique", "ObliqueAxial", "LateralProjection", "LeftPosteriorOblique", ] } name_for_cid[4011] = "DXViewModifier" cid_concepts[4011] = { "DCM": ["Crosstable"], "SCT": [ "Transoral", "Transforamenal", "Caudad", "Cephalad", "Transthoracic", "Transorbital", "MouthClosed", ], } name_for_cid[4012] = "ProjectionEponymousName" cid_concepts[4012] = { "SCT": [ "KempHarper", "Holmblad", "Swanson", "Lawrence", "Fuchs", "LaquerrierePierquin", "MorticeProjection", "Teufel", "May", "Ottonello", "AlbersSchonberg", "LowBeer", "Cleaves", "DaneliusMiller", "Kasabach", "Stryker", "BrewertonProjection", "Arcelin", "Causton", "GaynorHart", "Henschen", "Pearson", "ColcherSussman", "Stecher", "ChassardLapine", "Valdini", "Hough", "Twining", "Zanelli", "Cahoon", "Chamberlain", "Tarrant", "Rafert", "Towne", "Rosenberg", "Kovacs", "Waters", "Kuchendorf", "Friedman", "Chausse", "Garth", "BlackettHealy", "Fleischner", "WolfProjection", "Kurzbauer", "Lysholm", "Kandel", "HarrisBeathAxialProjection", "Kite", "Miller", "Hsieh", "Stenvers", "Dunlap", "Clements", "Caldwell", "Apple", "Burman", "Fisk", "Grashey", "Haas", "Merchant", "RafertLong", "JudetProjection", "Ferguson", "Lewis", "Broden", "Schuller", "Titterington", "Pawlow", "Nolke", "Norgaard", "Taylor", "Grandy", "Hickey", "Moore", "Neer", "Law", "LeonardGeorge", "Pirie", "Folio", "Holly", "Beclere", "Rhese", "WigbyTaylor", "Hughston", "ErasoModification", "Bertel", "Lorenz", "ClementsNakayama", "Judd", "Lauenstein", "Settegast", "Mayer", "Staunig", "CampCoventry", "Isherwood", "Penner", "VanRosenProjection", "WestPoint", "Alexander", "HirtzModification", "Lilienfeld", "Robert", "Lindblom", ] } name_for_cid[4013] = "AnatomicRegionforMammography" cid_concepts[4013] = {"SCT": ["Breast"]} name_for_cid[4014] = "ViewforMammography" cid_concepts[4014] = { "SCT": [ "SuperolateralToInferomedialOblique", "TissueSpecimenFromBreast", "MedioLateralProjection", "CranioCaudalExaggeratedLaterally", "MedioLateralObliqueProjection", "LateroMedial", "LateroMedialOblique", "CranioCaudal", "InferomedialToSuperolateralOblique", "CaudoCranial", "CranioCaudalExaggeratedMedially", ] } name_for_cid[4015] = "ViewModifierforMammography" cid_concepts[4015] = { "SCT": [ "RolledMedial", "NippleInProfile", "AxillaryTissue", "AnteriorCompression", "RolledSuperior", "SpotCompression", "Tangential", "AxillaryTail", "Magnification", "ImplantDisplaced", "Cleavage", "InfraMammaryFold", "RolledLateral", "RolledInferior", ] } name_for_cid[4016] = "AnatomicRegionforIntraoralRadiography" cid_concepts[4016] = { "SCT": ["TeethGumsAndSupportingStructures", "Mandible", "JawRegion", "Maxilla"] } name_for_cid[4017] = "AnatomicRegionModifierforIntraoralRadiography" cid_concepts[4017] = { "SCT": [ "FirstMolarRegion", "FirstPremolarRegion", "ThirdMolarRegion", "LateralIncisorRegion", "SecondMolarRegion", "SecondPremolarRegion", "CanineRegion", "CentralIncisorRegion", ] } name_for_cid[ 4018 ] = "PrimaryAnatomicStructureforIntraoralRadiography(PermanentDentitionDesignationofTeeth)" cid_concepts[4018] = { "SCT": [ "PermanentMaxillaryLeftFirstPremolarTooth", "PermanentMaxillaryRightSecondMolarTooth", "PermanentMaxillaryRightLateralIncisorTooth", "MandibularLeftSecondPremolarTooth", "PermanentMaxillaryLeftCanineTooth", "PermanentMaxillaryLeftThirdMolarTooth", "MandibularRightCentralIncisorTooth", "PermanentMaxillaryLeftSecondPremolarTooth", "PermanentMaxillaryLeftFirstMolarTooth", "PermanentMaxillaryRightSecondPremolarTooth", "MandibularLeftLateralTooth", "MandibularLeftSecondMolarTooth", "MandibularRightSecondPremolarTooth", "PermanentMaxillaryRightFirstMolarTooth", "MandibularLeftFirstMolarTooth", "MandibularLeftFirstPremolarTooth", "PermanentMaxillaryRightCentralIncisorTooth", "MandibularRightFirstPremolarTooth", "MandibularRightCanineTooth", "PermanentMaxillaryLeftCentralIncisorTooth", "MandibularRightLateralIncisorTooth", "PermanentMaxillaryRightThirdMolarTooth", "MandibularLeftThirdMolarTooth", "PermanentMaxillaryRightFirstPremolarTooth", "PermanentMaxillaryRightCanineTooth", "PermanentMaxillaryLeftSecondMolarTooth", "MandibularLeftCentralIncisorTooth", "MandibularRightFirstMolarTooth", "PermanentMaxillaryLeftLateralIncisorTooth", "MandibularLeftCanineTooth", "MandibularRightSecondMolarTooth", "MandibularRightThirdMolarTooth", ] } name_for_cid[ 4019 ] = "PrimaryAnatomicStructureforIntraoralRadiography(DeciduousDentitionDesignationofTeeth)" cid_concepts[4019] = { "SCT": [ "DeciduousMandibularRightLateralIncisorTooth", "DeciduousMandibularLeftSecondMolarTooth", "DeciduousMandibularRightSecondMolarTooth", "DeciduousMaxillaryRightCentralIncisorTooth", "DeciduousMaxillaryLeftCentralIncisorTooth", "DeciduousMaxillaryLeftSecondMolarTooth", "DeciduousMaxillaryLeftFirstMolarTooth", "DeciduousMandibularLeftCanineTooth", "DeciduousMaxillaryRightSecondMolarTooth", "DeciduousMandibularRightCanineTooth", "DeciduousMandibularLeftFirstMolarTooth", "DeciduousMaxillaryRightCanineTooth", "DeciduousMandibularRightCentralIncisorTooth", "DeciduousMaxillaryRightLateralIncisorTooth", "DeciduousMaxillaryRightFirstMolarTooth", "DeciduousMaxillaryLeftLateralIncisorTooth", "DeciduousMandibularLeftLateralIncisorTooth", "DeciduousMandibularLeftCentralIncisorTooth", "DeciduousMandibularRightFirstMolarTooth", "DeciduousMaxillaryLeftCanineTooth", ] } name_for_cid[4020] = "PETRadionuclide" cid_concepts[4020] = { "DCM": [ "_51Manganese", "_70Arsenic", "_90Niobium", "_43Scandium", "_152Terbium", "_52mManganese", "_44Scandium", ], "SCT": [ "_22Sodium", "_73Selenium", "_60Copper", "_14Oxygen", "_66Gallium", "_76Bromine", "_45Titanium", "_68Germanium", "_89Zirconium", "_15Oxygen", "_82Rubidium", "_11Carbon", "_62Copper", "_68Gallium", "_75Bromine", "_18Fluorine", "_62Zinc", "_64Copper", "_77Bromine", "_94mTechnetium", "_90Yttrium", "_124Iodine", "_38Potassium", "_86Yttrium", "_61Copper", "_52Iron", "_52Manganese", "_72Arsenic", "_13Nitrogen", ], } name_for_cid[4021] = "PETRadiopharmaceutical" cid_concepts[4021] = { "DCM": [ "Cetuximab89Zr", "RO532344189Zr", "J59189Zr", "RO54290889Zr", "Cu3689Zr", "RO695894818F", "Bevacizumab89Zr", "PSMA1007F18", "Cg250FAb289Zr", "PSMA617Ga68", "R150789Zr", "E4G1089Zr", "_7E1189Zr", "_7D1289Zr", "_28H189Zr", "MonoclonalAntibody64Cu", "MonoclonalAntibody89Zr", "NanocolloidalAlbumin89Zr", "AntiB22089Zr", "Trastuzumab89Zr", "T807F18", "FlubatineF18", "CmabU3689Zr", "DN3089Zr", "Fresolimumab89Zr", "TRC10589Zr", "Margetuximab89Zr", "SAR341989Zr", "PittsburghCompoundBC11", "Ranibizumab89Zr", "Roledumab89Zr", "Xmab557489Zr", "Brentuximab89Zr", "Panitumumab89Zr", "Rituximab89Zr", "Mogamulizumab89Zr", "Ublituximab89Zr", "MEDI55189Zr", "GA20189Zr", "Ecromeximab89Zr", "Benralizumab89Zr", "Ocaratuzumab89Zr", "GlembatumumabVedotin89Zr", "PinatuzumabVedotin89Zr", "PolatuzumabVedotin89Zr", "Blinatumomab89Zr", "Pegdinetanib89Zr", "AGN15099889Zr", "RO693164311C", "Obinituzimab89Zr", "RO692496311C", "GlutamineF18", "_2FAF18", "NifeneF18", "CLR1404I124", "CLR1404I131", "FlurpiridazF18", "GlutamineC14", "GlutamineC11", "ATSMCu60", "ATSMCu61", "ATSMCu62", "CholineC11", "FallyprideC11", "FallyprideF18", "FLB457C11", "FluorotrioprideF18", "DPA71418F", "DfFK89Zr", "DfFKPEG389Zr", "DfFK289Zr", "DfCD4589Zr", "DfFK23PEG489Zr", "DPA71311C", ], "NCIt": ["PiflufolastatF18", "SarcosineC11", "DCFBCF18", "PSMA11Ga68"], "SCT": [ "MespiperoneC11", "RacloprideC11", "FluciclatideF18", "EDTAGa68", "GermaniumGe68", "CarbonMonoxideO15", "CarbonMonoxideC11", "FluorobenzothiazoleF18", "FluoroLDopaF18", "FluoromethaneF18", "SodiumFluorideF18", "FlorbetabenF18", "GlutamateN13", "FluoroestradiolF18", "FlumazenilF18", "MethionineC11", "FluorodeoxyglucoseF18", "FlutemetamolF18", "OxygenO15", "MonoclonalAntibodyI124", "SodiumIodideI124", "FlortaucipirF18", "AcetateC11", "FluorocholineF18", "FluorethyltyrosinF18", "CarbonDioxideO15", "FlorbetapirF18", "ThymidineF18", "FluoromisonidazoleF18", "ButanolO15", "CarfentanilC11", "OxygenWaterO15", "ATSMCu64", "SodiumNa22", "FluciclovineF18", "SpiperoneF18", "PalmitateC11", "AmmoniaN13", "FlumazenilC11", "PTSMCu62", "DotatateGa68", "FluorouracilF18", "RubidiumChlorideRb82", ], "UMLS": [ "MK6240F18", "ISO1F18", "PK1119511C", "FluoropropylDihydrotetrabenazineF18", "FluoroetanidazoleF18", "THK5317F18", "UCBJC11", "EdotreotideGa68", "THK5351F18", ], } name_for_cid[ 4025 ] = "PrimaryAnatomicStructureforIntraoralRadiography(SupernumeraryDentitionDesignationofTeeth)" cid_concepts[4025] = { "SCT": [ "SupernumeraryPermanentMandibularLeftFirstMolarTooth", "SupernumeraryDeciduousMandibularLeftSecondMolarTooth", "SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth", "SupernumeraryPermanentMaxillaryLeftSecondMolarTooth", "SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth", "SupernumeraryPermanentMandibularRightFirstPremolarTooth", "SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth", "SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth", "SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth", "SupernumeraryPermanentMandibularLeftLateralIncisorTooth", "SupernumeraryDeciduousMandibularRightLateralIncisorTooth", "SupernumeraryDeciduousMandibularRightCentralIncisorTooth", "SupernumeraryPermanentMandibularRightSecondPremolarTooth", "SupernumeraryDeciduousMandibularLeftLateralIncisorTooth", "SupernumeraryPermanentMaxillaryRightCentralIncisorTooth", "SupernumeraryPermanentMandibularRightFirstMolarTooth", "SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth", "SupernumeraryDeciduousMandibularRightFirstMolarTooth", "SupernumeraryDeciduousMaxillaryLeftCanineTooth", "SupernumeraryPermanentMandibularLeftFirstPremolarTooth", "SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth", "SupernumeraryDeciduousMandibularLeftCentralIncisorTooth", "SupernumeraryDeciduousMaxillaryRightFirstMolarTooth", "SupernumeraryPermanentMandibularLeftCentralIncisorTooth", "SupernumeraryPermanentMandibularRightCentralIncisorTooth", "SupernumeraryDeciduousMaxillaryRightCanineTooth", "SupernumeraryPermanentMaxillaryLeftThirdMolarTooth", "SupernumeraryPermanentMaxillaryLeftCanineTooth", "SupernumeraryPermanentMandibularLeftThirdMolarTooth", "SupernumeraryPermanentMaxillaryRightCanineTooth", "SupernumeraryDeciduousMandibularLeftFirstMolarTooth", "SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth", "SupernumeraryPermanentMandibularRightThirdMolarTooth", "SupernumeraryPermanentMandibularLeftSecondMolarTooth", "SupernumeraryDeciduousMandibularRightCanineTooth", "SupernumeraryPermanentMaxillaryRightFirstPremolarTooth", "SupernumeraryPermanentMaxillaryRightSecondPremolarTooth", "SupernumeraryPermanentMandibularRightLateralIncisorTooth", "SupernumeraryPermanentMaxillaryRightFirstMolarTooth", "SupernumeraryDeciduousMandibularRightSecondMolarTooth", "SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth", "SupernumeraryPermanentMandibularRightSecondMolarTooth", "SupernumeraryPermanentMaxillaryRightLateralIncisorTooth", "SupernumeraryPermanentMaxillaryRightSecondMolarTooth", "SupernumeraryPermanentMandibularLeftCanineTooth", "SupernumeraryPermanentMandibularRightCanineTooth", "SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth", "SupernumeraryPermanentMandibularLeftSecondPremolarTooth", "SupernumeraryDeciduousMaxillaryRightSecondMolarTooth", "SupernumeraryPermanentMaxillaryRightThirdMolarTooth", "SupernumeraryPermanentMaxillaryLeftFirstMolarTooth", "SupernumeraryDeciduousMandibularLeftCanineTooth", ] } name_for_cid[ 4026 ] = "PrimaryAnatomicStructureforIntraoralandCraniofacialRadiographyTeeth" cid_concepts[4026] = { "SCT": [ "DeciduousMandibularRightLateralIncisorTooth", "SupernumeraryPermanentMandibularLeftFirstMolarTooth", "PermanentMaxillaryLeftSecondPremolarTooth", "DeciduousMandibularRightCanineTooth", "SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth", "SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth", "SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth", "PermanentMaxillaryRightFirstMolarTooth", "DeciduousMaxillaryRightFirstMolarTooth", "MandibularRightCanineTooth", "SupernumeraryDeciduousMandibularRightLateralIncisorTooth", "DeciduousMandibularLeftLateralIncisorTooth", "SupernumeraryDeciduousMandibularRightCentralIncisorTooth", "SupernumeraryPermanentMandibularRightSecondPremolarTooth", "PermanentMaxillaryRightFirstPremolarTooth", "SupernumeraryPermanentMandibularRightFirstMolarTooth", "DeciduousMaxillaryLeftCentralIncisorTooth", "SupernumeraryDeciduousMaxillaryLeftCanineTooth", "DeciduousMaxillaryRightCanineTooth", "SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth", "SupernumeraryDeciduousMandibularLeftCentralIncisorTooth", "SupernumeraryPermanentMandibularRightCentralIncisorTooth", "SupernumeraryDeciduousMaxillaryRightCanineTooth", "SupernumeraryPermanentMaxillaryLeftThirdMolarTooth", "MandibularLeftCanineTooth", "MandibularRightSecondMolarTooth", "SupernumeraryPermanentMandibularRightThirdMolarTooth", "PermanentMaxillaryRightLateralIncisorTooth", "SupernumeraryPermanentMandibularLeftSecondMolarTooth", "DeciduousMandibularRightSecondMolarTooth", "PermanentMaxillaryLeftCanineTooth", "SupernumeraryPermanentMaxillaryRightFirstPremolarTooth", "MandibularRightCentralIncisorTooth", "SupernumeraryPermanentMandibularRightLateralIncisorTooth", "MandibularLeftFirstPremolarTooth", "MandibularRightFirstPremolarTooth", "DeciduousMaxillaryLeftLateralIncisorTooth", "PermanentMaxillaryLeftCentralIncisorTooth", "DeciduousMandibularLeftCentralIncisorTooth", "SupernumeraryPermanentMaxillaryRightLateralIncisorTooth", "PermanentMaxillaryLeftSecondMolarTooth", "SupernumeraryPermanentMandibularLeftCanineTooth", "DeciduousMandibularLeftFirstMolarTooth", "DeciduousMandibularRightCentralIncisorTooth", "SupernumeraryPermanentMandibularLeftSecondPremolarTooth", "SupernumeraryDeciduousMaxillaryRightSecondMolarTooth", "MandibularRightFirstMolarTooth", "SupernumeraryDeciduousMandibularLeftCanineTooth", "DeciduousMandibularRightFirstMolarTooth", "SupernumeraryDeciduousMandibularLeftSecondMolarTooth", "SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth", "DeciduousMaxillaryRightCentralIncisorTooth", "DeciduousMaxillaryLeftSecondMolarTooth", "SupernumeraryPermanentMaxillaryLeftSecondMolarTooth", "PermanentMaxillaryRightSecondPremolarTooth", "SupernumeraryPermanentMandibularRightFirstPremolarTooth", "MandibularLeftSecondMolarTooth", "MandibularLeftFirstMolarTooth", "DeciduousMaxillaryRightLateralIncisorTooth", "SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth", "SupernumeraryPermanentMandibularLeftLateralIncisorTooth", "MandibularRightLateralIncisorTooth", "SupernumeraryDeciduousMandibularLeftLateralIncisorTooth", "MandibularLeftThirdMolarTooth", "SupernumeraryPermanentMaxillaryRightCentralIncisorTooth", "SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth", "SupernumeraryDeciduousMandibularRightFirstMolarTooth", "DeciduousMaxillaryLeftFirstMolarTooth", "SupernumeraryPermanentMandibularLeftFirstPremolarTooth", "SupernumeraryDeciduousMaxillaryRightFirstMolarTooth", "SupernumeraryPermanentMandibularLeftCentralIncisorTooth", "PermanentMaxillaryLeftLateralIncisorTooth", "SupernumeraryPermanentMaxillaryLeftCanineTooth", "SupernumeraryPermanentMandibularLeftThirdMolarTooth", "SupernumeraryPermanentMaxillaryRightCanineTooth", "PermanentMaxillaryLeftFirstPremolarTooth", "SupernumeraryDeciduousMandibularLeftFirstMolarTooth", "SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth", "PermanentMaxillaryRightSecondMolarTooth", "DeciduousMandibularLeftSecondMolarTooth", "MandibularLeftSecondPremolarTooth", "SupernumeraryDeciduousMandibularRightCanineTooth", "PermanentMaxillaryLeftThirdMolarTooth", "SupernumeraryPermanentMaxillaryRightSecondPremolarTooth", "PermanentMaxillaryLeftFirstMolarTooth", "MandibularLeftLateralTooth", "MandibularRightSecondPremolarTooth", "SupernumeraryPermanentMaxillaryRightFirstMolarTooth", "PermanentMaxillaryRightCentralIncisorTooth", "SupernumeraryDeciduousMandibularRightSecondMolarTooth", "SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth", "PermanentMaxillaryRightThirdMolarTooth", "SupernumeraryPermanentMandibularRightSecondMolarTooth", "PermanentMaxillaryRightCanineTooth", "SupernumeraryPermanentMaxillaryRightSecondMolarTooth", "DeciduousMandibularLeftCanineTooth", "SupernumeraryPermanentMandibularRightCanineTooth", "DeciduousMaxillaryRightSecondMolarTooth", "SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth", "MandibularLeftCentralIncisorTooth", "SupernumeraryPermanentMaxillaryRightThirdMolarTooth", "SupernumeraryPermanentMaxillaryLeftFirstMolarTooth", "MandibularRightThirdMolarTooth", "DeciduousMaxillaryLeftCanineTooth", ] } name_for_cid[4028] = "CraniofacialAnatomicRegion" cid_concepts[4028] = { "SCT": [ "TemporalBone", "VomerBone", "HyoidBone", "ParanasalSinus", "SoftPalate", "MiddleEar", "InternalAuditoryCanal", "Neck", "MuscleOfHead", "VertebralColumnAndCranium", "Lip", "Tongue", "InnerEar", "ExternalEar", "FacialBones", "HeadAndNeck", "SubmandibularGland", "JawRegion", "TemporomandibularJoint", "NasalBone", "OrbitalStructure", "SalivaryGland", "OccipitalBone", "Tooth", "LacrimalBone", "BoneStructureOfHeadAndOrNeck", "Mandible", "Eyeball", "EyeRegion", "Larynx", "OpticCanal", "MastoidBone", "Skull", "FrontalBone", "SphenoidBone", "EthmoidBone", "Head", "PalatineBone", "Trachea", "MuscleOfNeck", "ParietalBone", "Maxilla", "CervicalSpine", "Zygoma", ] } name_for_cid[4029] = "DermatologyAnatomicSite" cid_concepts[4029] = { "DCM": [ "SkinOfParaspinalAreaOfTheNeck", "SkinOfLowerParaspinalRegion", "SkinOfMidParaspinalRegion", "SkinOfUpperParaspinalRegion", "SkinOfParaspinalAreaOfTheSuperiorBack", "SkinOfInferiorPosteriorSurfaceOfThePinna", "SkinOfInferiorHelixOfEar", "SkinOfCaruncleOfEye", "SkinOfAnteriorHelixOfEar", "SkinOfLateralPartOfDorsumOfFoot", "SkinOfLowerEyelidMargin", "SkinOfLowerAntihelixOfEar", "SkinOfPosteriorHelixOfEar", "SkinOfParanasalCheek", "SkinOfMedialPartOfDorsumOfFoot", "SkinOfInfraalarGroove", "SkinOfSuperiorPosteriorHelixOfEar", "SkinOfSuperiorAntihelixOfEar", "SkinOfSoleOfForefoot", "SkinOfPosteriorLobuleOfTheEar", "SkinOfUpperEyelidMargin", "SkinOfUpperAntihelixOfEar", "SkinOfSuperiorPosteriorSurfaceOfThePinna", "SkinOfMidBack", ], "FMA": [ "SkinOfLowerOuterQuadrantOfBreast", "SkinOfUpperInnerQuadrantOfBreast", "SkinOfLowerInnerQuadrantOfBreast", "SkinOfDorsalPartOfFourthToe", "SkinOfDorsalPartOfFifthToe", "SkinOfUpperOuterQuadrantOfLeftBreast", "SkinOfVermilionProperOfLowerLip", "SkinOfDorsalPartOfGreatToe", "SkinOfDorsalPartOfSecondToe", "SkinOfDorsalPartOfThirdToe", "SkinOfVermilionProperOfUpperLip", "SkinOfBackOfTrunk", "MucosaOfOralSegmentOfHardPalate", "MucosaOfUvula", "MucosaOfPalatoglossalArch", "SkinOfPlantarPartOfThirdToe", "SkinOfPlantarPartOfFourthToe", "SkinOfPalmarPartOfLittleFinger", "SkinOfPlantarPartOfFifthToe", "SkinOfPlantarPartOfSecondToe", "SkinOfPalmarPartOfRingFinger", "SkinOfPalmarPartOfIndexFinger", "SkinOfPalmarPartOfMiddleFinger", "SkinOfPlantarPartOfGreatToe", "SkinOfPalmarPartOfThumb", "SkinOfDorsalPartOfLittleFinger", "MucosaOfPharynx", "SkinOfDorsalPartOfRingFinger", "MucosaOfDorsumOfPharyngealPartOfTongue", "MucosaOfDorsumOfOralPartOfTongue", "SkinOfDorsalPartOfIndexFinger", "SkinOfDorsalPartOfMiddleFinger", "SkinOfDorsalPartOfThumb", "SkinOfDorsumOfNose", "MucosaOfPosteriorWallOfOropharynx", ], "SCT": [ "MucosaOfFloorOfMouth", "SkinOfOccipitalRegion", "SkinOfSupraclavicularRegionOfNeck", "NailUnitOfFourthToe", "SkinOfAnteriorSurfaceOfLowerLeg", "SkinOfMedialCanthus", "FemaleExternalUrethralOrifice", "SkinOfAxilla", "SkinOfAnteriorSurfaceOfUpperArm", "SkinOfAnteriorSurfaceOfForearm", "NailUnitOfFinger", "SkinOfPosteriorSurfaceOfForearm", "SkinOfChin", "SkinOfTemporalRegion", "NailUnitOfIndexFinger", "SkinOfLowerEyelid", "MucosaOfMandibularGingiva", "SkinOfInguinalRegion", "SkinOfLabium", "SkinOfPerineum", "MaleExternalUrethralOrifice", "NailUnitOfThumb", "SkinOfUpperAbdomen", "SkinOfLowerLip", "Cornea", "Eyelash", "SkinOfEyeRegion", "SkinOfAntitragus", "SkinOfScalp", "SkinOfMedialSurfaceOfThigh", "SkinOfAreola", "SkinOfEarLobule", "SkinOfNuchalRegion", "SkinOfPrepuceOfClitoris", "SkinOfPosteriorSurfaceOfElbow", "SkinOfBack", "SkinOfPoplitealFossa", "VulvalVestibule", "SkinOfPosteriorSurfaceOfUpperArm", "SkinOfLateralPartOfHeel", "SkinOfUmbilicus", "FrenulumOfLabiaMinora", "NailUnitOfThirdToe", "SkinOfLateralCanthus", "SkinOfBackOfUpperThoracicRegion", "SkinOfSideOfNose", "SkinOfLowerChestWall", "SkinOfUpperExtremity", "SkinOfNasolabialFold", "SkinOfThenarRegionOfPalm", "SkinOfHeel", "SkinOfAntecubitalFossa", "SkinOfExternalGenitalia", "MucosaOfUpperLip", "SkinOfSubmentalArea", "SkinOfClitoris", "SkinOfPostauricularRegion", "SkinOfForehead", "MucosaOfMaxillaryGingiva", "SkinOfAnteriorSurfaceOfKnee", "SkinOfLip", "MucosaOfTipOfTongue", "SkinOfLowerBack", "SkinOfPhiltrum", "Sclera", "SkinOfTragus", "SkinOfFace", "SkinOfCavityOfConcha", "SkinOfEpigastricArea", "SkinOfPalmOfHand", "SkinOfTipOfNose", "NailUnitOfFifthToe", "SkinOfLateralAspectOfAnkle", "SkinOfCrusOfHelix", "VaginalIntroitus", "SkinOfAnteriorPortionOfNeck", "SkinOfLowerAbdomen", "SkinOfExternalAuditoryCanal", "SkinOfAnteriorSurfaceOfThigh", "SkinOfNeck", "SkinOfLateralPortionOfNeck", "SkinOfAbdomen", "SkinOfLabiumMinus", "Tooth", "SkinOfDigitOfHand", "SubmandibularTriangle", "SkinOfHead", "SkinOfLowerExtremity", "SkinOfMedialPartOfHeel", "SkinOfRootOfPenis", "SkinOfPartOfDorsalSurfaceOfHand", "SkinOfMedialAspectOfAnkle", "SkinOfGlutealFold", "SkinOfLabiumMajus", "SkinOfButtock", "SkinOfLateralBorderOfSoleOfFoot", "NailUnitOfLittleFinger", "SkinOfParietalRegion", "SkinOfEyebrow", "SkinOfHand", "SkinOfPosteriorSurfaceOfLowerLeg", "SkinOfAlaNasi", "PosteriorCommissureOfLabiumMajorum", "SkinOfUpperLip", "SkinOfPosteriorSurfaceOfThorax", "SkinOfToe", "SkinOfPosteriorSurfaceOfThigh", "SkinOfGlansPenis", "SkinOfNose", "SkinOfVertexOfScalp", "SkinOfPalmarAreaOfWrist", "SkinOfHelixOfEar", "NailUnitOfMiddleFinger", "SkinOfInfraclavicularRegion", "Iris", "SkinOfShaftOfPenis", "MucosaOfTongue", "SkinOfHypothenarRegionOfPalm", "SkinOfAnteriorSurfaceOfThorax", "OralMucosa", "GroinSkinCrease", "SkinOfAnteriorTrunk", "NailUnitOfGreatToe", "SkinOfUpperEyelid", "NailUnitOfToe", "SkinOfEar", "SkinOfPreauricularRegion", "NailUnitOfSecondToe", "SkinOfAnus", "SternalSkin", "Hair", "AnteriorTriangleOfNeck", "MucosaOfLowerLip", "Skin", "SkinOfNipple", "SkinOfPerioralRegionOfFace", "SkinOfCheek", "SkinOfJawline", "SkinOfFoot", "SkinOfIntertragalIncisure", "SkinOfDorsalAreaOfWrist", "NailUnitOfRingFinger", "SkinOfHypogastricRegion", "SkinOfScrotum", "SkinOfUpperTrunk", "Retina", "SkinOfPenis", "SkinOfMedialBorderOfSoleOfFoot", ], } name_for_cid[4030] = "CT,MRandPETAnatomyImaged" cid_concepts[4030] = { "SCT": [ "IliacAndOrFemoralArtery", "BoneOfLowerLimb", "Ureter", "Sacrum", "SmallIntestine", "ParanasalSinus", "InternalAuditoryCanal", "WristJoint", "Phantom", "Thymus", "CarotidArtery", "Humerus", "Ilium", "JawRegion", "Calcaneus", "NasalBone", "Esophagus", "Mandible", "OpticCanal", "MastoidBone", "NeckChestAbdomenAndPelvis", "Thigh", "Pelvis", "Spleen", "ChestAndAbdomen", "CoronaryArtery", "Trachea", "UpperLimb", "AnkleJoint", "Maxilla", "Cerebellum", "Mediastinum", "SacroCoccygealSpine", "PancreaticDuct", "Hand", "UpperUrinaryTract", "Bronchus", "SesamoidBonesOfFoot", "CommonBileDuct", "Eye", "Prostate", "ElbowJoint", "FacialBones", "Colon", "Sternum", "SubmandibularGland", "ThoracicSpine", "NeckAndChest", "Duodenum", "Gallbladder", "RenalArtery", "BileDuct", "HipJoint", "UpperArm", "Extremity", "AbdomenAndPelvis", "Chest", "PancreaticDuctAndBileDuctSystems", "Larynx", "PulmonaryArtery", "CervicoThoracicSpine", "Skull", "Liver", "Urethra", "Thyroid", "Hip", "Rib", "BoneOfUpperLimb", "Head", "AdrenalGland", "AcromioclavicularJoint", "PelvisAndLowerExtremities", "Clavicle", "ParotidGland", "SternoclavicularJoint", "ThoracoLumbarSpine", "Breast", "EsophagusStomachAndDuodenum", "Neck", "Finger", "CranialVenousSystem", "Stomach", "ThoracicAorta", "Coccyx", "HeadAndNeck", "Uterus", "TemporomandibularJoint", "BiliaryTract", "ApexOfLung", "Ileum", "Testis", "Bladder", "Knee", "LargeIntestine", "Forearm", "EyeRegion", "Spine", "Foot", "NeckChestAndAbdomen", "SacroiliacJoint", "Anus", "MuscleOfUpperLimb", "EntireBody", "Thumb", "LumbarSpine", "Zygoma", "Abdomen", "SellaTurcica", "UterusAndFallopianTubes", "LowerLimb", "LowerLeg", "AorticArch", "VertebralColumnAndCranium", "Jejunum", "ChestAbdomenAndPelvis", "AbdominalAorta", "Heart", "TarsalJoint", "Toe", "Shoulder", "Fibula", "OrbitalStructure", "CircleOfWillis", "Brain", "MuscleOfLowerLimb", "Parathyroid", "LiverAndBiliaryStructure", "Femur", "Rectum", "Pancreas", "Scapula", "Kidney", "Patella", "LumboSacralSpine", "CervicalSpine", ] } name_for_cid[4031] = "CommonAnatomicRegion" cid_concepts[4031] = { "SCT": [ "BoneOfLowerLimb", "Ureter", "Sacrum", "SmallIntestine", "ParanasalSinus", "InternalAuditoryCanal", "WristJoint", "Phantom", "Humerus", "Ilium", "JawRegion", "Calcaneus", "NasalBone", "Esophagus", "Mandible", "OpticCanal", "MastoidBone", "NeckChestAbdomenAndPelvis", "Thigh", "Pelvis", "ChestAndAbdomen", "Trachea", "UpperLimb", "AnkleJoint", "Maxilla", "Mediastinum", "SacroCoccygealSpine", "PancreaticDuct", "Hand", "UpperUrinaryTract", "Bronchus", "SesamoidBonesOfFoot", "CommonBileDuct", "Eye", "Prostate", "ElbowJoint", "FacialBones", "Colon", "Sternum", "SubmandibularGland", "ThoracicSpine", "NeckAndChest", "Duodenum", "Gallbladder", "BileDuct", "HipJoint", "UpperArm", "Extremity", "AbdomenAndPelvis", "Chest", "PancreaticDuctAndBileDuctSystems", "Larynx", "CervicoThoracicSpine", "Skull", "Urethra", "Hip", "Rib", "BoneOfUpperLimb", "Head", "AcromioclavicularJoint", "PelvisAndLowerExtremities", "Clavicle", "ParotidGland", "SternoclavicularJoint", "ThoracoLumbarSpine", "Breast", "EsophagusStomachAndDuodenum", "Neck", "Finger", "Stomach", "Coccyx", "HeadAndNeck", "TemporomandibularJoint", "BiliaryTract", "ApexOfLung", "Ileum", "Bladder", "Knee", "LargeIntestine", "Forearm", "EyeRegion", "Spine", "Foot", "NeckChestAndAbdomen", "SacroiliacJoint", "Anus", "MuscleOfUpperLimb", "EntireBody", "Thumb", "LumbarSpine", "Zygoma", "Abdomen", "SellaTurcica", "UterusAndFallopianTubes", "LowerLimb", "LowerLeg", "VertebralColumnAndCranium", "Jejunum", "ChestAbdomenAndPelvis", "Heart", "TarsalJoint", "Toe", "Shoulder", "Fibula", "OrbitalStructure", "MuscleOfLowerLimb", "LiverAndBiliaryStructure", "Femur", "Rectum", "Pancreas", "Scapula", "Patella", "LumboSacralSpine", "CervicalSpine", ] } name_for_cid[4032] = "MRSpectroscopyMetabolite" cid_concepts[4032] = { "DCM": [ "CreatineCholineCitrateRatio", "GlutamateAndGlutamine", "CholineCreatineRatio", "NAcetylaspartateCreatineRatio", "CreatineAndCholine", "NAcetylaspartateCholineRatio", "LipidAndLactate", ], "SCT": [ "Inositol", "Citrate", "Choline", "Creatine", "Lactate", "Glutamine", "NAcetylaspartate", "Lipid", "Tuarine", ], } name_for_cid[4033] = "MRProtonSpectroscopyMetabolite" cid_concepts[4033] = { "DCM": [ "CreatineCholineCitrateRatio", "GlutamateAndGlutamine", "CholineCreatineRatio", "NAcetylaspartateCreatineRatio", "CreatineAndCholine", "NAcetylaspartateCholineRatio", "LipidAndLactate", ], "SCT": [ "Inositol", "Citrate", "Choline", "Creatine", "Lactate", "Glutamine", "NAcetylaspartate", "Lipid", "Tuarine", ], } name_for_cid[4040] = "EndoscopyAnatomicRegion" cid_concepts[4040] = { "SCT": [ "Mediastinum", "Ureter", "UterusAndFallopianTubes", "ParanasalSinus", "PancreaticDuct", "EsophagusStomachAndDuodenum", "IntraPelvic", "UpperUrinaryTract", "Bronchus", "CommonBileDuct", "SigmoidColon", "PharynxAndLarynx", "Shoulder", "AnusRectumAndSigmoidColon", "LumenOfBloodVessel", "BiliaryTract", "TracheaAndBronchus", "Gallbladder", "Cervix", "Bladder", "Knee", "BileDuct", "Joint", "LargeIntestine", "PancreaticDuctAndBileDuctSystems", "Larynx", "Spine", "Rectum", "IntraThoracic", "Pharynx", "ExternalAuditoryCanal", "InguinalRegion", "Kidney", "Nasopharynx", "BladderAndUrethra", "IntraAbdominopelvic", ] } name_for_cid[4042] = "XA/XRFAnatomyImaged" cid_concepts[4042] = { "SCT": [ "SubclavianVein", "ExternalIliacArtery", "BoneOfLowerLimb", "TruncusCoeliacus", "BasilarArtery", "ParanasalSinus", "ApexOfRightVentricle", "WristJoint", "Phantom", "GenicularArtery", "LeftVentricleInflow", "CarotidArtery", "UmbilicalArtery", "PrimitiveAorta", "LeftVentricleOutflowTract", "RadialArtery", "RightFemoralArtery", "JawRegion", "LeftFemoralArtery", "Calcaneus", "Esophagus", "AntecubitalVein", "Mandible", "PatentDuctusArteriosus", "MesentericVein", "Pelvis", "PulmonaryVein", "CoronaryArtery", "UpperLimb", "ExternalIliacVein", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "SubclavianArtery", "Maxilla", "SacroCoccygealSpine", "OphthalmicArtery", "PancreaticDuct", "Hand", "BrachialVein", "Eye", "Prostate", "ElbowJoint", "HepaticArtery", "FacialBones", "Sternum", "PeronealArtery", "NeckAndChest", "RightVentricleOutflowTract", "Duodenum", "SuperiorLeftPulmonaryVein", "BileDuct", "SystemicCollateralArteryToLung", "AbdomenAndPelvis", "LumbarArtery", "PancreaticDuctAndBileDuctSystems", "ApexOfLeftVentricle", "Larynx", "FemoralArtery", "PulmonaryArtery", "IliacVein", "Skull", "Urethra", "Head", "AcromioclavicularJoint", "CongenitalCoronaryArteryFistulaToRightVentricle", "PosteriorMedialTributary", "SternoclavicularJoint", "ThoracoLumbarSpine", "Breast", "EsophagusStomachAndDuodenum", "Neck", "Finger", "PulmonaryArteryConduit", "RightAtrium", "RightVentricle", "CommonVentricle", "Coccyx", "HeadAndNeck", "TemporomandibularJoint", "HepaticVein", "InternalMammaryArtery", "Bladder", "LargeIntestine", "Forearm", "Spine", "Foot", "NeckChestAndAbdomen", "ExternalCarotidArtery", "SuperiorMesentericArtery", "MuscleOfUpperLimb", "PosteriorTibialArtery", "FemoralVein", "RightAuricularAppendage", "Zygoma", "InnominateVein", "Abdomen", "SuperficialFemoralArtery", "UterusAndFallopianTubes", "LowerLimb", "PosteriorCommunicationArtery", "JuxtaposedAtrialAppendage", "AorticArch", "VertebralColumnAndCranium", "Jejunum", "ChestAbdomenAndPelvis", "AbdominalAorta", "Heart", "TarsalJoint", "CephalicVein", "LingualArtery", "GastricVein", "CongenitalCoronaryArteryFistulaToRightAtrium", "Fibula", "OrbitalStructure", "InferiorCardiacVein", "Baffle", "LacrimalArtery", "OccipitalArtery", "SystemicVenousAtrium", "LiverAndBiliaryStructure", "AnomalousPulmonaryVein", "Femur", "Rectum", "AnteriorCardiacVein", "Pancreas", "LeftAtrium", "CerebralArtery", "Scapula", "InferiorMesentericArtery", "GreatSaphenousVein", "CervicalSpine", "InternalCarotidArtery", "Ureter", "Sacrum", "SmallIntestine", "InternalAuditoryCanal", "SuperiorRightPulmonaryVein", "InferiorVenaCava", "RightPulmonaryArtery", "VenousNetwork", "CommonAtrium", "Humerus", "Ilium", "AorticFistula", "SuperiorThyroidArtery", "IliacArtery", "NasalBone", "AnteriorTibialArtery", "TruncusArteriosusCommunis", "Artery", "CommonCarotidArtery", "OpticCanal", "Aorta", "SuperficialTemporalArtery", "MastoidBone", "Vein", "CongenitalCoronaryArteryFistulaToLeftVentricle", "NeckChestAbdomenAndPelvis", "Thigh", "ChestAndAbdomen", "InferiorRightPulmonaryVein", "Trachea", "BodyConduit", "AnkleJoint", "Mediastinum", "RightVentricleInflow", "MesentericArtery", "PoplitealArtery", "UpperUrinaryTract", "PulmonaryVenousAtrium", "Bronchus", "SesamoidBonesOfFoot", "InternalIliacArtery", "PulmonaryChamberOfCorTriatriatum", "CommonBileDuct", "SuperiorVenaCava", "UlnarArtery", "LeftVentricle", "AnteriorSpinalArtery", "SplenicVein", "Colon", "SubmandibularGland", "ThoracicSpine", "SaphenousVein", "Gallbladder", "InnominateArtery", "SplenicArtery", "RenalArtery", "HipJoint", "UpperArm", "Extremity", "Chest", "FacialArtery", "AzygosVein", "BrachialArtery", "CervicoThoracicSpine", "Hip", "Rib", "BoneOfUpperLimb", "PelvisAndLowerExtremities", "Clavicle", "ParotidGland", "CommonFemoralArtery", "Stomach", "AnteriorCommunicatingArtery", "CongenitalCoronaryArteryFistulaToLeftAtrium", "ThoracicAorta", "VenaCava", "CoronarySinus", "AxillaryArtery", "LeftPulmonaryArtery", "BiliaryTract", "ApexOfLung", "Ileum", "Knee", "VertebralArtery", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "InternalJugularVein", "EyeRegion", "LacrimalArteryOfRightEye", "SacroiliacJoint", "Anus", "UmbilicalVein", "EntireBody", "CommonIliacVein", "Thumb", "LumbarSpine", "GreatCardiacVein", "PrimitivePulmonaryArtery", "SellaTurcica", "PortalVein", "InferiorLeftPulmonaryVein", "LowerLeg", "RenalVein", "BoydPerforatingVein", "CommonIliacArtery", "Toe", "Shoulder", "LeftAuricularAppendage", "MuscleOfLowerLimb", "AscendingAorta", "HunterianPerforatingVein", "ProfundaFemorisArtery", "AxillaryVein", "Patella", "OccipitalVein", "LumboSacralSpine", "DoddPerforatingVein", ] } name_for_cid[4050] = "DrugorContrastAgentCharacteristic" cid_concepts[4050] = { "DCM": ["ContrastBolusIngredientOpaque", "ActiveIngredientUndilutedConcentration"], "SCT": ["ActiveIngredient", "Volume"], } name_for_cid[4051] = "GeneralDevice" cid_concepts[4051] = { "DCM": [ "ACRAccreditationPhantomCT", "ACRAccreditationPhantomMR", "ACRAccreditationPhantomMammography", "ACRAccreditationPhantomStereotacticBreastBiopsy", "ACRAccreditationPhantomECT", "_10cmDosimetryPhantom", "ACRAccreditationPhantomPET", "ACRAccreditationPhantomECTPET", "ACRAccreditationPhantomPETFaceplate", "IECHeadDosimetryPhantom", "IECBodyDosimetryPhantom", "NEMAXR212000Phantom", "Sphere", ], "SCT": [ "Glue", "AtherectomyDevice", "EmbolizationCoil", "EmbolizationParticulate", "Phantom", "Laser", "Catheter", "MeasuringRuler", "RotationalAtherectomyDevice", "GuidingCatheter", "EmbolizationBall", "PercutaneousTransluminalAngioplastyBalloon", "Syringe", "Stent", "DetachableBalloon", ], } name_for_cid[4052] = "PhantomDevice" cid_concepts[4052] = { "DCM": [ "IECHeadDosimetryPhantom", "IECBodyDosimetryPhantom", "NEMAXR212000Phantom", "ACRAccreditationPhantomCT", "ACRAccreditationPhantomMR", "ACRAccreditationPhantomMammography", "ACRAccreditationPhantomStereotacticBreastBiopsy", "ACRAccreditationPhantomECT", "_10cmDosimetryPhantom", "ACRAccreditationPhantomPET", "ACRAccreditationPhantomECTPET", "ACRAccreditationPhantomPETFaceplate", ], "SCT": ["Phantom"], } name_for_cid[4100] = "T1MeasurementMethod" cid_concepts[4100] = { "DCM": ["T1ByInversionRecovery", "T1ByFixedValue", "T1ByMultipleFlipAngles"] } name_for_cid[4101] = "TracerKineticModel" cid_concepts[4101] = { "DCM": [ "StandardToftsModel", "ExtendedToftsModel", "FirstPassLeakageProfileFPLPModel", "ShutterSpeedModelSSM", "GammaCapillaryTransitTimeGCTTModel", "AdiabaticTissueHomogeneityATHModel", "TwoCompartmentExchange2CXModel", ] } name_for_cid[4102] = "PerfusionMeasurementMethod" cid_concepts[4102] = { "DCM": [ "PerfusionAnalysisByStableXenonCTTechnique", "PerfusionAnalysisByIVIodinatedContrastCTTechnique", "PerfusionAnalysisByArterialSpinLabelingMRTechnique", "PerfusionAnalysisBySusceptibilityMRTechnique", ] } name_for_cid[4103] = "ArterialInputFunctionMeasurementMethod" cid_concepts[4103] = { "DCM": [ "UserDefinedAIFROI", "AutomaticallyDetectedAIFROI", "BlindEstimationOfAIF", "AIFIgnored", "PopulationAveragedAIF", ] } name_for_cid[4104] = "BolusArrivalTimeDerivationMethod" cid_concepts[4104] = { "DCM": [ "TemporalDerivativeExceedsThreshold", "TimeOfPeakConcentration", "TimeOfLeadingHalfPeakConcentration", ] } name_for_cid[4105] = "PerfusionAnalysisMethod" cid_concepts[4105] = { "DCM": [ "LeastMeanSquareLMSDeconvolution", "SingularValueDecompositionSVDDeconvolution", ] } name_for_cid[4106] = "QuantitativeMethodUsedforPerfusionandTracerKineticModel" cid_concepts[4106] = { "DCM": [ "T1ByInversionRecovery", "TemporalDerivativeExceedsThreshold", "T1ByFixedValue", "LeastMeanSquareLMSDeconvolution", "SingularValueDecompositionSVDDeconvolution", "TimeOfPeakConcentration", "T1ByMultipleFlipAngles", "TimeOfLeadingHalfPeakConcentration", "StandardToftsModel", "UserDefinedAIFROI", "ExtendedToftsModel", "AutomaticallyDetectedAIFROI", "ModelFreeConcentrationTimeQuantitification", "BlindEstimationOfAIF", "FirstPassLeakageProfileFPLPModel", "ShutterSpeedModelSSM", "PerfusionAnalysisByStableXenonCTTechnique", "GammaCapillaryTransitTimeGCTTModel", "PerfusionAnalysisByIVIodinatedContrastCTTechnique", "AdiabaticTissueHomogeneityATHModel", "PerfusionAnalysisByArterialSpinLabelingMRTechnique", "TwoCompartmentExchange2CXModel", "PerfusionAnalysisBySusceptibilityMRTechnique", "AIFIgnored", "PopulationAveragedAIF", ] } name_for_cid[4107] = "TracerKineticModelParameter" cid_concepts[4107] = {"DCM": ["TauM", "Vp", "Ktrans", "Kep", "Ve"]} name_for_cid[4108] = "PerfusionModelParameter" cid_concepts[4108] = { "DCM": [ "MeanTransitTime", "RelativeRegionalBloodFlow", "RelativeRegionalBloodVolume", "TimeToPeak", "AbsoluteRegionalBloodFlow", "AbsoluteRegionalBloodVolume", "OxygenExtractionFraction", "Tmax", ] } name_for_cid[4109] = "ModelIndependentDynamicContrastAnalysisParameter" cid_concepts[4109] = { "DCM": [ "TimeToPeak", "IAUC90BN", "IAUC180BN", "TemporalDerivativeThreshold", "IAUC", "MaximumSlope", "IAUC60", "MaximumDifference", "IAUC90", "TracerConcentration", "IAUC180", "IAUCBN", "IAUC60BN", "TimeOfPeakConcentration", "BolusArrivalTime", "TimeOfLeadingHalfPeakConcentration", ] } name_for_cid[4110] = "TracerKineticModelingCovariate" cid_concepts[4110] = {"LN": ["Hematocrit"]} name_for_cid[4111] = "ContrastCharacteristic" cid_concepts[4111] = {"DCM": ["ContrastLongitudinalRelaxivity"]} name_for_cid[4200] = "OphthalmicImagingAgent" cid_concepts[4200] = { "SCT": [ "IndocyanineGreen", "RoseBengalContainingProduct", "Fluorescein", "TrypanBlue", "MethylthioniniumChlorideContainingProduct", ] } name_for_cid[4201] = "PatientEyeMovementCommand" cid_concepts[4201] = { "SCT": [ "PrimaryGaze", "RightGaze", "ConvergentGaze", "LeftGaze", "LeftDowngaze", "LeftUpgaze", "RightDowngaze", "UpwardGaze", "RightUpgaze", "Downgaze", ] } name_for_cid[4202] = "OphthalmicPhotographyAcquisitionDevice" cid_concepts[4202] = { "SCT": [ "FundusCamera", "SlitLampBiomicroscope", "DirectOphthalmoscope", "OphthalmicEndoscope", "ScanningLaserOphthalmoscope", "Keratoscope", "ExternalCamera", "Pupillograph", "IndirectOphthalmoscope", "SpecularMicroscope", "OperatingMicroscope", ] } name_for_cid[4203] = "OphthalmicPhotographyIllumination" cid_concepts[4203] = { "DCM": [ "ScotopicLight", "MesopicLight", "PhotopicLight", "DynamicLight", "DiffuseDirectIllumination", ], "SCT": [ "BroadTangentialDirectIllumination", "DualDiffuseDirectIllumination", "IndirectRetroilluminationFromTheIris", "IndirectRetroilluminationFromTheRetina", "FineSlitBeamDirectIllumination", "IndirectScleroticScatterIllumination", "IndirectIrisTransillumination", ], } name_for_cid[4204] = "OphthalmicFilter" cid_concepts[4204] = { "DCM": ["NoFilter"], "SCT": [ "BlueOpticalFilter", "PolarizingOpticalFilter", "YellowGreenOpticalFilter", "GreenOpticalFilter", "BlueGreenOpticalFilter", "InfraredOpticalFilter", "RedOpticalFilter", ], } name_for_cid[4205] = "OphthalmicLens" cid_concepts[4205] = { "SCT": [ "IndirectOphthalmoscopyLens", "ContactFundusLens", "ConcaveNoncontactFundusLens", "ConcaveContactFundusLens", "Goniolens", "NoncontactFundusLens", "ConvexContactFundusLens", "ConvexNoncontactFundusLens", ] } name_for_cid[4206] = "OphthalmicChannelDescription" cid_concepts[4206] = { "SCT": [ "Infrared", "Ultraviolet", "Red", "FullSpectrum", "Blue", "RedFree", "Green", ] } name_for_cid[4207] = "OphthalmicImagePosition" cid_concepts[4207] = { "DCM": [ "LesionCentered", "DiscMaculaCentered", "MidPeripheralSuperior", "MidPeripheralSuperiorTemporal", "MidPeripheralTemporal", "MidPeripheralInferiorTemporal", "MidPeripheralInferior", "MidPeripheralInferiorNasal", "Field1ForJoslin3Field", "Field2ForJoslin3Field", "Field3ForJoslin3Field", "MaculaCentered", "DiscCentered", "PeripheralSuperiorTemporal", "PeripheralTemporal", "PeripheralInferiorTemporal", "PeripheralInferior", "PeripheralInferiorNasal", "PeripheralNasal", "PeripheralSuperiorNasal", "MidPeripheralNasal", "MidPeripheralSuperiorNasal", "PeripheralSuperior", ], "SCT": [ "DiabeticRetinopathyStudyField6", "DiabeticRetinopathyStudyField4", "DiabeticRetinopathyStudyField2", "DiabeticRetinopathyStudyField1", "DiabeticRetinopathyStudyField7", "DiabeticRetinopathyStudyField5", "DiabeticRetinopathyStudyField3", ], } name_for_cid[4208] = "MydriaticAgent" cid_concepts[4208] = { "SCT": [ "Tropicamide", "Homatropine", "Cyclopentolate", "AtropineInOcularDoseForm", "Phenylephrine", ] } name_for_cid[4209] = "OphthalmicAnatomicStructureImaged" cid_concepts[4209] = { "SCT": [ "BothEyes", "AnteriorChamberOfEye", "OphthalmicArtery", "LowerEyelid", "OpticNerveHead", "ChoroidOfEye", "Sclera", "Cornea", "Eyelid", "Lens", "Eye", "LacrimalSac", "Retina", "LacrimalCaruncle", "Iris", "UpperEyelid", "CiliaryBody", "Conjunctiva", "LacrimalGland", "FoveaCentralis", ] } name_for_cid[4210] = "OphthalmicTomographyAcquisitionDevice" cid_concepts[4210] = { "DCM": [ "ReflectionBasedCornealTopographer", "InterferometryBasedCornealTomographer", "ScheimpflugCamera", "ElevationBasedCornealTomographer", ], "SCT": [ "ScanningLaserPolarimeter", "OpticalCoherenceTomographyScanner", "RetinalThicknessAnalyzer", "ConfocalScanningLaserOphthalmoscope", ], } name_for_cid[4211] = "OphthalmicOCTAnatomicStructureImaged" cid_concepts[4211] = { "SCT": [ "AnteriorChamberOfEye", "CornealEndothelium", "Vitreous", "OpticNerveHead", "ChoroidOfEye", "Sclera", "Cornea", "Lens", "CornealEpithelium", "Retina", "Iris", "CiliaryBody", "Conjunctiva", ] } name_for_cid[4214] = "OphthalmicHorizontalDirection" cid_concepts[4214] = {"SCT": ["Inward", "Outward"]} name_for_cid[4215] = "OphthalmicVerticalDirection" cid_concepts[4215] = {"SCT": ["Up", "Down"]} name_for_cid[4216] = "OphthalmicVisualAcuityType" cid_concepts[4216] = { "DCM": [ "AutorefractionVisualAcuity", "HabitualVisualAcuity", "PrescriptionVisualAcuity", ], "SCT": [ "BestCorrectedVisualAcuity", "PinholeVisualAcuity", "BrightnessAcuityTestingVisualAcuity", "PotentialAcuityMeterVisualAcuity", "UncorrectedVisualAcuity", ], } name_for_cid[4220] = "VisualFixationQualityDuringAcquisition" cid_concepts[4220] = {"SCT": ["Steady", "Indeterminate", "NotSteady"]} name_for_cid[4221] = "VisualFixationQualityProblem" cid_concepts[4221] = { "DCM": ["EquipmentFailure", "OperatorError", "PatientMovement"], "SCT": ["EccentricFixation"], } name_for_cid[4222] = "OphthalmicMacularGridProblem" cid_concepts[4222] = { "DCM": [ "InterferingTearsOrDrops", "PatientPositioningProblem", "EquipmentFailure", "OperatorError", "PatientMovement", ], "SCT": [ "DryEyesProblem", "PoorVisualFixation", "EccentricFixation", "CornealOpacity", "EyelidDisease", "VitreousOpacity", "LensOpacity", "RefractiveError", "ConstrictedPupil", ], } name_for_cid[4230] = "OphthalmicUltrasoundAxialMeasurementsType" cid_concepts[4230] = {"DCM": ["UltrasoundContact", "UltrasoundImmersion"]} name_for_cid[4231] = "LensStatus" cid_concepts[4231] = { "SCT": [ "ArtificialLensPresent", "CrystallineLens", "PiggybackIOL", "Aphakic", "PhakicIOL", ] } name_for_cid[4232] = "VitreousStatus" cid_concepts[4232] = { "SCT": ["PostVitrectomy", "GasInVitreousCavity", "VitreousOnly", "SiliconeOil"] } name_for_cid[4233] = "OphthalmicAxialLengthMeasurementsSegmentName" cid_concepts[4233] = { "DCM": ["SingleOrAnteriorLens", "PosteriorLens"], "SCT": ["AnteriorChamber", "VitreousCavity", "Cornea"], } name_for_cid[4234] = "RefractiveSurgeryType" cid_concepts[4234] = {"DCM": ["SMILE"], "SCT": ["RK", "LASIK", "LASEK", "PRK"]} name_for_cid[4235] = "KeratometryDescriptor" cid_concepts[4235] = { "DCM": [ "ManualKeratometry", "AutoKeratometry", "SimulatedKeratometry", "EquivalentKReading", ] } name_for_cid[4236] = "IOLCalculationFormula" cid_concepts[4236] = { "DCM": [ "Haigis", "HaigisL", "HaigisToric", "Holladay1", "HaigisLToric", "Holladay2", "BarrettToric", "HofferQ", "BarrettTrueK", "Olsen", "BarrettTrueKToric", "SRKII", "BarrettUniversalII", "SRKT", ] } name_for_cid[4237] = "LensConstantType" cid_concepts[4237] = { "DCM": [ "HaigisA1", "HaigisA2", "HofferPacdConstant", "SurgeonFactor", "BarrettLensFactor", "ACDConstant", "BarrettDesignFactor", "HaigisA0", ], "SCT": ["AConstant"], } name_for_cid[4238] = "RefractiveErrorType" cid_concepts[4238] = {"SCT": ["Myopia", "Hyperopia"]} name_for_cid[4239] = "AnteriorChamberDepthDefinition" cid_concepts[4239] = { "DCM": ["FrontOfCorneaToFrontOfLens", "BackOfCorneaToFrontOfLens"] } name_for_cid[4240] = "OphthalmicMeasurementorCalculationDataSource" cid_concepts[4240] = { "DCM": [ "MeasurementFromThisDevice", "ExternalDataSource", "AxialMeasurementsSOPInstance", "RefractiveMeasurementsSOPInstance", "AutorefractionMeasurementsSOPInstance", "ManualEntry", "KeratometryMeasurementsSOPInstance", ] } name_for_cid[4241] = "OphthalmicAxialLengthSelectionMethod" cid_concepts[4241] = {"DCM": ["MeanValueChosen", "UserChosenValue"]} name_for_cid[4242] = "CorneaMeasurementMethodDescriptor" cid_concepts[4242] = { "DCM": [ "PosteriorCorneaSurfaceMeasurementMethod", "ManualKeratometry", "AutoKeratometry", "SimulatedKeratometry", "EquivalentKReading", "TotalCorneaPowerMeasurementMethod", ] } name_for_cid[4243] = "OphthalmicQualityMetricType" cid_concepts[4243] = { "DCM": ["StandardDeviationOfMeasurementsUsed", "SignalToNoiseRatio"] } name_for_cid[4244] = "OphthalmicAgentConcentrationUnit" cid_concepts[4244] = {"UCUM": ["Percent", "MilligramsPerMilliliter"]} name_for_cid[4245] = "WideFieldOphthalmicPhotographyTransformationMethod" cid_concepts[4245] = {"DCM": ["SphericalProjection", "SurfaceContourMapping"]} name_for_cid[4250] = "VisualFieldStaticPerimetryTestPattern" cid_concepts[4250] = { "DCM": [ "VisualField60To4TestPattern", "VisualFieldCentralTestPattern", "VisualFieldMaculaTestPattern", "VisualFieldCentral40PointTestPattern", "VisualFieldCentral76PointTestPattern", "VisualFieldPeripheral60PointTestPattern", "VisualFieldFullField81PointTestPattern", "VisualFieldFullField120PointTestPattern", "VisualFieldGTestPattern", "VisualField24To2TestPattern", "VisualFieldMTestPattern", "VisualField10To2TestPattern", "VisualField07TestPattern", "VisualField30To2TestPattern", "VisualFieldLVCTestPattern", ] } name_for_cid[4251] = "VisualFieldStaticPerimetryTestStrategy" cid_concepts[4251] = { "DCM": [ "VisualFieldTOPTestStrategy", "VisualFieldCLIPTestStrategy", "VisualFieldSITAStandardTestStrategy", "VisualFieldDynamicTestStrategy", "VisualFieldCLASSStrategy", "VisualFieldSITASWAPTestStrategy", "VisualFieldNormalTestStrategy", "VisualFieldSITAFastTestStrategy", "VisualField1LTTestStrategy", "VisualFieldFullThresholdTestStrategy", "VisualField2LTTestStrategy", "VisualFieldFastpacTestStrategy", "VisualFieldLVSTestStrategy", "VisualFieldFullFromPriorTestStrategy", "VisualFieldGATETestStrategy", "VisualFieldOptimaTestStrategy", "VisualFieldGateiTestStrategy", "VisualFieldTwoZoneTestStrategy", "VisualField2LTDynamicTestStrategy", "VisualFieldThreeZoneTestStrategy", "VisualField2LTNormalTestStrategy", "VisualFieldQuantifyDefectsTestStrategy", "VisualFieldFastThresholdTestStrategy", ] } name_for_cid[4252] = "VisualFieldStaticPerimetryScreeningTestMode" cid_concepts[4252] = { "DCM": [ "AgeCorrected", "ThresholdRelated", "UserChosenValue", "SingleLuminance", "FovealSensitivityRelated", "RelatedToNonMacularSensitivity", ] } name_for_cid[4253] = "VisualFieldStaticPerimetryFixationStrategy" cid_concepts[4253] = { "DCM": [ "AutomatedOptical", "BlindSpotMonitoring", "MacularFixationTesting", "ObservationByExaminer", ], "SCT": ["None_"], } name_for_cid[4254] = "VisualFieldStaticPerimetryTestAnalysisResult" cid_concepts[4254] = { "DCM": [ "OutsideNormalLimits", "Borderline", "AbnormallyHighSensitivity", "GeneralReductionInSensitivity", "BorderlineAndGeneralReductionInSensitivity", ], "SCT": ["WithinNormalLimits"], } name_for_cid[4255] = "VisualFieldIlluminationColor" cid_concepts[4255] = {"SCT": ["Yellow", "Red", "White", "Blue", "Green"]} name_for_cid[4256] = "VisualFieldProcedureModifier" cid_concepts[4256] = {"SCT": ["Diagnostic", "Screening"]} name_for_cid[4257] = "VisualFieldGlobalIndexName" cid_concepts[4257] = { "DCM": [ "VisualFieldIndex", "VisualFieldLossDueToDiffuseDefect", "VisualFieldLossDueToLocalDefect", "GlaucomaHemifieldTestAnalysis", "OpticalFixationMeasurements", ] } name_for_cid[4260] = "OphthalmicMappingUnitforRealWorldValueMapping" cid_concepts[4260] = {"UCUM": ["Micrometer"]} name_for_cid[4261] = "OphthalmicMappingAcquisitionMethod" cid_concepts[4261] = { "DCM": [ "RetinalTopography", "TimeDomain", "SpectralDomain", "NoCornealCompensation", "CornealBirefringenceCompensation", ] } name_for_cid[4262] = "RetinalThicknessDefinition" cid_concepts[4262] = { "DCM": [ "RetinalNerveFiberLayerThickness", "GanglionCellComplexThickness", "TotalRetinalThicknessILMToISOS", "TotalRetinalThicknessILMToRPE", "TotalRetinalThicknessILMToBM", ] } name_for_cid[4263] = "OphthalmicThicknessMapValueType" cid_concepts[4263] = { "DCM": [ "AbsoluteOphthalmicThickness", "ThicknessDeviationCategoryFromNormativeData", "ThicknessDeviationFromNormativeData", ] } name_for_cid[4264] = "OphthalmicMapPurposeofReference" cid_concepts[4264] = { "DCM": [ "Localizer", "SourceImageForImageProcessingOperation", "RelatedOphthalmicThicknessMap", ] } name_for_cid[4265] = "OphthalmicThicknessDeviationCategory" cid_concepts[4265] = { "DCM": [ "PGreaterThan5Percent", "PLesserThan5Percent", "PLesserThan2Percent", "PLesserThan1Percent", "PLesserThan0Point5Percent", ] } name_for_cid[4266] = "OphthalmicAnatomicStructureReferencePoint" cid_concepts[4266] = { "DCM": ["DiscFovea"], "SCT": [ "Lesion", "OpticNerveHead", "MorphologicallyAbnormalStructure", "Cornea", "FoveaCentralis", ], } name_for_cid[4267] = "CornealTopographyMappingUnitforRealWorldValueMapping" cid_concepts[4267] = {"UCUM": ["Millimeter", "Micrometer", "Diopters"]} name_for_cid[4268] = "CornealTopographyMapValueType" cid_concepts[4268] = { "DCM": [ "CornealAxialPowerMap", "CornealInstantaneousPowerMap", "CornealRefractivePowerMap", "CornealElevationMap", "CornealWavefrontMap", ] } name_for_cid[4270] = "OCTAProcessingAlgorithmFamily" cid_concepts[4270] = { "DCM": [ "OCTACorrelationMapping", "OCTASpeckleVariance", "DopplerOCTA", "OCTAOneSidedRatioGreater", "OCTAOneSidedRatioLesser", "OCTAComplexVariance", "OCTAAmplitudeDecorrelation", ] } name_for_cid[4271] = "EnFaceImageType" cid_concepts[4271] = { "DCM": [ "SuperficialRetinaStructuralReflectanceMap", "WholeEyeVasculatureFlow", "SuperficialRetinaVasculatureFlow", "ChoroidStructuralReflectanceMap", "RetinaDepthEncodedVasculatureFlow", "MiddleInnerStructuralReflectanceMap", "MiddleInnerRetinaVasculatureFlow", "WholeEyeStructuralReflectanceMap", "RetinaVasculatureFlow", "RetinaDepthEncodedStructuralReflectanceMap", "DeepRetinaVasculatureFlow", "RetinaStructuralReflectanceMap", "OuterRetinaVasculatureFlow", "DeepRetinaStructuralReflectanceMap", "VitreousStructuralReflectanceMap", "ChoriocapillarisVasculatureFlow", "VitreousVasculatureFlow", "OuterRetinaStructuralReflectanceMap", "RadialPeripapillaryStructuralReflectanceMap", "ChoroidVasculatureFlow", "RadialPeripapillaryVasculatureFlow", "ChoriocapillarisStructuralReflectanceMap", ] } name_for_cid[4272] = "OPTScanPatternType" cid_concepts[4272] = { "DCM": [ "GridBScanPattern", "CircleRadialBScanPattern", "CubeBScanPattern", "RasterBScanPattern", "RadialBScanPattern", "LineBScanPattern", "CircleBScanPattern", "CrossBScanPattern", "CircleRasterBScanPattern", "ConcentricCircleBScanPattern", ] } name_for_cid[4273] = "RetinalSegmentationSurface" cid_concepts[4273] = { "DCM": [ "PosteriorSurfaceOfTheRPE", "SurfaceOfTheCenterOfTheRPE", "SurfaceOfTheChoroidScleraInterface", "OuterSurfaceOfRNFL", "OuterSurfaceOfTheBM", "OuterSurfaceOfTheCC", "OuterSurfaceOfIPL", "OuterSurfaceOfGCL", "OuterSurfaceOfOPL", "OuterSurfaceOfINL", "SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors", "OuterSurfaceOfHFL", "AnteriorSurfaceOfTheRPE", "SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE", ], "SCT": ["ELMExternalLimitingMembrane", "ILMInternalLimitingMembrane"], } name_for_cid[4401] = "FitzpatrickSkinType" cid_concepts[4401] = { "LN": [ "FitzpatrickSkinTypeVI", "FitzpatrickSkinTypeII", "FitzpatrickSkinTypeIII", "FitzpatrickSkinTypeIV", "FitzpatrickSkinTypeV", "FitzpatrickSkinTypeI", ] } name_for_cid[4402] = "HistoryofMalignantMelanoma" cid_concepts[4402] = { "SCT": ["HistoryOfMalignantMelanomaOfTheSkin", "HistoryOfMalignantMelanoma"] } name_for_cid[4403] = "HistoryofMelanomainSitu" cid_concepts[4403] = {"SCT": ["HistoryOfMelanomaInSituOfTheSkin"]} name_for_cid[4404] = "HistoryofNonMelanomaSkinCancer" cid_concepts[4404] = { "SCT": [ "HistoryOfSquamousCellCarcinomaOfSkin", "HistoryOfMalignantBasalCellNeoplasmOfSkin", "HistoryOfMalignantNeoplasmOfSkinExcludingMelanoma", ] } name_for_cid[4405] = "SkinDisorder" cid_concepts[4405] = { "SCT": [ "AtypicalMoleSyndrome", "GorlinSyndrome", "LupusErythematosus", "Eczema", "SolarDegeneration", "TelangiectasiaCutaneousCancerSyndromeFamilial", "Psoriasis", "PTENHamartomaTumorSyndrome", "RomboSyndrome", "ActinicKeratosis", "Rosacea", "AtopicDermatitis", ] } name_for_cid[4406] = "PatientReportedLesionCharacteristic" cid_concepts[4406] = { "SCT": [ "Peeling", "BleedingSkin", "PainfulSkin", "SymptomHasChanged", "Itching", "Erythema", ] } name_for_cid[4407] = "LesionPalpationFinding" cid_concepts[4407] = { "DCM": ["RaisedSkinLesion", "FirmSkinLesion"], "UMLS": ["MobileSkinLesion"], } name_for_cid[4408] = "LesionVisualFinding" cid_concepts[4408] = {"SCT": ["BleedingSkin", "Erythema"]} name_for_cid[4409] = "SkinProcedure" cid_concepts[4409] = { "SCT": [ "ExcisionOfSkin", "PhotodynamicTherapyOfSkin", "RadiofrequencyAblation", "BiopsyOfSkin", "CryotherapyToSkinLesion", "TopicalChemotherapyForMalignantNeoplasm", "LaserProcedureOnSkin", ] } name_for_cid[4410] = "TopicalTreatment" cid_concepts[4410] = { "SCT": [ "Antifungal", "Tretinoin", "Steroid", "Immunomodulator", "Antibiotic", "AluminumHydroxide", "KeratolyticAgent", "HaemostaticAgent", "CytotoxicAgent", "AscorbicAcid", ] } name_for_cid[4411] = "LesionColor" cid_concepts[4411] = { "SCT": [ "Black", "Purple", "Orange", "Brown", "Yellow", "Red", "Gray", "White", "Blue", "Pink", ] } name_for_cid[4412] = "SpecimenStainforConfocalMicroscopy" cid_concepts[4412] = { "SCT": [ "NileBlueStain", "AcridineOrangeStain", "MethylBlueStain", "ToluidineBlueStain", "PatentBlueVSodiumSaltStain", "AceticAcid", "ImmunofluorescentStain", "AluminumChloride", "CitricAcid", "FluoresceinStain", ] } name_for_cid[6000] = "OverallBreastComposition" cid_concepts[6000] = { "SCT": [ "ExtremelyDense", "AlmostEntirelyFat", "HeterogeneouslyDense", "ScatteredFibroglandularDensities", ] } name_for_cid[6001] = "OverallBreastCompositionfromBIRADS®" cid_concepts[6001] = { "SCT": [ "ExtremelyDense", "AlmostEntirelyFat", "HeterogeneouslyDense", "ScatteredFibroglandularDensities", ] } name_for_cid[6002] = "ChangeSinceLastMammogramorPriorSurgery" cid_concepts[6002] = { "SCT": [ "RemovalOfImplantSincePreviousMammogram", "ImplantRevisedSincePreviousMammogram", "NoSignificantChangesInTheFinding", "IncreaseInSize", "NewFinding", "IncreaseInNumberOfCalcifications", "DecreaseInNumberOfCalcifications", "LessDefined", "FindingPartiallyRemoved", "MoreDefined", "DecreaseInSize", ] } name_for_cid[6003] = "ChangeSinceLastMammogramorPriorSurgeryfromBIRADS®" cid_concepts[6003] = { "SCT": [ "RemovalOfImplantSincePreviousMammogram", "ImplantRevisedSincePreviousMammogram", "NoSignificantChangesInTheFinding", "IncreaseInSize", "NewFinding", "IncreaseInNumberOfCalcifications", "DecreaseInNumberOfCalcifications", "LessDefined", "FindingPartiallyRemoved", "MoreDefined", "DecreaseInSize", ] } name_for_cid[6004] = "MammographyShapeCharacteristic" cid_concepts[6004] = {"SCT": ["Lobular", "RoundShape", "Irregular", "OvoidShapeOval"]} name_for_cid[6005] = "ShapeCharacteristicfromBIRADS®" cid_concepts[6005] = {"SCT": ["Lobular", "RoundShape", "Irregular", "OvoidShapeOval"]} name_for_cid[6006] = "MammographyMarginCharacteristic" cid_concepts[6006] = { "DCM": ["AngularMargins"], "SCT": [ "SpiculatedLesion", "CircumscribedLesion", "ObscuredLesion", "IndistinctLesion", "MicrolobulatedLesion", ], } name_for_cid[6007] = "MarginCharacteristicfromBIRADS®" cid_concepts[6007] = { "DCM": ["AngularMargins"], "SCT": [ "SpiculatedLesion", "CircumscribedLesion", "ObscuredLesion", "IndistinctLesion", "MicrolobulatedLesion", ], } name_for_cid[6008] = "DensityModifier" cid_concepts[6008] = { "SCT": [ "LowDensityNotContainingFatLesion", "HighDensityLesion", "EqualDensityIsodenseLesion", "FatContainingRadiolucentLesion", ] } name_for_cid[6009] = "DensityModifierfromBIRADS®" cid_concepts[6009] = { "SCT": [ "LowDensityNotContainingFatLesion", "HighDensityLesion", "EqualDensityIsodenseLesion", "FatContainingRadiolucentLesion", ] } name_for_cid[6010] = "MammographyCalcificationType" cid_concepts[6010] = { "DCM": ["FinePleomorphicCalcification", "Macrocalcifications"], "SCT": [ "CalcifiedSkinOfBreast", "FineLinearCastingCalcification", "CalcifiedSutureMaterial", "AmorphousCalcification", "VascularCalcificationRadiographicFinding", "RoundShapedCalcification", "LucentCenteredCalcification", "PunctateCalcification", "MilkOfCalciumCalcification", "DystrophicCalcification", "EggshellCalcification", "LargeRodLikeCalcification", "FineLinearBranchingCastingCalcification", "MicrocalcificationsOfTheBreast", "CoarsePopcornLikeCalcification", "HeterogeneousCalcification", ], } name_for_cid[6011] = "CalcificationTypefromBIRADS®" cid_concepts[6011] = { "DCM": ["FinePleomorphicCalcification", "Macrocalcifications"], "SCT": [ "CalcifiedSkinOfBreast", "FineLinearCastingCalcification", "CalcifiedSutureMaterial", "AmorphousCalcification", "VascularCalcificationRadiographicFinding", "RoundShapedCalcification", "LucentCenteredCalcification", "PunctateCalcification", "MilkOfCalciumCalcification", "DystrophicCalcification", "EggshellCalcification", "LargeRodLikeCalcification", "FineLinearBranchingCastingCalcification", "MicrocalcificationsOfTheBreast", "CoarsePopcornLikeCalcification", "HeterogeneousCalcification", ], } name_for_cid[6012] = "CalcificationDistributionModifier" cid_concepts[6012] = { "DCM": ["CalcificationsWithinAMass", "CalcificationsOutsideOfAMass"], "SCT": [ "SegmentalCalcificationDistribution", "LinearCalcificationDistribution", "RegionalCalcificationDistribution", "DiffuseCalcificationDistribution", "GroupedCalcificationDistribution", ], } name_for_cid[6013] = "CalcificationDistributionModifierfromBIRADS®" cid_concepts[6013] = { "DCM": ["CalcificationsWithinAMass", "CalcificationsOutsideOfAMass"], "SCT": [ "SegmentalCalcificationDistribution", "LinearCalcificationDistribution", "RegionalCalcificationDistribution", "DiffuseCalcificationDistribution", "GroupedCalcificationDistribution", ], } name_for_cid[6014] = "MammographySingleImageFinding" cid_concepts[6014] = { "DCM": [ "BreastGeometry", "CooperLigamentChanges", "ImageQuality", "MassInTheSkin", "SelectedRegion", "NonLesion", "MassOnTheSkin", ], "SCT": [ "BreastComposition", "AxillaryAdenopathy", "Edema", "AxillaryLymphNode", "TrabecularThickeningOfBreast", "SkinRetractionOfBreast", "ArchitecturalDistortionOfBreast", "TubularDensity", "MammographyBreastDensity", "SkinLesion", "IndividualCalcification", "Nipple", "SkinThickeningOfBreast", "CalcificationCluster", "IntramammaryLymphNode", ], } name_for_cid[6015] = "SingleImageFindingfromBIRADS®" cid_concepts[6015] = { "DCM": ["CooperLigamentChanges", "MassInTheSkin", "MassOnTheSkin"], "SCT": [ "BreastComposition", "AxillaryAdenopathy", "Edema", "AxillaryLymphNode", "TrabecularThickeningOfBreast", "SkinRetractionOfBreast", "ArchitecturalDistortionOfBreast", "TubularDensity", "MammographyBreastDensity", "SkinLesion", "IndividualCalcification", "SkinThickeningOfBreast", "CalcificationCluster", "IntramammaryLymphNode", ], } name_for_cid[6016] = "MammographyCompositeFeature" cid_concepts[6016] = { "DCM": [ "BreastGeometry", "ImageQuality", "NonLesion", "CooperLigamentChanges", "MassInTheSkin", "SelectedRegion", "MassOnTheSkin", "MassWithCalcifications", ], "SCT": [ "BreastComposition", "AxillaryLymphNode", "AsymmetricBreastTissue", "SkinRetractionOfBreast", "ArchitecturalDistortionOfBreast", "TubularDensity", "MammographyBreastDensity", "SkinLesion", "SkinThickeningOfBreast", "FocalAsymmetricBreastTissue", "AxillaryAdenopathy", "Edema", "TrabecularThickeningOfBreast", "IndividualCalcification", "Nipple", "MammographicBreastMass", "CalcificationCluster", "IntramammaryLymphNode", ], } name_for_cid[6017] = "CompositeFeaturefromBIRADS®" cid_concepts[6017] = { "SCT": [ "FocalAsymmetricBreastTissue", "MammographicBreastMass", "AsymmetricBreastTissue", ] } name_for_cid[6018] = "ClockfaceLocationorRegion" cid_concepts[6018] = { "SCT": [ "_7OClockPosition", "_11OClockPosition", "_12OClockPosition", "ChestWall", "_5OClockPosition", "_3OClockPosition", "_6OClockPosition", "_4OClockPosition", "AxillaRegion", "_1OClockPosition", "_8OClockPosition", "_2OClockPosition", "CentralRegionOfBreast", "AxillaryTailRegion", "SubareolarRegion", "_9OClockPosition", "_10OClockPosition", ] } name_for_cid[6019] = "ClockfaceLocationorRegionfromBIRADS®" cid_concepts[6019] = { "SCT": [ "_7OClockPosition", "_11OClockPosition", "_12OClockPosition", "_5OClockPosition", "_3OClockPosition", "_6OClockPosition", "_4OClockPosition", "AxillaRegion", "_1OClockPosition", "_8OClockPosition", "_2OClockPosition", "CentralRegionOfBreast", "AxillaryTailRegion", "SubareolarRegion", "_9OClockPosition", "_10OClockPosition", ] } name_for_cid[6020] = "QuadrantLocation" cid_concepts[6020] = { "SCT": [ "UpperOuterQuadrantOfBreast", "LowerInnerQuadrantOfBreast", "LowerOuterQuadrantOfBreast", "UpperInnerQuadrantOfBreast", ] } name_for_cid[6021] = "QuadrantLocationfromBIRADS®" cid_concepts[6021] = { "SCT": [ "UpperOuterQuadrantOfBreast", "LowerInnerQuadrantOfBreast", "LowerOuterQuadrantOfBreast", "UpperInnerQuadrantOfBreast", ] } name_for_cid[6022] = "Side" cid_concepts[6022] = {"SCT": ["LeftBreast", "RightBreast", "BothBreasts"]} name_for_cid[6023] = "SidefromBIRADS®" cid_concepts[6023] = {"SCT": ["LeftBreast", "RightBreast", "BothBreasts"]} name_for_cid[6024] = "Depth" cid_concepts[6024] = {"NCIt": ["Middle"], "SCT": ["Posterior", "Anterior"]} name_for_cid[6025] = "DepthfromBIRADS®" cid_concepts[6025] = {"NCIt": ["Middle"], "SCT": ["Posterior", "Anterior"]} name_for_cid[6026] = "MammographyAssessment" cid_concepts[6026] = {"DCM": ["PostProcedureMammogramsForMarkerPlacement"]} name_for_cid[6027] = "AssessmentfromBIRADS®" cid_concepts[6027] = {} name_for_cid[6028] = "MammographyRecommendedFollowup" cid_concepts[6028] = { "DCM": [ "NormalIntervalFollowUp", "AnyDecisionToBiopsyShouldBeBasedOnClinicalAssessment", "FollowUpAtShortInterval111Months", "FollowUpPostBiopsyAsDirectedByClinician", "BiopsyShouldBeConsidered", "NeedleLocalizationAndBiopsy", "KnownBiopsyProvenMalignancyTakeAppropriateAction", "HistologyUsingCoreBiopsy", "SurgicalConsult", "AdditionalProjections", "SuggestiveOfMalignancyTakeAppropriateAction", "SpotMagnificationViews", "CytologicAnalysis", "BiopsyShouldBeStronglyConsidered", "OldFilmsForComparison", "HighlySuggestiveOfMalignancyTakeAppropriateAction", ], "SCT": [ "SpotCompression", "NuclearMedicineProcedure", "MRIOfBreast", "DiagnosticUltrasonography", "MagnificationViews", "EvaluationProcedure", "MammaryDuctogram", ], } name_for_cid[6029] = "RecommendedFollowupfromBIRADS®" cid_concepts[6029] = { "DCM": [ "NormalIntervalFollowUp", "AnyDecisionToBiopsyShouldBeBasedOnClinicalAssessment", "FollowUpAtShortInterval111Months", "BiopsyShouldBeConsidered", "NeedleLocalizationAndBiopsy", "KnownBiopsyProvenMalignancyTakeAppropriateAction", "HistologyUsingCoreBiopsy", "AdditionalProjections", "SuggestiveOfMalignancyTakeAppropriateAction", "SpotMagnificationViews", "CytologicAnalysis", "BiopsyShouldBeStronglyConsidered", "OldFilmsForComparison", "HighlySuggestiveOfMalignancyTakeAppropriateAction", ], "SCT": [ "SpotCompression", "MRIOfBreast", "DiagnosticUltrasonography", "MagnificationViews", "MammaryDuctogram", ], } name_for_cid[6030] = "MammographyPathologyCode" cid_concepts[6030] = { "DCM": [ "FibroadenomatoidHyperplasia", "Fibroadenolipoma", "CartilaginousAndOsseousChange", "AxillaryNodeWithLymphoma", "AxillaryNodalMetastases", "BloodVesselVascularInvasion", "CarcinomaInChildren", "CarcinomaInEctopicBreast", "CarcinomaWithEndocrineDifferentiation", "BasalCellCarcinomaOfNipple", "NormalAxillaryNode", "AxillaryNodeWithCalcifications", "AxillaryNodeHyperplasia", "BenignCystWithBlood", "BenignCalcifications", "DuctalAdenoma", "DiabeticFibrousMastopathy", "SquamousCellCarcinomaOfTheNipple", "IntraductalCarcinomaHighGrade", "PseudoangiomatousStromalHyperplasia", "SiliconeGranuloma", "MetastaticDiseaseToAxillaryNode", "VirginalHyperplasia", "PeripheralDuctPapillomas", "MultifocalInvasiveDuctalCarcinoma", "OilCyst", "PostReductionMammoplasty", "MetastasisToAnIntramammaryLymphNode", "MalignantMelanomaOfNipple", "RecurrentMalignancy", "LargeDuctPapilloma", "MicroglandularAdenosis", "MultipleIntraductalPapillomas", "NoAbnormality", "NormalBreastTissue", "LympathicVesselInvasion", "OccultCarcinomaPresentingWithAxillaryLymphNodeMetastases", "MetastaticCancerToTheBreast", "MetastaticCancerToTheBreastFromTheColon", "MetastaticCancerToTheBreastFromTheLung", "MetastaticMelanomaToTheBreast", "MetastaticCancerToTheBreastFromTheOvary", "MetastaticSarcomaToTheBreast", "MultifocalIntraductalCarcinoma", "JuvenilePapillomatosis", "CarcinomaInPregnancyAndLactation", "LactationalChange", "IntraductalComedocarcinomaWithNecrosis", "IntraductalCarcinomaLowGrade", "IntracysticPapillaryCarcinoma", "InvasiveAndInSituCarcinoma", "LeukemicInfiltration", ], "SCT": [ "LactatingAdenoma", "Leiomyoma", "Carcinosarcoma", "TubularAdenocarcinoma", "CystOfBreast", "FatNecrosisOfBreast", "NonHodgkinLymphoma", "HemangiomaOfSubcutaneousTissue", "LymphNode", "Plasmacytoma", "BreastLobularHyperplasia", "CarcinomaInSituOfMaleBreast", "Hemangiopericytoma", "Adenoma", "EpidermalInclusionCyst", "Galactocele", "Lipoma", "ThrombophlebitisOfBreastMondorDisease", "ScarTissue", "HodgkinLymphoma", "Lymphoma", "LobularCarcinomaInSituOfBreast", "DuctalHyperplasiaUsual", "Angiosarcoma", "Neurofibroma", "Fibroadenoma", "Gynecomastia", "GiantFibroadenoma", "MalignantFibrousHistiocytoma", "ApocrineMetaplasia", "Fibrosarcoma", "SignetRingCellCarcinoma", "Hematoma", "Amyloid", "PhyllodesTumor", "Papilloma", "CarcinomaWithMetaplasia", "PleomorphicAdenoma", "IntraductalCarcinomaMicroPapillary", "SquamousCellCarcinoma", "PagetDiseaseMammary", "Adenomyoepithelioma", "FocalFibrosis", "InfiltratingDuctCarcinoma", "SpindleCellNodule", "Abscess", "SclerosingAdenosis", "Adenolipoma", "Comedocarcinoma", "MammaryDuctEctasia", "Chondroma", "Osteosarcoma", "InfarctionOfBreast", "ApocrineAdenocarcinoma", "Hemangioma", "PapillaryCarcinoma", "RadialScar", "InflammatoryCarcinoma", "HemangiomaVenous", "LipidRichLipidSecretingCarcinoma", "Leiomyosarcoma", "GranularCellTumor", "Angiolipoma", "ForeignBodyGiantCellGranuloma", "HyperplasiaUsual", "InvasiveCribriformCarcinoma", "AdenoidCysticCarcinoma", "Angiomatosis", "Adenosis", "Seroma", "MedullaryCarcinoma", "AtypicalIntraductalHyperplasia", "ExtraAbdominalDesmoid", "Fibromatosis", "Inflammation", "IntramammaryLymphNode", "AtypicalLobularHyperplasia", "Liposarcoma", "IntraductalPapilloma", "NeoplasmOfTheMammarySkin", "PhyllodesTumorMalignant", "GlycogenRichCarcinoma", "TubularAdenoma", "SecretoryJuvenileCarcinomaOfTheBreast", "Neurofibromatosis", "MucinousAdenocarcinomaColloidCarcinoma", "IntracysticPapilloma", "Myofibroblastoma", "Chondrosarcoma", "PapillaryCarcinomaInSitu", "JuvenileFibroadenoma", "EctopicAccessoryBreastTissue", "Edema", "Hamartoma", "AsynchronousInvolutionOfBreast", "FibrocysticDiseaseOfBreast", "BenignNeoplasmOfNippleOfFemaleBreastNippleAdenoma", "InvasiveLobularCarcinoma", ], } name_for_cid[6031] = "BenignPathologyCodefromBIRADS®" cid_concepts[6031] = { "DCM": [ "FibroadenomatoidHyperplasia", "Fibroadenolipoma", "PseudoangiomatousStromalHyperplasia", "NormalAxillaryNode", "AxillaryNodeWithCalcifications", "SiliconeGranuloma", "AxillaryNodeHyperplasia", "VirginalHyperplasia", "BenignCystWithBlood", "OilCyst", "PostReductionMammoplasty", "BenignCalcifications", "DuctalAdenoma", "DiabeticFibrousMastopathy", "LargeDuctPapilloma", "MicroglandularAdenosis", "MultipleIntraductalPapillomas", "NoAbnormality", "NormalBreastTissue", "JuvenilePapillomatosis", "LactationalChange", ], "SCT": [ "LactatingAdenoma", "Leiomyoma", "CystOfBreast", "FatNecrosisOfBreast", "InfarctionOfBreast", "Hemangioma", "RadialScar", "HemangiomaOfSubcutaneousTissue", "LymphNode", "HemangiomaVenous", "BreastLobularHyperplasia", "Adenoma", "GranularCellTumor", "Angiolipoma", "EpidermalInclusionCyst", "Galactocele", "ForeignBodyGiantCellGranuloma", "HyperplasiaUsual", "Lipoma", "ThrombophlebitisOfBreastMondorDisease", "ScarTissue", "Angiomatosis", "Adenosis", "DuctalHyperplasiaUsual", "Neurofibroma", "Fibroadenoma", "Seroma", "Gynecomastia", "ExtraAbdominalDesmoid", "GiantFibroadenoma", "Fibromatosis", "Inflammation", "IntramammaryLymphNode", "ApocrineMetaplasia", "IntraductalPapilloma", "Hematoma", "Amyloid", "TubularAdenoma", "Papilloma", "Neurofibromatosis", "PleomorphicAdenoma", "Adenomyoepithelioma", "FocalFibrosis", "IntracysticPapilloma", "Myofibroblastoma", "JuvenileFibroadenoma", "EctopicAccessoryBreastTissue", "Abscess", "SclerosingAdenosis", "Edema", "Adenolipoma", "Hamartoma", "AsynchronousInvolutionOfBreast", "FibrocysticDiseaseOfBreast", "MammaryDuctEctasia", "Chondroma", "BenignNeoplasmOfNippleOfFemaleBreastNippleAdenoma", ], } name_for_cid[6032] = "HighRiskLesionPathologyCodefromBIRADS®" cid_concepts[6032] = { "DCM": ["PeripheralDuctPapillomas"], "SCT": [ "AtypicalLobularHyperplasia", "AtypicalIntraductalHyperplasia", "PhyllodesTumor", "LobularCarcinomaInSituOfBreast", ], } name_for_cid[6033] = "MalignantPathologyCodefromBIRADS®" cid_concepts[6033] = { "DCM": [ "SquamousCellCarcinomaOfTheNipple", "IntraductalCarcinomaHighGrade", "CartilaginousAndOsseousChange", "AxillaryNodeWithLymphoma", "AxillaryNodalMetastases", "BloodVesselVascularInvasion", "CarcinomaInChildren", "CarcinomaInEctopicBreast", "CarcinomaWithEndocrineDifferentiation", "BasalCellCarcinomaOfNipple", "MetastaticDiseaseToAxillaryNode", "MultifocalInvasiveDuctalCarcinoma", "MetastasisToAnIntramammaryLymphNode", "MalignantMelanomaOfNipple", "RecurrentMalignancy", "LympathicVesselInvasion", "OccultCarcinomaPresentingWithAxillaryLymphNodeMetastases", "MetastaticCancerToTheBreast", "MetastaticCancerToTheBreastFromTheColon", "MetastaticCancerToTheBreastFromTheLung", "MetastaticMelanomaToTheBreast", "MetastaticCancerToTheBreastFromTheOvary", "MetastaticSarcomaToTheBreast", "MultifocalIntraductalCarcinoma", "CarcinomaInPregnancyAndLactation", "IntraductalComedocarcinomaWithNecrosis", "IntraductalCarcinomaLowGrade", "IntracysticPapillaryCarcinoma", "InvasiveAndInSituCarcinoma", "LeukemicInfiltration", ], "SCT": [ "Osteosarcoma", "Carcinosarcoma", "TubularAdenocarcinoma", "NonHodgkinLymphoma", "ApocrineAdenocarcinoma", "PapillaryCarcinoma", "InflammatoryCarcinoma", "Plasmacytoma", "LipidRichLipidSecretingCarcinoma", "CarcinomaInSituOfMaleBreast", "Hemangiopericytoma", "Leiomyosarcoma", "HodgkinLymphoma", "InvasiveCribriformCarcinoma", "Lymphoma", "AdenoidCysticCarcinoma", "Angiosarcoma", "MedullaryCarcinoma", "MalignantFibrousHistiocytoma", "Fibrosarcoma", "SignetRingCellCarcinoma", "Liposarcoma", "NeoplasmOfTheMammarySkin", "PhyllodesTumorMalignant", "GlycogenRichCarcinoma", "CarcinomaWithMetaplasia", "SecretoryJuvenileCarcinomaOfTheBreast", "IntraductalCarcinomaMicroPapillary", "SquamousCellCarcinoma", "MucinousAdenocarcinomaColloidCarcinoma", "PagetDiseaseMammary", "InfiltratingDuctCarcinoma", "Chondrosarcoma", "PapillaryCarcinomaInSitu", "SpindleCellNodule", "Comedocarcinoma", "InvasiveLobularCarcinoma", ], } name_for_cid[6034] = "CADOutputIntendedUse" cid_concepts[6034] = { "DCM": [ "PresentationRequiredRenderingDeviceIsExpectedToPresent", "PresentationOptionalRenderingDeviceMayPresent", "NotForPresentationRenderingDeviceExpectedNotToPresent", ] } name_for_cid[6035] = "CompositeFeatureRelation" cid_concepts[6035] = { "DCM": [ "TargetContentItemsAreRelatedTemporally", "TargetContentItemsAreRelatedSpatially", "TargetContentItemsAreRelatedContraLaterally", ] } name_for_cid[6036] = "FeatureScope" cid_concepts[6036] = { "DCM": [ "FeatureDetectedOnTheOnlyImage", "FeatureDetectedOnOnlyOneOfTheImages", "FeatureDetectedOnMultipleImages", "FeatureDetectedOnImagesFromMultipleModalities", ] } name_for_cid[6037] = "MammographyQuantitativeTemporalDifferenceType" cid_concepts[6037] = { "SCT": [ "DifferenceInSize", "DifferenceInLocation", "DifferenceInOpacity", "DifferenceInSpatialProximity", "DifferenceInNumberOfCalcifications", ] } name_for_cid[6038] = "MammographyQualitativeTemporalDifferenceType" cid_concepts[6038] = { "SCT": ["DifferenceInMargin", "DifferenceInSymmetry", "DifferenceInShape"] } name_for_cid[6039] = "NippleCharacteristic" cid_concepts[6039] = {"SCT": ["NippleRetraction", "NormalShape"]} name_for_cid[6040] = "NonlesionObjectType" cid_concepts[6040] = { "DCM": ["OtherMarker", "Unspecified"], "SCT": [ "Suture", "PacemakerPulseGenerator", "CompressionPaddle", "JWire", "ScarTissue", "Bullet", "BBShotLeadPellet", "OpaqueMarker", "Clip", "ContrastAgent", "Catheter", "IDPlate", "Collimator", "Implant", "Staple", ], } name_for_cid[6041] = "MammographyImageQualityFinding" cid_concepts[6041] = { "DCM": [ "ViewAndLateralityMarkerIsPartiallyObscured", "ViewAndLateralityMarkerIsIncorrect", "ViewAndLateralityMarkerIsOffImage", "FlashIsNotNearEdgeOfFilm", "FlashIsIllegibleDoesNotFitOrIsLopsided", "FlashDoesnTIncludePatientNameAndAdditionalPatientId", "OtherFailure", "FlashDoesnTIncludeDateOfExamination", "UnknownFailure", "FlashDoesnTIncludeFacilityNameAndLocation", "MLOEvidenceOfMotionBlur", "ViewAndLateralityMarkerIsNotNearTheAxilla", "ViewAndLateralityMarkerOverlapsBreastTissue", "Positioning", "MLOInframammaryFoldIsNotOpen", "CCNotAllMedialTissueVisualized", "CCNippleNotCenteredOnImage", "CCPosteriorNippleLineDoesNotMeasureWithin1cmOfMLO", "NippleNotInProfile", "InsufficientImplantDisplacementIncorrect", "GridArtifacts", "DateStickerIsMissing", "TechnicalFactorsMissing", "CollimationTooCloseToBreast", "InadequateCompression", "MLOInsufficientPectoralMuscle", "MLONoFatIsVisualizedPosteriorToFibroglandularTissues", "ViewAndLateralityMarkerIsMissing", "MLOPoorSeparationOfDeepAndSuperficialBreastTissues", "MotionBlur", "ViewAndLateralityMarkerDoesNotHaveBothViewAndLaterality", "UnderExposed", "FlashDoesnTIncludeTechnologistIdentification", "FlashDoesnTIncludeCassetteScreenDetectorIdentification", "FlashDoesnTIncludeMammographyUnitIdentification", "ViewAndLateralityMarkerDoesNotHaveApprovedCodes", "OverExposed", "NoImage", "DetectorArtifacts", "ArtifactsOtherThanGridOrDetectorArtifact", "MechanicalFailure", "ElectricalFailure", "SoftwareFailure", "InappropriateImageProcessing", ] } name_for_cid[6042] = "ResultStatus" cid_concepts[6042] = { "DCM": ["Succeeded", "PartiallySucceeded", "Failed", "NotAttempted"] } name_for_cid[6043] = "MammographyCADAnalysisType" cid_concepts[6043] = { "DCM": [ "IndividualImpressionRecommendationAnalysis", "OverallImpressionRecommendationAnalysis", ], "SCT": [ "FocalAsymmetricDensityAnalysis", "BreastCompositionAnalysis", "SpatialCollocationAnalysis", "SpatialProximityAnalysis", "TemporalCorrelation", "ImageQualityAnalysis", "AsymmetricBreastTissueAnalysis", ], } name_for_cid[6044] = "ImageQualityAssessmentType" cid_concepts[6044] = { "DCM": [ "UnusableQualityRendersImageUnusable", "UsableDoesNotMeetTheQualityControlStandard", "UsableMeetsTheQualityControlStandard", ] } name_for_cid[6045] = "MammographyQualityControlStandardType" cid_concepts[6045] = { "DCM": [ "InstitutionallyDefinedQualityControlStandard", "MammographyQualityControlManual1999ACR", "Title21CFRSection900SubpartB", ] } name_for_cid[6046] = "FollowupIntervalUnit" cid_concepts[6046] = {"UCUM": ["Year", "Day", "Week", "Month"]} name_for_cid[6047] = "CADProcessingandFindingSummary" cid_concepts[6047] = { "DCM": [ "AllAlgorithmsSucceededWithoutFindings", "AllAlgorithmsSucceededWithFindings", "NotAllAlgorithmsSucceededWithoutFindings", "NotAllAlgorithmsSucceededWithFindings", "NoAlgorithmsSucceededWithoutFindings", ] } name_for_cid[6048] = "CADOperatingPointAxisLabel" cid_concepts[6048] = { "DCM": [ "ImageSpecificity", "CaseSpecificity", "ProbabilityOfCancer", "CertaintyOfFinding", "LesionSensitivity", "CaseSensitivity", "FalseMarkersPerCase", "FalseMarkersPerImage", ] } name_for_cid[6050] = "BreastProcedureReported" cid_concepts[6050] = { "DCM": [ "MarkerPlacement", "FilmScreenMammography", "SurgicalConsult", "MammographyCAD", ], "LN": [ "BreastRightMammogram", "BreastFfdMammogram", "BreastUnilateralMrWoAndWContrastIv", "BreastBilateralMammogram", "WholeBodyPtWRncIv", "BreastUnilateralMammogram", "BreastMrWContrastIv", "BreastUnilateralMrWContrastIv", "BreastBilateralMrWContrastIv", "BreastRightMrWoAndWContrastIv", "BreastUnilateralMrWoContrast", "BreastLeftMr", "BreastLeftMrWoAndWContrastIv", "BreastMrWoAndWContrastIv", "BreastRightMr", "BreastBilateralMrWoAndWContrastIv", "WholeBodyCt", "BreastBilateralMr", "BreastLeftMammogram", "BreastLeftMrWContrastIv", "BreastRightMrWContrastIv", "BreastUnilateralMr", ], "SCT": [ "ExaminationOfBreast", "FineNeedleAspirationOfBreast", "MRIOfBreast", "SpecimenRadiographyOfBreast", "MammaryDuctogram", "UltrasonographyOfBreast", "PreBiopsyLocalizationOfBreastLesion", "BreastSurgicalBiopsy", "InsertionOfCatheter", "CoreNeedleBiopsyOfBreast", "SentinelLymphNodeBiopsy", "CTOfBreast", "RadioisotopeScanOfLymphaticSystem", "DiagnosticAspirationOfBreastCyst", "RadionuclideLocalizationOfTumorLimitedArea", ], } name_for_cid[6051] = "BreastProcedureReason" cid_concepts[6051] = { "DCM": [ "NeedleLocalizationAndBiopsy", "HistoryOfBenignBreastBiopsy", "MarkerPlacement", "PersonalHistoryOfBreastCancerWithBreastConservationTherapy", "PersonalHistoryOfBreastCancerWithMastectomy", "KnownBiopsyProvenMalignancy", "ClinicalFinding", "Targeted", "Survey", "RecallForTechnicalReasons", "Calibration", "RecallForImagingFindings", "RecallForPatientSymptomsClinicalFindings", "ReviewOfAnOutsideStudy", "AdditionalEvaluationRequestedFromAbnormalScreeningStudy", "QualityControl", "AdditionalEvaluationRequestedFromPriorStudy", "FollowUpAtShortIntervalFromPriorStudy", "HistoryOfBreastAugmentationAsymptomatic", ], "SCT": [ "ReductionMammoplasty", "Diagnostic", "HistoryOfRadiationTherapy", "PersonalHistoryOfBreastCancer", "AugmentationMammoplasty", "Brachytherapy", "Screening", ], } name_for_cid[6052] = "BreastImagingReportSectionTitle" cid_concepts[6052] = { "DCM": [ "ProcedureReported", "PhysicalExaminationResults", "ComparisonToPreviousStudies", "OverallAssessment", ], "LN": [ "Addendum", "Conclusions", "Findings", "Recommendations", "Impressions", "IndicationsForProcedure", ], "SCT": ["BreastComposition"], } name_for_cid[6053] = "BreastImagingReportElement" cid_concepts[6053] = { "DCM": [ "ProcedureReported", "Conclusion", "PhysicalExaminationResults", "Recommendation", "ComparisonToPreviousStudies", "OverallAssessment", "Impression", "Finding", ], "LN": ["IndicationsForProcedure"], "SCT": ["BreastComposition"], } name_for_cid[6054] = "BreastImagingFinding" cid_concepts[6054] = { "DCM": [ "ComplexCyst", "IntracysticLesion", "SolidMass", "NormalBreastTissue", "BreastGeometry", "ImageQuality", "DuctNarrowing", "NonLesion", "IntraluminalFillingDefect", "ClusteredMicrocysts", "MultipleFillingDefect", "AbruptDuctTermination", "Extravasation", "ComplicatedCyst", "CystFill", "CooperLigamentChanges", "MassInTheSkin", "SelectedRegion", "MassOnTheSkin", "MassWithCalcifications", ], "SCT": [ "CalcificationOfBreast", "BreastComposition", "ForeignBody", "CystOfBreast", "UltrasoundScanNormal", "AxillaryLymphNode", "AsymmetricBreastTissue", "SkinRetractionOfBreast", "ArchitecturalDistortionOfBreast", "TubularDensity", "MammographyBreastDensity", "SkinLesion", "BreastNormal", "SkinThickeningOfBreast", "FocalAsymmetricBreastTissue", "LymphNode", "AxillaryAdenopathy", "Edema", "TrabecularThickeningOfBreast", "SebaceousCystOfSkinOfBreast", "IndividualCalcification", "Nipple", "MammaryDuctEctasia", "MammographicBreastMass", "CalcificationCluster", "Implant", "IntramammaryLymphNode", ], } name_for_cid[6055] = "BreastClinicalFindingorIndicatedProblem" cid_concepts[6055] = { "DCM": [ "CancerElsewhere", "NonBloodyDischarge", "ImageDetectedMass", "DifficultPhysicalClinicalExamination", ], "SCT": [ "OEAxillaryLymphadenopathy", "DiscolorationOfSkinOfBreast", "BloodyNippleDischarge", "PeauDOrangeSurfaceOfBreast", "DisorderOfBreastImplant", "MalignantTumourOfUnknownOrigin", "SkinRetractionOfBreast", "RadiographicCalcificationFinding", "OELymphadenopathy", "OEBreastLumpPalpated", "BreastPain", "SkinThickeningOfBreast", "NippleDischargeSymptom", "Erythema", "NippleProblem", "BreastLump", ], } name_for_cid[6056] = "AssociatedFindingforBreast" cid_concepts[6056] = { "DCM": ["CooperLigamentChanges", "MassInTheSkin", "MassOnTheSkin"], "SCT": [ "BreastHematoma", "BreastComposition", "AxillaryAdenopathy", "SurgicalScar", "Edema", "AxillaryLymphNode", "TrabecularThickeningOfBreast", "SkinRetractionOfBreast", "ArchitecturalDistortionOfBreast", "TubularDensity", "MammographyBreastDensity", "SkinLesion", "NippleRetraction", "IndividualCalcification", "SkinThickeningOfBreast", "CalcificationCluster", "IntramammaryLymphNode", ], } name_for_cid[6057] = "DuctographyFindingforBreast" cid_concepts[6057] = { "DCM": [ "DuctNarrowing", "NormalBreastTissue", "CystFill", "IntraluminalFillingDefect", "MultipleFillingDefect", "AbruptDuctTermination", "Extravasation", ], "SCT": ["MammaryDuctEctasia"], } name_for_cid[6058] = "ProcedureModifiersforBreast" cid_concepts[6058] = { "DCM": [ "SalineImplant", "PolyurethaneImplant", "PercutaneousSiliconeInjection", "CombinationImplant", "PrePectoralImplant", "NeedleLocalizationAndBiopsy", "RetroPectoralImplant", "MarkerPlacement", "_3DSpeckleTracking", "MammographicCrosshair", "MammographicGrid", "PalpationGuided", "Targeted", "_2DShearWaveElastography", "Survey", "VacuumAssisted", "Calibration", "_3DShearWaveElastography", "QualityControl", "PointShearWaveElastography", "_2DSpeckleTracking", ], "SCT": [ "Lumpectomy", "BMode", "TissueDopplerImaging", "BreastImplantTypeNotSpecified", "_3DMode", "_2DMode", "Mammography", "DopplerContinuousWave", "MagneticResonanceImagingGuidedBiopsy", "Diagnostic", "QuadrantectomyOfBreast", "SiliconeGelImplant", "DopplerPulsed", "MMode", "DiagnosticRadiographyStereotacticLocalization", "Screening", "PowerDoppler", "UltrasonicGuidanceProcedure", "DopplerColorFlow", "ComputedTomographyGuidedBiopsy", ], "UMLS": ["Mastectomy"], } name_for_cid[6059] = "BreastImplantType" cid_concepts[6059] = { "DCM": [ "SalineImplant", "PolyurethaneImplant", "PercutaneousSiliconeInjection", "CombinationImplant", "PrePectoralImplant", "RetroPectoralImplant", ], "SCT": ["SiliconeGelImplant", "BreastImplantTypeNotSpecified"], } name_for_cid[6060] = "BreastBiopsyTechnique" cid_concepts[6060] = { "DCM": [ "VacuumAssisted", "MammographicCrosshair", "MammographicGrid", "PalpationGuided", ], "SCT": [ "QuadrantectomyOfBreast", "Lumpectomy", "DiagnosticRadiographyStereotacticLocalization", "Mammography", "UltrasonicGuidanceProcedure", "MagneticResonanceImagingGuidedBiopsy", "ComputedTomographyGuidedBiopsy", ], "UMLS": ["Mastectomy"], } name_for_cid[6061] = "BreastImagingProcedureModifier" cid_concepts[6061] = { "DCM": [ "Calibration", "NeedleLocalizationAndBiopsy", "QualityControl", "MarkerPlacement", "Targeted", "Survey", ], "SCT": ["Diagnostic", "Screening"], } name_for_cid[6062] = "InterventionalProcedureComplication" cid_concepts[6062] = { "DCM": ["AbnormalDischarge", "NoComplications"], "SCT": [ "Pneumothorax", "Weal", "HealthcareAssociatedInfection", "Swelling", "HematomaPostoperative", "HemorrhagePostprocedure", "Rash", "VasovagalSyncope", "PersistentPainFollowingProcedure", ], } name_for_cid[6063] = "InterventionalProcedureResult" cid_concepts[6063] = { "SCT": [ "Benign", "Malignant", "InsufficientSample", "HighRiskTumor", "IndeterminateResult", ] } name_for_cid[6064] = "UltrasoundFindingforBreast" cid_concepts[6064] = { "DCM": [ "ComplexCyst", "ComplicatedCyst", "IntracysticLesion", "SolidMass", "ClusteredMicrocysts", ], "SCT": [ "SebaceousCystOfSkinOfBreast", "ForeignBody", "LymphNode", "CystOfBreast", "MammaryDuctEctasia", "UltrasoundScanNormal", ], } name_for_cid[6065] = "InstrumentApproach" cid_concepts[6065] = { "DCM": [ "InferolateralToSuperomedial", "InferomedialToSuperolateral", "SuperolateralToInferomedial", "SuperomedialToInferolateral", ], "SCT": ["Lateral", "Inferior", "Superior", "Medial"], } name_for_cid[6066] = "TargetConfirmation" cid_concepts[6066] = { "DCM": [ "TargetContainedInTheSpecimen", "TargetPartiallyObtainedInTheSpecimen", "TargetNotInTheSpecimen", "CalcificationsSeenInTheCore", "LesionCompletelyRemoved", "LesionPartiallyRemoved", "FluidObtained", ] } name_for_cid[6067] = "FluidColor" cid_concepts[6067] = { "DCM": [ "LightBrownColor", "DarkRedColor", "DarkBrownColor", "BrightRedColor", "BloodTingedColor", ], "SCT": [ "BlackColor", "Clear", "BrownColor", "YellowColor", "GrayColor", "WhiteColor", "GreenColor", ], } name_for_cid[6068] = "TumorStagesFromAJCC" cid_concepts[6068] = { "DCM": [ "Stage0", "StageI", "StageIIA", "StageIIB", "StageIIIA", "StageIIIB", "StageIIIC", "StageIV", ] } name_for_cid[6069] = "NottinghamCombinedHistologicGrade" cid_concepts[6069] = { "SCT": [ "NottinghamCombinedGradeI3To5Points", "NottinghamCombinedGradeII6To7Points", "NottinghamCombinedGradeIII8To9Points", "NottinghamCombinedGradeCannotBeDetermined", ] } name_for_cid[6070] = "BloomRichardsonHistologicGrade" cid_concepts[6070] = { "SCT": [ "Grade3PoorlyDifferentiated", "Grade1WellDifferentiated", "Grade4Undifferentiated", "Grade2ModeratelyDifferentiated", ] } name_for_cid[6071] = "HistologicGradingMethod" cid_concepts[6071] = { "DCM": ["BloomRichardsonGrade"], "SCT": ["NottinghamCombinedGrade"], } name_for_cid[6072] = "BreastImplantFinding" cid_concepts[6072] = { "DCM": [ "DistortedImplant", "SiliconeLadenLymphNodes", "FreeSilicone", "HerniatedImplant", "Explantation", "NormalImplants", "AsymmetricImplants", "CalcifiedImplant", ], "SCT": ["RuptureOfBreastImplant"], } name_for_cid[6080] = "GynecologicalHormone" cid_concepts[6080] = { "DCM": ["UnspecifiedGynecologicalHormone"], "SCT": [ "Anastrozole", "Tamoxifen", "Raloxifene", "Contraceptives", "ProgesteroneProduct", "EstrogenProduct", ], } name_for_cid[6081] = "BreastCancerRiskFactor" cid_concepts[6081] = { "DCM": [ "IntermediateFamilyHistoryOfBreastCancer", "PersonalBreastCancerHistory", "VeryStrongFamilyHistoryOfBreastCancer", "HistoryOfEndometrialCancer", "FamilyHistoryOfProstateCancer", "HistoryOfOvarianCancer", "FamilyHistoryUnknown", "HistoryOfHighRiskLesionOnPreviousBiopsy", "PostMenopausalPatient", "LateChildBearingAfter30", "BRCA1BreastCancerGene", "BRCA2BreastCancerGene", "BRCA3BreastCancerGene", "WeakFamilyHistoryOfBreastCancer", ], "SCT": [ "Nulliparous", "FamilyHistoryOfBreastCancer", "NoFamilyHistoryOfBreastCarcinoma", ], } name_for_cid[6082] = "GynecologicalProcedure" cid_concepts[6082] = { "SCT": ["DilationAndCurettage", "EndometrialBiopsy", "Hysterectomy"] } name_for_cid[6083] = "ProceduresforBreast" cid_concepts[6083] = { "DCM": [ "SurgicalConsult", "MammographyCAD", "MarkerPlacement", "FilmScreenMammography", "NippleDischargeCytology", ], "LN": [ "BreastBilateralMammogram", "WholeBodyPtWRncIv", "BreastUnilateralMrWoContrast", "BreastLeftMr", "BreastLeftMrWoAndWContrastIv", "BreastMrWoAndWContrastIv", "WholeBodyCt", "BreastBilateralMr", "BreastLeftMrWContrastIv", "BreastRightMammogram", "BreastFfdMammogram", "BreastUnilateralMrWoAndWContrastIv", "BreastUnilateralMammogram", "BreastMrWContrastIv", "BreastUnilateralMrWContrastIv", "BreastBilateralMrWContrastIv", "BreastRightMrWoAndWContrastIv", "BreastRightMr", "BreastBilateralMrWoAndWContrastIv", "BreastLeftMammogram", "BreastRightMrWContrastIv", "BreastUnilateralMr", ], "SCT": [ "ExaminationOfBreast", "RemovalOfBreastImplant", "FineNeedleAspirationOfBreast", "MRIOfBreast", "ReductionMammoplasty", "MammaryDuctogram", "BreastReconstruction", "UltrasonographyOfBreast", "CoreNeedleBiopsyOfBreast", "HormoneTherapy", "BoneMarrowTransplant", "RadiationTherapy", "SpecimenRadiographyOfBreast", "Chemotherapy", "PreBiopsyLocalizationOfBreastLesion", "BreastSurgicalBiopsy", "InsertionOfCatheter", "BreastProsthesisInsertion", "SentinelLymphNodeBiopsy", "CTOfBreast", "RadioisotopeScanOfLymphaticSystem", "DiagnosticAspirationOfBreastCyst", "RadionuclideLocalizationOfTumorLimitedArea", ], } name_for_cid[6084] = "MammoplastyProcedure" cid_concepts[6084] = { "SCT": [ "BreastProsthesisInsertion", "ReductionMammoplasty", "RemovalOfBreastImplant", "BreastReconstruction", ] } name_for_cid[6085] = "TherapiesforBreast" cid_concepts[6085] = { "SCT": [ "HormoneTherapy", "BoneMarrowTransplant", "Chemotherapy", "RadiationTherapy", ] } name_for_cid[6086] = "MenopausalPhase" cid_concepts[6086] = { "SCT": [ "AfterMenopause", "BeforeMenopause", "PostsurgicalMenopause", "ArtificialMenopauseState", "DuringMenopause", ] } name_for_cid[6087] = "GeneralRiskFactor" cid_concepts[6087] = { "DCM": [ "IntermediateFamilyHistoryOfBreastCancer", "VeryStrongFamilyHistoryOfBreastCancer", "FamilyHistoryOfProstateCancer", "FamilyHistoryUnknown", "UterineMalformations", "SpontaneousAbortion", "GynecologicCondition", "GynecologicSurgery", "PreviousLBWOrIUGRBirth", "PreviousFetalMalformationSyndrome", "PreviousRHNegativeOrBloodDyscrasiaAtBirth", "HistoryOfMultipleFetuses", "PersonalBreastCancerHistory", "CurrentPregnancyKnownOrSuspectedMalformationsSyndromes", "HistoryOfEndometrialCancer", "FamilyHistoryFetalMalformationSyndrome", "HistoryOfOvarianCancer", "HistoryOfHighRiskLesionOnPreviousBiopsy", "PostMenopausalPatient", "LateChildBearingAfter30", "BRCA1BreastCancerGene", "BRCA2BreastCancerGene", "BRCA3BreastCancerGene", "WeakFamilyHistoryOfBreastCancer", ], "SCT": [ "HistoryOfDiabetesMellitus", "HistoryOfEclampsia", "HistoryOfInfertility", "FamilyHistoryOfBreastCancer", "HistoryOfCardiovascularDisease", "HistoryOfObesity", "HistoryOfHypertension", "HistoryOfSubstanceAbuse", "HistoryOfEctopicPregnancy", "Nulliparous", "HistoryOfPrematureDelivery", "HistoryOfRegularMedication", "HistoryOfSeverePreEclampsia", "MultiplePregnancy", "NoFamilyHistoryOfBreastCarcinoma", ], } name_for_cid[6088] = "OBGYNMaternalRiskFactor" cid_concepts[6088] = { "DCM": [ "PreviousFetalMalformationSyndrome", "PreviousRHNegativeOrBloodDyscrasiaAtBirth", "HistoryOfMultipleFetuses", "CurrentPregnancyKnownOrSuspectedMalformationsSyndromes", "FamilyHistoryFetalMalformationSyndrome", "UterineMalformations", "SpontaneousAbortion", "GynecologicCondition", "GynecologicSurgery", "PreviousLBWOrIUGRBirth", ], "SCT": [ "HistoryOfObesity", "HistoryOfHypertension", "HistoryOfSubstanceAbuse", "HistoryOfEctopicPregnancy", "HistoryOfDiabetesMellitus", "HistoryOfEclampsia", "HistoryOfInfertility", "HistoryOfPrematureDelivery", "HistoryOfRegularMedication", "HistoryOfSeverePreEclampsia", "MultiplePregnancy", "HistoryOfCardiovascularDisease", ], } name_for_cid[6089] = "Substance" cid_concepts[6089] = { "SCT": [ "LysergicAcidDiethlyamide", "Methlyphenidate", "Methadone", "Phencyclidine", "Morphine", "Cocaine", "Heroin", "Amphetamine", "Caffeine", "Marijuana", "EthylAlcohol", "ChewingTobacco", "CigaretteSmokingTobacco", "Mescaline", ] } name_for_cid[6090] = "RelativeUsage/ExposureAmount" cid_concepts[6090] = {"DCM": ["High", "Medium", "NoKnownExposure", "Low"]} name_for_cid[6091] = "RelativeFrequencyofEventValue" cid_concepts[6091] = { "SCT": [ "Continuous", "SingleEvent", "AsRequired", "Frequent", "MidFrequency", "Infrequent", ] } name_for_cid[6092] = "Usage/ExposureQualitativeConcept" cid_concepts[6092] = { "DCM": ["VolumeOfUse", "DoseFrequency", "RateOfExposure"], "SCT": ["Dosage"], } name_for_cid[6093] = "Usage/Exposure/AmountQualitativeConcept" cid_concepts[6093] = { "DCM": ["RelativeDoseAmount", "RelativeAmountOfExposure", "RelativeAmountOfUse"] } name_for_cid[6094] = "Usage/Exposure/FrequencyQualitativeConcept" cid_concepts[6094] = { "DCM": [ "RelativeDoseFrequency", "RelativeFrequencyOfExposure", "RelativeFrequencyOfUse", ] } name_for_cid[6095] = "ProcedureNumericProperty" cid_concepts[6095] = {"DCM": ["NeedleGauge", "NeedleLength"]} name_for_cid[6096] = "PregnancyStatus" cid_concepts[6096] = { "SCT": ["PossiblePregnancy", "Unknown", "PatientCurrentlyPregnant", "NotPregnant"] } name_for_cid[6097] = "SideofFamily" cid_concepts[6097] = {"DCM": ["Maternal"], "SCT": ["Paternal"]} name_for_cid[6098] = "ClinicalCourseofDisease" cid_concepts[6098] = {"NCIt": ["NoEvidenceOfDisease", "RecurrentDisease"]} name_for_cid[6099] = "RacialGroup" cid_concepts[6099] = { "NCIt": ["NativeHawaiianOrOtherPacificIslander"], "SCT": [ "AmericanIndianOrAlaskaNative", "AsianOrPacificIslanderRace", "CaucasianRace", "Hispanic", "AustralianAborigineRace", "IndianRace", "AfricanRace", "MixedRacialGroup", "AsianRace", ], "UMLS": ["MiddleEasternOrNorthAfrican"], } name_for_cid[6100] = "ChestComponentCategory" cid_concepts[6100] = { "DCM": ["Bronchovascular", "Osseous"], "SCT": [ "Lung", "Mediastinum", "Heart", "PleuralStructure", "Muscular", "SystemicVascularStructure", ], } name_for_cid[6101] = "ChestFindingorFeature" cid_concepts[6101] = { "DCM": [ "AbnormalLucency", "AbnormalCalcifications", "AbnormalTexture", "AbnormalOpacity", "ImageQuality", "NonLesion", "RadiographicAnatomy", "SelectedRegion", "AbnormalLines1D", ] } name_for_cid[6102] = "ChestFindingorFeatureModifier" cid_concepts[6102] = { "BARI": [ "_1stMarginalCoronaryArteryLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", "_1stDiagonalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "_3rdDiagonalCoronaryArteryLaterals", ], "DCM": [ "KerleyBLine", "KerleyCLines", "ParenchymalBand", "ReticularPattern", "SeptalLines", "SubpleuralLine", "TramlineShadow", "TubularShadow", "Density", "DependentOpacity", "AorticKnob", "ArchOfTheAzygosVein", "AirFluidLevel", "CoronaRadiata", "HoneycombPattern", "FleischnerLines", "IntralobularLines", "KerleyALine", "MosaicPattern", "GroundGlassOpacity", "Infiltrate", "Micronodule", "Opacity", "PhantomTumor", "Shadow", "AbnormalInterstitialPattern", "SmallIrregularOpacities", "SmallRoundedOpacities", "TreeInBudSign", "GranularPattern", "MiliaryPattern", "HaloSign", "AirBronchiologram", "AirBronchogram", "AirCrescent", "ReticulonodularPattern", "BeadedSeptumSign", "NodularPattern", "Pseudoplaque", "SignetRingSign", "Portacath", "ChestTube", "CentralLine", "KidneyStent", "SecondaryPulmonaryLobule", "PancreaticStent", "NippleRing", "Coin", "FiducialMark", "PrimaryComplex", "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", "Lucency", "MidlungWindow", "CarinaAngle", "CentrilobularStructures", "AnteriorJunctionLine", "PosteriorJunctionLine", "Interface", "Line", ], "SCT": [ "SubclavianVein", "SternocleidomastoidMuscle", "PulmonaryValve", "ProximalRightCoronaryArtery", "ErectorSpinaeMuscle", "MidCircumflexCoronaryArtery", "Prosthesis", "IntermediateArteryRamus", "SubscapularisMuscle", "EndotrachealTube", "LymphNode", "TrapeziusMuscle", "IntercostalArtery", "Esophagus", "PlateLikeAtelectasis", "ScarTissue", "TeresMajorMuscle", "LeftMainBronchus", "MidRightCoronaryArtery", "PulmonaryVein", "SubclavianArtery", "EsophagealHiatus", "_3rdLeftPosterolateralCoronaryArtery", "HeartValveProsthesis", "PectoralisMajorMuscle", "LeftMainCoronaryArteryOstium", "Tracheotomy", "Sternum", "Staple", "LeftPosteriorDescendingCircumflexCoronaryArtery", "_1stMarginalCoronaryArtery", "Pin", "PulmonaryArtery", "MidLeftAnteriorDescendingCoronaryArtery", "Thyroid", "CoronaryArteryGraft", "MitralValve", "SupraspinatusMuscle", "AxillaryFascia", "ExternalIntercostalMuscle", "InfraspinatusMuscle", "TricuspidValve", "Nodule", "FissureOfLung", "LevatoresCostarumMuscles", "SuperiorPhrenicArtery", "DistalLeftAnteriorDescendingCoronaryArtery", "AtrialSeptalDefect", "Catheter", "Ventricle", "RightCoronaryArteryOstium", "DescendingAorta", "MarginalCoronaryArtery", "InternalThoracicArtery", "ProximalLeftAnteriorDescendingCoronaryArtery", "Bullet", "Spine", "BronchialArtery", "PosterolateralBranchOfRightCoronaryArtery", "BrachiocephalicVein", "ProximalCircumflexCoronaryArtery", "VenaCavaFilter", "_2ndMarginalCoronaryArtery", "Needle", "Carina", "AorticArch", "PulmonaryEmbolism", "CarotidBody", "Heart", "AirwayStructure", "DeltoidMuscle", "LeftMainCoronaryArtery", "InternalIntercostalMuscle", "UretericStent", "_1stDiagonalCoronaryArtery", "InteratrialSeptum", "Scapula", "IliocostalisMuscle", "_1stRightPosterolateralCoronaryArtery", "Suture", "RightPosteriorAVCoronaryArtery", "FascialLayer", "InferiorVenaCava", "Jewelry", "ThymusGland", "SubcostalMuscle", "Humerus", "DistalRightCoronaryArtery", "Mass", "LeftAnteriorDescendingCoronaryArtery", "CommonCarotidArtery", "InnermostIntercostalMuscles", "_3rdMarginalCoronaryArtery", "PectoralisMinorMuscle", "EsophagealArtery", "LatissimusDorsiMuscle", "CervicalCollar", "Trachea", "LeftPosterolateralCircumflexCoronaryArtery", "Bronchus", "ExternalJugularVein", "DorsalScapularArtery", "FeedingTube", "SuperiorVenaCava", "CostalCartilage", "BrachiocephalicTrunk", "_2ndRightPosterolateralCoronaryArtery", "PulmonaryTrunk", "AzygosVein", "BrachialArtery", "_2ndDiagonalCoronaryArtery", "DistalCircumflexCoronaryArtery", "Rib", "TeresMinorMuscle", "LongissimusMuscle", "SerratusAnteriorMuscle", "Clavicle", "AirTrapping", "AorticIsthmus", "Vertebra", "_1stLeftPosterolateralCoronaryArtery", "Pneumothorax", "CircumflexCoronaryArtery", "Diaphragm", "AxillaryArtery", "LeftCoronaryArtery", "VertebralArtery", "_3rdDiagonalCoronaryArtery", "SpinalisMuscle", "InternalJugularVein", "ChordaeTendineaeCordis", "RightMainBronchus", "ScalenousAnteriorMuscle", "CardiacPacemakerLead", "AVGrooveContinuationOfCircumflexArtery", "TrabeculaeCarnae", "_3rdRightPosterolateralCoronaryArtery", "ThyrocervicalTrunk", "InferiorPhrenicArtery", "JejunostomyTube", "HilumOfLung", "ThoracicDuct", "CoinLesion", "TransversusThoracis", "InterventricularSeptum", "_2ndLeftPosterolateralCoronaryArtery", "PosteriorDescendingRightCoronaryArtery", "_1stSeptalCoronaryArtery", "RightCoronaryArtery", "AscendingAorta", "PericardiophrenicArtery", "CardiacPacemaker", "CostocervicalTrunk", "AxillaryVein", "LigamentumArteriosum", "SegmentOfLung", "Pneumomediastinum", "LobeOfLung", ], } name_for_cid[6103] = "AbnormalLinesFindingorFeature" cid_concepts[6103] = { "DCM": [ "ReticulonodularPattern", "KerleyBLine", "KerleyCLines", "ParenchymalBand", "ReticularPattern", "SeptalLines", "AirFluidLevel", "SubpleuralLine", "CoronaRadiata", "TramlineShadow", "HoneycombPattern", "TubularShadow", "FleischnerLines", "IntralobularLines", "KerleyALine", ], "SCT": ["PlateLikeAtelectasis"], } name_for_cid[6104] = "AbnormalOpacityFindingorFeature" cid_concepts[6104] = { "DCM": [ "ReticulonodularPattern", "GroundGlassOpacity", "BeadedSeptumSign", "Infiltrate", "NodularPattern", "Micronodule", "Opacity", "Pseudoplaque", "PhantomTumor", "SignetRingSign", "Shadow", "PrimaryComplex", "AbnormalInterstitialPattern", "SmallIrregularOpacities", "SmallRoundedOpacities", "TreeInBudSign", "Density", "DependentOpacity", ], "SCT": ["Mass", "PulmonaryEmbolism", "Nodule", "CoinLesion"], } name_for_cid[6105] = "AbnormalLucencyFindingorFeature" cid_concepts[6105] = { "DCM": ["HaloSign", "AirBronchiologram", "AirBronchogram", "AirCrescent"], "SCT": ["Pneumothorax", "AirTrapping", "Pneumomediastinum"], } name_for_cid[6106] = "AbnormalTextureFindingorFeature" cid_concepts[6106] = { "DCM": [ "MosaicPattern", "ReticulonodularPattern", "NodularPattern", "ReticularPattern", "AbnormalInterstitialPattern", "SmallIrregularOpacities", "GranularPattern", "HoneycombPattern", "MiliaryPattern", ] } name_for_cid[6107] = "WidthDescriptor" cid_concepts[6107] = { "DCM": ["Vasoconstriction", "Vasodilation"], "SCT": ["Narrow", "Enlarged"], } name_for_cid[6108] = "ChestAnatomicStructureAbnormalDistribution" cid_concepts[6108] = { "DCM": ["ArchitecturalDistortion", "MosaicPerfusion", "Pleonemia", "Oligemia"], "SCT": ["AirTrapping"], } name_for_cid[6109] = "RadiographicAnatomyFindingorFeature" cid_concepts[6109] = { "BARI": [ "_1stDiagonalCoronaryArteryLaterals", "_1stMarginalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", ], "DCM": [ "AorticKnob", "ArchOfTheAzygosVein", "SecondaryPulmonaryLobule", "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", "Lucency", "MidlungWindow", "CarinaAngle", "CentrilobularStructures", "AnteriorJunctionLine", "PosteriorJunctionLine", "Interface", "Line", ], "SCT": [ "SubclavianVein", "SternocleidomastoidMuscle", "PulmonaryValve", "ProximalRightCoronaryArtery", "RightPosteriorAVCoronaryArtery", "FascialLayer", "ErectorSpinaeMuscle", "MidCircumflexCoronaryArtery", "InferiorVenaCava", "IntermediateArteryRamus", "ThymusGland", "SubcostalMuscle", "Humerus", "SubscapularisMuscle", "LymphNode", "TrapeziusMuscle", "DistalRightCoronaryArtery", "IntercostalArtery", "Esophagus", "LeftAnteriorDescendingCoronaryArtery", "CommonCarotidArtery", "InnermostIntercostalMuscles", "TeresMajorMuscle", "LeftMainBronchus", "_3rdMarginalCoronaryArtery", "PectoralisMinorMuscle", "MidRightCoronaryArtery", "EsophagealArtery", "PulmonaryVein", "LatissimusDorsiMuscle", "Trachea", "SubclavianArtery", "LeftPosterolateralCircumflexCoronaryArtery", "EsophagealHiatus", "_3rdLeftPosterolateralCoronaryArtery", "Bronchus", "ExternalJugularVein", "PectoralisMajorMuscle", "DorsalScapularArtery", "LeftMainCoronaryArteryOstium", "SuperiorVenaCava", "Sternum", "CostalCartilage", "BrachiocephalicTrunk", "_2ndRightPosterolateralCoronaryArtery", "LeftPosteriorDescendingCircumflexCoronaryArtery", "_1stMarginalCoronaryArtery", "PulmonaryTrunk", "AzygosVein", "PulmonaryArtery", "BrachialArtery", "_2ndDiagonalCoronaryArtery", "DistalCircumflexCoronaryArtery", "MidLeftAnteriorDescendingCoronaryArtery", "Thyroid", "Rib", "CoronaryArteryGraft", "TeresMinorMuscle", "MitralValve", "LongissimusMuscle", "SerratusAnteriorMuscle", "SupraspinatusMuscle", "Clavicle", "AorticIsthmus", "AxillaryFascia", "Vertebra", "ExternalIntercostalMuscle", "_1stLeftPosterolateralCoronaryArtery", "InfraspinatusMuscle", "TricuspidValve", "CircumflexCoronaryArtery", "Diaphragm", "FissureOfLung", "LevatoresCostarumMuscles", "SuperiorPhrenicArtery", "DistalLeftAnteriorDescendingCoronaryArtery", "AtrialSeptalDefect", "Ventricle", "RightCoronaryArteryOstium", "AxillaryArtery", "LeftCoronaryArtery", "DescendingAorta", "MarginalCoronaryArtery", "InternalThoracicArtery", "VertebralArtery", "ProximalLeftAnteriorDescendingCoronaryArtery", "_3rdDiagonalCoronaryArtery", "SpinalisMuscle", "InternalJugularVein", "Spine", "BronchialArtery", "ChordaeTendineaeCordis", "RightMainBronchus", "ScalenousAnteriorMuscle", "AVGrooveContinuationOfCircumflexArtery", "TrabeculaeCarnae", "_3rdRightPosterolateralCoronaryArtery", "ThyrocervicalTrunk", "PosterolateralBranchOfRightCoronaryArtery", "InferiorPhrenicArtery", "BrachiocephalicVein", "HilumOfLung", "ProximalCircumflexCoronaryArtery", "_2ndMarginalCoronaryArtery", "ThoracicDuct", "Carina", "AorticArch", "CarotidBody", "Heart", "AirwayStructure", "TransversusThoracis", "DeltoidMuscle", "InterventricularSeptum", "LeftMainCoronaryArtery", "_2ndLeftPosterolateralCoronaryArtery", "PosteriorDescendingRightCoronaryArtery", "InternalIntercostalMuscle", "_1stSeptalCoronaryArtery", "RightCoronaryArtery", "AscendingAorta", "_1stDiagonalCoronaryArtery", "PericardiophrenicArtery", "InteratrialSeptum", "CostocervicalTrunk", "AxillaryVein", "LigamentumArteriosum", "Scapula", "SegmentOfLung", "IliocostalisMuscle", "_1stRightPosterolateralCoronaryArtery", "LobeOfLung", ], } name_for_cid[6110] = "LungAnatomyFindingorFeature" cid_concepts[6110] = { "DCM": ["MidlungWindow", "SecondaryPulmonaryLobule"], "SCT": ["SegmentOfLung", "LobeOfLung"], } name_for_cid[6111] = "BronchovascularAnatomyFindingorFeature" cid_concepts[6111] = { "DCM": ["CarinaAngle", "CentrilobularStructures"], "SCT": ["HilumOfLung", "AirwayStructure", "Carina", "Bronchus"], } name_for_cid[6112] = "PleuraAnatomyFindingorFeature" cid_concepts[6112] = { "DCM": ["AnteriorJunctionLine", "PosteriorJunctionLine"], "SCT": ["FissureOfLung"], } name_for_cid[6113] = "MediastinumAnatomyFindingorFeature" cid_concepts[6113] = { "DCM": [ "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", ], "SCT": [ "PulmonaryValve", "FascialLayer", "ThoracicDuct", "AxillaryFascia", "Carina", "CarotidBody", "TricuspidValve", "Heart", "ThymusGland", "AtrialSeptalDefect", "LymphNode", "CostalCartilage", "Ventricle", "TrapeziusMuscle", "Esophagus", "LeftMainBronchus", "RightMainBronchus", "Thyroid", "LigamentumArteriosum", "Trachea", "MitralValve", "EsophagealHiatus", ], } name_for_cid[6114] = "OsseousAnatomyFindingorFeature" cid_concepts[6114] = { "SCT": ["Clavicle", "Rib", "Humerus", "Scapula", "Vertebra", "Spine", "Sternum"] } name_for_cid[6115] = "OsseousAnatomyModifier" cid_concepts[6115] = { "DCM": [ "RibScaleneTubercle", "VertebralIntervertebralNotch", "SubscapularFossa", "ScapularSpine", "ScapularSupraspinatusFossa", "ScapularInfraspinatusFossa", ], "SCT": [ "VertebralForamen", "InferiorArticularFacetOfAxis", "DorsalAspectOfScapula", "GlenoidCavityOfScapula", "SpinousProcessOfVertebra", "TubercleOfRib", "SuperiorArticularProcessOfVertebra", "BodyOfSternum", "AngleOfRib", "InferiorArticularProcessOfVertebra", "ManubriumOfSternum", "SuperiorArticularFacetOfAxis", "PedicleOfVertebra", "AcromionProcessOfScapula", "HeadOfRib", "TransverseProcessOrVertebra", "LaminaOfVertebra", "ArchOfVertebra", "NeckOfRib", "ShaftOfRib", "SuprasternalNotch", "CoracoidProcessOfScapula", "XiphoidProcessOfSternum", "SternalAngle", "PectoralGirdle", "CostalGroove", "VertebralCanal", "ClavicularNotchOfSternum", ], } name_for_cid[6116] = "MuscularAnatomy" cid_concepts[6116] = { "SCT": [ "SternocleidomastoidMuscle", "ErectorSpinaeMuscle", "ExternalIntercostalMuscle", "PectoralisMajorMuscle", "InfraspinatusMuscle", "Diaphragm", "LevatoresCostarumMuscles", "SubcostalMuscle", "SubscapularisMuscle", "TransversusThoracis", "DeltoidMuscle", "InterventricularSeptum", "TrapeziusMuscle", "InternalIntercostalMuscle", "InnermostIntercostalMuscles", "TeresMajorMuscle", "SpinalisMuscle", "PectoralisMinorMuscle", "ChordaeTendineaeCordis", "InteratrialSeptum", "ScalenousAnteriorMuscle", "TeresMinorMuscle", "LatissimusDorsiMuscle", "TrabeculaeCarnae", "IliocostalisMuscle", "LongissimusMuscle", "SerratusAnteriorMuscle", "SupraspinatusMuscle", ] } name_for_cid[6117] = "VascularAnatomy" cid_concepts[6117] = { "BARI": [ "_2ndMarginalCoronaryArteryLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_1stMarginalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "PosteriorDescendingSeptalPerforators", ], "DCM": ["AorticKnob", "ArchOfTheAzygosVein"], "SCT": [ "SubclavianVein", "ProximalRightCoronaryArtery", "RightPosteriorAVCoronaryArtery", "AorticIsthmus", "MidCircumflexCoronaryArtery", "InferiorVenaCava", "_1stLeftPosterolateralCoronaryArtery", "IntermediateArteryRamus", "CircumflexCoronaryArtery", "SuperiorPhrenicArtery", "DistalLeftAnteriorDescendingCoronaryArtery", "RightCoronaryArteryOstium", "AxillaryArtery", "LeftCoronaryArtery", "DescendingAorta", "DistalRightCoronaryArtery", "MarginalCoronaryArtery", "IntercostalArtery", "InternalThoracicArtery", "LeftAnteriorDescendingCoronaryArtery", "VertebralArtery", "ProximalLeftAnteriorDescendingCoronaryArtery", "CommonCarotidArtery", "_3rdDiagonalCoronaryArtery", "InternalJugularVein", "_3rdMarginalCoronaryArtery", "BronchialArtery", "MidRightCoronaryArtery", "EsophagealArtery", "AVGrooveContinuationOfCircumflexArtery", "PulmonaryVein", "SubclavianArtery", "LeftPosterolateralCircumflexCoronaryArtery", "_3rdRightPosterolateralCoronaryArtery", "ThyrocervicalTrunk", "PosterolateralBranchOfRightCoronaryArtery", "InferiorPhrenicArtery", "BrachiocephalicVein", "_3rdLeftPosterolateralCoronaryArtery", "ProximalCircumflexCoronaryArtery", "_2ndMarginalCoronaryArtery", "AorticArch", "ExternalJugularVein", "DorsalScapularArtery", "LeftMainCoronaryArteryOstium", "SuperiorVenaCava", "LeftMainCoronaryArtery", "_2ndLeftPosterolateralCoronaryArtery", "BrachiocephalicTrunk", "_2ndRightPosterolateralCoronaryArtery", "PosteriorDescendingRightCoronaryArtery", "LeftPosteriorDescendingCircumflexCoronaryArtery", "_1stMarginalCoronaryArtery", "PulmonaryTrunk", "_1stSeptalCoronaryArtery", "RightCoronaryArtery", "AscendingAorta", "AzygosVein", "_1stDiagonalCoronaryArtery", "PericardiophrenicArtery", "PulmonaryArtery", "BrachialArtery", "_2ndDiagonalCoronaryArtery", "CostocervicalTrunk", "DistalCircumflexCoronaryArtery", "MidLeftAnteriorDescendingCoronaryArtery", "AxillaryVein", "CoronaryArteryGraft", "_1stRightPosterolateralCoronaryArtery", ], } name_for_cid[6118] = "SizeDescriptor" cid_concepts[6118] = { "DCM": ["ExtremelySmall", "VerySmall", "TooSmall"], "SCT": ["Medium", "Enlarged", "Small", "Large"], } name_for_cid[6119] = "ChestBorderShape" cid_concepts[6119] = { "DCM": ["Elliptic", "Lobulated", "Spiculated"], "SCT": ["RoundShape", "Irregular"], } name_for_cid[6120] = "ChestBorderDefinition" cid_concepts[6120] = { "DCM": [ "SharplyDemarcated", "PoorlyDemarcated", "SharplyDefined", "DistinctlyDefined", "WellDemarcated", ], "SCT": ["PoorlyDefined", "WellDefined", "Circumscribed"], } name_for_cid[6121] = "ChestOrientationDescriptor" cid_concepts[6121] = {"SCT": ["Horizontal", "Vertical", "Oblique"]} name_for_cid[6122] = "ChestContentDescriptor" cid_concepts[6122] = { "DCM": ["Air", "Calcium"], "SCT": ["SoftTissue", "ForeignMaterialIodizedOilMercuryTalc", "Fat"], } name_for_cid[6123] = "ChestOpacityDescriptor" cid_concepts[6123] = { "DCM": [ "Linear", "Profusion", "SilhouetteSign", "Acinar", "AirSpace", "Fibronodular", "Fluffy", ] } name_for_cid[6124] = "LocationinChest" cid_concepts[6124] = { "SCT": [ "Peripheral", "Basal", "LowerLobeOfLung", "Central", "Subpleural", "AnteriorSegmentOfRightUpperLobe", "UpperZoneOfLung", "LowerZoneOfLung", "MiddleLobeOfRightLung", "Apical", "PosteriorSegmentOfRightUpperLobe", "MiddleZoneOfLung", "AnteriorSegmentOfLeftUpperLobe", "UpperLobeOfLung", ] } name_for_cid[6125] = "GeneralChestLocation" cid_concepts[6125] = {"SCT": ["Peripheral", "Basal", "Central", "Apical"]} name_for_cid[6126] = "LocationinLung" cid_concepts[6126] = { "SCT": [ "LowerLobeOfLung", "Subpleural", "UpperZoneOfLung", "LowerZoneOfLung", "MiddleLobeOfRightLung", "UpperLobeOfLung", "MiddleZoneOfLung", ] } name_for_cid[6127] = "SegmentLocationinLung" cid_concepts[6127] = { "SCT": [ "AnteriorSegmentOfLeftUpperLobe", "AnteriorSegmentOfRightUpperLobe", "PosteriorSegmentOfRightUpperLobe", ] } name_for_cid[6128] = "ChestDistributionDescriptor" cid_concepts[6128] = { "DCM": [ "BatWingDistribution", "ButterflyDistribution", "Centrilobular", "Coalescent", "Lobar", ], "SCT": [ "Discoid", "Focal", "Generalized", "Multifocal", "Disseminated", "Systemic", "Diffuse", "Segmental", ], } name_for_cid[6129] = "ChestSiteInvolvement" cid_concepts[6129] = { "DCM": ["Lobar"], "SCT": [ "Lung", "HilumOfLung", "Mediastinum", "PleuralStructure", "ChestWall", "UpperAbdomen", "InterstitialTissue", "Bronchial", "Aorta", ], } name_for_cid[6130] = "SeverityDescriptor" cid_concepts[6130] = { "DCM": ["HyperAcute"], "SCT": ["Moderate", "Mild", "SuddenOnset", "Chronic", "Subacute", "Severe"], } name_for_cid[6131] = "ChestTextureDescriptor" cid_concepts[6131] = {"DCM": ["Inhomogeneous", "Homogeneous"]} name_for_cid[6132] = "ChestCalcificationDescriptor" cid_concepts[6132] = { "DCM": ["Target", "Fibrocalcific", "Flocculent"], "SCT": [ "Nodular", "Ossification", "Laminated", "CoarsePopcornLikeCalcification", "EggshellCalcification", ], } name_for_cid[6133] = "ChestQuantitativeTemporalDifferenceType" cid_concepts[6133] = { "SCT": ["FindingOfDifferenceInLocation", "FindingOfDifferenceInSize"] } name_for_cid[6134] = "ChestQualitativeTemporalDifferenceType" cid_concepts[6134] = { "SCT": [ "DifferenceInBorderDefinition", "DifferenceInDistribution", "NoSignificantChangesInTheFinding", "IncreaseInSize", "DifferenceInTexture", "DifferenceInBorderShape", "DifferenceInSiteInvolvement", "DifferenceInSubstance", "LessDefined", "FindingPartiallyRemoved", "MoreDefined", "DecreaseInSize", ] } name_for_cid[6135] = "ImageQualityFinding" cid_concepts[6135] = { "DCM": [ "OtherFailure", "MotionBlur", "UnknownFailure", "UnderExposed", "Positioning", "OverExposed", "NoImage", "DetectorArtifacts", "ArtifactsOtherThanGridOrDetectorArtifact", "MechanicalFailure", "ElectricalFailure", "SoftwareFailure", "GridArtifacts", "InappropriateImageProcessing", ], "RADLEX": ["BeamHardeningArtifact"], } name_for_cid[6136] = "ChestTypesofQualityControlStandard" cid_concepts[6136] = { "DCM": [ "PerformanceOfPediatricAndAdultThoracicCT", "PerformanceOfCTForDetectionOfPulmonaryEmbolismInAdults", "InstitutionallyDefinedQualityControlStandard", "PerformanceOfHighResolutionCTOfTheLungsInAdults", "PerformanceOfPediatricAndAdultChestRadiographyACR", "ACRPositionStatement", ] } name_for_cid[6137] = "CADAnalysisType" cid_concepts[6137] = { "SCT": [ "SpatialCollocationAnalysis", "SpatialProximityAnalysis", "TemporalCorrelation", "ImageQualityAnalysis", ] } name_for_cid[6138] = "ChestNonlesionObjectType" cid_concepts[6138] = { "DCM": [ "Portacath", "ChestTube", "CentralLine", "KidneyStent", "PancreaticStent", "NippleRing", "Coin", "FiducialMark", ], "SCT": [ "JejunostomyTube", "Suture", "VenaCavaFilter", "HeartValveProsthesis", "Needle", "Jewelry", "Prosthesis", "FeedingTube", "Catheter", "EndotrachealTube", "Tracheotomy", "Staple", "ScarTissue", "UretericStent", "Bullet", "Pin", "CardiacPacemaker", "CardiacPacemakerLead", "CervicalCollar", ], } name_for_cid[6139] = "NonlesionModifier" cid_concepts[6139] = {"SCT": ["External", "Internal"]} name_for_cid[6140] = "CalculationMethod" cid_concepts[6140] = { "DCM": [ "UnspecifiedMethodOfCalculation", "AgatstonScoringMethod", "VolumeScoringMethod", "TwoDimensionalMethod", "MassScoringMethod", "ThreeDimensionalMethod", ], "SCT": ["Estimated"], } name_for_cid[6141] = "AttenuationCoefficientMeasurement" cid_concepts[6141] = { "DCM": [ "StandardDeviationOfAttenuationCoefficient", "AttenuationCoefficient", "MinimumAttenuationCoefficient", "MaximumAttenuationCoefficient", "MeanAttenuationCoefficient", "MedianAttenuationCoefficient", ] } name_for_cid[6142] = "CalculatedValue" cid_concepts[6142] = { "DCM": [ "MassOfParenchymalTissue", "MassOfBreast", "AreaOfVascularCalcification", "VolumeOfVascularCalcification", "PercentageOfVascularCalcification", "MassOfVascularCalcification", "AverageCalcificationDistanceInACalcificationCluster", "StandardDeviationDistanceOfCalcificationsInACluster", "BreastTissueDensity", "VolumeOfParenchymalTissue", "VolumeOfBreast", "CavityExtentAsPercentOfVolume", "CalcificationExtentAsPercentOfSurface", "CalcificationExtentAsPercentOfVolume", ], "SCT": ["CoronaryArteryCalciumScore"], } name_for_cid[6143] = "LesionResponse" cid_concepts[6143] = { "DCM": [ "TargetLesionCompleteResponse", "TargetLesionPartialResponse", "TargetLesionProgressiveDisease", "TargetLesionStableDisease", "NonTargetLesionCompleteResponse", "NonTargetLesionIncompleteResponseOrStableDisease", "NonTargetLesionProgressiveDisease", ] } name_for_cid[6144] = "RECISTDefinedLesionResponse" cid_concepts[6144] = { "DCM": [ "TargetLesionCompleteResponse", "TargetLesionPartialResponse", "TargetLesionProgressiveDisease", "TargetLesionStableDisease", "NonTargetLesionCompleteResponse", "NonTargetLesionIncompleteResponseOrStableDisease", "NonTargetLesionProgressiveDisease", ] } name_for_cid[6145] = "BaselineCategory" cid_concepts[6145] = { "DCM": [ "TargetLesionAtBaseline", "NonTargetLesionAtBaseline", "NonLesionAtBaseline", ] } name_for_cid[6146] = "TimePointType" cid_concepts[6146] = { "DCM": ["Posttreatment", "Eligibility"], "SCT": [ "RecurrenceOfTumor", "MaintenanceTherapy", "PreOperative", "PostOperative", "PostRadiation", "PostChemotherapy", ], "UMLS": ["Unscheduled", "Baseline", "Pretreatment", "Nadir"], } name_for_cid[6147] = "ResponseCriteria" cid_concepts[6147] = { "DCM": ["RECIST1Point0", "RECIST1Point1", "WHO"], "NCIt": ["RANO"], } name_for_cid[6148] = "MediastinumFindingorFeature" cid_concepts[6148] = { "DCM": [ "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", ], "SCT": ["FascialLayer", "AtrialSeptalDefect"], } name_for_cid[6149] = "MediastinumAnatomy" cid_concepts[6149] = { "SCT": [ "PulmonaryValve", "Esophagus", "ThoracicDuct", "AxillaryFascia", "Carina", "LeftMainBronchus", "CarotidBody", "TricuspidValve", "RightMainBronchus", "Heart", "ThymusGland", "Thyroid", "LigamentumArteriosum", "LymphNode", "Trachea", "MitralValve", "CostalCartilage", "EsophagealHiatus", "Ventricle", "TrapeziusMuscle", ] } name_for_cid[6151] = "BackgroundEchotexture" cid_concepts[6151] = { "DCM": [ "HomogeneousFatEchotexture", "HomogeneousFibroglandularEchotexture", "HeterogeneousEchotexture", ] } name_for_cid[6152] = "Orientation" cid_concepts[6152] = {"DCM": ["Parallel", "NotParallel"]} name_for_cid[6153] = "LesionBoundary" cid_concepts[6153] = {"DCM": ["AbruptInterface", "EchogenicHalo"]} name_for_cid[6154] = "EchoPattern" cid_concepts[6154] = { "DCM": ["Anechoic", "Hyperechoic", "Complex", "Hypoechoic", "Isoechoic"] } name_for_cid[6155] = "PosteriorAcousticFeature" cid_concepts[6155] = { "DCM": [ "CombinedPosteriorEnhancementAndShadowing", "NoPosteriorAcousticFeatures", "PosteriorEnhancement", "PosteriorShadowing", ] } name_for_cid[6157] = "Vascularity" cid_concepts[6157] = { "DCM": [ "VascularityNotPresent", "VascularityNotAssessed", "VascularityPresentInLesion", "VascularityPresentImmediatelyAdjacentToLesion", "DiffuselyIncreasedVascularityInSurroundingTissue", ] } name_for_cid[6158] = "CorrelationtoOtherFinding" cid_concepts[6158] = { "DCM": [ "CorrelatesToPhysicalExaminationFindings", "CorrelatesToMammographyFindings", "CorrelatesToMRIFindings", "CorrelatesToUltrasoundFindings", "CorrelatesToOtherImagingFindings", "NoCorrelationToOtherImagingFindings", "NoCorrelationToClinicalFindings", ] } name_for_cid[6159] = "MalignancyType" cid_concepts[6159] = { "DCM": ["InvasiveBreastCarcinoma", "OtherMalignancyType"], "SCT": ["NonInfiltratingIntraductalCarcinoma"], } name_for_cid[6160] = "BreastPrimaryTumorAssessmentFromAJCC" cid_concepts[6160] = { "SCT": [ "Pt3", "Ptx", "Ptis", "Pt4b", "Pt0", "Pt4c", "Pt1", "Pt1a", "Pt4a", "PtisDCIS", "Pt4", "Pt4d", "Pt2", "PtisPaget", "Pt1mi", "Pt1b", "Pt1c", ] } name_for_cid[6161] = "PathologicalRegionalLymphNodeAssessmentforBreast" cid_concepts[6161] = { "SCT": ["Pn3b", "Pn0", "Pn2a", "Pn2", "Pn3", "Pn1", "Pn3c", "Pn3a", "Pnx", "Pn2b"] } name_for_cid[6162] = "AssessmentofMetastasisforBreast" cid_concepts[6162] = {"SCT": ["Cm0", "MX", "Pm1"]} name_for_cid[6163] = "MenstrualCyclePhase" cid_concepts[6163] = { "DCM": ["_1stWeek", "_2ndWeek", "_3rdWeek"], "SCT": ["MenstruationPresent"], } name_for_cid[6164] = "TimeInterval" cid_concepts[6164] = { "DCM": [ "LesserThan3MonthsAgo", "_4MonthsTo1YearAgo", "GreaterThan1YearAgo", "NotSure", ] } name_for_cid[6165] = "BreastLinearMeasurement" cid_concepts[6165] = { "DCM": [ "Distance", "Height", "LineSegmentLength", "DistanceFromChestWall", "PathLength", "DistanceFromNipple", "DistanceFromSkin", ], "IBSI": [ "LeastAxisIn3DLength", "MinorAxisIn3DLength", "MajorAxisIn3DLength", "Maximum3DDiameterOfAMesh", ], "SCT": [ "DiameterOfCircumscribedCircle", "Radius", "Perimeter", "MinorAxis", "Width", "Diameter", "MajorAxis", "PerpendicularAxis", "LongAxis", "Depth", "ShortAxis", "Length", "Circumference", ], } name_for_cid[6166] = "CADGeometrySecondaryGraphicalRepresentation" cid_concepts[6166] = { "DCM": [ "OrthogonalLocationArcInnerMargin", "OrthogonalLocationArcOuterMargin", "OutlineOfLobulations", "InnerLimitsOfFuzzyMargin", "OuterLimitsOfFuzzyMargin", "OutlineOfSpiculations", "LinearSpiculation", "PixelatedSpiculations", "OrthogonalLocationArc", ], "SCT": ["LongAxis", "ShortAxis"], } name_for_cid[6170] = "LobeofLung" cid_concepts[6170] = { "SCT": ["LowerLobeOfLung", "MiddleLobeOfRightLung", "UpperLobeOfLung"] } name_for_cid[6171] = "ZoneofLung" cid_concepts[6171] = {"SCT": ["UpperZoneOfLung", "LowerZoneOfLung", "MiddleZoneOfLung"]} name_for_cid[6200] = "ColonOverallAssessment" cid_concepts[6200] = { "DCM": [ "C0InadequateStudyAwaitingPriorComparisons", "C1NormalColonOrBenignLesion", "C2IntermediatePolypOrIndeterminateFinding", "C3PolypPossiblyAdvancedAdenoma", "C4ColonicMassLikelyMalignant", ] } name_for_cid[6201] = "ColonFindingorFeature" cid_concepts[6201] = { "DCM": ["ImageQuality", "SelectedRegion", "NonLesion", "AnatomicNonColon"], "SCT": [ "InvertedDiverticulum", "Lipoma", "IleocecalValve", "TumorOfColon", "Diverticulum", "Feces", "ContrastMedia", "IntraluminalFluid", "RectalMass", "OperativeSite", "PolypOfColon", "ColonicHaustra", ], } name_for_cid[6202] = "ColonFindingorFeatureModifier" cid_concepts[6202] = { "DCM": ["ChestTube", "KidneyStent", "PancreaticStent", "Coin", "FiducialMark"], "SCT": [ "JejunostomyTube", "Suture", "Lung", "IleostomyBag", "ColostomyBag", "VenaCavaFilter", "UrostomyBag", "StomaAppliance", "Appendix", "Needle", "InferiorVenaCava", "Prosthesis", "Jewelry", "RectalTube", "Bone", "Prostate", "Catheter", "Uterus", "Staple", "Testis", "UrethralCatheter", "Cervix", "Bladder", "ScarTissue", "UreteralStent", "Bullet", "BloodVessel", "Pin", "Aorta", "SeminalVesicle", "Rectum", "Ovary", "AppendicealStump", "Muscle", "Liver", "Spleen", "Kidney", "AdrenalGland", ], } name_for_cid[6203] = "ColonNonlesionObjectType" cid_concepts[6203] = { "DCM": ["ChestTube", "KidneyStent", "PancreaticStent", "Coin", "FiducialMark"], "SCT": [ "JejunostomyTube", "Suture", "IleostomyBag", "UrethralCatheter", "ColostomyBag", "VenaCavaFilter", "UrostomyBag", "StomaAppliance", "ScarTissue", "UreteralStent", "Needle", "Bullet", "Pin", "Prosthesis", "Jewelry", "RectalTube", "Catheter", "Staple", ], } name_for_cid[6204] = "AnatomicNoncolonFinding" cid_concepts[6204] = { "SCT": [ "Lung", "Testis", "Cervix", "Bladder", "Appendix", "BloodVessel", "Aorta", "InferiorVenaCava", "SeminalVesicle", "Rectum", "Ovary", "AppendicealStump", "Muscle", "Bone", "Liver", "Prostate", "Spleen", "Kidney", "AdrenalGland", "Uterus", ] } name_for_cid[6205] = "ClockfaceLocationforColon" cid_concepts[6205] = { "SCT": [ "_7OClockPosition", "_11OClockPosition", "_12OClockPosition", "_2OClockPosition", "_5OClockPosition", "_3OClockPosition", "_6OClockPosition", "_4OClockPosition", "_9OClockPosition", "_10OClockPosition", "_1OClockPosition", "_8OClockPosition", ] } name_for_cid[6206] = "RecumbentPatientOrientationforColon" cid_concepts[6206] = { "SCT": ["LeftLateralDecubitus", "Supine", "RightLateralDecubitus", "Prone"] } name_for_cid[6207] = "ColonQuantitativeTemporalDifferenceType" cid_concepts[6207] = { "SCT": [ "FindingOfDifferenceInLocation", "DifferenceInAttenuation", "FindingOfDifferenceInSize", ] } name_for_cid[6208] = "ColonTypesofQualityControlStandard" cid_concepts[6208] = { "DCM": [ "InstitutionallyDefinedQualityControlStandard", "ACRPositionStatement", "ACRGuidelinePerformanceOfAdultCTColonography", "ACRStandardCTMedicalPhysicsPerformanceMonitoring", ] } name_for_cid[6209] = "ColonMorphologyDescriptor" cid_concepts[6209] = { "SCT": ["Circumferential", "Sessile", "Flat", "Ulcer", "Pedunculated"] } name_for_cid[6210] = "LocationinIntestinalTract" cid_concepts[6210] = { "SCT": [ "Rectum", "SigmoidColon", "DescendingColon", "TransverseColon", "SplenicFlexureOfColon", "Cecum", "AscendingColon", "HepaticFlexureOfColon", ] } name_for_cid[6211] = "ColonCADMaterialDescription" cid_concepts[6211] = {"SCT": ["SoftTissue", "BoneMatrix", "Air", "Fat"]} name_for_cid[6212] = "CalculatedValueforColonFinding" cid_concepts[6212] = { "DCM": ["PolypStalkWidth", "DistanceFromAnus"], "SCT": ["PolypSizeLargestDimension", "PolypStalkLength"], } name_for_cid[6300] = "ProstateAnatomy" cid_concepts[6300] = { "SCT": [ "LeftBasalPeripheralZoneOfProstate", "TransitionZoneOfTheProstate", "LeftPosteromedialBasalPeripheralZoneOfProstate", "MaleExternalUrethralSphincter", "RightApicalAnteriorFibromuscularStromaOfProstate", "LeftPosteromedialApicalPeripheralZoneOfProstate", "LeftPosterolateralMiddlePeripheralZoneOfProstate", "RightBasalTransitionZoneOfProstate", "LeftAnteriorApicalTransitionZoneOfProstate", "LeftMiddleTransitionZoneOfProstate", "LeftAnteriorBasalTransitionZoneOfProstate", "RightPosterolateralBasalPeripheralZoneOfProstate", "LeftApicalPeripheralZoneOfProstate", "LeftPosteriorMiddleTransitionZoneOfProstate", "LeftBasalAnteriorFibromuscularStromaOfProstate", "LeftPosterolateralApicalPeripheralZoneOfProstate", "RightSeminalVesicle", "RightPosteromedialMiddlePeripheralZoneOfProstate", "RightPosteromedialBasalPeripheralZoneOfProstate", "LeftApicalAnteriorFibromuscularStromaOfProstate", "RightBasalPeripheralZoneOfProstate", "RightPosteromedialApicalPeripheralZoneOfProstate", "BasalAnteriorFibromuscularStromaOfProstate", "LeftBasalPartTransitionZoneOfProstate", "PeripheralZoneOfTheProstate", "RightApicalPeripheralZoneOfProstate", "LeftPosterolateralBasalPeripheralZoneOfProstate", "RightPosterolateralApicalPeripheralZoneOfProstate", "RightPosteriorBasalTransitionZoneOfProstate", "RightAnteriorApicalTransitionZoneOfProstate", "LeftAnteriorMiddlePeripheralZoneOfProstate", "RightAnteriorMiddleTransitionZoneOfProstate", "RightLateralMiddlePeripheralZoneOfProstate", "AnteriorFibromuscularStromaOfProstate", "CentralZoneOfLeftHalfProstate", "LeftLateralMiddlePeripheralZoneOfProstate", "LeftPosteromedialMiddlePeripheralZoneOfProstate", "RightApicalTransitionZoneOfProstate", "RightBasalAnteriorFibromuscularStromaOfProstate", "MiddleAnteriorFibromuscularStromaOfProstate", "RightAnteriorBasalTransitionZoneOfProstate", "LeftPosteriorApicalTransitionZoneOfProstate", "LeftAnteriorMiddleTransitionZoneOfProstate", "Prostate", "LeftPosteriorBasalTransitionZoneOfProstate", "RightAnteriorBasalPeripheralZoneOfProstate", "LeftMiddleAnteriorFibromuscularStromaOfProstate", "LeftAnteriorApicalPeripheralZoneOfProstate", "CentralZoneOfRightHalfProstate", "RightAnteriorMiddlePeripheralZoneOfProstate", "RightPosterolateralMiddlePeripheralZoneOfProstate", "LeftApicalTransitionZoneOfProstate", "ApicalAnteriorFibromuscularStromaOfProstate", "LeftSeminalVesicle", "SeminalVesicle", "RightAnteriorApicalPeripheralZoneOfProstate", "LeftAnteriorBasalPeripheralZoneOfProstate", "RightMiddleAnteriorFibromuscularStromaOfProstate", "RightPosteriorMiddleTransitionZoneOfProstate", "RightPosteriorApicalTransitionZoneOfProstate", "RightMiddleTransitionZoneOfProstate", "ProstaticUrethra", ] } name_for_cid[6301] = "ProstateSectorAnatomyfromPIRADSv2" cid_concepts[6301] = { "SCT": [ "CentralZoneOfLeftHalfProstate", "LeftPosteromedialMiddlePeripheralZoneOfProstate", "MaleExternalUrethralSphincter", "RightApicalAnteriorFibromuscularStromaOfProstate", "LeftPosteromedialApicalPeripheralZoneOfProstate", "LeftPosterolateralMiddlePeripheralZoneOfProstate", "RightBasalAnteriorFibromuscularStromaOfProstate", "RightAnteriorBasalTransitionZoneOfProstate", "LeftAnteriorApicalTransitionZoneOfProstate", "LeftAnteriorBasalTransitionZoneOfProstate", "LeftPosteriorApicalTransitionZoneOfProstate", "RightPosterolateralBasalPeripheralZoneOfProstate", "LeftPosteriorMiddleTransitionZoneOfProstate", "LeftAnteriorMiddleTransitionZoneOfProstate", "LeftBasalAnteriorFibromuscularStromaOfProstate", "LeftPosteriorBasalTransitionZoneOfProstate", "RightAnteriorBasalPeripheralZoneOfProstate", "LeftMiddleAnteriorFibromuscularStromaOfProstate", "LeftPosterolateralApicalPeripheralZoneOfProstate", "RightSeminalVesicle", "LeftAnteriorApicalPeripheralZoneOfProstate", "CentralZoneOfRightHalfProstate", "RightPosteromedialMiddlePeripheralZoneOfProstate", "RightAnteriorMiddlePeripheralZoneOfProstate", "RightPosterolateralMiddlePeripheralZoneOfProstate", "LeftApicalAnteriorFibromuscularStromaOfProstate", "RightPosteromedialApicalPeripheralZoneOfProstate", "LeftSeminalVesicle", "RightAnteriorApicalPeripheralZoneOfProstate", "LeftAnteriorBasalPeripheralZoneOfProstate", "LeftPosterolateralBasalPeripheralZoneOfProstate", "RightMiddleAnteriorFibromuscularStromaOfProstate", "RightPosterolateralApicalPeripheralZoneOfProstate", "RightPosteriorBasalTransitionZoneOfProstate", "RightPosteriorMiddleTransitionZoneOfProstate", "RightAnteriorApicalTransitionZoneOfProstate", "RightPosteriorApicalTransitionZoneOfProstate", "LeftAnteriorMiddlePeripheralZoneOfProstate", "RightAnteriorMiddleTransitionZoneOfProstate", ] } name_for_cid[6302] = "ProstateSectorAnatomyfromEuropeanConcensus16Sector(Minimal)Model" cid_concepts[6302] = { "SCT": [ "CentralZoneOfRightHalfProstate", "RightPosteromedialMiddlePeripheralZoneOfProstate", "CentralZoneOfLeftHalfProstate", "LeftBasalPeripheralZoneOfProstate", "LeftLateralMiddlePeripheralZoneOfProstate", "LeftPosteromedialMiddlePeripheralZoneOfProstate", "RightBasalPeripheralZoneOfProstate", "LeftApicalTransitionZoneOfProstate", "MaleExternalUrethralSphincter", "RightApicalTransitionZoneOfProstate", "LeftBasalPartTransitionZoneOfProstate", "RightBasalTransitionZoneOfProstate", "LeftSeminalVesicle", "LeftMiddleTransitionZoneOfProstate", "LeftApicalPeripheralZoneOfProstate", "RightApicalPeripheralZoneOfProstate", "RightMiddleTransitionZoneOfProstate", "RightSeminalVesicle", "RightLateralMiddlePeripheralZoneOfProstate", ] } name_for_cid[6303] = "ProstateSectorAnatomyfromEuropeanConcensus27Sector(Optimal)Model" cid_concepts[6303] = { "SCT": [ "CentralZoneOfLeftHalfProstate", "LeftPosteromedialMiddlePeripheralZoneOfProstate", "MaleExternalUrethralSphincter", "LeftPosteromedialApicalPeripheralZoneOfProstate", "LeftPosterolateralMiddlePeripheralZoneOfProstate", "RightApicalTransitionZoneOfProstate", "MiddleAnteriorFibromuscularStromaOfProstate", "RightBasalTransitionZoneOfProstate", "LeftMiddleTransitionZoneOfProstate", "RightPosterolateralBasalPeripheralZoneOfProstate", "RightAnteriorBasalPeripheralZoneOfProstate", "LeftPosterolateralApicalPeripheralZoneOfProstate", "RightSeminalVesicle", "LeftAnteriorApicalPeripheralZoneOfProstate", "CentralZoneOfRightHalfProstate", "RightPosteromedialMiddlePeripheralZoneOfProstate", "RightAnteriorMiddlePeripheralZoneOfProstate", "RightPosterolateralMiddlePeripheralZoneOfProstate", "LeftApicalTransitionZoneOfProstate", "RightPosteromedialApicalPeripheralZoneOfProstate", "ApicalAnteriorFibromuscularStromaOfProstate", "BasalAnteriorFibromuscularStromaOfProstate", "LeftBasalPartTransitionZoneOfProstate", "LeftSeminalVesicle", "RightAnteriorApicalPeripheralZoneOfProstate", "LeftAnteriorBasalPeripheralZoneOfProstate", "LeftPosterolateralBasalPeripheralZoneOfProstate", "RightPosterolateralApicalPeripheralZoneOfProstate", "RightMiddleTransitionZoneOfProstate", "LeftAnteriorMiddlePeripheralZoneOfProstate", ] } name_for_cid[6304] = "ProstateSectorAnatomyfromPIRADSv2.1" cid_concepts[6304] = { "SCT": [ "CentralZoneOfLeftHalfProstate", "LeftPosteromedialBasalPeripheralZoneOfProstate", "LeftPosteromedialMiddlePeripheralZoneOfProstate", "MaleExternalUrethralSphincter", "RightApicalAnteriorFibromuscularStromaOfProstate", "LeftPosteromedialApicalPeripheralZoneOfProstate", "LeftPosterolateralMiddlePeripheralZoneOfProstate", "RightBasalAnteriorFibromuscularStromaOfProstate", "RightAnteriorBasalTransitionZoneOfProstate", "LeftAnteriorApicalTransitionZoneOfProstate", "LeftAnteriorBasalTransitionZoneOfProstate", "LeftPosteriorApicalTransitionZoneOfProstate", "RightPosterolateralBasalPeripheralZoneOfProstate", "LeftPosteriorMiddleTransitionZoneOfProstate", "LeftAnteriorMiddleTransitionZoneOfProstate", "LeftBasalAnteriorFibromuscularStromaOfProstate", "LeftPosteriorBasalTransitionZoneOfProstate", "RightAnteriorBasalPeripheralZoneOfProstate", "LeftMiddleAnteriorFibromuscularStromaOfProstate", "LeftPosterolateralApicalPeripheralZoneOfProstate", "RightSeminalVesicle", "LeftAnteriorApicalPeripheralZoneOfProstate", "CentralZoneOfRightHalfProstate", "RightPosteromedialMiddlePeripheralZoneOfProstate", "RightAnteriorMiddlePeripheralZoneOfProstate", "RightPosterolateralMiddlePeripheralZoneOfProstate", "RightPosteromedialBasalPeripheralZoneOfProstate", "LeftApicalAnteriorFibromuscularStromaOfProstate", "RightPosteromedialApicalPeripheralZoneOfProstate", "LeftSeminalVesicle", "RightAnteriorApicalPeripheralZoneOfProstate", "LeftAnteriorBasalPeripheralZoneOfProstate", "LeftPosterolateralBasalPeripheralZoneOfProstate", "RightMiddleAnteriorFibromuscularStromaOfProstate", "RightPosterolateralApicalPeripheralZoneOfProstate", "RightPosteriorBasalTransitionZoneOfProstate", "RightPosteriorMiddleTransitionZoneOfProstate", "RightAnteriorApicalTransitionZoneOfProstate", "RightPosteriorApicalTransitionZoneOfProstate", "LeftAnteriorMiddlePeripheralZoneOfProstate", "RightAnteriorMiddleTransitionZoneOfProstate", ] } name_for_cid[6310] = "ProstateReportingSystem" cid_concepts[6310] = {"DCM": ["PIRADSV2Point0", "PIRADSV2Point1"]} name_for_cid[6311] = "MRSignalIntensity" cid_concepts[6311] = { "DCM": [ "ApparentDiffusionCoefficient", "DiffusionWeighted", "DynamicContrastEnhancedAcquisitionSubtractionImage", "DynamicContrastEnhancedAcquisition", "DiffusionWeightedAcquisitionHighestBValueImage", "T2WeightedMRSignalIntensity", "T1WeightedMRSignalIntensity", ] } name_for_cid[6312] = "CrosssectionalScanPlaneOrientation" cid_concepts[6312] = {"SCT": ["Axial", "Oblique", "Sagittal", "Coronal"]} name_for_cid[6313] = "HistoryofProstateDisease" cid_concepts[6313] = { "DCM": ["UtricleCyst"], "SCT": ["ProstateCancer", "BenignProstateHyperplasia", "Prostatitis"], } name_for_cid[6314] = "ProstateMRIStudyQualityFinding" cid_concepts[6314] = { "DCM": [ "SuboptimalPatientPreparation", "IncompleteStudy", "StudyPerformedDidNotMatchRequest", "CoilSelectionConcern", "CoilPlacementConcern", "ProtocolNotFollowed", ], "RADLEX": ["SuboptimalPatientPositioning"], } name_for_cid[6315] = "ProstateMRISeriesQualityFinding" cid_concepts[6315] = { "DCM": [ "UnwantedSubtractionImages", "SubtractionImageMissing", "InadequateContrastEnhancement", "DistortionArtifactInTheAreaOfInterest", "ExpectedADCMapIsMissing", "SevereDistortionInTheAreaOfInterest", "ExpectedBValueIsMissing", "PoorContrastTiming", "PoorSNR", "PoorFOVSelection", "AnatomyCoverageIncomplete", ], "RADLEX": [ "NonUniformSignalIntensityArtifact", "Smearing", "MotionRelatedArtifact", "Ghost", "TissueMagneticSusceptibilityEffect", "FerromagneticImplantMagneticSusceptibilityEffect", "ParallelImagingArtifact", "ChemicalShiftArtifact", "PhaseWraparoundArtifact", ], } name_for_cid[6316] = "MRImagingArtifact" cid_concepts[6316] = { "RADLEX": [ "TissueMagneticSusceptibilityEffect", "FerromagneticImplantMagneticSusceptibilityEffect", "NonUniformSignalIntensityArtifact", "ParallelImagingArtifact", "ChemicalShiftArtifact", "PhaseWraparoundArtifact", "Smearing", "MotionRelatedArtifact", "Ghost", ] } name_for_cid[6317] = "ProstateDCEMRIQualityFinding" cid_concepts[6317] = { "DCM": [ "PoorContrastTiming", "UnwantedSubtractionImages", "SubtractionImageMissing", "InadequateContrastEnhancement", ] } name_for_cid[6318] = "ProstateDWIMRIQualityFinding" cid_concepts[6318] = { "DCM": [ "DistortionArtifactInTheAreaOfInterest", "ExpectedADCMapIsMissing", "SevereDistortionInTheAreaOfInterest", "ExpectedBValueIsMissing", ] } name_for_cid[6319] = "AbdominalInterventionType" cid_concepts[6319] = { "SCT": ["SurgicalProcedure", "DiagnosticIntent", "TherapeuticProcedure"] } name_for_cid[6320] = "AbdominopelvicIntervention" cid_concepts[6320] = { "NCIt": [ "FocusedUltrasoundAblation", "IrreversibleElectroporation", "Cryoablation", ], "SCT": ["OperationOnPelvicRegionOfTrunk", "Prostatectomy"], } name_for_cid[6321] = "ProstateCancerDiagnosticProcedure" cid_concepts[6321] = { "SCT": ["DigitalExaminationOfRectum", "ProstateCancerAntigenMeasurement"] } name_for_cid[6322] = "ProstateCancerFamilyHistory" cid_concepts[6322] = { "DCM": ["FamilyHistoryOfProstateCancer", "NoFamilyHistoryOfProstateCancer"], "SCT": ["FamilyHistoryUnknown"], } name_for_cid[6323] = "ProstateCancerTherapy" cid_concepts[6323] = { "SCT": [ "Prostatectomy", "ImplantationOfRadioactiveSeedIntoProstate", "AndrogenDeprivationTherapy", ] } name_for_cid[6324] = "ProstateMRIAssessment" cid_concepts[6324] = { "RADLEX": [ "PIRADS1VeryLow", "PIRADSXInadequateOrAbsent", "PIRADS2Low", "PIRADS5VeryHigh", "PIRADS4High", "PIRADS3Intermediate", ] } name_for_cid[6325] = "OverallAssessmentfromPIRADS®" cid_concepts[6325] = { "RADLEX": [ "PIRADS1VeryLow", "PIRADSXInadequateOrAbsent", "PIRADS2Low", "PIRADS5VeryHigh", "PIRADS4High", "PIRADS3Intermediate", ] } name_for_cid[6326] = "ImageQualityControlStandard" cid_concepts[6326] = { "DCM": [ "InstitutionallyDefinedQualityControlStandard", "MammographyQualityControlManual1999ACR", "PIRADS2Point1ProstateMRIAcquisitionRequirements", "Title21CFRSection900SubpartB", "PIRADS2Point0ProstateMRIAcquisitionRequirements", "ESUR2012ProstateMRIAcquisitionRequirements", ] } name_for_cid[6327] = "ProstateImagingIndication" cid_concepts[6327] = { "DCM": [ "ReviewOfAnOutsideStudy", "ActiveSurveillanceOfProstateCancer", "FamilyHistoryOfProstateCancer", "PreBiopsyLocalizationOfProstateLesion", "AssessChange", ], "I10": ["ElevatedProstateSpecificAntigen"], "SCT": ["Staging", "Brachytherapy"], } name_for_cid[6328] = "PIRADS®v2LesionAssessmentCategory" cid_concepts[6328] = { "RADLEX": [ "PIRADS3IntermediateLesion", "PIRADS2LowLesion", "PIRADS1VeryLowLesion", "PIRADSXInadequateOrAbsentLesion", "PIRADS5VeryHighLesion", "PIRADS4HighLesion", ] } name_for_cid[6329] = "PIRADS®v2T2WIPZLesionAssessmentCategory" cid_concepts[6329] = { "RADLEX": [ "PIRADS1T2WIPZVeryLow", "PIRADSXT2WIPZInadequateOrAbsent", "PIRADS5T2WIPZVeryHigh", "PIRADS4T2WIPZHigh", "PIRADS3T2WIPZIntermediate", "PIRADS2T2WIPZLow", ] } name_for_cid[6330] = "PIRADS®v2T2WITZLesionAssessmentCategory" cid_concepts[6330] = { "RADLEX": [ "PIRADS5T2WITZVeryHigh", "PIRADS4T2WITZHigh", "PIRADS3T2WITZIntermediate", "PIRADSXT2WITZInadequateOrAbsent", "PIRADS2T2WITZLow", "PIRADS1T2WITZVeryLow", ] } name_for_cid[6331] = "PIRADS®v2DWILesionAssessmentCategory" cid_concepts[6331] = { "RADLEX": [ "PIRADS4DWIHigh", "PIRADS3DWIIntermediate", "PIRADS2DWILow", "PIRADSXDWIInadequateOrAbsent", "PIRADS1DWIVeryLow", "PIRADS5DWIVeryHigh", ] } name_for_cid[6332] = "PIRADS®v2DCELesionAssessmentCategory" cid_concepts[6332] = { "RADLEX": [ "PIRADS_DCENegative", "PIRADS_DCEPositive", "PIRADSXDCEInadequateOrAbsent", ] } name_for_cid[6333] = "mpMRIAssessmentType" cid_concepts[6333] = { "DCM": ["Margin"], "NCIt": ["Abnormality"], "RADLEX": ["EnhancementPattern", "SignalCharacteristic"], "SCT": ["Shape"], } name_for_cid[6334] = "mpMRIAssessmentTypefromPIRADS®" cid_concepts[6334] = { "DCM": ["Margin"], "NCIt": ["Abnormality"], "RADLEX": ["EnhancementPattern", "SignalCharacteristic"], "SCT": ["Shape"], } name_for_cid[6335] = "mpMRIAssessmentValue" cid_concepts[6335] = { "DCM": [ "Linear", "LateContrastEnhancement", "PartiallyEncapsulated", "PersistentDelayedPhaseType1Curve", "ADCHypointense", "ADCHyperintense", "CompletelyEncapsulated", "WashoutDelayedPhaseType3Curve", "PlateauDelayedPhaseType2Curve", "Lobulated", "FocalAbnormality", "NegativeDCE", "PositiveDCE", "FocalContrastEnhancement", "DiffuseContrastEnhancement", "EarlyContrastEnhancement", "Homogeneous", "NonFocalAbnormality", ], "NCIt": ["IndexLesion"], "RADLEX": [ "Heterogeneous", "MarkedlyHypointense", "T2Hypointensity", "DiffusionWeightedHypersensitivity", "DelayedPhase", "Lenticular", "ErasedCharcoalSign", "EarlyPhaseWashIn", "OrganizedChaos", "PersistentDelayedPhase", "WashoutDelayedPhase", "T2Hyperintensity", "PlateauDelayedPhase", "RestrictedDiffusion", "Hyperintense", "Isointense", "Hypointense", "NonCircumscribedMargin", ], "SCT": [ "Atrophy", "Focal", "PathologicCalcification", "CircumscribedLesion", "Nodule", "Round", "Diffuse", "Irregular", "BenignProstateHyperplasia", "Hemorrhage", "Prostatitis", "Mass", "Regional", "Cyst", "WedgeShaped", "Fibrosis", "ObscuredLesion", "Encapsulated", "IndistinctLesion", "Multifocal", "Lesion", "OvoidShape", "SpiculatedLesion", "DropShaped", ], } name_for_cid[6336] = "MRIAbnormality" cid_concepts[6336] = { "DCM": ["FocalAbnormality", "NonFocalAbnormality"], "NCIt": ["IndexLesion"], "SCT": [ "Mass", "Regional", "Cyst", "Atrophy", "Focal", "PathologicCalcification", "Fibrosis", "Multifocal", "Nodule", "Lesion", "Diffuse", "BenignProstateHyperplasia", "Hemorrhage", "Prostatitis", ], } name_for_cid[6337] = "mpMRIProstateAbnormalityfromPIRADS®" cid_concepts[6337] = { "DCM": ["FocalAbnormality", "NonFocalAbnormality"], "NCIt": ["IndexLesion"], "SCT": [ "Mass", "Regional", "Cyst", "Atrophy", "Focal", "PathologicCalcification", "Fibrosis", "Multifocal", "Nodule", "Lesion", "Diffuse", "BenignProstateHyperplasia", "Hemorrhage", "Prostatitis", ], } name_for_cid[6338] = "mpMRIBenignProstateAbnormalityfromPIRADS®" cid_concepts[6338] = { "SCT": [ "Cyst", "Atrophy", "PathologicCalcification", "BenignProstateHyperplasia", "Fibrosis", "Hemorrhage", "Prostatitis", ] } name_for_cid[6339] = "MRIShapeCharacteristic" cid_concepts[6339] = { "DCM": ["Linear", "Lobulated"], "RADLEX": ["Lenticular"], "SCT": ["Round", "WedgeShaped", "Irregular", "OvoidShape", "DropShaped"], } name_for_cid[6340] = "ProstateMRIShapeCharacteristicfromPIRADS®" cid_concepts[6340] = { "DCM": ["Linear", "Lobulated"], "RADLEX": ["Lenticular"], "SCT": ["Round", "WedgeShaped", "Irregular", "OvoidShape", "DropShaped"], } name_for_cid[6341] = "MRIMarginCharacteristic" cid_concepts[6341] = { "DCM": ["CompletelyEncapsulated", "PartiallyEncapsulated"], "RADLEX": ["ErasedCharcoalSign", "NonCircumscribedMargin"], "SCT": [ "Encapsulated", "Irregular", "SpiculatedLesion", "CircumscribedLesion", "IndistinctLesion", "ObscuredLesion", ], } name_for_cid[6342] = "ProstateMRIMarginCharacteristicfromPIRADS®" cid_concepts[6342] = { "DCM": ["CompletelyEncapsulated", "PartiallyEncapsulated"], "RADLEX": ["ErasedCharcoalSign", "NonCircumscribedMargin"], "SCT": [ "Encapsulated", "Irregular", "SpiculatedLesion", "CircumscribedLesion", "IndistinctLesion", "ObscuredLesion", ], } name_for_cid[6343] = "MRISignalCharacteristic" cid_concepts[6343] = { "DCM": ["Homogeneous", "ADCHypointense", "ADCHyperintense"], "RADLEX": [ "Hyperintense", "Heterogeneous", "MarkedlyHypointense", "OrganizedChaos", "Isointense", "T2Hypointensity", "Hypointense", "RestrictedDiffusion", "DiffusionWeightedHypersensitivity", "T2Hyperintensity", ], } name_for_cid[6344] = "ProstateMRISignalCharacteristicfromPIRADS®" cid_concepts[6344] = { "DCM": ["Homogeneous", "ADCHypointense", "ADCHyperintense"], "RADLEX": [ "Hyperintense", "Heterogeneous", "MarkedlyHypointense", "OrganizedChaos", "Isointense", "T2Hypointensity", "Hypointense", "RestrictedDiffusion", "DiffusionWeightedHypersensitivity", "T2Hyperintensity", ], } name_for_cid[6345] = "MRIEnhancementPattern" cid_concepts[6345] = { "DCM": [ "LateContrastEnhancement", "PersistentDelayedPhaseType1Curve", "NegativeDCE", "PositiveDCE", "WashoutDelayedPhaseType3Curve", "PlateauDelayedPhaseType2Curve", "FocalContrastEnhancement", "DiffuseContrastEnhancement", "EarlyContrastEnhancement", ], "RADLEX": [ "EarlyPhaseWashIn", "PersistentDelayedPhase", "WashoutDelayedPhase", "PlateauDelayedPhase", "DelayedPhase", ], } name_for_cid[6346] = "ProstateMRIEnhancementPatternfromPIRADS®" cid_concepts[6346] = { "DCM": [ "LateContrastEnhancement", "PersistentDelayedPhaseType1Curve", "NegativeDCE", "PositiveDCE", "WashoutDelayedPhaseType3Curve", "PlateauDelayedPhaseType2Curve", "FocalContrastEnhancement", "DiffuseContrastEnhancement", "EarlyContrastEnhancement", ], "RADLEX": [ "EarlyPhaseWashIn", "PersistentDelayedPhase", "WashoutDelayedPhase", "PlateauDelayedPhase", "DelayedPhase", ], } name_for_cid[6347] = "ProstateMRIExtraprostaticFinding" cid_concepts[6347] = {"SCT": ["Lymphadenopathy", "BonyMetastasis", "Entire"]} name_for_cid[6348] = "ProstateMRIAssessmentofExtraprostaticAnatomicSite" cid_concepts[6348] = { "RADLEX": ["NeurovascularBundleOfProstate"], "SCT": ["SeminalVesicle", "Rectum", "MaleExternalUrethralSphincter", "LymphNode"], } name_for_cid[6349] = "MRCoilType" cid_concepts[6349] = {"RADLEX": ["EndorectalCoil"]} name_for_cid[6350] = "EndorectalCoilFillSubstance" cid_concepts[6350] = { "DCM": ["Perfluorocarbon"], "RADLEX": ["BariumSulfateSuspension"], "SCT": ["Air", "Water"], } name_for_cid[6351] = "ProstateRelationalMeasurement" cid_concepts[6351] = { "DCM": ["DistanceFromNeurovascularBundle", "LesionCapsularContactLength"] } name_for_cid[6352] = "ProstateCancerDiagnosticBloodLabMeasurement" cid_concepts[6352] = { "LN": ["ProstateSpecificAntigenDensity", "ProstateCancerAntigen"], "NCIt": ["_4kscore"], } name_for_cid[6353] = "ProstateImagingTypesofQualityControlStandard" cid_concepts[6353] = { "DCM": [ "InstitutionallyDefinedQualityControlStandard", "PIRADS2Point1ProstateMRIAcquisitionRequirements", "PIRADS2Point0ProstateMRIAcquisitionRequirements", "ESUR2012ProstateMRIAcquisitionRequirements", ] } name_for_cid[6401] = "NonlesionObjectTypePhysicalObject" cid_concepts[6401] = { "DCM": ["OtherMarker"], "SCT": [ "Suture", "PacemakerPulseGenerator", "CompressionPaddle", "JWire", "Bullet", "BBShotLeadPellet", "OpaqueMarker", "Clip", "Catheter", "IDPlate", "Collimator", "Implant", "Staple", ], } name_for_cid[6402] = "NonlesionObjectTypeSubstance" cid_concepts[6402] = {"SCT": ["ContrastAgent"]} name_for_cid[6403] = "NonlesionObjectTypeTissue" cid_concepts[6403] = {"SCT": ["ScarTissue"]} name_for_cid[6404] = "ChestNonlesionObjectTypePhysicalObject" cid_concepts[6404] = { "DCM": [ "Portacath", "ChestTube", "CentralLine", "KidneyStent", "PancreaticStent", "NippleRing", "Coin", "FiducialMark", ], "SCT": [ "JejunostomyTube", "Suture", "VenaCavaFilter", "HeartValveProsthesis", "Needle", "Jewelry", "Prosthesis", "FeedingTube", "Catheter", "EndotrachealTube", "Tracheotomy", "Staple", "UretericStent", "Bullet", "Pin", "CardiacPacemaker", "CardiacPacemakerLead", "CervicalCollar", ], } name_for_cid[6405] = "ChestNonlesionObjectTypeTissue" cid_concepts[6405] = {"SCT": ["ScarTissue"]} name_for_cid[7000] = "DiagnosticImagingReportDocumentTitle" cid_concepts[7000] = { "DCM": [ "BreastImagingReport", "AdultEchocardiographyProcedureReport", "PediatricCardiacUltrasoundReport", "AdultCongenitalCardiacUltrasoundReport", "FetalCardiacUltrasoundReport", ], "LN": [ "USCarotidArteriesReport", "USProstateTransrectalReport", "USVeinReport", "MRIHeadReport", "CTAbdomenReport", "NuclearMedicineReport", "USDopplerHeadVesselsReport", "CardiacCatheterizationReport", "USKidneyReport", "CTReport", "CTChestReport", "USArteryReport", "MammographyScreeningReport", "USLiverReport", "USDopplerUpperExtremityVesselsReport", "CardiacElectrophysiologyReport", "CTHeadReport", "PETScanReport", "RadiologyReport", "HolterStudyReport", "ExerciseStressTestReport", "USDopplerLowerExtremityVesselsReport", "MRISpineReport", "USTendonReport", "EchocardiographyReport", "XRayReport", "USSpleenReport", "USShoulderReport", "ECGReport", "USDopplerAbdominalVesselsReport", "UltrasoundReport", "FluoroscopyStudyReport", "USScrotumAndTesticleReport", "DEXASkeletalSystemStudyReport", "DiagnosticImagingReport", "NuclearMedicineThyroidScanReport", "DiagnosticInterventionalRadiologyReport", "USDopplerVesselsReport", "USPancreasReport", "USBreastReport", "USDopplerExtremityVesselsReport", "UltrasoundObstetricAndGynReport", "USThyroidReport", "MRIReport", ], "SCT": ["PeripheralVascularUltrasoundReport"], } name_for_cid[7001] = "DiagnosticImagingReportHeading" cid_concepts[7001] = { "LN": [ "Addendum", "ClinicalInformation", "MedicationsAdministered", "RadiationExposureAndProtectionInformation", "Complications", "PatientPresentation", "History", "Impressions", "CommunicationOfCriticalResults", "Conclusions", "Findings", "Recommendations", "PreviousFindings", "PriorProcedureDescriptions", "KeyImages", "IndicationsForProcedure", "Summary", "CurrentProcedureDescriptions", "Request", ] } name_for_cid[7002] = "DiagnosticImagingReportElement" cid_concepts[7002] = { "DCM": [ "PreviousFinding", "Conclusion", "Recommendation", "ProcedureDescription", "Impression", "Finding", ], "LN": ["PatientPresentation", "History", "Summary", "Request"], "SCT": ["ComplicationOfProcedure"], } name_for_cid[7003] = "DiagnosticImagingReportPurposeofReference" cid_concepts[7003] = { "DCM": [ "BestIllustrationOfFinding", "Baseline", "SourceOfMeasurement", "IllustrationOfROI", ] } name_for_cid[7004] = "WaveformPurposeofReference" cid_concepts[7004] = { "DCM": [ "SimultaneousRespiratoryWaveform", "SimultaneousArterialPulseWaveform", "SimultaneousECG", "SimultaneousVoiceNarrative", "SimultaneousDoppler", "SimultaneousHemodynamic", "SimultaneousPhonocardiographicWaveform", ] } name_for_cid[7005] = "ContributingEquipmentPurposeofReference" cid_concepts[7005] = { "DCM": [ "PortableMediaImporterEquipment", "FilmDigitizer", "DeIdentifyingEquipment", "ModifyingEquipment", "EnhancedMultiFrameConversionEquipment", "FrameExtractingEquipment", "VideoTapeDigitizerEquipment", "SynthesizingEquipment", "ProcessingEquipment", "AcquisitionEquipment", "DocumentDigitizerEquipment", ] } name_for_cid[7006] = "SRDocumentPurposeofReference" cid_concepts[7006] = { "DCM": [ "ExtendedRenderingForPresentation", "SourceDocument", "CompleteRenderingForPresentation", "PartialRenderingForPresentation", "EquivalentCDADocument", ] } name_for_cid[7008] = "MediaImport" cid_concepts[7008] = { "DCM": [ "InstancesImported", "StudiesImported", "MODImported", "DVDImported", "CDImported", "PaperDigitized", "VideoTapeDigitized", "CineFilmDigitized", "SheetFilmDigitized", ] } name_for_cid[7009] = "PurposeofReferencetoPredecessorReport" cid_concepts[7009] = { "DCM": [ "PartialReport", "AddendedReport", "PreliminaryReport", "ReplacedReport", "CurrentProcedureEvidence", ] } name_for_cid[7010] = "KeyObjectSelectionDocumentTitle" cid_concepts[7010] = { "DCM": [ "OfInterest", "RejectedForQualityReasons", "ForReferringProvider", "ForSurgery", "ForTeaching", "ContouringInputUsed", "DiagnosisInputUsed", "RTTreatmentPlanningInputUsed", "RTPrescriptionInputUsed", "PhysicianReviewInputUsed", "RTPlanSummationInputUsed", "PlanQualityAssuranceInputUsed", "PhysicistReviewInputUsed", "PatientSetupVerificationInputUsed", "MachineQualityAssuranceInputUsed", "ForConference", "ForTherapy", "ForPatient", "ForPeerReview", "ForResearch", "Manifest", "SignedManifest", "CompleteStudyContent", "SignedCompleteStudyContent", "CompleteAcquisitionContent", "SignedCompleteAcquisitionContent", "GroupOfFramesForDisplay", "RejectedForPatientSafetyReasons", "ForTumorRegistry", "ForClinicalTrialSubmission", "RTWorkflowInputUsed", "ForRTPlanSummation", "ForPhysicistReview", "ForPhysicianReview", "ForPlanQualityAssurance", "ForTumorBoard", "ForPatientSetupVerification", "ForMachineQualityAssurance", "IncorrectModalityWorklistEntry", "DataRetentionPolicyExpired", "ForReportAttachment", "ForLitigation", "CollectionOfPresentationStates", "ForPublicationExport", "ForResearchCollectionExport", "ForPlanComparison", "ForTeachingFileExport", "ForClinicalTrialExport", "RTTreatmentSessionResult", "PatientSetupVerificationResult", "RTTreatmentQAResult", "RTTreatmentCourseSummary", "ForSegmentation", "ForDiagnosis", "ForRTTreatmentPlanning", "ForRTPrescription", "QualityIssue", "BestInSet", "DosimetricResult", "RTVAudioAndStereoVideoRendition", "RTVStereoVideoRendition", "RTVAudioAndVideoRendition", "RTVRendition", "TumorRegistryInputUsed", "RTPlanningResult", "TumorBoardInputUsed", "RTTreatmentSimulationResult", "ClinicalTrialSubmissionInputUsed", "DiagnosticSourceImages", "ForRTWorkflow", "ForPrinting", "RegistrationResult", "SegmentationResult", "RTPrescriptionResult", "PrePlanningResult", "PlanComparisonInputUsed", "CoordinateAlignmentImageSeries", "RTPrescriptionResultForRTTreatmentPlanning", ] } name_for_cid[7011] = "RejectedforQualityReason" cid_concepts[7011] = { "DCM": [ "OtherFailure", "MotionBlur", "UnknownFailure", "UnderExposed", "DoubleExposure", "Positioning", "OverExposed", "NoImage", "DetectorArtifacts", "ArtifactsOtherThanGridOrDetectorArtifact", "MechanicalFailure", "ElectricalFailure", "ImageArtifacts", "SoftwareFailure", "GridArtifacts", "InappropriateImageProcessing", ] } name_for_cid[7012] = "BestinSet" cid_concepts[7012] = {"DCM": ["Study", "Series", "PerformedProcedureStep", "StageView"]} name_for_cid[7013] = "NonImageSourceInstancePurposeofReference" cid_concepts[7013] = { "DCM": [ "SourceMeasurement", "SourceRawData", "SourceReport", "SourceDeformableSpatialRegistration", "SourceRealWorldValueMap", ] } name_for_cid[7014] = "ExportAdditionalInformationDocumentTitle" cid_concepts[7014] = { "DCM": [ "ForTeachingFileExport", "ForClinicalTrialExport", "ForPublicationExport", "ForResearchCollectionExport", ] } name_for_cid[7015] = "ExportDelayReason" cid_concepts[7015] = { "DCM": [ "DelayExportUntilPatientDies", "DelayExportUntilPatientIsDischarged", "DelayExportUntilExpertReviewIsAvailable", "DelayExportUntilClinicalInformationIsAvailable", "DelayExportUntilFinalReportIsAvailable", "DelayExportUntilHistopathologyIsAvailable", "DelayExportUntilConfirmationOfDiagnosisIsAvailable", "DelayExportUntilOtherLaboratoryResultsAreAvailable", ] } name_for_cid[7016] = "LevelofDifficulty" cid_concepts[7016] = {"DCM": ["PrimaryLevel", "AdvancedLevel", "IntermediateLevel"]} name_for_cid[7017] = "CategoryofTeachingMaterialImaging" cid_concepts[7017] = { "DCM": [ "CardiovascularImagingSubjectMatter", "GenitourinaryImagingSubjectMatter", "GastrointestinalImagingSubjectMatter", "VascularAndInterventionalImagingSubjectMatter", "NeuroimagingSubjectMatter", "UltrasoundImagingSubjectMatter", "NuclearMedicineImagingSubjectMatter", "BreastImagingSubjectMatter", "PediatricImagingSubjectMatter", "PulmonaryImagingSubjectMatter", "MusculoskeletalImagingSubjectMatter", ] } name_for_cid[7018] = "MiscellaneousDocumentTitle" cid_concepts[7018] = {"DCM": ["AdditionalTeachingFileInformation"]} name_for_cid[7019] = "SegmentationNonImageSourcePurposeofReference" cid_concepts[7019] = {"DCM": ["SourceRealWorldValueMap"]} name_for_cid[7021] = "MeasurementReportDocumentTitle" cid_concepts[7021] = { "DCM": [ "ImagingMeasurementReport", "OncologyMeasurementReport", "DynamicContrastMRMeasurementReport", "PETMeasurementReport", ] } name_for_cid[7022] = "RadiotherapyPurposeofReference" cid_concepts[7022] = { "DCM": [ "DoseFromPriorTreatment", "RegistrationCreatedDuringTreatment", "RTTreatmentPlanForThePositionBeingVerified", "RegistrationUsedInPlanning", ] } name_for_cid[7023] = "RTProcessOutput" cid_concepts[7023] = { "DCM": [ "RTPlanningResult", "RTTreatmentSimulationResult", "DosimetricResult", "RTTreatmentSessionResult", "PatientSetupVerificationResult", "RTTreatmentQAResult", "RTTreatmentCourseSummary", "RTPrescriptionResult", "PrePlanningResult", "CoordinateAlignmentImageSeries", "RTPrescriptionResultForRTTreatmentPlanning", ] } name_for_cid[7024] = "RTProcessInput" cid_concepts[7024] = { "DCM": [ "ForRTPlanSummation", "ForPhysicistReview", "ForPhysicianReview", "ForPlanQualityAssurance", "ForPatientSetupVerification", "ForMachineQualityAssurance", "ForRTWorkflow", "ForRTTreatmentPlanning", "ForRTPrescription", ] } name_for_cid[7025] = "RTProcessInputUsed" cid_concepts[7025] = { "DCM": [ "RTTreatmentPlanningInputUsed", "RTPrescriptionInputUsed", "PhysicianReviewInputUsed", "RTPlanSummationInputUsed", "PlanQualityAssuranceInputUsed", "PhysicistReviewInputUsed", "PatientSetupVerificationInputUsed", "MachineQualityAssuranceInputUsed", "RTWorkflowInputUsed", ] } name_for_cid[7026] = "RadiotherapeuticDoseMeasurementDevice" cid_concepts[7026] = { "DCM": [ "IonChamberArray", "DiodeArray", "LiquidIonChamber", "Diode", "IonChamber", "OSLD", "RPLGD", "DiamondDetector", "_3DGel", ], "SCT": [ "ThermoluminescentRadiationDosimeter", "MOSFETRadiationTherapyDosimetrySystemDosimeter", "DigitalImager", "MedicalXRayFilm", ], } name_for_cid[7027] = "SegmentedRadiotherapeuticDoseMeasurementDevice" cid_concepts[7027] = { "DCM": [ "IonChamberArray", "DiodeArray", "LiquidIonChamber", "Diode", "IonChamber", "OSLD", "RPLGD", "DiamondDetector", ], "SCT": [ "MOSFETRadiationTherapyDosimetrySystemDosimeter", "DigitalImager", "ThermoluminescentRadiationDosimeter", ], } name_for_cid[7030] = "InstitutionalDepartment/Unit/Service" cid_concepts[7030] = { "DCM": [ "PediatricRadiology", "ThoracicRadiology", "AbdominalRadiology", "CardiovascularRadiology", "BiomedicalEngineering", "MedicalPhysics", "InformationTechnology", "MusculoskeletalRadiology", ], "SCT": [ "Psychology", "Ultrasonography", "CardiacSurgery", "Dermatology", "GeneralMedicine", "MagneticResonanceImagingService", "CardiothoracicSurgery", "IntensiveCare", "GeneralSurgery", "TropicalMedicine", "AllergyAndImmunology", "Nephrology", "DiagnosticImaging", "Neurosurgery", "OralSurgery", "CardiacIntensiveCare", "Otorhinolaryngology", "ChildAndAdolescentPsychiatry", "PediatricSurgery", "Urology", "Cytology", "Radiotherapy", "ThoracicSurgery", "ClinicalBiochemistry", "GastrointestinalSurgery", "AccidentAndEmergency", "Endoscopy", "Physiotherapy", "Rheumatology", "NeonatalIntensiveCare", "Stroke", "MedicalIntensiveCare", "PainManagement", "PediatricIntensiveCare", "Ophthalmology", "Audiology", "ObstetricsAndGynecology", "Pulmonology", "MedicalMicrobiology", "TraumaSurgery", "HepatobiliarySurgery", "PalliativeCare", "PediatricOncology", "SurgicalIntensiveCare", "Obstetrics", "ClinicalOncology", "Endocrinology", "Rehabilitation", "BurnsIntensiveCare", "Surgery", "ColorectalSurgery", "Optometry", "ComputerizedTomographyService", "InfectiousDisease", "Cardiology", "NuclearMedicine", "DentalSurgery", "SpeechAndLanguageTherapy", "TransplantSurgery", "Anesthesiology", "PrimaryCareDepartment", "BreastSurgery", "HistopathologyDepartment", "Radiology", "HandSurgery", "Gynecology", "OrthopedicSurgery", "InterventionalRadiologyService", "PediatricMedicine", "Psychiatry", "Hematology", "Pathology", "PlasticSurgery", "Neurology", "EndocrineSurgery", "GeriatricMedicine", "VascularSurgery", ], "UMLS": ["Neuroradiology"], } name_for_cid[7031] = "ReasonforRemovalfromOperationalUse" cid_concepts[7031] = { "DCM": [ "QualityControlIntent", "RejectedForQualityReasons", "ReplacedByAlternateRepresentation", "ProcessedKeyObjectSelection", "RejectedForPatientSafetyReasons", "DataNotAccessibleFromStorage", "IncorrectModalityWorklistEntry", "DataRetentionPolicyExpired", ] } name_for_cid[7035] = "ActionableFindingClassification" cid_concepts[7035] = { "RADLEX": [ "ACRCategory2ActionableFinding", "ACRCategory1ActionableFinding", "ACRCategory3ActionableFinding", ] } name_for_cid[7036] = "ImageQualityAssessment" cid_concepts[7036] = { "RADLEX": ["NonDiagnosticQuality", "LimitedQuality", "DiagnosticQuality"] } name_for_cid[7039] = "PediatricSizeCategory" cid_concepts[7039] = { "SCT": [ "BroselowLutenPurpleZone1011kg", "BroselowLutenYellowZone1214kg", "BroselowLutenWhiteZone1518kg", "BroselowLutenGreenZone3036kg", "BroselowLutenBlueZone1923kg", "BroselowLutenPinkZone67kg", "BroselowLutenOrangeZone2429kg", "BroselowLutenRedZone89kg", ] } name_for_cid[7040] = "BroselowLutenPediatricSizeCategory" cid_concepts[7040] = { "SCT": [ "BroselowLutenPurpleZone1011kg", "BroselowLutenYellowZone1214kg", "BroselowLutenWhiteZone1518kg", "BroselowLutenGreenZone3036kg", "BroselowLutenBlueZone1923kg", "BroselowLutenPinkZone67kg", "BroselowLutenOrangeZone2429kg", "BroselowLutenRedZone89kg", ] } name_for_cid[7041] = "CalciumScoringPatientSizeCategory" cid_concepts[7041] = { "DCM": [ "SmallLesserThan32Point0cmLateralThickness", "Medium32Point0To38Point0cmLateralThickness", "LargeGreaterThan38Point0cmLateralThickness", ] } name_for_cid[7042] = "CMDCTECCCalciumScoringPatientSizeCategory" cid_concepts[7042] = { "DCM": [ "SmallLesserThan32Point0cmLateralThickness", "Medium32Point0To38Point0cmLateralThickness", "LargeGreaterThan38Point0cmLateralThickness", ] } name_for_cid[7050] = "DeidentificationMethod" cid_concepts[7050] = { "DCM": [ "RetainUidsOption", "BasicApplicationConfidentialityProfile", "RetainSafePrivateOption", "CleanPixelDataOption", "RetainInstitutionIdentityOption", "CleanRecognizableVisualFeaturesOption", "CleanGraphicsOption", "CleanStructuredContentOption", "CleanDescriptorsOption", "RetainLongitudinalTemporalInformationFullDatesOption", "RetainLongitudinalTemporalInformationModifiedDatesOption", "RetainPatientCharacteristicsOption", "RetainDeviceIdentityOption", ] } name_for_cid[7060] = "EncapsulatedDocumentSourcePurposeofReference" cid_concepts[7060] = { "DCM": [ "SourceMeasurement", "SourceRawData", "SourceImage", "SourceReport", "SourceDeformableSpatialRegistration", "SourceRealWorldValueMap", ] } name_for_cid[7061] = "ModelDocumentTitle" cid_concepts[7061] = { "DCM": [ "US3DCAMModel", "SourceImage", "MixedModality3DCAMModel", "LaserScanning3DCAMModel", "PhotogrammetricImaging3DCAMModel", ], "LN": ["CT3DCAMModel", "MR3DCAMModel"], } name_for_cid[7062] = "PurposeofReferencetoPredecessor3DModel" cid_concepts[7062] = {"DCM": ["EditedModel", "ComponentModel"]} name_for_cid[7063] = "ModelScaleUnit" cid_concepts[7063] = {"UCUM": ["Millimeter", "Meter", "Centimeter", "Micrometer"]} name_for_cid[7064] = "ModelUsage" cid_concepts[7064] = { "DCM": [ "ToolFabrication", "PlanningIntent", "QualityControlIntent", "ImplantFabrication", "ProstheticFabrication", "SimulationIntent", "EducationalIntent", ], "SCT": ["DiagnosticIntent"], } name_for_cid[7070] = "RealTimeVideoRenditionTitle" cid_concepts[7070] = { "DCM": [ "RTVAudioAndStereoVideoRendition", "RTVStereoVideoRendition", "RTVAudioAndVideoRendition", "RTVRendition", ] } name_for_cid[7100] = "RCSRegistrationMethodType" cid_concepts[7100] = { "DCM": [ "ImageContentAndFiducialBasedAlignment", "VisualAlignment", "ImageContentBasedAlignment", "AcquisitionEquipmentAlignment", "FiducialAlignment", "FrameOfReferenceIdentity", ] } name_for_cid[7101] = "BrainAtlasFiducial" cid_concepts[7101] = { "DCM": [ "InterHemisphericPlane", "LeftHemisphereMostInferior", "LeftHemisphereMostSuperior", "LeftHemisphereMostPosterior", "LeftHemisphereMostAnterior", "RightHemisphereMostInferior", "RightHemisphereMostSuperior", "RightHemisphereMostPosterior", "RightHemisphereMostAnterior", ], "SCT": ["AnteriorCommissure", "PosteriorCommissure"], } name_for_cid[7110] = "FiducialCategory" cid_concepts[7110] = { "DCM": ["FiducialMark"], "SCT": ["BodyReferencePointMarker", "BodySurfacePoint", "AnatomicalPoint"], } name_for_cid[7111] = "Fiducial" cid_concepts[7111] = { "DCM": [ "MRMarker", "InfraredReflectorMarker", "CoilMarker", "CylinderMarker", "TransponderMarker", "WireMarker", "InterHemisphericPlane", "VisibleReflectorMarker", "LeftHemisphereMostInferior", "Sphere", "LeftHemisphereMostSuperior", "LeftHemisphereMostPosterior", "LeftHemisphereMostAnterior", "RightHemisphereMostInferior", "RightHemisphereMostSuperior", "RightHemisphereMostPosterior", "RightHemisphereMostAnterior", ], "SCT": [ "VascularCalcification", "RadioactiveImplant", "PosteriorCommissure", "ContrastMedia", "Ostium", "Catheter", "RenalArtery", "AnteriorCommissure", "VesselOrigin", "BBShotLeadPellet", "AorticBifurcation", "CommonIliacBifurcation", "Vein", "Clip", "Stent", "FibrousPlaque", "CollateralBranchOfVessel", ], } name_for_cid[7112] = "RadiotherapyFiducial" cid_concepts[7112] = { "DCM": [ "MRMarker", "InfraredReflectorMarker", "VisibleReflectorMarker", "CoilMarker", "CylinderMarker", "TransponderMarker", "WireMarker", "Sphere", ], "SCT": [ "RadioactiveImplant", "BBShotLeadPellet", "Clip", "ContrastMedia", "Catheter", ], } name_for_cid[7140] = "BrainStructureforVolumetricMeasurement" cid_concepts[7140] = { "DCM": [ "WhiteMatterT2Hyperintensity", "WhiteMatterT1Hypointensity", "VentralDiencephalon", ], "SCT": [ "Amygdala", "Cerebellum", "CavumOfSeptumPellucidum", "NucleusAccumbens", "CerebellarSubarachnoidSpace", "Hippocampus", "CerebellarWhiteMatter", "CranialCavity", "CranialSubarachnoidSpace", "FourthVentricle", "ThirdVentricle", "CerebralGrayMatter", "GlobusPallidus", "ThalamusPart", "CerebralWhiteMatter", "InferiorHornOfLateralVentricle", "LateralVentricle", "CaudateNucleus", "CerebellarCortex", "BrainStem", "Putamen", "IntracranialStructure", ], } name_for_cid[7150] = "SegmentationPropertyCategory" cid_concepts[7150] = { "SCT": [ "SpatialAndRelationalConcept", "Function", "Substance", "MorphologicallyAbnormalStructure", "Tissue", "AnatomicalStructure", "PhysicalObject", "BodySubstance", ] } name_for_cid[7151] = "SegmentationPropertyType" cid_concepts[7151] = { "BARI": [ "_1stMarginalCoronaryArteryLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "RamusLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", ], "DCM": [ "AorticKnob", "ArchOfTheAzygosVein", "IonChamberArray", "DiodeArray", "LiquidIonChamber", "Diode", "IonChamber", "OSLD", "RPLGD", "DiamondDetector", "Portacath", "ChestTube", "CentralLine", "KidneyStent", "PancreaticStent", "NippleRing", "Coin", "FiducialMark", "HeadFixationBoard", "AbdominalCompressionArch", "AbdominalCompressionBelt", "BreastBridge", "RegistrationInput", "Background", "SurfaceOfTheChoroidScleraInterface", "OuterSurfaceOfTheBM", "HandGrips", "OuterSurfaceOfTheCC", "HeelStop", "ShinRest", "SeatPan", "Mold", "HeadAndNeckMask", "HeadMask", "Headframe", "BodyFrame", "BreastBoard", "Cast", "WholeBodyPod", "VacuumMold", "RectalBalloon", "VaginalCylinder", "PosteriorSurfaceOfTheRPE", "SurfaceOfTheCenterOfTheRPE", "OuterSurfaceOfIPL", "OuterSurfaceOfGCL", "OuterSurfaceOfOPL", "OuterSurfaceOfINL", "SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors", "OuterSurfaceOfHFL", "AnteriorSurfaceOfTheRPE", "SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE", "OuterSurfaceOfRNFL", "Sphere", "OtherMarker", "TissueNotOfInterest", "SecondaryPulmonaryLobule", "SingleSubjectExtractedFromGroup", "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", "Lucency", "MidlungWindow", "CarinaAngle", "CentrilobularStructures", "AnteriorJunctionLine", "PosteriorJunctionLine", "Interface", "Line", "BrachytherapyChannelShield", "BrachytherapySourceApplicator", "BrachytherapyChannel", ], "FMA": [ "ArcuateFasciculus", "LumenOfGallbladder", "SubcorticalGrayMatter", "WallOfGallbladder", ], "NCIt": ["NonEnhancingLesion", "ReferenceRegion", "EnhancingLesion"], "SCT": [ "ProfundaFemorisVein", "LeftHypochondriacRegion", "SternocleidomastoidMuscle", "Ligament", "TruncusCoeliacus", "C3C4Disc", "InferiorLongitudinalFasciculus", "PelvicCavityTrue", "WristJoint", "IntermediateArteryRamus", "GenicularArtery", "LeftVentricleInflow", "FontanelOfSkull", "SigmoidColon", "RightFemoralArtery", "Intracranial", "JawRegion", "LobarArtery", "Wall", "DentalProsthesis", "ThighPerforator", "Pituitary", "MidRightCoronaryArtery", "IntraThoracic", "UpperLimb", "ExternalIliacVein", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "ParietalBone", "Cartilage", "RightUpperQuadrantOfAbdomen", "Eye", "SuperficialPalmarArch", "Prostate", "FacialBones", "Back", "SoftTissue", "Duodenum", "_1stMarginalCoronaryArtery", "Larynx", "BonePin", "PeronealVein", "FemoralArtery", "Ovary", "Lesion", "Urethra", "Head", "AdrenalGland", "MitralValve", "Calyx", "PosteriorMedialTributary", "PulmonaryVeinGreatVessel", "ForeignBody", "Submental", "NucleusAccumbens", "PoplitealFossa", "PulmonaryArteryConduit", "InternalCarotidArteryC5Segment", "Nodule", "LevatoresCostarumMuscles", "FrontalLobe", "Adventitia", "Hypopharynx", "RightCoronaryArteryOstium", "HepaticVein", "MarginalCoronaryArtery", "InternalMammaryArtery", "BronchialArtery", "CouinaudHepaticSegmentIII", "ExternalCarotidArtery", "BiteBlock", "Neoplasm", "SystemicArtery", "IntraAbdominopelvic", "LesionOfBrain", "VomerBone", "UterusAndFallopianTubes", "PacemakerPulseGenerator", "Arachnoid", "VenaCavaFilter", "TarsalJoint", "LingualArtery", "NeoplasmSecondary", "AirwayStructure", "CongenitalCoronaryArteryFistulaToRightAtrium", "DeltoidMuscle", "CerebralFornix", "Penis", "Baffle", "VentricularVein", "UretericStent", "Parathyroid", "Scapula", "Kidney", "OmentalBursa", "MuscleTissue", "InternalCarotidArtery", "L1Vertebra", "RightPosteriorAVCoronaryArtery", "FascialLayer", "CouinaudHepaticSegmentV", "RenalPelvis", "Thrombus", "VenousNetwork", "SubcostalMuscle", "CommonAtrium", "Ilium", "InternalCarotidArteryC6Segment", "AnteriorTibialArtery", "CranialNerve", "SkinOfAbdomen", "ConnectiveTissue", "CommonCarotidArtery", "InnermostIntercostalMuscles", "_3rdMarginalCoronaryArtery", "MastoidBone", "CommonIliacArteryBifurcation", "MiddleHepaticVein", "CouinaudHepaticSegmentVI", "Thigh", "Trachea", "LeftPosterolateralCircumflexCoronaryArtery", "BodyConduit", "Thalamus", "RightVentricleInflow", "LeftLowerQuadrantOfAbdomen", "SpinalCerebrospinalFluidPathway", "SesamoidBonesOfFoot", "Armrest", "C2C3Disc", "AbdominalWallMuscle", "SixthLumbarArtery", "BodyFluid", "Omentum", "SubmandibularGland", "CarotidBifurcation", "T3Vertebra", "InnominateArtery", "Extremity", "FacialArtery", "BoneStructureOfHeadAndOrNeck", "EpigastricRegion", "CervicoThoracicSpine", "DigitalImager", "RightLumbarRegion", "TeresMinorMuscle", "CommonFemoralVein", "SubstantiaNigra", "UpperInnerQuadrantOfBreast", "C5Vertebra", "ThoracicAorta", "RightInguinalRegion", "RightLowerQuadrantOfAbdomen", "CockettPerforatingVein", "RightMainBronchus", "AVGrooveContinuationOfCircumflexArtery", "Thumb", "GreatCardiacVein", "MiddleLobeOfRightLung", "T12Vertebra", "C3Vertebra", "L2L3Disc", "C5C6Disc", "_2ndLeftPosterolateralCoronaryArtery", "MiddleCerebralArteryM2Segment", "LacrimalBone", "BasilicVein", "HunterianPerforatingVein", "ProfundaFemorisArtery", "Pharynx", "LigamentumArteriosum", "Clothing", "Nasopharynx", "C6C7Disc", "SuprapulmonicValveArea", "SympatheticTrunk", "LobeOfLung", "OvarianVein", "ApexOfRightVentricle", "C1Vertebra", "LateralCalfPerforator", "Phantom", "FourthLumbarArtery", "ThirdLumbarArtery", "LimbicLobe", "SkinOfChest", "PrimitiveAorta", "LumenOfBloodVessel", "Hemorrhage", "AntecubitalVein", "SpinalCordGrayMatter", "Mandible", "Parasternal", "LeftMainBronchus", "SystemicVein", "OccipitalLobe", "C7T1Disc", "Pelvis", "SubclavianArtery", "Amygdala", "_3rdLeftPosterolateralCoronaryArtery", "OpticChiasm", "OphthalmicArtery", "PancreaticDuct", "Nose", "Hand", "PectoralisMajorMuscle", "OvarianArtery", "Hippocampus", "SuperficialFemoralVein", "SuperiorLeftPulmonaryVein", "LeftPosteriorDescendingCircumflexCoronaryArtery", "BileDuct", "SystemicCollateralArteryToLung", "BoneTissue", "Skull", "CerebralHemisphere", "AtrioventricularVein", "IDPlate", "OpticRadiation", "T7Vertebra", "EndoNasopharyngeal", "EsophagusStomachAndDuodenum", "Breast", "Meniscus", "AxillaryFascia", "PoplitealVein", "EmbolizationCoil", "PiaMater", "TricuspidValve", "RightAtrium", "VascularSclerosis", "DistalLeftAnteriorDescendingCoronaryArtery", "InnerEar", "Coccyx", "AtrialSeptalDefect", "DescendingAorta", "ProximalLeftAnteriorDescendingCoronaryArtery", "OccipitalBone", "L2Vertebra", "Bullet", "Spine", "WhiteMatter", "Zygoma", "InnominateVein", "Abdomen", "RadioactiveImplant", "Needle", "JuxtaposedAtrialAppendage", "Jejunum", "CarotidBody", "ChestAbdomenAndPelvis", "RightHepaticVein", "GastrocnemiusVein", "Scalp", "OrbitalStructure", "LeftMainBranchOfPortalVein", "BloodVessel", "Sclera", "AnteriorPosteriorCerebralArteryBifurcation", "LiverAndBiliaryStructure", "_1stDiagonalCoronaryArtery", "Organ", "Perineum", "InteratrialSeptum", "Rectum", "Femur", "T10T11Disc", "LeftAtrium", "InterlobularArteryOfKidney", "CerebralArtery", "CouinaudHepaticSegmentVIII", "InferiorMesentericArtery", "IliocostalisMuscle", "LeftVentricularAssistDevice", "CervicalSpine", "IliacAndOrFemoralArtery", "SpinalCordWhiteMatter", "SmallIntestine", "SuperiorRightPulmonaryVein", "InferiorVenaCava", "IntraArticular", "Jewelry", "Axilla", "Thymus", "ELMExternalLimitingMembrane", "MeasuringRuler", "ParietalLobe", "IliacArtery", "T12L1Disc", "DistalRightCoronaryArtery", "SubmandibularArea", "PectoralisMinorMuscle", "OpticCanal", "SuperficialTemporalArtery", "MedialLemniscus", "InferiorCerebellarPeduncle", "RightMainBranchOfPortalVein", "SphenoidBone", "Spleen", "ChestAndAbdomen", "C4Vertebra", "LowerOuterQuadrantOfBreast", "Mediastinum", "Cerebellum", "FirstLumbarArtery", "PoplitealArtery", "UpperUrinaryTract", "PulmonaryVenousAtrium", "T9T10Disc", "EmbolizationParticulate", "DorsalScapularArtery", "L3L4Disc", "LeftVentricle", "CostalCartilage", "SaphenousVein", "Gallbladder", "_2ndRightPosterolateralCoronaryArtery", "RenalArtery", "PeritonealCavity", "UpperArm", "Chest", "GastroduodenalArtery", "Bile", "AzygosVein", "Liver", "Rib", "L5S1Disc", "Stent", "Implant", "CommonFemoralArtery", "SmallCardiacVein", "SuperficialPalmarVenousArch", "Vertebra", "CongenitalCoronaryArteryFistulaToLeftAtrium", "T7T8Disc", "VenaCava", "HilarArtery", "LeftCoronaryArtery", "Embolus", "ApexOfLung", "ThirdVentricle", "_3rdDiagonalCoronaryArtery", "SpinalisMuscle", "SaphenofemoralJunction", "Anus", "FrontalBone", "Clip", "CommonIliacVein", "TrabeculaeCarnae", "BoneScrew", "PosteriorCerebralArteryP1Segment", "LumbarSpine", "ThyrocervicalTrunk", "Inflammation", "PrimitivePulmonaryArtery", "HilumOfLung", "SellaTurcica", "Scrotum", "InferiorLeftPulmonaryVein", "Intima", "LowerLeg", "RenalVein", "InternalIliacVein", "IlealVein", "Toe", "Skin", "Laser", "MiddleCardiacVein", "MiddleCerebralArtery", "PosteriorDescendingRightCoronaryArtery", "CompressionPaddle", "CorpusStriatum", "Adenohypophysis", "PosteriorTibialVein", "MuscleOfLowerLimb", "AscendingAorta", "LeftUpperQuadrantOfAbdomen", "PericardiophrenicArtery", "CardiacPacemaker", "ExternalAuditoryCanal", "Patella", "OccipitalVein", "LumboSacralSpine", "BasilarArtery", "ParanasalSinus", "BrainCerebrospinalFluidPathway", "MidCircumflexCoronaryArtery", "CouinaudHepaticSegmentII", "CentralRetinalVein", "Prosthesis", "GastricArtery", "Blood", "SubscapularisMuscle", "Perfusion", "ExternalEar", "LeftVentricleOutflowTract", "Calcaneus", "SolealVein", "IntercostalArtery", "PeripheralNerve", "TeresMajorMuscle", "ScarTissue", "PatentDuctusArteriosus", "MesentericVein", "MaleInternalGenitalia", "PalatineBone", "CoronaryArtery", "RightBranchOfHepaticArtery", "DuraMater", "Flank", "Maxilla", "EsophagealHiatus", "CentralRetinalArtery", "Normal", "Neurohypophysis", "SegmentalArtery", "BrachialVein", "T10Vertebra", "HepaticArtery", "Tracheotomy", "PeronealArtery", "Staple", "RightHypochondriacRegion", "SuperiorMesentericVein", "LumbarArtery", "Cornea", "PercutaneousTransluminalAngioplastyBalloon", "L4Vertebra", "IliacVein", "CoronaryArteryGraft", "AcromioclavicularJoint", "UmbilicalRegion", "SupraspinatusMuscle", "CongenitalCoronaryArteryFistulaToRightVentricle", "T3T4Disc", "SoftPalate", "T4Vertebra", "ExternalIntercostalMuscle", "CranialVenousSystem", "GiacominiVein", "Glue", "MiddleCerebellarPeduncle", "BloodClot", "MOSFETRadiationTherapyDosimetrySystemDosimeter", "Nerve", "FissureOfLung", "RightVentricle", "VagusNerve", "HeadAndNeck", "Bladder", "Vulva", "LargeIntestine", "EntorhinalCortex", "Forearm", "NeckChestAndAbdomen", "SuperiorMesentericArtery", "TemporalLobe", "PosteriorTibialArtery", "FemoralVein", "RightAuricularAppendage", "GreatSaphenousVeinOfThigh", "LeftHepaticVein", "L5Vertebra", "DetachableBalloon", "SuperficialFemoralArtery", "JWire", "_2ndMarginalCoronaryArtery", "T11T12Disc", "SuperiorCerebellarPeduncle", "AorticArch", "Carina", "Telencephalon", "LeftBranchOfHepaticArtery", "ArcuateArteryOfTheKidney", "Heart", "CephalicVein", "Lip", "GastricVein", "LeftMainCoronaryArtery", "InferiorRightHepaticVein", "CarotidSiphon", "SystemicVenousAtrium", "PlantarArterialArch", "L1L2Disc", "AnomalousPulmonaryVein", "LesserSaphenousVein", "AutonomicNerve", "GreatSaphenousVein", "T1T2Disc", "Necrosis", "Ureter", "UlnarVein", "MiddleEar", "InternalAuditoryCanal", "RightPulmonaryArtery", "ProperHepaticArtery", "InterlobarArteryOfKidney", "CorpusCallosum", "PerforatingArteryOfKidney", "Humerus", "T5T6Disc", "AorticFistula", "LeftLumbarRegion", "ILMInternalLimitingMembrane", "NasalBone", "Collimator", "Mass", "Cervix", "LeftAnteriorDescendingCoronaryArtery", "Artery", "Buttock", "FallopianTube", "Vein", "CerebrospinalFluid", "EsophagealArtery", "T8T9Disc", "RadialVein", "InferiorRightPulmonaryVein", "PulmonaryValveSinuses", "UterineArtery", "Gas", "EndoVesical", "MesentericArtery", "MuscleOfHead", "MiddleCerebralArteryM1Segment", "CouinaudHepaticSegmentIV", "ExternalJugularVein", "InternalIliacArtery", "SuperiorVenaCava", "FeedingTube", "Urine", "PosteriorArchVein", "AnteriorSpinalArtery", "Stretcher", "AnusRectumAndSigmoidColon", "SplenicVein", "Colon", "CentralNervousSystem", "NeoplasmPrimary", "SplenicArtery", "AccessoryRenalArtery", "Media", "BBShotLeadPellet", "SeminalVesicle", "Headrest", "DistalCircumflexCoronaryArtery", "Feces", "BoneOfUpperLimb", "DorsalisPedisArtery", "Vagina", "LongissimusMuscle", "LowerInnerQuadrantOfBreast", "Clavicle", "ParotidGland", "AorticIsthmus", "Capillary", "_1stLeftPosterolateralCoronaryArtery", "Subxiphoid", "Diaphragm", "VasDeferens", "T6T7Disc", "AxillaryArtery", "LeftPulmonaryArtery", "Ileum", "SalivaryGland", "VertebralArtery", "TransjugularIntrahepaticPortosystemicShunt", "SupraRenalAorta", "AdiposeTissue", "InternalJugularVein", "LacrimalArteryOfRightEye", "ChordaeTendineaeCordis", "OpaqueMarker", "SacroiliacJoint", "ScalenousAnteriorMuscle", "CardiacPacemakerLead", "EntireBody", "TesticularArtery", "HypogastricRegion", "HyoidBone", "C2Vertebra", "ThoracicDuct", "AtherectomyDevice", "BoydPerforatingVein", "BodyCavity", "Peritioneum", "CommonIliacArtery", "SupraclavicularRegionOfNeck", "Meninges", "Shoulder", "TransversusThoracis", "CardiacSeptumProsthesis", "CerebellarWhiteMatter", "InterventricularSeptum", "Cingulum", "LowerLobeOfLung", "TesticularVein", "AnteriorTibialVein", "LeftInguinalRegion", "RightCoronaryArtery", "Edema", "Putamen", "CostocervicalTrunk", "FifthLumbarArtery", "AxillaryVein", "SubclavianVein", "PulmonaryValve", "ExternalIliacArtery", "ProximalRightCoronaryArtery", "TemporalBone", "BoneOfLowerLimb", "Midbrain", "PosteriorCerebralArtery", "ErectorSpinaeMuscle", "DeepPalmarVenousArch", "T2T3Disc", "Mouth", "PharynxAndLarynx", "CarotidArtery", "SmallestCardiacVein", "UmbilicalArtery", "Cheek", "EndotrachealTube", "LymphNode", "RadialArtery", "T2Vertebra", "LeftFemoralArtery", "TrapeziusMuscle", "Backrest", "Esophagus", "RotationalAtherectomyDevice", "LateralCorticospinalTract", "BroadLigament", "CerebralAqueduct", "Insula", "PulmonaryVein", "MuscleOfNeck", "Lung", "SacroCoccygealSpine", "HeartValveProsthesis", "LeftMainCoronaryArteryOstium", "T9Vertebra", "CardiovascularSystem", "CouinaudHepaticSegmentI", "ElbowJoint", "Sternum", "NeckAndChest", "RightVentricleOutflowTract", "GlobusPallidus", "AbdomenAndPelvis", "UpperOuterQuadrantOfBreast", "PancreaticDuctAndBileDuctSystems", "ApexOfLeftVentricle", "PericardialCavity", "PulmonaryArtery", "Defibrillator", "MidLeftAnteriorDescendingCoronaryArtery", "C6Vertebra", "Thyroid", "EthmoidBone", "InfraRenalAorta", "SternoclavicularJoint", "ThoracoLumbarSpine", "Neck", "CarotidBulb", "Finger", "InlayDentalRestoration", "InfraspinatusMuscle", "CouinaudHepaticSegmentVII", "SuperiorPhrenicArtery", "CommonVentricle", "RightPulmonaryVein", "Catheter", "Uterus", "TemporomandibularJoint", "Ventricle", "TracheaAndBronchus", "Testis", "Eyeball", "Face", "Tissue", "UrinarySystem", "BrainStem", "Foot", "MuscleOfUpperLimb", "PeripheralNervousSystem", "PinealGland", "UpperLobeOfLung", "PosterolateralBranchOfRightCoronaryArtery", "ProximalCircumflexCoronaryArtery", "LowerLimb", "PosteriorCommunicationArtery", "VertebralColumnAndCranium", "AbdominalAorta", "Tongue", "Table", "ChestWallMuscle", "GrayMatter", "Fibula", "SuperiorLongitudinalFasciculus", "InferiorCardiacVein", "InternalIntercostalMuscle", "LateralVentricle", "CaudateNucleus", "LacrimalArtery", "OccipitalArtery", "Brain", "WasteMaterial", "EmbolizationBall", "AtrialVein", "SuprasternalNotch", "AnteriorCardiacVein", "Pancreas", "BoneOfThorax", "DigitalArteryOfHand", "SecondLumbarArtery", "_1stRightPosterolateralCoronaryArtery", "BladderAndUrethra", "Suture", "Sacrum", "FemaleInternalGenitalia", "T8Vertebra", "MaleExternalGenitalia", "RetroperitonealSpace", "AnteriorMiddleCerebralArteryBifurcation", "SuperiorThyroidArtery", "CerebralCortex", "TruncusArteriosusCommunis", "T1Vertebra", "Tooth", "Joint", "GreatSaphenousVeinOfCalf", "LeftPulmonaryVein", "Aorta", "Diencephalon", "CongenitalCoronaryArteryFistulaToLeftVentricle", "NeckChestAbdomenAndPelvis", "T6Vertebra", "LatissimusDorsiMuscle", "CervicalCollar", "CommonHepaticArtery", "AnkleJoint", "C4C5Disc", "Bronchus", "PulmonaryChamberOfCorTriatriatum", "CommonBileDuct", "UlnarArtery", "LymphoidTissue", "LumbarRegion", "ThoracicSpine", "FourthVentricle", "T5Vertebra", "HipJoint", "OpticTract", "TrunkOfPulmonaryArtery", "L3Vertebra", "T4T5Disc", "Abscess", "BrachialArtery", "C7Vertebra", "_2ndDiagonalCoronaryArtery", "Hip", "PelvisAndLowerExtremities", "SerratusAnteriorMuscle", "Floor", "Chair", "LymphaticSystem", "IntraPelvic", "Stomach", "CircumflexCoronaryArtery", "AnteriorCommunicatingArtery", "InferiorMesentericVein", "MedianCubitalVein", "CoronarySinus", "Tendon", "TerminalInternalCarotidArtery", "BiliaryTract", "Atrium", "CerebralWhiteMatter", "Knee", "Cyst", "SubarachnoidSpace", "PulmonaryVeinConfluence", "GuidingCatheter", "EyeRegion", "ThermoluminescentRadiationDosimeter", "BrainVentricle", "UmbilicalVein", "InguinalRegion", "_3rdRightPosterolateralCoronaryArtery", "EndoNasal", "InferiorPhrenicArtery", "JejunostomyTube", "PortalVein", "PosteriorCerebralCommissure", "UncinateFasciculus", "AnteriorCerebralArtery", "L4L5Disc", "Ear", "LymphaticVessel", "SpinalCord", "T11Vertebra", "Pericardium", "PosteriorCerebralArteryP2Segment", "LeftAuricularAppendage", "PelvicCavityFalse", "CircleOfWillis", "SaphenopoplitealJunction", "_1stSeptalCoronaryArtery", "Eyelid", "DeepPalmarArchOfRadialArtery", "Pleura", "HypochondriacRegion", "SubcutaneousTissue", "SegmentOfLung", "DoddPerforatingVein", ], } name_for_cid[7152] = "CardiacStructureSegmentationType" cid_concepts[7152] = { "SCT": [ "Pericardium", "PericardialCavity", "Heart", "RightVentricle", "LeftVentricle", "Aorta", ] } name_for_cid[7153] = "CNSSegmentationType" cid_concepts[7153] = { "FMA": ["ArcuateFasciculus", "SubcorticalGrayMatter"], "SCT": [ "SpinalCordWhiteMatter", "InferiorLongitudinalFasciculus", "Midbrain", "BrainCerebrospinalFluidPathway", "NucleusAccumbens", "SubstantiaNigra", "MiddleCerebellarPeduncle", "PiaMater", "CorpusCallosum", "FrontalLobe", "LimbicLobe", "ParietalLobe", "ThirdVentricle", "CerebralCortex", "CerebralWhiteMatter", "EntorhinalCortex", "SpinalCordGrayMatter", "LateralCorticospinalTract", "SubarachnoidSpace", "BrainStem", "OccipitalLobe", "BrainVentricle", "MedialLemniscus", "Pituitary", "Diencephalon", "InferiorCerebellarPeduncle", "CerebrospinalFluid", "WhiteMatter", "CerebralAqueduct", "Insula", "TemporalLobe", "PinealGland", "DuraMater", "Thalamus", "Amygdala", "Cerebellum", "OpticChiasm", "Arachnoid", "Neurohypophysis", "PosteriorCerebralCommissure", "SuperiorCerebellarPeduncle", "UncinateFasciculus", "SpinalCerebrospinalFluidPathway", "Telencephalon", "Meninges", "SpinalCord", "Hippocampus", "GrayMatter", "CerebellarWhiteMatter", "SuperiorLongitudinalFasciculus", "CentralNervousSystem", "FourthVentricle", "CerebralFornix", "Cingulum", "GlobusPallidus", "LateralVentricle", "CorpusStriatum", "Adenohypophysis", "OpticTract", "CaudateNucleus", "Brain", "Putamen", "CerebralHemisphere", "OpticRadiation", ], } name_for_cid[7154] = "AbdominalSegmentationType" cid_concepts[7154] = { "FMA": ["LumenOfGallbladder", "WallOfGallbladder"], "SCT": [ "Abdomen", "SmallIntestine", "PancreaticDuct", "CouinaudHepaticSegmentV", "InferiorVenaCava", "CouinaudHepaticSegmentII", "CouinaudHepaticSegmentIV", "AbdominalAorta", "CouinaudHepaticSegmentVII", "Peritioneum", "RetroperitonealSpace", "AbdominalWallMuscle", "CouinaudHepaticSegmentI", "Omentum", "BiliaryTract", "Gallbladder", "SkinOfAbdomen", "PeritonealCavity", "BileDuct", "PancreaticDuctAndBileDuctSystems", "UrinarySystem", "CouinaudHepaticSegmentIII", "CouinaudHepaticSegmentVI", "Pancreas", "Liver", "Spleen", "CouinaudHepaticSegmentVIII", "Kidney", "AdrenalGland", "AbdominopelvicCavity", ], } name_for_cid[7155] = "ThoracicSegmentationType" cid_concepts[7155] = { "SCT": [ "Lung", "Mediastinum", "LowerLobeOfLung", "Clavicle", "Esophagus", "Thorax", "MiddleLobeOfRightLung", "BloodVessel", "Bronchus", "Diaphragm", "Pleura", "Thymus", "ChestCavity", "BoneOfThorax", "Rib", "ChestWallMuscle", "SkinOfChest", "Trachea", "UpperLobeOfLung", "Sternum", "ThoracicSpine", ] } name_for_cid[7156] = "VascularSegmentationType" cid_concepts[7156] = { "SCT": [ "CardiovascularSystem", "VascularSclerosis", "Thrombus", "Intima", "SystemicArtery", "Adventitia", "Media", "SystemicVein", "LumenOfBloodVessel", ] } name_for_cid[7157] = "DeviceSegmentationType" cid_concepts[7157] = { "DCM": [ "BrachytherapyChannel", "RectalBalloon", "VaginalCylinder", "Mold", "BrachytherapyChannelShield", "HeadAndNeckMask", "BrachytherapySourceApplicator", "HeadMask", "Headframe", "BodyFrame", "HeadFixationBoard", "HandGrips", "BreastBoard", "AbdominalCompressionArch", "HeelStop", "AbdominalCompressionBelt", "ShinRest", "Cast", "BreastBridge", "WholeBodyPod", "VacuumMold", "SeatPan", ], "SCT": [ "Chair", "RadioactiveImplant", "Needle", "InlayDentalRestoration", "Armrest", "Table", "Stretcher", "Backrest", "Wall", "DentalProsthesis", "BonePin", "Defibrillator", "Headrest", "CardiacPacemaker", "BiteBlock", "BoneScrew", "LeftVentricularAssistDevice", "Stent", "Floor", ], } name_for_cid[7158] = "ArtifactSegmentationType" cid_concepts[7158] = {"SCT": ["Table", "ForeignBody", "Clothing"]} name_for_cid[7159] = "LesionSegmentationType" cid_concepts[7159] = { "DCM": ["Background"], "NCIt": ["EnhancingLesion", "NonEnhancingLesion"], "SCT": [ "Embolus", "NeoplasmPrimary", "Mass", "Normal", "Cyst", "Abscess", "Edema", "BloodClot", "Nodule", "Lesion", "Neoplasm", "NeoplasmSecondary", "Necrosis", "Hemorrhage", "Inflammation", ], } name_for_cid[7160] = "PelvicOrganSegmentationType" cid_concepts[7160] = { "SCT": [ "Testis", "Cervix", "Bladder", "Vulva", "PelvicCavityFalse", "PelvicCavityTrue", "FemaleInternalGenitalia", "PelvicCavityFalseAndOrTrue", "MaleExternalGenitalia", "FallopianTube", "MaleInternalGenitalia", "Rectum", "SeminalVesicle", "Ovary", "Pelvis", "Prostate", "VasDeferens", "Vagina", "Uterus", ] } name_for_cid[7161] = "PhysiologySegmentationType" cid_concepts[7161] = {"SCT": ["Perfusion"]} name_for_cid[7162] = "SurfaceProcessingAlgorithmFamily" cid_concepts[7162] = { "DCM": [ "ManualProcessing", "MultispectralProcessing", "ClusterAnalysis", "MultiScaleResolutionFiltering", "HistogramAnalysis", "MorphologicalOperations", "EdgeDetection", "AdaptiveFiltering", "NeighborhoodAnalysis", "DeformableModels", "ArtificialIntelligence", ] } name_for_cid[7165] = "AbstractSegmentationType" cid_concepts[7165] = { "DCM": [ "TissueNotOfInterest", "RegistrationInput", "Background", "SingleSubjectExtractedFromGroup", ], "NCIt": ["ReferenceRegion"], "SCT": ["Normal", "WasteMaterial", "Tissue"], } name_for_cid[7166] = "CommonTissueSegmentationType" cid_concepts[7166] = { "SCT": [ "Ligament", "SoftTissue", "Artery", "ConnectiveTissue", "LymphaticSystem", "Capillary", "Meniscus", "BloodVessel", "AdiposeTissue", "Tissue", "Organ", "Cartilage", "Vein", "BoneTissue", "Nerve", "Skin", "Blood", "SubcutaneousTissue", "LymphaticVessel", "LymphoidTissue", "LymphNode", "Tendon", "MuscleTissue", ] } name_for_cid[7167] = "PeripheralNervousSystemSegmentationType" cid_concepts[7167] = { "SCT": [ "CranialNerve", "PeripheralNervousSystem", "PeripheralNerve", "VagusNerve", "AutonomicNerve", "SympatheticTrunk", ] } name_for_cid[7168] = "BrainLesionSegmentationTypeWithNecrosis" cid_concepts[7168] = { "DCM": ["Background"], "NCIt": ["NonEnhancingLesion", "EnhancingLesion"], "SCT": ["Normal", "Necrosis", "Edema"], } name_for_cid[7169] = "BrainLesionSegmentationTypeWithoutNecrosis" cid_concepts[7169] = { "DCM": ["Background"], "NCIt": ["NonEnhancingLesion", "EnhancingLesion"], "SCT": ["Normal", "Edema"], } name_for_cid[7170] = "CouinaudLiverSegment" cid_concepts[7170] = { "SCT": [ "CouinaudHepaticSegmentIII", "CouinaudHepaticSegmentVII", "CouinaudHepaticSegmentVI", "CouinaudHepaticSegmentI", "CouinaudHepaticSegmentV", "CouinaudHepaticSegmentVIII", "CouinaudHepaticSegmentII", "CouinaudHepaticSegmentIV", ] } name_for_cid[7171] = "LiverSegmentationType" cid_concepts[7171] = { "SCT": [ "CouinaudHepaticSegmentIII", "CouinaudHepaticSegmentVII", "CouinaudHepaticSegmentVI", "CouinaudHepaticSegmentI", "CouinaudHepaticSegmentV", "CouinaudHepaticSegmentVIII", "CouinaudHepaticSegmentII", "CouinaudHepaticSegmentIV", ] } name_for_cid[7180] = "AbstractMultidimensionalImageModelComponentSemantic" cid_concepts[7180] = { "DCM": [ "ApparentDiffusionCoefficient", "DiffusionWeighted", "VolumeRatio", "DiffusionCoefficient", "WaterFatOutOfPhase", "FractionalOccupancySegmentation", "WaterFatInPhase", "FractionalProbabilisticSegmentation", "BinarySegmentation", "WaterFraction", "MRSignalIntensity", "XRayAttenuation", "FatFraction", "YBRICTCRComponent", "R2Coefficient", "YBRICTCBComponent", "ChiSquare", "YBRICTYComponent", "DW", "YBRPARTIALCRComponent", "AIC", "YBRPARTIALCBComponent", "BIC", "YBRPARTIALYComponent", "Echogenicity", "YBRRCTCRComponent", "YBRRCTCBComponent", "YBRRCTYComponent", "RelativeLinearStoppingPower", "RGBRComponent", "UltrasoundAttenuation", "TauM", "SpeedOfSound", "Vp", "Perfusion", "Elasticity", "EquivalentDose", "GradientWeightedClassActivation", "ClassActivation", "AbsorbedDose", "YBRFULLCRComponent", "Saliency", "YBRFULLCBComponent", "YBRFULLYComponent", "RGBBComponent", "RGBGComponent", "CreatineCholineCitrateRatio", "MagnetizationTransferRatio", "IAUC90BN", "IAUC180BN", "CreatineAndCholine", "LipidAndLactate", "SpatialDisplacementYComponent", "SpatialDisplacementXComponent", "NuclearMedicineTomographicActivity", "IAUC", "NuclearMedicineProjectionActivity", "IAUC60", "IAUC90", "IAUC180", "IAUCBN", "IAUC60BN", "FlowVariance", "FlowVelocity", "TissueVelocity", "IndexedHemodynamicResistance", "HemodynamicResistance", "SpatialDisplacementZComponent", "AttenuationCoefficient", "GlutamateAndGlutamine", "CholineCreatineRatio", "NAcetylaspartateCreatineRatio", "NAcetylaspartateCholineRatio", "Tmax", "R2Star", "VolumetricDiffusionDxzComponent", "MagneticSusceptibility", "VolumetricDiffusionDxyComponent", "VolumetricDiffusionDxxComponent", "RelativeRegionalBloodFlow", "RelativeRegionalBloodVolume", "Ktrans", "Kep", "Ve", "BloodOxygenationLevel", "T2StarWeightedDynamicContrastEnhancedMRSignalIntensity", "T2WeightedDynamicContrastEnhancedMRSignalIntensity", "AbsoluteRegionalBloodFlow", "T1WeightedDynamicContrastEnhancedMRSignalIntensity", "AbsoluteRegionalBloodVolume", "VolumetricDiffusionDzzComponent", "OxygenExtractionFraction", "R1", "VolumetricDiffusionDyzComponent", "R2", "VolumetricDiffusionDyyComponent", "VelocityEncoded", "ZScore", "ContrastAgentAngioMRSignalIntensity", "SpinTaggingPerfusionMRSignalIntensity", "RelativeAnisotropy", "FractionalAnisotropy", "FieldMapMRSignalIntensity", "T2StarWeightedMRSignalIntensity", "T2WeightedMRSignalIntensity", "T1WeightedMRSignalIntensity", "ProtonDensityWeightedMRSignalIntensity", "TimeOfFlightAngioMRSignalIntensity", "T1", "T2Star", "T2", "TimeCourseOfSignal", "TemperatureEncoded", "StudentTTest", "TimeToPeak", "SignalToNoise", "TemporalDerivativeThreshold", "MaximumSlope", "MaximumDifference", "TracerConcentration", "TimeOfPeakConcentration", "BolusArrivalTime", "TimeOfLeadingHalfPeakConcentration", "MeanTransitTime", "KurtosisDiffusionCoefficient", "GammaDistributionScaleParameter", "NegativeEnhancementIntegral", "GammaDistributionShapeParameter", "GammaDistributionMode", "DistributedDiffusionCoefficient", "RCoefficient", "AnomalousExponentParameter", "ProtonDensity", "SignalChange", "Suvbsa", "Suvibw", "SuvlbmJanma", "SuvlbmJames128", "MonoExponentialApparentDiffusionCoefficient", "SlowDiffusionCoefficient", "FastDiffusionCoefficient", "FastDiffusionCoefficientFraction", "StandardizedUptakeValue", "Suvbw", "Suvlbm", ], "SCT": [ "Fat", "Lipid", "NAcetylaspartate", "PowerDoppler", "Creatine", "Glutamine", "Tuarine", "Citrate", "Lactate", "Inositol", "Water", "Choline", ], } name_for_cid[7181] = "AbstractMultidimensionalImageModelComponentUnit" cid_concepts[7181] = { "UCUM": [ "SquareCentimeterPerMilliliter", "SquareMillimeterPerSecond", "CubicCentimeter", "SquareCentimeter", "SquareMicrometerPerMillisecond", "StandardizedUptakeValueBodySurfaceArea", "StandardizedUptakeValueLeanBodyMassJanma", "Millitesla", "Sv", "SecondPerSquareMillimeter", "CubicMillimeter", "SquareMillimeter", "MilligramsPerMinutePerMilliliter", "StandardizedUptakeValueIdealBodyWeight", "_10EMinus6SquareMillimetersPerSecond", "BecquerelsPerMilliliter", "Micrometer", "MillimolesPerKilogramWetWeight", "Gy", "MicromolePerMinutePerMilliliter", "Decibel", "ArbitraryUnit", "WoodUM2", "DynScm5", "MilliliterPerMinutePerGram", "SquareMicrometerPerSecond", "StandardizedUptakeValueBodyWeight", "MilliliterPer100Milliliter", "MillimeterPerSecond", "MicromolePerMilliliter", "ProportionalToCountsPerSecond", "Centimeter", "MilliliterPerMinute", "CountsPerSecond", "Ppm", "Second", "PRUPerSquareMeter", "StandardizedUptakeValueLeanBodyMassJames128Multiplier", "WoodU", "MilliliterPerGram", "ProportionalToCounts", "Kilopascal", "NumberParticlesPer100GramOfTissue", "MilliliterPer100GramPerMinute", "PerMinute", "PerCentimeter", "CubicDecimeter", "Millimeter", "CentimeterPerSecond", "PRU", "Ratio", "CubicMicrometer", "SquareMicrometer", "Counts", "Millisecond", "DynScm5M2", "Percent", "PerSecond", "NoUnits", "HounsfieldUnit", "MilliliterPerSecond", "DegreesCelsius", "MillimetersHg", "StandardizedUptakeValueLeanBodyMassJames", "Hertz", ] } name_for_cid[7182] = "AbstractMultidimensionalImageModelDimensionSemantic" cid_concepts[7182] = {"DCM": ["LinearDisplacement", "Angle", "Time", "PhotonEnergy"]} name_for_cid[7183] = "AbstractMultidimensionalImageModelDimensionUnit" cid_concepts[7183] = { "UCUM": [ "Millimeter", "Radian", "Degree", "Centimeter", "Micrometer", "Millisecond", "Second", ] } name_for_cid[7184] = "AbstractMultidimensionalImageModelAxisDirection" cid_concepts[7184] = { "DCM": [ "SeptumWallAxis", "AnteriorInferiorAxis", "ApexBaseAxis", "AnteriorPosteriorAxis", "HeadFootAxis", "LeftRightAxis", ] } name_for_cid[7185] = "AbstractMultidimensionalImageModelAxisOrientation" cid_concepts[7185] = { "DCM": [ "LeftToRight", "RightToLeft", "WallToSeptum", "SeptumToWall", "InferiorToAnterior", "AnteriorToInferior", "BaseToApex", "ApexToBase", "PosteriorToAnterior", "AnteriorToPosterior", "FootToHead", "HeadToFoot", ] } name_for_cid[ 7186 ] = "AbstractMultidimensionalImageModelQualitativeDimensionSampleSemantic" cid_concepts[7186] = { "DCM": [ "GlutamateAndGlutamine", "CholineCreatineRatio", "NAcetylaspartateCreatineRatio", "NAcetylaspartateCholineRatio", "VolumetricDiffusionDxzComponent", "RGBRComponent", "VolumetricDiffusionDxyComponent", "VolumetricDiffusionDxxComponent", "YBRFULLCRComponent", "YBRFULLCBComponent", "VolumetricDiffusionDzzComponent", "YBRFULLYComponent", "VolumetricDiffusionDyzComponent", "RGBBComponent", "VolumetricDiffusionDyyComponent", "RGBGComponent", "CreatineCholineCitrateRatio", "CreatineAndCholine", "LipidAndLactate", "YBRICTCRComponent", "YBRICTCBComponent", "YBRICTYComponent", "YBRPARTIALCRComponent", "YBRPARTIALCBComponent", "YBRPARTIALYComponent", "YBRRCTCRComponent", "YBRRCTCBComponent", "YBRRCTYComponent", ], "SCT": [ "Inositol", "Citrate", "Creatine", "Lactate", "Glutamine", "Lipid", "Choline", "NAcetylaspartate", "Tuarine", ], } name_for_cid[7191] = "TissueSegmentationPropertyType" cid_concepts[7191] = { "SCT": [ "Ligament", "SoftTissue", "Artery", "ConnectiveTissue", "LymphaticSystem", "Capillary", "Meniscus", "ScarTissue", "BloodVessel", "AdiposeTissue", "Tissue", "Organ", "Cartilage", "Vein", "BoneTissue", "Nerve", "Skin", "Blood", "SubcutaneousTissue", "LymphaticVessel", "LymphoidTissue", "LymphNode", "Tendon", "MuscleTissue", ] } name_for_cid[7192] = "AnatomicalStructureSegmentationPropertyType" cid_concepts[7192] = { "BARI": [ "_1stMarginalCoronaryArteryLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "_3rdDiagonalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", ], "DCM": [ "AorticKnob", "ArchOfTheAzygosVein", "SecondaryPulmonaryLobule", "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", "MidlungWindow", "CarinaAngle", "CentrilobularStructures", "AnteriorJunctionLine", "PosteriorJunctionLine", "SurfaceOfTheChoroidScleraInterface", "OuterSurfaceOfTheBM", "OuterSurfaceOfTheCC", "PosteriorSurfaceOfTheRPE", "SurfaceOfTheCenterOfTheRPE", "OuterSurfaceOfIPL", "OuterSurfaceOfGCL", "OuterSurfaceOfOPL", "OuterSurfaceOfINL", "SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors", "OuterSurfaceOfHFL", "AnteriorSurfaceOfTheRPE", "SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE", "OuterSurfaceOfRNFL", ], "FMA": [ "SubcorticalGrayMatter", "ArcuateFasciculus", "WallOfGallbladder", "LumenOfGallbladder", ], "SCT": [ "ProfundaFemorisVein", "LeftHypochondriacRegion", "SternocleidomastoidMuscle", "TruncusCoeliacus", "C3C4Disc", "InferiorLongitudinalFasciculus", "BasilarArtery", "ParanasalSinus", "PelvicCavityTrue", "BrainCerebrospinalFluidPathway", "WristJoint", "MidCircumflexCoronaryArtery", "CouinaudHepaticSegmentII", "CentralRetinalVein", "IntermediateArteryRamus", "GenicularArtery", "LeftVentricleInflow", "FontanelOfSkull", "SigmoidColon", "GastricArtery", "SubscapularisMuscle", "ExternalEar", "LeftVentricleOutflowTract", "RightFemoralArtery", "Intracranial", "JawRegion", "Calcaneus", "SolealVein", "IntercostalArtery", "PeripheralNerve", "LobarArtery", "TeresMajorMuscle", "PatentDuctusArteriosus", "ThighPerforator", "MesentericVein", "Pituitary", "MaleInternalGenitalia", "MidRightCoronaryArtery", "IntraThoracic", "PalatineBone", "CoronaryArtery", "RightBranchOfHepaticArtery", "UpperLimb", "DuraMater", "ExternalIliacVein", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "ParietalBone", "Flank", "Maxilla", "EsophagealHiatus", "CentralRetinalArtery", "Neurohypophysis", "SegmentalArtery", "BrachialVein", "RightUpperQuadrantOfAbdomen", "T10Vertebra", "Eye", "SuperficialPalmarArch", "Prostate", "HepaticArtery", "FacialBones", "Back", "PeronealArtery", "Duodenum", "RightHypochondriacRegion", "_1stMarginalCoronaryArtery", "SuperiorMesentericVein", "LumbarArtery", "Cornea", "Larynx", "PeronealVein", "L4Vertebra", "FemoralArtery", "IliacVein", "Ovary", "Urethra", "CoronaryArteryGraft", "Head", "AdrenalGland", "MitralValve", "AcromioclavicularJoint", "UmbilicalRegion", "SupraspinatusMuscle", "CongenitalCoronaryArteryFistulaToRightVentricle", "Calyx", "PosteriorMedialTributary", "PulmonaryVeinGreatVessel", "T3T4Disc", "SoftPalate", "T4Vertebra", "Submental", "ExternalIntercostalMuscle", "CranialVenousSystem", "NucleusAccumbens", "GiacominiVein", "PoplitealFossa", "MiddleCerebellarPeduncle", "PulmonaryArteryConduit", "InternalCarotidArteryC5Segment", "FissureOfLung", "RightVentricle", "LevatoresCostarumMuscles", "FrontalLobe", "VagusNerve", "Adventitia", "HeadAndNeck", "Hypopharynx", "RightCoronaryArteryOstium", "HepaticVein", "MarginalCoronaryArtery", "InternalMammaryArtery", "Bladder", "Vulva", "LargeIntestine", "EntorhinalCortex", "Forearm", "BronchialArtery", "CouinaudHepaticSegmentIII", "NeckChestAndAbdomen", "ExternalCarotidArtery", "SuperiorMesentericArtery", "TemporalLobe", "SystemicArtery", "PosteriorTibialArtery", "FemoralVein", "RightAuricularAppendage", "GreatSaphenousVeinOfThigh", "IntraAbdominopelvic", "LeftHepaticVein", "L5Vertebra", "SuperficialFemoralArtery", "VomerBone", "UterusAndFallopianTubes", "Arachnoid", "_2ndMarginalCoronaryArtery", "T11T12Disc", "SuperiorCerebellarPeduncle", "AorticArch", "Carina", "Telencephalon", "LeftBranchOfHepaticArtery", "ArcuateArteryOfTheKidney", "Heart", "TarsalJoint", "CephalicVein", "LingualArtery", "Lip", "GastricVein", "AirwayStructure", "CongenitalCoronaryArteryFistulaToRightAtrium", "DeltoidMuscle", "LeftMainCoronaryArtery", "CerebralFornix", "Penis", "Baffle", "InferiorRightHepaticVein", "VentricularVein", "CarotidSiphon", "SystemicVenousAtrium", "PlantarArterialArch", "L1L2Disc", "Parathyroid", "AnomalousPulmonaryVein", "Scapula", "LesserSaphenousVein", "Kidney", "AutonomicNerve", "GreatSaphenousVein", "T1T2Disc", "OmentalBursa", "InternalCarotidArtery", "L1Vertebra", "Ureter", "RightPosteriorAVCoronaryArtery", "UlnarVein", "FascialLayer", "MiddleEar", "CouinaudHepaticSegmentV", "InternalAuditoryCanal", "RightPulmonaryArtery", "RenalPelvis", "ProperHepaticArtery", "InterlobarArteryOfKidney", "Thrombus", "VenousNetwork", "SubcostalMuscle", "CorpusCallosum", "CommonAtrium", "PerforatingArteryOfKidney", "Humerus", "T5T6Disc", "Ilium", "AorticFistula", "InternalCarotidArteryC6Segment", "LeftLumbarRegion", "ILMInternalLimitingMembrane", "NasalBone", "AnteriorTibialArtery", "CranialNerve", "Cervix", "SkinOfAbdomen", "LeftAnteriorDescendingCoronaryArtery", "Artery", "CommonCarotidArtery", "Buttock", "InnermostIntercostalMuscles", "_3rdMarginalCoronaryArtery", "FallopianTube", "MastoidBone", "Vein", "CommonIliacArteryBifurcation", "MiddleHepaticVein", "CouinaudHepaticSegmentVI", "CerebrospinalFluid", "EsophagealArtery", "T8T9Disc", "Thigh", "RadialVein", "InferiorRightPulmonaryVein", "Trachea", "PulmonaryValveSinuses", "LeftPosterolateralCircumflexCoronaryArtery", "UterineArtery", "BodyConduit", "Thalamus", "EndoVesical", "RightVentricleInflow", "MesentericArtery", "LeftLowerQuadrantOfAbdomen", "MuscleOfHead", "SpinalCerebrospinalFluidPathway", "MiddleCerebralArteryM1Segment", "CouinaudHepaticSegmentIV", "ExternalJugularVein", "SesamoidBonesOfFoot", "InternalIliacArtery", "SuperiorVenaCava", "C2C3Disc", "AbdominalWallMuscle", "SixthLumbarArtery", "PosteriorArchVein", "AnteriorSpinalArtery", "AnusRectumAndSigmoidColon", "Omentum", "SplenicVein", "Colon", "SubmandibularGland", "CentralNervousSystem", "CarotidBifurcation", "T3Vertebra", "InnominateArtery", "SplenicArtery", "Extremity", "FacialArtery", "AccessoryRenalArtery", "BoneStructureOfHeadAndOrNeck", "EpigastricRegion", "Media", "SeminalVesicle", "CervicoThoracicSpine", "DistalCircumflexCoronaryArtery", "RightLumbarRegion", "TeresMinorMuscle", "BoneOfUpperLimb", "DorsalisPedisArtery", "Vagina", "LongissimusMuscle", "LowerInnerQuadrantOfBreast", "Clavicle", "ParotidGland", "AorticIsthmus", "CommonFemoralVein", "SubstantiaNigra", "_1stLeftPosterolateralCoronaryArtery", "Subxiphoid", "UpperInnerQuadrantOfBreast", "Diaphragm", "C5Vertebra", "ThoracicAorta", "RightInguinalRegion", "VasDeferens", "T6T7Disc", "AxillaryArtery", "LeftPulmonaryArtery", "Ileum", "SalivaryGland", "VertebralArtery", "TransjugularIntrahepaticPortosystemicShunt", "RightLowerQuadrantOfAbdomen", "SupraRenalAorta", "InternalJugularVein", "LacrimalArteryOfRightEye", "CockettPerforatingVein", "ChordaeTendineaeCordis", "SacroiliacJoint", "RightMainBronchus", "ScalenousAnteriorMuscle", "AVGrooveContinuationOfCircumflexArtery", "EntireBody", "TesticularArtery", "Thumb", "HypogastricRegion", "GreatCardiacVein", "HyoidBone", "C2Vertebra", "ThoracicDuct", "MiddleLobeOfRightLung", "BoydPerforatingVein", "BodyCavity", "Peritioneum", "CommonIliacArtery", "SupraclavicularRegionOfNeck", "Meninges", "T12Vertebra", "C3Vertebra", "Shoulder", "TransversusThoracis", "CardiacSeptumProsthesis", "CerebellarWhiteMatter", "L2L3Disc", "InterventricularSeptum", "C5C6Disc", "_2ndLeftPosterolateralCoronaryArtery", "MiddleCerebralArteryM2Segment", "Cingulum", "LowerLobeOfLung", "TesticularVein", "AnteriorTibialVein", "LacrimalBone", "BasilicVein", "LeftInguinalRegion", "RightCoronaryArtery", "HunterianPerforatingVein", "Putamen", "ProfundaFemorisArtery", "CostocervicalTrunk", "Pharynx", "FifthLumbarArtery", "AxillaryVein", "LigamentumArteriosum", "Nasopharynx", "C6C7Disc", "SuprapulmonicValveArea", "SympatheticTrunk", "LobeOfLung", "SubclavianVein", "PulmonaryValve", "ExternalIliacArtery", "ProximalRightCoronaryArtery", "TemporalBone", "BoneOfLowerLimb", "Midbrain", "OvarianVein", "PosteriorCerebralArtery", "ErectorSpinaeMuscle", "DeepPalmarVenousArch", "ApexOfRightVentricle", "T2T3Disc", "C1Vertebra", "LateralCalfPerforator", "Phantom", "Mouth", "PharynxAndLarynx", "CarotidArtery", "FourthLumbarArtery", "SmallestCardiacVein", "ThirdLumbarArtery", "LimbicLobe", "SkinOfChest", "UmbilicalArtery", "Cheek", "LymphNode", "PrimitiveAorta", "RadialArtery", "T2Vertebra", "LeftFemoralArtery", "LumenOfBloodVessel", "TrapeziusMuscle", "Esophagus", "AntecubitalVein", "SpinalCordGrayMatter", "Mandible", "LateralCorticospinalTract", "Parasternal", "LeftMainBronchus", "BroadLigament", "SystemicVein", "OccipitalLobe", "C7T1Disc", "CerebralAqueduct", "Insula", "Pelvis", "PulmonaryVein", "MuscleOfNeck", "SubclavianArtery", "Amygdala", "Lung", "SacroCoccygealSpine", "_3rdLeftPosterolateralCoronaryArtery", "OpticChiasm", "OphthalmicArtery", "PancreaticDuct", "Nose", "Hand", "PectoralisMajorMuscle", "LeftMainCoronaryArteryOstium", "T9Vertebra", "CardiovascularSystem", "CouinaudHepaticSegmentI", "OvarianArtery", "ElbowJoint", "Hippocampus", "Sternum", "NeckAndChest", "RightVentricleOutflowTract", "GlobusPallidus", "SuperficialFemoralVein", "SuperiorLeftPulmonaryVein", "LeftPosteriorDescendingCircumflexCoronaryArtery", "BileDuct", "SystemicCollateralArteryToLung", "AbdomenAndPelvis", "UpperOuterQuadrantOfBreast", "PancreaticDuctAndBileDuctSystems", "ApexOfLeftVentricle", "PericardialCavity", "PulmonaryArtery", "Skull", "MidLeftAnteriorDescendingCoronaryArtery", "C6Vertebra", "CerebralHemisphere", "AtrioventricularVein", "Thyroid", "EthmoidBone", "OpticRadiation", "InfraRenalAorta", "SternoclavicularJoint", "ThoracoLumbarSpine", "T7Vertebra", "EndoNasopharyngeal", "EsophagusStomachAndDuodenum", "Breast", "Neck", "AxillaryFascia", "CarotidBulb", "Finger", "PoplitealVein", "InfraspinatusMuscle", "PiaMater", "TricuspidValve", "RightAtrium", "CouinaudHepaticSegmentVII", "VascularSclerosis", "SuperiorPhrenicArtery", "CommonVentricle", "DistalLeftAnteriorDescendingCoronaryArtery", "InnerEar", "Coccyx", "AtrialSeptalDefect", "RightPulmonaryVein", "Uterus", "TemporomandibularJoint", "Ventricle", "DescendingAorta", "TracheaAndBronchus", "Testis", "ProximalLeftAnteriorDescendingCoronaryArtery", "OccipitalBone", "L2Vertebra", "Eyeball", "Face", "Spine", "UrinarySystem", "BrainStem", "Foot", "WhiteMatter", "MuscleOfUpperLimb", "PeripheralNervousSystem", "PinealGland", "UpperLobeOfLung", "PosterolateralBranchOfRightCoronaryArtery", "Zygoma", "InnominateVein", "Abdomen", "ProximalCircumflexCoronaryArtery", "LowerLimb", "PosteriorCommunicationArtery", "JuxtaposedAtrialAppendage", "VertebralColumnAndCranium", "Jejunum", "CarotidBody", "ChestAbdomenAndPelvis", "AbdominalAorta", "RightHepaticVein", "GastrocnemiusVein", "Scalp", "Tongue", "ChestWallMuscle", "GrayMatter", "Fibula", "SuperiorLongitudinalFasciculus", "OrbitalStructure", "InferiorCardiacVein", "LeftMainBranchOfPortalVein", "InternalIntercostalMuscle", "LateralVentricle", "CaudateNucleus", "LacrimalArtery", "OccipitalArtery", "Brain", "BloodVessel", "Sclera", "AnteriorPosteriorCerebralArteryBifurcation", "LiverAndBiliaryStructure", "AtrialVein", "_1stDiagonalCoronaryArtery", "SuprasternalNotch", "Perineum", "InteratrialSeptum", "Rectum", "Femur", "AnteriorCardiacVein", "T10T11Disc", "Pancreas", "BoneOfThorax", "LeftAtrium", "InterlobularArteryOfKidney", "CerebralArtery", "CouinaudHepaticSegmentVIII", "InferiorMesentericArtery", "DigitalArteryOfHand", "SecondLumbarArtery", "IliocostalisMuscle", "_1stRightPosterolateralCoronaryArtery", "BladderAndUrethra", "CervicalSpine", "IliacAndOrFemoralArtery", "SpinalCordWhiteMatter", "Sacrum", "SmallIntestine", "FemaleInternalGenitalia", "SuperiorRightPulmonaryVein", "T8Vertebra", "InferiorVenaCava", "MaleExternalGenitalia", "IntraArticular", "Axilla", "RetroperitonealSpace", "Thymus", "ELMExternalLimitingMembrane", "AnteriorMiddleCerebralArteryBifurcation", "ParietalLobe", "SuperiorThyroidArtery", "IliacArtery", "T12L1Disc", "DistalRightCoronaryArtery", "CerebralCortex", "TruncusArteriosusCommunis", "T1Vertebra", "Tooth", "Joint", "SubmandibularArea", "GreatSaphenousVeinOfCalf", "LeftPulmonaryVein", "PectoralisMinorMuscle", "OpticCanal", "Aorta", "SuperficialTemporalArtery", "MedialLemniscus", "Diencephalon", "CongenitalCoronaryArteryFistulaToLeftVentricle", "NeckChestAbdomenAndPelvis", "InferiorCerebellarPeduncle", "RightMainBranchOfPortalVein", "SphenoidBone", "T6Vertebra", "LatissimusDorsiMuscle", "Spleen", "ChestAndAbdomen", "CommonHepaticArtery", "C4Vertebra", "AnkleJoint", "LowerOuterQuadrantOfBreast", "C4C5Disc", "Mediastinum", "Cerebellum", "FirstLumbarArtery", "PoplitealArtery", "UpperUrinaryTract", "PulmonaryVenousAtrium", "Bronchus", "PulmonaryChamberOfCorTriatriatum", "T9T10Disc", "DorsalScapularArtery", "CommonBileDuct", "UlnarArtery", "L3L4Disc", "LeftVentricle", "LumbarRegion", "CostalCartilage", "ThoracicSpine", "FourthVentricle", "SaphenousVein", "T5Vertebra", "Gallbladder", "_2ndRightPosterolateralCoronaryArtery", "RenalArtery", "PeritonealCavity", "HipJoint", "UpperArm", "OpticTract", "TrunkOfPulmonaryArtery", "Chest", "GastroduodenalArtery", "L3Vertebra", "T4T5Disc", "AzygosVein", "BrachialArtery", "C7Vertebra", "_2ndDiagonalCoronaryArtery", "Liver", "Hip", "Rib", "L5S1Disc", "PelvisAndLowerExtremities", "SerratusAnteriorMuscle", "CommonFemoralArtery", "SmallCardiacVein", "IntraPelvic", "SuperficialPalmarVenousArch", "Vertebra", "Stomach", "CircumflexCoronaryArtery", "AnteriorCommunicatingArtery", "CongenitalCoronaryArteryFistulaToLeftAtrium", "InferiorMesentericVein", "T7T8Disc", "VenaCava", "MedianCubitalVein", "CoronarySinus", "HilarArtery", "TerminalInternalCarotidArtery", "LeftCoronaryArtery", "BiliaryTract", "ApexOfLung", "ThirdVentricle", "Atrium", "CerebralWhiteMatter", "Knee", "_3rdDiagonalCoronaryArtery", "SpinalisMuscle", "SubarachnoidSpace", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "EyeRegion", "BrainVentricle", "Anus", "UmbilicalVein", "FrontalBone", "CommonIliacVein", "TrabeculaeCarnae", "InguinalRegion", "PosteriorCerebralArteryP1Segment", "_3rdRightPosterolateralCoronaryArtery", "EndoNasal", "LumbarSpine", "ThyrocervicalTrunk", "InferiorPhrenicArtery", "PrimitivePulmonaryArtery", "HilumOfLung", "SellaTurcica", "PortalVein", "Scrotum", "PosteriorCerebralCommissure", "InferiorLeftPulmonaryVein", "UncinateFasciculus", "Intima", "AnteriorCerebralArtery", "LowerLeg", "RenalVein", "L4L5Disc", "InternalIliacVein", "IlealVein", "Ear", "Toe", "SpinalCord", "MiddleCardiacVein", "T11Vertebra", "Pericardium", "MiddleCerebralArtery", "PosteriorCerebralArteryP2Segment", "PosteriorDescendingRightCoronaryArtery", "CorpusStriatum", "LeftAuricularAppendage", "PelvicCavityFalse", "CircleOfWillis", "Adenohypophysis", "PosteriorTibialVein", "SaphenopoplitealJunction", "_1stSeptalCoronaryArtery", "MuscleOfLowerLimb", "Eyelid", "AscendingAorta", "LeftUpperQuadrantOfAbdomen", "DeepPalmarArchOfRadialArtery", "PericardiophrenicArtery", "Pleura", "HypochondriacRegion", "ExternalAuditoryCanal", "Patella", "SegmentOfLung", "OccipitalVein", "LumboSacralSpine", "DoddPerforatingVein", ], } name_for_cid[7193] = "PhysicalObjectSegmentationPropertyType" cid_concepts[7193] = { "DCM": [ "Mold", "BrachytherapyChannelShield", "HeadAndNeckMask", "BrachytherapySourceApplicator", "HeadMask", "Headframe", "BodyFrame", "BreastBoard", "Cast", "WholeBodyPod", "VacuumMold", "Portacath", "ChestTube", "CentralLine", "KidneyStent", "PancreaticStent", "NippleRing", "Coin", "BrachytherapyChannel", "RectalBalloon", "FiducialMark", "VaginalCylinder", "HeadFixationBoard", "AbdominalCompressionArch", "AbdominalCompressionBelt", "BreastBridge", "Sphere", "OtherMarker", "IonChamberArray", "DiodeArray", "LiquidIonChamber", "Diode", "IonChamber", "OSLD", "RPLGD", "DiamondDetector", "HandGrips", "HeelStop", "ShinRest", "SeatPan", ], "SCT": [ "Suture", "Jewelry", "Prosthesis", "EndotrachealTube", "MeasuringRuler", "Collimator", "Backrest", "RotationalAtherectomyDevice", "Wall", "DentalProsthesis", "CervicalCollar", "HeartValveProsthesis", "EmbolizationParticulate", "Armrest", "FeedingTube", "Stretcher", "Tracheotomy", "Staple", "PercutaneousTransluminalAngioplastyBalloon", "BonePin", "BBShotLeadPellet", "Defibrillator", "Headrest", "DigitalImager", "IDPlate", "Stent", "Floor", "Implant", "Chair", "ForeignBody", "Glue", "InlayDentalRestoration", "EmbolizationCoil", "MOSFETRadiationTherapyDosimetrySystemDosimeter", "Catheter", "Bullet", "GuidingCatheter", "ThermoluminescentRadiationDosimeter", "OpaqueMarker", "BiteBlock", "CardiacPacemakerLead", "Clip", "BoneScrew", "DetachableBalloon", "JejunostomyTube", "RadioactiveImplant", "PacemakerPulseGenerator", "JWire", "VenaCavaFilter", "Needle", "AtherectomyDevice", "Laser", "Table", "CompressionPaddle", "UretericStent", "EmbolizationBall", "CardiacPacemaker", "Clothing", "LeftVentricularAssistDevice", ], } name_for_cid[7194] = "MorphologicallyAbnormalStructureSegmentationPropertyType" cid_concepts[7194] = { "DCM": ["Background"], "NCIt": ["EnhancingLesion", "NonEnhancingLesion"], "SCT": [ "LesionOfBrain", "Embolus", "NeoplasmPrimary", "Mass", "Normal", "Cyst", "Abscess", "Edema", "BloodClot", "Nodule", "Lesion", "Neoplasm", "NeoplasmSecondary", "Necrosis", "Hemorrhage", "Inflammation", ], } name_for_cid[7195] = "FunctionSegmentationPropertyType" cid_concepts[7195] = {"SCT": ["Perfusion"]} name_for_cid[7196] = "SpatialandRelationalConceptSegmentationPropertyType" cid_concepts[7196] = { "DCM": [ "Lucency", "TissueNotOfInterest", "RegistrationInput", "Background", "SingleSubjectExtractedFromGroup", "Interface", "Line", ], "NCIt": ["ReferenceRegion"], "SCT": ["Normal", "WasteMaterial", "Tissue"], } name_for_cid[7197] = "BodySubstanceSegmentationPropertyType" cid_concepts[7197] = {"SCT": ["Feces", "Urine", "BodyFluid", "Bile", "Gas"]} name_for_cid[7198] = "SubstanceSegmentationPropertyType" cid_concepts[7198] = {"SCT": ["ContrastAgent"]} name_for_cid[7199] = "AnatomicallyLocalizedLesionSegmentationType" cid_concepts[7199] = {"SCT": ["LesionOfBrain"]} name_for_cid[7201] = "ReferencedImagePurposeofReference" cid_concepts[7201] = { "DCM": [ "ImagesRelatedToStandaloneObject", "AnatomicImage", "TemporalSuccessor", "Spectroscopy", "FunctionalImage", "OtherImageOfBiplanePair", "VolumeCorrespondingToSpatiallyRelatedAcquisitionFrames", "OtherImageOfStereoscopicPair", "TemporalPredecessor", "BiopsyLocalizer", "OtherPartialViews", "AcquisitionFramesCorrespondingToVolume", "Localizer", "ImageUsedForTreatmentPlanning", "QualityControlMaterialImage", "ImageAcquiredDuringTreatment", "ImageUsedForDoseCalculation", "ImageUsedAsReferenceImageForTreatment", "DeviceLocalizer", "SpectralFilteredImage", ] } name_for_cid[7202] = "SourceImagePurposeofReference" cid_concepts[7202] = { "DCM": [ "PredecessorContainingGroupOfImagingSubjects", "ForProcessingPredecessor", "MaskImageForImageProcessingOperation", "SourceImageForImageProcessingOperation", "LossyCompressedPredecessor", "UncompressedPredecessor", "FlowImageForImageProcessing", "StructuralImageForImageProcessing", "SourceImageForMontage", ] } name_for_cid[7203] = "ImageDerivation" cid_concepts[7203] = { "DCM": [ "SpatialResampling", "PixelByPixelAddition", "EdgeEnhancement", "Smoothing", "GaussianBlur", "UnsharpMask", "PixelByPixelDivision", "PixelByPixelMask", "PixelByPixelMaximum", "LossyCompression", "PixelByPixelSubtraction", "PerfusionImageAnalysis", "DiffusionTractography", "DiffusionImageAnalysis", "PixelByPixelMean", "DeformedForRegistration", "VolumeRendering", "PixelByPixelMultiplication", "SurfaceRendering", "MultiEnergyProportionalWeighting", "SegmentationImageDerivation", "ExtractionOfIndividualSubjectFromGroup", "VolumeEditing", "MaximumIntensityProjection", "MinimumIntensityProjection", "ImageStitching", "SpatiallyRelatedFramesExtractedFromTheVolume", "TemporallyRelatedFramesExtractedFromTheSetOfVolumes", "PolarToRectangularScanConversion", "MetaboliteMapsFromSpectroscopyData", "MultiplanarReformatting", "PixelByPixelMinimum", "CurvedMultiplanarReformatting", "OCTBScanAnalysis", ] } name_for_cid[7205] = "PurposeofReferencetoAlternateRepresentation" cid_concepts[7205] = { "DCM": [ "FullFidelityImage", "AlternatePhotometricInterpretationImage", "LossyCompressedImage", "AlternateSOPClassInstance", "SourceImage", ] } name_for_cid[7210] = "RelatedSeriesPurposeofReference" cid_concepts[7210] = { "DCM": [ "ForAttenuationCorrection", "SameAnatomy", "SourceSeriesForImageProcessingOperation", "SameIndication", "SimultaneouslyAcquired", ] } name_for_cid[7215] = "SpectroscopyPurposeofReference" cid_concepts[7215] = {"DCM": ["SpectroscopyDataForWaterPhaseCorrection"]} name_for_cid[7220] = "RTDoseDerivation" cid_concepts[7220] = { "DCM": [ "ComposedWithWeightingForFractionsDelivered", "ComposedWithRadiobiologicalEffects", "ComposedFromPriorDoses", "ComposedFromPriorDosesAndCurrentPlan", ] } name_for_cid[7221] = "RTDosePurposeofReference" cid_concepts[7221] = {"DCM": ["SourceDoseForComposingCurrentDose"]} name_for_cid[7222] = "ParametricMapDerivationImagePurposeofReference" cid_concepts[7222] = {"DCM": ["SourceImageForImageProcessingOperation"]} name_for_cid[7230] = "AutomationofMeasurement" cid_concepts[7230] = {"SCT": ["Automated", "Manual"]} name_for_cid[7250] = "MultiFrameSubsetType" cid_concepts[7250] = {"DCM": ["ReferencedFrames", "ReferencedSegment"]} name_for_cid[7260] = "DiffusionAcquisitionValueType" cid_concepts[7260] = { "DCM": [ "HARDI", "DKI", "DTI", "DSI", "LSDI", "SingleShotEPI", "MultipleShotEPI", "ParallelImaging", ] } name_for_cid[7261] = "DiffusionModelValueType" cid_concepts[7261] = { "DCM": [ "SingleTensor", "MultiTensor", "ModelFree", "CHARMED", "DSI", "DOT", "PAS", "SphericalDeconvolution", ] } name_for_cid[7262] = "DiffusionTractographyAlgorithmFamily" cid_concepts[7262] = { "DCM": [ "Deterministic", "Probabilistic", "Global", "FACT", "Streamline", "TEND", "Bootstrap", "Euler", "RungeKutta", ] } name_for_cid[7263] = "DiffusionTractographyMeasurementType" cid_concepts[7263] = { "DCM": [ "ApparentDiffusionCoefficient", "Trace", "MeanDiffusivity", "VolumetricDiffusionDxzComponent", "VolumetricDiffusionDxyComponent", "VolumetricDiffusionDxxComponent", "RelativeAnisotropy", "RadialDiffusivity", "FractionalAnisotropy", "AxialDiffusivity", "MeanKurtosis", "ApparentKurtosisCoefficient", "RadialKurtosis", "AxialKurtosis", "VolumetricDiffusionDzzComponent", "FractionalKurtosisAnisotropy", "VolumetricDiffusionDyzComponent", "VolumetricDiffusionDyyComponent", ] } name_for_cid[7270] = "MRDiffusionComponentSemantic" cid_concepts[7270] = { "DCM": [ "VolumetricDiffusionDxzComponent", "VolumetricDiffusionDxyComponent", "DiffusionWeighted", "VolumetricDiffusionDxxComponent", "VolumetricDiffusionDzzComponent", "VolumetricDiffusionDyzComponent", "VolumetricDiffusionDyyComponent", ] } name_for_cid[7271] = "MRDiffusionAnisotropyIndex" cid_concepts[7271] = { "DCM": ["VolumeRatio", "RelativeAnisotropy", "FractionalAnisotropy"] } name_for_cid[7272] = "MRDiffusionModelParameter" cid_concepts[7272] = { "DCM": [ "ApparentDiffusionCoefficient", "KurtosisDiffusionCoefficient", "GammaDistributionScaleParameter", "GammaDistributionShapeParameter", "GammaDistributionMode", "DistributedDiffusionCoefficient", "AnomalousExponentParameter", "DiffusionCoefficient", "MonoExponentialApparentDiffusionCoefficient", "SlowDiffusionCoefficient", "FastDiffusionCoefficient", "FastDiffusionCoefficientFraction", ] } name_for_cid[7273] = "MRDiffusionModel" cid_concepts[7273] = { "DCM": [ "MonoExponentialDiffusionModel", "BiExponentialIVIMDiffusionModel", "KurtosisDiffusionModel", "GammaDistributionModel", "StretchedExponentialDiffusionModel", "TruncatedGaussianDiffusionModel", ] } name_for_cid[7274] = "MRDiffusionModelFittingMethod" cid_concepts[7274] = { "DCM": [ "LeastSquaresFitOfMultipleSamples", "LevenbergMarquardt", "TrustRegion", "FixedDp", "SegmentedUnconstrained", "SegmentedConstrained", "BayesianProbability", "LogOfRatioOfTwoSamples", ] } name_for_cid[7275] = "MRDiffusionModelSpecificMethod" cid_concepts[7275] = {"DCM": ["VoxelwiseSelectionOfBValue"]} name_for_cid[7276] = "MRDiffusionModelInput" cid_concepts[7276] = {"DCM": ["SourceImageDiffusionBValue"]} name_for_cid[7277] = "DiffusionRateAreaOverTimeUnit" cid_concepts[7277] = { "UCUM": [ "SquareMillimeterPerSecond", "SquareMicrometerPerMillisecond", "_10EMinus6SquareMillimetersPerSecond", "SquareMicrometerPerSecond", ] } name_for_cid[7300] = "ImplantMaterial" cid_concepts[7300] = { "DCM": ["TitaniumAlloyTitaniumMolybdenum15Zirconium5Aluminium3"], "SCT": [ "Polymer", "CarbonFiber", "StainlessSteelMaterial", "GoldAlloy", "NickelTitanium", ], } name_for_cid[7301] = "InterventionType" cid_concepts[7301] = { "SCT": [ "HipJointReconstruction", "ResurfacingOfTheFemoralHead", "InsertionOfHipProsthesis", "ResurfacingOfThePatella", ] } name_for_cid[7302] = "ImplantTemplateViewOrientation" cid_concepts[7302] = { "SCT": ["AnteroPosterior", "MedioLateralObliqueProjection", "LateralMedial"] } name_for_cid[7303] = "ImplantTemplateModifiedViewOrientation" cid_concepts[7303] = {"DCM": ["APPlus45", "APMinus45"]} name_for_cid[7304] = "ImplantTargetAnatomy" cid_concepts[7304] = { "SCT": [ "SacroCoccygealSpine", "Clavicle", "ThoracoLumbarSpine", "Tibia", "DistalFemur", "ProximalRadius", "ProximalUlna", "WristJoint", "HandBone", "ShaftOfTibia", "Shoulder", "BoneStructureOfPelvis", "Humerus", "ElbowJoint", "FacialBones", "DistalRadius", "ShaftOfUlna", "Fibula", "JawRegion", "Talus", "ThoracicSpine", "Calcaneus", "Ulna", "HeadOfFemur", "RadiusBone", "Knee", "HipJoint", "DistalUlna", "AnatomicalReferencePlane", "Mandible", "FingerJoint", "ShaftOfRadius", "Femur", "ShaftOfFemur", "CervicoThoracicSpine", "Skull", "ShaftOfHumerus", "DistalHumerus", "ProximalHumerus", "ProximalFemur", "Patella", "DistalTibia", "AnkleJoint", "LumbarSpine", "Maxilla", "CervicalSpine", ] } name_for_cid[7305] = "ImplantPlanningLandmark" cid_concepts[7305] = { "DCM": [ "AnatomicalAxisOfFemur", "AcetabularCenterOfRotation", "FemurHeadCenterOfRotation", ] } name_for_cid[7306] = "HumanHipImplantPlanningLandmark" cid_concepts[7306] = { "DCM": [ "AnatomicalAxisOfFemur", "AcetabularCenterOfRotation", "FemurHeadCenterOfRotation", ] } name_for_cid[7307] = "ImplantComponentType" cid_concepts[7307] = { "DCM": [ "FemoralStem", "FemoralStemDistalComponent", "FemoralHeadConeTaperComponent", "FemoralStemProximalComponent", "FemoralStemComponent", "NeckComponent", "DistalCentralizer", "MonoblockStem", "AcetabularCupShell", "ProstheticShaftAugment", "AcetabularCupInsert", "FemoralHeadResurfacingComponent", "AcetabularCupMonoblock", "FemoralHeadBallComponent", ], "SCT": ["DHSPlate", "FemoralHeadProsthesis", "Screw", "BonePlate", "BoneNail"], } name_for_cid[7308] = "HumanHipImplantComponentType" cid_concepts[7308] = { "DCM": [ "FemoralStem", "FemoralStemDistalComponent", "FemoralHeadConeTaperComponent", "FemoralStemProximalComponent", "FemoralStemComponent", "NeckComponent", "DistalCentralizer", "MonoblockStem", "AcetabularCupShell", "ProstheticShaftAugment", "AcetabularCupInsert", "FemoralHeadResurfacingComponent", "AcetabularCupMonoblock", "FemoralHeadBallComponent", ], "SCT": ["FemoralHeadProsthesis"], } name_for_cid[7309] = "HumanTraumaImplantComponentType" cid_concepts[7309] = {"SCT": ["DHSPlate", "Screw", "BonePlate", "BoneNail"]} name_for_cid[7310] = "ImplantFixationMethod" cid_concepts[7310] = { "DCM": ["Bolting", "Wedging", "Pinning", "Sewing"], "SCT": [ "RepairByNailing", "Anchoring", "Gluing", "InternalSkeletalFixation", "UncementedComponentFixation", "CementedComponentFixation", "InternalFixationUsingStaple", "Fusion", "InternalFixationUsingPlate", "InternalFixationUsingScrew", ], } name_for_cid[7320] = "PlanningMethod" cid_concepts[7320] = { "DCM": [ "Generic2DPlanning", "Generic3DPlanning", "GenericPlanningForHipReplacement", "GenericPlanningForKneeReplacement", "MüllerMethodPlanningForHipReplacement", ] } name_for_cid[7445] = "DeviceParticipatingRole" cid_concepts[7445] = {"DCM": ["Recording", "XRayReadingDevice", "IrradiatingDevice"]} name_for_cid[7449] = "ReaderSpecialty" cid_concepts[7449] = { "DCM": [ "OncologicImagingSpecialty", "OBGynImagingSpecialty", "ThoracicImagingSpecialty", "OncologySpecialty", "AbdominalImagingSpecialty", "VascularImagingSpecialty", "PediatricImagingSpecialty", "HeadAndNeckImagingSpecialty", "CardiacImagingSpecialty", "MusculoskeletalImagingSpecialty", "NeuroradiologyImagingSpecialty", "NeurologySpecialty", ] } name_for_cid[7450] = "PersonRole" cid_concepts[7450] = { "DCM": [ "Patient", "AdministratorOfRadiologyDepartment", "HeadOfCardiology", "LeadRadiologicTechnologist", "RepresentativeOfEthicsCommittee", "RepresentativeOfProtocolCommittee", "Fellow", "ChairOfProtocolCommittee", "HeadOfRadiology", "Sonologist", ], "SCT": [ "NaturalGrandFather", "MaleFirstCousin", "NaturalFather", "HealthcareProfessional", "HalfSister", "NaturalMother", "Resident", "NaturalSister", "Friend", "Physician", "Attending", "NaturalBrother", "ScrubNurse", "Registrar", "RadiologicTechnologist", "Aunt", "Surgeon", "NaturalGrandMother", "Uncle", "Consultant", "Nurse", "NaturalDaughter", "NaturalSon", "FemaleFirstCousin", "MedicalPractitioner", "HalfBrother", "RadiationTherapist", ], "UMLS": [ "Intern", "MedicalPhysicist", "ConsultingPhysician", "RadiationPhysicist", "Sonographer", ], } name_for_cid[7451] = "FamilyMember" cid_concepts[7451] = { "SCT": [ "NaturalGrandFather", "NaturalBrother", "MaleFirstCousin", "NaturalFather", "Aunt", "NaturalGrandMother", "Uncle", "HalfSister", "NaturalMother", "NaturalDaughter", "NaturalSon", "FemaleFirstCousin", "NaturalSister", "HalfBrother", ] } name_for_cid[7452] = "OrganizationalRole" cid_concepts[7452] = { "DCM": [ "AdministratorOfRadiologyDepartment", "HeadOfCardiology", "LeadRadiologicTechnologist", "RepresentativeOfEthicsCommittee", "RepresentativeOfProtocolCommittee", "Fellow", "ChairOfProtocolCommittee", "HeadOfRadiology", "Sonologist", ], "SCT": [ "Resident", "Physician", "Attending", "ScrubNurse", "Registrar", "RadiologicTechnologist", "Surgeon", "Consultant", "Nurse", "MedicalPractitioner", "RadiationTherapist", ], "UMLS": [ "Intern", "MedicalPhysicist", "ConsultingPhysician", "RadiationPhysicist", "Sonographer", ], } name_for_cid[7453] = "PerformingRole" cid_concepts[7453] = { "DCM": [ "Standby", "IrradiationAdministering", "IrradiationAuthorizing", "ImageQualityController", "Designator", "ResultsQualityController", "Assisting", "Recording", "Verifying", "Requesting", "EligibilityReader", "Performing", ], "NCIt": ["Reader", "Adjudicator", "Reviewer"], "SCT": ["CirculatingNurse"], "UMLS": ["Referring"], } name_for_cid[7454] = "AnimalTaxonomicRankValue" cid_concepts[7454] = { "ITIS_TSN": ["PeromyscusLeucopus", "PeromyscusManiculatus", "SigmodonGenus"], "SCT": [ "CanisLupus", "RattusNorvegicus", "FelisCatus", "HomoSapiens", "Canis", "BosTaurus", "OryctolagusCuniculus", "Capra", "MustelaPutoriusFuro", "EquusCaballus", "SusScrofa", "Equus", "Ovis", "Bovinae", "Bos", "CallithrixJacchus", "CaviaPorcellus", "Felis", "Sus", "CanisLupusFamiliaris", "Rattus", "MusGenus", "OvisAries", "MusMusculus", "CapraHircus", ], } name_for_cid[7455] = "Sex" cid_concepts[7455] = { "DCM": [ "MalePseudohermaphrodite", "UnknownSex", "UndeterminedSex", "Female", "MaleChangedToFemale", "AmbiguousSex", "Hermaphrodite", "OtherSex", "FemalePseudohermaphrodite", "Male", "FemaleChangedToMale", ] } name_for_cid[7456] = "AgeUnit" cid_concepts[7456] = {"UCUM": ["Year", "Minute", "Hour", "Week", "Day", "Month"]} name_for_cid[7457] = "SexMaleFemaleorBoth" cid_concepts[7457] = {"DCM": ["MixedSex", "Female", "Male"]} name_for_cid[7460] = "LinearMeasurementUnit" cid_concepts[7460] = {"UCUM": ["Millimeter", "Centimeter", "Micrometer"]} name_for_cid[7461] = "AreaMeasurementUnit" cid_concepts[7461] = { "UCUM": ["SquareMillimeter", "SquareCentimeter", "SquareMicrometer"] } name_for_cid[7462] = "VolumeMeasurementUnit" cid_concepts[7462] = { "UCUM": ["CubicMillimeter", "CubicCentimeter", "CubicMicrometer", "CubicDecimeter"] } name_for_cid[7464] = "GeneralRegionofInterestMeasurementModifier" cid_concepts[7464] = { "DCM": ["Skewness", "Kurtosis", "PeakValueWithinROI"], "SCT": [ "StandardDeviation", "Mode", "Minimum", "Maximum", "Total", "Mean", "Median", ], "UMLS": ["CoefficientOfVariance", "Variance", "RootMeanSquare"], } name_for_cid[7465] = "MeasurementDerivedFromMultipleROIMeasurements" cid_concepts[7465] = { "DCM": [ "PercentileRankingOfMeasurement", "ZScoreOfMeasurement", "StandardDeviationOfPopulation", "_2SigmaDeviationOfPopulation", "InterquartileRangeToMedianRatioOfPopulation", "InterquartileRangeOfPopulation", ], "SCT": [ "_1SigmaLowerValueOfPopulation", "_2SigmaLowerValueOfPopulation", "_5thPercentileValueOfPopulation", "_10thPercentileValueOfPopulation", "_1SigmaUpperValueOfPopulation", "_2SigmaUpperValueOfPopulation", "MeanValueOfPopulation", "_95thPercentileValueOfPopulation", "_90thPercentileValueOfPopulation", "MedianValueOfPopulation", ], } name_for_cid[7466] = "PETRegionofInterestMeasurement" cid_concepts[7466] = { "DCM": [ "MetabolicVolume", "TotalLesionGlycolysis", "Glycolysis", "TotalLesionProliferation", "ProliferativeActivity", "StandardizedAddedMetabolicActivity", "StandardizedAddedMetabolicActivityBackground", "LesionToBackgroundSUVRatio", "BackgroundForLesionToBackgroundSUVRatio", ] } name_for_cid[7467] = "GrayLevelCooccurrenceMatrixMeasurement" cid_concepts[7467] = { "DCM": ["RootAngularSecondMomentOfGLCM"], "IBSI": [ "CorrelationOfGLCM", "DissimilarityOfGLCM", "InverseVarianceOfGLCM", "AutocorrelationOfGLCM", "JointEntropyOfGLCM", "FirstMeasureOfInformationCorrelationOfGLCM", "AngularSecondMomentOfGLCM", "ClusterShadeOfGLCM", "ClusterProminenceOfGLCM", "ClusterTendencyOfGLCM", "DifferenceAverageOfGLCM", "InverseDifferenceOfGLCM", "JointAverageOfGLCM", "SumAverageOfGLCM", "InverseDifferenceMomentOfGLCM", "NormalizedInverseDifferenceMomentOfGLCM", "ContrastOfGLCM", "SumVarianceOfGLCM", "JointVarianceOfGLCM", "SecondMeasureOfInformationCorrelationOfGLCM", "NormalizedInverseDifferenceOfGLCM", "DifferenceEntropyOfGLCM", "SumEntropyOfGLCM", "JointMaximumOfGLCM", "DifferenceVarianceOfGLCM", ], } name_for_cid[7468] = "TextureMeasurement" cid_concepts[7468] = { "DCM": ["RootAngularSecondMomentOfGLCM", "FractalDimension"], "IBSI": [ "LowGrayLevelZoneEmphasis", "ZoneSizeVariance", "NormalizedZoneSizeNonuniformity", "IntensityHistogramRange", "LongRunHighGrayLevelEmphasis", "IntensityHistogramMedian", "GreyLevelNonUniformityOfDistanceZoneCounts", "InverseVarianceOfGLCM", "CoarsenessOfNGTDM", "LowDependenceLowGreyLevelEmphasis", "DependenceCountNonUniformityNormalized", "DependenceCountPercentage", "FirstMeasureOfInformationCorrelationOfGLCM", "ContrastOfNGTDM", "GrayLevelVarianceInSizeZones", "IntensityHistogramMinimumGradient", "ClusterShadeOfGLCM", "ClusterProminenceOfGLCM", "ZoneSizeNonuniformity", "DependenceCountEnergy", "IntensityHistogramVariance", "InverseDifferenceOfGLCM", "IntensityHistogramMeanAbsoluteDeviation", "JointAverageOfGLCM", "InverseDifferenceMomentOfGLCM", "IntensityHistogramInterquartileRange", "ContrastOfGLCM", "SmallZoneEmphasis", "IntensityHistogram90thPercentile", "SmallDistanceLowGreyLevelEmphasis", "NormalizedGrayLevelNonuniformityOfSizeZoneCounts", "LowDependenceHighGreyLevelEmphasis", "IntensityHistogramMedianAbsoluteDeviation", "ShortRunLowGrayLevelEmphasis", "SizeZonePercentage", "GrayLevelVarianceInRuns", "HighGrayLevelZoneEmphasis", "IntensityHistogramRobustMeanAbsoluteDeviation", "HighDependenceHighGreyLevelEmphasis", "IntensityHistogram10thPercentile", "DependenceCountEntropy", "IntensityHistogramMinimumGradientGrayLevel", "RunPercentage", "GreyLevelVarianceOfNGLDM", "DistanceZonePercentage", "IntensityHistogramSkewness", "IntensityHistogramMaximumGradient", "AutocorrelationOfGLCM", "LongRunsEmphasis", "NormalizedRunLengthNonuniformity", "LargeZoneLowGrayLevelEmphasis", "DependenceCountVariance", "ClusterTendencyOfGLCM", "LowGreyLevelZoneEmphasis", "HighGreyLevelCountEmphasis", "HighDependenceLowGreyLevelEmphasis", "DifferenceAverageOfGLCM", "IntensityHistogramMaximumGrayLevel", "SumAverageOfGLCM", "LowDependenceEmphasis", "IntensityHistogramQuartileCoefficientOfDispersion", "LongRunLowGrayLevelEmphasis", "LargeDistanceEmphasis", "NormalizedGreyLevelNonUniformityOfNGLDM", "SumVarianceOfGLCM", "HighGrayLevelRunEmphasis", "IntensityHistogramEntropy", "ShortRunsEmphasis", "HighDependenceEmphasis", "IntensityHistogramUniformity", "ShortRunHighGrayLevelEmphasis", "LargeDistanceHighGreyLevelEmphasis", "GrayLevelNonuniformityOfSizeZoneCounts", "SmallZoneHighGrayLevelEmphasis", "DissimilarityOfGLCM", "RunLengthNonuniformity", "IntensityHistogramMean", "RunLengthVariance", "ZoneDistanceEntropy", "LowGreyLevelCountEmphasis", "LargeZoneEmphasis", "RunEntropy", "ComplexityOfNGTDM", "GreyLevelVarianceInDistanceZones", "ZoneDistanceNonUniformity", "ZoneDistanceVariance", "IntensityHistogramMode", "LowGrayLevelRunEmphasis", "JointMaximumOfGLCM", "DifferenceVarianceOfGLCM", "CorrelationOfGLCM", "HighGreyLevelZoneEmphasis", "BusynessOfNGTDM", "IntensityHistogramKurtosis", "StrengthOfNGTDM", "GreyLevelNonUniformityOfNGLDM", "JointEntropyOfGLCM", "LargeZoneHighGrayLevelEmphasis", "AngularSecondMomentOfGLCM", "LargeDistanceLowGreyLevelEmphasis", "NormalizedInverseDifferenceMomentOfGLCM", "JointVarianceOfGLCM", "NormalizedGrayLevelNonuniformityInRuns", "SecondMeasureOfInformationCorrelationOfGLCM", "IntensityHistogramMaximumGradientGrayLevel", "IntensityHistogramMinimumGrayLevel", "NormalizedInverseDifferenceOfGLCM", "GrayLevelNonuniformityInRuns", "SmallZoneLowGrayLevelEmphasis", "ZoneSizeEntropy", "SmallDistanceHighGreyLevelEmphasis", "DifferenceEntropyOfGLCM", "SmallDistanceEmphasis", "IntensityHistogramCoefficientOfVariation", "DependenceCountNonUniformity", "SumEntropyOfGLCM", "NormalizedGreyLevelNonUniformityOfDistanceZoneCounts", "NormalizedZoneDistanceNonUniformity", ], } name_for_cid[7469] = "GenericIntensityandSizeMeasurement" cid_concepts[7469] = { "DCM": [ "ApparentDiffusionCoefficient", "DiffusionWeighted", "LineSegmentLength", "VolumeRatio", "VolumeOfSphere", "DiffusionCoefficient", "WaterFatOutOfPhase", "FractionalOccupancySegmentation", "WaterFatInPhase", "FractionalProbabilisticSegmentation", "BinarySegmentation", "WaterFraction", "MRSignalIntensity", "XRayAttenuation", "VolumeOfCircumscribedSphere", "VolumeOfEllipsoid", "FatFraction", "VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions", "VolumeEstimatedFromTwoNonCoplanar2DRegions", "VolumeEstimatedFromSingle2DRegion", "PathLength", "VolumeOfBoundingThreeDimensionalRegion", "YBRICTCRComponent", "R2Coefficient", "YBRICTCBComponent", "ChiSquare", "YBRICTYComponent", "DW", "YBRPARTIALCRComponent", "AIC", "YBRPARTIALCBComponent", "BIC", "YBRPARTIALYComponent", "Echogenicity", "YBRRCTCRComponent", "YBRRCTCBComponent", "YBRRCTYComponent", "Distance", "Height", "RelativeLinearStoppingPower", "RGBRComponent", "UltrasoundAttenuation", "TauM", "SpeedOfSound", "Vp", "Perfusion", "Elasticity", "EquivalentDose", "GradientWeightedClassActivation", "ClassActivation", "AbsorbedDose", "YBRFULLCRComponent", "Saliency", "YBRFULLCBComponent", "YBRFULLYComponent", "RGBBComponent", "RGBGComponent", "CreatineCholineCitrateRatio", "MagnetizationTransferRatio", "IAUC90BN", "IAUC180BN", "CreatineAndCholine", "LipidAndLactate", "SpatialDisplacementYComponent", "SpatialDisplacementXComponent", "NuclearMedicineTomographicActivity", "IAUC", "NuclearMedicineProjectionActivity", "IAUC60", "IAUC90", "IAUC180", "IAUCBN", "IAUC60BN", "FlowVariance", "FlowVelocity", "TissueVelocity", "IndexedHemodynamicResistance", "HemodynamicResistance", "SpatialDisplacementZComponent", "AttenuationCoefficient", "GlutamateAndGlutamine", "CholineCreatineRatio", "NAcetylaspartateCreatineRatio", "NAcetylaspartateCholineRatio", "Tmax", "R2Star", "VolumetricDiffusionDxzComponent", "MagneticSusceptibility", "VolumetricDiffusionDxyComponent", "VolumetricDiffusionDxxComponent", "RelativeRegionalBloodFlow", "RelativeRegionalBloodVolume", "Ktrans", "Kep", "Ve", "BloodOxygenationLevel", "T2StarWeightedDynamicContrastEnhancedMRSignalIntensity", "T2WeightedDynamicContrastEnhancedMRSignalIntensity", "AbsoluteRegionalBloodFlow", "T1WeightedDynamicContrastEnhancedMRSignalIntensity", "AbsoluteRegionalBloodVolume", "VolumetricDiffusionDzzComponent", "OxygenExtractionFraction", "R1", "VolumetricDiffusionDyzComponent", "R2", "VolumetricDiffusionDyyComponent", "VelocityEncoded", "ZScore", "ContrastAgentAngioMRSignalIntensity", "SpinTaggingPerfusionMRSignalIntensity", "RelativeAnisotropy", "FractionalAnisotropy", "FieldMapMRSignalIntensity", "T2StarWeightedMRSignalIntensity", "T2WeightedMRSignalIntensity", "T1WeightedMRSignalIntensity", "ProtonDensityWeightedMRSignalIntensity", "TimeOfFlightAngioMRSignalIntensity", "T1", "T2Star", "T2", "TimeCourseOfSignal", "TemperatureEncoded", "StudentTTest", "TimeToPeak", "SignalToNoise", "TemporalDerivativeThreshold", "MaximumSlope", "MaximumDifference", "TracerConcentration", "TimeOfPeakConcentration", "BolusArrivalTime", "TimeOfLeadingHalfPeakConcentration", "MeanTransitTime", "KurtosisDiffusionCoefficient", "GammaDistributionScaleParameter", "NegativeEnhancementIntegral", "GammaDistributionShapeParameter", "GammaDistributionMode", "DistributedDiffusionCoefficient", "RCoefficient", "AnomalousExponentParameter", "ProtonDensity", "SignalChange", "Suvbsa", "Suvibw", "SuvlbmJanma", "SuvlbmJames128", "MonoExponentialApparentDiffusionCoefficient", "SlowDiffusionCoefficient", "FastDiffusionCoefficient", "FastDiffusionCoefficientFraction", "StandardizedUptakeValue", "Suvbw", "Suvlbm", ], "IBSI": [ "SurfaceAreaOfMesh", "Maximum3DDiameterOfAMesh", "VolumeOfMesh", "LeastAxisIn3DLength", "MinorAxisIn3DLength", "VolumeFromVoxelSummation", "MajorAxisIn3DLength", ], "SCT": [ "Width", "Volume", "Fat", "Area", "Lipid", "DiameterOfCircumscribedCircle", "Depth", "NAcetylaspartate", "PowerDoppler", "Perimeter", "Creatine", "Glutamine", "MinorAxis", "Diameter", "Tuarine", "Citrate", "MajorAxis", "Lactate", "LongAxis", "Length", "Circumference", "Inositol", "PerpendicularAxis", "Water", "Radius", "Choline", "AreaOfDefinedRegion", "ShortAxis", ], } name_for_cid[7470] = "LinearMeasurement" cid_concepts[7470] = { "DCM": ["Distance", "Height", "LineSegmentLength", "PathLength"], "IBSI": [ "LeastAxisIn3DLength", "MinorAxisIn3DLength", "MajorAxisIn3DLength", "Maximum3DDiameterOfAMesh", ], "SCT": [ "DiameterOfCircumscribedCircle", "Radius", "Perimeter", "MinorAxis", "Width", "Diameter", "MajorAxis", "PerpendicularAxis", "LongAxis", "Depth", "ShortAxis", "Length", "Circumference", ], } name_for_cid[7471] = "AreaMeasurement" cid_concepts[7471] = { "IBSI": ["SurfaceAreaOfMesh"], "SCT": ["Area", "AreaOfDefinedRegion"], } name_for_cid[7472] = "VolumeMeasurement" cid_concepts[7472] = { "DCM": [ "VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions", "VolumeEstimatedFromTwoNonCoplanar2DRegions", "VolumeEstimatedFromSingle2DRegion", "VolumeOfSphere", "VolumeOfCircumscribedSphere", "VolumeOfEllipsoid", "VolumeOfBoundingThreeDimensionalRegion", ], "IBSI": ["VolumeFromVoxelSummation", "VolumeOfMesh"], "SCT": ["Volume"], } name_for_cid[7473] = "GeneralAreaCalculationMethod" cid_concepts[7473] = {"DCM": ["AreaOfAClosedNURBS", "AreaOfClosedIrregularPolygon"]} name_for_cid[7474] = "GeneralVolumeCalculationMethod" cid_concepts[7474] = { "DCM": [ "IntegrationOfSumOfClosedAreasOnContiguousSlicesMethodForVolume", "LWHMethodForVolumeOfEllipsoid", "SumOfSegmentedVoxelMethodForVolume", ] } name_for_cid[7475] = "GrayLevelRunLengthBasedFeature" cid_concepts[7475] = { "IBSI": [ "RunEntropy", "LongRunHighGrayLevelEmphasis", "HighGrayLevelRunEmphasis", "NormalizedGrayLevelNonuniformityInRuns", "RunPercentage", "LongRunsEmphasis", "NormalizedRunLengthNonuniformity", "ShortRunsEmphasis", "GrayLevelNonuniformityInRuns", "ShortRunLowGrayLevelEmphasis", "RunLengthNonuniformity", "GrayLevelVarianceInRuns", "RunLengthVariance", "ShortRunHighGrayLevelEmphasis", "LowGrayLevelRunEmphasis", "LongRunLowGrayLevelEmphasis", ] } name_for_cid[7476] = "GrayLevelSizeZoneBasedFeature" cid_concepts[7476] = { "IBSI": [ "LargeZoneEmphasis", "LowGrayLevelZoneEmphasis", "ZoneSizeVariance", "NormalizedZoneSizeNonuniformity", "GrayLevelNonuniformityOfSizeZoneCounts", "SmallZoneEmphasis", "SmallZoneHighGrayLevelEmphasis", "SmallZoneLowGrayLevelEmphasis", "NormalizedGrayLevelNonuniformityOfSizeZoneCounts", "ZoneSizeEntropy", "LargeZoneLowGrayLevelEmphasis", "LargeZoneHighGrayLevelEmphasis", "GrayLevelVarianceInSizeZones", "ZoneSizeNonuniformity", "SizeZonePercentage", "HighGrayLevelZoneEmphasis", ] } name_for_cid[7477] = "GlobalShapeDescriptor" cid_concepts[7477] = { "IBSI": [ "VolumeDensityInOrientedMinimumBoundingBox", "LeastAxisIn3DLength", "VolumeDensityInApproximateEnclosingEllipsoid", "AreaDensityInApproximateEnclosingEllipsoid", "SurfaceToVolumeRatio", "MinorAxisIn3DLength", "IntegratedIntensity", "AreaDensityInMinimumVolumeEnclosingEllipsoid", "Compactness2", "Maximum3DDiameterOfAMesh", "GearyCMeasure", "MoranIIndex", "Sphericity", "Elongation", "VolumeFromVoxelSummation", "CentreOfMassShift", "VolumeDensityInMinimumVolumeEnclosingEllipsoid", "AreaDensityInConvexHull", "VolumeOfMesh", "MajorAxisIn3DLength", "AreaDensityInFrameOfReferenceAxisAlignedBoundingBox", "AreaDensityInOrientedMinimumBoundingBox", "VolumeDensityInConvexHull", "Compactness1", "SphericalDisproportion", "Flatness", "SurfaceAreaOfMesh", "VolumeDensityInFrameOfReferenceAxisAlignedBoundingBox", "Asphericity", ] } name_for_cid[7478] = "IntensityHistogramFeature" cid_concepts[7478] = { "IBSI": [ "IntensityHistogramInterquartileRange", "IntensityHistogramRange", "IntensityHistogramMedian", "IntensityHistogramMinimumGradientGrayLevel", "IntensityHistogramSkewness", "IntensityHistogramMaximumGradientGrayLevel", "IntensityHistogram90thPercentile", "IntensityHistogramMaximumGradient", "IntensityHistogramKurtosis", "IntensityHistogramMinimumGrayLevel", "IntensityHistogramEntropy", "IntensityHistogramMedianAbsoluteDeviation", "IntensityHistogramMode", "IntensityHistogramMinimumGradient", "IntensityHistogramMean", "IntensityHistogramVariance", "IntensityHistogramCoefficientOfVariation", "IntensityHistogramRobustMeanAbsoluteDeviation", "IntensityHistogramUniformity", "IntensityHistogramMaximumGrayLevel", "IntensityHistogramMeanAbsoluteDeviation", "IntensityHistogram10thPercentile", "IntensityHistogramQuartileCoefficientOfDispersion", ] } name_for_cid[7479] = "GreyLevelDistanceZoneBasedFeature" cid_concepts[7479] = { "IBSI": [ "LargeDistanceHighGreyLevelEmphasis", "HighGreyLevelZoneEmphasis", "GreyLevelNonUniformityOfDistanceZoneCounts", "DistanceZonePercentage", "SmallDistanceLowGreyLevelEmphasis", "GreyLevelVarianceInDistanceZones", "ZoneDistanceNonUniformity", "SmallDistanceHighGreyLevelEmphasis", "ZoneDistanceVariance", "SmallDistanceEmphasis", "LowGreyLevelZoneEmphasis", "ZoneDistanceEntropy", "LargeDistanceLowGreyLevelEmphasis", "LargeDistanceEmphasis", "NormalizedGreyLevelNonUniformityOfDistanceZoneCounts", "NormalizedZoneDistanceNonUniformity", ] } name_for_cid[7480] = "Breed" cid_concepts[7480] = { "SCT": [ "CanastrãoPigBreed", "FrenchArdennaisHorseBreed", "CanadianDurocPigBreed", "CriouloHorseBreed", "AvetonouCattleBreed", "Spaniel", "KigeziCattleBreed", "HuazhongTwoEndBlackSatzelingPigBreed", "CoopworthSheepBreed", "RatTerrierDogBreed", "MixedBreedDog", "AustralianBrafordXZebuCattleBreed", "EskimoDog", "SouthMalawiZebuCattleBreed", "TropicalDairyCattleCattleBreed", "CorsicanGoatBreed", "ShropshireSheepBreed", "KirgizHorseBreed", "LaoshanPigBreed", "SanMartineroCattleBreed", "ClunForestSheepBreed", "PapillonDog", "HrbineckyCattleBreed", "SeshagaCattleBreed", "WirehairStyrianMountainDogBreed", "PerianganHorseBreed", "ScottishDeerhound", "MurgeseHorseBreed", "UmblacheryCattleBreed", "ToggenburgGoatBreed", "SarabiCattleBreed", "CalabrianHorseBreed", "Dalland020PigBreed", "GeorgianMountainCattleBreed", "GasaraCattleBreed", "StandardDachshundDogBreed", "AfghanHound", "BelgianHalfbloodHorseBreed", "MonarchPigBreed", "IstrianPramenkaSheepBreed", "ShilohShepherdDogBreed", "BaluchiSheepBreed", "RostovPigBreed", "NormanzuXZebuCattleBreed", "TaishuhHorseBreed", "CubanPasoHorseBreed", "SchwyzZeboidXZebuCattleBreed", "UralBlackPiedCattleBreed", "LonghornCowBreed", "ConnemaraPonyHorseBreed", "GermanSpanielDogBreed", "OuessantSheepBreed", "AustralianBrumbyHorseBreed", "NorthSwedishHorseHorseBreed", "DanishRedPiedCattleBreed", "EnglishHunterHorseBreed", "AmericanBuckskinHorseBreed", "ChinPigBreed", "SouthAfricanBrownSwissCattleBreed", "SmallEastAfricanZebuCattleBreed", "BraccoItalianoDogBreed", "NurasCattleBreed", "IlocosCattleBreed", "CriolloSheepBreed", "AmericanBerkshirePigBreed", "NorthSwedishTrotterHorseBreed", "AmericanLandracePigBreed", "LantangPigBreed", "MangalargaPaulistaHorseBreed", "JiaoxiPigBreed", "ItalianRedPiedCattleBreed", "WakwaCattleBreed", "YugoslavianHoundDogBreed", "MiniatureZebuCattleBreed", "IrishWolfhound", "SmoothFoxTerrierDogBreed", "GermanBerkshirePigBreed", "VyatkaHorseBreed", "BielleseSheepBreed", "OldFormatWelshCorgiDogBreed", "HinisHorseBreed", "PolledLincolnRedCattleBreed", "BeijingBlackPiedCattleBreed", "WirehairedPointingGriffonDog", "ChaparGoatBreed", "LöwchenDogBreed", "DairyZebuOfUberabaCattleBreed", "AmericanCockerSpanielDogBreed", "PhilippineNativeIlocosPigBreed", "TouabireSheepBreed", "KhurasaniZebuCattleBreed", "YujiangPigBreed", "HampshireSheepBreed", "RhoenschafSheepBreed", "LeopardCurDogBreed", "HeilongjiangSpottedPigBreed", "MeishanPigBreed", "IcelandicHorseBreed", "SiberianHuskie", "CachenaCattleBreed", "ThraceCattleBreed", "BritishWhiteCattleBreed", "SlovakWarmbloodHorseBreed", "DachshundMiniatureDogBreed", "BoarPowerPig59PigBreed", "OrobicaGoatBreed", "GlenOfImaalTerrierDogBreed", "AlpineChamoiseeGoatBreed", "SwaledaleSheepBreed", "KirhizDogBreed", "GentileDiPugliaSheepBreed", "BelgianLaekenDog", "TunisSheepBreed", "HunterHorseBreed", "SanPierrePigBreed", "KarakulSheepBreed", "AmericanPaintHorseBreed", "DamaraCattleBreed", "COOPELSO93CattleBreed", "KaghaniGoatBreed", "LipizzanerHorseBreed", "AzerbaijanZebuCattleBreed", "CasertanaPigBreed", "DobrogeaBlackPigBreed", "GermanWhiteheadedMuttonSheepBreed", "Line32PigBreed", "LucernaCattleBreed", "BassetArtésianNormandDogBreed", "LaguneCattleBreed", "YonaguniHorseBreed", "AostaRedPiedCattleBreed", "WenshanCattleBreed", "JapanesePointerDogBreed", "BritishBlueCatBreed", "NiloPigBreed", "PonwarCattleBreed", "SL96PigBreed", "DutchBeltedCattleBreed", "PomeranianDog", "VestlandRedPolledCattleBreed", "BrafordXZebuCattleBreed", "FineMerinoSheepBreed", "CavallinoPigBreed", "FinnhorseDraftHorseBreed", "PyreneanMastiffDogBreed", "LaManchaGoatBreed", "GasconCattleBreed", "AustralianTerrier", "BedlingtonTerrier", "NamibDesertHorseHorseBreed", "DutchDraftHorseBreed", "PartiColorCockerSpanielDogBreed", "BelgianGriffonRoughDogBreed", "CasanarenoCattleBreed", "JapaneseChinDog", "KemerovoPigBreed", "RussianHeavyDraftHorseBreed", "WestHighlandWhiteTerrier", "PolledSussexCattleBreed", "ShakhansurriCattleBreed", "GordonSetterDogBreed", "AuxoisHorseBreed", "CanadianLandracePigBreed", "PoitouMuleProducerHorseBreed", "IrishTerrier", "DingoDogBreed", "EastAndSoutheastAnadoluHorseBreed", "WhitebredShorthornCattleBreed", "LesserCaucasusCattleBreed", "ToroCattleBreed", "BasutoCattleBreed", "BrownSwissCowBreed", "BeagleElizabethanDogBreed", "BalkhiSheepBreed", "SuksunCattleBreed", "EnglishShepherdDogBreed", "IsraeliHolsteinCattleBreed", "SaintBernardLongHairedDogBreed", "YorkshireTerrier", "EpagneulPontAudemerDogBreed", "BalinesePigBreed", "MirgorodPigBreed", "BergerShetlandDogBreed", "IndoBrazilianCattleBreed", "CholistaniSheepBreed", "YananPigBreed", "CroatianRedCattleBreed", "KangayamCattleBreed", "CharolaisCattleBreed", "Terrier", "SarPlaninaSheepBreed", "TurkomanHorseBreed", "GoleCattleBreed", "KaranSwissXZebuCattleBreed", "SardinianCattleBreed", "EurolinePigBreed", "JutlandHorseBreed", "VerataGoatBreed", "KoreanImprovedPigBreed", "EdelschweinPigBreed", "PenArLan77PigBreed", "LimpurgerCattleBreed", "MurcianCattleBreed", "LokaiHorseBreed", "ColoredBullTerrierDogBreed", "EasternNuerCattleBreed", "BrahmaCowBreed", "GriffonFauveDeBretegneDogBreed", "MurcianaGranadinaGoatBreed", "AlistanaSanabresaCattleBreed", "MalteseCatBreed", "HerefordPigBreed", "EvolèneCattleBreed", "TropicalXZebuCattleBreed", "VerzascaGoatBreed", "CerbatHorseBreed", "CharnequeriaGoatBreed", "MandiPigBreed", "MagalCattleBreed", "PolesianPigBreed", "WelshSpringerSpanielDogBreed", "TerskHorseBreed", "AustralianMilkingZebuXZebuCattleBreed", "AriégeoisPonyHorseBreed", "MixedBreedChicken", "FleuveHorseBreed", "GermanLonghairedPointerDogBreed", "OropaCattleBreed", "PigghamPigBreed", "BrazilianSomaliSheepBreed", "AnadoluHorseBreed", "KoreanBlackCattleBreed", "CatalinaIslandPigBreed", "BergerDePyreneesDogBreed", "LonghairedManx", "EnderbyIslandCattleBreed", "AnatolianBlackCattleBreed", "ZnamenskCattleBreed", "SumbaHorseBreed", "XinjiangWhitePigBreed", "ToronkeCattleBreed", "EnglishToyTerrierDogBreed", "EastFriesianSheepBreed", "JemJemZebuCattleBreed", "BoarPowerPig747PigBreed", "BakosiPigBreed", "NamaCattleBreed", "HungarianGrayCattleBreed", "HissarCattleBreed", "EstonianHoundDogBreed", "CalabrianCattleBreed", "RedPollCowBreed", "Camborough15PigBreed", "PresticePigBreed", "PriobHorseBreed", "LohiSheepBreed", "ChartPolskiDogBreed", "BrazilianDairyHybridXZebuCattleBreed", "KleenLeenWhitePigBreed", "CabanninaCattleBreed", "TurkishBrownCattleBreed", "BritishAppaloosaHorseBreed", "KabyleCattleBreed", "DøleHorseBreed", "AmericanBobtailCatBreed", "VizslaSuperbreedDogBreed", "AztecaHorseBreed", "TransylvanianHoundDogBreed", "BlackForestHoundDogBreed", "SouthSuffolkSheepBreed", "HorroCattleBreed", "SprecaCattleBreed", "BragadoDoSorraiaCattleBreed", "LithuanianRedCattleBreed", "BelgianTervurenDog", "BreitovPigBreed", "RahvanHorseBreed", "CantonesePigBreed", "VietnamesePigBreed", "PhilippineNativePigBreed", "SwedishLapphundDogBreed", "AbyssinianShorthornedZebuCattleBreed", "JidduCattleBreed", "SouthRussianOvcharkaDogBreed", "CharaHorseHorseBreed", "SovietMeatPigBreed", "ChantillyTiffanyCatBreed", "MerinolandschafSheepBreed", "CaldeanoCattleBreed", "AmericanSaddlebredHorseBreed", "BardigianoHorseBreed", "ThuringianGoatBreed", "SpitiHorseBreed", "GrayAlpineCattleBreed", "AndalusianBlackCattleBreed", "BritishLopPigBreed", "AmericanEskimoToyDogBreed", "MarchigianaCowBreed", "YorkshireCoachHorseBreed", "AradoCattleBreed", "LleynSheepBreed", "GolpayeganiCattleBreed", "PinzhouCattleBreed", "ArmantDogBreed", "SmallWhitePigBreed", "PonyHorseBreed", "AngloFrancaisDePetitVenerieDogBreed", "RottalHorseBreed", "PixieBobCatBreed", "GuineaHogPigBreed", "CalasparrenaCattleBreed", "WestAfricanDwarfSheepBreed", "RätienGrayCattleBreed", "SinoVietnamesePigBreed", "RomanianLargeWhitePigBreed", "KhorsanCattleBreed", "CornishRexCatBreed", "KabardaHorseBreed", "KisantuCattleBreed", "JabeHorseBreed", "SelkirkRexCatBreed", "EnglishCoonhoundDogBreed", "BritishAlpineGoatBreed", "MazandaraniCattleBreed", "PagliarolaSheepBreed", "OldDanishBirdDogBreed", "BelgianBlueCattleBreed", "HattonXZebuCattleBreed", "NewfoundlandPonyHorseBreed", "RomanianBrownCattleBreed", "FinnishAyrshireCattleBreed", "LiangGuangSmallSpottedLuchuanPigBreed", "YemeniHorsesHorseBreed", "WallisCountrySheepBreed", "CotswoldGoldPigBreed", "MudiDogBreed", "BorneoZebuCattleBreed", "DBIPigBreed", "SchwerfurtMeatPigBreed", "ErlunchunHorseBreed", "BelgianWolfhoundDogBreed", "MukotaPigBreed", "GuzeratCattleBreed", "DerbyshireGritstoneSheepBreed", "CampanianBarbarySheepBreed", "SykiaCattleBreed", "ChifordCattleBreed", "KhevsurianCattleBreed", "ZanzibarZebuCattleBreed", "FloridaCrackerHorseBreed", "ModicanaLowlandCattleBreed", "BorderTerrier", "MixedBreedPig", "SwissWarmbloodHorseBreed", "GiantSchnauzerDogBreed", "NavajoChurroSheepBreed", "NorwichTerrier", "JamaicaHopeXZebuCattleBreed", "NewForestPonyHorseBreed", "ItalianGreyhound", "BlondeDAquitaineCowBreed", "SlovakianWhitePigBreed", "BelgiumLandracePigBreed", "CalascibettaPigBreed", "AdaevHorseBreed", "MiniatureSchnauzerDogBreed", "ChinoSantandereanoCattleBreed", "AmericanBulldogBreed", "RussianWhiteGoatBreed", "MixedBreedCattle", "BapediCattleBreed", "BeltsvillePigBreed", "CaspianHorseBreed", "PolishMarshPigBreed", "PoodleSuperbreedDogBreed", "ZlotnikiSpottedPigBreed", "RomanianNativeStocliPigBreed", "NelloreCowBreed", "GermanBlackheadedMuttonSheepBreed", "JindoDogBreed", "HainanTunchangPigBreed", "BelgianStreetDogBreed", "AustralianMistCatBreed", "AsturianValleyCattleBreed", "CãoDeCastroLaboreiroDogBreed", "ArouquesaCattleBreed", "DesFossesCommunesDeLOuestGoatBreed", "BoarPowerPig616PigBreed", "CiritHorseBreed", "CamargueCattleBreed", "LinebackCattleBreed", "DKPig61PigBreed", "BameiPigBreed", "CoPigBreed", "GambianNDamaXZebuCattleBreed", "YanbianCattleBreed", "TajmaCattleBreed", "DnepropetrovskPigBreed", "AbigarCattleBreed", "HeilongkaingHorseBreed", "LargePolishLongEaredPigBreed", "MurrayGrayCattleBreed", "HanoverianHoundDogBreed", "ResavaPigBreed", "AsturianTarpanHorseXDomesticHorseBreed", "SomaliCat", "PuertoRicanCriolloCattleBreed", "PerdigueiroPortugueseDogBreed", "NorwegianForestCatBreed", "AidiDogBreed", "DalmatianDog", "BassetFauveDeBretagneDogBreed", "RackaSheepBreed", "BlacksidedTrondheimAndNorlandCattleBreed", "BolivianPigBreed", "AmericanTrotterHorseBreed", "NorwegianLandracePigBreed", "UjumqinCattleBreed", "DamaniGoatBreed", "EnglishHackHorseBreed", "RyelandSheepBreed", "NorthSomaliZebuCattleBreed", "Cotswold90PigBreed", "BelgianMalinoisDog", "KushumHorseBreed", "PeacockGoatBreed", "ThaiBinhPigBreed", "TharparkarCattleBreed", "ChamoiseeGoatBreed", "PomeranianPigBreed", "KholmogoryCattleBreed", "DhanniCattleBreed", "EastMacedonianCattleBreed", "SwedishVallhundDogBreed", "BombayCat", "BlueTickCoonhoundDogBreed", "TanzanianZebuCattleBreed", "PindosPonyHorseBreed", "TawleedHorseBreed", "GuangxiWhitePigBreed", "ChienFrançaisBlancEtOrangeDogBreed", "PankotaRedCattleBreed", "SwedishFurSheepBreed", "TaraiCattleBreed", "BarbariGoatBreed", "KarachaiHorseBreed", "RaadPigBreed", "BretonBlackPiedCattleBreed", "CanastrãoVermelhoPigBreed", "MustangHorseBreed", "ItalianLandracePigBreed", "CzechoslovakianSmallRidingHorseHorseBreed", "PesterCattleBreed", "DanubianHorseBreed", "IbanPigBreed", "PalmeraCattleBreed", "LaviniaXZebuCattleBreed", "BurmeseCat", "CanadianSportHorseHorseBreed", "MalviCattleBreed", "FrenchGuardDogBreed", "HampshirePigBreed", "DevonRexCatBreed", "MaryutiCattleBreed", "NarymHorseBreed", "AlaTauCattleBreed", "GalicenoHorseBreed", "GüssingForestPigPigBreed", "KangarooIslandPigBreed", "KyogaCattleBreed", "OwczarekPodhalandskiDogBreed", "LundyPonyHorseBreed", "BosTaurusIndicusCowBreed", "NoniusHorseBreed", "WessexSaddlebackPigBreed", "MezenHorseBreed", "QinchuanCattleBreed", "MampatiCattleBreed", "BullTerrier", "SpanishAmericanHorseHorseBreed", "FrijolilloCattleBreed", "ZlotnikiWhitePigBreed", "WeisseHornloseHeidschnuckeSheepBreed", "XinjinJilinBlackPigBreed", "ChiTerrierDogBreed", "SonValleyCattleBreed", "ScottishHighlandCowBreed", "BenadirGoatBreed", "BoarPowerPig474PigBreed", "ChesterWhitePigBreed", "RazorBackPigBreed", "PhilippineNativeCattleBreed", "CanadianRoyalBluePigBreed", "HornedHerefordCowBreed", "CarpathianPonyHorseBreed", "DKPig77PigBreed", "NiloticSangaCattleBreed", "BoulonnaisHorseBreed", "ReniteloXZebuCattleBreed", "NorwegianRedCattleBreed", "CaucasianMountainDogBreed", "ChenghuaPigBreed", "BlancDeBouscatRabbitBreed", "BarkaZebuCattleBreed", "SicilianBarbarySheepBreed", "BeagleStandardDogBreed", "AdamawaCattleBreed", "BorderLeicesterSheepBreed", "TibetanSpaniel", "LincolnRedCowBreed", "AnkoleWatusiCattleBreed", "PekingeseDog", "CréolePigBreed", "StCroixSheepBreed", "KikoGoatBreed", "SouthRussianSteppeHoundDogBreed", "SpanishNormanHorseBreed", "FortCrossCattleBreed", "BorgouXZebuCattleBreed", "SpanishMastiffDogBreed", "BurlinaCattleBreed", "HillRadnorSheepBreed", "MastergiltPigBreed", "DRUTerminalsPigBreed", "ChineseCrestedDogBreed", "SchwyzCattleBreed", "SouthwestSpanishMustangHorseBreed", "CzechWarmbloodHorseBreed", "BulgarianNativePigBreed", "AmericanCashmereGoatBreed", "GriffonDog", "HangPigBreed", "SphynxCatBreed", "DongolaCattleBreed", "PolledNeloreCattleBreed", "DebouilletSheepBreed", "MerinoSheepSuperbreed", "HawaiianWildCattleBreed", "SaanenGoatBreed", "LonkSheepBreed", "BantuPigBreed", "HuazhongTwoEndBlackPigBreed", "KalakheriCattleBreed", "BlackBaldyCattleBreed", "ThanhHoaCattleBreed", "PindosHorseBreed", "HavanaBrownCat", "ChianinaCowBreed", "MixedDairyCattleBreed", "BadenWurttemburgHorseBreed", "BostonTerrier", "BlackFacedHighlandSheepBreed", "JersindXZebuCattleBreed", "SchnauzerSuperbreedDogBreed", "GroningenWhiteheadedCattleBreed", "BraqueDAriégeDogBreed", "DidingaCattleBreed", "KatahdinSheepBreed", "XinjiangFinewoolSheepBreed", "PembrokeWelshCorgiDogBreed", "HungarianDunHorseBreed", "PolishBlackAndWhiteLowlandCattleBreed", "NewZealandHeadingDogBreed", "SaidiCattleBreed", "BalikunHorseBreed", "PechoraCattleBreed", "MessaoriaCattleBreed", "AliabDinkaCattleBreed", "SkyrosPonyHorseBreed", "RoughAndSmoothDogBreed", "OliventinaPigBreed", "KrskopoljePigBreed", "AmericanLamaleseDogBreed", "EnglishSetterDogBreed", "PirapetingaPigBreed", "MinisibPigBreed", "FalabellaHorseBreed", "PatibarcinaHorseBreed", "SarvarHorseBreed", "VorderwaldCattleBreed", "AlpineDachsbrackeDogBreed", "MissouriFoxTrottingHorseBreed", "EnglishCobHorseBreed", "QingpingPigBreed", "LewitzerHorseBreed", "RendenaCattleBreed", "TeeswaterSheepBreed", "DomesticMediumHairedCat", "BashkirCurlyHorseBreed", "OldNorwegianSheepBreed", "PitangueirasXZebuCattleBreed", "DonGoatBreed", "DachshundSuperbreedOfDog", "FoxTerrierSuperbreedDogBreed", "PutianPigBreed", "GuanlingPigBreed", "PorcelaineDogBreed", "MiniaturePinscherDog", "JapaneseSpaniel", "SardoModicanaCattleBreed", "KamdhinoCattleBreed", "MongolianCattleBreed", "SinoGasconyPigBreed", "JerseyCowBreed", "ShkodraRedCattleBreed", "ToyPoodleDogBreed", "LatukaCattleBreed", "BulgarianWhitePigBreed", "SomaliSheepBreed", "KalmykCattleBreed", "AlentejanaCattlebreed", "MegezhHorseBreed", "KaiKenDogBreed", "DamascusCattleBreed", "BamiCattleBreed", "WalachenschafSheepBreed", "AngelnSaddlebackPigBreed", "ShetlandPonyHorseBreed", "FauveDeBretagneDogBreed", "CambridgeSheepBreed", "ModeneseCattleBreed", "RussianBlueCat", "GulfCoastNativeSheepBreed", "SouthDevonCattleBreed", "HolsteinerHorseBreed", "KenyaBoranCattleBreed", "EastFinnishCattleBreed", "TreeingCurDogBreed", "RyaSheepBreed", "MonchinaCattleBreed", "NigerianDwarfGoatBreed", "KunekunePigBreed", "GermanRedPiedPigBreed", "MarylandPigBreed", "ReggianaCattleBreed", "LurcherHoundDogBreed", "RomneletSheepBreed", "PantaneiroHorseBreed", "MarwariHorseBreed", "GuadarramaGoatBreed", "FonthillMerinoSheepBreed", "BordeauxDogBreed", "SlovakianPinzgauCattleBreed", "BoarPowerPig141PigBreed", "TielingHorseBreed", "BlackHampshirePigBreed", "SouthernCriouloCattleBreed", "QuarterPonyHorseBreed", "UkrainianGrayCattleBreed", "BraqueSaintGermainDogBreed", "SunandiniXZebuCattleBreed", "TarentaiseCowBreed", "NewHuaiPigBreed", "BritishShorthairedCat", "BlancaCeltibericaGoatBreed", "GratiCattleBreed", "GermanPinscherDogBreed", "NantaisCattleBreed", "CanadianCowBreed", "CuinoPigBreed", "AmericanTunisSheepBreed", "HokkaidoHorseBreed", "FellPonyHorseBreed", "MiKiDogBreed", "AnatolianShepherdDogBreed", "GrandGasconSaintongeoisDogBreed", "DutchKooikerDogBreed", "KoratCat", "PetitBleuDeGascogneDogBreed", "RedSindhiCattleBreed", "HungarofriesCattleBreed", "ToriHorseBreed", "FuriosoHorseBreed", "NepaleseHillZebuCattleBreed", "CyprusCattleBreed", "AmericanCurlCatBreed", "BarrosoCattleBreed", "TonkineseCat", "CharfordXZebuCattleBreed", "MuongKhuongPigBreed", "BelgianLandraceBNPigBreed", "KirdiPonyHorseBreed", "SomaliGoatBreed", "HogIslandSheepBreed", "SiberianBlackPiedPigBreed", "OldFormatMinToyPoodleDogBreed", "TyrolMountainSheepBreed", "MezzalinaCattleBreed", "GermanMountainSheepBreed", "GermanShorthornCattleBreed", "AinuDogBreed", "DashtiariCattleBreed", "MaduraWildJavanXZebuCattleBreed", "DutchTuigpaardHorseBreed", "WanzheSpottedChunanSpottedPigBreed", "MontafonCattleBreed", "FlatCoatedRetrieverDogBreed", "NorthernBlueCattleBreed", "LiberianDwarfCattleBreed", "MhaswadCattleBreed", "KyiApsoDogBreed", "SardaGoatBreed", "KuiMlkDogBreed", "VladimirHeavyDraftHorseBreed", "VestlandFjordCattleBreed", "DKPig30PigBreed", "LipetskPigBreed", "AostaChestnutCattleBreed", "ZhemaichuHorseBreed", "IberianBlackIberianPigBreed", "MagyarAgårDogBreed", "ShireHorseBreed", "RoyaVesubieGoatBreed", "AmericanCreamDraftHorseBreed", "NorfolkTerrier", "AustralianFriesianSahiwalXZebuCattleBreed", "AustralianStockHorseHorseBreed", "FHCElitePig7PigBreed", "ByelorussianSyntheticCattleBreed", "CanaryIslandCattleBreed", "NyoroCattleBreed", "SokolkaHorseBreed", "ShanghaiWhitePigBreed", "WanzheSpottedPigBreed", "KaninganCattleBreed", "TibetanMastiffDogBreed", "PuliDog", "StreiPigBreed", "SouthAnatolianRedCattleBreed", "LithuanianWhitePigBreed", "DatongHorseBreed", "EgyptianHorseBreed", "VolynskCattleBreed", "PolesianHorseBreed", "BriardDog", "MontanaraCattleBreed", "BuryatHorseBreed", "CamarronGoatBreed", "AmericanHairlessTerrierDogBreed", "StandardbredHorseBreed", "DanishLargeWhitePigBreed", "BaggaraCattleBreed", "NakaliCattleBreed", "PlevenHorseBreed", "SahfordXZebuCattleBreed", "GarganicaGoatBreed", "PoltavaPigBreed", "MurleCattleBreed", "CostenoHorseBreed", "CentralAsianZebuXZebuCattleBreed", "ManorMeishanPigBreed", "SpottedPigBreed", "SpanishGoatBreed", "DKPigBreed", "GallowayCowBreed", "DonPigBreed", "TurkishVanCatBreed", "KhamalaCattleBreed", "VosgesCattleBreed", "MeusseRhineIjsselCowBreed", "DanishOldenborgHorseBreed", "GermanRedPiedCattleBreed", "KedahKelantanCattleBreed", "FinnhorseHorseBreed", "DutchFriesianCattleBreed", "SouthAfricanMerinoSheepBreed", "BerkshirePigBreed", "BosnianHoundDogBreed", "RastreadorBrasileiroDogBreed", "MiniatureBullTerrierDogBreed", "AltaiHorseBreed", "DomesticLonghairedCat", "SkuddeSheepBreed", "MurcianPigBreed", "DamiettaCattleBreed", "NejdiCattleBreed", "AmericanBisonXCattleBreed", "SiberianPigBreed", "CanadianHampshirePigBreed", "BassetGriffonVendéenDogBreed", "BaXuyenPigBreed", "RockyMountainHorseHorseBreed", "PolledWelshBlackCattleBreed", "BeulahSpeckledFaceSheepBreed", "BelgianArdennaisHorseBreed", "GermanRidingPonyHorseBreed", "KoreanNativePigBreed", "YorkshireBlueAndWhitePigBreed", "AustralianKelpieDogBreed", "TuniCattleBreed", "KigerMustangHorseBreed", "LapermShorthairCatBreed", "EastFriesianWarmbloodModernTypeHorseBreed", "ValdresCattleBreed", "DrentsePatrijshondDogBreed", "WindsnyerPigBreed", "BoarPowerPig282PigBreed", "PiauSorocabaPigBreed", "IrishMoiledCattleBreed", "RioLimonDairyCriolloCattleBreed", "OxfordDownSheepBreed", "OldeEnglishBulldoggeDogBreed", "CanindéGoatBreed", "KarabakhHorseBreed", "AustrianYellowCattleBreed", "DairySyntheticCattleBreed", "TropicanaCattleBreed", "KomondorDog", "NiloCanastraPigBreed", "Keeshond", "GuernseyCowBreed", "CaiuaXZebuCattleBreed", "BuohaiHorseBreed", "DKPig63PigBreed", "HetaoLopEarPigBreed", "HolmongerCattleBreed", "RathCattleBreed", "BarzonaCattleBreed", "AmericanShetlandPonyHorseBreed", "SwissAlpineGoatBreed", "SokokeCatBreed", "ChineseKazakhHorseBreed", "JerdiXZebuCattleBreed", "LakenvelderCattleBreed", "IrishGoatBreed", "MirandesaCattleBreed", "DabieshanCattleBreed", "SwabianHallPigBreed", "PolledShorthornUSCattleBreed", "GalicianPigBreed", "GraueGehoernteHeidschnuckeSheepBreed", "SwedishWarmbloodHorseBreed", "OrkneySheepBreed", "UzunyaylaHorseBreed", "SlovakCuvakDogBreed", "GermanSpitzDogBreed", "PittIslandSheepBreed", "BeefSyntheticCattleBreed", "SiberianBlackPiedCattleBreed", "SalersCowBreed", "VoronezhCoachHorseHorseBreed", "EurasianDogBreed", "SwallowBeliedMangalitzaPigBreed", "KankrejCattleBreed", "HarbinWhitePigBreed", "AmericanYorkshirePigBreed", "LiangGuangSmallSpottedGuangdongSmallEarPigBreed", "SistaniCattleBreed", "LuciePigBreed", "Dalland030PigBreed", "GermanAngusCattleBreed", "BichonTeneriffeDogBreed", "YanqiHorseBreed", "ShagyaHorseBreed", "MadonieSicilianPigBreed", "BavarianForestSheepBreed", "NomaHorseBreed", "LeiqiongCattleBreed", "ColourpointShorthairedCat", "BlackMangalitsaPigBreed", "IstrianCattleBreed", "LuxiCattleBreed", "HinterwaldCattleBreed", "RussianBrownCattleBreed", "FHCElitePig2PigBreed", "AndalusianGrayCattleBreed", "CaliforniaSpangledCatBreed", "MinusinHorseBreed", "BSIPigBreed", "TriggHoundDogBreed", "JinhuaPigBreed", "BalearicHorseBreed", "IleDeFranceSheepBreed", "MandalongXZebuCattleBreed", "CarpatheGoatBreed", "DoranCattleBreed", "SpanishPointerDogBreed", "BakosiCattleBreed", "RedEngadineSheepBreed", "MorganHorseBreed", "BoXuPigBreed", "TurkishAngoraCat", "SouthdownSheepBreed", "AmritMahalZebuCattleBreed", "PolishDraftHorseBreed", "CeskyTerrierDogBreed", "KalmykHorseBreed", "JenubiCattleBreed", "RedKandhariCattleBreed", "YakutCattleBreed", "BelgianRedCattleBreed", "KarabairHorseBreed", "LincolnRedShorthornCattleBreed", "DoayoCattleBreed", "SardinianBrownCattleBreed", "AustralianPonyHorseBreed", "RagamuffinCatBreed", "WhiteGallowayCattleBreed", "AcehCattleBreed", "DexterCowBreed", "KachhiSheepBreed", "BaluchiHorseBreed", "GuzerandoXZebuCattleBreed", "LucanianPigBreed", "RideauArcottSheepBreed", "LonghairedMiniatureDachshundDogBreed", "AkitaDog", "BelgianRedPiedCattleBreed", "WhiteWelshCattleBreed", "TargheeSheepBreed", "XinjinXinjinPigBreed", "TroteEnGallopeHorseBreed", "SwissBlackPiedCattleBreed", "SulawesiHorseBreed", "MeixinPigBreed", "DianiPigBreed", "AngloFrancaisDeMoyenVenerieDogBreed", "LincolnSheepBreed", "AustralianGreyhoundDogBreed", "RomanianSaddleHorseHorseBreed", "EquusCaballusGmeliniHorseBreed", "MangalargaMarchadorHorseBreed", "BibrikSheepBreed", "CretanMountainCattleBreed", "BelgianGriffonSmoothDogBreed", "WensleydaleSheepBreed", "RedDesertCattleBreed", "PersianCat", "MassifCentralGoatBreed", "MurakozHorseBreed", "WestrainPigBreed", "NdaguXZebuCattleBreed", "HamplinePigBreed", "NanyangCattleBreed", "CharSwissCattleBreed", "KareloFinnishLaikaDogBreed", "NorwegianDunkerhoundDogBreed", "SilesianHorseBreed", "MurnauWerdenfelsCattleBreed", "MaureCattleBreed", "ErhulianPigBreed", "SemirechenskPigBreed", "FujianSmallPigBreed", "BejaCattleBreed", "ButanaCattleBreed", "ItalianHeavyDraftHorseBreed", "MinPigBreed", "LeeSungPigBreed", "WallisBlacknosedSheepBreed", "SaintBernardShortHairedDogBreed", "MalteseGoatBreed", "CastlemilkMooritSheepBreed", "FerrandaisCattleBreed", "ApulianPodolianCattleBreed", "SmallPolishPrickEaredPigBreed", "GorbatovRedCattleBreed", "DandieDinmontTerrier", "PortoAmboimCattleBreed", "DahePigBreed", "AmericanBlueGasconHoundDogBreed", "JapaneseBlackCattleBreed", "IranianZebuCattleBreed", "PolishRedCattleBreed", "OICPigBreed", "DamaraSheepBreed", "BorderCollieDogBreed", "KoninkTarpanHorseXDomesticHorseBreed", "BooroolaMerinoSheepBreed", "NorwegianGoatBreed", "MiyakoHorseBreed", "ArapawaIslandGoatBreed", "KaranFriesXZebuCattleBreed", "NewYorkRedPigBreed", "BündnerOberlandSheepBreed", "AlbanianHorseBreed", "BoarPowerPig161PigBreed", "GadoDaTerraCattleBreed", "PineywoodsPigBreed", "HessenHorseBreed", "PodengoCanarioDogBreed", "UzbekBlackGoatBreed", "Bulldog", "SabreXZebuCattleBreed", "SmoothCollieDogBreed", "ToposaCattleBreed", "GermanFleckViehCowBreed", "PrisheksninskPigBreed", "FHCElitePig6PigBreed", "SmoothHairedVizslaDogBreed", "PR1050PigBreed", "RomneyMarshSheepBreed", "CoburgerFuchsschafSheepBreed", "GoldenAmericanSaddlebredHorseBreed", "OulmesBlondCattleBreed", "DutchLandracePigBreed", "CarunchinhoPigBreed", "KonariCattleBreed", "SuboticaWhitePigBreed", "ArsiCattleBreed", "MurbodenCattleBreed", "KapsikiCattleBreed", "JagdterrierDogBreed", "DjermaHorseBreed", "Pudelpointer", "EriskayPonyHorseBreed", "BoarPowerPig414PigBreed", "LargeWhitePigBreed", "KeErQinHorseBreed", "MergellandSheepBreed", "SouthWalesMountainSheepBreed", "CapeHorseHorseBreed", "FreibergHorseBreed", "BoreraySheepBreed", "PunganurCattleBreed", "FrenchSpanielDogBreed", "PeruvianIncaOrchidDogBreed", "JielinHorseBreed", "PyreneanCattleBreed", "TribredPigBreed", "AmericanIndianDogBreed", "Greyhound", "CatahoulaLeopardDogBreed", "QuarterHorseBreed", "VenezuelanBlackPigBreed", "PalominoHorseBreed", "DorsetSheepSuperbreed", "SinclairMiniaturePigBreed", "EastAnatolianRedCattleBreed", "VichPigBreed", "MewatiCattleBreed", "AkhaPigBreed", "BarbadosSheepBreed", "ASCOBCockerSpanielDogBreed", "PicCambourghPigBreed", "KetekuXZebuCattleBreed", "BritishSaanenGoatBreed", "MixedBreedHorse", "Ocicat", "KerryCattleBreed", "CestrumParqui", "PharaohHound", "RamoGrandeCattleBreed", "IrishCobHorseBreed", "SmoothStandardDachshundDogBreed", "BraMaineXZebuCattleBreed", "BloodhoundSouthernHoundDogBreed", "LimousinCowBreed", "FinnishLandraceGoatBreed", "MarinhoaCattleBreed", "NorwegianElkhound", "BritishSaddlebackPigBreed", "DKPig31PigBreed", "BoarPowerPig292PigBreed", "AmericanWaterSpanielDogBreed", "YaroslavlCattleBreed", "GaolaoCattleBreed", "JinhuaDongyangPigBreed", "GarfagninaCattleBreed", "MBayarHorseBreed", "AustralianCattleDog", "JianchangHorseBreed", "TamworthPigBreed", "KookaSheepBreed", "ChernigovCattleBreed", "VillardDeLansCattleBreed", "FrenchBrownCattleBreed", "BarbetDogBreed", "GuadianaSpottedCattleBreed", "BengaliCattleBreed", "NDamaCattleBreed", "MarianasCattleBreed", "RangerXZebuCattleBreed", "NorfolkHornSheepBreed", "CatalanSheepdogBreed", "BaouleCattleBreed", "RomanianNativeBaltaretPigBreed", "BarrosaCattleBreed", "BerneseHoundDogBreed", "FHCElitePig8PigBreed", "EstrelaMountainDogBreed", "NovaScotiaDuckTollingRetrieverDogBreed", "CaptainCookerPigBreed", "CurraleiroCattleBreed", "MinhotaCattleBreed", "NooitgedachtHorseBreed", "QuarabHorseBreed", "SunkumaCattleBreed", "AmericanEssexPigBreed", "IrishWaterSpanielDogBreed", "GuoxiaHorseBreed", "MoravianLargeYorkshirePigBreed", "SpanishAngloArabHorseBreed", "HanzhongWhitePigBreed", "AraappaloosaHorseBreed", "SilkyTerrier", "ChianinaPigBreed", "KilisCattleBreed", "HezuoPigBreed", "HighlandPonyHorseBreed", "BelgianGroenendaelDog", "KleenLeenBlackPigBreed", "AwassiSheepBreed", "AmericanMerinoSheepBreed", "RussianBlackPiedCattleBreed", "UrzhumPigBreed", "SchapendoesDogBreed", "PanjeHorseBreed", "JapaneseRetrieverDogBreed", "MoxotóGoatBreed", "GermanShepherdDog", "StandardPoodleDogBreed", "BahimaCattleBreed", "MessaraHorseBreed", "NavajoSheepBreed", "BeijingBlackPigBreed", "AfricanaSheepBreed", "NewKirgizHorseBreed", "SavinjaGrayCattleBreed", "JellicutCattleBreed", "TadzhikZebuCattleBreed", "CarthusianHorseBreed", "ShetlandSheepdog", "JamaicaBlackXZebuCattleBreed", "FjordHorseBreed", "OtterHound", "CheurfaCattleBreed", "NormandieCowBreed", "SiskaPigBreed", "LobiCattleBreed", "TaiwanYellowCattleBreed", "KharkovPigBreed", "GuangxiHorseBreed", "ChineseBlackAndWhiteCattleBreed", "ShorthornCowBreed", "BlackSlavonianPigBreed", "AltaiMountainGoatBreed", "ComtoisHorseBreed", "TambovRedCattleBreed", "BlackCockerSpanielDogBreed", "RambouilletSheepBreed", "DomesticShorthairedCat", "MinzhuPigBreed", "HerdwickSheepBreed", "StyrianMountainDogBreed", "SingleFootingHorseHorseBreed", "SwedishRedPolledCattleBreed", "ChamDocCattleBreed", "XinjinNingAnPigBreed", "BraqueDAuvergneDogBreed", "LombokHorseBreed", "PhilippineGoatBreed", "SchleswigHorseBreed", "FellataCattleBreed", "CãoDeFilaMiguelDogBreed", "DutchWarmbloodHorseBreed", "LangheSheepBreed", "IcelandicSheepdogBreed", "CanadianRusticPonyHorseBreed", "SantaInêsSheepBreed", "PeruvianPasoHorseBreed", "KachchaSiriCattleBreed", "Cotswold29PigBreed", "HainanLingaoPigBreed", "NorthBangladeshGrayCattleBreed", "EnglishGoatBreed", "BirmanCat", "FightingBullCattleBreed", "HartónCattleBreed", "GermanKoolieDogBreed", "ManxameseCatBreed", "MertolengaCattleBreed", "TelomainDogBreed", "XiangxiBlackPigBreed", "ChinookDogBreed", "BritishMilkSheepBreed", "AfricangnusCattleBreed", "CalvanaCattleBreed", "BritishLandracePigBreed", "WhitefaceWoodlandSheepBreed", "CanastrãoCabanoPigBreed", "ToubouXZebuCattleBreed", "MinnesotaPigBreed", "KenanaCattleBreed", "PercheronHorseBreed", "DevonCattleBreed", "FuzhouBlackPigBreed", "OrlovTrotterHorseBreed", "AlbanianIllyrianCattleBreed", "BosnianHorseBreed", "TaiwanSmallRedPigBreed", "BashiCattleBreed", "AmericanTunisHorseBreed", "SlovenianBrownCattleBreed", "SouthAfricanMuttonMerinoSheepBreed", "CildirCattleBreed", "MaremmanaHorseBreed", "BhirumPonyHorseBreed", "NkoneCattleBreed", "ShetlandSheepBreed", "MiniatureAustralianShepherdDogBreed", "FriesianHorseBreed", "DnieperPigBreed", "LebaneseCattleBreed", "HaitiCreolePigBreed", "PolishSimmentalCattleBreed", "BanyoCattleBreed", "BraqueFrancaisDePetiteTailleDogBreed", "HuaiPigBreed", "TuliCattleBreed", "SopravissanaSheepBreed", "StrongWoolMerinoSheepBreed", "MacedonianPigBreed", "PaphosCattleBreed", "TamankaduwaCattleBreed", "BaliHorseBreed", "PoitouGoatBreed", "WestAfricanBarbHorseBreed", "DanishRedCattleBreed", "LeineschafSheepBreed", "SimbrahCattleBreed", "SealyhamTerrier", "GirCowBreed", "PerendaleSheepBreed", "AltaySheepBreed", "NoTailSheepBreed", "Line500DurocPigBreed", "GermanPasturePigBreed", "MoghaniSheepBreed", "MinPeiDogBreed", "LepingPigBreed", "RojhanCattleBreed", "SandanHorseBreed", "ManorHybridPigBreed", "GermanCornwallPigBreed", "ToyHavaneseTerrierDogBreed", "AbyssinianCat", "KisoHorseBreed", "BraqueDupuyDogBreed", "AmericanCoonhoundDogBreed", "SharPeiDogBreed", "BritishWarmbloodHorseBreed", "MaineAnjouCowBreed", "CreoleAntillesGoatBreed", "GalwaySheepBreed", "DorperSheepBreed", "SloughiDogBreed", "PolishLandracePigBreed", "CarpathianBrownCattleBreed", "HamrocPigBreed", "SpinoneItalianoDogBreed", "DutchShepherdDogBreed", "GrandBleuDeGascogneDogBreed", "DroughtmasterXZebuCattleBreed", "FHCPigBreed", "RedSteppeCattleBreed", "ChienFrançaisTricoloreDogBreed", "SteigarSheepBreed", "CorsicanPigBreed", "ToyFoxTerrierDogBreed", "PieRougeDeLEstCattleBreed", "SuisbuXZebuCattleBreed", "HondurasSwitchTailPigBreed", "SonkheriCattleBreed", "EastBalkanPigBreed", "KochiCattleBreed", "CanastraPigBreed", "SanfratelloHorseBreed", "MeoPigBreed", "OldSwedishSpottedPigBreed", "KoronadalPigBreed", "BetizuakCattleBreed", "AmericanBobtailLonghairCatBreed", "TibetanCattleBreed", "WelshMountainPonyHorseBreed", "BambaraXZebuCattleBreed", "TexelSheepBreed", "TokaraHorseBreed", "FinnishHoundDogBreed", "TibetanPigBreed", "AlentejanaPigBreed", "RedWattlePigBreed", "CardiganWelshCorgiDogBreed", "KhillariCattleBreed", "ImprovedRodopiCattleBreed", "ArmoricanCattleBreed", "MurgheseHorseBreed", "AubracCattleBreed", "OhminiPigBreed", "DajalCattleBreed", "BraviaGoatBreed", "BlackheadPersianSheepBreed", "HavaneseDogBreed", "GoldenRetrieverDogBreed", "RexCatBreed", "CheviotSheepBreed", "MetohijaRedCattleBreed", "BalwenWelshMountainSheepBreed", "PortugueseGuardDogBreed", "AlpineGoatBreed", "SpanishBarbHorseBreed", "BusaCattleBreed", "AnkoleCattleBreed", "CosentinaPigBreed", "BulgarianRedCattleBreed", "BatanesBlackXZebuCattleBreed", "BoarPowerPig84PigBreed", "CharbrayXZebuCattleBreed", "ThalliSheepBreed", "SengologaCattleBreed", "TswanaCattleBreed", "HuazhongTwoEndBlackJianliPigBreed", "GreatDaneDog", "MouflonSheepBreed", "WestAfricanDwarfShorthornCattleBreed", "MontdaleSheepBreed", "LargeBlackWhitePigBreed", "BashkirHorseBreed", "ElliottdaleSheepBreed", "NebelungCatBreed", "LundehundDogBreed", "SienaBeltedPigBreed", "KrolevetsPigBreed", "BouvierDesFlandres", "AustrianSmoothHairedBrackeDogBreed", "BlancoOrejinegroCattleBreed", "HanfordMiniaturePigBreed", "BulgarianLandracePigBreed", "AzoresHorseBreed", "TibetanHorseBreed", "HerelandCattleBreed", "XinjiangBrownCattleBreed", "ColoradoRangerHorseBreed", "AmericanIndianHorseHorseBreed", "ManchesterTerrierSuperbreedDogBreed", "ExmoorHornSheepBreed", "AustralianShepherdDogBreed", "NanjingBlackPigBreed", "JinnanCattleBreed", "NortheasternHorseBreed", "PortuguesePointerDogBreed", "OutaouaisArcottSheepBreed", "TavdaHorseBreed", "BoarPowerPig48PigBreed", "ChumyshHorseBreed", "HellenicHoundDogBreed", "DjakoreXZebuCattleBreed", "KinderGoatBreed", "AustralianShorthornCattleBreed", "LadakhiCattleBreed", "RagdollCatBreed", "AnkinaCattleBreed", "GidranHorseBreed", "HackneyHorseBreed", "AriégeoisDogBreed", "RathiCattleBreed", "WireFoxTerrierDogBreed", "BazadaisCattleBreed", "YimengBlackPigBreed", "BatardDogBreed", "CzechMiniaturePigBreed", "BlackGrisonneGoatBreed", "MingrelianRedCattleBreed", "GreatMünsterländerDogBreed", "PrianganSheepBreed", "GlanCattleBreed", "ShortCoatChihuahuaDogBreed", "BeagleSmoothDogBreed", "BeltedGallowayCowBreed", "ChaouiaCattleBreed", "SardinianAngloArabHorseBreed", "SuffolkSheepBreed", "DartmoorSheepBreed", "CharollandaisCattleBreed", "AlanoEspañolDogBreed", "AmericanWhiteParkCattleBreed", "Weimaraner", "DanishDurocPigBreed", "TrakehnerHorseBreed", "SheepBreedUndeterminedSheepBreed", "BeefmakerCattleBreed", "GromarkSheepBreed", "DunkerDogBreed", "LhasaApso", "NormanCoachHorseBreed", "PelibüeySheepBreed", "IllawarraCattleBreed", "BavendaCattleBreed", "BelgianGriffonDogBreed", "KolbroekPigBreed", "RodopiCattleBreed", "ManorRangerPigBreed", "SouthernUkranianCattleBreed", "YorkshirePigBreed", "FHCElitePig4PigBreed", "MastiffDog", "SlovenianWhitePigBreed", "JavaneseCat", "FellTerrierDogBreed", "ChiangusCattleBreed", "MiddleWhitePigBreed", "BeagleHarrierDogBreed", "KenkathaCattleBreed", "CorriedaleSheepBreed", "ByelorussianRedCattleBreed", "LimousinPigBreed", "ArgentineDogoDogBreed", "Bullmastiff", "PolledHerefordCowBreed", "AmericanWirehairedCat", "CarinthianBlondCattleBreed", "EnglishSpringerSpanielDogBreed", "WujinPigBreed", "SpælsauSheepBreed", "PygoraGoatBreed", "TuvaHorseBreed", "UdaSheepBreed", "SiboneyXZebuCattleBreed", "MiddleAsianOvtcharkaDogBreed", "LatvianBlueRoanCattleBreed", "KakhetianPigBreed", "SerpentinaGoatBreed", "GermanRexCatBreed", "HaflingerHorseBreed", "BentheimBlackPiedPigBreed", "NorthAmericanShepherdDogBreed", "MontbeliardCattleBreed", "ChiloteHorseBreed", "SouthAfricanLandracePigBreed", "MilkingDevonCattleBreed", "PonyOfTheAmericasHorseBreed", "HanSheepBreed", "LandracePigBreed", "GreekLocalPigBreed", "MeatlinePigBreed", "NationalShowHorseHorseBreed", "AostaBlackPiedCattleBreed", "VietnameseYellowCattleBreed", "NorwegianLundehundDogBreed", "LonglinPigBreed", "BasutoPonyHorseBreed", "BraqueDuBourbonnaisDogBreed", "MilkingShorthornCowBreed", "AustralianTerrierSilkyDogBreed", "WelshPonyHorseBreed", "DobermanPinscher", "AustralianTerrierRoughCoatedDogBreed", "RhinelandHeavyDraftHorseBreed", "NGabouCattleBreed", "OvamboCattleBreed", "ThuocNhieuPigBreed", "RomagnolaPigBreed", "INRA95CattleBreed", "LongCoatChihuahuaDogBreed", "RedAngusCattleBreed", "KleenLeenPigBreed", "HungairanColdbloodHorseBreed", "BoarPowerPig454PigBreed", "ModicanaCattleBreed", "AmericanQuarterHorseHorseBreed", "Manx", "VendéenSheepBreed", "FumatiPigBreed", "OldFormatManchesterTerrierDogBreed", "LonghairedStandardDachshundDogBreed", "AmericanDraftPonyHorseBreed", "VlaamperdHorseBreed", "IraqiXZebuCattleBreed", "CarazebuXZebuCattleBreed", "MongCaiPigBreed", "PetitBassetGriffonVendeenDog", "NooitgedachtPonyHorseBreed", "PolledSimmentalCattleBreed", "BeefShorthornCattleBreed", "SnowshoeCatBreed", "GermanShorthairedPointerDogBreed", "RedFlemishCattleBreed", "RoveGoatBreed", "GujamavuCattleBreed", "SovereignPigBreed", "NorthEastChinaSpottedPigBreed", "PiauPigBreed", "KazakhHorseBreed", "KazakhWhiteheadCattleBreed", "BushuevXZebuCattleBreed", "HashtNagriSheepBreed", "KamanPigBreed", "JapaneseShorthornCattleBreed", "BritishSpottedPonyHorseBreed", "TudancaCattleBreed", "FHCElitePig5PigBreed", "LandaisHorseBreed", "BonsmaraCattleBreed", "AkhalTekeHorseBreed", "ColumbiaSheepBreed", "BKB1PigBreed", "CanaanDogBreed", "RedPolledØstlandCattleBreed", "MixedPerijaneroXZebuCattleBreed", "HarrierDog", "GermanBlackPiedDairyCattleBreed", "FinnishLandraceSheepBreed", "ArapawaIslandPigBreed", "AlmanzorenaCattleBreed", "ChanniCattleBreed", "WaiChowPigBreed", "EnglishFoxhound", "PantaneiroCattleBreed", "JezerskosolcavskaSheepBreed", "AchhamCattleBreed", "GirgentanaGoatBreed", "SRDGoatBreed", "McnabDogBreed", "DairyShorthornCattleBreed", "MpwapwaCattleBreed", "BlackIberianCattleBreed", "GhanaShorthornCattleBreed", "YunnanHorseBreed", "StaffordshireBullTerrierDogBreed", "CriolloHorseBreed", "SteppeMeatPigBreed", "IrishHunterHorseBreed", "KameroenSheepBreed", "SinhalaCattleBreed", "ParthenaisCattleBreed", "FrenchSaddlePonyHorseBreed", "HackneyPonyHorseBreed", "MongolianHorseBreed", "DamaniSheepBreed", "BologneseDogBreed", "TungchangPigBreed", "GarranoTarpanHorseXDomesticHorseBreed", "DalesbredSheepBreed", "GurktalPigBreed", "JapaneseBrownCattleBreed", "DKPig33PigBreed", "FengjingPigBreed", "YemeniZebuCattleBreed", "JianliPigBreed", "PontremoleseCattleBreed", "WesternSudanPonyHorseBreed", "ScottishFoldCat", "KurganCattleBreed", "SussexSpanielDogBreed", "BelgianBlackPiedHolsteinCattleBreed", "AksaîBlackPiedPigBreed", "GirolandoXZebuCattleBreed", "PodengoPequenoDogBreed", "BraqueFrançaisDeGrandTailleDogBreed", "TurkishGraySteppeCattleBreed", "BrazilianPolledCattleBreed", "CanaryIslandGoatBreed", "ArgentinePoloPonyHorseBreed", "LoenbergerDogBreed", "EstonianBlackPiedCattleBreed", "CubanTrotterHorseBreed", "MunichMiniaturePigBreed", "ChittagongRedCattleBreed", "SocotraCattleBreed", "DelibozHorseBreed", "SalornCattleBreed", "CharollaisSheepBreed", "NingxiangPigBreed", "DanishLandraceSheepBreed", "CeskyFousekDogBreed", "FloresHorseBreed", "PetisoArgentinoHorseBreed", "ProvençaleGoatBreed", "KathiawariHorseBreed", "AmericanPonyHorseBreed", "PoitevinDogBreed", "PinziritaSheepBreed", "KateriniCattleBreed", "KinniyaCattleBreed", "SiniHorseBreed", "PalousePigBreed", "CanastrãoZabumbaPigBreed", "YuedongBlackPigBreed", "TyroleanHoundDogBreed", "NguniCattleBreed", "MantiqueiraXZebuCattleBreed", "Retriever", "RussianShortEaredWhitePigBreed", "BrandroodLjsselveeCattleBreed", "GackoCattleBreed", "ChihuahuaSuperbreedDogBreed", "BizanianHoundDogBreed", "JiaxingBlackPigBreed", "MacedonianBusaCattleBreed", "GrisonsStripedGoatBreed", "AngelnCattleBreed", "AtpadiMahalCattleBreed", "MasaiCowBreed", "IskarCattleBreed", "SmallMünsterländerDogBreed", "MenufiCattleBreed", "BavarianWarmbloodHorseBreed", "CampolinaHorseBreed", "GreekShorthornCattleBreed", "VaynolCattleBreed", "HamiltonstövareDogBreed", "EnglishLonghornCattleBreed", "WestAfricanPigBreed", "DexterKerryCattleBreed", "NeloreCattleBreed", "DanishWarmbloodHorseBreed", "PernaCurtaPigBreed", "MalnadGiddaCattleBreed", "InkukuCattleBreed", "IrishRedAndWhiteSetterDogBreed", "ColNoirDuValaisGoatBreed", "Coonhound", "SuperfineMerinoSheepBreed", "JackRusselTerrier", "PolledGuzeratCattleBreed", "Camborough12PigBreed", "AmericanPitBullTerrierDogBreed", "AlaskanKleeKaiDogBreed", "BraqueBelgeDogBreed", "SmoothMiniatureDachshundDogBreed", "Setter", "MalopolskiHorseBreed", "AberdeenAngusCowBreed", "FinnishYorkshirePigBreed", "WokalupXZebuCattleBreed", "MexicanHairlessDog", "DreverDog", "AlterRealHorseBreed", "HuangHuaiHaiBlackPigBreed", "HanoverianHorseBreed", "SelleFrancaisHorseBreed", "LibyanCattleBreed", "IsraeliRedCattleBreed", "RustaqiXZebuCattleBreed", "TexonCattleBreed", "SwedishArdennesHorseBreed", "BarbadosBlackbellySheepBreed", "CaucasianShepherdDogBreed", "AmericanShorthairCat", "PolishHoundDogBreed", "SychevkaCattleBreed", "BovskaSheepBreed", "DelaineMerinoSheepBreed", "PugDog", "ZambiaAngoniCattleBreed", "RedBororoCattleBreed", "IberianJabugoSpottedPigBreed", "LanYuPigBreed", "MalagueñaGoatBreed", "DraftPonySuperbreedHorseBreed", "RussoLaikaDogBreed", "GayalCattleBreed", "SchoonebekerSheepBreed", "WestSiberianLaikaDogBreed", "AvilenaBlackIberianCattleBreed", "RasaAragonesaSheepBreed", "TennesseeWalkingHorseBreed", "SwissMountainDogBreed", "CretanLowlandCattleBreed", "KustanaiHorseBreed", "BagotGoatBreed", "FHCElitePig9PigBreed", "CukurovaHorseBreed", "SuffolkHorseBreed", "GrandGriffonVendeenDogBreed", "SenepolCattleBreed", "StBernardDog", "FriesianMilkSheepBreed", "KingShepherdDogBreed", "SwissImprovedLandracePigBreed", "LaconiePigBreed", "TexasLonghornCattleBreed", "PortugueseWaterDog", "TagilCattleBreed", "BanatWhitePigBreed", "SardinianPigBreed", "CotonDeTuléarDogBreed", "NagoriCattleBreed", "DnieperCattleBreed", "CostaRicanSaddleHorseHorseBreed", "ChileanCorraleroHorseBreed", "YunnanZebuCattleBreed", "BlackHairlessPigBreed", "WelshCorgiSuperbreedDogBreed", "WitrikCattleBreed", "KromfohrländerDogBreed", "ÍPigBreed", "BlackMouthCurDogBreed", "BraSwissXZebuCattleBreed", "BankerHorseHorseBreed", "SmithfieldDogBreed", "GorynCattleBreed", "BhujGoatBreed", "FjallCattleBreed", "ThibarXZebuCattleBreed", "RussianSaddleHorseHorseBreed", "PosavinaCattleBreed", "MaremmanaCattleBreed", "HebrideanSheepBreed", "BisonBisonXSimmentalHybrid", "BoarPowerPig27PigBreed", "TahltanBearDog", "MontmorillonPigBreed", "TuyHoaHairlessPigBreed", "LivnyPigBreed", "LlaneroHorseBreed", "TsivilskPigBreed", "DongolaHorseBreed", "VogelsbergCattleBreed", "NDamaSangaCattleBreed", "BravonXZebuCattleBreed", "RanaXZebuCattleBreed", "SpanishColonialHorseHorseBreed", "NorthCountyCheviotSheepBreed", "LijiangHorseBreed", "MouraPigBreed", "TuxZillertalCattleBreed", "MerensHorseBreed", "PR1075PigBreed", "WirehairedMiniatureDachshundDogBreed", "NorthFujianBlackAndWhitePigBreed", "ErzgebirgGoatBreed", "BrazilianSportHorseHorseBreed", "KurdiCattleBreed", "SableIslandHorseHorseBreed", "EpagneulPicardDogBreed", "JamaicaBrahmanCattleBreed", "AngloKabardaHorseBreed", "WelshTerrier", "WelshMountainBadgerFacedSheepBreed", "DutchYorkshirePigBreed", "JavaneseZebuCattleBreed", "UkrainianSteppeWhitePigBreed", "SouthChinaPigBreed", "AfricanderCattleBreed", "SouthernBlackmouthCurDogBreed", "BrillenschafSheepBreed", "BamaxiangPigBreed", "HallikarCattleBreed", "ChineseImperialChInDogBreed", "LusitanoHorseBreed", "BralersXZebuCattleBreed", "HungarianWhitePigBreed", "HeidschnuckeSheepBreed", "SovietHeavyDraftHorseBreed", "PeeWeeCattleBreed", "PyreneanGoatBreed", "RomosinuanoCattleBreed", "SahelTypeSheepBreed", "DortyolCattleBreed", "AmericanCreamHorseBreed", "GreaterSwissMountainHoundDogBreed", "ManxLoaghtanSheepBreed", "HovawartDogBreed", "TurkmenZebuCattleBreed", "KabotaCattleBreed", "SaddlebackPigBreed", "LargeSpanishHoundDogBreed", "BestuzhevCattleBreed", "SterlingPigBreed", "TyrolGrayCattleBreed", "VitaVetLabMinipigPigBreed", "LourdaisCattleBreed", "Foxhound", "SenneHorseBreed", "CanadianEskimoDogBreed", "Wolf", "HormelMiniaturePigBreed", "MixedBreedGoat", "RedFriesianCattleBreed", "HarlequinCatBreed", "ZavotCattleBreed", "BündnerGoatBreed", "KappiliyanCattleBreed", "CPFPigBreed", "DingPigBreed", "MaronesaCattleBreed", "DKPig51PigBreed", "BlackWelshCowBreed", "ArapawaIslandSheepBreed", "WhippetDog", "WhiteParkCowBreed", "ArabiSheepBreed", "GreenlandDogBreed", "AngloNubianGoatBreed", "FogeraCattleBreed", "GroningenHorseBreed", "LincolnLongwoolSheepBreed", "RussianTrotterHorseBreed", "AgeroleseCattleBreed", "WhitefaceDartmoorSheepBreed", "OssabawIslandPigBreed", "CavalierKingCharlesSpaniel", "BelmontAdaptaurCattleBreed", "MountainCurDogBreed", "BlackAndTanCoonhoundDogBreed", "LacombePigBreed", "AustrianPinscherDogBreed", "OrehlaDeColherPigBreed", "MadaripurCattleBreed", "KostromaCattleBreed", "SchwarzwalderFuchseHorseBreed", "HuertanaCattleBreed", "RoughFellSheepBreed", "NkediCattleBreed", "XilingolHorseBreed", "MorochucoHorseBreed", "TukidaleSheepBreed", "BariCattleBreed", "Cotswold16PigBreed", "CatalanaChickenBreed", "PerdigueroNavarroDogBreed", "CukurovaCattleBreed", "HyperLargeWhitePigBreed", "MixedBreedSheep", "NeijiangPigBreed", "BergerDePicardDogBreed", "StandardManchesterTerrier", "SayaguesaCattleBreed", "BeardedCollieDogBreed", "BlondeDuCapBonCattleBreed", "CzechImprovedWhitePigBreed", "ChesiCattleBreed", "SiameseCat", "DonHorseBreed", "ArdennesHorseBreed", "CaliforniaRedSheepBreed", "HornDorsetSheepBreed", "CorrienteCattleBreed", "HuculHorseBreed", "UjumqinSheepBreed", "SussexCattleBreed", "YurinoCattleBreed", "BargurCattleBreed", "KaramajongCattleBreed", "BasqueBlackPiedPigBreed", "BergerDuLanguedocDogBreed", "DevonClosewoolSheepBreed", "BorghigianaPigBreed", "MinorcanCattleBreed", "TaiwanZebuCattleBreed", "ColombianCriolloHorseBreed", "PremierPigBreed", "LongyouBlackPigBreed", "JinhuaYongkangPigBreed", "PulMBorCattleBreed", "OrientalShorthairedCat", "ThaiCattleBreed", "WhiteBullTerrierDogBreed", "SandalwoodHorseBreed", "GujaratiCowBreed", "VikingHorseBreed", "GöttingenMiniaturePigBreed", "TiaMeslanPigBreed", "EurasierDogBreed", "BrazilianShorthairCatBreed", "MyotonicGoatBreed", "BalticBlackPiedCattleBreed", "RoughCollieDogBreed", "GuelmaCattleBreed", "OldenburgHorseBreed", "NorthernArdennaisHorseBreed", "GermanMuttonMerinoSheepBreed", "BritishToggenburgGoatBreed", "TrakyaHorseBreed", "ClawnPigBreed", "CanchimXZebuCattleBreed", "WhiteCáceresCattleBreed", "SumadijaPigBreed", "KisberFelverHorseBreed", "HighConformationWhitePigBreed", "KumamotoCattleBreed", "AndalusianHorseBreed", "GrandBassettGriffonVendeenDogBreed", "ThessalyCattleBreed", "HalhinGolCattleBreed", "GotlandHorseBreed", "BrownWelshCowBreed", "EastSiberianLaikaDogBreed", "SyntheticSL98PigBreed", "LoashanGoatBreed", "CubanZebuXZebuCattleBreed", "KaiDogBreed", "MytileneHorseBreed", "BraunviehCattleBreed", "LeicesterSheepBreed", "WelshCobHorseBreed", "TongSheepBreed", "TarinaCattleBreed", "HolsteinFriesianCowBreed", "PatterdaleTerrierDogBreed", "AmericanBobtailShorthairCatBreed", "ToyManchesterTerrier", "KladrubyHorseBreed", "DagestanMountainCattleBreed", "PetitGriffonBleuDeGascogneDogBreed", "TongConPigBreed", "MangalistaPigBreed", "SahiwalCattleBreed", "GelbrayXZebuCattleBreed", "WaziriSheepBreed", "PietrainPigBreed", "ThaiPonyHorseBreed", "AzawakhDogBreed", "KumauniCattleBreed", "ManagraPigBreed", "PresaCanarioDogBreed", "TreeingWalkerCoonhoundDogBreed", "LebedinCattleBreed", "MengguCattleBreed", "Dalland080PigBreed", "HollandShepherdDogBreed", "ChinampoCattleBreed", "TabapuaCattleBreed", "FrederiksborgHorseBreed", "ShanxiBlackPigBreed", "EastBulgarianHorseBreed", "TinosCattleBreed", "RepartidaGoatBreed", "AustrianSimmentalCattleBreed", "OssimiSheepBreed", "MunchkinShorthairCatBreed", "NitraHybridPigBreed", "ShetlandCattleBreed", "CupremHybridCattleBreed", "MulefootPigBreed", "ApulianPigBreed", "BoarPowerPig656PigBreed", "CanadianCuttingHorseHorseBreed", "BeauceronDogBreed", "KrishnaValleyCattleBreed", "FinnishLapphundDogBreed", "GreatPyreneeDog", "EnglishGuernseyGoatBreed", "DanubeWhitePigBreed", "DrysdaleSheepBreed", "SarnyPigBreed", "FrenchBulldog", "ThessalonianHorseBreed", "ChumbivilcasHorseBreed", "SchipperkeDog", "OldFarmCollieDogBreed", "DalesPonyHorseBreed", "VictorianBulldoggeDogBreed", "CaracuCattleBreed", "ForestMountainPigBreed", "PolledJerseyCattleBreed", "DishtyXZebuCattleBreed", "PortlandSheepBreed", "RandallLinebackCattleBreed", "DzumaliaPigBreed", "InternationalStripedHorseHorseBreed", "EstonianNativeHorseBreed", "SomaliCattleBreed", "HubeiWhitePigBreed", "BeetalGoatBreed", "SanheCattleBreed", "NorthSiberianPigBreed", "AfghanCattleBreed", "ComisanaSheepBreed", "CarolinaDogBreed", "PeneiaHorseBreed", "SerereCattleBreed", "AzerbaijanHorseBreed", "WestFinnishCattleBreed", "WielkopolskiHorseBreed", "WanzheSpottedWannanSpottedPigBreed", "BarbHorseBreed", "BambeyXZebuCattleBreed", "NorwegianFurSheepBreed", "MunchkinLonghairCatBreed", "NorthMalawiAngoniCattleBreed", "WirehairedStandardDachshundDogBreed", "PicPigBreed", "BhagnariCattleBreed", "TaiwanSmallBlackPigBreed", "SkyeTerrier", "MinbeiSpottedPigBreed", "Bodmin950PigBreed", "BlackSeaHorseHorseBreed", "CriolloCowBreed", "SiamesePigBreed", "YucaPigBreed", "BarraDoCuanzoCattleBreed", "BalkanHoundDogBreed", "JaulanCattleBreed", "KazakhCattleBreed", "AlambadiCattleBreed", "AmericanMiniatureHorseBreed", "EstonianBaconPigBreed", "PisanaCattleBreed", "RetintaExtremenaGoatBreed", "BleuDuMaineSheepBreed", "GobraCattleBreed", "IrishSetterDogBreed", "SteinschafSheepBreed", "WiltshirePigBreed", "SouthAfricanMiniatureHorseBreed", "StabyhounDogBreed", "EstonianNativeCattleBreed", "HarnaiSheepBreed", "KulaPigBreed", "BulgarianBrownCattleBreed", "DangiCattleBreed", "GuizhouHorseBreed", "WirehairedVizslaDogBreed", "MorabHorseBreed", "KoreanNativeCattleBreed", "JinzhouHorseBreed", "CanastrinhoPigBreed", "GoldenGuernseyGoatBreed", "FaeroesSheepBreed", "KanemXZebuCattleBreed", "LiangGuangSmallSpottedPigBreed", "FaeroesCattleBreed", "TuropoljePigBreed", "CormoSheepBreed", "NigerianHorseBreed", "ChejuHorseBreed", "NorthCaucasusPigBreed", "KarelianBearDog", "AlapahaBluebloodBulldogBreed", "SpanishMustangHorseBreed", "NuerCattleBreed", "BrunoDeJuraDogBreed", "WelshSheepdogBreed", "ShihTzuDog", "ArgentineFriesianCattleBreed", "AlbanianDwarfCattleBreed", "AulieAtaCattleBreed", "WestMacedonianCattleBreed", "WatusiUSACattleBreed", "SiberianCatBreed", "DanakilCattleBreed", "AmericanMustangHorseBreed", "MashonaCattleBreed", "AveligneseHorseBreed", "CanadianYorkshirePigBreed", "DanishLandraceGoatBreed", "BaldingerSpottedPigBreed", "IbageXZebuCattleBreed", "HirzaiHorseBreed", "ShekoCattleBreed", "BassetHound", "BelgianHorseBreed", "BoarPowerPigBreed", "PygmyGoatBreed", "ChickasawHorseBreed", "CholistaniCattleBreed", "BelgianSheepdog", "DanishSportPonyHorseBreed", "BerneseMountainDog", "JarmelistaCattleBreed", "NewfoundlandDog", "AshantiDwarfPigBreed", "BahiaPigBreed", "FilaBrasileiroDogBreed", "WelshPonyOfCobTypeHorseBreed", "OrientalHorseHorseBreed", "NoricHorseBreed", "MecklenburgHorseBreed", "BlackWelshMountainSheepBreed", "CanadianArcottSheepBreed", "WoodenLegGoatBreed", "KherigarhCattleBreed", "AmericanEskimoDogBreed", "CorsicanCattleBreed", "ChienDArtoisDogBreed", "CamboroughBluePigBreed", "NghiaBinhPigBreed", "SokotoGudaliCattleBreed", "VietnamesePotBelliedPigPigBreed", "SanheHorseBreed", "FabrianeseSheepBreed", "KentuckyRedBerkshirePigBreed", "GypsyVannerHorseBreed", "DanishLandracePigBreed", "YiwuHorseBreed", "YiliHorseBreed", "BatangasCattleBreed", "KerryBlueTerrier", "BelgianWarmbloodHorseBreed", "RomanianRedCattleBreed", "MoradaNovaSheepBreed", "LangHongPigBreed", "NubaMountainXZebuCattleBreed", "JavaHorseBreed", "BisaroPigBreed", "FlemishCattleBreed", "UkrainianWhiteheadedCattleBreed", "GoomsurCattleBreed", "LithuanianNativePigBreed", "HazaragieSheepBreed", "MangalargaHorseBreed", "HolgusCattleBreed", "PanamaSheepBreed", "FHCElitePig3PigBreed", "CzechMeatPigBreed", "HuazhongTwoEndBlackTongchengPigBreed", "TongaCattleBreed", "BichonsFriseDog", "AvilenaCattleBreed", "MashenPigBreed", "RedAndWhiteCattleBreed", "DurocPigBreed", "AustrianHoundDogBreed", "LorquinaCattleBreed", "VenezuelanZebuCattleBreed", "Basenji", "GalicianPonyHorseBreed", "SuiaXZebuCattleBreed", "RussianLongEaredWhitePigBreed", "GarreCattleBreed", "DanishHampshirePigBreed", "BoerboelDogBreed", "JacobSheepBreed", "GermanBlackPiedCattleBreed", "HamlinePigBreed", "JonicaGoatBreed", "MozambiqueAngoniCattleBreed", "SpanishBrownAlpineCattleBreed", "CentralRussianBlackPiedCattleBreed", "KuznetHorseBreed", "FrenchLandracePigBreed", "ChesapeakeBayRetrieverDogBreed", "BassetBleuDeGascogneDogBreed", "HequHorseBreed", "PumiDogBreed", "DartmoorPonyHorseBreed", "KrishnagariCattleBreed", "FannongSpottedPigBreed", "BentheimerLandschafSheepBreed", "GrandAngloFrançaisDogBreed", "WagyuCattleBreed", "DølafeCattleBreed", "AbyssinianHorseBreed", "PollMerinoSheepBreed", "BelmontRedCattleBreed", "DalaSheepBreed", "PressaMallorquinDogBreed", "SpiegelSheepBreed", "PabnaXZebuCattleBreed", "ShkodraPigBreed", "BeagleRoughDogBreed", "GelderlandHorseBreed", "KleenLeenRedPigBreed", "BavarianMountainHoundDogBreed", "SerranaGoatBreed", "RomanovSheepBreed", "CutchiCattleBreed", "IberianPigBreed", "EgyptianMauCat", "MoiCattleBreed", "SantaCruzXZebuCattleBreed", "MorenasDelNoroesteCattleBreed", "MiPigBreed", "DanishJerseyCattleBreed", "HuchuanMountainPigBreed", "IcelandicPigBreed", "AmerifaxcattleBreed", "Line21PigBreed", "AlbanianNativePigBreed", "WelshWalkingHorseBreed", "NoordhollanderSheepBreed", "BarbadoSheepBreed", "ChiosSheepBreed", "NordlandHorseBreed", "PhilippineNativeJalajalaPigBreed", "MiniaturePoodleDogBreed", "NegraSerranaGoatBreed", "SantaCruzSheepBreed", "RougeDeLQuestSheepBreed", "RedBrangusXZebuCattleBreed", "ChamoisOfTheAlpsGoatBreed", "AlurCattleBreed", "AlentejoHerderDogBreed", "SalukiDog", "RongchangPigBreed", "KangalDogBreed", "ItalianBrownCattleBreed", "HallingdalCattleBreed", "SkyrosHorseBreed", "BurwashCattleBreed", "BurmesePigBreed", "SombaCattleBreed", "HerefordCattleSuperbreed", "RaboLargoSheepBreed", "IsraeliHorseBreed", "SharabiCattleBreed", "ShahutouPigBreed", "CaneCorsoDogBreed", "DulmenPonyHorseBreed", "BoarPowerPig72PigBreed", "WhiteShepherdDogBreed", "PersianArabHorseBreed", "TosaInuDogBreed", "WhiteFulaniCattleBreed", "CotswoldSheepBreed", "HuangHuaiHaiBlackShenxianPigBreed", "FRSCattleBreed", "AiredaleTerrier", "Camborough22PigBreed", "GreekSteppeCattleBreed", "GansuAlpineFineWoolSheepBreed", "TelemarkCattleBreed", "ToupouriCattleBreed", "Bloodhound", "SwedishLandraceGoatBreed", "CotswoldPlatinumPigBreed", "CirnecoDellEtnaDogBreed", "FinnishSpitzDog", "MauritiusCreoleCattleBreed", "CaldelanaCattleBreed", "RiopardenzeXZebuCattleBreed", "OregonRexCatBreed", "AzaouakCattleBreed", "BaznaPigBreed", "BoarPowerPig565PigBreed", "BosTaurusXBisonBisonHybridCowBreed", "CorsicanHorseBreed", "SmallSpanishHoundDogBreed", "SouthernTswanaCattleBreed", "TSSH1XZebuCattleBreed", "EstonianRedCattleBreed", "GuteSheepBreed", "KilaraCattleBreed", "KuriCattleBreed", "DanishBroholmerDogBreed", "SarplaninacDogBreed", "Pointer", "FrenchAlpineGoatBreed", "SlovakianBlackPiedPigBreed", "AmericanEskimoMiniatureDogBreed", "IncaHairlessDogBreed", "RX3CattleBreed", "LiaoningBlackPigBreed", "KarakacanHorseBreed", "AmericanBashkirCurlyHorseBreed", "DeogirCattleBreed", "CubanPintoHorseBreed", "MontanaPigBreed", "ChakouyiHorseBreed", "GalicianBlondCattleBreed", "SoaySheepBreed", "NorthFinncattleCattleBreed", "GlanDonnersbergCattleBreed", "DaeraDinPanahGoatBreed", "WuzhishanPigBreed", "AmericanEskimoStandardDogBreed", "KishuDogBreed", "BorzoiDog", "GriffonNivernaisDogBreed", "LuingCowBreed", "MeraukeCattleBreed", "KM1PigBreed", "NorlinePigBreed", "OldFormatDachsundDogBreed", "LimianaCattleBreed", "LithuanianHeavyDraftHorseBreed", "VitoriaPigBreed", "TreeingTennesseeBrindleDogBreed", "IberianExtremaduraRedPigBreed", "RijnlamASheepBreed", "CzechColdbloodHorseBreed", "NimariCattleBreed", "MezohegyesSportHorseHorseBreed", "TurinoCattleBreed", "PasoFinoHorseBreed", "CentralRussianPigBreed", "PantelleriaCattleBreed", "AmericanWalkingPonyHorseBreed", "BurmeseXZebuCattleBreed", "SouthYunnanShortEaredPigBreed", "BritishRidingPonyHorseBreed", "WelshPigBreed", "ThaiRidgebackDogBreed", "KuvaszDog", "AweilDinkaCattleBreed", "BelorusBlackPiedPigBreed", "RomanianMeatPigPigBreed", "MalakanHorseBreed", "JapanesePollCattleBreed", "LabradorRetrieverDogBreed", "WalerHorseBreed", "VietnameseYorkshirePigBreed", "MaineCoonCat", "GhoriPigBreed", "KolubaraCattleBreed", "BelarusRedCattleBreed", "HainanPigBreed", "CanastrãoCapitãoChicoPigBreed", "AndeanHorseBreed", "IomudHorseBreed", "BillyDogBreed", "LaVelasquezCattleBreed", "PomeranianCoarsewoolSheepBreed", "JiningGrayGoatBreed", "ShillukCattleBreed", "SingapuraCat", "GermanLandraceBPigBreed", "BretonHorseBreed", "NewfoundlandSheepBreed", "BeiroaCattleBreed", "ShendiCattleBreed", "YacumentoCattleBreed", "TushinHorseBreed", "EpagneulBleuDePicardieDogBreed", "ArgentineCriolloHorseBreed", "LeicomaPigBreed", "MunsterLanderPointerDogBreed", "SpanishGreyhoundDogBreed", "MixedBreedCat", "AppenzellerDogBreed", "BrecknockHillCheviotSheepBreed", "RoyalCanadianMountedPoliceHorseHorseBreed", "SouthChinaBlackPigBreed", "FrenchCobHorseBreed", "PenshirePigBreed", "BaltaretPigBreed", "FinnishLandracePigBreed", "ShuwaCattleBreed", "DomesticLeopardCat", "GloucesterOldSpotPigBreed", "AlgarviaGoatBreed", "LimCattleBreed", "AngoraGoatBreed", "LatvianHorseBreed", "NewZealandRabbitBreed", "RamgarhiCattleBreed", "LakelandTerrier", "SaddlebredHorseSuperbreedHorseBreed", "PenbukPigBreed", "ByelorussianHarnessHorseBreed", "BraunesBergschafSheepBreed", "BatakHorseBreed", "VerinesaCattleBreed", "PretaCattleBreed", "LutaiWhitePigBreed", "TuyHoaCattleBreed", "WeleraPonyHorseBreed", "BloodhoundStHubertDogBreed", "VictoriaXZebuCattleBreed", "SumbawaHorseBreed", "RomneySheepBreed", "YiliWhitePigBreed", "MakaweliCattleBreed", "ShorthairCatBreed", "AmericanAlbinoHorseBreed", "WestFrenchWhitePigBreed", "IcelandicCattleBreed", "PicLinePig26PigBreed", "AmericanFoxhound", "BragancaCattleBreed", "MalteseDog", "PolskiOwczarekNizinnyDogBreed", "NigerianPigBreed", "IngessanaCattleBreed", "ScottishTerrier", "MiniatureHerefordCattleBreed", "AndalusianBlondCattleBreed", "DengchuanCattleBreed", "Beagle", "ClevelandBayHorseBreed", "MoraRomagnolaPigBreed", "SardinianSheepBreed", "BudyonnyHorseBreed", "CanastrãoJunqueiraPigBreed", "VianesaCattleBreed", "IloiloCattleBreed", "CaucasianCattleBreed", "GermanLandracePigBreed", "HarianaCattleBreed", "MalawiZebuCattleBreed", "FieldSpanielDogBreed", "XiangPigBreed", "BerrendasCattleBreed", "TimorHorseBreed", "RygjaSheepBreed", "BanEiHorseBreed", "SalernoHorseBreed", "AbyssinianHighlandZebuCattleBreed", "MadagascarZebuCattleBreed", "OberhasliGoatBreed", "CanikHorseBreed", "WuyiBlackPigBreed", "MoscowLonghairedToyTerrierDogBreed", "KuchinoshimaCattleBreed", "JijjigaZebuCattleBreed", "MasaiSheepBreed", "SwedishLandracePigBreed", "PolwarthSheepBreed", "ExoticShorthairedCat", "ShanHorseBreed", "TreeingFeistDogBreed", "RomagnolaCattleBreed", "MubanPigBreed", "PajunaCattleBreed", "NorbottenspetsDogBreed", "LugwareCattleBreed", "PulawyPigBreed", "StumpyTailCattleDogBreed", "ChartreuxCat", "ZaobeiCattleBreed", "CambodianCattleBreed", "AustralianGoatBreed", "WelshMountainSheepBreed", "RottweilerDog", "MegrelHorseBreed", "TaihuPigBreed", "ThillariCattleBreed", "PeloponnesusCattleBreed", "DLSSheepBreed", "ManapariCattleBreed", "WhiteSuffolkSheepBreed", "SanjiangWhitePigBreed", "PiauCarunchoPiauPigBreed", "MacauPigBreed", "NgandaCattleBreed", "BariaVietnamMadagascarCattleBreed", "PintoHorseBreed", "FrenchLargeWhitePigBreed", "MisakiHorseBreed", "CayuseHorseBreed", "SicilianPigBreed", "TaoyuanPigBreed", "BimalCattleBreed", "BrandenburgHorseBreed", "AbtenauerHorseBreed", "MediumWoolMerinoSheepBreed", "BengalCatBreed", "FrenchTrotterHorseBreed", "DrakensbergerCattleBreed", "JamaicaRedXZebuCattleBreed", "KraskyOvcarDogBreed", "PlottHound", "LucanianCattleBreed", "Affenpinscher", "BoarPowerPig828PigBreed", "SeferihisarCattleBreed", "CaliforniaVariegatedMutantSheepBreed", "ArabianHorseBreed", "GreaterSwissMountainDogBreed", "SuffolkCattleBreed", "ZhongweiGoatBreed", "LlanwenogSheepBreed", "CosteñoConCuernosCattleBreed", "SolognoteSheepBreed", "BrownAtlasCattleBreed", "TeddyRooseveltTerrierDogBreed", "BriquetBassetGriffonVendeenDogBreed", "PolledGirCattleBreed", "SoftCoatedWheatenTerrier", "DaweiziPigBreed", "HarzRedCattleBreed", "PicLinePig24PigBreed", "DorsetDownSheepBreed", "OrientalLonghairCatBreed", "KyiLeoDogBreed", "BakwiriCattleBreed", "OxfordSandyBlockPigBreed", "KamoriGoatBreed", "PieRougeDesPlainesCattleBreed", "DermantsiPiedPigBreed", "RasNLansaPigBreed", "PitmanMooreMiniaturePigBreed", "KnabstrupHorseBreed", "BlackRussianTerrierDogBreed", "ChryakPICPigBreed", "SiriZebuCattleBreed", "InobutaInterSpeciesHybridPigBreed", "BachaurCattleBreed", "BosTaurusTaurusSubspeciesDomesticEuropeanCowBreed", "SouthChinaZebuCattleBreed", "ManipuriHorseBreed", "BoerGoatBreed", "DeutschesBlaukoepfigesFleischschafSheepBreed", "BergamascoDogBreed", "AngloArabHorseBreed", "LargeBlackPigBreed", "BrabantHorseBreed", "JavaneseOngoleCattleBreed", "IrishDraftHorseBreed", "JapaneseSpitzDogBreed", "GhanaSangaXZebuCattleBreed", "EstonianDraftHorseBreed", "DeutscheBrackeDogBreed", "DrentsHeideschaapSheepBreed", "MiamiPigBreed", "HerensCattleBreed", "KenranCattleBreed", "HalfSaddlebredHorseBreed", "HungahybPigBreed", "EntlebucherDogBreed", "LocalIndianDairyXZebuCattleBreed", "AlaskanMalamute", "LohaniCattleBreed", "BeltedWelshCattleBreed", "SomaliPonyHorseBreed", "ShropshireTerrierDogBreed", "DornaCattleBreed", "YucatanMinaturePigBreed", "AureEtSaintGironsCattleBreed", "AbondanceCattleBreed", "WurttembergHorseBreed", "FuanSpottedPigBreed", "JämthundDogBreed", "KravarskyCattleBreed", "EpirusCattleBreed", "AsturianMountainCattleBreed", "HaBacPigBreed", "PerdigueroDeBurgosDogBreed", "Hound", "RomanianSteppeCattleBreed", "YakutHorseBreed", "LatvianBrownCattleBreed", "WaziriHorseBreed", "HanjiangBlackPigBreed", "BelgianWhiteAndRedCattleBreed", "GreaterCaucasusCattleBreed", "MaremmanaPigBreed", "BrandlbrackeDogBreed", "MazuryCattleBreed", "BoykinSpanielDogBreed", "BrahornXZebuCattleBreed", "EgyptianCattleBreed", "PottokTarpanHorseXDomesticHorseBreed", "BoarPowerPig929PigBreed", "SorraiaHorseBreed", "HeiheHorseBreed", "FriuliBlackPigBreed", "FaeroesIslandHorseHorseBreed", "RegusCattleBreed", "EnglishToySpaniel", "ClydesdaleHorseBreed", "OldFormatSheepBreed", "CalabrianPigBreed", "MaremmaSheepdogsDogBreed", "RedHampracePigBreed", "BoranCattleBreed", "SwissEdelschweinPigBreed", "NadbuzanskaPigBreed", "AppaloosaHorseBreed", "HailumPigBreed", "BanjaraGreyhoundDogBreed", "NationalSpottedSaddleHorseHorseBreed", "NGaoundereCattleBreed", "GermanColoredGoatBreed", "BearnaisCattleBreed", "AkbashDogBreed", "EnglishBulldogBreed", "GuadeloupeCreolePigBreed", "OldGermanShepherdDogBreed", "KaokoveldCattleBreed", "SenegusCattleBreed", "LapermLonghairCatBreed", "RackingHorseHorseBreed", "SimmentalCowBreed", "GanzhouWhitePigBreed", "ChineseMongolianHorseBreed", "EastFriesianOldTypeHorseBreed", "JapaneseBobtailCat", "KwaiPigBreed", "WarmbloodHorseBreed", "AlbeseCattleBreed", "GuanzhongHorseBreed", "KelePigBreed", "ParmensePigBreed", "ChowChow", "NormandPigBreed", "MishimaCattleBreed", "ComebackSheepBreed", "BergamascaSheepBreed", "BlackForrestCattleBreed", "PrewakwaCattleBreed", "HungarianPiedCattleBreed", "NachiGoatBreed", "UkrainianSaddleHorseHorseBreed", "ThailandFightingZebuCattleBreed", "ElegantWarmbloodHorseBreed", "BalineseCat", "TibetanTerrier", "AustralianLowlineCattleBreed", "PetitGasconSaintongeoisDogBreed", "IstobenCattleBreed", "AdenZebuCattleBreed", "JotkoXZebuCattleBreed", "AracenaCattleBreed", "BondSheepBreed", "PolypaySheepBreed", "OldEnglishSheepdog", "BoarPowerPig545PigBreed", "BlancaAndaluzaGoatBreed", "DeoniCattleBreed", "BluefacedLeicesterSheepBreed", "BrittanySpanielDogBreed", "AppenzellGoatBreed", "CairnTerrier", "ApennineSheepBreed", "IbizanHound", "CurlyCoatedRetrieverDogBreed", "SudanCountryBredHorseBreed", "AleppoCattleBreed", "LongAndShortCoatChihuahuaDogBreed", "SouthGermanColdbloodHorseBreed", "BaladicattleCattleBreed", "MoyleHorseBreed", "IcelandicSheepBreed", "BrahmousinXZebuCattleBreed", "FratiCattleBreed", "XinjinPigBreed", "RhaetianGrayCattleBreed", "GaunlingCattleBreed", "HaysConverterCowBreed", "JinhongHorseBreed", "SardinianPonyHorseBreed", "LichuanHorseBreed", "GanzhongnanSpottedPigBreed", "StandardSchnauzerDogBreed", "HainanWenchangPigBreed", "WestphalianHorseBreed", "CãoDaSerraDeAiresDogBreed", "RhodesianRidgebackDog", "CamargueHorseBreed", "CinisaraCattleBreed", "SabuesosEspañolesDogBreed", "MoruchaCattleBreed", "HampenPigBreed", "QuasahXZebuCattleBreed", "BlackAngusCowBreed", "LatiSheepBreed", "SamoyedDog", "FHCElitePig1PigBreed", "ConnorPrairiePigBreed", "EnglishCockerSpanielDogBreed", "RockAlpineGoatBreed", "CzechPiedCattleBreed", "SanClementeGoatBreed", "CubanCriolloXZebuCattleBreed", "LatvianWhitePigBreed", "ShibaInuDogBreed", "KandahariCattleBreed", "ClumberSpanielDogBreed", "FloridaCrackerPineywoodsCattleBreed", "GermanBrownCattleBreed", "Slovhyb1PigBreed", "PolandChinaPigBreed", "TainoXZebuCattleBreed", "GloucesterCattleBreed", "KajliSheepBreed", "PiquiraPonyHorseBreed", "GelbveihCowBreed", "ChineseFooDogBreed", "GasconyPigBreed", "RomedaleSheepBreed", "TinimaCattleBreed", "ChincoteaguePonyHorseBreed", "CanadianHorseBreed", "DialiCattleBreed", "SakhalinWhitePigBreed", "BoxerDog", "MongallaCattleBreed", "PelónPigBreed", "PechoraHorseBreed", "ChienFrançaisBlancEtNoirDogBreed", "NeopolitanMastiffDogBreed", "RetintaCattleBreed", "EleiaHorseBreed", "ShengxianSpottedPigBreed", "KenyaZebuCattleBreed", "PintabianHorseBreed", "PetitBrabaçonDogBreed", "SlovakianPiedCattleBreed", "MexicanWattledPigBreed", "Collie", "KerryHillSheepBreed", "BarotseCattleBreed", "BhutiaHorseBreed", "GermanWirehairedPointerDogBreed", "MorangCattleBreed", "RussianLargeWhitePigBreed", "ChimaineCattleBreed", "LuzeinSheepBreed", "FoutaHorseBreed", "RedGallowayCattleBreed", "TransylvanianPinzguaCattleBreed", "FroxfieldPygmyPigBreed", "AyrshireCowBreed", "MoravaPigBreed", "HampshireDownSheepBreed", "BambawaCattleBreed", "AustralianWhiteCattleBreed", "SudaneseFulaniCattleBreed", "WelshHillSpeckledFaceSheepBreed", "SchillerHoundDogBreed", "AlbèresCattlebreed", "RedboneCoonhoundDogBreed", "BootedGoatBreed", "HungarianSportHorseHorseBreed", "SPMPigBreed", "ExmoorPonyHorseBreed", "PinzgauerCowBreed", "WiltshireHornSheepBreed", ] } name_for_cid[7481] = "BreedRegistry" cid_concepts[7481] = { "DCM": [ "CanadianBorderCollieAssociation", "UnitedKennelClub", "AnimalResearchFoundation", "UnitedAllBreedRegistry", "CanadianLivestockRecordsAssociation", "CanadianKennelClub", "UniversalKennelClubInternational", "AmericanPurebredRegistry", "InternationalProgressiveDogBreedersAlliance", "AmericanCanineAssociation", "FederationOfInternationalCanines", "AnimalRegistryUnlimited", "NorthAmericanPurebredDogRegistry", "AmericanRareBreedAssociation", "NationalKennelClub", "CanineFederationOfCanada", "WorldKennelClub", "WorkingCanineAssociationOfCanada", "AmericaPetRegistryInc", "DogRegistryOfAmerica", "AmericaKennelClub", "ContinentalKennelClub", "WorldWideKennelClub", ] } name_for_cid[7482] = "DXAnatomyImagedforAnimal" cid_concepts[7482] = { "SCT": [ "FetlockOfHindlimb", "Sacrum", "ThoracoLumbarSpine", "NasalSinus", "Metatarsus", "NavicularOfHindfoot", "CalcanealTubercle", "Humerus", "FetlockOfForelimb", "Esophagus", "Bladder", "AtlantalAxialJoint", "Mandible", "PasternOfHindfoot", "Wing", "Metacarpus", "MaxillaryIncisorTeeth", "UrinaryTract", "MandibularDentalArch", "Pelvis", "Carpus", "EntireBody", "ChestAndAbdomen", "RadiusAndUlna", "LumbarSpine", "Abdomen", "Digit", "Hindfoot", "MaxillaryDentalArch", "TibiaAndFibula", "PasternOfForefoot", "Forefoot", "Tarsus", "UpperGastroIntestinalTract", "Shoulder", "Stiffle", "ElbowJoint", "Colon", "AllLegs", "OrbitalStructure", "ThoracicSpine", "HipJoint", "Chest", "CoccygealVertrebrae", "MandibularIncisorTeeth", "Femur", "FrontalSinus", "CervicoThoracicSpine", "Skull", "Urethra", "Patella", "AtlantoOccipitalJoint", "LumboSacralSpine", "NavicularOfForefoot", "CervicalSpine", ], "UMLS": ["DistalPhalanx"], } name_for_cid[7483] = "CommonAnatomicRegionsforAnimal" cid_concepts[7483] = { "SCT": [ "FetlockOfHindlimb", "Sacrum", "ThoracoLumbarSpine", "NasalSinus", "Metatarsus", "NavicularOfHindfoot", "CalcanealTubercle", "Humerus", "FetlockOfForelimb", "Esophagus", "Bladder", "AtlantalAxialJoint", "Mandible", "PasternOfHindfoot", "Wing", "Metacarpus", "MaxillaryIncisorTeeth", "UrinaryTract", "MandibularDentalArch", "Pelvis", "Carpus", "EntireBody", "ChestAndAbdomen", "RadiusAndUlna", "LumbarSpine", "Abdomen", "Digit", "Hindfoot", "MaxillaryDentalArch", "TibiaAndFibula", "PasternOfForefoot", "Forefoot", "Tarsus", "UpperGastroIntestinalTract", "Shoulder", "Stiffle", "ElbowJoint", "Colon", "AllLegs", "OrbitalStructure", "ThoracicSpine", "HipJoint", "Chest", "CoccygealVertrebrae", "MandibularIncisorTeeth", "Femur", "FrontalSinus", "CervicoThoracicSpine", "Skull", "Urethra", "Patella", "AtlantoOccipitalJoint", "LumboSacralSpine", "NavicularOfForefoot", "CervicalSpine", ], "UMLS": ["DistalPhalanx"], } name_for_cid[7484] = "DXViewforAnimal" cid_concepts[7484] = { "DCM": ["Caudal10DegreeDistalCranioproximalOblique"], "SCT": [ "Rostrocaudal", "Dorsal40DegreeLateralPlantaromedialOblique", "Dorsal45DegreeMedialPlantarolateralOblique", "Right20DegreeDorsalLeftVentralOblique", "DorsorostralVentrocaudalOblique", "Lateral45DegDorsal50DegProximalMedioplantarodistalObliq", "DorsoVentral", "Dorsal45DegreeMedialPalmarolateral", "Ventral30DegreeLeftDorsalRightOblique", "LeftVentralRightDorsalOblique", "VentrorostralDorsocaudalOblique", "RightDorsalLeftVentralOblique", "PalmaroproximalDorsodistalOblique", "CaudodistalCranioproximalOblique", "Dorsopalmar", "LeftRightLateral", "Left45DegreeDorsalRightVentralOblique", "Dorsal20DegreeRostralVentrocaudalOblique", "Left20DegreeRostralRightCaudalOblique", "Left20DegreeVentralRightDorsalOblique", "Lateral45DegDorsal50DegProximalMediopalmarodistalOblique", "Dorsal45DegreeLateralPlantaromedialOblique", "Dorsal60DegreeLateralPlantaromedialOblique", "RostroventralCaudodorsal", "VentralLeftDorsalRightOblique", "Dorsal40DegreeMedialPlantarolateralOblique", "Right45DegreeDorsalLeftVentralOblique", "ProximoDistal", "Plantar60DegreeLateralDorsomedialOblique", "Right30DegreeCaudalLeftRostralOblique", "Right20DegreeVentralLeftDorsalOblique", "PlantarolateralDorsomedialOblique", "Dorsal45DegreeLateralPalmaromedialOblique", "PalmaromedialDorsolateral", "RostrodorsalCaudoventralOblique", "DorsomedialPalmarolateral", "Dorsal35DegreeLateralPalmaromedialOblique", "Ventral20DegreeRostralDorsocaudalOblique", "Rostral20DegreeDorsalCaudoventralOblique", "DorsolateralPalmaromedialOblique", "Dorsal65DegreeProximalPalmarodistalOblique", "Dorsal35DegreeMedialPalmarolateralOblique", "RightCaudalLeftRostralOblique", "Dorsal60DegreeMedialPalmarolateralOblique", "Ventral30DegreeRightDorsalLeftOblique", "Dorsal40DegreeMedialPalmarolateralOblique", "LeftDorsalRightVentralOblique", "Dorsal35DegreeLateralPlantaromedialOblique", "VentralRightDorsalLeftOblique", "LaterodorsoproximalMediopalmarodistalOblique", "VentroDorsal", "DorsoproximalPlantarodistalOblique", "PlantaroproximalDorsodistalOblique", "DorsomedialPlantarolateralOblique", "Caudocranial", "Left30DegreeCaudalRightRostralOblique", "Right20DegreeRostralLeftCaudalOblique", "RightRostralLeftCaudalOblique", "LeftCaudalRightRostralOblique", "Dorsal60DegreeLateralPalmaromedialOblique", "Left20DegreeDorsalRightVentralOblique", "DorsoproximalPalmarodistalOblique", "RightLeftLateral", "Dorsal60DegreeMedialPlantarolateralOblique", "Lateromedial", "Plantar75DegreeProximalDorsodistalOblique", "Rostral30DegreeVentralCaudodorsal", "Dorsal35DegreeMedialPlantarolateralOblique", "Dorsal65DegreeProximalPlantarodistalOblique", "Dorsoplantar", "LeftRostralRightCaudalOblique", "LaterodorsoproximalMedioplantarodistalOblique", "Right45DegreeVentralLeftDorsalOblique", "Left45DegreeVentralRightDorsalOblique", "MedioLateralProjection", "Palmar45DegreeMedialDorsolateral", "DorsolateralPlantaromedialOblique", "Palmar75DegreeProximalDorsodistalOblique", "RightVentralLeftDorsalOblique", ], } name_for_cid[7486] = "MixedBreed" cid_concepts[7486] = { "SCT": [ "MixedBreedGoat", "MixedBreedCattle", "MixedBreedChicken", "MixedBreedDog", "MixedBreedCat", "MixedBreedPig", "MixedBreedHorse", "MixedBreedSheep", ] } name_for_cid[7490] = "ResearchAnimalSourceRegistry" cid_concepts[7490] = {"DCM": ["ILCR"]} name_for_cid[7500] = "NeighbourhoodGreyToneDifferenceBasedFeature" cid_concepts[7500] = { "IBSI": [ "ContrastOfNGTDM", "ComplexityOfNGTDM", "BusynessOfNGTDM", "CoarsenessOfNGTDM", "StrengthOfNGTDM", ] } name_for_cid[7501] = "NeighbouringGreyLevelDependenceBasedFeature" cid_concepts[7501] = { "IBSI": [ "DependenceCountEntropy", "NormalizedGreyLevelNonUniformityOfNGLDM", "GreyLevelVarianceOfNGLDM", "LowDependenceLowGreyLevelEmphasis", "DependenceCountNonUniformityNormalized", "GreyLevelNonUniformityOfNGLDM", "DependenceCountPercentage", "LowDependenceHighGreyLevelEmphasis", "HighDependenceEmphasis", "DependenceCountVariance", "DependenceCountEnergy", "HighGreyLevelCountEmphasis", "HighDependenceLowGreyLevelEmphasis", "DependenceCountNonUniformity", "LowDependenceEmphasis", "HighDependenceHighGreyLevelEmphasis", "LowGreyLevelCountEmphasis", ] } name_for_cid[7550] = "AngleMeasurement" cid_concepts[7550] = {"DCM": ["AcetabularAngle"], "SCT": ["CobbAngle"]} name_for_cid[7551] = "GenericPurposeofReferencetoImagesandCoordinatesinMeasurement" cid_concepts[7551] = { "DCM": ["ApproximateSpatialLocation", "Vector", "SourceOfMeasurement", "ArmOfAngle"] } name_for_cid[7552] = "GenericPurposeofReferencetoImagesinMeasurement" cid_concepts[7552] = {"DCM": ["SourceOfMeasurement"]} name_for_cid[7553] = "GenericPurposeofReferencetoCoordinatesinMeasurement" cid_concepts[7553] = {"DCM": ["ApproximateSpatialLocation", "Vector", "ArmOfAngle"]} name_for_cid[7600] = "LymphNodeAnatomicSite" cid_concepts[7600] = { "FMA": ["SubiliacLymphNode", "SupramammaryLymphNode"], "SCT": [ "DeepLateralCervicalLymphNode", "AnteriorAuricularLymphNode", "IntermediateExternalIliacLymphNode", "LymphNodeOfHead", "InferiorInguinalLymphNode", "AnteriorCervicalLymphNode", "IntrapulmonaryLymphNode", "RetropharyngealLymphNode", "PectoralAxillaryLymphNode", "SuperiorGlutealLymphNode", "ParasternalLymphNode", "LymphNode", "CommonDuctLymphNode", "MedialLacunarLymphNode", "SegmentalLymphNodeOfTheLung", "BuccinatorLymphNode", "LateralPericardialLymphNode", "HighestMediastinalLymphNode", "SubscapularAxillaryLymphNode", "PrefemoralLymphNode", "ExtrapulmonaryLymphNodeOfLung", "ParotidLymphNode", "LowerParatrachealIncludingAzygousLymphNode", "DelphianLymphNode", "PrececalLymphNode", "SuperiorRectalLymphNode", "SuperficialParotidLymphNode", "HypogastricLymphNode", "IliacLymphNode", "LymphNodeOfMesentery", "EpitrochlearLymphNode", "AxillaryLymphNode", "JuxtaintestinalLymphNode", "ParatrachealLymphNode", "DeepAnteriorCervicalLymphNode", "LumbarLymphNode", "UpperParatrachealLymphNode", "RegionalLymphNode", "PyloricLymphNode", "LacunarLymphNode", "PosteriorTibialLymphNode", "PancreaticosplenicLymphNode", "DeepParotidLymphNode", "PelvicLymphNode", "LymphNodeOfAortopulmonaryWindow", "CeliacLymphNode", "LateralJugularLymphNode", "PosteriorMediastinalLymphNode", "LymphNodeOfLesserCurvatureOfStomach", "MiddleDeepCervicalLymphNode", "InfraclavicularLymphNode", "SupraclavicularLymphNode", "SubcarinalLymphNode", "ParametrialLymphNode", "ParavesicularLymphNode", "SuperficialPoplitealLymphNode", "PrevesicularLymphNode", "GlutealLymphNode", "SacralLymphNode", "RetrotrachealLymphNode", "RetroperitonealLymphNode", "DeepCervicalLymphNode", "DeepPoplitealLymphNode", "SuperiorMediastinalLymphNode", "VesicularLymphNode", "IntermediateCommonIliacLymphNode", "SplenicLymphNode", "OccipitalLymphNode", "InferiorAuricularLymphNode", "NasolabialLymphNode", "RenalHilarLymphNode", "HilarLymphNode", "SuperficialInguinalLymphNode", "UterineParacervicalLymphNode", "InterlobarLymphNodeOfTheLung", "LymphNodeOfStomach", "LateralExternalIliacLymphNode", "EpigastricLymphNode", "LymphNodeOfGreaterCurvatureOfStomach", "PoplitealLymphNode", "IntramammaryLymphNode", "SubaorticCommonIliacLymphNode", "HepaticLymphNode", "SuperficialIntraparotidLymphNode", "PresymphysialLymphNode", "IntercostalLymphNode", "LymphNodeOfAorticArch", "PararectalLymphNode", "PeripancreaticLymphNode", "TracheobronchialLymphNodeLocatedNearCarina", "AorticLymphNode", "SuperficialLymphNode", "TibialLymphNode", "CentralAxillaryLymphNode", "SuperiorMesentericLymphNode", "IntraglandularParotidLymphNode", "SigmoidLymphNode", "PostvesicularLymphNode", "MidcolicLymphNode", "PosteriorTriangleCervicalLymphNode", "InferiorGlutealLymphNode", "EsophagealLymphNode", "TracheobronchialLymphNode", "CardiophrenicAngleLymphNode", "LobarLymphNodeOfTheLung", "SubclavianLymphNode", "SuperiorMedialInguinalLymphNode", "PancreaticLymphNode", "CervicalLymphNode", "IleocolicLymphNode", "LateralCommonIliacLymphNode", "SuperiorTracheobronchialLymphNode", "UpperDeepCervicalLymphNode", "RetropyloricLymphNode", "SuperficialCervicalLymphNode", "MiddleJugularLymphNode", "LymphNodeOfEpiploicForamen", "AppendicularLymphNode", "LateralVesicularLymphNode", "PretrachealLymphNode", "LymphNodeOfLimb", "RetrocecalLymphNode", "AnteriorMediastinalLymphNode", "AbdominalLymphNode", "PromontoryCommonIliacLymphNode", "CysticLymphNode", "SubmentalLymphNode", "MedialExternalIliacLymphNode", "LowerJugularLymphNode", "PancreaticoduodenalLymphNode", "MandibularLymphNode", "PrepericardialLymphNode", "MediastinalLymphNode", "LowerLimbLymphNode", "LungAndTracheobronchialLymphNodes", "PrevascularRetrotrachealLymphNode", "DiaphragmaticLymphNode", "InferiorMesentericLymphNode", "FemaleGenitalLymphNode", "LymphNodeOfThePulmonaryLigament", "PostauricularLymphNode", "LymphNodeRingOfCardiaOfStomach", "ParavaginalLymphNode", "AxillaryVeinLymphNode", "DeepInguinalLymphNode", "DeepIntraparotidLymphNode", "UpperLimbLymphNode", "IntestinalLymphNode", "SubpyloricLymphNode", "InferiorPancreaticoduodenalLymphNode", "LymphNodeOfTrunk", "ParaesophagealLymphNodeBelowCarina", "ParaAorticLymphNodeOfTheAnteriorMediastinum", "PerigastricLymphNode", "UpperJugularLymphNode", "MedialCommonIliacLymphNode", "AnteriorTibialLymphNode", "InguinalLymphNode", "LateralCervicalLymphNode", "InterpectoralLymphNode", "LowerDeepCervicalLymphNode", "LymphNodeOfThorax", "ExternalMammaryLymphNode", "DeepLymphNode", "HemolymphNode", "MedianRetropharyngealLymphNode", "ColicLymphNode", "FacialLymphNode", "InteriliacLymphNode", "PrelaryngealLymphNode", "PosteriorAuricularLymphNode", "SubsegmentalLymphNodeOfTheLung", "SuperiorPancreaticoduodenalLymphNode", "ApicalAxillaryLymphNode", "FibularLymphNode", "SuprapyloricLymphNode", "InnominateLymphNode", "SuperficialLateralCervicalLymphNode", "PrevertebralLymphNode", "MesentericArteryLymphNode", "SuperficialAnteriorCervicalLymphNode", "LateralRetropharyngealLymphNode", "SuperiorPancreaticLymphNode", "SubmandibularLymphNode", "ExternalIliacLymphNode", "ParamammaryLymphNode", "ObturatorLymphNode", "SuperiorLateralInguinalLymphNode", "MastoidLymphNode", "JugularLymphNode", "LymphNodeOfHeadAndNeck", "GastroOmentalLymphNode", "LateralAxillaryLymphNode", "CubitalLymphNode", "ScaleneLymphNode", "InferiorPancreaticLymphNode", ], } name_for_cid[7601] = "HeadandNeckCancerAnatomicSite" cid_concepts[7601] = { "FMA": ["TorusOfPharyngotympanicTube"], "SCT": [ "PharyngealTonsil", "ParanasalSinus", "Oropharynx", "FloorOfMouth", "BuccalMucosa", "Supraglottis", "BaseOfTongue", "Lip", "Tongue", "PharyngealRecess", "TonsilAndAdenoid", "Hypopharynx", "AlveolarProcessOfMandible", "OropharyngealTonsil", "SalivaryGland", "MaxillarySinus", "PyriformSinus", "Glottis", "LingualTonsil", "Larynx", "Uvula", "OralCavity", "PharyngotympanicTube", "PalatineTonsil", "NasalCavity", "Nasopharyngeal", "TubalTonsil", "RetromolarTrigone", ], "UMLS": ["UnknownPrimaryNeoplasiaSite"], } name_for_cid[7602] = "VertebralAnatomicStructure" cid_concepts[7602] = { "SCT": [ "L1Vertebra", "T3T4Disc", "C3C4Disc", "T7Vertebra", "T11T12Disc", "C2Vertebra", "T2T3Disc", "T4Vertebra", "C1Vertebra", "T8Vertebra", "T9T10Disc", "L4L5Disc", "T9Vertebra", "T10Vertebra", "C2C3Disc", "C5Vertebra", "L3L4Disc", "T7T8Disc", "T12Vertebra", "C3Vertebra", "T5T6Disc", "T11Vertebra", "T2Vertebra", "T6T7Disc", "L2L3Disc", "C5C6Disc", "T12L1Disc", "T3Vertebra", "T5Vertebra", "T1Vertebra", "L2Vertebra", "L3Vertebra", "T4T5Disc", "L1L2Disc", "L4Vertebra", "C7T1Disc", "C7Vertebra", "T10T11Disc", "T8T9Disc", "C6Vertebra", "T6Vertebra", "T1T2Disc", "L5S1Disc", "C6C7Disc", "C4Vertebra", "L5Vertebra", "C4C5Disc", ] } name_for_cid[7603] = "Vertebra" cid_concepts[7603] = { "SCT": [ "L1Vertebra", "T3Vertebra", "T5Vertebra", "T1Vertebra", "T7Vertebra", "C2Vertebra", "L2Vertebra", "L3Vertebra", "T4Vertebra", "C1Vertebra", "T8Vertebra", "L4Vertebra", "T9Vertebra", "T10Vertebra", "C7Vertebra", "C5Vertebra", "C6Vertebra", "T12Vertebra", "C3Vertebra", "T6Vertebra", "T11Vertebra", "C4Vertebra", "T2Vertebra", "L5Vertebra", ] } name_for_cid[7604] = "IntervertebralDisc" cid_concepts[7604] = { "SCT": [ "T3T4Disc", "C3C4Disc", "T11T12Disc", "T2T3Disc", "T4T5Disc", "L1L2Disc", "T9T10Disc", "L4L5Disc", "C2C3Disc", "C7T1Disc", "T10T11Disc", "T8T9Disc", "L3L4Disc", "T7T8Disc", "T5T6Disc", "T1T2Disc", "L5S1Disc", "C6C7Disc", "T6T7Disc", "L2L3Disc", "C4C5Disc", "C5C6Disc", "T12L1Disc", ] } name_for_cid[7701] = "FiberTractInBrainstem" cid_concepts[7701] = { "SCT": [ "CorticospinalTractInBrainstem", "MedialLemniscus", "MedialLongitudinalFasciculus", "InferiorCerebellarPeduncle", "SuperiorCerebellarPeduncle", "LateralLemniscus", "MiddleCerebellarPeduncle", ] } name_for_cid[7702] = "ProjectionandThalamicFiber" cid_concepts[7702] = { "NEU": [ "CorticobulbarTract", "AnteriorThalamicRadiation", "SuperiorOpticRadiationBaumLoop", "CorticospinalTract", "InferiorOpticRadiationMeyerLoop", "SuperiorThalamicRadiation", "InferiorThalamicRadiation", "PosteriorThalamicRadiation", ], "SCT": [ "AuditoryRadiation", "InternalCapsule", "ExternalCapsule", "OpticRadiation", ], } name_for_cid[7703] = "AssociationFiber" cid_concepts[7703] = { "DCM": [ "SuperiorLongitudinalFasciculusIII", "SuperiorLongitudinalFasciculusII", "SuperiorLongitudinalFasciculusI", ], "NEU": ["ArcuateFasciculus", "SuperiorLongitudinalFasciculus"], "SCT": [ "SuperiorFrontoOccipitalFasciculus", "InferiorLongitudinalFasciculus", "InferiorFrontoOccipitalFasciculus", "UncinateFasciculus", "VerticalOccipitalFasciculus", ], } name_for_cid[7704] = "LimbicSystemTract" cid_concepts[7704] = {"NEU": ["StriaTerminalis"], "SCT": ["Fornix", "Cingulum"]} name_for_cid[7705] = "CommissuralFiber" cid_concepts[7705] = { "SCT": [ "ForcepsMinor", "GenuOfCorpusCallosum", "SpleniumOfCorpusCallosum", "AnteriorCommissure", "ForcepsMajor", "PosteriorCommissure", "CorpusCallosum", "HabenularCommissure", "TapetumOfCorpusCallosum", ] } name_for_cid[7706] = "CranialNerve" cid_concepts[7706] = { "SCT": [ "AbducensNerve", "AccessoryNerve", "TrochlearNerve", "FacialNerve", "GlossopharyngealNerve", "TrigeminalNerve", "VestibulocochlearNerve", "VagusNerve", "HypoglossalNerve", "OculomotorNerve", "OlfactoryTract", "OpticNerve", ] } name_for_cid[7707] = "SpinalCordFiber" cid_concepts[7707] = { "SCT": ["LateralFuniculus", "DorsalFuniculus", "VentralFuniculus"] } name_for_cid[7710] = "TractographyAnatomicSite" cid_concepts[7710] = { "DCM": [ "PerilesionalWhiteMatter", "SuperiorLongitudinalFasciculusIII", "SuperiorLongitudinalFasciculusII", "SuperiorLongitudinalFasciculusI", ], "NEU": [ "SuperiorLongitudinalFasciculus", "SuperiorThalamicRadiation", "InferiorThalamicRadiation", "PosteriorThalamicRadiation", "StriaTerminalis", "InferiorOpticRadiationMeyerLoop", "CorticospinalTract", "CorticobulbarTract", "ArcuateFasciculus", "SuperiorOpticRadiationBaumLoop", "AnteriorThalamicRadiation", ], "SCT": [ "SpinalCordWhiteMatter", "ForcepsMinor", "LateralFuniculus", "SuperiorFrontoOccipitalFasciculus", "InferiorLongitudinalFasciculus", "SkeletalMuscle", "MiddleCerebellarPeduncle", "Phantom", "AbducensNerve", "GenuOfCorpusCallosum", "ForcepsMajor", "InferiorFrontoOccipitalFasciculus", "CorpusCallosum", "VagusNerve", "VentralFuniculus", "OpticNerve", "ExternalCapsule", "MedialLongitudinalFasciculus", "AnteriorCommissure", "CerebralWhiteMatter", "PeripheralNerve", "OlfactoryTract", "MedialLemniscus", "AccessoryNerve", "InferiorCerebellarPeduncle", "FacialNerve", "GlossopharyngealNerve", "WhiteMatterOfBrainAndSpinalCord", "OculomotorNerve", "LateralLemniscus", "TapetumOfCorpusCallosum", "CorticospinalTractInBrainstem", "PosteriorCommissure", "SuperiorCerebellarPeduncle", "UncinateFasciculus", "HabenularCommissure", "CardiacMuscle", "AuditoryRadiation", "SpleniumOfCorpusCallosum", "VestibulocochlearNerve", "CerebellarWhiteMatter", "Fornix", "Cingulum", "InternalCapsule", "TrigeminalNerve", "HypoglossalNerve", "VerticalOccipitalFasciculus", "TrochlearNerve", "DorsalFuniculus", "OpticRadiation", ], } name_for_cid[8101] = "ContainerType" cid_concepts[8101] = { "SCT": [ "SpecimenContainer", "TissueMicroarrayCassette", "ElectronMicroscopyGrid", "TissueCassette", "MicroscopeSlide", "SpecimenVial", "SpecimenWell", ] } name_for_cid[8102] = "ContainerComponentType" cid_concepts[8102] = { "SCT": [ "MicroscopeSlideCoverSlip", "SpecimenContainer", "TissueMicroarrayCassette", "ElectronMicroscopyGrid", "TissueCassette", "MicroscopeSlideMountingMedia", "SpecimenContainerLid", "MicroscopeSlide", "SpecimenVial", "SpecimenWell", ] } name_for_cid[8103] = "AnatomicPathologySpecimenType" cid_concepts[8103] = { "SCT": [ "SpecimenFromBreastObtainedByExcision", "SmearSample", "Aspirate", "SpecimenFromBreastObtainedByTotalMastectomy", "SegmentectomyBreastSample", "BreastTruCutBiopsySample", "BodySubstanceSample", "TissueSection", "SpecimenFromBreastObtainedByImageGuidedCoreBiopsy", "TissueSpot", "LumpectomyBreastSample", "LiquidBasedCytologicMaterial", "BreastDuctSample", "SpecimenFromBreastStereotacticallyGuidedCoreNeedleBiopsy", "TissueSpecimen", "GeneticSample", "SpecimenFromBreastObtainedByCoreNeedleBiopsy", "CoreSampleOfTissueBlock", "Slide", "BodyFluidSample", "FrozenSectionBreastSample", "TouchPreparationCytologicMaterial", "EntireBody", "SpecimenFromBreastByIncisionalBiopsyOfBreastMass", "GrossSpecimen", ] } name_for_cid[8104] = "BreastTissueSpecimenType" cid_concepts[8104] = { "SCT": [ "SpecimenFromBreastObtainedByExcision", "SpecimenFromBreastObtainedByTotalMastectomy", "SpecimenFromBreastObtainedByCoreNeedleBiopsy", "SegmentectomyBreastSample", "LumpectomyBreastSample", "BreastTruCutBiopsySample", "SpecimenFromBreastByIncisionalBiopsyOfBreastMass", "BreastDuctSample", "FrozenSectionBreastSample", "SpecimenFromBreastStereotacticallyGuidedCoreNeedleBiopsy", "SpecimenFromBreastObtainedByImageGuidedCoreBiopsy", ] } name_for_cid[8109] = "SpecimenCollectionProcedure" cid_concepts[8109] = { "SCT": [ "Scraping", "Venipuncture", "TakingOfSwab", "SpecimenCollection", "Excision", "Aspiration", "RemovalOfDevice", "HarvestingOfTissue", "Biopsy", ] } name_for_cid[8110] = "SpecimenSamplingProcedure" cid_concepts[8110] = { "DCM": [ "DissectionWithEntireSpecimenSubmission", "DissectionWithRepresentativeSectionsSubmission", ], "SCT": [ "CoreSampling", "SmearProcedure", "BlockSectioning", "BlockSurfaceRecut", "BlockStepSectioning", "Dissection", "LaserMicrodissection", "TouchPreparation", ], } name_for_cid[8111] = "SpecimenPreparationProcedure" cid_concepts[8111] = { "DCM": ["SpecimenStorage"], "SCT": [ "Staining", "SpecimenProcessing", "SpecimenCollection", "SamplingOfTissueSpecimen", "SpecimenReceiving", ], } name_for_cid[8112] = "SpecimenStain" cid_concepts[8112] = { "SCT": [ "MayGrunwaldGiemsaStain", "FastBlueBBSaltStain", "EriochromeBlueBlackSEStain", "CarmoisineAStain", "FieldStain", "BrazilinStain", "ThioflavineTStain", "AlkaliBlue5B4BStain", "GramStain", "AlizarinYellowRStain", "NaphtholASDChloracetateEsteraseStain", "SudanIIStain", "MethylGreenStain", "FastRedITRStain", "WaxolineBlueStain", "WaterSolubleEosinStain", "PonceauSStain", "SilverNitrateStain", "Chromotrope2RStain", "RoseBengalStain", "SudanStain", "VictoriaBlueBStain", "PeriodicAcidSchiffStain", "OilRedOStain", "ButyrateEsteraseStain", "FouchetStain", "MethylRedStain", "AzocarmineGGXStain", "AtebrinFSStain", "PeroxidaseStain", "FluorexonStain", "NeutralRedStain", "MeldolaBlueStain", "QuinacrineFluorescentStain", "FluoresceinSodiumStain", "ErythrosinBStain", "BismarkBrownRStain", "AlbertStain", "CarminicAcidStain", "AlizarinYellowGGStain", "FatRed7BStain", "AlizarinRedSStain", "ModifiedTrichromeStain", "ThionineStain", "VictoriaBlue4RStain", "NaphthaleneBlack12BStain", "FastGreenFCFStain", "MethyleneVioletStainBernthsen", "SaffronStain", "SpiritSolubleEosinStain", "TrypanBlueStain", "LeishmanStain", "BrilliantCresylBlueStain", "OrangeGStain", "PontamineSkyBlue6BXStain", "SpiritSolubleAnilineBlueStain", "KenacidBlueRStain", "VerhoeffHematoxylinStain", "PyronineBStain", "HemateinStain", "PontamineSkyBlue5BXStain", "MethylVioletStain", "AuramineGStain", "NonspecificEsteraseStain", "FluorescentStain", "PhloxinBStain", "SunsetYellowFCFStain", "BismarkBrownYStain", "TerminalDeoxynucleotidylTransferaseStain", "SporeStain", "ChromicAcidStain", "SolochromeAzurineBSStain", "FluoresceinStain", "IndophenolFromNaphtholStain", "MethylOrangeStain", "JennerGiemsaStain", "NitrazineYellowStain", "FastBlueBSaltStain", "AcidPhosphataseStain", "CresylVioletStain", "ProtargolSStain", "MethylViolet6BStain", "InsolubleBerlinBlueStain", "AlizarinCyanineGreenStain", "NaphtholGreenBStain", "VitalNewRedStain", "MetanilYellowStain", "MucicarmineStain", "ProcionBrilliantBlueMRSStain", "AldehydeFuchsinStain", "PageBlue83Stain", "BrilliantOrangeStain", "FeulgenReactionStain", "DiamondBlackStain", "JanusGreenBStain", "GiemsaStain", "PrussianBlueStain", "AlcoholSolubleNigrosineStain", "MethylBlueStain", "CarbolFuchsinStain", "HematoxylinStain", "WaterSolubleAnthraceneBrownStain", "FastGarnetGBCSaltStain", "BenzoFastScarletStain", "NeutrophilAlkalinePhosphataseStain", "AcriflavineStain", "AcridineOrangeStain", "EthylVioletStain", "CurcuminStain", "SolubleBerlinBlueStain", "MalloryBleachStain", "FastSulfonBlackFStain", "ErythrosinYStain", "FastVioletBSaltStain", "FuchsinAcidStain", "LuxolFastBlueStain", "LissamineRhodamineStain", "ImmunofluorescentStain", "SolochromeCyanineRStain", "BetaGlucuronidaseStain", "AlizarinBlueSStain", "CarmineStain", "GallocyanineStain", "NightBlueStain", "BrilliantCroceinStain", "WaysonStain", "CrystalPonceauStain", "XyleneCyanolFFStain", "AzureAStain", "SolochromeDarkBlueStain", "WaterSolubleAnilineBlueStain", "BauerChromicAcidLeucofuchsinStain", "TropaeolinOStain", "ChrysoidineRStain", "ChloroacetateEsteraseStain", "AlkalinePhosphataseStain", "SiriusRedF3BStain", "Permethrin", "SudanBlueStain", "ColloidalIronStain", "MartiusYellowStain", "MyeloperoxidaseStain", "ChromeAzurolSStain", "LissamineFastRedBStain", "AlcianBlue8GXStain", "LissamineFastYellowStain", "CongoRedStain", "ToluidineBlueStain", "CresylEchtVioletStain", "SudanBlackBStain", "ZiehlNeelsenStain", "AzoBlackStain", "RhodamineStain", "NileBlueStain", "CelestineBlueBStain", "AzureBStain", "LissamineGreenBStain", "TitanYellowStain", "CoriphosphineStain", "MethylViolet2BStain", "SafraninStain", "SudanIIIStain", "LacmoidStain", "RhodamineBStain", "AlkaliBlue6BStain", "AuramineStain", "SudanIVStain", "Ponceau3RStain", "FastBlueRRSaltStain", "IndiaInkStain", "RosolicAcidSodiumSaltStain", "VanGiesonStain", "TropaeolinOOStain", "AzophloxinStain", "BlueShadeEosinStain", "WaterSolubleNigrosineStain", "OrceinStain", "TrichromeStain", "WrightStain", "AzorubinSStain", "HanselStain", "AzureCStain", "NewFuchsinStain", "FlagellarStain", "PageBlueG90Stain", "PotassiumHydroxideStain", "RomanowskyStain", "LightGreenSFStain", "ErieGarnetStain", "MethyleneBlueStain", "MethylGreenPyroninStain", "DurazolRedStain", "MethyleneVioletStain", "FastRedBSaltStain", "NaphtholYellowSStain", "ChrysoidineYStain", "SilverStain", "AnilineBlueStain", "TartrazineStain", "PyronineGStain", "BrilliantYellowStain", "PatentBlueVSodiumSaltStain", "MalachiteGreenStain", "IndigoCarmine", "AuramineOStain", "OrangeIIStain", "DibromofluoresceinStain", "EvansBlueStain", "SudanBlackStain", "NuclearFastRedStain", "FuchsinBasicStain", "BiebrichScarletStain", "PonceauXylidineStain", "ThioflavineSStain", "PhosphotungsticAcidHematoxylinStain", "FastRedTRSaltStain", "SolochromeBlack6BStain", ] } name_for_cid[8113] = "SpecimenPreparationStep" cid_concepts[8113] = { "SCT": [ "SpecimenClearing", "SpecimenSteamHeating", "SpecimenFreezing", "SpecimenMicrowaveHeating", "ProteaseDigestionOfTissueSpecimen", "SpecimenDehydration", ] } name_for_cid[8114] = "SpecimenFixative" cid_concepts[8114] = { "SCT": [ "Chloroform", "OsmiumTetroxide", "CarnoyFluid", "HellyFluid", "MichelMedium", "BouinFluid", "ChromiumTrioxide", "PotassiumDichromate", "NeutralBufferedFormalin", "MercuricChloride", "FormolSublimate", "AceticAcid", "PicricAcid", "Formalin", "Methanol", "Formaldehyde", "Paraformaldehyde", "Ethanol", "ZenkerFluid", ] } name_for_cid[8115] = "SpecimenEmbeddingMedia" cid_concepts[8115] = { "SCT": [ "EpoxyResin", "AcrylicResin", "TissueFreezingMedium", "ParaffinWax", "Plastic", "Agar", ] } name_for_cid[8120] = "WholeSlideMicroscopyImageReferencedImagePurposeofReference" cid_concepts[8120] = { "DCM": [ "ImagedContainerLabel", "Localizer", "SameAcquisitionAtDifferentFocalDepth", "SameAcquisitionAtDifferentSpectralBand", "SameAcquisitionAtLowerResolution", "SameAcquisitionAtHigherResolution", ] } name_for_cid[8121] = "MicroscopyLensType" cid_concepts[8121] = { "SCT": ["SlideOverviewLens", "OilImmersionLens", "HighPowerNonImmersionLens"] } name_for_cid[8122] = "MicroscopyIlluminatorandSensorColor" cid_concepts[8122] = { "SCT": ["Infrared", "Ultraviolet", "Red", "FullSpectrum", "Blue", "Green"] } name_for_cid[8123] = "MicroscopyIlluminationMethod" cid_concepts[8123] = { "DCM": [ "DifferentialInterferenceContrast", "TotalInternalReflectionFluorescence", "TransmissionIllumination", "ReflectionIllumination", "EpifluorescenceIllumination", "BrightfieldIllumination", "DarkfieldIllumination", "ObliqueIllumination", "PhaseContrastIllumination", ] } name_for_cid[8124] = "MicroscopyFilter" cid_concepts[8124] = { "DCM": ["NoFilter"], "SCT": [ "BlueOpticalFilter", "NomarskiPrism", "GreenOpticalFilter", "HoffmanModulator", "CondenserAnnulus", "PolarizingOpticalFilter", "VioletOpticalFilter", "InfraredOpticalFilter", "DarkfieldStop", "RheinbergFilter", "UltravioletOpticalFilter", "DichroicBeamsplitter", "PhaseContrastPlate", "RedOpticalFilter", "DeSénarmontCompensator", ], } name_for_cid[8125] = "MicroscopyIlluminatorType" cid_concepts[8125] = { "SCT": [ "TungstenHalogenLamp", "LightEmittingDiode", "LaserDevice", "MercuryArcLamp", "XenonArcLamp", ] } name_for_cid[8130] = "StainingProtocol" cid_concepts[8130] = { "SCT": ["HematoxylinAndEosinStainMethod", "Staining", "AcidFastStainMethod"] } name_for_cid[8131] = "PathologyImagingProtocol" cid_concepts[8131] = { "DCM": [ "WSI40XRGB", "PeriOperativePhotographicImaging", "SlideMicroscopyPathologyImaging", "WholeSlideImaging", "WSI20XRGB", ], "SCT": [ "LightMicroscopy", "PhotographyOfPatient", "GrossPathologyRequest", "Histology", "Immunohistochemistry", "Photomicrography", "Histopathology", "PhotographyOfGrossOrgan", "Microscopy", ], } name_for_cid[8132] = "MagnificationSelection" cid_concepts[8132] = {"DCM": ["_10X", "_20X", "_40X", "_5X"]} name_for_cid[8133] = "TissueSelection" cid_concepts[8133] = { "DCM": [ "NominalEmptyTileSuppression", "HighThresholdEmptyTileSuppression", "NoEmptyTileSuppression", ] } name_for_cid[8134] = "AnatomicStructure" cid_concepts[8134] = { "BARI": [ "_1stMarginalCoronaryArteryLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "RamusLaterals", "_3rdDiagonalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", ], "DCM": [ "ScapularSupraspinatusFossa", "ScapularInfraspinatusFossa", "AorticKnob", "ArchOfTheAzygosVein", "Lobar", "BoneAndSoftTissue", "PerilesionalWhiteMatter", "SuperiorLongitudinalFasciculusIII", "SuperiorLongitudinalFasciculusII", "SuperiorLongitudinalFasciculusI", "SkinOfParaspinalAreaOfTheNeck", "SkinOfLowerParaspinalRegion", "SkinOfMidParaspinalRegion", "SkinOfUpperParaspinalRegion", "SkinOfParaspinalAreaOfTheSuperiorBack", "SkinOfInferiorPosteriorSurfaceOfThePinna", "SkinOfInferiorHelixOfEar", "SkinOfCaruncleOfEye", "SkinOfAnteriorHelixOfEar", "SkinOfLateralPartOfDorsumOfFoot", "SkinOfLowerEyelidMargin", "SkinOfLowerAntihelixOfEar", "SkinOfPosteriorHelixOfEar", "SkinOfParanasalCheek", "SkinOfMedialPartOfDorsumOfFoot", "SkinOfInfraalarGroove", "SkinOfSuperiorPosteriorHelixOfEar", "SkinOfSuperiorAntihelixOfEar", "SkinOfSoleOfForefoot", "SkinOfPosteriorLobuleOfTheEar", "SkinOfUpperEyelidMargin", "SkinOfUpperAntihelixOfEar", "SkinOfSuperiorPosteriorSurfaceOfThePinna", "SkinOfMidBack", "EmbryonicKidney", "RibScaleneTubercle", "VertebralIntervertebralNotch", "SubscapularFossa", "ScapularSpine", ], "FMA": [ "ArcuateFasciculus", "SkinOfDorsalPartOfFourthToe", "SkinOfDorsalPartOfFifthToe", "SkinOfVermilionProperOfLowerLip", "SkinOfDorsalPartOfGreatToe", "SkinOfDorsalPartOfSecondToe", "SkinOfDorsalPartOfThirdToe", "SkinOfVermilionProperOfUpperLip", "SupramammaryLymphNode", "MucosaOfUvula", "MucosaOfPalatoglossalArch", "SkinOfPlantarPartOfThirdToe", "SkinOfPlantarPartOfFourthToe", "SkinOfPalmarPartOfLittleFinger", "SkinOfPlantarPartOfFifthToe", "LumenOfGallbladder", "SkinOfPlantarPartOfSecondToe", "SkinOfPalmarPartOfRingFinger", "SkinOfPalmarPartOfIndexFinger", "SkinOfPalmarPartOfMiddleFinger", "SkinOfPlantarPartOfGreatToe", "SkinOfPalmarPartOfThumb", "SkinOfDorsalPartOfLittleFinger", "MucosaOfPharynx", "SkinOfDorsalPartOfRingFinger", "SkinOfDorsalPartOfIndexFinger", "SkinOfDorsalPartOfMiddleFinger", "SkinOfDorsalPartOfThumb", "MucosaOfPosteriorWallOfOropharynx", "SubcorticalGrayMatter", "Nasion", "TorusOfPharyngotympanicTube", "SkinOfLowerOuterQuadrantOfBreast", "SkinOfUpperInnerQuadrantOfBreast", "SkinOfLowerInnerQuadrantOfBreast", "SkinOfUpperOuterQuadrantOfLeftBreast", "WallOfGallbladder", "SubiliacLymphNode", "SkinOfBackOfTrunk", "MucosaOfOralSegmentOfHardPalate", "MucosaOfDorsumOfPharyngealPartOfTongue", "MucosaOfDorsumOfOralPartOfTongue", "SkinOfDorsumOfNose", ], "NCIt": ["MouseMammaryFatPad"], "NEU": [ "StriaTerminalis", "AnteriorThalamicRadiation", "CorticospinalTract", "CorticobulbarTract", "ArcuateFasciculus", "SuperiorLongitudinalFasciculus", "SuperiorThalamicRadiation", "InferiorThalamicRadiation", "PosteriorThalamicRadiation", "InferiorOpticRadiationMeyerLoop", "SuperiorOpticRadiationBaumLoop", ], "SCT": [ "LeftHypochondriacRegion", "SternocleidomastoidMuscle", "ProfundaFemorisVein", "MucosaOfFloorOfMouth", "TruncusCoeliacus", "C3C4Disc", "InferiorLongitudinalFasciculus", "LowRightAtrium", "PelvicCavityTrue", "WristJoint", "IntermediateArteryRamus", "LeftVentricleInflow", "GenicularArtery", "FontanelOfSkull", "SigmoidColon", "SuperiorGlutealLymphNode", "VentralFuniculus", "SkinOfAnteriorSurfaceOfUpperArm", "RightFemoralArtery", "Intracranial", "MedialLacunarLymphNode", "JawRegion", "SkinOfAnteriorSurfaceOfForearm", "FetlockOfForelimb", "OropharyngealTonsil", "Glottis", "LobarArtery", "SkinOfPosteriorSurfaceOfForearm", "ParotidLymphNode", "SkinOfChin", "ThighPerforator", "LowerParatrachealIncludingAzygousLymphNode", "PrececalLymphNode", "Pituitary", "MidRightCoronaryArtery", "ChestCavity", "RadiusAndUlna", "ExternalIliacVein", "UpperLimb", "ParietalBone", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "ParatrachealLymphNode", "RightUpperQuadrantOfAbdomen", "Eye", "SuperficialPalmarArch", "UpperGastroIntestinalTract", "Prostate", "PeripheralNerveMyelinSheath", "FacialBones", "Back", "SoftTissue", "Duodenum", "_1stMarginalCoronaryArtery", "SkinOfLowerLip", "DeepParotidLymphNode", "LateralJugularLymphNode", "Larynx", "PeronealVein", "MandibularIncisorTeeth", "PosteriorMediastinalLymphNode", "Lymph", "SkinOfScalp", "FemoralArtery", "LymphNodeOfLesserCurvatureOfStomach", "MiddleDeepCervicalLymphNode", "Ovary", "SupraclavicularLymphNode", "DistalHumerus", "Urethra", "Head", "MitralValve", "AdrenalGland", "SkinOfEarLobule", "PrevesicularLymphNode", "Calyx", "LateralFuniculus", "PosteriorMedialTributary", "GlutealLymphNode", "PulmonaryMetastasis", "SkeletalMuscle", "Submental", "UpperAbdomen", "NucleusAccumbens", "SkinOfPoplitealFossa", "PoplitealFossa", "PulmonaryArteryConduit", "InternalCarotidArteryC5Segment", "DeepPoplitealLymphNode", "SkinOfUmbilicus", "LevatoresCostarumMuscles", "FrontalLobe", "Adventitia", "IntermediateCommonIliacLymphNode", "Hypopharynx", "RightCoronaryArteryOstium", "MarginalCoronaryArtery", "SkinOfBackOfUpperThoracicRegion", "Ulna", "HepaticVein", "InternalMammaryArtery", "DistalUlna", "InferiorAuricularLymphNode", "SkinOfThenarRegionOfPalm", "RenalHilarLymphNode", "HilarLymphNode", "BronchialArtery", "AccessoryNerve", "CouinaudHepaticSegmentIII", "ExternalCarotidArtery", "UterineParacervicalLymphNode", "InterlobarLymphNodeOfTheLung", "SkinOfHeel", "Tumor", "SystemicArtery", "AbdominopelvicCavity", "TapetumOfCorpusCallosum", "SubaorticCommonIliacLymphNode", "VomerBone", "MucosaOfUpperLip", "Digit", "SkinOfClitoris", "UterusAndFallopianTubes", "Arachnoid", "SkinOfAnteriorSurfaceOfKnee", "TarsalJoint", "ShaftOfTibia", "LingualArtery", "PararectalLymphNode", "PeripancreaticLymphNode", "CongenitalCoronaryArteryFistulaToRightAtrium", "DeltoidMuscle", "CerebralFornix", "Penis", "Baffle", "SkinOfLowerBack", "TransverseProcessOrVertebra", "Parathyroid", "PostvesicularLymphNode", "PosteriorTriangleCervicalLymphNode", "SkinOfTipOfNose", "Scapula", "Nasopharyngeal", "InferiorGlutealLymphNode", "Kidney", "CardiophrenicAngleLymphNode", "LobarLymphNodeOfTheLung", "OmentalBursa", "InternalCarotidArtery", "L1Vertebra", "RightPosteriorAVCoronaryArtery", "CouinaudHepaticSegmentV", "ProximalRadius", "RenalPelvis", "AbducensNerve", "Thrombus", "VenousNetwork", "SubcostalMuscle", "CommonAtrium", "BoneStructureOfPelvis", "SkinOfExternalAuditoryCanal", "Ilium", "InternalCarotidArteryC6Segment", "SkinOfLateralPortionOfNeck", "AlveolarProcessOfMandible", "AnteriorTibialArtery", "CranialNerve", "SkinOfAbdomen", "ConnectiveTissue", "CommonCarotidArtery", "InnermostIntercostalMuscles", "_3rdMarginalCoronaryArtery", "UpperDeepCervicalLymphNode", "UrinaryTract", "SuperficialCervicalLymphNode", "MastoidBone", "CommonIliacArteryBifurcation", "MiddleHepaticVein", "CouinaudHepaticSegmentVI", "SkinOfHead", "Thigh", "SkinOfLowerExtremity", "SkinOfRootOfPenis", "Trachea", "LeftPosterolateralCircumflexCoronaryArtery", "BodyConduit", "Thalamus", "AnteriorMediastinalLymphNode", "SkinOfMedialAspectOfAnkle", "LateralHighRightAtrium", "RightVentricleInflow", "LeftLowerQuadrantOfAbdomen", "CardiacMuscle", "SpinalCerebrospinalFluidPathway", "SesamoidBonesOfFoot", "SkinOfButtock", "C2C3Disc", "AbdominalWallMuscle", "PharyngealRecess", "SixthLumbarArtery", "LacrimalCaruncle", "Omentum", "LateralCanthus", "SubmandibularGland", "SkinOfEyebrow", "SkinOfHand", "CarotidBifurcation", "SuperiorArticularFacetOfAxis", "T3Vertebra", "InnominateArtery", "Cecum", "AcromionProcessOfScapula", "Extremity", "BoneStructureOfHeadAndOrNeck", "FacialArtery", "EpigastricRegion", "SkinOfAlaNasi", "VerticalOccipitalFasciculus", "PosteriorCommissureOfLabiumMajorum", "SkinOfUpperLip", "CervicoThoracicSpine", "PectoralGirdle", "RightLumbarRegion", "TeresMinorMuscle", "PostauricularLymphNode", "LymphNodeRingOfCardiaOfStomach", "ParavaginalLymphNode", "KneeJoint", "SkinOfPosteriorSurfaceOfThigh", "SkinOfNose", "SkinOfVertexOfScalp", "CommonFemoralVein", "DeepIntraparotidLymphNode", "SubstantiaNigra", "SkinOfPalmarAreaOfWrist", "UpperInnerQuadrantOfBreast", "C5Vertebra", "InferiorPancreaticoduodenalLymphNode", "LymphNodeOfTrunk", "ThoracicAorta", "RightInguinalRegion", "Conjunctiva", "Vitreous", "PyriformSinus", "AtlantalAxialJoint", "RightLowerQuadrantOfAbdomen", "AnteriorTibialLymphNode", "InguinalLymphNode", "CockettPerforatingVein", "RightMainBronchus", "RightAtrioventricularOstium", "ExternalMammaryLymphNode", "DeepLymphNode", "MedianRetropharyngealLymphNode", "AVGrooveContinuationOfCircumflexArtery", "InteriliacLymphNode", "ProximalFemur", "SubsegmentalLymphNodeOfTheLung", "NailUnitOfGreatToe", "CostalGroove", "Thumb", "GreatCardiacVein", "SuperiorPancreaticoduodenalLymphNode", "Hindfoot", "SuprapyloricLymphNode", "PasternOfForefoot", "MiddleLobeOfRightLung", "SkinOfAnus", "SternalSkin", "BaseOfTongue", "T12Vertebra", "VestibulocochlearNerve", "C3Vertebra", "ShaftOfUlna", "L2L3Disc", "C5C6Disc", "_2ndLeftPosterolateralCoronaryArtery", "MiddleCerebralArteryM2Segment", "LacrimalBone", "BasilicVein", "HunterianPerforatingVein", "SkinOfScrotum", "SuperiorLateralInguinalLymphNode", "DorsalFuniculus", "LeftAnteriorDivisionOfLeftBranchAtrioventricularBundle", "SkinOfUpperTrunk", "ProfundaFemorisArtery", "Pharynx", "LigamentumArteriosum", "Nasopharynx", "C6C7Disc", "SympatheticTrunk", "SkinOfOccipitalRegion", "OvarianVein", "BrachialPlexus", "AnteriorAuricularLymphNode", "IntermediateExternalIliacLymphNode", "OpticNerveHead", "DistalFemur", "ApexOfRightVentricle", "C1Vertebra", "NavicularOfHindfoot", "LymphNodeOfHead", "LateralCalfPerforator", "InferiorInguinalLymphNode", "IntrapulmonaryLymphNode", "Phantom", "RetropharyngealLymphNode", "NailUnitOfFourthToe", "SkinOfMedialCanthus", "FourthLumbarArtery", "ParasternalLymphNode", "ThirdLumbarArtery", "LimbicLobe", "SkinOfChest", "FemaleExternalUrethralOrifice", "PrimitiveAorta", "SkinOfAxilla", "LumenOfBloodVessel", "CornealEndothelium", "HighestMediastinalLymphNode", "AntecubitalVein", "SpinalCordGrayMatter", "Mandible", "Parasternal", "LeftMainBronchus", "Lens", "SystemicVein", "OccipitalLobe", "Trunk", "MandibularDentalArch", "DelphianLymphNode", "C7T1Disc", "SuperiorRectalLymphNode", "Pelvis", "SubclavianArtery", "SkinOfInguinalRegion", "Amygdala", "_3rdLeftPosterolateralCoronaryArtery", "OpticChiasm", "OphthalmicArtery", "SymphysisPubis", "PancreaticDuct", "Nose", "EpitrochlearLymphNode", "Hand", "AxillaryLymphNode", "PectoralisMajorMuscle", "DeepAnteriorCervicalLymphNode", "OvarianArtery", "Hippocampus", "TonsilAndAdenoid", "ThoracicInlet", "LacrimalGland", "IliacCrest", "LacunarLymphNode", "SuperficialFemoralVein", "LeftPosteriorDescendingCircumflexCoronaryArtery", "SuperiorLeftPulmonaryVein", "PosteriorTibialLymphNode", "PancreaticosplenicLymphNode", "BileDuct", "SystemicCollateralArteryToLung", "LymphNodeOfAortopulmonaryWindow", "CeliacLymphNode", "BoneTissue", "Skull", "InfraclavicularLymphNode", "SubcarinalLymphNode", "CerebralHemisphere", "ParavesicularLymphNode", "Metastasis", "OpticRadiation", "SinoAtrialNode", "SacralLymphNode", "SkinOfNuchalRegion", "T7Vertebra", "EndoNasopharyngeal", "EsophagusStomachAndDuodenum", "Breast", "AxillaryFascia", "PoplitealVein", "SkinOfPosteriorSurfaceOfElbow", "TricuspidValve", "VulvalVestibule", "PiaMater", "RightAtrium", "VascularSclerosis", "SkinOfLateralPartOfHeel", "DistalLeftAnteriorDescendingCoronaryArtery", "InnerEar", "Coccyx", "BodyOfSternum", "AngleOfRib", "DescendingAorta", "OccipitalLymphNode", "MaxillarySinus", "ProximalLeftAnteriorDescendingCoronaryArtery", "OccipitalBone", "MalleolarStructureOfTibia", "L2Vertebra", "Wing", "Spine", "SuperficialInguinalLymphNode", "LacrimalSac", "Muscle", "WhiteMatter", "Acetabulum", "LymphNodeOfStomach", "SkinOfExternalGenitalia", "RetromolarTrigone", "IntramammaryLymphNode", "Zygoma", "InnominateVein", "Abdomen", "HepaticLymphNode", "SuperficialIntraparotidLymphNode", "SkinOfForehead", "JuxtaposedAtrialAppendage", "MucosaOfMaxillaryGingiva", "CarotidBody", "Jejunum", "ChestAbdomenAndPelvis", "RightHepaticVein", "Scalp", "GastrocnemiusVein", "TracheobronchialLymphNodeLocatedNearCarina", "DistalRadius", "OrbitalStructure", "LeftMainBranchOfPortalVein", "AorticLymphNode", "SuperficialLymphNode", "TrigeminalNerve", "TibialLymphNode", "SkinOfPhiltrum", "Sclera", "BloodVessel", "ArchOfVertebra", "AnteriorPosteriorCerebralArteryBifurcation", "LiverAndBiliaryStructure", "_1stDiagonalCoronaryArtery", "Uvula", "Perineum", "InteratrialSeptum", "Femur", "Rectum", "T10T11Disc", "SkinOfEpigastricArea", "LeftAtrium", "InterlobularArteryOfKidney", "CerebralArtery", "CouinaudHepaticSegmentVIII", "InferiorMesentericArtery", "IliocostalisMuscle", "TracheobronchialLymphNode", "AtlantoOccipitalJoint", "CervicalSpine", "SpinalCordWhiteMatter", "IliacAndOrFemoralArtery", "VertebralForamen", "SmallIntestine", "Oropharynx", "SkinOfCrusOfHelix", "SuperiorRightPulmonaryVein", "Mesothelium", "InferiorVenaCava", "IntraArticular", "Axilla", "PancreaticLymphNode", "ThymusGland", "SkinOfLowerAbdomen", "SkinOfAnteriorSurfaceOfThigh", "AtrioventricularNode", "ParietalLobe", "IliacArtery", "T12L1Disc", "DistalRightCoronaryArtery", "RadiusBone", "SkinOfLabiumMinus", "LateralCommonIliacLymphNode", "SubmandibularTriangle", "PectoralisMinorMuscle", "OpticCanal", "SuperficialTemporalArtery", "MedialLemniscus", "InferiorCerebellarPeduncle", "RightMainBranchOfPortalVein", "SphenoidBone", "AppendicularLymphNode", "LateralVesicularLymphNode", "ProximalHumerus", "ChestAndAbdomen", "Spleen", "C4Vertebra", "LowerOuterQuadrantOfBreast", "RetrocecalLymphNode", "BothEyes", "Mediastinum", "Cerebellum", "FirstLumbarArtery", "AbdominalLymphNode", "PoplitealArtery", "TibialPlateau", "UpperUrinaryTract", "PulmonaryVenousAtrium", "T9T10Disc", "DorsalScapularArtery", "Endometrium", "L3L4Disc", "LeftVentricle", "MedialExternalIliacLymphNode", "NailUnitOfLittleFinger", "LowerJugularLymphNode", "CostalCartilage", "SaphenousVein", "_2ndRightPosterolateralCoronaryArtery", "Gallbladder", "MandibularLymphNode", "RenalArtery", "PeritonealCavity", "UmbilicalCord", "PrepericardialLymphNode", "RightBranchOfAtrioventricularBundle", "UpperArm", "SkinOfPosteriorSurfaceOfLowerLeg", "Chest", "GastroduodenalArtery", "AzygosVein", "ShaftOfFemur", "LymphNodeOfThePulmonaryLigament", "Liver", "Rib", "L5S1Disc", "TubalTonsil", "AxillaryVeinLymphNode", "CommonFemoralArtery", "DeepInguinalLymphNode", "SuperficialPalmarVenousArch", "SkinOfGlansPenis", "UpperLimbLymphNode", "CongenitalCoronaryArteryFistulaToLeftAtrium", "SubpyloricLymphNode", "NailUnitOfMiddleFinger", "T7T8Disc", "VenaCava", "SkinOfInfraclavicularRegion", "UpperJugularLymphNode", "HilarArtery", "Talus", "MedialCommonIliacLymphNode", "LeftCoronaryArtery", "ThirdVentricle", "ApexOfLung", "MucosaOfTongue", "_3rdDiagonalCoronaryArtery", "SpinalisMuscle", "SaphenofemoralJunction", "LowerDeepCervicalLymphNode", "FrontalBone", "Anus", "CommonIliacVein", "TrabeculaeCarnae", "PosteriorCerebralArteryP1Segment", "SkinOfUpperEyelid", "LateralLemniscus", "LumbarSpine", "ThyrocervicalTrunk", "PrimitivePulmonaryArtery", "SkinOfEar", "HilumOfLung", "SellaTurcica", "FibularLymphNode", "Scrotum", "InferiorLeftPulmonaryVein", "MaxillaryDentalArch", "InnominateLymphNode", "Intima", "Forefoot", "LowerLeg", "RenalVein", "Hair", "InternalIliacVein", "IlealVein", "Tarsus", "Skin", "SkinOfNipple", "Toe", "SkinOfJawline", "MiddleCardiacVein", "MiddleCerebralArtery", "PosteriorDescendingRightCoronaryArtery", "SkinOfDorsalAreaOfWrist", "CorpusStriatum", "InternalCapsule", "Adenohypophysis", "PosteriorTibialVein", "SuperiorPancreaticLymphNode", "SubmandibularLymphNode", "ExternalIliacLymphNode", "MuscleOfLowerLimb", "AscendingAorta", "LeftUpperQuadrantOfAbdomen", "NeckOfRib", "PericardiophrenicArtery", "SternalAngle", "JugularLymphNode", "ExternalAuditoryCanal", "GastroOmentalLymphNode", "Patella", "OccipitalVein", "CubitalLymphNode", "LumboSacralSpine", "ForcepsMinor", "SplenicFlexureOfColon", "DeepLateralCervicalLymphNode", "BasilarArtery", "NasalSinus", "BrainCerebrospinalFluidPathway", "MidCircumflexCoronaryArtery", "CouinaudHepaticSegmentII", "CentralRetinalVein", "PleuralEffusion", "CalcanealTubercle", "AnteriorCervicalLymphNode", "GenuOfCorpusCallosum", "SkinOfSupraclavicularRegionOfNeck", "GastricArtery", "SubscapularisMuscle", "ExternalEar", "LeftVentricleOutflowTract", "SegmentalLymphNodeOfTheLung", "Calcaneus", "IntercostalArtery", "SolealVein", "LateralPericardialLymphNode", "PeripheralNerve", "SubscapularAxillaryLymphNode", "PrefemoralLymphNode", "TeresMajorMuscle", "AnteriorHornLateralVentricle", "PatentDuctusArteriosus", "MaxillaryIncisorTeeth", "MesentericVein", "NailUnitOfIndexFinger", "MaleInternalGenitalia", "XiphoidProcessOfSternum", "SuperficialParotidLymphNode", "IliacLymphNode", "PalatineBone", "OculomotorNerve", "CoronaryArtery", "RightBranchOfHepaticArtery", "VertebralCanal", "DuraMater", "Flank", "EsophagealHiatus", "Maxilla", "CentralRetinalArtery", "Neurohypophysis", "TibiaAndFibula", "LymphNodeOfMesentery", "SkinOfLabium", "SegmentalArtery", "BuccalMucosa", "JuxtaintestinalLymphNode", "MitralRing", "BrachialVein", "T10Vertebra", "HepaticArtery", "InterstitialTissue", "PeronealArtery", "PyloricLymphNode", "TendonOfTodaro", "RightHypochondriacRegion", "OccipitalRegionOfScalp", "SuperiorMesentericVein", "HeadOfRib", "LumbarArtery", "LingualTonsil", "Cornea", "L4Vertebra", "SkinOfEyeRegion", "IliacVein", "CoronaryArteryGraft", "SkinOfAreola", "AcromioclavicularJoint", "UmbilicalRegion", "SupraspinatusMuscle", "CongenitalCoronaryArteryFistulaToRightVentricle", "ChestWall", "SuperiorFrontoOccipitalFasciculus", "T3T4Disc", "SkinOfPrepuceOfClitoris", "RetrotrachealLymphNode", "SoftPalate", "T4Vertebra", "ExternalIntercostalMuscle", "CranialVenousSystem", "GiacominiVein", "MiddleCerebellarPeduncle", "RightVentricle", "VagusNerve", "NailUnitOfThirdToe", "HeadAndNeck", "SkinOfLateralCanthus", "OpticNerve", "ExternalCapsule", "Bladder", "Vulva", "Epicardium", "EntorhinalCortex", "LargeIntestine", "SkinOfLowerChestWall", "SkinOfUpperExtremity", "SkinOfNasolabialFold", "Forearm", "OlfactoryTract", "NeckChestAndAbdomen", "SuperiorMesentericArtery", "TemporalLobe", "EpigastricLymphNode", "PosteriorTibialArtery", "FemoralVein", "CiliaryBody", "RightAuricularAppendage", "GreatSaphenousVeinOfThigh", "L5Vertebra", "LeftHepaticVein", "SuperficialFemoralArtery", "_2ndMarginalCoronaryArtery", "T11T12Disc", "SuperiorCerebellarPeduncle", "DorsalAspectOfScapula", "ChoroidOfEye", "Carina", "AorticArch", "AsciticFluid", "PurkinjeFibers", "Supraglottis", "Telencephalon", "LeftBranchOfHepaticArtery", "PresymphysialLymphNode", "ArcuateArteryOfTheKidney", "Heart", "CephalicVein", "Lip", "GastricVein", "AllLegs", "LeftMainCoronaryArtery", "SkinOfLip", "InferiorRightHepaticVein", "MucosaOfTipOfTongue", "CarotidSiphon", "CentralAxillaryLymphNode", "AccessoryAtrioventricularBundle", "MastoidCellsAndAntra", "SuperiorMesentericLymphNode", "SystemicVenousAtrium", "L1L2Disc", "PlantarArterialArch", "AnomalousPulmonaryVein", "SkinOfFace", "SkinOfCavityOfConcha", "VertexOfHead", "LesserSaphenousVein", "AutonomicNerve", "GreatSaphenousVein", "T1T2Disc", "DistalTibia", "EsophagealLymphNode", "SkinOfLateralAspectOfAnkle", "EndoUreteric", "UlnarVein", "InferiorArticularFacetOfAxis", "SubclavianLymphNode", "Tibia", "MiddleEar", "SuperiorMedialInguinalLymphNode", "InternalAuditoryCanal", "RightPulmonaryArtery", "ProperHepaticArtery", "InterlobarArteryOfKidney", "ForcepsMajor", "HandBone", "CorpusCallosum", "PerforatingArteryOfKidney", "Humerus", "T5T6Disc", "HighRightAtrium", "AorticFistula", "SkinOfNeck", "LeftLumbarRegion", "NasalBone", "Cervix", "LeftAnteriorDescendingCoronaryArtery", "Artery", "Buttock", "AnatomicalReferencePlane", "Epididymis", "FallopianTube", "RetropyloricLymphNode", "Vein", "LymphNodeOfEpiploicForamen", "FacialNerve", "CerebrospinalFluid", "EsophagealArtery", "T8T9Disc", "ShaftOfHumerus", "Carpus", "PretrachealLymphNode", "SkinOfMedialPartOfHeel", "RadialVein", "LymphNodeOfLimb", "InferiorRightPulmonaryVein", "UterineArtery", "EndoVesical", "SkinOfGlutealFold", "MesentericArtery", "PromontoryCommonIliacLymphNode", "MuscleOfHead", "MiddleCerebralArteryM1Segment", "CouinaudHepaticSegmentIV", "ExternalJugularVein", "PosteriorHornLateralVentricle", "InternalIliacArtery", "SuperiorVenaCava", "AuditoryRadiation", "CornealEpithelium", "SubmentalLymphNode", "PosteriorArchVein", "AnteriorSpinalArtery", "SplenicVein", "AnusRectumAndSigmoidColon", "Colon", "CentralNervousSystem", "SplenicArtery", "AccessoryRenalArtery", "MediastinalLymphNode", "LowerLimbLymphNode", "Media", "SeminalVesicle", "DescendingColon", "DistalCircumflexCoronaryArtery", "BoneOfUpperLimb", "DorsalisPedisArtery", "NasalCavity", "Vagina", "LongissimusMuscle", "LowerInnerQuadrantOfBreast", "SkinOfToe", "TransverseColon", "Clavicle", "ParotidGland", "AorticIsthmus", "FloorOfMouth", "ProximalUlna", "_1stLeftPosterolateralCoronaryArtery", "Subxiphoid", "Diaphragm", "InferiorFrontoOccipitalFasciculus", "VasDeferens", "T6T7Disc", "SkinOfShaftOfPenis", "AxillaryArtery", "LeftPulmonaryArtery", "SalivaryGland", "Ileum", "VertebralArtery", "TransjugularIntrahepaticPortosystemicShunt", "AscendingColon", "SkinOfAnteriorSurfaceOfThorax", "SupraRenalAorta", "LateralCervicalLymphNode", "InternalJugularVein", "LacrimalArteryOfRightEye", "ChordaeTendineaeCordis", "SacroiliacJoint", "ScalenousAnteriorMuscle", "GroinSkinCrease", "HemolymphNode", "ColicLymphNode", "FacialLymphNode", "EntireBody", "PrelaryngealLymphNode", "SkinOfAnteriorTrunk", "PalatineTonsil", "PosteriorAuricularLymphNode", "TesticularArtery", "HypogastricRegion", "PharyngealTonsil", "ApicalAxillaryLymphNode", "NailUnitOfSecondToe", "HyoidBone", "C2Vertebra", "ThoracicDuct", "BoydPerforatingVein", "AnteriorTriangleOfNeck", "Peritioneum", "CommonIliacArtery", "SupraclavicularRegionOfNeck", "Meninges", "Shoulder", "SkinOfCheek", "TransversusThoracis", "SkinOfFoot", "SkinOfIntertragalIncisure", "CardiacSeptumProsthesis", "MidRightAtrium", "CerebellarWhiteMatter", "InterventricularSeptum", "Cingulum", "LowerLobeOfLung", "TesticularVein", "AnteriorTibialVein", "LeftInguinalRegion", "RightCoronaryArtery", "SkinOfHypogastricRegion", "Putamen", "InternalAuditoryMeatus", "CostocervicalTrunk", "MastoidLymphNode", "FifthLumbarArtery", "LymphNodeOfHeadAndNeck", "AxillaryVein", "LateralAxillaryLymphNode", "SkinOfPenis", "ScaleneLymphNode", "ClavicularNotchOfSternum", "SkinOfMedialBorderOfSoleOfFoot", "InferiorPancreaticLymphNode", "SubclavianVein", "ProximalRightCoronaryArtery", "PulmonaryValve", "TemporalBone", "ExternalIliacArtery", "BoneOfLowerLimb", "Midbrain", "PosteriorCerebralArtery", "ErectorSpinaeMuscle", "DeepPalmarVenousArch", "T2T3Disc", "Mouth", "PectoralAxillaryLymphNode", "PharynxAndLarynx", "SkinOfAnteriorSurfaceOfLowerLeg", "CarotidArtery", "UmbilicalArtery", "Cheek", "PulmonicRing", "LymphNode", "RadialArtery", "CommonDuctLymphNode", "T2Vertebra", "LeftFemoralArtery", "TrapeziusMuscle", "BuccinatorLymphNode", "Esophagus", "NailUnitOfFinger", "LateralCorticospinalTract", "ExtrapulmonaryLymphNodeOfLung", "BroadLigament", "Metacarpus", "SkinOfTemporalRegion", "CoracoidProcessOfScapula", "CerebralAqueduct", "Insula", "BoneMarrow", "HypogastricLymphNode", "PulmonaryVein", "SkinOfLowerEyelid", "MuscleOfNeck", "AtrioventricularBundle", "MucosaOfMandibularGingiva", "CorticospinalTractInBrainstem", "Lung", "SacroCoccygealSpine", "SkinOfPerineum", "GlenoidCavityOfScapula", "MaleExternalUrethralOrifice", "NailUnitOfThumb", "SkinOfUpperAbdomen", "LeftMainCoronaryArteryOstium", "T9Vertebra", "CardiovascularSystem", "CouinaudHepaticSegmentI", "LumbarLymphNode", "UpperParatrachealLymphNode", "ElbowJoint", "RegionalLymphNode", "UpperEyelid", "Sternum", "InferiorArticularProcessOfVertebra", "RightVentricleOutflowTract", "NeckAndChest", "GlobusPallidus", "UpperOuterQuadrantOfBreast", "AbdomenAndPelvis", "PelvicLymphNode", "PancreaticDuctAndBileDuctSystems", "ApexOfLeftVentricle", "OstiumOfCoronarySinus", "Eyelash", "ShaftOfRib", "PericardialCavity", "SkinOfAntitragus", "PulmonaryArtery", "SkinOfMedialSurfaceOfThigh", "MidLeftAnteriorDescendingCoronaryArtery", "C6Vertebra", "Thyroid", "EthmoidBone", "ParametrialLymphNode", "NavicularOfForefoot", "SuperficialPoplitealLymphNode", "InfraRenalAorta", "FetlockOfHindlimb", "ThoracoLumbarSpine", "SternoclavicularJoint", "RetroperitonealLymphNode", "Neck", "CarotidBulb", "Finger", "DeepCervicalLymphNode", "SkinOfBack", "Ischium", "InfraspinatusMuscle", "CouinaudHepaticSegmentVII", "SkinOfPosteriorSurfaceOfUpperArm", "SuperiorPhrenicArtery", "CommonVentricle", "FrenulumOfLabiaMinora", "SuperiorMediastinalLymphNode", "VesicularLymphNode", "SplenicLymphNode", "Uterus", "Ventricle", "TemporomandibularJoint", "TricuspidRing", "TracheaAndBronchus", "Testis", "FemoralHead", "AnteriorChamberOfEye", "SkinOfSideOfNose", "NasolabialLymphNode", "LaminaOfVertebra", "Eyeball", "Face", "UrinarySystem", "BrainStem", "OralCavity", "Foot", "PeripheralNervousSystem", "MuscleOfUpperLimb", "LateralExternalIliacLymphNode", "PinealGland", "SkinOfAntecubitalFossa", "UpperLobeOfLung", "LymphNodeOfGreaterCurvatureOfStomach", "PoplitealLymphNode", "PosterolateralBranchOfRightCoronaryArtery", "SkinOfSubmentalArea", "ProximalCircumflexCoronaryArtery", "SkinOfPostauricularRegion", "LowerLimb", "PosteriorCommunicationArtery", "Appendix", "HabenularCommissure", "VertebralColumnAndCranium", "AbdominalAorta", "Bone", "Tongue", "IntercostalLymphNode", "LymphNodeOfAorticArch", "ChestWallMuscle", "GrayMatter", "Fibula", "SuperiorLongitudinalFasciculus", "InferiorCardiacVein", "InternalIntercostalMuscle", "LateralVentricle", "CaudateNucleus", "LacrimalArtery", "OccipitalArtery", "Brain", "IntraglandularParotidLymphNode", "HepaticFlexureOfColon", "SigmoidLymphNode", "SkinOfTragus", "SuprasternalNotch", "AnteriorCardiacVein", "MidcolicLymphNode", "SkinOfPalmOfHand", "Pancreas", "BoneOfThorax", "NailUnitOfFifthToe", "DigitalArteryOfHand", "SecondLumbarArtery", "_1stRightPosterolateralCoronaryArtery", "LeftBranchOfAtrioventricularBundle", "BladderAndUrethra", "Sacrum", "Metatarsus", "FemaleInternalGenitalia", "VaginalIntroitus", "T8Vertebra", "MaleExternalGenitalia", "SkinOfAnteriorPortionOfNeck", "TubercleOfRib", "RetroperitonealSpace", "CervicalLymphNode", "IleocolicLymphNode", "AnteriorMiddleCerebralArteryBifurcation", "SuperiorArticularProcessOfVertebra", "SuperiorThyroidArtery", "CerebralCortex", "AnteriorCommissure", "TruncusArteriosusCommunis", "PedicleOfVertebra", "T1Vertebra", "Tooth", "Joint", "SkinOfDigitOfHand", "PasternOfHindfoot", "GreatSaphenousVeinOfCalf", "SuperiorTracheobronchialLymphNode", "Aorta", "MiddleJugularLymphNode", "AppendicealStump", "Diencephalon", "CongenitalCoronaryArteryFistulaToLeftVentricle", "NeckChestAbdomenAndPelvis", "T6Vertebra", "LatissimusDorsiMuscle", "ForamenMagnum", "CommonHepaticArtery", "SkinOfPartOfDorsalSurfaceOfHand", "AnkleJoint", "C4C5Disc", "SkinOfLabiumMajus", "LesserTrochanter", "SpinousProcessOfVertebra", "Bronchial", "LeftPosteriorDivisionOfLeftBranchAtrioventricularBundle", "PulmonaryChamberOfCorTriatriatum", "CommonBileDuct", "CysticLymphNode", "SkinOfLateralBorderOfSoleOfFoot", "UlnarArtery", "Stiffle", "LymphoidTissue", "SkinOfParietalRegion", "PancreaticoduodenalLymphNode", "LumbarRegion", "ThoracicSpine", "ManubriumOfSternum", "FourthVentricle", "T5Vertebra", "HipJoint", "OpticTract", "PulmonaryTrunk", "HypoglossalNerve", "L3Vertebra", "T4T5Disc", "LungAndTracheobronchialLymphNodes", "PrevascularRetrotrachealLymphNode", "ShaftOfRadius", "SkinOfPosteriorSurfaceOfThorax", "TrochlearNerve", "DiaphragmaticLymphNode", "InferiorMesentericLymphNode", "BrachialArtery", "C7Vertebra", "Placenta", "_2ndDiagonalCoronaryArtery", "FemaleGenitalLymphNode", "Hip", "PelvisAndLowerExtremities", "SerratusAnteriorMuscle", "ApexOfHeart", "PelvicCavityFalseAndOrTrue", "Stomach", "CircumflexCoronaryArtery", "IntestinalLymphNode", "AnteriorCommunicatingArtery", "InferiorMesentericVein", "SkinOfHelixOfEar", "ParaesophagealLymphNodeBelowCarina", "ParaAorticLymphNodeOfTheAnteriorMediastinum", "PerigastricLymphNode", "MedianCubitalVein", "Iris", "CoronarySinus", "TerminalInternalCarotidArtery", "FoveaCentralis", "BiliaryTract", "MedialLongitudinalFasciculus", "Atrium", "SkinOfHypothenarRegionOfPalm", "CerebralWhiteMatter", "Knee", "SubarachnoidSpace", "PulmonaryVeinConfluence", "InterpectoralLymphNode", "EyeRegion", "FingerJoint", "LymphNodeOfThorax", "BrainVentricle", "OralMucosa", "PharyngotympanicTube", "GlossopharyngealNerve", "UmbilicalVein", "InguinalRegion", "InternalNose", "_3rdRightPosterolateralCoronaryArtery", "NailUnitOfToe", "InferiorPhrenicArtery", "SkinOfPreauricularRegion", "PortalVein", "PosteriorCerebralCommissure", "SuperficialLateralCervicalLymphNode", "UncinateFasciculus", "AnteriorCerebralArtery", "L4L5Disc", "PrevertebralLymphNode", "Ear", "SpleniumOfCorpusCallosum", "MucosaOfLowerLip", "SkinOfPerioralRegionOfFace", "MesentericArteryLymphNode", "SuperficialAnteriorCervicalLymphNode", "SpinalCord", "T11Vertebra", "Pericardium", "PosteriorCerebralArteryP2Segment", "LateralRetropharyngealLymphNode", "PelvicCavityFalse", "LeftAuricularAppendage", "CircleOfWillis", "LowerEyelid", "SaphenopoplitealJunction", "_1stSeptalCoronaryArtery", "CoccygealVertrebrae", "Eyelid", "ParamammaryLymphNode", "ObturatorLymphNode", "DeepPalmarArchOfRadialArtery", "NailUnitOfRingFinger", "FrontalSinus", "PleuralStructure", "HypochondriacRegion", "Retina", "CisternaMagna", "DoddPerforatingVein", ], "UMLS": ["UnknownPrimaryNeoplasiaSite", "DistalPhalanx"], } name_for_cid[8135] = "MicroscopyAnnotationPropertyType" cid_concepts[8135] = {"SCT": ["Cell", "Nucleus"]} name_for_cid[8136] = "MicroscopyMeasurementType" cid_concepts[8136] = {"SCT": ["Area"]} name_for_cid[8201] = "SurfaceScanAcquisitionType" cid_concepts[8201] = { "DCM": [ "TimeOfFlight", "LaserScanning", "Interferometry", "ShapeFromShading", "PatternProjection", "ConfocalImaging", "ShapeFromMotion", "PointCloudAlgorithmic", ] } name_for_cid[8202] = "SurfaceScanModeType" cid_concepts[8202] = { "DCM": ["HighResolution", "FastMode", "Checkerboard", "TurntableScanMethod"] } name_for_cid[8203] = "SurfaceScanRegistrationMethodType" cid_concepts[8203] = {"DCM": ["IterativeClosestPoint", "Freehand", "FiducialAlignment"]} name_for_cid[8300] = "VisualEvaluationMethod" cid_concepts[8300] = { "DCM": [ "GrayscaleResolutionEvaluation", "OverallImageQualityEvaluation", "LuminanceUniformityEvaluation", "LuminanceResponseEvaluation", "ClinicalEvaluation", "AngularViewingEvaluation", "PixelFaultsEvaluation", "ChromaticityEvaluation", "GeometricalImageEvaluation", "VeilingGlareEvaluation", ] } name_for_cid[8301] = "TestPatternCode" cid_concepts[8301] = { "DCM": [ "TG18LPV50Pattern", "TG18LPH50Pattern", "TG18LPH10Pattern", "TG18LPV10Pattern", "TG18LPH89Pattern", "TG18RV89Pattern", "TG18RV50Pattern", "TG18CXPattern", "TG18PXPattern", "TG18RV10Pattern", "BN05Pattern", "BN04Pattern", "BN06Pattern", "BN01Pattern", "GDPattern", "BN03Pattern", "BN02Pattern", "TG18GQPattern", "TG18GVNPattern", "TG18GQBPattern", "ANGPattern", "TG18GQNPattern", "OIQPattern", "TG18NS50Pattern", "TG18NS10Pattern", "TG18GVPattern", "TG18NS89Pattern", "TG18AFCPattern", "TG18LPV89Pattern", "TG18LN1216Pattern", "TG18LN1215Pattern", "TG18LN1217Pattern", "TG18LN1212Pattern", "TG18LN1211Pattern", "TG18LN1214Pattern", "TG18LN1213Pattern", "TG18LN1208Pattern", "TG18LN1210Pattern", "TG18LN1209Pattern", "TG18RH89Pattern", "TG18RH50Pattern", "TG18ADPattern", "TG18UNL80Pattern", "TG18RH10Pattern", "TG18MPPattern", "TG18UN10Pattern", "TG18LN1218Pattern", "TG18UNL10Pattern", "TG18UN80Pattern", "TG18LN815Pattern", "TG18LN812Pattern", "TG18LN811Pattern", "TG18LN814Pattern", "TG18LN813Pattern", "TG18LN808Pattern", "DINResolutionPattern", "TG18LN807Pattern", "DINGeometryPatternBild3", "TG18LN810Pattern", "TG18LN809Pattern", "TG18LN806Pattern", "DINGrayscalePatternBild2", "TG18LN1205Pattern", "TG18LN1204Pattern", "TG18LN1207Pattern", "TG18LN1206Pattern", "TG18LN1201Pattern", "TG18LN818Pattern", "SMPTEPattern", "TG18LN1203Pattern", "TG18LN1202Pattern", "TG18LN817Pattern", "TG18LN816Pattern", "WhitePattern", "BN16Pattern", "BN15Pattern", "BN12Pattern", "BN11Pattern", "BN14Pattern", "BN13Pattern", "TG18CHImage", "BN08Pattern", "TG18GA30Pattern", "BN07Pattern", "BN10Pattern", "TG18KNImage", "BN09Pattern", "TG18GA15Pattern", "TG18GA10Pattern", "TG18GA25Pattern", "TG18GA20Pattern", "TG18GA03Pattern", "TG18GA08Pattern", "TG18GA05Pattern", "TG18LN805Pattern", "TG18LN804Pattern", "TG18LN801Pattern", "TG18CTPattern", "TG18LN803Pattern", "TG18LN802Pattern", "TG18QCPattern", "BN18Pattern", "TG18PQCPattern", "TG18BRPattern", "BN17Pattern", "TG18MM2Image", "TG18MM1Image", ] } name_for_cid[8302] = "MeasurementPatternCode" cid_concepts[8302] = {"DCM": ["TG18UNL80Pattern", "TG18UNL10Pattern"]} name_for_cid[8303] = "DisplayDeviceType" cid_concepts[8303] = { "DCM": [ "CRTFrontProjectionSystem", "DLPRearProjectionSystem", "OLED", "CRTRearProjectionSystem", "DLPFrontProjectionSystem", "CRTDisplay", "PlasmaDisplay", "LiquidCrystalDisplay", ] } name_for_cid[9000] = "PhysicalQuantityDescriptor" cid_concepts[9000] = { "DCM": [ "SourceImageDiffusionBValue", "ModelFittingMethod", "Derivation", "Finding", "EquivalentMeaningOfConceptName", ], "NCIt": ["ReferenceRegion"], "SCT": ["Quantity", "FindingSite", "MeasurementMethod"], } name_for_cid[9231] = "WorkitemDefinition" cid_concepts[9231] = { "DCM": [ "NoSubsequentWorkitems", "AddAddendumToReport", "Print", "ReportVerification", "Transcription", "Interpretation", "ComputerAidedDetection", "ComputerAidedDiagnosis", "QualityControl", "MediaImport", "ImageProcessing", ] } name_for_cid[9233] = "RequestedReportType" cid_concepts[9233] = {"DCM": ["FinalReport", "PreliminaryReport"]} name_for_cid[9241] = "RadiotherapyGeneralWorkitemDefinition" cid_concepts[9241] = { "DCM": [ "RTPatientSetup", "RTPatientPositionInTreatmentSessionReview", "RTTreatmentQAByRTIonPlanDifferenceCheck", "RTTreatmentSimulationWithInternalVerification", "RTBrachyTreatment", "RTTreatmentQAByRTPlanDifferenceCheck", "RTPatientPositionAdjustment", "RTTreatmentQAByRTIonPlanDoseCheck", "RTMachineQA", "RTTreatmentQAByRTPlanDoseCheck", "RTTreatmentQAWithExternalVerification", "RTTreatmentWithExternalVerification", "RTTreatmentQAWithInternalVerification", "RTTreatmentSimulationWithExternalVerification", "RTImageGuidedPatientPositioningAndTreatmentDelivery", "RTTreatmentWithInternalVerification", "RTTreatmentWithAdHocPlanning", ] } name_for_cid[9242] = "RadiotherapyAcquisitionWorkitemDefinition" cid_concepts[9242] = { "DCM": [ "RTPatientPositionAcquisitionSinglePlaneMV", "RTPatientPositionAcquisitionUltrasound", "RTPatientPositionAcquisitionSpatialFiducials", "RTPatientPositionAcquisitionOptical", "RTPatientPositionAcquisitionCTKv", "RTPatientPositionAcquisitionCTMV", "RTPatientPositionAcquisitionSinglePlaneKv", "RTPatientPositionAcquisitionMR", "RTPatientPositionAcquisitionFilmCassetteKv", "RTPatientPositionAcquisitionFilmCassetteMV", "RTPatientPositionAcquisitionIntegratedDoseMV", "RTPatientPositionAcquisitionConventionalCTMV", "RTPatientPositionAcquisitionConeBeamCTMV", "RTPatientPositionAcquisitionConventionalCTKv", "RTPatientPositionAcquisitionConeBeamCTKv", ] } name_for_cid[9243] = "RadiotherapyRegistrationWorkitemDefinition" cid_concepts[9243] = { "DCM": [ "RTPatientPositionRegistrationSinglePlane", "RTPatientPositionRegistrationDualPlane", "RTPatientPositionRegistrationSpatialFiducials", "RTPatientPositionRegistrationUltrasound", "RTPatientPositionRegistration2DOn3DReference", "RTPatientPositionRegistrationOptical", "RTPatientPositionRegistration3DCTVolumeBased", "RTPatientPositionRegistrationMR", "RTPatientPositionRegistration3DOn2DReference", "RTPatientPositionRegistration3DCTGeneral", "RTPatientPositionRegistration3DCTMarkerBased", ] } name_for_cid[9250] = "ScheduledProcessingParameterConceptCodesforRTTreatment" cid_concepts[9250] = {"DCM": ["TreatmentDeliveryType"]} name_for_cid[9260] = "RadiotherapyAcquisitionWorkItemSubtasks" cid_concepts[9260] = { "DCM": [ "RTPatientPositionAcquisitionSinglePlaneMV", "RTPatientPositionAcquisitionCTKv", "RTPatientPositionAcquisitionCTMV", "RTPatientPositionAcquisitionDualPlaneKv", "RTPatientPositionAcquisitionDualPlaneKvMV", "RTPatientPositionAcquisitionDualPlaneMV", "RTPatientPositionAcquisitionSinglePlaneKv", "RTPatientPositionAcquisitionFilmCassetteKv", "RTPatientPositionAcquisitionFilmCassetteMV", "RTPatientPositionAcquisitionIntegratedDoseMV", "RTPatientPositionAcquisitionConventionalCTMV", "RTPatientPositionAcquisitionConeBeamCTMV", "RTPatientPositionAcquisitionConventionalCTKv", "RTPatientPositionAcquisitionConeBeamCTKv", ] } name_for_cid[9261] = "PatientPositionAcquisitionRadiationSourceLocations" cid_concepts[9261] = { "DCM": ["NominalRadiationSourceLocation", "NominalImagingSourceLocation"] } name_for_cid[9262] = "EnergyDerivationTypes" cid_concepts[9262] = { "DCM": ["ConfiguredDefaultImagingEnergy", "ConfiguredLowestImagingEnergy"] } name_for_cid[9263] = "KVImagingAcquisitionTechniques" cid_concepts[9263] = { "DCM": [ "RTPatientPositionAcquisitionFilmCassetteKv", "RTPatientPositionAcquisitionConventionalCTKv", "RTPatientPositionAcquisitionConeBeamCTKv", "RTPatientPositionAcquisitionCTKv", "RTPatientPositionAcquisitionSinglePlaneKv", ] } name_for_cid[9264] = "MVImagingAcquisitionTechniques" cid_concepts[9264] = { "DCM": [ "RTPatientPositionAcquisitionSinglePlaneMV", "RTPatientPositionAcquisitionFilmCassetteMV", "RTPatientPositionAcquisitionIntegratedDoseMV", "RTPatientPositionAcquisitionConventionalCTMV", "RTPatientPositionAcquisitionConeBeamCTMV", "RTPatientPositionAcquisitionCTMV", ] } name_for_cid[9265] = "PatientPositionAcquisitionProjectionTechniques" cid_concepts[9265] = { "DCM": [ "RTPatientPositionAcquisitionFilmCassetteKv", "RTPatientPositionAcquisitionSinglePlaneMV", "RTPatientPositionAcquisitionFilmCassetteMV", "RTPatientPositionAcquisitionIntegratedDoseMV", "RTPatientPositionAcquisitionSinglePlaneKv", ] } name_for_cid[9266] = "PatientPositionAcquisition–CTTechniques" cid_concepts[9266] = { "DCM": [ "RTPatientPositionAcquisitionConventionalCTMV", "RTPatientPositionAcquisitionConeBeamCTMV", "RTPatientPositionAcquisitionConventionalCTKv", "RTPatientPositionAcquisitionConeBeamCTKv", "RTPatientPositionAcquisitionCTKv", "RTPatientPositionAcquisitionCTMV", ] } name_for_cid[9267] = "PatientPositioningRelatedObjectPurposes" cid_concepts[9267] = {"DCM": ["RTPatientPositioningReferenceImage"]} name_for_cid[9268] = "PatientPositionAcquisitionDevices" cid_concepts[9268] = { "SCT": [ "DigitalImagerRadiationTherapy", "XRayFilmCassetteManual", "DigitalImagingScannerComputedRadiography", "MagneticResonanceImagingUnit", ] } name_for_cid[9269] = "RTRadiationMetersetUnits" cid_concepts[9269] = {"UCUM": ["MonitorUnits", "Second"]} name_for_cid[9270] = "AcquisitionInitiationTypes" cid_concepts[9270] = { "DCM": [ "AcquisitionInitiationByTriggeringParameter", "AcquisitionInitiationAfterEndOfRadiation", "AcquisitionInitiationBeforeStartOfRadiation", "AcquisitionInitiationNotDefined", ] } name_for_cid[9271] = "RTImagePatientPositionAcquisitionDevices" cid_concepts[9271] = { "SCT": ["DigitalImagerRadiationTherapy", "XRayFilmCassetteManual"] } name_for_cid[9272] = "RTROIImageAcquisitionContext" cid_concepts[9272] = { "DCM": [ "CentralBreathingPosition", "PostVoiding", "PriorToVoiding", "PreSurgicalAnatomy", ], "SCT": [ "ValsalvaManeuver", "EmptyRectum", "FullRectum", "Expiration", "ShallowBreathing", "Inspiration", "AutonomousBreathing", "PostSurgicalAnatomy", ], } name_for_cid[9273] = "PatientPositionAcquisition–MRTechniques" cid_concepts[9273] = {"DCM": ["RTPatientPositionAcquisitionMR"]} name_for_cid[9300] = "ProcedureDiscontinuationReason" cid_concepts[9300] = { "DCM": [ "WorkitemExpired", "WorkitemAssignmentRejectedByAssignedResource", "ExtravasationVisibleInImage", "ResourcePreEmpted", "MediaFailure", "ObjectSetIncomplete", "ObjectTypesNotSupported", "ObjectsIncorrectlyFormatted", "DiscontinuedProcedureStepReschedulingRecommended", "DiscontinuedProcedureStepRescheduled", "ResourceInadequate", "PatientConditionPreventedContinuing", "IncorrectWorklistEntrySelected", "DiscontinuedForUnspecifiedReason", "IncorrectSideOrdered", "NursingUnitCancel", "DuplicateOrder", "EquipmentChange", "PatientDied", "PatientAllergicToMediaContrast", "IncorrectProcedureOrdered", "EquipmentFailure", "DoctorCanceledProcedure", "ChangeOfProcedureForCorrectCharging", "PatientPregnant", "PatientDidNotArrive", "PatientTakenForTreatmentOrSurgery", "PatientRefusedToContinueProcedure", ], "SCT": [ "RadiopharmaceuticalAdverseReaction", "PallorPaleComplexion", "InjectionSiteNerveDamage", "InjectionSiteFibrosis", "InjectionSiteExtravasation", "Cough", "ChillsAndFever", "InjectionSiteHypersensitivity", "InjectionSitePigmentationChange", "InjectionSiteScar", "InjectionSiteIrritation", "NauseaAndVomiting", "Sweating", "InjectionSiteAnesthesia", "FacialSwelling", "InjectionSiteInduration", "InjectionSiteUrticaria", "Bronchospasm", "InjectionSiteMalabsorption", "InjectionSiteSterileAbscess", "Headache", "SensationOfBeingWarm", "TachycardiaBradycardia", "InjectionSiteNecrosis", "Anxiety", "InjectionSiteDermatitis", "InjectionSiteDisorder", "Shaking", "InjectionSiteBruising", "DrugInducedFlushing", "CardiacArrhythmia", "LaryngealEdema", "InjectionSiteThrombosis", "InjectionSiteAbscess", "DrugInducedDizziness", "CardiorespiratoryArrest", "InjectionSiteCyst", "Hypertension", "InjectionSiteEdema", "Dyspnea", "InjectionSiteAtrophy", "DrugInducedHypotension", "InjectionSiteBurning", "InjectionSiteHemorrhage", "InjectionSiteUlcer", "EpilepticConvulsions", "Itching", "DrugRash", "InjectionSiteInflammation", "InjectionSiteInfection", "Hypotension", "DiffuseInflammatoryErythema", "TasteSenseAltered", "InjectionSiteParesthesia", "NasalCongestion", "NoMotorResponseToCommand", "InjectionSitePain", "InjectionSiteMass", "InjectionSiteGranuloma", ], } name_for_cid[9301] = "ModalityPPSDiscontinuationReason" cid_concepts[9301] = { "DCM": [ "PatientDied", "PatientConditionPreventedContinuing", "PatientAllergicToMediaContrast", "IncorrectWorklistEntrySelected", "IncorrectProcedureOrdered", "DiscontinuedForUnspecifiedReason", "EquipmentFailure", "IncorrectSideOrdered", "DoctorCanceledProcedure", "NursingUnitCancel", "DuplicateOrder", "ChangeOfProcedureForCorrectCharging", "PatientPregnant", "PatientDidNotArrive", "PatientTakenForTreatmentOrSurgery", "PatientRefusedToContinueProcedure", "EquipmentChange", ], "SCT": ["RadiopharmaceuticalAdverseReaction", "InjectionSiteExtravasation"], } name_for_cid[9302] = "MediaImportPPSDiscontinuationReason" cid_concepts[9302] = { "DCM": [ "IncorrectWorklistEntrySelected", "MediaFailure", "DiscontinuedForUnspecifiedReason", "ObjectSetIncomplete", "EquipmentFailure", "ObjectTypesNotSupported", "ObjectsIncorrectlyFormatted", "DuplicateOrder", ] } name_for_cid[9303] = "InterpretationRequestDiscontinuationReason" cid_concepts[9303] = { "DCM": [ "ResourcePreEmpted", "PatientDied", "IncorrectProcedureOrdered", "DiscontinuedForUnspecifiedReason", "ObjectSetIncomplete", "DoctorCanceledProcedure", "DuplicateOrder", "InterpretationRequiresSpecialistExpertise", "InsufficientQualityForInterpretation", "WorkitemAssignmentRejectedByAssignedResource", "ChangeOfProcedureForCorrectCharging", ] } name_for_cid[9401] = "IEC61217DevicePositionParameter" cid_concepts[9401] = { "DCM": [ "IEC61217TableTopLongitudinalPosition", "IEC61217TableTopVerticalPosition", "IEC61217GantryContinuousRollAngle", "IEC61217GantryContinuousPitchAngle", "IEC61217GantryContinuousYawAngle", "IEC61217PatientSupportContinuousYawAngle", "IEC61217TableTopContinuousPitchAngle", "IEC61217TableTopContinuousRollAngle", "IEC61217TableTopEccentricAxisDistance", "IEC61217TableTopContinuousEccentricAngle", "IEC61217TableTopLateralPosition", ] } name_for_cid[9402] = "IEC61217GantryPositionParameter" cid_concepts[9402] = { "DCM": [ "IEC61217GantryContinuousRollAngle", "IEC61217GantryContinuousPitchAngle", "IEC61217GantryContinuousYawAngle", ] } name_for_cid[9403] = "IEC61217PatientSupportPositionParameter" cid_concepts[9403] = { "DCM": [ "IEC61217TableTopLongitudinalPosition", "IEC61217TableTopVerticalPosition", "IEC61217PatientSupportContinuousYawAngle", "IEC61217TableTopContinuousPitchAngle", "IEC61217TableTopContinuousRollAngle", "IEC61217TableTopEccentricAxisDistance", "IEC61217TableTopContinuousEccentricAngle", "IEC61217TableTopLateralPosition", ] } name_for_cid[9500] = "DosimetricObjectiveType" cid_concepts[9500] = { "DCM": [ "SpecifiedConformationNumber", "SpecifiedHealthyTissueConformityIndex", "SpecifiedConformityIndex", "MinimumPercentVolumeAtRadiationDose", "MinimumRadiationDose", "MaximumSurfaceRadiationDose", "MinimumSurfaceRadiationDose", "SpecifiedHomogeneityIndex", "MinimizeMeterset", "MinimumEquivalentUniformDose", "MaximumAbsoluteVolumeAtRadiationDose", "MaximumMeanRadiationDose", "MinimumAbsoluteVolumeAtRadiationDose", "MinimumMeanRadiationDose", "MaximumPercentVolumeAtRadiationDose", "MaximumRadiationDose", "PrescriptionRadiationDose", "MaximumEquivalentUniformDose", ] } name_for_cid[9501] = "PrescriptionAnatomyCategory" cid_concepts[9501] = { "DCM": ["ExternalBodyModel", "NonSpecificVolume"], "SCT": ["AnatomicalStructure", "PhysicalObject"], } name_for_cid[9502] = "RTSegmentAnnotationCategory" cid_concepts[9502] = { "DCM": [ "RTGeometricInformation", "RTDoseCalculationStructure", "RTTarget", "ExternalBodyModel", "NonSpecificVolume", "BrachytherapyDevice", "FixationOrPositioningDevice", "RadiotherapyFiducial", "RadiotherapyDoseRegion", "RTRegistrationMark", "PatientAttachedDoseControlObject", ], "SCT": [ "Function", "Tissue", "SpatialAndRelationalConcept", "Substance", "MorphologicallyAbnormalStructure", "AnatomicalStructure", "PhysicalObject", "BodySubstance", ], } name_for_cid[9503] = "RadiotherapyTherapeuticRoleCategory" cid_concepts[9503] = { "DCM": ["RTRegistrationMark", "RTDoseCalculationStructure", "RTTarget"] } name_for_cid[9504] = "RTGeometricInformation" cid_concepts[9504] = { "DCM": [ "PatientSetupPoint", "ReferenceAcquisitionPoint", "MoveableLaserPatientSetupPoint", "RoomLaserPatientSetupPoint", "IsocentricTreatmentLocationPoint", ] } name_for_cid[9505] = "FixationorPositioningDevice" cid_concepts[9505] = { "DCM": [ "RectalBalloon", "VaginalCylinder", "Mold", "HeadAndNeckMask", "HeadMask", "Headframe", "BodyFrame", "HeadFixationBoard", "HandGrips", "BreastBoard", "AbdominalCompressionArch", "HeelStop", "AbdominalCompressionBelt", "ShinRest", "Cast", "BreastBridge", "WholeBodyPod", "VacuumMold", "SeatPan", ], "SCT": [ "Chair", "Armrest", "Table", "Stretcher", "Backrest", "Wall", "Headrest", "BiteBlock", "Floor", ], } name_for_cid[9506] = "BrachytherapyDevice" cid_concepts[9506] = { "DCM": [ "BrachytherapyChannelShield", "BrachytherapySourceApplicator", "BrachytherapyChannel", ] } name_for_cid[9507] = "ExternalBodyModel" cid_concepts[9507] = {"DCM": ["ExtendedPatientAnatomyModel", "PatientAnatomyModel"]} name_for_cid[9508] = "NonspecificVolume" cid_concepts[9508] = {"DCM": ["UnclassifiedVolume", "UnclassifiedCombination"]} name_for_cid[9509] = "PurposeofReferenceforRTPhysicianIntentInput" cid_concepts[9509] = { "DCM": [ "HistoricalRTPrescription", "RTPrescriptionInputImages", "DiagnosticSourceImages", "RegistrationResult", "SegmentationResult", ], "LN": ["RelevantDiagnosticTestsAndOrLaboratoryData"], } name_for_cid[9510] = "PurposeofReferenceforRTTreatmentPlanningInput" cid_concepts[9510] = { "DCM": [ "RTTreatmentPlanningInputImages", "DiagnosticSourceImages", "RegistrationResult", "SegmentationResult", "RTPrescriptionResultForRTTreatmentPlanning", ] } name_for_cid[9511] = "GeneralExternalRadiotherapyProcedureTechnique" cid_concepts[9511] = { "DCM": [ "StaticBeam", "SlidingWindowBeam", "StepAndShootBeam", "ConformalArcBeam", "ArcBeam", "VMAT", ] } name_for_cid[9512] = "TomotherapeuticRadiotherapyProcedureTechnique" cid_concepts[9512] = {"DCM": ["TopographicBeam", "HelicalBeam"]} name_for_cid[9513] = "FixationDevice" cid_concepts[9513] = { "DCM": [ "RectalBalloon", "Mold", "HeadAndNeckMask", "HeadMask", "Headframe", "VaginalCylinder", "BodyFrame", "HeadFixationBoard", "HandGrips", "BreastBoard", "AbdominalCompressionArch", "HeelStop", "AbdominalCompressionBelt", "ShinRest", "Cast", "BreastBridge", "WholeBodyPod", "VacuumMold", "SeatPan", ], "SCT": ["Backrest", "Armrest", "Headrest", "BiteBlock"], } name_for_cid[9514] = "AnatomicalStructureforRadiotherapy" cid_concepts[9514] = { "BARI": [ "_1stMarginalCoronaryArteryLaterals", "_2ndMarginalCoronaryArteryLaterals", "_3rdMarginalCoronaryArteryLaterals", "_1stDiagonalCoronaryArteryLaterals", "_2ndDiagonalCoronaryArteryLaterals", "RamusLaterals", "_3rdDiagonalCoronaryArteryLaterals", "PosteriorDescendingSeptalPerforators", ], "DCM": [ "AorticKnob", "ArchOfTheAzygosVein", "SecondaryPulmonaryLobule", "Hiatus", "AzygoesophagealRecessInterface", "ParaspinalLine", "PosteriorTrachealStripe", "RightTrachealStripe", "Stripe", "MidlungWindow", "CarinaAngle", "CentrilobularStructures", "AnteriorJunctionLine", "PosteriorJunctionLine", "SurfaceOfTheChoroidScleraInterface", "OuterSurfaceOfTheBM", "OuterSurfaceOfTheCC", "PosteriorSurfaceOfTheRPE", "SurfaceOfTheCenterOfTheRPE", "OuterSurfaceOfIPL", "OuterSurfaceOfGCL", "OuterSurfaceOfOPL", "OuterSurfaceOfINL", "SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors", "OuterSurfaceOfHFL", "AnteriorSurfaceOfTheRPE", "SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE", "OuterSurfaceOfRNFL", ], "FMA": [ "SubcorticalGrayMatter", "ArcuateFasciculus", "WallOfGallbladder", "LumenOfGallbladder", ], "SCT": [ "ProfundaFemorisVein", "LeftHypochondriacRegion", "SternocleidomastoidMuscle", "TruncusCoeliacus", "C3C4Disc", "InferiorLongitudinalFasciculus", "BasilarArtery", "ParanasalSinus", "PelvicCavityTrue", "BrainCerebrospinalFluidPathway", "WristJoint", "MidCircumflexCoronaryArtery", "CouinaudHepaticSegmentII", "CentralRetinalVein", "IntermediateArteryRamus", "GenicularArtery", "LeftVentricleInflow", "FontanelOfSkull", "SigmoidColon", "GastricArtery", "SubscapularisMuscle", "ExternalEar", "LeftVentricleOutflowTract", "RightFemoralArtery", "Intracranial", "JawRegion", "Calcaneus", "SolealVein", "IntercostalArtery", "PeripheralNerve", "LobarArtery", "TeresMajorMuscle", "PatentDuctusArteriosus", "ThighPerforator", "MesentericVein", "Pituitary", "MaleInternalGenitalia", "MidRightCoronaryArtery", "IntraThoracic", "PalatineBone", "CoronaryArtery", "RightBranchOfHepaticArtery", "UpperLimb", "DuraMater", "ExternalIliacVein", "PulmonaryArteriovenousFistula", "StructureOfDescendingThoracicAorta", "ParietalBone", "Flank", "Maxilla", "EsophagealHiatus", "CentralRetinalArtery", "Neurohypophysis", "SegmentalArtery", "BrachialVein", "RightUpperQuadrantOfAbdomen", "T10Vertebra", "Eye", "SuperficialPalmarArch", "Prostate", "HepaticArtery", "FacialBones", "Back", "PeronealArtery", "Duodenum", "RightHypochondriacRegion", "_1stMarginalCoronaryArtery", "SuperiorMesentericVein", "LumbarArtery", "Cornea", "Larynx", "PeronealVein", "L4Vertebra", "FemoralArtery", "IliacVein", "Ovary", "Urethra", "CoronaryArteryGraft", "Head", "AdrenalGland", "MitralValve", "AcromioclavicularJoint", "UmbilicalRegion", "SupraspinatusMuscle", "CongenitalCoronaryArteryFistulaToRightVentricle", "Calyx", "PosteriorMedialTributary", "PulmonaryVeinGreatVessel", "T3T4Disc", "SoftPalate", "T4Vertebra", "Submental", "ExternalIntercostalMuscle", "CranialVenousSystem", "NucleusAccumbens", "GiacominiVein", "PoplitealFossa", "MiddleCerebellarPeduncle", "PulmonaryArteryConduit", "InternalCarotidArteryC5Segment", "FissureOfLung", "RightVentricle", "LevatoresCostarumMuscles", "FrontalLobe", "VagusNerve", "Adventitia", "HeadAndNeck", "Hypopharynx", "RightCoronaryArteryOstium", "HepaticVein", "MarginalCoronaryArtery", "InternalMammaryArtery", "Bladder", "Vulva", "LargeIntestine", "EntorhinalCortex", "Forearm", "BronchialArtery", "NeckChestAndAbdomen", "CouinaudHepaticSegmentIII", "ExternalCarotidArtery", "SuperiorMesentericArtery", "TemporalLobe", "SystemicArtery", "PosteriorTibialArtery", "FemoralVein", "RightAuricularAppendage", "GreatSaphenousVeinOfThigh", "IntraAbdominopelvic", "LeftHepaticVein", "L5Vertebra", "SuperficialFemoralArtery", "VomerBone", "UterusAndFallopianTubes", "Arachnoid", "_2ndMarginalCoronaryArtery", "T11T12Disc", "SuperiorCerebellarPeduncle", "AorticArch", "Carina", "Telencephalon", "LeftBranchOfHepaticArtery", "ArcuateArteryOfTheKidney", "Heart", "TarsalJoint", "CephalicVein", "LingualArtery", "Lip", "GastricVein", "AirwayStructure", "CongenitalCoronaryArteryFistulaToRightAtrium", "DeltoidMuscle", "LeftMainCoronaryArtery", "CerebralFornix", "Penis", "Baffle", "InferiorRightHepaticVein", "VentricularVein", "CarotidSiphon", "SystemicVenousAtrium", "PlantarArterialArch", "L1L2Disc", "Parathyroid", "AnomalousPulmonaryVein", "Scapula", "LesserSaphenousVein", "Kidney", "AutonomicNerve", "GreatSaphenousVein", "T1T2Disc", "OmentalBursa", "InternalCarotidArtery", "L1Vertebra", "Ureter", "RightPosteriorAVCoronaryArtery", "UlnarVein", "FascialLayer", "MiddleEar", "InternalAuditoryCanal", "CouinaudHepaticSegmentV", "RightPulmonaryArtery", "RenalPelvis", "ProperHepaticArtery", "InterlobarArteryOfKidney", "Thrombus", "VenousNetwork", "SubcostalMuscle", "CorpusCallosum", "CommonAtrium", "PerforatingArteryOfKidney", "Humerus", "T5T6Disc", "Ilium", "AorticFistula", "InternalCarotidArteryC6Segment", "LeftLumbarRegion", "ILMInternalLimitingMembrane", "NasalBone", "AnteriorTibialArtery", "CranialNerve", "Cervix", "SkinOfAbdomen", "LeftAnteriorDescendingCoronaryArtery", "Artery", "CommonCarotidArtery", "Buttock", "InnermostIntercostalMuscles", "_3rdMarginalCoronaryArtery", "FallopianTube", "MastoidBone", "Vein", "CommonIliacArteryBifurcation", "MiddleHepaticVein", "CouinaudHepaticSegmentVI", "CerebrospinalFluid", "EsophagealArtery", "T8T9Disc", "Thigh", "RadialVein", "InferiorRightPulmonaryVein", "Trachea", "PulmonaryValveSinuses", "LeftPosterolateralCircumflexCoronaryArtery", "UterineArtery", "BodyConduit", "Thalamus", "EndoVesical", "RightVentricleInflow", "MesentericArtery", "LeftLowerQuadrantOfAbdomen", "MuscleOfHead", "SpinalCerebrospinalFluidPathway", "MiddleCerebralArteryM1Segment", "CouinaudHepaticSegmentIV", "ExternalJugularVein", "SesamoidBonesOfFoot", "InternalIliacArtery", "SuperiorVenaCava", "C2C3Disc", "AbdominalWallMuscle", "SixthLumbarArtery", "PosteriorArchVein", "AnteriorSpinalArtery", "AnusRectumAndSigmoidColon", "Omentum", "SplenicVein", "Colon", "SubmandibularGland", "CentralNervousSystem", "CarotidBifurcation", "T3Vertebra", "InnominateArtery", "SplenicArtery", "Extremity", "FacialArtery", "AccessoryRenalArtery", "BoneStructureOfHeadAndOrNeck", "EpigastricRegion", "Media", "SeminalVesicle", "CervicoThoracicSpine", "DistalCircumflexCoronaryArtery", "RightLumbarRegion", "TeresMinorMuscle", "BoneOfUpperLimb", "DorsalisPedisArtery", "Vagina", "LongissimusMuscle", "LowerInnerQuadrantOfBreast", "Clavicle", "ParotidGland", "AorticIsthmus", "CommonFemoralVein", "SubstantiaNigra", "_1stLeftPosterolateralCoronaryArtery", "Subxiphoid", "UpperInnerQuadrantOfBreast", "Diaphragm", "C5Vertebra", "ThoracicAorta", "RightInguinalRegion", "VasDeferens", "T6T7Disc", "AxillaryArtery", "LeftPulmonaryArtery", "Ileum", "SalivaryGland", "VertebralArtery", "TransjugularIntrahepaticPortosystemicShunt", "RightLowerQuadrantOfAbdomen", "SupraRenalAorta", "InternalJugularVein", "LacrimalArteryOfRightEye", "CockettPerforatingVein", "ChordaeTendineaeCordis", "SacroiliacJoint", "RightMainBronchus", "ScalenousAnteriorMuscle", "AVGrooveContinuationOfCircumflexArtery", "EntireBody", "TesticularArtery", "Thumb", "HypogastricRegion", "GreatCardiacVein", "HyoidBone", "C2Vertebra", "ThoracicDuct", "MiddleLobeOfRightLung", "BoydPerforatingVein", "BodyCavity", "Peritioneum", "CommonIliacArtery", "SupraclavicularRegionOfNeck", "Meninges", "T12Vertebra", "C3Vertebra", "Shoulder", "TransversusThoracis", "CardiacSeptumProsthesis", "CerebellarWhiteMatter", "L2L3Disc", "InterventricularSeptum", "C5C6Disc", "_2ndLeftPosterolateralCoronaryArtery", "MiddleCerebralArteryM2Segment", "Cingulum", "LowerLobeOfLung", "TesticularVein", "AnteriorTibialVein", "LacrimalBone", "BasilicVein", "LeftInguinalRegion", "RightCoronaryArtery", "HunterianPerforatingVein", "Putamen", "ProfundaFemorisArtery", "CostocervicalTrunk", "Pharynx", "FifthLumbarArtery", "AxillaryVein", "LigamentumArteriosum", "Nasopharynx", "C6C7Disc", "SuprapulmonicValveArea", "SympatheticTrunk", "LobeOfLung", "SubclavianVein", "PulmonaryValve", "ExternalIliacArtery", "ProximalRightCoronaryArtery", "TemporalBone", "BoneOfLowerLimb", "Midbrain", "OvarianVein", "PosteriorCerebralArtery", "ErectorSpinaeMuscle", "DeepPalmarVenousArch", "ApexOfRightVentricle", "T2T3Disc", "C1Vertebra", "LateralCalfPerforator", "Phantom", "Mouth", "PharynxAndLarynx", "CarotidArtery", "FourthLumbarArtery", "SmallestCardiacVein", "ThirdLumbarArtery", "LimbicLobe", "SkinOfChest", "UmbilicalArtery", "Cheek", "LymphNode", "PrimitiveAorta", "RadialArtery", "T2Vertebra", "LeftFemoralArtery", "LumenOfBloodVessel", "TrapeziusMuscle", "Esophagus", "AntecubitalVein", "SpinalCordGrayMatter", "Mandible", "LateralCorticospinalTract", "Parasternal", "LeftMainBronchus", "BroadLigament", "SystemicVein", "OccipitalLobe", "C7T1Disc", "CerebralAqueduct", "Insula", "Pelvis", "PulmonaryVein", "MuscleOfNeck", "SubclavianArtery", "Amygdala", "Lung", "SacroCoccygealSpine", "_3rdLeftPosterolateralCoronaryArtery", "OpticChiasm", "OphthalmicArtery", "PancreaticDuct", "Nose", "Hand", "PectoralisMajorMuscle", "LeftMainCoronaryArteryOstium", "T9Vertebra", "CardiovascularSystem", "CouinaudHepaticSegmentI", "OvarianArtery", "ElbowJoint", "Hippocampus", "Sternum", "NeckAndChest", "RightVentricleOutflowTract", "GlobusPallidus", "SuperficialFemoralVein", "SuperiorLeftPulmonaryVein", "LeftPosteriorDescendingCircumflexCoronaryArtery", "BileDuct", "SystemicCollateralArteryToLung", "AbdomenAndPelvis", "UpperOuterQuadrantOfBreast", "PancreaticDuctAndBileDuctSystems", "ApexOfLeftVentricle", "PericardialCavity", "PulmonaryArtery", "Skull", "MidLeftAnteriorDescendingCoronaryArtery", "C6Vertebra", "CerebralHemisphere", "AtrioventricularVein", "Thyroid", "EthmoidBone", "OpticRadiation", "InfraRenalAorta", "SternoclavicularJoint", "ThoracoLumbarSpine", "T7Vertebra", "EndoNasopharyngeal", "Breast", "EsophagusStomachAndDuodenum", "Neck", "AxillaryFascia", "CarotidBulb", "Finger", "PoplitealVein", "InfraspinatusMuscle", "PiaMater", "TricuspidValve", "RightAtrium", "CouinaudHepaticSegmentVII", "VascularSclerosis", "SuperiorPhrenicArtery", "CommonVentricle", "DistalLeftAnteriorDescendingCoronaryArtery", "InnerEar", "Coccyx", "AtrialSeptalDefect", "RightPulmonaryVein", "TemporomandibularJoint", "Uterus", "Ventricle", "DescendingAorta", "TracheaAndBronchus", "Testis", "ProximalLeftAnteriorDescendingCoronaryArtery", "OccipitalBone", "L2Vertebra", "Eyeball", "Face", "Spine", "UrinarySystem", "BrainStem", "Foot", "WhiteMatter", "MuscleOfUpperLimb", "PeripheralNervousSystem", "PinealGland", "UpperLobeOfLung", "PosterolateralBranchOfRightCoronaryArtery", "Zygoma", "InnominateVein", "Abdomen", "ProximalCircumflexCoronaryArtery", "LowerLimb", "PosteriorCommunicationArtery", "JuxtaposedAtrialAppendage", "VertebralColumnAndCranium", "Jejunum", "CarotidBody", "ChestAbdomenAndPelvis", "AbdominalAorta", "RightHepaticVein", "GastrocnemiusVein", "Scalp", "Tongue", "ChestWallMuscle", "GrayMatter", "Fibula", "SuperiorLongitudinalFasciculus", "OrbitalStructure", "InferiorCardiacVein", "LeftMainBranchOfPortalVein", "InternalIntercostalMuscle", "LateralVentricle", "CaudateNucleus", "LacrimalArtery", "OccipitalArtery", "Brain", "BloodVessel", "Sclera", "AnteriorPosteriorCerebralArteryBifurcation", "LiverAndBiliaryStructure", "AtrialVein", "_1stDiagonalCoronaryArtery", "SuprasternalNotch", "Perineum", "InteratrialSeptum", "Femur", "Rectum", "AnteriorCardiacVein", "T10T11Disc", "Pancreas", "BoneOfThorax", "LeftAtrium", "InterlobularArteryOfKidney", "CerebralArtery", "CouinaudHepaticSegmentVIII", "InferiorMesentericArtery", "DigitalArteryOfHand", "SecondLumbarArtery", "IliocostalisMuscle", "_1stRightPosterolateralCoronaryArtery", "BladderAndUrethra", "CervicalSpine", "IliacAndOrFemoralArtery", "SpinalCordWhiteMatter", "Sacrum", "SmallIntestine", "FemaleInternalGenitalia", "SuperiorRightPulmonaryVein", "T8Vertebra", "InferiorVenaCava", "MaleExternalGenitalia", "IntraArticular", "Axilla", "RetroperitonealSpace", "Thymus", "ELMExternalLimitingMembrane", "AnteriorMiddleCerebralArteryBifurcation", "ParietalLobe", "SuperiorThyroidArtery", "IliacArtery", "T12L1Disc", "DistalRightCoronaryArtery", "CerebralCortex", "TruncusArteriosusCommunis", "T1Vertebra", "Tooth", "Joint", "SubmandibularArea", "GreatSaphenousVeinOfCalf", "LeftPulmonaryVein", "PectoralisMinorMuscle", "OpticCanal", "Aorta", "SuperficialTemporalArtery", "MedialLemniscus", "Diencephalon", "CongenitalCoronaryArteryFistulaToLeftVentricle", "NeckChestAbdomenAndPelvis", "InferiorCerebellarPeduncle", "RightMainBranchOfPortalVein", "SphenoidBone", "T6Vertebra", "LatissimusDorsiMuscle", "ChestAndAbdomen", "Spleen", "CommonHepaticArtery", "C4Vertebra", "AnkleJoint", "LowerOuterQuadrantOfBreast", "C4C5Disc", "Mediastinum", "Cerebellum", "FirstLumbarArtery", "PoplitealArtery", "UpperUrinaryTract", "PulmonaryVenousAtrium", "Bronchus", "PulmonaryChamberOfCorTriatriatum", "T9T10Disc", "DorsalScapularArtery", "CommonBileDuct", "UlnarArtery", "L3L4Disc", "LeftVentricle", "LumbarRegion", "CostalCartilage", "ThoracicSpine", "FourthVentricle", "SaphenousVein", "T5Vertebra", "Gallbladder", "_2ndRightPosterolateralCoronaryArtery", "RenalArtery", "PeritonealCavity", "HipJoint", "UpperArm", "OpticTract", "TrunkOfPulmonaryArtery", "Chest", "GastroduodenalArtery", "L3Vertebra", "T4T5Disc", "AzygosVein", "BrachialArtery", "C7Vertebra", "_2ndDiagonalCoronaryArtery", "Liver", "Hip", "Rib", "L5S1Disc", "PelvisAndLowerExtremities", "SerratusAnteriorMuscle", "CommonFemoralArtery", "SmallCardiacVein", "IntraPelvic", "SuperficialPalmarVenousArch", "Vertebra", "Stomach", "CircumflexCoronaryArtery", "AnteriorCommunicatingArtery", "CongenitalCoronaryArteryFistulaToLeftAtrium", "InferiorMesentericVein", "T7T8Disc", "VenaCava", "MedianCubitalVein", "CoronarySinus", "HilarArtery", "TerminalInternalCarotidArtery", "LeftCoronaryArtery", "BiliaryTract", "ApexOfLung", "ThirdVentricle", "Atrium", "CerebralWhiteMatter", "Knee", "_3rdDiagonalCoronaryArtery", "SpinalisMuscle", "SubarachnoidSpace", "PulmonaryVeinConfluence", "SaphenofemoralJunction", "EyeRegion", "BrainVentricle", "Anus", "UmbilicalVein", "FrontalBone", "CommonIliacVein", "TrabeculaeCarnae", "InguinalRegion", "PosteriorCerebralArteryP1Segment", "_3rdRightPosterolateralCoronaryArtery", "EndoNasal", "LumbarSpine", "ThyrocervicalTrunk", "InferiorPhrenicArtery", "PrimitivePulmonaryArtery", "HilumOfLung", "SellaTurcica", "PortalVein", "Scrotum", "PosteriorCerebralCommissure", "InferiorLeftPulmonaryVein", "UncinateFasciculus", "Intima", "AnteriorCerebralArtery", "LowerLeg", "RenalVein", "L4L5Disc", "InternalIliacVein", "IlealVein", "Ear", "Toe", "SpinalCord", "MiddleCardiacVein", "T11Vertebra", "Pericardium", "MiddleCerebralArtery", "PosteriorCerebralArteryP2Segment", "PosteriorDescendingRightCoronaryArtery", "CorpusStriatum", "LeftAuricularAppendage", "PelvicCavityFalse", "CircleOfWillis", "Adenohypophysis", "PosteriorTibialVein", "SaphenopoplitealJunction", "_1stSeptalCoronaryArtery", "MuscleOfLowerLimb", "Eyelid", "AscendingAorta", "LeftUpperQuadrantOfAbdomen", "DeepPalmarArchOfRadialArtery", "PericardiophrenicArtery", "Pleura", "HypochondriacRegion", "ExternalAuditoryCanal", "Patella", "SegmentOfLung", "OccipitalVein", "LumboSacralSpine", "DoddPerforatingVein", ], } name_for_cid[9515] = "RTPatientSupportDevice" cid_concepts[9515] = {"SCT": ["Chair", "Table", "Wall", "Stretcher", "Floor"]} name_for_cid[9516] = "RadiotherapyBolusDeviceType" cid_concepts[9516] = {"SCT": ["SurfaceBolus"]} name_for_cid[9517] = "RadiotherapyBlockDeviceType" cid_concepts[9517] = {"DCM": ["ApertureBlock"], "SCT": ["ShieldingBlock"]} name_for_cid[9518] = "RadiotherapyAccessoryNoSlotHolderDeviceType" cid_concepts[9518] = {"DCM": ["AccessoryTray"]} name_for_cid[9519] = "RadiotherapyAccessorySlotHolderDeviceType" cid_concepts[9519] = {"DCM": ["RadiotherapyApplicator"]} name_for_cid[9520] = "SegmentedRTAccessoryDevice" cid_concepts[9520] = { "DCM": [ "BrachytherapyChannel", "RectalBalloon", "AccessoryTray", "ApertureBlock", "VaginalCylinder", "RadiotherapyApplicator", "Mold", "HeadAndNeckMask", "BrachytherapyChannelShield", "HeadMask", "BrachytherapySourceApplicator", "Headframe", "BodyFrame", "HeadFixationBoard", "HandGrips", "BreastBoard", "AbdominalCompressionArch", "HeelStop", "AbdominalCompressionBelt", "ShinRest", "Cast", "BreastBridge", "WholeBodyPod", "VacuumMold", "SeatPan", ], "SCT": [ "ShieldingBlock", "Chair", "Armrest", "Table", "Stretcher", "Backrest", "Wall", "SurfaceBolus", "Headrest", "BiteBlock", "Floor", ], } name_for_cid[9521] = "RadiotherapyTreatmentEnergyUnit" cid_concepts[9521] = {"UCUM": ["Kilovolt", "Megavolt", "MegaElectronVolt"]} name_for_cid[9522] = "MultiSourceRadiotherapyProcedureTechnique" cid_concepts[9522] = {"DCM": ["MultipleFixedSources"]} name_for_cid[9523] = "RoboticRadiotherapyProcedureTechnique" cid_concepts[9523] = { "DCM": ["SynchronizedRoboticTreatment", "NonSynchronizedRoboticTreatment"] } name_for_cid[9524] = "RadiotherapyProcedureTechnique" cid_concepts[9524] = { "DCM": [ "StaticBeam", "SlidingWindowBeam", "SynchronizedRoboticTreatment", "StepAndShootBeam", "MultipleFixedSources", "ConformalArcBeam", "ArcBeam", "TopographicBeam", "HelicalBeam", "VMAT", "NonSynchronizedRoboticTreatment", ] } name_for_cid[9525] = "RadiationTherapyParticle" cid_concepts[9525] = {"SCT": ["Electron", "Photon"]} name_for_cid[9526] = "IonTherapyParticle" cid_concepts[9526] = { "DCM": [ "_16OxygenNucleus", "_12CarbonNucleus", "_4HeliumNucleus", "_3HeliumNucleus", ], "NCIt": ["Ion"], "SCT": ["Proton"], } name_for_cid[9527] = "TeletherapyIsotope" cid_concepts[9527] = {"SCT": ["_60Cobalt"]} name_for_cid[9528] = "BrachytherapyIsotope" cid_concepts[9528] = { "SCT": [ "_32Phosphorus", "_222Radon", "_252Californium", "_198Gold", "_90Strontium", "_137Cesium", "_125Iodine", "_226Radium", "_90Yttrium", "_103Palladium", "_169Ytterbium", "_131Cesium", "_60Cobalt", "_106Ruthenium", "_192Iridium", ] } name_for_cid[9529] = "SingleDoseDosimetricObjective" cid_concepts[9529] = { "DCM": [ "MinimumRadiationDose", "MaximumSurfaceRadiationDose", "MinimumSurfaceRadiationDose", "MinimumEquivalentUniformDose", "MaximumMeanRadiationDose", "MinimumMeanRadiationDose", "MaximumRadiationDose", "PrescriptionRadiationDose", "MaximumEquivalentUniformDose", ] } name_for_cid[9530] = "PercentageandDoseDosimetricObjective" cid_concepts[9530] = { "DCM": [ "MinimumPercentVolumeAtRadiationDose", "MaximumPercentVolumeAtRadiationDose", ] } name_for_cid[9531] = "VolumeandDoseDosimetricObjective" cid_concepts[9531] = { "DCM": [ "MaximumAbsoluteVolumeAtRadiationDose", "MinimumAbsoluteVolumeAtRadiationDose", ] } name_for_cid[9532] = "NoParameterDosimetricObjective" cid_concepts[9532] = {"DCM": ["MinimizeMeterset"]} name_for_cid[9533] = "DeliveryTimeStructure" cid_concepts[9533] = { "DCM": [ "ContinuousPermanent", "ContinuousTemporary", "HyperFractionation", "HypoFractionation", "StandardFractionation", "SingleFraction", ] } name_for_cid[9534] = "RadiotherapyTarget" cid_concepts[9534] = { "DCM": [ "CTVPrimary", "PTVPrimary", "PTVNodal", "RadiationDoseReferencePoint", "GTVPrimary", "RadiationDoseNormalizationPoint", "GTVNodal", "ITV", "EntireBodyTargetVolume", "CTVNodal", "TreatedVolume", ], "SCT": ["IrradiatedVolume", "GTV", "PTV", "CTV"], } name_for_cid[9535] = "RadiotherapyDoseCalculationRole" cid_concepts[9535] = { "DCM": [ "AvoidanceVolume", "PlanningOrganAtRiskVolume", "RadiationInteractionVolume", "RadiationDoseShapingVolume", "OrganAtRisk", "DoseCalculationBoundingVolume", "ConformalityShell", ] } name_for_cid[9536] = "RadiotherapyPrescribingandSegmentingPersonRole" cid_concepts[9536] = { "DCM": ["LeadRadiologicTechnologist"], "SCT": [ "RadiologicTechnologist", "Resident", "MedicalPractitioner", "Physician", "RadiationTherapist", ], "UMLS": ["ConsultingPhysician", "RadiationPhysicist", "MedicalPhysicist"], } name_for_cid[9537] = "EffectiveDoseCalculationMethodCategory" cid_concepts[9537] = { "DCM": [ "FractionationBasedOrTemporallyBasedMethods", "RadiationTransportBasedMethods", ] } name_for_cid[9538] = "RadiationTransportBasedEffectiveDoseMethodModifier" cid_concepts[9538] = {"DCM": ["LocalEffectModel", "MicrodosimetricKineticModel"]} name_for_cid[9539] = "FractionationBasedEffectiveDoseMethodModifer" cid_concepts[9539] = { "DCM": [ "LinearQuadraticModelForLowDoseRateBrachytherapy", "LinearQuadraticLinearModel", "LinearQuadraticModelWithTimeFactor", "LinearQuadraticModel", "Equivalent2GrayFractionsModel", ] } name_for_cid[9540] = "MovableBeamLimitingDeviceType" cid_concepts[9540] = { "DCM": ["SingleLeaves", "VariableCircularCollimator", "LeafPairs", "JawPair"] } name_for_cid[9541] = "BeamLimitingDeviceType" cid_concepts[9541] = { "DCM": [ "SingleLeaves", "PhotonFixedAperture", "VariableCircularCollimator", "ElectronFixedAperture", "ApertureBlock", "LeafPairs", "JawPair", "IntraoperativeFixedAperture", ], "SCT": ["ShieldingBlock"], } name_for_cid[9542] = "CompensatorDeviceType" cid_concepts[9542] = {"DCM": ["PhysicalCompensator"]} name_for_cid[9543] = "RadiotherapyTreatmentMachineMode" cid_concepts[9543] = {"DCM": ["TotalSkinIrradiation", "TotalBodyIrradiation"]} name_for_cid[9544] = "RadiotherapyDistanceReferenceLocation" cid_concepts[9544] = { "DCM": ["TreatmentMachineIsocenter", "NominalRadiationSourceLocation"] } name_for_cid[9545] = "FixedBeamLimitingDeviceType" cid_concepts[9545] = { "DCM": [ "PhotonFixedAperture", "ElectronFixedAperture", "ApertureBlock", "IntraoperativeFixedAperture", ], "SCT": ["ShieldingBlock"], } name_for_cid[9546] = "RadiotherapyWedgeType" cid_concepts[9546] = {"DCM": ["DynamicWedge", "MotorizedWedge", "HardWedge"]} name_for_cid[9547] = "RTBeamLimitingDeviceOrientationLabel" cid_concepts[9547] = {"DCM": ["YOrientation", "XOrientation"]} name_for_cid[9548] = "GeneralAccessoryDeviceType" cid_concepts[9548] = { "DCM": [ "BowtieFilter", "WinstonLutzPointer", "FilmHolder", "Graticule", "ImageDetector", "Reticle", ] } name_for_cid[9549] = "RadiationGenerationModeType" cid_concepts[9549] = { "DCM": [ "FlatteningFilterBeam", "PartialFlatteningFilterBeam", "NonFlatteningFilterBeam", ] } name_for_cid[9550] = "CArmPhotonElectronDeliveryRateUnit" cid_concepts[9550] = {"UCUM": ["MonitorUnitsPerSecond"]} name_for_cid[9551] = "TreatmentDeliveryDeviceType" cid_concepts[9551] = {"DCM": ["RadiotherapyTreatmentDevice"]} name_for_cid[9552] = "CArmPhotonElectronDosimeterUnit" cid_concepts[9552] = {"UCUM": ["MonitorUnits"]} name_for_cid[9553] = "TreatmentPoint" cid_concepts[9553] = {"DCM": ["IsocentricTreatmentLocationPoint"]} name_for_cid[9554] = "EquipmentReferencePoint" cid_concepts[9554] = { "DCM": [ "TreatmentMachineIsocenter", "NominalRadiationSourceLocation", "FixedLaserSetupPoint", ] } name_for_cid[9555] = "RadiotherapyTreatmentPlanningPersonRole" cid_concepts[9555] = { "DCM": ["PhysicsAssistant"], "NCIt": ["Dosimetrist"], "SCT": ["Resident", "MedicalPractitioner", "Physician"], "UMLS": ["ConsultingPhysician", "RadiationPhysicist", "MedicalPhysicist"], } name_for_cid[9556] = "RadiotherapyRoboticNodeSet" cid_concepts[9556] = { "DCM": ["QANode", "QANodePair", "TrigeminalNodeSet", "BodyNodeSet", "HeadNodeSet"] } name_for_cid[9557] = "TomotherapeuticDosimeterUnit" cid_concepts[9557] = {"UCUM": ["MonitorUnits", "Second"]} name_for_cid[9558] = "TomotherapeuticDoseRateUnit" cid_concepts[9558] = {"UCUM": ["GrayPerSecond", "MonitorUnitsPerSecond"]} name_for_cid[9559] = "RoboticDeliveryDeviceDosimeterUnit" cid_concepts[9559] = {"UCUM": ["MonitorUnits"]} name_for_cid[9560] = "RoboticDeliveryDeviceDoseRateUnit" cid_concepts[9560] = {"UCUM": ["GrayPerSecond"]} name_for_cid[9561] = "TreatmentTerminationReason" cid_concepts[9561] = { "DCM": [ "PatientConditionPreventedContinuing", "MachineClearanceInterlock", "DiscontinuedForUnspecifiedReason", "OutOfToleranceInterlock", "AccessoryClearanceInterlock", "PatientClearanceInterlock", "ScanSpotPositionInterlock", "ScanSpotInterlock", "OperatorError", "MLCPositionInterlock", "PatientMovement", "RadiationDetectedDuringBeamHoldInterlock", "ScanSpotMetersetInterlock", "ScanSpotSizeInterlock", "PatientDied", "SecondaryFluenceMonitoringSystemInterlock", "PrimaryFluenceMonitoringSystemInterlock", "EquipmentFailure", "DoctorCanceledProcedure", "PatientMotionInterlock", "BeamEnergyInterlock", "ChannelObstruction", "DoorInterlock", "MetersetRateInterlock", "TimerInterlock", "ClearanceInterlock", "PatientRefusedToContinueProcedure", "DoseLimitInterlock", ] } name_for_cid[9562] = "RadiotherapyTreatmentDeliveryPersonRole" cid_concepts[9562] = { "DCM": ["PhysicsAssistant"], "NCIt": ["Dosimetrist"], "SCT": ["Resident", "MedicalPractitioner", "RadiationTherapist", "Physician"], "UMLS": ["ConsultingPhysician", "RadiationPhysicist", "MedicalPhysicist"], } name_for_cid[9563] = "RadiotherapyInterlockResolution" cid_concepts[9563] = { "DCM": [ "InterlockOverridden", "TreatmentTerminated", "InterlockResolved", "PatientRepositioned", ] } name_for_cid[9564] = "TreatmentSessionConfirmationAssertion" cid_concepts[9564] = { "DCM": [ "BlockPresent", "Conepresent", "BolusPresent", "ApplicatorPresent", "HeadframePresent", ] } name_for_cid[9565] = "TreatmentToleranceViolationCause" cid_concepts[9565] = { "DCM": [ "MachineCalibrationAdjustment", "ChangeInPatientAnatomy", "MachineNotAvailable", "InappropriatePatientPosition", "MachineCapabilityLicenseExpired", "UnavailabilityOfABeamModifier", "InappropriatePatientOrientation", ] } name_for_cid[9566] = "ClinicalToleranceViolationType" cid_concepts[9566] = { "DCM": [ "MetersetToleranceViolation", "BeamTargetingToleranceViolation", "DeliveryRateToleranceViolation", ] } name_for_cid[9567] = "MachineToleranceViolationType" cid_concepts[9567] = { "DCM": [ "DoseRateToleranceViolation", "SourcePositionToleranceViolation", "MLCPositionToleranceViolation", "JawPositionToleranceViolation", ] } name_for_cid[9568] = "RadiotherapyTreatmentInterlock" cid_concepts[9568] = { "DCM": [ "SecondaryFluenceMonitoringSystemInterlock", "MachineClearanceInterlock", "PrimaryFluenceMonitoringSystemInterlock", "PatientMotionInterlock", "OutOfToleranceInterlock", "BeamEnergyInterlock", "DoorInterlock", "AccessoryClearanceInterlock", "MetersetRateInterlock", "TimerInterlock", "PatientClearanceInterlock", "ScanSpotPositionInterlock", "ScanSpotInterlock", "MLCPositionInterlock", "RadiationDetectedDuringBeamHoldInterlock", "ClearanceInterlock", "ScanSpotMetersetInterlock", "DoseLimitInterlock", "ScanSpotSizeInterlock", ] } name_for_cid[9569] = "IsocentricPatientSupportPositionParameter" cid_concepts[9569] = { "DCM": [ "IsocentricPatientSupportContinuousPitchAngle", "IsocentricPatientSupportContinuousRollAngle", "IsocentricPatientSupportContinuousYawAngle", "IsocentricPatientSupportLateralPosition", "IsocentricPatientSupportLongitudinalPosition", "IsocentricPatientSupportVerticalPosition", ] } name_for_cid[9570] = "RTOverriddenTreatmentParameter" cid_concepts[9570] = { "DCM": [ "IEC61217TableTopLongitudinalPosition", "IEC61217TableTopVerticalPosition", "IEC61217GantryContinuousRollAngle", "IEC61217GantryContinuousPitchAngle", "IEC61217GantryContinuousYawAngle", "IsocentricPatientSupportContinuousPitchAngle", "IEC61217PatientSupportContinuousYawAngle", "IsocentricPatientSupportContinuousRollAngle", "IEC61217TableTopContinuousPitchAngle", "IsocentricPatientSupportContinuousYawAngle", "IEC61217TableTopContinuousRollAngle", "IsocentricPatientSupportLateralPosition", "IEC61217TableTopEccentricAxisDistance", "IsocentricPatientSupportLongitudinalPosition", "IEC61217TableTopContinuousEccentricAngle", "IsocentricPatientSupportVerticalPosition", "IEC61217TableTopLateralPosition", ] } name_for_cid[9571] = "PatientTreatmentPreparationMethod" cid_concepts[9571] = { "DCM": [ "IsocentricSetupMethod", "SkinAppositionSetupMethod", "StereotacticSetupMethod", "TBISetupMethod", "ControlledSSDSetupMethod", "OcularGazeSetupMethod", ] } name_for_cid[9572] = "PatientShieldingDevice" cid_concepts[9572] = { "DCM": ["IndependentRadiationShield", "CavityRadiationShield"], "SCT": ["GonadRadiationShield", "EyeRadiationShield"], } name_for_cid[9573] = "PatientTreatmentPreparationDevice" cid_concepts[9573] = { "DCM": [ "RectalBalloon", "IndependentRadiationShield", "CavityRadiationShield", "VaginalCylinder", "InfraredMarker", "RadiofrequencyTransponder", "MechanicalPointer", "OpticalDistanceMeter", "OcularFixationLight", "CombinedStructuredLightThermalImager", "ThermalImager", "RadioactiveMarker", "LaserCrossHairs", "OpticalSurfaceScanner", "Mold", "HeadAndNeckMask", "PatientDistractionDevice", "HeadMask", "CoachingDevice", "Headframe", "LaserSurfaceScan", "BodyFrame", "HeadFixationBoard", "HandGrips", "BreastBoard", "AbdominalCompressionArch", "HeelStop", "AbdominalCompressionBelt", "ShinRest", "Cast", "BreastBridge", "WholeBodyPod", "VacuumMold", "SeatPan", ], "SCT": [ "Chair", "Armrest", "GonadRadiationShield", "Table", "Stretcher", "Backrest", "Wall", "Headrest", "EyeRadiationShield", "BiteBlock", "Floor", ], } name_for_cid[9574] = "PatientPositionDisplacementReferencePoint" cid_concepts[9574] = { "DCM": [ "PatientSetupPoint", "MoveableLaserPatientSetupPoint", "RoomLaserPatientSetupPoint", "IsocentricTreatmentLocationPoint", ] } name_for_cid[9575] = "PatientAlignmentDevice" cid_concepts[9575] = { "DCM": [ "LaserSurfaceScan", "InfraredMarker", "RadiofrequencyTransponder", "MechanicalPointer", "OpticalDistanceMeter", "OcularFixationLight", "CombinedStructuredLightThermalImager", "ThermalImager", "RadioactiveMarker", "LaserCrossHairs", "OpticalSurfaceScanner", ] } name_for_cid[9576] = "ReasonsforRTRadiationTreatmentOmission" cid_concepts[9576] = { "DCM": [ "RTRadiationPreviouslyDelivered", "TreatmentExceedsPatientTolerance", "TreatmentUnnecessary", ] } name_for_cid[9577] = "PatientTreatmentPreparationProcedure" cid_concepts[9577] = { "DCM": [ "CollisionChecks", "PatientAlignmentProcedure", "PatientFixationProcedure", "PatientShieldingProcedure", "PatientMotionManagementSetupProcedure", ], "SCT": ["PlacingRestraint", "Sedation", "VitalSignsMonitoring"], } name_for_cid[9578] = "MotionManagementSetupDevice" cid_concepts[9578] = {"DCM": ["PatientDistractionDevice", "CoachingDevice"]} name_for_cid[9579] = "RTSegmentMaterial" cid_concepts[9579] = { "DCM": ["TitaniumAlloyTitaniumMolybdenum15Zirconium5Aluminium3"], "SCT": [ "Polymer", "CarbonFiber", "StainlessSteelMaterial", "GoldAlloy", "NickelTitanium", ], } name_for_cid[9580] = "RTSegmentationPropertyCategory" cid_concepts[9580] = { "DCM": [ "RTGeometricInformation", "RTTarget", "ExternalBodyModel", "NonSpecificVolume", "BrachytherapyDevice", "FixationOrPositioningDevice", "RadiotherapyFiducial", "RadiotherapyDoseRegion", "PatientAttachedDoseControlObject", ], "SCT": [ "Function", "Tissue", "SpatialAndRelationalConcept", "Substance", "MorphologicallyAbnormalStructure", "AnatomicalStructure", "PhysicalObject", "BodySubstance", ], } name_for_cid[9581] = "RadiotherapyRegistrationMark" cid_concepts[9581] = {"DCM": ["FiducialMark"]} name_for_cid[9582] = "RadiotherapyDoseRegion" cid_concepts[9582] = {"DCM": ["IsodoseVolume"]} name_for_cid[9583] = "RTPlanRadiotherapyProcedureTechnique" cid_concepts[9583] = { "DCM": [ "StaticBeam", "SlidingWindowBeam", "StepAndShootBeam", "ConformalArcBeam", "ArcBeam", "TopographicBeam", "HelicalBeam", "VMAT", ] } name_for_cid[10000] = "ScopeofAccumulation" cid_concepts[10000] = { "DCM": [ "ProcedureStepToThisPoint", "Study", "Series", "PerformedProcedureStep", "IrradiationEvent", ] } name_for_cid[10001] = "UIDType" cid_concepts[10001] = { "DCM": [ "StudyInstanceUID", "PerformedProcedureStepSOPInstanceUID", "SeriesInstanceUID", "IrradiationEventUID", ] } name_for_cid[10002] = "IrradiationEventType" cid_concepts[10002] = { "DCM": ["StationaryAcquisition", "SteppingAcquisition", "RotationalAcquisition"], "SCT": ["Fluoroscopy"], } name_for_cid[10003] = "EquipmentPlaneIdentification" cid_concepts[10003] = {"DCM": ["AllPlanes", "PlaneA", "PlaneB", "SinglePlane"]} name_for_cid[10004] = "FluoroMode" cid_concepts[10004] = {"DCM": ["Continuous", "Pulsed"]} name_for_cid[10005] = "XRayRadiationDoseProcedureTypeReported" cid_concepts[10005] = { "SCT": [ "ConeBeamComputedTomography", "DualEnergyXRayAbsorptiometry", "DentalRadiography", "PlainRadiography", "ComputedTomography", "Fluoroscopy", "FluoroscopyAndRadiography", "Mammography", ] } name_for_cid[10006] = "XRayFilterMaterial" cid_concepts[10006] = { "SCT": [ "Copper", "Niobium", "Tin", "Molybdenum", "Silver", "Aluminum", "Europium", "Tantalum", "Rhodium", "Lead", ] } name_for_cid[10007] = "XRayFilterType" cid_concepts[10007] = { "DCM": ["StripFilter", "NoFilter", "WedgeFilter", "ButterflyFilter", "FlatFilter"] } name_for_cid[10008] = "DoseRelatedDistanceMeasurement" cid_concepts[10008] = { "DCM": [ "DistanceSourceToTablePlane", "DistanceSourceToDetector", "TableHeightEndPosition", "TableLateralEndPosition", "TableLateralPosition", "TableLongitudinalPosition", "TableXEndPositionToIsocenter", "TableZPositionToIsocenter", "TableZEndPositionToIsocenter", "TableYPositionToIsocenter", "TableXPositionToIsocenter", "TableHeightPosition", "TableYEndPositionToIsocenter", "DistanceSourceToIsocenter", "DistanceSourceToReferencePoint", "TableLongitudinalEndPosition", ] } name_for_cid[10009] = "Measured/Calculated" cid_concepts[10009] = {"SCT": ["Estimated", "Measured", "Calculated"]} name_for_cid[10010] = "DoseMeasurementDevice" cid_concepts[10010] = {"SCT": ["Dosimeter"]} name_for_cid[10011] = "EffectiveDoseEvaluationMethod" cid_concepts[10011] = { "DCM": [ "DLPToEConversionViaMCComputation", "DLPToEConversionViaMeasurement", "CtdifreeairToEConversionViaMCComputation", "CtdifreeairToEConversionViaMeasurement", ] } name_for_cid[10013] = "CTAcquisitionType" cid_concepts[10013] = { "DCM": [ "StationaryAcquisitionCT", "ConstantAngleAcquisition", "FreeAcquisition", "SequencedAcquisition", ], "SCT": ["SpiralAcquisition", "ConeBeamAcquisition"], } name_for_cid[10014] = "ContrastImagingTechnique" cid_concepts[10014] = { "SCT": ["DiagnosticRadiographyWithContrastMedia", "CTWithoutContrast"] } name_for_cid[10015] = "CTDoseReferenceAuthority" cid_concepts[10015] = {"DCM": ["ICRPPub60", "ICRPPub103"]} name_for_cid[10016] = "AnodeTargetMaterial" cid_concepts[10016] = {"SCT": ["Molybdenum", "Tungsten", "Rhodium"]} name_for_cid[10017] = "XRayGrid" cid_concepts[10017] = { "DCM": [ "VirtualGrid", "FixedGrid", "FocusedGrid", "ReciprocatingGrid", "ParallelGrid", "CrossedGrid", "NoGrid", ] } name_for_cid[10020] = "SourceofProjectionXRayDoseInformation" cid_concepts[10020] = { "DCM": [ "SystemCalculated", "CopiedFromImageAttributes", "ManualEntry", "DerivedFromHumanReadableReports", "AutomatedDataCollection", "ComputedFromImageAttributes", "MPPSContent", ], "SCT": ["Dosimeter"], } name_for_cid[10021] = "SourceofCTDoseInformation" cid_concepts[10021] = { "DCM": [ "CopiedFromImageAttributes", "ManualEntry", "DerivedFromHumanReadableReports", "AutomatedDataCollection", "ComputedFromImageAttributes", ] } name_for_cid[10022] = "LabelType" cid_concepts[10022] = {"DCM": ["SeriesNumber", "AcquisitionNumber", "InstanceNumber"]} name_for_cid[10023] = "SizeSpecificDoseEstimationMethodforCT" cid_concepts[10023] = { "DCM": [ "AAPM204EffectiveDiameterEstimatedFromPatientAge", "AAPM204LateralDimension", "ArithmeticAverageOfSSDEZ", "EstimatedFromWaterEquivalentDiameter", "AAPM204SumOfLateralAndAPDimension", "AAPM204APDimension", ] } name_for_cid[10024] = "WaterEquivalentDiameterMethod" cid_concepts[10024] = { "DCM": [ "WaterEquivalentDiameterRepresentativeValue", "WaterEquivalentDiameterFromRawData", "WaterEquivalentDiameterIntegratedAcrossScanRange", "WaterEquivalentDiameterFromLocalizer", ] } name_for_cid[10025] = "RadiationDoseReferencePoint" cid_concepts[10025] = { "DCM": [ "_15cmFromIsocenterTowardSource", "_1cmAboveTabletop", "_30cmInFrontOfImageInputSurface", "_15cmFromTableCenterline", "InDetectorPlane", "_30cmAboveTabletop", "_100cmFromXRaySource", "_4Point2cmAboveBreastSupportSurface", "AtSurfaceOfPatient", ] } name_for_cid[10030] = "DetectorType" cid_concepts[10030] = { "DCM": ["IndirectDetector", "DirectDetector", "StorageDetector", "FilmDetectorType"] } name_for_cid[10031] = "CR/DRMechanicalConfiguration" cid_concepts[10031] = { "DCM": ["TableMount", "UprightStandMount", "UnmountedDetector", "CArmMount"] } name_for_cid[10032] = "ProjectionXRayAcquisitionDeviceType" cid_concepts[10032] = { "DCM": [ "CassetteBasedProjectionRadiographySystem", "IntegratedProjectionRadiographySystem", "FluoroscopyGuidedProjectionRadiographySystem", ] } name_for_cid[10033] = "CTReconstructionAlgorithm" cid_concepts[10033] = {"DCM": ["IterativeReconstruction", "FilteredBackProjection"]} name_for_cid[10034] = "ReasonforRepeatingAcquisition" cid_concepts[10034] = {"DCM": ["SuboptimalContrastTiming", "PatientMotion"]} name_for_cid[10040] = "RadiopharmaceuticalOrganDoseReferenceAuthority" cid_concepts[10040] = { "DCM": [ "InvestigationalNewDrug", "MIRDPamphlet1", "ICRPPublication53", "ICRPPublication80", "ICRPPublication106", "MIRDOSE", "OLINDAEXM", "PackageInsert", "InstitutionallyApprovedEstimates", ] } name_for_cid[10041] = "SourceofRadioisotopeActivityInformation" cid_concepts[10041] = { "DCM": ["DoseCalibrator", "InfusionSystem", "RadioisotopeGenerator"] } name_for_cid[10043] = "IntravenousExtravasationSymptom" cid_concepts[10043] = { "DCM": ["ExtravasationVisibleInImage"], "SCT": [ "InjectionSiteBruising", "InjectionSiteThrombosis", "InjectionSiteAbscess", "InjectionSiteNerveDamage", "InjectionSiteFibrosis", "InjectionSiteHypersensitivity", "InjectionSitePigmentationChange", "InjectionSiteScar", "InjectionSiteIrritation", "InjectionSiteAnesthesia", "InjectionSiteCyst", "InjectionSiteInduration", "InjectionSiteEdema", "InjectionSiteUrticaria", "InjectionSiteAtrophy", "InjectionSiteBurning", "InjectionSiteHemorrhage", "InjectionSiteUlcer", "InjectionSiteMalabsorption", "InjectionSiteSterileAbscess", "InjectionSiteInflammation", "InjectionSiteInfection", "InjectionSiteNecrosis", "InjectionSiteParesthesia", "InjectionSiteDermatitis", "InjectionSiteDisorder", "InjectionSitePain", "InjectionSiteMass", "InjectionSiteGranuloma", ], } name_for_cid[10044] = "RadiosensitiveOrgan" cid_concepts[10044] = { "SCT": [ "Lung", "SmallIntestine", "Breast", "Stomach", "Heart", "Skin", "Thymus", "Prostate", "LymphNode", "Colon", "Uterus", "SalivaryGlands", "Gallbladder", "Testis", "Esophagus", "Bladder", "Brain", "EyeLenses", "OralMucosa", "Ovary", "Muscle", "Pancreas", "BoneMarrow", "Liver", "Thyroid", "Spleen", "Kidney", "AdrenalGland", "BoneSurface", ] } name_for_cid[10045] = "RadiopharmaceuticalPatientState" cid_concepts[10045] = { "DCM": [ "CardiacStressState", "AcuteUnilateralRenalBlockage", "LowThyroidUptake", "HighThyroidUptake", "SeverelyJaundiced", ], "SCT": ["AbnormalRenalFunction", "RestingState"], } name_for_cid[10046] = "GFRMeasurement" cid_concepts[10046] = { "LN": [ "GlomerularFiltrationRateBlackMDRD", "CockroftGaultFormulaEstimationOfGFR", "GlomerularFiltrationRateCystatinBasedFormula", "CKDEPIFormulaEstimationOfGFR", "GlomerularFiltrationRateMDRD", "GlomerularFiltrationRateCreatinineBasedFormulaSchwartz", "GlomerularFiltrationRateNonBlackMDRD", "GlomerularFiltrationRateFemaleMDRD", ] } name_for_cid[10047] = "GFRMeasurementMethod" cid_concepts[10047] = { "DCM": [ "CockroftGaultFormulaEstimationOfGFR", "CKDEPIFormulaEstimationOfGFR", "GlomerularFiltrationRateMDRD", "GlomerularFiltrationRateNonBlackMDRD", "GlomerularFiltrationRateBlackMDRD", "GlomerularFiltrationRateFemaleMDRD", "GlomerularFiltrationRateCystatinBasedFormula", "GlomerularFiltrationRateCreatinineBasedFormulaSchwartz", ] } name_for_cid[10050] = "SummaryRadiationExposureQuantity" cid_concepts[10050] = { "DCM": [ "EffectiveDose", "TotalFluoroTime", "TotalNumberOfRadiographicFrames", "MeanCtdivol", "DoseAreaProductTotal", "CTDoseLengthProductSubTotal", "CTDoseLengthProductTotal", "EntranceExposureAtRP", "AcquisitionDoseAreaProductTotal", "AccumulatedAverageGlandularDose", "FluoroDoseAreaProductTotal", "AdministeredActivity", ] } name_for_cid[10060] = "OrganforRadiationDoseEstimate" cid_concepts[10060] = { "SCT": [ "Lung", "SmallIntestine", "Breast", "Stomach", "Phantom", "Heart", "Skin", "Thymus", "Prostate", "LymphNode", "Colon", "Uterus", "SalivaryGlands", "Gallbladder", "Testis", "Esophagus", "Bladder", "Brain", "EyeLenses", "OralMucosa", "Ovary", "Muscle", "Pancreas", "BoneMarrow", "Liver", "EntireBody", "Thyroid", "Spleen", "Kidney", "AdrenalGland", "BoneSurface", ] } name_for_cid[10061] = "AbsorbedRadiationDoseType" cid_concepts[10061] = { "DCM": [ "MinimumAbsorbedRadiationDose", "MaximumAbsorbedRadiationDose", "ModeAbsorbedRadiationDose", "MeanAbsorbedRadiationDose", "MedianAbsorbedRadiationDose", ] } name_for_cid[10062] = "EquivalentRadiationDoseType" cid_concepts[10062] = { "DCM": [ "MedianEquivalentRadiationDose", "MinimumEquivalentRadiationDose", "MaximumEquivalentRadiationDose", "ModeEquivalentRadiationDose", "MeanEquivalentRadiationDose", ] } name_for_cid[10063] = "RadiationDoseEstimateDistributionRepresentation" cid_concepts[10063] = { "DCM": [ "SkinDoseMap", "DosePointCloud", "DoseGradient", "_3DDoseMap", "DoseImage", "Isodose", ] } name_for_cid[10064] = "PatientModelType" cid_concepts[10064] = { "DCM": ["AnthropomorphicModel", "SimpleObjectModel", "PatientSegmentedModel"] } name_for_cid[10065] = "RadiationTransportModelType" cid_concepts[10065] = { "DCM": [ "MeasuredRadiationDose", "VoxelizedRadiationTransportModel", "GeometricRadiationTransportModel", "NURBSRadiationTransportModel", "MeshRadiationTransportModel", "BREPRadiationTransportModel", ] } name_for_cid[10066] = "AttenuatorCategory" cid_concepts[10066] = { "DCM": [ "BeamBlock", "XRayFilters", "Table", "TableCore", "PatientSupport", "TablePad", "TableOuterLiner", ], "SCT": ["XRayShield", "ShieldingBlock"], } name_for_cid[10067] = "RadiationAttenuatorMaterial" cid_concepts[10067] = { "SCT": [ "CarbonFiber", "Tin", "Tantalum", "Rhodium", "Lead", "Copper", "Niobium", "Molybdenum", "Beryllium", "Silver", "Aluminum", "Europium", ], "UMLS": ["KevlarAramidFiber"], } name_for_cid[10068] = "EstimateMethodType" cid_concepts[10068] = { "DCM": ["TabularDataAlgorithm", "AnalyticalAlgorithm", "EmpiricalAlgorithm"], "MSH": ["MonteCarloMethod"], } name_for_cid[10069] = "RadiationDoseEstimateParameter" cid_concepts[10069] = { "DCM": [ "Distance", "AttenuationCoefficient", "WaterEquivalentDiameterRepresentativeValue", "WaterEquivalentDiameterFromRawData", "WaterEquivalentDiameterIntegratedAcrossScanRange", "PercentFibroglandularTissue", "DistanceCorrection", "BreastThickness", "TissueFraction", "PatientAPDimension", "Dgn", "PatientLateralDimension", "CurveFitParameter", "CorrectionFactor", "Backscatter", "TissueAirRatio", "HomogeneityFactor", "SSDEConversionFactor", "OffsetFactor", "NormalizationFactor", "WaterEquivalentDiameterFromLocalizer", "HalfValueLayer", ], "NCIt": ["UnitConversionFactor"], } name_for_cid[10070] = "RadiationDoseType" cid_concepts[10070] = {"DCM": ["EquivalentDose", "AbsorbedDose"]} name_for_cid[10071] = "RadiationDoseUnit" cid_concepts[10071] = {"UCUM": ["Sv", "Gy"]} name_for_cid[10072] = "ReportedValueType" cid_concepts[10072] = { "SCT": ["Mode", "Nominal", "Minimum", "Yes", "Maximum", "Mean", "Median"] } name_for_cid[10073] = "ValueTiming" cid_concepts[10073] = { "DCM": [ "MiddleOfTimePeriod", "EndOfTimePeriod", "BeginningOfTimePeriod", "DurationOfTimePeriod", ] } name_for_cid[10074] = "RDSRFrameofReferenceOrigin" cid_concepts[10074] = { "DCM": [ "PatientCoordinateSystemOrigin", "IsocenterOrigin", "PatientSupportOrigin", "EquipmentOrigin", "RoomOrigin", ] } name_for_cid[11001] = "PhotoacousticIlluminationMethod" cid_concepts[11001] = { "DCM": [ "SingleSideIllumination", "InterstitialIllumination", "ThroughTransducerIllumination", "MultiSideIllumination", "DualSideIllumination", ] } name_for_cid[11002] = "AcousticCouplingMedium" cid_concepts[11002] = { "SCT": ["UltrasoundCouplingGel", "DeuteriumOxide", "Water", "Air"] } name_for_cid[11003] = "UltrasoundTransducerTechnology" cid_concepts[11003] = { "DCM": [ "InterferometricTransducer", "MEMSBasedTransducer", "PiezocompositeTransducer", ] } name_for_cid[11004] = "SpeedofSoundCorrectionMechanisms" cid_concepts[11004] = { "DCM": [ "DualSpeedOfSoundCorrection", "SpeedOfSoundMapCorrection", "UniformSpeedOfSoundCorrection", ] } name_for_cid[11005] = "PhotoacousticReconstructionAlgorithmFamily" cid_concepts[11005] = {"DCM": ["SphericalBackProjection", "NumericalAcousticModel"]} name_for_cid[11006] = "PhotoacousticImagedProperty" cid_concepts[11006] = { "DCM": [ "Perfusion", "Elasticity", "BloodOxygenationLevel", "BloodDeoxygenationLevel", ], "SCT": ["Hemoglobin", "Melanin", "Water", "Lipid"], } name_for_cid[12001] = "UltrasoundProtocolType" cid_concepts[12001] = { "SCT": [ "TransthoracicEchocardiography", "EllestadProtocol", "DobutamineStressProtocol", "NaughtonProtocol", "StressTestUsingCardiacPacing", "PharmacologicAndExerciseStressTest", "ModifiedNaughtonProtocol", "RampProtocol", "IntravascularEchocardiography", "BalkeProtocol", "BruceProtocol", "ExerciseStressEchocardiography", "FetalEchocardiography", "StressTestUsingBicycleErgometer", "IntraoperativeEchocardiography", "ContrastEchocardiography", "PharmacologicStressProtocol", "PepperProtocol", "AdenosineStressProtocol", "IntracardiacEchocardiography", "DipyridamoleStressProtocol", "EpicardialEchocardiography", "TransesophagealEchocardiography", "ExerciseStressECGTest", "ModifiedBruceProtocol", "Echocardiography", "PediatricEchocardiography", ] } name_for_cid[12002] = "UltrasoundProtocolStageType" cid_concepts[12002] = { "SCT": [ "AfterProcedure", "ValsalvaManeuver", "CardiacStressState", "Hyperventilation", "BeforeProcedure", "PeakCardiacStressState", "CardiacPacing", "CardiacStressRecoveryState", "DuringProcedure", "HandGrip", "RestingState", ] } name_for_cid[12003] = "OBGYNDate" cid_concepts[12003] = { "LN": [ "ConceptionDate", "LMP", "EstimatedLMPByEDD", "EDDFromAverageUltrasoundAge", "EDDFromOvulationDate", "EDD", "EDDFromLMP", "OvulationDate", ] } name_for_cid[12004] = "FetalBiometryRatio" cid_concepts[12004] = {"LN": ["HCAC", "FLAC", "CephalicIndex", "FLBPD", "FLHC"]} name_for_cid[12005] = "FetalBiometryMeasurement" cid_concepts[12005] = { "LN": [ "OccipitalFrontalDiameter", "BPDAreaCorrected", "LeftFetalEarLength", "TransverseAbdominalDiameter", "APADTAD", "CisternaMagnaLength", "AbdominalCircumference", "FemurLength", "ThoracicCircumference", "HeadCircumference", "FootLength", "BiparietalDiameter", "LeftKidneyThickness", "RightFetalEarLength", "TransverseThoracicDiameter", "LeftKidneyLength", "LeftKidneyWidth", "AnteriorPosteriorAbdominalDiameter", "ThoracicArea", "RightKidneyThickness", "AnteriorPosteriorTrunkDiameter", "RightKidneyWidth", "TransverseCerebellarDiameter", "RightKidneyLength", ] } name_for_cid[12006] = "FetalLongBonesBiometryMeasurement" cid_concepts[12006] = { "LN": [ "ClavicleLength", "FemurLength", "FibulaLength", "HumerusLength", "RadiusLength", "TibiaLength", "UlnaLength", ] } name_for_cid[12007] = "FetalCraniumMeasurement" cid_concepts[12007] = { "LN": [ "NuchalFoldThickness", "InnerOrbitalDiameter", "CisternaMagnaLength", "PosteriorHornLateralVentricularWidth", "OuterOrbitalDiameter", "WidthOfHemisphere", "LateralVentricleWidth", "AnteriorHornLateralVentricularWidth", "NuchalTranslucency", "TransverseCerebellarDiameter", ] } name_for_cid[12008] = "OBGYNAmnioticSacMeasurement" cid_concepts[12008] = { "LN": [ "ThirdQuadrantDiameter", "SecondQuadrantDiameter", "AmnioticFluidIndex", "FourthQuadrantDiameter", "FirstQuadrantDiameter", ], "SCT": ["Diameter"], } name_for_cid[12009] = "EarlyGestationBiometryMeasurement" cid_concepts[12009] = { "LN": [ "GestationalSacDiameter", "CrownRumpLength", "SpineLength", "YolkSacLength", "NuchalTranslucency", ] } name_for_cid[12011] = "UltrasoundPelvisandUterusMeasurement" cid_concepts[12011] = {"LN": ["EndometriumThickness", "CervixLength"]} name_for_cid[12012] = "OBEquation/Table" cid_concepts[12012] = { "DCM": ["FWPByGACampbell1991", "FWPByGAHadlock1991"], "LN": [ "ACJeanty1984", "CRLByGARempen1991", "ACJeanty1982", "OFDASUM2000", "FibulaByGAJeanty1983", "CRLHansmann1985", "FemaleSingletonBWPByGAArbuckle1993", "FetalTrunkCrossSectionalAreaOsaka1989", "BPDMertz1988", "HCJeanty1984", "EFWByACFLHCHadlock1985", "FLByGAJeanty1982", "HCMerz1988", "RadiusJeanty1983", "CephalicIndexByGAChitty1994", "FLTokyo1986", "EFWByACBPDFLHadlock1984", "CRLHansmann1986", "ACByGAASUM2000", "BPDTokyo1986", "IODMayden1982", "TibiaJeanty1984", "CRLASUM1991", "EFW1ByShinozuka1996", "GestationalAgeByLMP", "MaleTwinsBWPByGAArbuckle1993", "BDJeanty1982", "HCByGAASUM2000", "BPDByGAJeanty1982", "BPDDoubilet1993", "GSTokyo1986", "EFWByACBPDHadlock1984", "HCByGAMerz1988", "TCDHill1990", "CRLOsaka1989", "HCDerivedChitty1997", "BPDOuterInnerByGAChitty1994", "TADTokyo1986", "ACLessoway1998", "AxtShinozuka1996", "FibulaJeanty1983", "RadiusMerz1987", "EFWByGAHansmann1986", "MaleSingletonBWPByGAArbuckle1993", "FLByGAChitty1994", "OODTrout1994", "EFWByACFLHadlock1984", "EFWByBPDAPADTADFLTokyo1987", "BPDLessoway1998", "FLHansmann1986", "FLShinozuka1996", "OFDLessoway1998", "BPDShinozuka1996", "FLJeanty1984", "ClavicleLengthYarkoni1985", "EFWByBPDFTAFLOsaka1990", "FLMerz1987", "GSByGARempen1991", "BPDJeanty1984", "BPDOuterOuterByGAChitty1994", "GSHellman1969", "HCByGAJeanty1982", "BPDByGAShinozuka1996", "BPDByGAHadlock1984", "OFDByGAChitty1994", "EFWByACHCHadlock1984", "FLHadlock1984", "EFWByACBPDFLHadlock1985", "BpdaHadlock1982", "ACByGAShinozuka1996", "GSNyberg1992", "EFWByACAndBPDShepard1982", "LengthOfVertebraTokyo1986", "CRLJeanty1982", "HCMeasuredChitty1997", "TransverseThoracicDiameterLessoway1998", "HCLessoway1998", "BPDHansmann1986", "TCDGoldstein1987", "ACHansmann1985", "APAbdominalDiameterLessoway1998", "HCACByGACampbell1977", "CRLTokyo1986", "FWPByGAHadlock1985", "FWPByGAAlexander1996", "FLByGAHadlock1984", "CRLNelson1981", "FWPByGABrenner1976", "HumerusJeanty1984", "TCDByGAGoldstein1987", "EFWByGAHadlock1991", "BPDJeanty1982", "CRLJeanty1984", "FLOsaka1989", "HCASUM2000", "EFW3ByShinozuka1996", "FLMerz1988", "TADEriksen1985", "EFWByACFLHadlock1985", "BPDRempen1991", "OFDHansmann1986", "ACMeasuredByGAChitty1994", "ACDerivedByGAChitty1994", "BPDOoChitty1997", "FLByGAShinozuka1996", "BPDKurtz1980", "BPDByGAASUM2000", "GSRempen1991", "HCDerivedByGAChitty1994", "FLHansmann1985", "CRLDaya1993", "BPDByGARempen1991", "TADHansmann1979", "BPDHadlock1984", "GSHansmann1982", "ACByGAMerz1988", "OFDByGAASUM2000", "EFWByACBPDFLHCHadlock1985", "UlnaJeanty1984", "CRLByGAASUM2000", "HumerusLengthOsaka1989", "ACASUM2000", "TransverseThoracicDiameterHansmann1985", "HCHadlock1984", "HCJeanty1982", "ACShinozuka1996", "CRLShinozuka1996", "TCDChitty1994", "FLJeanty1982", "CRLByGAShinozuka1996", "ACHadlock1984", "CRLRobinson1975", "FWPByGAWilliams1982", "FLByGAASUM2000", "HumerusMerz1987", "FemaleTwinsBWPByGAArbuckle1993", "FibulaMerz1987", "EFWByBPDTTDHansmann1986", "CRLHadlock1992", "FLByGAMerz1988", "HumerusLengthASUM2000", "BPDOiChitty1997", "CephalicIndexByGAHadlock1981", "FLLessoway1998", "HCHansmann1986", "SpineLengthTokyo1989", "GSDaya1991", "ACByGAHadlock1984", "IODTrout1994", "EFW2ByShinozuka1996", "BPDOsaka1989", "RadiusByGAJeanty1983", "ACCampbell1975", "BPDSabbagha1978", "AverageUltrasoundAge", "AxtByGAShinozuka1996", "UlnaMerz1987", "FLHohler1982", "HCByGAHadlock1984", "CRLASUM2000", "OFDHansmann1985", "BPDHansmann1985", "BPDByGAMerz1988", "FootLengthMercer1987", "HumerusLengthByGAASUM2000", "GSHansmann1979", "OODMayden1982", "EFWByACCampbell1975", "CRLRempen1991", "TCDNimrod1986", "ACMertz1988", "HCHansmann1985", "ThcChitkara1987", "FLChitty1997", "BPDASUM1989", ], } name_for_cid[12013] = "GestationalAgeEquation/Table" cid_concepts[12013] = { "LN": [ "ACJeanty1984", "ACJeanty1982", "OFDASUM2000", "CRLHansmann1985", "FetalTrunkCrossSectionalAreaOsaka1989", "BPDMertz1988", "HCJeanty1984", "HCMerz1988", "RadiusJeanty1983", "FLTokyo1986", "CRLHansmann1986", "BPDTokyo1986", "IODMayden1982", "TibiaJeanty1984", "CRLASUM1991", "GestationalAgeByLMP", "BDJeanty1982", "BPDDoubilet1993", "GSTokyo1986", "TCDHill1990", "CRLOsaka1989", "HCDerivedChitty1997", "TADTokyo1986", "ACLessoway1998", "AxtShinozuka1996", "FibulaJeanty1983", "RadiusMerz1987", "OODTrout1994", "BPDLessoway1998", "FLHansmann1986", "FLShinozuka1996", "OFDLessoway1998", "BPDShinozuka1996", "FLJeanty1984", "ClavicleLengthYarkoni1985", "FLMerz1987", "BPDJeanty1984", "GSHellman1969", "FLHadlock1984", "BpdaHadlock1982", "GSNyberg1992", "LengthOfVertebraTokyo1986", "CRLJeanty1982", "HCMeasuredChitty1997", "TransverseThoracicDiameterLessoway1998", "HCLessoway1998", "BPDHansmann1986", "TCDGoldstein1987", "ACHansmann1985", "APAbdominalDiameterLessoway1998", "CRLTokyo1986", "CRLNelson1981", "HumerusJeanty1984", "BPDJeanty1982", "CRLJeanty1984", "FLOsaka1989", "HCASUM2000", "FLMerz1988", "TADEriksen1985", "BPDRempen1991", "OFDHansmann1986", "BPDOoChitty1997", "BPDKurtz1980", "GSRempen1991", "FLHansmann1985", "CRLDaya1993", "TADHansmann1979", "BPDHadlock1984", "GSHansmann1982", "UlnaJeanty1984", "HumerusLengthOsaka1989", "ACASUM2000", "TransverseThoracicDiameterHansmann1985", "HCHadlock1984", "HCJeanty1982", "ACShinozuka1996", "CRLShinozuka1996", "TCDChitty1994", "FLJeanty1982", "ACHadlock1984", "CRLRobinson1975", "HumerusMerz1987", "FibulaMerz1987", "CRLHadlock1992", "HumerusLengthASUM2000", "BPDOiChitty1997", "FLLessoway1998", "HCHansmann1986", "SpineLengthTokyo1989", "GSDaya1991", "IODTrout1994", "BPDOsaka1989", "ACCampbell1975", "BPDSabbagha1978", "AverageUltrasoundAge", "UlnaMerz1987", "FLHohler1982", "CRLASUM2000", "OFDHansmann1985", "BPDHansmann1985", "FootLengthMercer1987", "GSHansmann1979", "OODMayden1982", "CRLRempen1991", "TCDNimrod1986", "ACMertz1988", "HCHansmann1985", "ThcChitkara1987", "FLChitty1997", "BPDASUM1989", ] } name_for_cid[12014] = "OBFetalBodyWeightEquation/Table" cid_concepts[12014] = { "LN": [ "EFWByACHCHadlock1984", "EFWByACBPDFLHadlock1985", "EFWByBPDTTDHansmann1986", "EFWByACBPDFLHCHadlock1985", "EFWByACFLHCHadlock1985", "EFWByACBPDHadlock1984", "EFWByACCampbell1975", "EFWByACAndBPDShepard1982", "EFWByACFLHadlock1984", "EFW3ByShinozuka1996", "EFWByBPDAPADTADFLTokyo1987", "EFWByACBPDFLHadlock1984", "EFWByACFLHadlock1985", "EFWByBPDFTAFLOsaka1990", "EFW1ByShinozuka1996", "EFW2ByShinozuka1996", ] } name_for_cid[12015] = "FetalGrowthEquation/Table" cid_concepts[12015] = { "LN": [ "CRLByGAShinozuka1996", "CRLByGARempen1991", "FLByGAHadlock1984", "FLByGAASUM2000", "FibulaByGAJeanty1983", "TCDByGAGoldstein1987", "EFWByGAHansmann1986", "EFWByGAHadlock1991", "FLByGAMerz1988", "FLByGAJeanty1982", "FLByGAChitty1994", "CephalicIndexByGAHadlock1981", "CephalicIndexByGAChitty1994", "ACByGAASUM2000", "ACByGAHadlock1984", "ACMeasuredByGAChitty1994", "ACDerivedByGAChitty1994", "RadiusByGAJeanty1983", "FLByGAShinozuka1996", "GSByGARempen1991", "BPDOuterOuterByGAChitty1994", "BPDByGAASUM2000", "HCByGAJeanty1982", "AxtByGAShinozuka1996", "HCDerivedByGAChitty1994", "BPDByGAShinozuka1996", "HCByGAASUM2000", "BPDByGARempen1991", "HCByGAHadlock1984", "BPDByGAHadlock1984", "OFDByGAChitty1994", "BPDByGAMerz1988", "BPDByGAJeanty1982", "HumerusLengthByGAASUM2000", "ACByGAMerz1988", "OFDByGAASUM2000", "ACByGAShinozuka1996", "CRLByGAASUM2000", "HCByGAMerz1988", "BPDOuterInnerByGAChitty1994", "HCACByGACampbell1977", ] } name_for_cid[12016] = "EstimatedFetalWeightPercentileEquation/Table" cid_concepts[12016] = { "DCM": ["FWPByGACampbell1991", "FWPByGAHadlock1991"], "LN": [ "FWPByGAAlexander1996", "FWPByGAWilliams1982", "MaleTwinsBWPByGAArbuckle1993", "FWPByGABrenner1976", "FemaleSingletonBWPByGAArbuckle1993", "FemaleTwinsBWPByGAArbuckle1993", "MaleSingletonBWPByGAArbuckle1993", "FWPByGAHadlock1985", ], } name_for_cid[12017] = "GrowthDistributionRank" cid_concepts[12017] = {"DCM": ["GrowthZScore", "GrowthPercentileRank"]} name_for_cid[12018] = "OBGYNSummary" cid_concepts[12018] = {"LN": ["NumberOfFetusesByUS", "GestationalAgeByOvulationDate"]} name_for_cid[12019] = "OBGYNFetusSummary" cid_concepts[12019] = { "LN": [ "EFWPercentileRank", "EFWDiscordance", "FetalHeartRate", "GestationalAgeByLMP", "EFWRatio", "GestationalAge", "EstimatedWeight", "CompositeUltrasoundAge", ] } name_for_cid[12020] = "FetalBiometryAnatomicSite" cid_concepts[12020] = { "SCT": [ "Foot", "Femur", "Abdomen", "Cerebellum", "Skull", "Thorax", "CisternaMagna", "Kidney", "Trunk", ] } name_for_cid[12021] = "FetalLongBoneAnatomicSite" cid_concepts[12021] = { "SCT": ["Femur", "Ulna", "RadiusBone", "Clavicle", "Tibia", "Fibula"] } name_for_cid[12022] = "FetalCraniumAnatomicSite" cid_concepts[12022] = { "SCT": [ "Cerebellum", "LateralVentricle", "CerebralHemisphere", "OccipitalRegionOfScalp", "CisternaMagna", "AnteriorHornLateralVentricle", "PosteriorHornLateralVentricle", "Orbit", ] } name_for_cid[12023] = "PelvisandUterusAnatomicSite" cid_concepts[12023] = {"SCT": ["Endometrium", "Cervix", "Uterus"]} name_for_cid[12024] = "VascularUltrasoundReportDocumentTitle" cid_concepts[12024] = { "DCM": ["OBGYNUltrasoundProcedureReport"], "LN": ["USPelvis"], "SCT": ["ObstetricUSScan"], } name_for_cid[12025] = "OBGYNUltrasoundBeamPathUltrasoundBeamPath" cid_concepts[12025] = {"SCT": ["TransAbdominal", "TransVaginal"]} name_for_cid[12030] = "UltrasoundContrast/BolusAgent" cid_concepts[12030] = { "DCM": [ "Sonazoid", "Sonovue", "TargestarB", "TargestarP", "Cardiosphere", "Echovist", "Imagify", "Levovist", ], "NDC": ["Definity", "Optison"], } name_for_cid[12031] = "ProtocolIntervalEvent" cid_concepts[12031] = { "DCM": [ "CessationOfStimulation", "OnsetOfStimulation", "CessationOfExercise", "OnsetOfExercise", "DestructionOfMicrobubbles", "StartOfContrastAgentAdministration", "StartOfDrugDoseAdministration", ] } name_for_cid[12032] = "TransducerScanPattern" cid_concepts[12032] = { "DCM": ["VolumeScanPattern", "PlaneScanPattern", "LineScanPattern"] } name_for_cid[12033] = "UltrasoundTransducerGeometry" cid_concepts[12033] = { "DCM": [ "HemisphericalUltrasoundTransducerGeometry", "PlanarMatrixUltrasoundTransducerGeometry", "RingUltrasoundTransducerGeometry", "RadialUltrasoundTransducerGeometry", "SectorUltrasoundTransducerGeometry", "CurvedLinearUltrasoundTransducerGeometry", "LinearUltrasoundTransducerGeometry", "NonImagingDopplerUltrasoundTransducerGeometry", ] } name_for_cid[12034] = "UltrasoundTransducerBeamSteering" cid_concepts[12034] = { "DCM": ["PhasedBeamSteering", "MechanicalBeamSteering", "FixedBeamDirection"] } name_for_cid[12035] = "UltrasoundTransducerApplication" cid_concepts[12035] = { "DCM": [ "ExternalTransducer", "IntraoperativeTransducer", "EndocavitaryTransducer", "IntravascularTransducer", "EndorectalTransducer", "EndovaginalTransducer", "TransesophagealTransducer", ] } name_for_cid[12100] = "VascularUltrasoundReportDocumentTitle" cid_concepts[12100] = { "LN": [ "USCarotidArteriesReport", "USDopplerExtremityVesselsReport", "USDopplerHeadVesselsReport", "USDopplerVesselsReport", "USArteryReport", "USVeinReport", "USDopplerLowerExtremityVesselsReport", "USDopplerUpperExtremityVesselsReport", "USDopplerAbdominalVesselsReport", ], "SCT": ["PeripheralVascularUltrasoundReport"], } name_for_cid[12101] = "VascularSummary" cid_concepts[12101] = {"DCM": ["Comment"]} name_for_cid[12102] = "TemporalPeriodRelatingtoProcedureorTherapy" cid_concepts[12102] = {"SCT": ["AfterProcedure", "BeforeProcedure", "DuringProcedure"]} name_for_cid[12103] = "VascularUltrasoundAnatomicLocation" cid_concepts[12103] = { "SCT": [ "SubclavianVein", "ProfundaFemorisVein", "InternalCarotidArtery", "ExternalIliacArtery", "UlnarVein", "CeliacAxis", "OvarianVein", "PosteriorCerebralArtery", "BasilarArtery", "DeepPalmarVenousArch", "LateralCalfPerforator", "InferiorVenaCava", "CentralRetinalVein", "ProperHepaticArtery", "InterlobarArteryOfKidney", "GastricArtery", "FourthLumbarArtery", "AnteriorMiddleCerebralArteryBifurcation", "ThirdLumbarArtery", "PerforatingArteryOfKidney", "UmbilicalArtery", "InternalCarotidArteryC6Segment", "RadialArtery", "AnteriorTibialArtery", "SolealVein", "CommonCarotidArtery", "LobarArtery", "GreatSaphenousVeinOfCalf", "ThighPerforator", "CommonIliacArteryBifurcation", "MiddleHepaticVein", "RightMainBranchOfPortalVein", "RadialVein", "RightBranchOfHepaticArtery", "ExternalIliacVein", "CommonHepaticArtery", "UterineArtery", "SubclavianArtery", "CentralRetinalArtery", "FirstLumbarArtery", "OphthalmicArtery", "PoplitealArtery", "SegmentalArtery", "MiddleCerebralArteryM1Segment", "BrachialVein", "InternalIliacArtery", "SuperiorVenaCava", "SuperficialPalmarArch", "UlnarArtery", "OvarianArtery", "SixthLumbarArtery", "PosteriorArchVein", "SplenicVein", "PeronealArtery", "CarotidBifurcation", "SaphenousVein", "SuperficialFemoralVein", "SplenicArtery", "InnominateArtery", "RenalArtery", "SuperiorMesentericVein", "GastroduodenalArtery", "AccessoryRenalArtery", "LumbarArtery", "PeronealVein", "BrachialArtery", "DorsalisPedisArtery", "InfraRenalAorta", "CommonFemoralArtery", "SuperficialPalmarVenousArch", "CarotidBulb", "CommonFemoralVein", "PoplitealVein", "GiacominiVein", "InternalCarotidArteryC5Segment", "InferiorMesentericVein", "AnteriorCommunicatingArtery", "MedianCubitalVein", "HilarArtery", "TerminalInternalCarotidArtery", "AxillaryArtery", "HepaticVein", "VertebralArtery", "TransjugularIntrahepaticPortosystemicShunt", "SaphenofemoralJunction", "SupraRenalAorta", "InternalJugularVein", "CockettPerforatingVein", "ExternalCarotidArtery", "SuperiorMesentericArtery", "UmbilicalVein", "CommonIliacVein", "PosteriorTibialArtery", "PosteriorCerebralArteryP1Segment", "TesticularArtery", "GreatSaphenousVeinOfThigh", "LeftHepaticVein", "InnominateVein", "SuperficialFemoralArtery", "PortalVein", "PosteriorCommunicatingArtery", "AnteriorCerebralArtery", "LeftBranchOfHepaticArtery", "RenalVein", "InternalIliacVein", "BoydPerforatingVein", "IlealVein", "ArcuateArteryOfTheKidney", "AbdominalAorta", "CommonIliacArtery", "RightHepaticVein", "CephalicVein", "GastrocnemiusVein", "GastricVein", "MiddleCerebralArteryM2Segment", "LeftMainBranchOfPortalVein", "MiddleCerebralArtery", "PosteriorCerebralArteryP2Segment", "InferiorRightHepaticVein", "TesticularVein", "CarotidSiphon", "AnteriorTibialVein", "PosteriorTibialVein", "SaphenopoplitealJunction", "BasilicVein", "PlantarArterialArch", "HunterianPerforatingVein", "AnteriorPosteriorCerebralArteryBifurcation", "DeepPalmarArchOfRadialArtery", "ProfundaFemorisArtery", "InterlobularArteryOfKidney", "FifthLumbarArtery", "AxillaryVein", "LesserSaphenousVein", "InferiorMesentericArtery", "DigitalArteryOfHand", "GreatSaphenousVein", "SecondLumbarArtery", ] } name_for_cid[12104] = "ExtracranialArtery" cid_concepts[12104] = { "SCT": [ "InternalCarotidArtery", "ExternalCarotidArtery", "VertebralArtery", "CommonCarotidArtery", "CarotidBulb", "SubclavianArtery", "CarotidBifurcation", ] } name_for_cid[12105] = "IntracranialCerebralVessel" cid_concepts[12105] = { "SCT": [ "InternalCarotidArtery", "MiddleCerebralArteryM2Segment", "MiddleCerebralArtery", "PosteriorCerebralArteryP2Segment", "CarotidSiphon", "OphthalmicArtery", "PosteriorCerebralArtery", "PosteriorCommunicatingArtery", "AnteriorCerebralArtery", "AnteriorPosteriorCerebralArteryBifurcation", "MiddleCerebralArteryM1Segment", "CentralRetinalVein", "InternalCarotidArteryC5Segment", "AnteriorCommunicatingArtery", "AnteriorMiddleCerebralArteryBifurcation", "PosteriorCerebralArteryP1Segment", "InternalCarotidArteryC6Segment", "CentralRetinalArtery", "TerminalInternalCarotidArtery", ] } name_for_cid[12106] = "IntracranialCerebralVessel(Unilateral)" cid_concepts[12106] = {"SCT": ["BasilarArtery"]} name_for_cid[12107] = "UpperExtremityArtery" cid_concepts[12107] = { "SCT": [ "BrachialArtery", "InnominateArtery", "SuperficialPalmarArch", "UlnarArtery", "DigitalArteryOfHand", "RadialArtery", "SubclavianArtery", "DeepPalmarArchOfRadialArtery", "AxillaryArtery", ] } name_for_cid[12108] = "UpperExtremityVein" cid_concepts[12108] = { "SCT": [ "InnominateVein", "SubclavianVein", "UlnarVein", "DeepPalmarVenousArch", "BasilicVein", "SuperficialPalmarVenousArch", "InternalJugularVein", "BrachialVein", "SuperiorVenaCava", "CephalicVein", "AxillaryVein", "MedianCubitalVein", "RadialVein", ] } name_for_cid[12109] = "LowerExtremityArtery" cid_concepts[12109] = { "SCT": [ "AnteriorTibialArtery", "ExternalIliacArtery", "SuperficialFemoralArtery", "CommonFemoralArtery", "PoplitealArtery", "PlantarArterialArch", "InternalIliacArtery", "CommonIliacArteryBifurcation", "CommonIliacArtery", "ProfundaFemorisArtery", "DorsalisPedisArtery", "PosteriorTibialArtery", "PeronealArtery", ] } name_for_cid[12110] = "LowerExtremityVein" cid_concepts[12110] = { "SCT": [ "ProfundaFemorisVein", "CommonFemoralVein", "PoplitealVein", "LateralCalfPerforator", "GiacominiVein", "InternalIliacVein", "BoydPerforatingVein", "GastrocnemiusVein", "PosteriorArchVein", "SaphenousVein", "SolealVein", "SuperficialFemoralVein", "AnteriorTibialVein", "PosteriorTibialVein", "SaphenopoplitealJunction", "GreatSaphenousVeinOfCalf", "SaphenofemoralJunction", "HunterianPerforatingVein", "CockettPerforatingVein", "PeronealVein", "ThighPerforator", "CommonIliacVein", "LesserSaphenousVein", "GreatSaphenousVein", "ExternalIliacVein", "GreatSaphenousVeinOfThigh", ] } name_for_cid[12111] = "AbdominopelvicArtery(Paired)" cid_concepts[12111] = { "SCT": [ "FirstLumbarArtery", "AccessoryRenalArtery", "LumbarArtery", "CommonIliacArtery", "GastricArtery", "OvarianArtery", "FourthLumbarArtery", "FifthLumbarArtery", "SixthLumbarArtery", "ThirdLumbarArtery", "UmbilicalArtery", "SecondLumbarArtery", "TesticularArtery", "UterineArtery", ] } name_for_cid[12112] = "AbdominopelvicArtery(Unpaired)" cid_concepts[12112] = { "SCT": [ "AbdominalAorta", "InfraRenalAorta", "SplenicArtery", "SuperiorMesentericArtery", "CeliacAxis", "GastroduodenalArtery", "InferiorMesentericArtery", "RightBranchOfHepaticArtery", "SupraRenalAorta", "CommonHepaticArtery", "LeftBranchOfHepaticArtery", "ProperHepaticArtery", ] } name_for_cid[12113] = "AbdominopelvicVein(Paired)" cid_concepts[12113] = { "SCT": [ "TesticularVein", "OvarianVein", "CommonIliacVein", "GastricVein", "IlealVein", ] } name_for_cid[12114] = "AbdominopelvicVein(Unpaired)" cid_concepts[12114] = { "SCT": [ "HepaticVein", "LeftMainBranchOfPortalVein", "InferiorRightHepaticVein", "PortalVein", "SuperiorMesentericVein", "TransjugularIntrahepaticPortosystemicShunt", "InferiorVenaCava", "MiddleHepaticVein", "InferiorMesentericVein", "RightHepaticVein", "RightMainBranchOfPortalVein", "UmbilicalVein", "SplenicVein", "LeftHepaticVein", ] } name_for_cid[12115] = "RenalVessel" cid_concepts[12115] = { "SCT": [ "RenalArtery", "InterlobularArteryOfKidney", "LobarArtery", "PerforatingArteryOfKidney", "AccessoryRenalArtery", "SegmentalArtery", "HilarArtery", "RenalVein", "ArcuateArteryOfTheKidney", "InterlobarArteryOfKidney", ] } name_for_cid[12116] = "VesselSegmentModifier" cid_concepts[12116] = { "NCIt": ["Middle"], "SCT": ["Distal", "Proximal", "DilatedPortionOfSegment", "OriginOfVessel"], } name_for_cid[12117] = "VesselBranchModifier" cid_concepts[12117] = { "NCIt": ["Middle"], "SCT": [ "Main", "Right", "Lateral", "Inferior", "Left", "Superior", "CollateralBranchOfVessel", "Medial", ], } name_for_cid[12118] = "MeasurementOrientation" cid_concepts[12118] = { "DCM": ["AnteriorPosterior"], "SCT": ["Transverse", "Longitudinal"], } name_for_cid[12119] = "VascularUltrasoundProperty" cid_concepts[12119] = { "DCM": ["FlowVelocity"], "LN": [ "MinimumDiastolicVelocity", "ResistivityIndex", "VelocityTimeIntegral", "MeanGradient", "PeakSystolicVelocity", "VolumeFlow", "VelocityRatio", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "PeakGradient", "AccelerationIndex", "DecelerationTime", "AccelerationTime", "SystolicToDiastolicVelocityRatio", "PeakBloodVelocity", "PulsatilityIndex", "TimeAveragedMeanVelocity", ], "SCT": [ "VesselDepthFromSurface", "VesselOutsideDiameter", "VesselIntimalCrossSectionalDiameter", "LumenDiameterStenosis", "VesselLumenDiameter", "LengthOfSegment", "VesselLumenCrossSectionalArea", "LumenAreaStenosis", "VesselIntimalDiameter", ], } name_for_cid[12120] = "UltrasoundBloodVelocityMeasurement" cid_concepts[12120] = { "DCM": ["FlowVelocity"], "LN": [ "MinimumDiastolicVelocity", "TimeAveragedPeakVelocity", "VelocityTimeIntegral", "PeakBloodVelocity", "PeakSystolicVelocity", "EndDiastolicVelocity", "TimeAveragedMeanVelocity", ], } name_for_cid[12121] = "VascularIndex/Ratio" cid_concepts[12121] = { "LN": [ "AccelerationIndex", "ResistivityIndex", "VelocityRatio", "SystolicToDiastolicVelocityRatio", "PulsatilityIndex", ], "SCT": ["LumenDiameterStenosis", "LumenAreaStenosis"], } name_for_cid[12122] = "OtherVascularProperty" cid_concepts[12122] = { "LN": [ "DecelerationTime", "PeakGradient", "AccelerationTime", "MeanGradient", "VolumeFlow", ], "SCT": [ "VesselLumenCrossSectionalArea", "VesselDepthFromSurface", "VesselOutsideDiameter", "VesselLumenDiameter", "VesselIntimalCrossSectionalDiameter", "LengthOfSegment", "VesselIntimalDiameter", ], } name_for_cid[12123] = "CarotidRatio" cid_concepts[12123] = {"LN": ["ICACCAVelocityRatio"]} name_for_cid[12124] = "RenalRatio" cid_concepts[12124] = {"LN": ["RenalArteryAortaVelocityRatio"]} name_for_cid[12125] = "AbdominopelvicVessel" cid_concepts[12125] = { "SCT": [ "InfraRenalAorta", "CeliacAxis", "FirstLumbarArtery", "PortalVein", "OvarianVein", "LeftBranchOfHepaticArtery", "InferiorVenaCava", "ProperHepaticArtery", "IlealVein", "AbdominalAorta", "InferiorMesentericVein", "CommonIliacArtery", "RightHepaticVein", "GastricArtery", "OvarianArtery", "FourthLumbarArtery", "SixthLumbarArtery", "ThirdLumbarArtery", "GastricVein", "UmbilicalArtery", "SplenicVein", "HepaticVein", "LeftMainBranchOfPortalVein", "SplenicArtery", "InferiorRightHepaticVein", "TesticularVein", "SuperiorMesentericVein", "GastroduodenalArtery", "AccessoryRenalArtery", "LumbarArtery", "TransjugularIntrahepaticPortosystemicShunt", "SupraRenalAorta", "MiddleHepaticVein", "SuperiorMesentericArtery", "RightMainBranchOfPortalVein", "UmbilicalVein", "FifthLumbarArtery", "CommonIliacVein", "InferiorMesentericArtery", "RightBranchOfHepaticArtery", "SecondLumbarArtery", "TesticularArtery", "CommonHepaticArtery", "UterineArtery", "LeftHepaticVein", ] } name_for_cid[12130] = "OrganPart(NonLateralized)" cid_concepts[12130] = {"SCT": ["ThyroidIsthmus", "ThyroidPart", "LobeOfThyroid"]} name_for_cid[12131] = "OrganPart(Lateralized)" cid_concepts[12131] = {"SCT": ["RightLobeOfThyroid", "LeftLobeOfThyroid"]} name_for_cid[12140] = "PelvicVasculatureAnatomicalLocation" cid_concepts[12140] = { "SCT": [ "FetalUmbilicalVein", "CommonIliacArtery", "VitellineVeinOfPlacenta", "OvarianArtery", "OvarianVein", "UterineVein", "UmbilicalArtery", "UterineArtery", "VitellineArteryOfPlacenta", ] } name_for_cid[12141] = "FetalVasculatureAnatomicalLocation" cid_concepts[12141] = { "SCT": [ "DescendingAorta", "MiddleCerebralArtery", "PulmonaryArtery", "PulmonaryVein", "Aorta", ] } name_for_cid[12200] = "EchocardiographyLeftVentricleMeasurement" cid_concepts[12200] = { "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "LeftVentricularEndDiastolicVolume", "LeftVentricleMass", "VolumeFlow", "FlowRadius", "LeftVentricularEjectionFractionByUS", "LeftVentricleInternalSystolicDimension", "InterventricularSeptumSystolicThickness", "HeartRate", "LeftVentriclePosteriorWallDiastolicThickness", "EndDiastolicVelocity", "LeftVentriclePosteriorWallSystolicThickness", "InterventricularSeptumDiastolicThickness", "PeakGradient", "LeftVentricleInternalEndDiastolicDimension", "LeftVentricleDiastolicMajorAxis", "InterventricularSeptumPercentThickening", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "LeftVentricularIsovolumicRelaxationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "ACInterval", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakVelocity", "TimeAveragedPeakVelocity", "InterventricularSeptumToPosteriorWallThicknessRatio", "VelocityOfFlowPropagation", "LeftVentriclePosteriorWallPercentThickening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "LeftVentricularEndSystolicVolume", "LeftVentricularFractionalShortening", "LeftVentricleSystolicMajorAxis", "SystolicToDiastolicVelocityRatio", "TimeAveragedMeanVelocity", ], "SCT": [ "LeftVentricleSemiMajorAxisDiastolicDimension", "LeftVentricularSystolicArea", "CardiacOutput", "LeftVentricularPeakEarlyDiastolicTissueVelocity", "LeftVentricularPeakSystolicTissueVelocity", "LeftVentricularIndexOfMyocardialPerformance", "LeftVentricularDiastolicArea", "CardiovascularOrificeDiameter", "StrokeIndex", "LeftVentricularFractionalAreaChange", "LeftVentricleTruncatedSemiMajorAxisDiastolicDimension", "LVPeakDiastolicTissueVelocityDuringAtrialSystole", "LeftVentricularIsovolumicContractionTime", "CardiacIndex", "LeftVentricleEpicardialDiastolicAreaPsaxPapView", "RegurgitantFraction", "RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12201] = "LeftVentricleLinearMeasurement" cid_concepts[12201] = { "LN": [ "LeftVentricleInternalEndDiastolicDimension", "LeftVentricleDiastolicMajorAxis", "InterventricularSeptumPercentThickening", "LeftVentriclePosteriorWallPercentThickening", "LeftVentricleInternalSystolicDimension", "LeftVentricularFractionalShortening", "LeftVentricleSystolicMajorAxis", "InterventricularSeptumSystolicThickness", "LeftVentriclePosteriorWallDiastolicThickness", "LeftVentriclePosteriorWallSystolicThickness", "InterventricularSeptumToPosteriorWallThicknessRatio", "InterventricularSeptumDiastolicThickness", ], "SCT": [ "LeftVentricleTruncatedSemiMajorAxisDiastolicDimension", "LeftVentricleSemiMajorAxisDiastolicDimension", ], } name_for_cid[12202] = "LeftVentricleVolumeMeasurement" cid_concepts[12202] = { "LN": [ "LeftVentricularEjectionFractionByUS", "LeftVentricularEndSystolicVolume", "LeftVentricularEndDiastolicVolume", ] } name_for_cid[12203] = "LeftVentricleOtherMeasurement" cid_concepts[12203] = { "LN": ["LeftVentricularIsovolumicRelaxationTime", "LeftVentricleMass"], "SCT": [ "LeftVentricularPeakSystolicTissueVelocity", "RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave", "LeftVentricularIndexOfMyocardialPerformance", "LVPeakDiastolicTissueVelocityDuringAtrialSystole", "LeftVentricularIsovolumicContractionTime", "LeftVentricularPeakEarlyDiastolicTissueVelocity", ], } name_for_cid[12204] = "EchocardiographyRightVentricleMeasurement" cid_concepts[12204] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "RightVentricularAnteriorWallSystolicThickness", "HeartRate", "TimeAveragedPeakVelocity", "RightVentricularAnteriorWallDiastolicThickness", "EndDiastolicVelocity", "VelocityOfFlowPropagation", "RightVentricularInternalDiastolicDimension", "PeakGradient", "AliasVelocity", "RightVentricularInternalSystolicDimension", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "RVStrokeIndex", "RVCardiacOutput", "RightVentricularIndexOfMyocardialPerformance", "RegurgitantFraction", "RVStrokeVolume", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", "RVCardiacIndex", "RightVentricularPeakSystolicPressure", ], } name_for_cid[12205] = "EchocardiographyLeftAtriumMeasurement" cid_concepts[12205] = { "LN": [ "LeftAtriumAreaA4CView", "LeftAtriumToAorticRootRatio", "HeartRate", "LeftAtrialAppendagePeakVelocity", "LeftAtriumAnteroPosteriorSystolicDimension", ], "SCT": ["LeftAtriumSystolicVolume"], } name_for_cid[12206] = "EchocardiographyRightAtriumMeasurement" cid_concepts[12206] = { "LN": ["RightAtriumSystolicPressure", "RightAtriumAreaA4CView", "HeartRate"] } name_for_cid[12207] = "EchocardiographyMitralValveMeasurement" cid_concepts[12207] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "MitralValveAWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "MitralValveEFSlopeByMMode", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "VelocityOfFlowPropagation", "PeakGradient", "MitralValveEPSSEWave", "MitralValveEWavePeakVelocity", "MitralRegurgitationDpDtDerivedFromMitralRegVelocity", "AliasVelocity", "MitralValveEToARatio", "MitralValveDiastolicPeakInstantaneousGradient", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "MitralValveAWaveDuration", "CardiacIndex", "MitralValveClosureToOpeningTime", "CardiacOutput", "MitralValveATDTRatio", "RegurgitantFraction", "MitralValveEWaveDecelerationTime", "StrokeVolume", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", "StrokeIndex", ], } name_for_cid[12208] = "EchocardiographyTricuspidValveMeasurement" cid_concepts[12208] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "TimeFromQWaveToTricuspidValveOpens", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "TricuspidValveEToARatio", "VelocityOfFlowPropagation", "TricuspidRegurgitationDpDt", "PeakGradient", "TricuspidValveEWavePeakVelocity", "AliasVelocity", "TricuspidValveAWavePeakVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "RegurgitantFraction", "TricuspidValveClosureToOpeningTime", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", ], } name_for_cid[12209] = "EchocardiographyPulmonicValveMeasurement" cid_concepts[12209] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "TimeFromQWaveToPulmonicValveCloses", "VolumeFlow", "FlowRadius", "PulmonicValveEjectionTime", "HeartRate", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "VelocityOfFlowPropagation", "PeakGradient", "PulmonicValveAreaByContinuity", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "RatioOfPulmonicValveAccelerationTimeToEjectionTime", "RegurgitantFraction", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", ], } name_for_cid[12210] = "EchocardiographyPulmonaryArteryMeasurement" cid_concepts[12210] = { "LN": [ "HeartRate", "MainPulmonaryArteryDiameter", "LeftPulmonaryArteryDiameter", "RightPulmonaryArteryDiameter", ], "SCT": ["MainPulmonaryArteryPeakVelocity"], } name_for_cid[12211] = "EchocardiographyAorticValveMeasurement" cid_concepts[12211] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "AorticValveEjectionTime", "HeartRate", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "AorticValveCuspSeparation", "TimeAveragedMeanVelocity", ], "SCT": [ "RegurgitantFraction", "RatioOfAorticValveAccelerationTimeToEjectionTime", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", ], } name_for_cid[12212] = "EchocardiographyAortaMeasurement" cid_concepts[12212] = { "LN": [ "AorticRootAnnuloAorticJunctionDiameter", "HeartRate", "AscendingAorticDiameter", "AorticArchDiameter", "AorticIsthmusDiameter", "ThoracicAortaCoarctationSystolicPeakVelocity", "DescendingAorticDiameter", "ThoracicAortaCoarctationSystolicPeakInstantaneousGradient", ] } name_for_cid[12214] = "EchocardiographyPulmonaryVeinMeasurement" cid_concepts[12214] = { "LN": [ "PulmonaryVeinSystolicPeakVelocity", "PulmonaryVeinDiastolicPeakVelocity", "HeartRate", "PulmonaryVeinAtrialContractionReversalPeakVelocity", "PulmonaryVeinSystolicToDiastolicRatio", ], "SCT": [ "PulmonaryVeinAWaveDuration", "PulmonaryVeinSWaveVelocityTimeIntegral", "PulmonaryVeinDWaveVelocityTimeIntegral", ], } name_for_cid[12215] = "EchocardiographyVenaCavaMeasurement" cid_concepts[12215] = { "LN": ["InferiorVenaCavaDiameter", "InferiorVenaCavaPercentCollapse", "HeartRate"] } name_for_cid[12216] = "EchocardiographyHepaticVeinMeasurement" cid_concepts[12216] = { "LN": [ "HepaticVeinAtrialContractionReversalPeakVelocity", "HepaticVeinSystolicToDiastolicRatio", "HepaticVeinDiastolicPeakVelocity", "HeartRate", "HepaticVeinSystolicPeakVelocity", ] } name_for_cid[12217] = "EchocardiographyCardiacShuntMeasurement" cid_concepts[12217] = {"LN": ["PulmonaryToSystemicShuntFlowRatio", "HeartRate"]} name_for_cid[12218] = "EchocardiographyCongenitalAnomalyMeasurement" cid_concepts[12218] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "EndDiastolicVelocity", "ROIInternalDimensionByUS", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", "Length", "Circumference", ], } name_for_cid[12219] = "PulmonaryVeinModifier" cid_concepts[12219] = { "SCT": [ "RightLowerSegment", "RightUpperSegment", "LeftLowerSegment", "LeftUpperSegment", ] } name_for_cid[12220] = "EchocardiographyCommonMeasurement" cid_concepts[12220] = {"LN": ["HeartRate"]} name_for_cid[12221] = "FlowDirection" cid_concepts[12221] = { "SCT": [ "RetrogradeFlow", "AntegradeFlow", "RegurgitantFlow", "RightToLeftCardiovascularShunt", "LeftToRightCardiovascularShunt", ] } name_for_cid[12222] = "OrificeFlowProperty" cid_concepts[12222] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "RegurgitantFraction", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", ], } name_for_cid[12223] = "EchocardiographyStrokeVolumeOrigin" cid_concepts[12223] = { "SCT": [ "RightVentricleOutflowTract", "LeftVentricle", "MitralValve", "LeftVentricleOutflowTract", "Aorta", ] } name_for_cid[12224] = "UltrasoundImageMode" cid_concepts[12224] = { "DCM": [ "_3DSpeckleTracking", "_3DShearWaveElastography", "PointShearWaveElastography", "_2DSpeckleTracking", "_2DShearWaveElastography", ], "SCT": [ "BMode", "TissueDopplerImaging", "_3DMode", "DopplerPulsed", "MMode", "_2DMode", "DopplerContinuousWave", "PowerDoppler", "DopplerColorFlow", ], } name_for_cid[12226] = "EchocardiographyImageView" cid_concepts[12226] = { "DCM": ["ApicalFourChamberRVFocused", "ApicalFourChamberRVModified"], "SCT": [ "ParasternalShortAxisAtTheMitralValveLevel", "SubcostalShortAxis", "ParasternalLongAxis", "SuprasternalShortAxis", "SubcostalViewOfCardiacOutletsDirectedAnteriorly", "ParasternalLongAxisViewOfTheRVOutflowTract", "ParasternalShortAxisAtThePapillaryMuscleLevel", "SuprasternalSagittalView", "SuprasternalLongAxis", "TransesophagealShortAxisView", "SuprasternalCoronalView", "ParasternalLongAxisViewOfTheRVInflowTract", "RightVentricularInflowTractView", "ApicalTwoChamber", "SuprasternalLongAxisViewOfAorticArch", "SubcostalObliqueCoronalView", "SubcostalLongAxis", "SubcostalShortAxisViewAtMitralValveLevel", "ApicalLongAxis", "SubcostalShortAxisViewAtAorticValveLevel", "ParasternalShortAxisAtTheAorticValveLevel", "SubcostalShortAxisViewAtPapillaryMuscleLevel", "SubcostalShortAxisViewAtVenousInflowLevel", "ApicalFourChamber", "ParasternalShortAxisAtTheLevelOfTheMitralChords", "RightVentricularOutflowTractView", "ParasternalShortAxis", ], } name_for_cid[12227] = "EchocardiographyMeasurementMethod" cid_concepts[12227] = { "DCM": [ "Teichholz", "MethodOfDisksSinglePlane", "MethodOfDisksBiplane", "CubeMethod", "BulletMethod", "AreaLengthSinglePlane", "ModifiedSimpson", "AreaLengthBiplane", "SinglePlaneEllipse", "MyocardialMidlayerMethod", "EpicardialMethod", "EndocardialMethod", "LeftVentricleMassByTruncatedEllipse", "LeftVentricleMassByMMode", "Planimetry", "DopplerVolumeFlow", "SimplifiedBernoulli", "DirectlyMeasured", "FullBernoulli", "ProximalIsovelocitySurfaceArea", "ContinuityEquationByVelocityTimeIntegral", "LeftVentricleMassByTruncatedEllipseAdjustedByHeight", "LeftVentricleMassByMModeAdjustedByHeight", "LeftVentricleMassByAreaLength", "ContinuityEquationByPeakVelocity", "ContinuityEquationByMeanVelocity", "ContinuityEquation", "BiplaneEllipse", "AreaByPressureHalfTime", "LeftVentricleMassByAreaLengthAdjustedByHeight", ] } name_for_cid[12228] = "EchocardiographyVolumeMethod" cid_concepts[12228] = { "DCM": [ "Teichholz", "MethodOfDisksSinglePlane", "MethodOfDisksBiplane", "CubeMethod", "BulletMethod", "AreaLengthSinglePlane", "ModifiedSimpson", "AreaLengthBiplane", "SinglePlaneEllipse", "BiplaneEllipse", ] } name_for_cid[12229] = "EchocardiographyAreaMethod" cid_concepts[12229] = { "DCM": [ "ProximalIsovelocitySurfaceArea", "ContinuityEquationByVelocityTimeIntegral", "ContinuityEquationByPeakVelocity", "ContinuityEquationByMeanVelocity", "ContinuityEquation", "AreaByPressureHalfTime", "Planimetry", ] } name_for_cid[12230] = "GradientMethod" cid_concepts[12230] = {"DCM": ["SimplifiedBernoulli", "FullBernoulli"]} name_for_cid[12231] = "VolumeFlowMethod" cid_concepts[12231] = {"DCM": ["DopplerVolumeFlow", "ProximalIsovelocitySurfaceArea"]} name_for_cid[12232] = "MyocardiumMassMethod" cid_concepts[12232] = { "DCM": [ "LeftVentricleMassByTruncatedEllipseAdjustedByHeight", "LeftVentricleMassByMModeAdjustedByHeight", "LeftVentricleMassByAreaLength", "LeftVentricleMassByTruncatedEllipse", "LeftVentricleMassByMMode", "LeftVentricleMassByAreaLengthAdjustedByHeight", ] } name_for_cid[12233] = "CardiacPhase" cid_concepts[12233] = { "SCT": [ "Diastole", "EndDiastole", "VentricularIsovolumicContraction", "VentricularSystole", "EarlyDiastole", "Diastasis", "EndSystole", "AtrialSystole", "PeakSystolic", "VentricularEjection", "DiastolicRapidInflow", "VentricularIsovolumicRelaxation", "Systole", ] } name_for_cid[12234] = "RespirationState" cid_concepts[12234] = {"SCT": ["Expiration", "Inspiration"]} name_for_cid[12235] = "MitralValveAnatomicSite" cid_concepts[12235] = { "SCT": ["MedialMitralAnnulus", "LateralMitralAnnulus", "MitralAnnulus"] } name_for_cid[12236] = "EchocardiographyAnatomicSite" cid_concepts[12236] = { "SCT": [ "RightVentricleOutflowTract", "PericardialEffusion", "VentricularSeptalDefect", "ThoracicAorticCoarctation", "MitralAnnulus", "Aorta", "MedialMitralAnnulus", "LeftVentricle", "AtrialSeptalDefect", "LateralMitralAnnulus", "MitralValve", "LeftVentricleOutflowTract", "AorticValveRing", "TricuspidAnnulus", ] } name_for_cid[12237] = "EchocardiographyAnatomicSiteModifier" cid_concepts[12237] = { "SCT": [ "RightLowerSegment", "RightUpperSegment", "LeftLowerSegment", "LeftUpperSegment", ] } name_for_cid[12238] = "WallMotionScoringScheme" cid_concepts[12238] = { "DCM": [ "_5PointSegmentFindingScaleWithGradedHypokinesis", "_5PointSegmentFindingScale", "_4PointSegmentFindingScale", ] } name_for_cid[12239] = "CardiacOutputProperty" cid_concepts[12239] = { "SCT": ["CardiacOutput", "StrokeIndex", "CardiacIndex", "StrokeVolume"] } name_for_cid[12240] = "LeftVentricleAreaMeasurement" cid_concepts[12240] = { "SCT": [ "LeftVentricleEpicardialDiastolicAreaPsaxPapView", "LeftVentricularDiastolicArea", "LeftVentricularFractionalAreaChange", "LeftVentricularSystolicArea", ] } name_for_cid[12241] = "TricuspidValveFindingSite" cid_concepts[12241] = {"SCT": ["TricuspidAnnulus"]} name_for_cid[12242] = "AorticValveFindingSite" cid_concepts[12242] = {"SCT": ["AorticValveRing"]} name_for_cid[12243] = "LeftVentricleFindingSite" cid_concepts[12243] = {"SCT": ["LeftVentricleOutflowTract"]} name_for_cid[12244] = "CongenitalFindingSite" cid_concepts[12244] = {"SCT": ["AtrialSeptalDefect", "VentricularSeptalDefect"]} name_for_cid[12245] = "CardiacUltrasoundReportTitle" cid_concepts[12245] = { "DCM": [ "PediatricCardiacUltrasoundReport", "AdultCongenitalCardiacUltrasoundReport", "FetalCardiacUltrasoundReport", ] } name_for_cid[12246] = "CardiacUltrasoundIndicationforStudy" cid_concepts[12246] = { "SCT": [ "Hemoptysis", "ConductionDisorderOfTheHeart", "Palpitations", "AnginaPectoris", "Syncope", "AbnormalECG", "CoronaryArteryDisease", "SupraventricularTachycardia", "ImagingGuidance", "Fever", "LeftBundleBranchBlock", "ValvularHeartDisease", "ChestPain", "Hypertension", "HeartDiseaseRiskFactors", "Murmur", "CongenitalHeartDisease", "Dyspnea", ] } name_for_cid[12247] = "Pediatric,FetalandCongenitalCardiacSurgicalIntervention" cid_concepts[12247] = { "SCT": [ "RastelliOperation", "CreationOfConduitRightAtriumToPulmonaryTrunk", "RightSidedBidirectionalGlennShuntProcedure", "LeftSidedBidirectionalGlennShuntProcedure", "ImplantationOfHeartValveWithTissueGraft", "BlalockTaussigShuntPulmonarySubclavianArteryAnastomosis", "HemiFontanOperation", "NorwoodTypeOperation", "InsertionOfAtrialBaffle", "PatentDuctusArteriosusCoilOrDeviceClosure", "PartialAnomalousPulmonaryVenousConnectionOperation", "CentralAortopulmonaryShuntOperation", "ImplantationOfHeartValveProsthesisOrSyntheticDevice", "RepairOfCoarctationOfAorta", "ConstructionOfLVToAortaTunnelWRVToPAValvedConduit", "RepairOfTotalAnomalousPulmonaryVenousConnection", "InsertionOfInteratrialBaffle", "PercutaneousProstheticClosureOfAtrialSeptalDefect", "CoarctationOfTheAortaAngioplastyWithImplantOfStent", "VentricularSeptalDefectDeviceClosure", "RadicalAortopulmonaryReconstructWRVToPAValvelessConduit", "ArterialSwitchOperation", "CoarctationOfTheAortaBalloonAngioplasty", "DamusStanselKayeOperation", "ClosureOfDuctusArteriosusWithClip", "AtrialInversionOperationUsingAtrialWall", "RightGlennShuntProcedure", "LateralCavalFontanProcedure", "SanoProcedure", "RepairOfDefectOfTheAtrioventricularSeptum", "CorrectionOfVentricularSeptalDefect", "AtrialSeptalDefectRepair", "MustardOperation", "LeftGlennShuntProcedure", ] } name_for_cid[12248] = "CardiacUltrasoundSummaryCode" cid_concepts[12248] = { "SCT": [ "CorrectedTranspositionOfGreatVessels", "CoarctationOfTheAorta", "PulmonaryAtresiaWithIntactVentricularSeptum", "TetralogyOfFallot", "CompleteTranspositionOfGreatVessels", "Mesocardia", "FunctionalSingleVentricle", "MitralRegurgitation", "HypoplasticLeftHeartSyndrome", "CongenitalStenosisOfAorticValve", "MitralStenosis", "AtrialSeptalDefect", "RheumaticFever", "PulmonaryAtresiaWithVentricularSeptalDefect", "MitralValveProlapse", "AorticRegurgitation", "Dextrocardia", "CommonAtrioventricularCanal", "VentricularSeptalDefect", "PartialAnomalousPulmonaryVenousConnection", "AcuteFebrileMucocutaneousLymphNodeSyndrome", "Cardiomegaly", "Cyanosis", "AtrialSeptalDefectWithEndocardialCushionDefectPartial", "PulmonicValveStenosis", "AorticStenosis", "InterruptedAorticArch", ] } name_for_cid[12249] = "CardiacUltrasoundFetalSummaryCode" cid_concepts[12249] = { "SCT": [ "CorrectedTranspositionOfGreatVessels", "CoarctationOfTheAorta", "PulmonaryAtresiaWithIntactVentricularSeptum", "TetralogyOfFallot", "CompleteTranspositionOfGreatVessels", "Mesocardia", "FunctionalSingleVentricle", "MitralRegurgitation", "HypoplasticLeftHeartSyndrome", "CongenitalStenosisOfAorticValve", "MitralStenosis", "AtrialSeptalDefect", "RheumaticFever", "PulmonaryAtresiaWithVentricularSeptalDefect", "MitralValveProlapse", "AorticRegurgitation", "EdemaOfFetalChestWall", "Dextrocardia", "CommonAtrioventricularCanal", "VentricularSeptalDefect", "EdemaOfFetalScalp", "PartialAnomalousPulmonaryVenousConnection", "AcuteFebrileMucocutaneousLymphNodeSyndrome", "Cardiomegaly", "Cyanosis", "AtrialSeptalDefectWithEndocardialCushionDefectPartial", "PulmonicValveStenosis", "AorticStenosis", "InterruptedAorticArch", ] } name_for_cid[12250] = "CardiacUltrasoundCommonLinearMeasurement" cid_concepts[12250] = { "LN": ["ROIInternalDimensionByUS", "ROIThicknessByUS"], "SCT": ["Radius", "MinorAxis", "Length", "Diameter", "MajorAxis", "Circumference"], } name_for_cid[12251] = "CardiacUltrasoundLinearValveMeasurement" cid_concepts[12251] = { "LN": [ "LeafletThickness", "LeafletSeparation", "ROIInternalDimensionByUS", "ROIThicknessByUS", "CEDistance", "DEExcursion", ], "SCT": ["Radius", "MinorAxis", "Length", "Diameter", "MajorAxis", "Circumference"], } name_for_cid[12252] = "CardiacUltrasoundCardiacFunction" cid_concepts[12252] = { "LN": [ "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "FractionalShortening", "PercentThickening", ], "SCT": ["CardiacEjectionFraction"], } name_for_cid[12253] = "CardiacUltrasoundAreaMeasurement" cid_concepts[12253] = {"LN": ["JetArea", "FlowArea"], "SCT": ["Area"]} name_for_cid[12254] = "CardiacUltrasoundHemodynamicMeasurement" cid_concepts[12254] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval"], "LN": [ "PreEjectionPeriod", "EjectionTime", "AWaveDuration", "EnvelopeDuration", "TimeToPeakByUS", "DpDtByUS", "HeartRateCorrectedEjectionTime", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "PreEjectionPeriodEjectionTimeRatio", "IsovolumicContractionTime", "ClosureToOpeningTime", "IsovolumicRelaxationTime", ], "SCT": ["BloodPressure"], } name_for_cid[12255] = "CardiacUltrasoundMyocardiumMeasurement" cid_concepts[12255] = { "DCM": ["WallMass"], "LN": ["EndocardialArea", "EpicardialArea", "MyocardialPerformanceIndexTei"], } name_for_cid[12257] = "CardiacUltrasoundLeftVentricleMeasurement" cid_concepts[12257] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval", "WallMass"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleAWave", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "EndocardialArea", "PeakTissueVelocity", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "TimeToLeftVentricleETissueVelocity", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleEWave", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "InterventricularSeptumToPosteriorWallThicknessRatio", "IsovolumicRelaxationTime", "TimeToLeftVentricleSTissueVelocity", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "LeftVentricleMeridionalWallStress", "LeftVentricleEToATissueVelocityRatio", "SystolicToDiastolicVelocityRatio", "EpicardialArea", "MyocardialPerformanceIndexTei", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Volume", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12258] = "CardiacUltrasoundRightVentricleMeasurement" cid_concepts[12258] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval", "WallMass"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "EndocardialArea", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "VelocityOfFlowPropagation", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "EpicardialArea", "MyocardialPerformanceIndexTei", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Volume", "Area", "CardiovascularOrificeDiameter", "Length", "Circumference", "BloodPressure", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", ], } name_for_cid[12259] = "CardiacUltrasoundVentriclesMeasurement" cid_concepts[12259] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval", "WallMass"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleAWave", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "EndocardialArea", "PeakTissueVelocity", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "TimeToLeftVentricleETissueVelocity", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleEWave", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "InterventricularSeptumToPosteriorWallThicknessRatio", "IsovolumicRelaxationTime", "TimeToLeftVentricleSTissueVelocity", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "LeftVentricleMeridionalWallStress", "LeftVentricleEToATissueVelocityRatio", "SystolicToDiastolicVelocityRatio", "EpicardialArea", "MyocardialPerformanceIndexTei", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Volume", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12260] = "CardiacUltrasoundPulmonaryArteryMeasurement" cid_concepts[12260] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "VelocityOfFlowPropagation", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiovascularOrificeDiameter", "Length", "Circumference", "BloodPressure", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", ], } name_for_cid[12261] = "CardiacUltrasoundPulmonaryVein" cid_concepts[12261] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RRInterval", "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "PulmVeinADurationToMVADurationDifference", "PeakGradient", "EjectionTime", "PulmonaryVeinADurationMitralValveADurationRatio", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "VelocityOfFlowPropagation", "AliasVelocity", "PulmonaryVeinAVTIToMitralValveVTIRatio", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "TimeAveragedMeanVelocity", ], "SCT": [ "CardiovascularOrificeDiameter", "BloodPressure", "RegurgitantFraction", "CardiovascularOrificeArea", ], } name_for_cid[12262] = "CardiacUltrasoundPulmonaryValveMeasurement" cid_concepts[12262] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "AWaveAmplitude", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "BCSlope", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "TimeFromQWaveToPulmonicValveCloses", "CEDistance", "PulmonaryArteryPressureUsingAccelTime", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "DEExcursion", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12263] = "CardiacUltrasoundVenousReturnPulmonaryMeasurement" cid_concepts[12263] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RRInterval", "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "AWaveAmplitude", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "PulmVeinADurationToMVADurationDifference", "EjectionTime", "PulmonaryVeinADurationMitralValveADurationRatio", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "BCSlope", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "TimeFromQWaveToPulmonicValveCloses", "CEDistance", "PulmonaryArteryPressureUsingAccelTime", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PulmonaryVeinAVTIToMitralValveVTIRatio", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "DEExcursion", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12264] = "CardiacUltrasoundVenousReturnSystemicMeasurement" cid_concepts[12264] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RRInterval", "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12265] = "CardiacUltrasoundAtriaandAtrialSeptumMeasurement" cid_concepts[12265] = { "DCM": ["WallMass"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "VolumeFlow", "FlowRadius", "LeftAtriumToAorticRootRatio", "HeartRate", "FlowArea", "EndDiastolicVelocity", "EndocardialArea", "ROIInternalDimensionByUS", "PeakGradient", "LeftAtriumVolumeToRightAtriumVolumeRatio", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "ACInterval", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakVelocity", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "VelocityOfFlowPropagation", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "EpicardialArea", "MyocardialPerformanceIndexTei", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Volume", "Area", "CardiovascularOrificeDiameter", "Length", "Circumference", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", ], } name_for_cid[12266] = "CardiacUltrasoundMitralValveMeasurement" cid_concepts[12266] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RRInterval", "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "MitralRegurgitationDpDtDerivedFromMitralRegVelocity", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "MitralValveESeptalSeparation", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "CEDistance", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "MitralValveEPSSEWave", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "DEExcursion", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12267] = "CardiacUltrasoundTricuspidValveMeasurement" cid_concepts[12267] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RRInterval", "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "TimeFromQWaveToTricuspidValveOpens", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "CEDistance", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "DEExcursion", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "TricuspidDiastolicFillingPeriodDfpt", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12268] = "CardiacUltrasoundAtrioventricularValveMeasurement" cid_concepts[12268] = { "DCM": [ "Tau", "IndicatorMeanTransitTime", "RRInterval", "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "TimeFromQWaveToTricuspidValveOpens", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "MitralRegurgitationDpDtDerivedFromMitralRegVelocity", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "MitralValveESeptalSeparation", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "CEDistance", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "MitralValveEPSSEWave", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "DEExcursion", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "TricuspidDiastolicFillingPeriodDfpt", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12269] = "CardiacUltrasoundInterventricularSeptumMeasurement" cid_concepts[12269] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "JetArea", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FlowArea", "EndDiastolicVelocity", "ROIInternalDimensionByUS", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", "Length", "Circumference", ], } name_for_cid[12270] = "CardiacUltrasoundAorticValveMeasurement" cid_concepts[12270] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "AorticValveCuspSeparation", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12271] = "CardiacUltrasoundOutflowTractMeasurement" cid_concepts[12271] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval", "WallMass"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleAWave", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "AWaveAmplitude", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "EndocardialArea", "PeakTissueVelocity", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeToLeftVentricleETissueVelocity", "PercentThickening", "ACInterval", "BCSlope", "PreEjectionPeriod", "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleEWave", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "TimeFromQWaveToPulmonicValveCloses", "CEDistance", "DpDtByUS", "PulmonaryArteryPressureUsingAccelTime", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "InterventricularSeptumToPosteriorWallThicknessRatio", "IsovolumicRelaxationTime", "TimeToLeftVentricleSTissueVelocity", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "LeftVentricleMeridionalWallStress", "LeftVentricleEToATissueVelocityRatio", "SystolicToDiastolicVelocityRatio", "AorticValveCuspSeparation", "EpicardialArea", "MyocardialPerformanceIndexTei", "TimeAveragedMeanVelocity", "DEExcursion", ], "SCT": [ "MajorAxis", "Volume", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12272] = "CardiacUltrasoundSemilunarValve,AnnulateandSinusMeasurement" cid_concepts[12272] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "AWaveAmplitude", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "LeafletThickness", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "LeafletSeparation", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "BCSlope", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "TimeFromQWaveToPulmonicValveCloses", "CEDistance", "DpDtByUS", "PulmonaryArteryPressureUsingAccelTime", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "AorticValveCuspSeparation", "TimeAveragedMeanVelocity", "DEExcursion", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12273] = "CardiacUltrasoundAorticSinotubularJunctionMeasurement" cid_concepts[12273] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "EndDiastolicVelocity", "AorticSinotubularJunctionToAorticRootRatio", "ROIInternalDimensionByUS", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", "Length", "Circumference", ], } name_for_cid[12274] = "CardiacUltrasoundAortaMeasurement" cid_concepts[12274] = { "DCM": ["Tau", "IndicatorMeanTransitTime", "RRInterval"], "LN": [ "DESlope", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "StenosisPeakGradient", "JetArea", "EnvelopeDuration", "VolumeFlow", "TimeToPeakByUS", "FlowRadius", "HeartRateCorrectedEjectionTime", "HeartRate", "PreEjectionPeriodEjectionTimeRatio", "FlowArea", "EndDiastolicVelocity", "IsovolumicContractionTime", "ClosureToOpeningTime", "HRCorrectedMeanVelocityOfCircumferentialFiberShortening", "AorticSinotubularJunctionToAorticRootRatio", "ROIInternalDimensionByUS", "PeakGradient", "EjectionTime", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "PercentThickening", "ACInterval", "PreEjectionPeriod", "AWavePeakVelocity", "AWaveDuration", "PeakSystolicVelocity", "StenosisPeakVelocity", "DpDtByUS", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "FillingTime", "HeartRateCorrectedPreEjectionPeriod", "IsovolumicRelaxationTime", "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv", "VelocityOfFlowPropagation", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "AccelerationSlope", "DecelerationSlope", "SystolicToDiastolicVelocityRatio", "AorticValveCuspSeparation", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "Area", "CardiacOutput", "CardiacEjectionFraction", "CardiovascularOrificeDiameter", "Length", "StrokeIndex", "Circumference", "BloodPressure", "CardiacIndex", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "StrokeVolume", "CardiovascularOrificeArea", ], } name_for_cid[12275] = "CardiacUltrasoundCoronaryArteryMeasurement" cid_concepts[12275] = { "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "ROIThicknessByUS", "EndDiastolicVelocity", "ROIInternalDimensionByUS", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "MajorAxis", "RegurgitantFraction", "Radius", "MinorAxis", "Diameter", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", "Length", "Circumference", ], } name_for_cid[12276] = "CardiacUltrasoundAortoPulmonaryConnectionMeasurement" cid_concepts[12276] = { "DCM": [ "BloodVelocityPeak", "BloodVelocityMean", "BloodVelocityMinimum", "SystolicBloodVelocityMean", "SystolicBloodVelocityPeak", "DiastolicBloodVelocityMean", "DiastolicBloodVelocityPeak", ], "LN": [ "DESlope", "ACInterval", "PeakEWavePeakAWaveByUS", "PulmonaryToSystemicShuntFlowRatio", "EWavePeakVelocity", "MeanGradient", "VelocityTimeIntegral", "AWavePeakVelocity", "PeakSystolicVelocity", "StenosisPeakGradient", "StenosisPeakVelocity", "VolumeFlow", "FlowRadius", "HeartRate", "TimeAveragedPeakVelocity", "EndDiastolicVelocity", "VelocityOfFlowPropagation", "PeakGradient", "AliasVelocity", "PressureHalfTime", "EVelocityToAnnulusEVelocityRatio", "PeakInstantaneousFlowRate", "AccelerationSlope", "DecelerationSlope", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "SystolicToDiastolicVelocityRatio", "EFSlope", "PeakReversalVelocityDuringAtrialContraction", "TimeAveragedMeanVelocity", ], "SCT": [ "RegurgitantFraction", "CardiovascularOrificeArea", "CardiovascularOrificeDiameter", ], } name_for_cid[12277] = "CardiacUltrasoundPericardiumandPleuraMeasurement" cid_concepts[12277] = { "LN": ["ROIInternalDimensionByUS", "ROIThicknessByUS"], "SCT": ["Radius", "MinorAxis", "Length", "Diameter", "MajorAxis", "Circumference"], } name_for_cid[12279] = "CardiacUltrasoundFetalGeneralMeasurement" cid_concepts[12279] = { "LN": [ "OccipitalFrontalDiameter", "FLAC", "AbdominalCircumference", "HeadCircumference", "BiparietalDiameter", "CephalicIndex", "NuchalTranslucency", "TransverseThoracicDiameter", "ThoracicArea", "TransverseCerebellarDiameter", "HCAC", "BPDAreaCorrected", "TransverseAbdominalDiameter", "CisternaMagnaLength", "FemurLength", "ThoracicCircumference", "LeftVentricleRightVentricleDiameterRatio", "ForamenOvaleDiameterAorticRootDiameter", "CardiacCircumferenceTransverseByUS", "CardiothoracicAreaRatio", "FLBPD", "CardiacCrossSectionalAreaTransverseByUS", "AnteriorPosteriorAbdominalDiameter", "FLHC", "AnteriorPosteriorTrunkDiameter", "CardiothoracicCircumferenceRatio", ], "SCT": ["NumberOfUmbilicalArteries"], } name_for_cid[12280] = "CardiacUltrasoundTargetSite" cid_concepts[12280] = { "SCT": [ "RightVentricleOutflowTract", "LeftSuperiorPulmonaryVein", "TransverseAorticArch", "LeftInferiorPulmonaryVein", "Effusion", "RightSuperiorPulmonaryVein", "RightPulmonaryArtery", "PosteriorWall", "PulmonaryVeinCommonRightSegment", "PreductalRegionOfAorticArch", "VenaContracta", "PulmonaryVeinCommonLeftSegment", "RightInferiorPulmonaryVein", "CardiacValveLeaflet", "LeftVentricleOutflowTract", "AnteriorWall", "CardiacValveAnnulus", "PulmonaryVeinConfluenceToAtriumConnection", "PostductalRegionOfAorticArch", "LeftPulmonaryArtery", ] } name_for_cid[12281] = "CardiacUltrasoundTargetSiteModifier" cid_concepts[12281] = { "NCIt": ["Middle"], "SCT": [ "Distal", "Proximal", "Lateral", "Posterior", "Inferior", "Anterior", "Medial", ], } name_for_cid[12282] = "CardiacUltrasoundVenousReturnSystemicFindingSite" cid_concepts[12282] = { "SCT": [ "HepaticVein", "LeftSuperiorVenaCava", "FontanFenestration", "MustardOrSenningSuperiorVenaCavaPathway", "RightSuperiorVenaCava", "InferiorVenaCava", "FontanPathway", "FontanBaffleLeak", "SuperiorVenaCava", "HemiFontanPathway", "FontanInferiorVenaCavaPathway", "FontanPulmonaryArteryConnection", "MustardOrSenningCommonSystemicVenousPathway", "GlennPathway", "MustardOrSenningInferiorVenaCavaPathway", ] } name_for_cid[12283] = "CardiacUltrasoundVenousReturnPulmonaryFindingSite" cid_concepts[12283] = { "SCT": [ "PulmonaryVeinGreatVessel", "PulmonaryVein", "PulmonaryVeinToAtriumConnection", "MustardOrSenningPulmonaryVenousPathway", "CorTriatriatumOrifice", ] } name_for_cid[12284] = "CardiacUltrasoundAtriaandAtrialSeptumFindingSite" cid_concepts[12284] = { "SCT": [ "RightAtrium", "InteratrialSeptumStructure", "FontanBaffleLeak", "LimbusOfFossaOvalis", "LeftAtrium", "LeftAuricularAppendage", "CommonAtrium", "PatentForamenOvale", "FontanFenestration", "AtrialSeptalDefect", "RightAuricularAppendage", ] } name_for_cid[12285] = "CardiacUltrasoundAtrioventricularValveFindingSite" cid_concepts[12285] = { "SCT": [ "TricuspidValve", "CommonNonMitralNonTricuspidAtrioventricularValveStructure", "MitralValve", ] } name_for_cid[12286] = "CardiacUltrasoundInterventricularSeptumFindingSite" cid_concepts[12286] = { "SCT": [ "BulboventricularForamen", "VentricularSeptalDefect", "InterventricularSeptum", ] } name_for_cid[12287] = "CardiacUltrasoundVentricleFindingSite" cid_concepts[12287] = {"SCT": ["RightVentricle", "LeftVentricle", "CommonVentricle"]} name_for_cid[12288] = "CardiacUltrasoundOutflowTractFindingSite" cid_concepts[12288] = { "SCT": [ "RastelliInterventricularTunnel", "PulmonicValve", "LeftVentricleToPulmonaryArteryConduitAnastomosis", "RightVentricle", "LeftVentricle", "RightVentricleToPulmonaryArteryConduitAnastomosis", "AorticValve", ] } name_for_cid[12289] = "CardiacUltrasoundSemilunarValve,AnnulusandSinusFindingSite" cid_concepts[12289] = { "SCT": [ "PulmonicValve", "NeoaorticValve", "AorticValve", "TruncalValveStructure", "NeoaorticRoot", "RootOfAorta", ] } name_for_cid[12290] = "CardiacUltrasoundPulmonaryArteryFindingSite" cid_concepts[12290] = { "SCT": ["PulmonaryArtery", "PulmonaryTrunk", "AortaToPulmonaryArteryConnection"] } name_for_cid[12291] = "CardiacUltrasoundAortaFindingSite" cid_concepts[12291] = { "SCT": [ "InfraRenalAorta", "InnominateArtery", "CoarctationOfAorta", "LeftSubclavianArtery", "NonCoronarySinus", "AorticIsthmus", "RightSinusOfValsalva", "AorticSinotubularJunction", "AorticArch", "SupraRenalAorta", "AscendingAorta", "RootOfAorta", "LeftCommonCarotidArtery", "AbdominalAorta", "StructureSinusOfValsalva", "ThoracicAorta", "RightCommonCarotidArtery", "LeftSinusOfValsalva", "RightSubclavianArtery", ] } name_for_cid[12292] = "CardiacUltrasoundCoronaryArteryFindingSite" cid_concepts[12292] = { "SCT": [ "CircumflexCoronaryArtery", "AnteriorDescendingBranchOfLeftCoronaryArtery", "ProximalCircumflexCoronaryArtery", "DistalCircumflexCoronaryArtery", "PosteriorDescendingCoronaryArtery", "SeptalArtery", "RightCoronaryArtery", "MidCircumflexCoronaryArtery", "LeftMainCoronaryArtery", ] } name_for_cid[12293] = "CardiacUltrasoundAortopulmonaryConnectionFindingSite" cid_concepts[12293] = { "SCT": [ "ArteriovenousFistulaDisorder", "AortaToPulmonaryArteryConnection", "PatentDuctusArteriosus", ] } name_for_cid[12294] = "CardiacUltrasoundPericardiumandPleuraFindingSite" cid_concepts[12294] = {"SCT": ["Pericardium", "Pleura", "LeftPleura", "RightPleura"]} name_for_cid[12300] = "CoreEchoMeasurement" cid_concepts[12300] = { "DCM": [ "LVEndSystolicGLSALAXEndocardial", "LVEndSystolicGLS2CHEndocardial", "LVEndSystolicGLS4CHEndocardial", "LVEndSystolicGLSMultiviewMeanEndocardial", "LVPeakSystolicGLS2CHEndocardial", "LVPeakSystolicGLS4CHEndocardial", "LVPeakSystolicGLSMultiviewMeanEndocardial", "LVPeakGLS2CHEndocardial", "LVPeakGLS4CHEndocardial", "LVPeakGLSMultiviewMeanEndocardial", "LVPeakSystolicGLSALAXEndocardial", "LVEndSystolicMechanicalDispersion", "LVPeakGLSALAXEndocardial", ], "LN": [ "TricuspidValveDiastolicVTI", "MitralValvePeakInstantaneousGradient", "LeftAtrialEndSystolicVolumeBiplaneAreaLength", "LeftVentricularInternalSystolicDimensionByUSMModeBSA", "LeftVentricularPreEjectionPeriod", "LVBasalAnteriorTimeToSVmaxTsBasalAnterior", "MitralRegurgitationPISARadius", "PulmonicValveVmax", "PulmonaryVeinSWaveVmax", "LeftAtrialEndSystolicDiameterAPMMBSA", "RightVentricularMidCavityDimension4C", "LeftVentricularEndSystolicVolumeBiplaneMOD", "MitralRegurgitationVmax", "LeftVentricularEjectionFractionSinglePlane4CMOD", "InterventricularSeptumSystolicDimensionMM", "LeftVentricularMassDimensionMethodMMHeight2Point7", "LVMidSeptalTimeToSVmaxTsMidSeptal", "AorticSinotubularJunctionDimension", "LeftVentricularInternalDiastolicDimensionByUSMModeBSA", "TricuspidRegurgitationPISARadius", "InferiorVenaCavaDiameterAtEndExpiration", "AorticRegurgitantJetWidthLVOTWidthPercent", "MitralValveMeanGradient", "RightVentricularEjectionTime", "MitralAnnulusDiastolicDiameterA2C", "LeftAtrialEndSystolicVolumeBiplaneAreaLengthBSA", "MitralRegurgitationPeakGradient", "LeftVentricularInternalSystolicDimensionMM", "LeftVentricularStrokeVolume3D", "TricuspidRegurgitationVmax", "AorticValveAreaContinuityVmax", "TricuspidRegurgitationVenaContractaWidth", "PulmonicValveVTI", "PulmonicRegurgitationEndDiastolicVelocity", "MitralRegurgitationVenaContractaWidth", "LeftVentricularEndSystolicVolume3D", "LeftVentricularMassDimensionMethodMMBSA", "MitralValveDecelerationTime", "RightVentricularFreeWallThicknessMM", "LeftAtrialEndSystolicLength2C", "LVMidPosteriorTimeToSVmaxTsMidPosterior", "InterventricularSeptumSystolicDimension2D", "LeftVentricularFractionalShorteningOfMinorAxisMM", "LeftVentricularInternalDiastolicDimensionMM", "MitralValveAreaPressureHalfTime", "TricuspidValvePressureHalfTime", "LeftVentricularEndDiastolicLength4C", "InterventricularSeptumDiastolicDimensionMM", "MitralValveFlowPropagationVelocityVp", "LeftVentricularInternalSystolicDimension2D", "AorticValveEffectiveRegurgitantOrificeArea", "MitralRegurgitantFlowPISA", "LeftVentricularPosteriorWallSystolicThicknessByUS2D", "LeftAtrialEndSystolicVolumeBiplaneMOD", "LeftVentricularEjectionFractionTeichholzMM", "TricuspidValveAPrimeVmax", "AorticRegurgitationPISARadius", "LeftVentricularMassDimensionMethod2D", "AorticValveAreaContinuityVmaxBSA", "MitralSeptalEPrimeVmax", "PulmonicRegurgitationEndDiastolicPeakGradient", "MitralValveAreaPlanimetry", "MitralRegurgitationPISAVelocity", "PulmonicRegurgitationVmax", "LVMidLateralTimeToSVmaxTsMidLateral", "LeftVentricularMassDimensionMethodMM", "RightVentricularFreeWallThickness2D", "LeftVentricularEndDiastolicVolume3D", "InterventricularSeptumTimeToPeakDisplacement", "LeftVentricularFractionalShorteningOfMinorAxis2D", "LeftVentricularInternalDiastolicDimension2D", "TricuspidValveAWaveVmax", "InterventricularSeptumDiastolicDimension2D", "AorticValveMeanBloodVelocity", "MitralValveEffectiveRegurgitantOrificeAreaPISA", "LeftVentricularInternalDiastolicDimensionByUS2DBSA", "LeftVentricularPosteriorWallSystolicThicknessByUSMMode", "LeftAtrialEndSystolicVolumeBiplaneMODBSA", "MitralRegurgitantFractionPISA", "RightPulmonaryArteryDiameterAtEndSystole", "AorticRegurgitationPISAVelocity", "LeftVentricularMassAreaLengthHeight2Point7", "AorticValveAreaContinuityVTI", "PulmonicValveEjectionTime", "PulmonicValvePeakGradient", "LVMidInferiorTimeToSVmaxTsMidInferior", "RightVentricularEndSystolicArea4C", "LeftVentricularEpicardialAreaSAXPMLevel", "MitralValveAreaPISA", "LeftAtrialEndSystolicArea2C", "LeftVentricularMassDimensionMethod2DHeight2Point7", "LeftVentricularEndDiastolicVolumeBiplaneMOD", "LeftVentricularOutflowTractVmax", "MitralValvePressureHalfTime", "AorticRegurgitationVolumeContinuityVTI", "MitralValveEToARatio", "TricuspidValveEPrimeVmax", "AorticRegurgitationPressureHalfTime", "LeftAtrialEndSystolicVolumeSinglePlane2CMOD", "PulmonicAnnulusDiameter", "MitralValveEWaveVmax", "LeftVentricularPosteriorWallDiastolicThicknessByUS2D", "RightAtrialMinorAxisDimension4CBSA", "MitralRegurgitantFractionContinuityVTI", "AorticValveMeanGradient", "LeftVentricularMassAreaLengthBSA", "AorticValveAreaContinuityVTIBSA", "LeftVentricularEjectionFractionTeichholz2D", "RightVentricularFractionalAreaChange", "LeftVentricularMassDimensionMethod2DBSA", "LVMidAnteroseptalTimeToSVmaxTsMidAnteroseptal", "RightVentricularEndDiastolicArea4C", "RightVentricularOutflowTractVTI", "MitralValveAWaveVmax", "LeftAtrialEndSystolicArea4C", "LeftVentricularEndocardialAreaSAXPMLevel", "LeftVentricularEndDiastolicVolumeBiplaneMODBSA", "LeftVentricularOutflowTractDimension2D", "MitralValveVmax", "AorticRegurgitationVolumePISA", "AorticRegurgitationVenaContractaWidth", "TricuspidValveEWaveVmax", "LeftAtrialEndSystolicVolumeSinglePlane4CMOD", "RightAtrialMinorAxisDimension4C", "MitralLateralEPrimeVmax", "LeftVentricularPosteriorWallDiastolicThicknessByUSMMode", "LVBasalLateralTimeToSVmaxTsBasalLateral", "PulmonaryVeinAWaveDuration", "AorticValvePeakInstantaneousGradient", "LeftVentricularMassAreaLength", "AorticAnnulusDiameter", "MitralValveVTI", "AorticRegurgitationVTI", "LeftAtrialEndSystolicDiameterAP2D", "RightVentricularBasalDimension4C", "TricuspidRegurgitationPeakGradient", "MitralValveAWaveDuration", "RightVentricularOutflowTractDiameterAtSubvalvularLevelRVOTProximal", "LVMidAnteriorTimeToSVmaxTsMidAnterior", "LeftVentricularEjectionFraction3D", "LeftVentricularEndDiastolicVolumeSinglePlane2CMOD", "LeftVentricularEndSystolicVolumeSinglePlane4CMOD", "LeftVentricularMassTruncatedEllipseHeight2Point7", "AorticRegurgitationVmax", "TricuspidAnnulusDiameter", "TricuspidValveSPrimeVmax", "LeftVentricularOutflowTractVTI", "RightAtrialMajorAxisDimension4C", "MitralAnnulusVTI", "MainPulmonaryArteryVmax", "LeftVentricularIsovolumicRelaxationTimeByTDI", "LeftPulmonaryArteryDiameterAtEndSystole", "LVBasalInferiorTimeToSVmaxTsBasalInferior", "AorticValveVmax", "AorticRegurgitantFlow", "PulmonaryVeinAWaveVmax", "AorticRootDiameter", "RightVentricularOutflowTractDiameterAtPulmonicValveRVOTDistal", "LeftAtrialEndSystolicDiameterAP2DBSA", "LeftVentricularEndDiastolicVolumeSinglePlane4CMOD", "TricuspidValveMeanGradient", "MainPulmonaryArteryDiameterAtEndSystole", "LeftVentricularEjectionFractionBiplaneMOD", "LVBasalSeptalTimeToSVmaxTsBasalSeptal", "LeftVentricularEndSystolicVolumeSinglePlane2CMOD", "MitralRegurgitationVolumePISA", "LeftVentricularMassTruncatedEllipseBSA", "TricuspidValveClosureToOpeningTime", "TricuspidValveVmax", "AorticRegurgitantFraction", "LeftVentricularIsovolumicRelaxationTimeByDoppler", "MitralAnnulusDiastolicDiameterPLAX", "RightVentricularPreEjectionPeriod", "RightAtrialEndSystolicArea4C", "LVBasalAnteroseptalTimeToSVmaxTSBasalAnteroseptal", "LeftAtrialEndSystolicLength4C", "LeftVentricularInternalSystolicDimensionByUS2DBSA", "LeftVenticularPosteriorWallTimeToPeakDisplacement", "AorticValveVTI", "TricuspidAnnularPlaneSystolicExcursionTAPSE", "PulmonaryVeinDWaveVmax", "TricuspidValvePeakGradient", "MitralRegurgitationVolumeContinuityVTI", "LeftAtrialEndSystolicDiameterAPMM", "RightVentricularMyocardialPerformanceIndex", "LVBasalPosteriorTimeToSVmaxTsBasalPosterior", "LeftVentricularEjectionFractionSinglePlane2CMOD", "LeftVentricularMass", "LVTsSDDyssynchronyIndex", "AorticRootDiameterBSA", "LeftVentricularEndSystolicVolumeBiplaneMODBSA", "TricuspidValveDecelerationTime", "AscendingAortaDimension", "AorticRegurgitantJetAreaLVOTAreaPercent", "MitralAnnulusDiastolicDiameterA4C", "PulmonicValveAccelerationTime", ], } name_for_cid[12301] = "MeasurementSelectionReason" cid_concepts[12301] = { "DCM": ["MostRecentValueChosen", "MeanValueChosen", "UserChosenValue"], "SCT": ["Minimum", "Maximum"], } name_for_cid[12302] = "EchoFindingObservationType" cid_concepts[12302] = { "DCM": ["BehaviorOfTheFindingSite", "StructureOfTheFindingSite"], "SCT": ["HemodynamicMeasurements"], } name_for_cid[12303] = "EchoMeasurementType" cid_concepts[12303] = { "DCM": [ "DirectlyMeasured", "Calculated", "FractionalChange", "Indexed", "ManualEntry", ], "SCT": ["Ratio"], } name_for_cid[12304] = "EchoMeasuredProperty" cid_concepts[12304] = { "DCM": [ "LongitudinalLagrangianStrain", "LongitudinalLagrangianStrainRate", "MechanicalDispersion", "TimeToPeakLongitudinalLagrangianStrain", "PeakLongitudinalLagrangianStrain", "CircumferentialLagrangianStrainRate", "CircumferentialLagrangianStrain", "RadialLagrangianStrainRate", "RadialLagrangianStrain", "VenaContractaWidth", "RegurgitationJetWidth", "RegurgitationJetArea", "PISARadius", "PeakTissueVelocity", "PeakBloodPressure", "MaximumOrificeArea", "ExcursionDistance", "EffectiveOrificeArea", "DyssynchronyIndex", ], "LN": [ "MeanGradientPressureByDoppler", "VelocityTimeIntegral", "VolumeFlowRate", "InternalDimension", "PeakGradientPressure", "PeakInstantaneousFlowRate", "DecelerationTime", "AccelerationTime", "PeakBloodVelocity", "DpDtByUS", "Thickness", "FractionalShortening", "AliasVelocity", "PressureHalfTime", "EpicardialArea", "MyocardialPerformanceIndexTei", "MeanBloodVelocity", ], "SCT": [ "Interval", "VascularResistance", "Volume", "Area", "MeanBloodPressure", "CardiacEjectionFraction", "Length", "BloodPressure", "MassQuantity", "RegurgitantFraction", "MinorAxis", "Angle", "Diameter", "StrokeVolume", ], } name_for_cid[12305] = "BasicEchoAnatomicSite" cid_concepts[12305] = { "DCM": [ "LeftVentricleApicalAnterolateralSegment", "LeftVentricleApicalInferolateralSegment", "LeftVentricleApicalInferoseptalSegment", "LeftVentricleApicalAnteroseptalSegment", "RightVentricleAnteriorWall", "RightVentricleOutflowTractProximal", "RightVentricleOutflowTractDistal", ], "SCT": [ "PulmonicValve", "PulmonaryVeinGreatVessel", "AorticValve", "AorticSinotubularJunction", "ApexOfRightVentricle", "LeftVentricleBasalInferiorSegment", "InferiorVenaCava", "RightPulmonaryArtery", "AorticRoot", "RightAtrium", "TricuspidValve", "LeftVentricleMidAnterolateralSegment", "RightVentricle", "RightVentricleMidventricularSegment", "PulmonicRing", "LeftVentricleMidAnteroseptalSegment", "LeftVentricleOutflowTract", "LeftPulmonaryArtery", "TricuspidAnnulus", "LeftVentricleMidInferiorSegment", "LeftVentricleApicalLateralSegment", "LeftVentricleBasalAnterolateralSegment", "LeftVentricleMidInferolateralSegment", "LateralMitralAnnulus", "LeftVentricleMidAnteriorSegment", "LeftVentricleMyocardium", "LeftVentricleApicalAnteriorSegment", "LeftVentricleBasalAnteriorSegment", "MitralAnnulus", "MedialMitralAnnulus", "LeftVentricle", "LeftVentricleMidInferoseptalSegment", "AorticValveRing", "InterventricularSeptum", "RightVentricleOutflowTract", "LeftVentricleBasalAnteroseptalSegment", "LeftVentricleBasalInferolateralSegment", "LeftVentricleApicalInferiorSegment", "LeftVentricleBasalInferoseptalSegment", "TrunkOfPulmonaryArtery", "ApexOfLeftVentricle", "LeftVentricleApicalSeptalSegment", "AscendingAorta", "PulmonaryArtery", "LeftAtrium", "RightVentricleBasalSegment", "MitralValve", ], } name_for_cid[12306] = "EchoFlowDirection" cid_concepts[12306] = {"SCT": ["RetrogradeDirection", "AntegradeDirection"]} name_for_cid[12307] = "CardiacPhaseandTimePoint" cid_concepts[12307] = { "DCM": [ "MitralValveOpening", "MitralValveClosure", "FullCardiacCycle", "ARWave", "AtrialDiastolicFillingDWave", "AorticValveOpening", "PreEjectionPeriod", "AorticValveClosure", "ElectromechanicalDelay", ], "SCT": [ "Diastole", "VentricularIsovolumicContraction", "EndDiastole", "Diastasis", "EndSystole", "AtrialSystoleAWave", "VentricularEjectionSWave", "DiastolicRapidInflowEWave", "VentricularIsovolumicRelaxation", "Systole", ], } name_for_cid[12308] = "UltrasoundShearWaveMeasurement" cid_concepts[12308] = { "DCM": ["Elasticity", "ShearWaveDispersionSlope", "ShearWaveSpeed", "ROIDepth"], "SCT": ["AreaOfDefinedRegion"], } name_for_cid[12309] = "CoreEchoStrainMeasurement" cid_concepts[12309] = { "DCM": [ "LVPeakSystolicGLS2CHEndocardial", "LVPeakSystolicGLS4CHEndocardial", "LVPeakSystolicGLSMultiviewMeanEndocardial", "LVPeakGLS2CHEndocardial", "LVPeakGLS4CHEndocardial", "LVPeakGLSMultiviewMeanEndocardial", "LVPeakSystolicGLSALAXEndocardial", "LVEndSystolicGLSALAXEndocardial", "LVEndSystolicGLS2CHEndocardial", "LVEndSystolicGLS4CHEndocardial", "LVEndSystolicMechanicalDispersion", "LVEndSystolicGLSMultiviewMeanEndocardial", "LVPeakGLSALAXEndocardial", ] } name_for_cid[12310] = "MyocardialStrainMethod" cid_concepts[12310] = { "DCM": ["MyocardialMidlayerMethod", "EpicardialMethod", "EndocardialMethod"] } name_for_cid[12311] = "EchoMeasuredStrainProperty" cid_concepts[12311] = { "DCM": [ "LongitudinalLagrangianStrainRate", "MechanicalDispersion", "TimeToPeakLongitudinalLagrangianStrain", "PeakLongitudinalLagrangianStrain", "CircumferentialLagrangianStrainRate", "CircumferentialLagrangianStrain", "RadialLagrangianStrainRate", "RadialLagrangianStrain", "LongitudinalLagrangianStrain", ] } name_for_cid[12320] = "GeneralUltrasoundReportDocumentTitle" cid_concepts[12320] = { "LN": [ "USTendonReport", "USPancreasReport", "USBreastReport", "USProstateTransrectalReport", "USThyroidReport", "UltrasoundReport", "USSpleenReport", "USShoulderReport", "USScrotumAndTesticleReport", "USLiverReport", "USKidneyReport", ] } name_for_cid[12321] = "ElastographySite" cid_concepts[12321] = { "SCT": [ "Testis", "Pancreas", "Liver", "Prostate", "TendonOfRotatorCuffOfShoulder", "Thyroid", "Breast", "Spleen", "Kidney", "PatellarTendon", "AchillesTendon", ] } name_for_cid[12322] = "ElastographyMeasurementSite" cid_concepts[12322] = { "DCM": ["Background"], "SCT": [ "CouinaudHepaticSegmentIII", "CouinaudHepaticSegmentVII", "CouinaudHepaticSegmentVI", "CouinaudHepaticSegmentI", "ThyroidNodule", "CouinaudHepaticSegmentV", "CouinaudHepaticSegmentVIII", "CouinaudHepaticSegmentII", "CouinaudHepaticSegmentIV", ], } name_for_cid[12323] = "UltrasoundRelevantPatientCondition" cid_concepts[12323] = { "SCT": ["NotFasting", "AcuteHepatitis", "HepaticCongestion", "PatientHasPacemaker"] } name_for_cid[12324] = "ShearWaveDetectionMethod" cid_concepts[12324] = {"DCM": ["ParticleVelocityMethod", "ParticleDisplacementMethod"]} name_for_cid[12325] = "LiverUltrasoundStudyIndication" cid_concepts[12325] = { "SCT": [ "AlcoholicLiverDisease", "NonalcoholicFattyLiverDiseaseNAFLD", "NonalcoholicSteatohepatitisNASH", "SerumAlbuminBelowReferenceRange", "SerumBilirubinRaised", "Jaundice", "SerumAlanineAminotransferaseLevelRaised", "HepatitisC", "Hepatomegaly", "NonalcoholicFattyLiverNAFL", "Hepatitis", "HepatitisB", "CirrhosisOfLiver", ] } pydicom-pydicom-20aa4b7/src/pydicom/sr/_concepts_dict.py000066400000000000000000070550501515706620200234530ustar00rootroot00000000000000# Auto-generated by generate_concept_dicts.py. # Dict with scheme designator keys; value format is: # {keyword: {code1: (meaning, cid_list), code2: ...} # # Most keyword identifiers map to a single code, but not all concepts = {} concepts["DCM"] = { "AAPM204APDimension": {"113935": ("AAPM 204 AP Dimension", [10023])}, "AAPM204EffectiveDiameterEstimatedFromPatientAge": { "113937": ("AAPM 204 Effective Diameter Estimated From Patient Age", [10023]) }, "AAPM204LateralDimension": {"113934": ("AAPM 204 Lateral Dimension", [10023])}, "AAPM204SumOfLateralAndAPDimension": { "113936": ("AAPM 204 Sum of Lateral and AP Dimension", [10023]) }, "AAPM220": {"113987": ("AAPM 220", [])}, "ACDConstant": {"111768": ("ACD Constant", [4237])}, "ACRAccreditationPhantomCT": { "113682": ("ACR Accreditation Phantom - CT", [4051, 4052]) }, "ACRAccreditationPhantomECT": { "113686": ("ACR Accreditation Phantom - ECT", [4051, 4052]) }, "ACRAccreditationPhantomECTPET": { "113688": ("ACR Accreditation Phantom - ECT/PET", [4051, 4052]) }, "ACRAccreditationPhantomMR": { "113683": ("ACR Accreditation Phantom - MR", [4051, 4052]) }, "ACRAccreditationPhantomMammography": { "113684": ("ACR Accreditation Phantom - Mammography", [4051, 4052]) }, "ACRAccreditationPhantomPET": { "113687": ("ACR Accreditation Phantom - PET", [4051, 4052]) }, "ACRAccreditationPhantomPETFaceplate": { "113689": ("ACR Accreditation Phantom - PET Faceplate", [4051, 4052]) }, "ACRAccreditationPhantomStereotacticBreastBiopsy": { "113685": ( "ACR Accreditation Phantom - Stereotactic Breast Biopsy", [4051, 4052], ) }, "ACRGuidelinePerformanceOfAdultCTColonography": { "112248": ("ACR Guideline, Performance of Adult CT Colonography", [6208]) }, "ACRPositionStatement": {"112036": ("ACR Position Statement", [6136, 6208])}, "ACRStandardCTMedicalPhysicsPerformanceMonitoring": { "112249": ("ACR Standard, CT medical physics performance monitoring", [6208]) }, "ADCHyperintense": {"130595": ("ADC Hyperintense", [6335, 6343, 6344])}, "ADCHypointense": {"130596": ("ADC Hypointense", [6335, 6343, 6344])}, "AF10": {"130713": ("AF10", [3030])}, "AF9": {"130712": ("AF9", [3030])}, "AGN15099889Zr": {"126729": ("AGN-150998 ^89^Zr", [4021])}, "AIC": {"126223": ("AIC", [218, 7180, 7469])}, "AIFIgnored": {"126360": ("AIF Ignored", [4103, 4106])}, "AIN76": {"127272": ("AIN76", [607])}, "AIN93G": {"127273": ("AIN93G", [607])}, "AIN93M": {"127274": ("AIN93M", [607])}, "ANGPattern": {"109902": ("ANG Pattern", [8301])}, "APMinus45": {"112301": ("AP-45", [7303])}, "APPlus45": {"112300": ("AP+45", [7303])}, "ARWave": {"125323": ("AR-wave", [12307])}, "ATSMCu60": {"126700": ("ATSM Cu^60^", [4021])}, "ATSMCu61": {"126701": ("ATSM Cu^61^", [4021])}, "ATSMCu62": {"126702": ("ATSM Cu^62^", [4021])}, "AUCBN180": {"126327": ("AUCBN180", [])}, "AWavePeakPressure": {"109016": ("A wave peak pressure", [3337, 3611])}, "AWavePressureAverage": {"109017": ("A wave pressure, average", [3337])}, "AbdominalCompressionArch": { "130655": ( "Abdominal Compression Arch", [7151, 7157, 7193, 9505, 9513, 9520, 9573], ) }, "AbdominalCompressionBelt": { "130654": ( "Abdominal Compression Belt", [7151, 7157, 7193, 9505, 9513, 9520, 9573], ) }, "AbdominalCompressionBeltLength": { "130660": ("Abdominal Compression Belt Length", []) }, "AbdominalCompressionBeltPressure": { "130661": ("Abdominal Compression Belt Pressure", []) }, "AbdominalCompressionPlatePositionNumber": { "130659": ("Abdominal Compression Plate Position Number", []) }, "AbdominalImagingSpecialty": {"128006": ("Abdominal Imaging Specialty", [7449])}, "AbdominalRadiology": {"128170": ("Abdominal Radiology", [7030])}, "AbdominalRespiratoryEffort": {"130432": ("Abdominal Respiratory Effort", [3005])}, "AbdominalRespiratoryInductance": { "130428": ("Abdominal Respiratory Inductance", [3005]) }, "AbdominalRespiratoryPVDF": {"130430": ("Abdominal Respiratory PVDF", [3005])}, "AblationOff": {"109038": ("Ablation off", [3339])}, "AblationOn": {"109039": ("Ablation on", [3339])}, "AbnormalCalcifications": {"112063": ("Abnormal calcifications", [6101])}, "AbnormalDischarge": {"111491": ("Abnormal discharge", [6062])}, "AbnormalDistributionOfAnatomicStructure": { "112028": ("Abnormal Distribution of Anatomic Structure", []) }, "AbnormalInterstitialPattern": { "112004": ("Abnormal interstitial pattern", [6102, 6104, 6106]) }, "AbnormalLines1D": {"112061": ("Abnormal lines (1D)", [6101])}, "AbnormalLucency": {"112062": ("Abnormal lucency", [6101])}, "AbnormalOpacity": {"112033": ("Abnormal opacity", [6101])}, "AbnormalRegion": {"122451": ("Abnormal Region", [])}, "AbnormalTexture": {"112064": ("Abnormal texture", [6101])}, "AbnormallyHighSensitivity": {"111849": ("Abnormally high sensitivity", [4254])}, "AbruptDuctTermination": {"111427": ("Abrupt duct termination", [6054, 6057])}, "AbruptInterface": {"111358": ("Abrupt interface", [6153])}, "Absent": {"121054": ("Absent", [])}, "AbsoluteOphthalmicThickness": { "111930": ("Absolute ophthalmic thickness", [4263]) }, "AbsoluteRegionalBloodFlow": { "126390": ("Absolute Regional Blood Flow", [218, 4108, 7180, 7469]) }, "AbsoluteRegionalBloodVolume": { "126391": ("Absolute Regional Blood Volume", [218, 4108, 7180, 7469]) }, "AbsoluteValuesOfVentricularMeasurements": { "122608": ("Absolute Values Of Ventricular Measurements", []) }, "AbsorbedDose": {"128513": ("Absorbed Dose", [218, 7180, 7469, 10070])}, "AccessControlDecision": {"110147": ("Access Control Decision", [401, 403])}, "AccessionNumber": {"121022": ("Accession Number", [])}, "AccessoryClearanceInterlock": { "130742": ("Accessory Clearance Interlock", [9561, 9568]) }, "AccessoryTray": {"130124": ("Accessory Tray", [9518, 9520])}, "AccumulatedAverageGlandularDose": { "111637": ("Accumulated Average Glandular Dose (mammo)", [10050]) }, "AccumulatedCtdivolForwardEstimate": { "113906": ("Accumulated CTDIvol Forward Estimate", []) }, "AccumulatedDLPForwardEstimate": { "113905": ("Accumulated DLP Forward Estimate", []) }, "AccumulatedDoseData": {"130500": ("Accumulated Dose Data", [])}, "AccumulatedXRayDoseData": {"113702": ("Accumulated X-Ray Dose Data", [])}, "AcetabularAngle": {"121224": ("Acetabular angle", [218, 7550])}, "AcetabularCenterOfRotation": { "112303": ("Acetabular Center of Rotation", [7305, 7306]) }, "AcetabularCupInsert": {"112306": ("Acetabular Cup Insert", [7307, 7308])}, "AcetabularCupMonoblock": {"112307": ("Acetabular Cup Monoblock", [7307, 7308])}, "AcetabularCupShell": {"112305": ("Acetabular Cup Shell", [7307, 7308])}, "Acinar": {"112146": ("Acinar", [6123])}, "AcquiredImage": {"113795": ("Acquired Image", [])}, "AcquiredVolume": {"128160": ("Acquired Volume", [1000])}, "AcquisitionDate": {"126201": ("Acquisition Date", [])}, "AcquisitionDeviceID": {"122143": ("Acquisition Device ID", [])}, "AcquisitionDeviceType": {"122142": ("Acquisition Device Type", [])}, "AcquisitionDoseAreaProductTotal": { "113727": ("Acquisition Dose Area Product Total", [10050]) }, "AcquisitionDoseRPTotal": {"113729": ("Acquisition Dose (RP) Total", [])}, "AcquisitionDuration": {"121142": ("Acquisition Duration", [])}, "AcquisitionEquipment": {"109101": ("Acquisition Equipment", [7005])}, "AcquisitionEquipmentAlignment": { "125023": ("Acquisition Equipment Alignment", [7100]) }, "AcquisitionFramesCorrespondingToVolume": { "121346": ("Acquisition frames corresponding to volume", [7201]) }, "AcquisitionInitiationAfterEndOfRadiation": { "130794": ("Acquisition Initiation after end of Radiation", [9270]) }, "AcquisitionInitiationBeforeStartOfRadiation": { "130793": ("Acquisition Initiation before start of Radiation", [9270]) }, "AcquisitionInitiationByTriggeringParameter": { "130795": ("Acquisition Initiation by triggering parameter", [9270]) }, "AcquisitionInitiationNotDefined": { "130792": ("Acquisition Initiation not defined", [9270]) }, "AcquisitionInitiationType": {"130791": ("Acquisition Initiation Type", [])}, "AcquisitionNumber": {"113608": ("Acquisition Number", [10022])}, "AcquisitionPlane": {"113764": ("Acquisition Plane", [])}, "AcquisitionProtocol": {"125203": ("Acquisition Protocol", [])}, "AcquisitionTime": {"126202": ("Acquisition Time", [])}, "ActionOnFluid": {"111456": ("Action on fluid", [])}, "ActiveIngredientUndilutedConcentration": { "121380": ("Active Ingredient Undiluted Concentration", [4050]) }, "ActiveSurveillanceOfProstateCancer": { "130589": ("Active surveillance of prostate cancer", [6327]) }, "ActivityMeasurementDevice": {"113540": ("Activity Measurement Device", [])}, "ActivityWorkload": {"122709": ("Activity workload", [])}, "AcuteMIPresent": {"122172": ("Acute MI Present", [])}, "AcuteUnilateralRenalBlockage": { "113560": ("Acute unilateral renal blockage", [64, 10045]) }, "AdaptiveFiltering": {"123102": ("Adaptive Filtering", [7162])}, "AdaptiveRadiationTherapyNote": {"130039": ("Adaptive Radiation Therapy Note", [])}, "AddAddendumToReport": {"128001": ("Add Addendum to Report", [9231])}, "AddIntermediate": {"111673": ("Add Intermediate", [])}, "AddNear": {"111672": ("Add Near", [])}, "AddOther": {"111674": ("Add Other", [])}, "AddendedReport": {"121361": ("Addended report", [7009])}, "Addendum": {"121078": ("Addendum", [])}, "AdditionalEvaluationRequestedFromAbnormalScreeningStudy": { "111419": ( "Additional evaluation requested from abnormal screening study", [6051], ) }, "AdditionalEvaluationRequestedFromPriorStudy": { "111415": ("Additional evaluation requested from prior study", [6051]) }, "AdditionalProjections": {"111135": ("Additional projections", [6028, 6029])}, "AdditionalTeachingFileInformation": { "128712": ("Additional Teaching File Information", [7018]) }, "Adenolipoma": {"111248": ("Adenolipoma", [])}, "Adenomyoepithelioma": {"111250": ("Adenomyoepithelioma", [])}, "AdhocMeasurements": {"125303": ("Adhoc Measurements", [])}, "AdiabaticTissueHomogeneityATHModel": { "126346": ("Adiabatic Tissue Homogeneity (ATH) Model", [4101, 4106]) }, "AdministeredActivity": {"113507": ("Administered activity", [10050])}, "AdministrationDiscontinued": {"130220": ("Administration discontinued", [])}, "AdministrationMode": {"130181": ("Administration Mode", [])}, "AdministrationStepType": {"130250": ("Administration Step Type", [])}, "AdministratorOfRadiologyDepartment": { "128673": ("Administrator of Radiology Department", [7450, 7452]) }, "AdultCongenitalCardiacUltrasoundReport": { "125197": ("Adult Congenital Cardiac Ultrasound Report", [7000, 12245]) }, "AdultEchocardiographyProcedureReport": { "125200": ("Adult Echocardiography Procedure Report", [7000]) }, "AdvancedLevel": {"128727": ("Advanced level", [7016])}, "AdventitialDissection": {"122397": ("Adventitial Dissection", [3492])}, "AdverseEventDetectionDatetime": { "130215": ("Adverse Event Detection DateTime", []) }, "AerobicIndex": {"122772": ("Aerobic index", [3238])}, "AgatstonScoreThreshold": {"122657": ("Agatston Score Threshold", [])}, "AgatstonScoringMethod": {"112055": ("Agatston scoring method", [6140])}, "AgeAtFirstFullTermPregnancy": {"111519": ("Age at First Full Term Pregnancy", [])}, "AgeAtMenopause": {"111520": ("Age at Menopause", [])}, "AgeAtOccurrence": {"111538": ("Age at Occurrence", [])}, "AgeCorrected": {"111838": ("Age corrected", [4252])}, "AgeEnded": {"111525": ("Age Ended", [])}, "AgeStarted": {"111524": ("Age Started", [])}, "AgeWhenFirstMenstrualPeriodOccurred": { "111518": ("Age when first menstrual period occurred", []) }, "AgeWhenHysterectomyPerformed": {"111521": ("Age when hysterectomy performed", [])}, "AgeWhenLeftOvaryRemoved": {"111522": ("Age when left ovary removed", [])}, "AgeWhenRightOvaryRemoved": {"111523": ("Age when right ovary removed", [])}, "AgreementWithPriorFindings": {"122775": ("Agreement with prior findings", [3217])}, "Air": {"112143": ("Air", [6122])}, "AirBronchiologram": {"112070": ("Air bronchiologram", [6102, 6105])}, "AirBronchogram": {"112071": ("Air bronchogram", [6102, 6105])}, "AirChanges": {"127172": ("Air changes", [])}, "AirCrescent": {"112072": ("Air crescent", [6102, 6105])}, "AirDetected": {"130175": ("Air detected", [71])}, "AirFluidLevel": {"112104": ("Air-fluid level", [6102, 6103])}, "AirKermaAtOutputMeasurementPoint": { "130515": ("Air Kerma at Output Measurement Point", []) }, "AirSpace": {"112147": ("Air space", [6123])}, "Airflow": {"130421": ("Airflow", [3005])}, "AirflowCPAP": {"130420": ("Airflow CPAP", [3005])}, "AirflowNasalProng": {"130418": ("Airflow Nasal Prong", [3005])}, "AirflowPVDF": {"130419": ("Airflow PVDF", [3005])}, "AirflowThermistor": {"130416": ("Airflow Thermistor", [3005])}, "AirflowThermocouple": {"130417": ("Airflow Thermocouple", [3005])}, "AirwayManagementMethod": {"127312": ("Airway Management Method", [])}, "AirwayManagementSet": {"127310": ("Airway Management Set", [])}, "AirwayPartiallyObstructed": {"122282": ("airway partially obstructed", [3448])}, "AirwaySeverelyObstructed": {"122283": ("airway severely obstructed", [3448])}, "AirwaySubManagementMethod": {"127313": ("Airway Sub-Management Method", [])}, "AirwayUnobstructed": {"122281": ("airway unobstructed", [3448])}, "AlgorithmFamily": {"111000": ("Algorithm Family", [])}, "AlgorithmManufacturer": {"122405": ("Algorithm Manufacturer", [])}, "AlgorithmName": {"111001": ("Algorithm Name", [])}, "AlgorithmParameters": {"111002": ("Algorithm Parameters", [])}, "AlgorithmVersion": {"111003": ("Algorithm Version", [])}, "AlgorithmicAttenuationCorrection": { "122726": ("Algorithmic Attenuation Correction", [3112]) }, "AllAlgorithmsSucceededWithFindings": { "111242": ("All algorithms succeeded; with findings", [6047]) }, "AllAlgorithmsSucceededWithoutFindings": { "111241": ("All algorithms succeeded; without findings", [6047]) }, "AllPlanes": {"113890": ("All Planes", [10003])}, "AlphaGeudValue": {"130095": ("alpha gEUD Value", [])}, "AlternatePhotometricInterpretationImage": { "121328": ("Alternate Photometric Interpretation image", [7205]) }, "AlternateSOPClassInstance": {"121326": ("Alternate SOP Class instance", [7205])}, "AlternativeDoseAlertBehaviorActive": { "113915": ("Alternative dose alert behavior active", []) }, "AmbientRoomEnvironment": {"109112": ("Ambient room environment", [3000])}, "AmbiguousSex": {"121104": ("Ambiguous sex", [7455])}, "AmericaKennelClub": {"109200": ("America Kennel Club", [7481])}, "AmericaPetRegistryInc": {"109201": ("America's Pet Registry Inc.", [7481])}, "AmericanCanineAssociation": {"109202": ("American Canine Association", [7481])}, "AmericanPurebredRegistry": {"109203": ("American Purebred Registry", [7481])}, "AmericanRareBreedAssociation": { "109204": ("American Rare Breed Association", [7481]) }, "AnalysisOrMeasurementsForCurrentProcedure": { "122073": ("Analysis or measurements for current procedure", [3407]) }, "AnalysisPerformed": {"111004": ("Analysis Performed", [])}, "AnalysisQualityRating": {"111693": ("Analysis Quality Rating", [])}, "AnalyticalAlgorithm": {"128480": ("Analytical Algorithm", [10068])}, "AnatomicIdentifier": {"112050": ("Anatomic Identifier", [])}, "AnatomicImage": {"121338": ("Anatomic image", [7201])}, "AnatomicNonColon": {"112238": ("Anatomic non-colon", [6201])}, "AnatomicalAxisOfFemur": {"112302": ("Anatomical axis of femur", [7305, 7306])}, "AnatomyCoverageIncomplete": {"130576": ("Anatomy coverage incomplete", [6315])}, "Anechoic": {"111361": ("Anechoic", [6154])}, "AnesthesiaCategory": {"127302": ("Anesthesia Category", [])}, "AnesthesiaMethod": {"127301": ("Anesthesia Method", [])}, "AnesthesiaMethodSet": {"127300": ("Anesthesia Method Set", [])}, "AnesthesiaSubcategory": {"127303": ("Anesthesia SubCategory", [])}, "AneurysmOnCitedVessel": {"122101": ("Aneurysm on cited vessel", [3019])}, "AnginalEquivalent": {"122799": ("Anginal Equivalent", [3202, 3220])}, "AngioplastyBalloonDeflated": {"122304": ("Angioplasty balloon deflated", [3412])}, "AngioplastyBalloonInflated": {"122303": ("Angioplasty balloon inflated", [3412])}, "Angiosarcoma": {"111302": ("Angiosarcoma", [])}, "Angioscopy": {"AS": ("Angioscopy", [])}, "Angle": {"110859": ("Angle", [7182])}, "AngularMargins": {"111343": ("Angular margins", [6006, 6007])}, "AngularSecondMomentOfGLCM": {"126065": ("Angular Second Moment of GLCM", [])}, "AngularViewingEvaluation": {"109709": ("Angular viewing evaluation", [8300])}, "AnimalHandlingDuringSpecifiedPhase": { "127005": ("Animal handling during specified phase", []) }, "AnimalHousing": {"127120": ("Animal housing", [])}, "AnimalHousingRoom": {"127370": ("Animal housing room", [603])}, "AnimalRegistryUnlimited": {"109205": ("Animal Registry Unlimited", [7481])}, "AnimalResearchFoundation": {"109206": ("Animal Research Foundation", [7481])}, "AnimalRoomIdentifier": {"127122": ("Animal room identifier", [])}, "AnimalRoomType": {"127121": ("Animal room type", [])}, "Annotation": {"ANN": ("Annotation", [])}, "AnodeTargetMaterial": {"111632": ("Anode Target Material", [])}, "AnomalousExponentParameter": { "113299": ("Anomalous Exponent Parameter", [218, 7180, 7272, 7469]) }, "AnteriorFirst": {"126833": ("anterior first", [21])}, "AnteriorInferiorAxis": {"110864": ("Anterior-Inferior Axis", [7184])}, "AnteriorJunctionLine": { "112088": ("Anterior junction line", [6102, 6109, 6112, 7151, 7192, 9514]) }, "AnteriorPosterior": {"122675": ("Anterior-Posterior", [3838, 12118])}, "AnteriorPosteriorAxis": {"110862": ("Anterior-Posterior Axis", [7184])}, "AnteriorSurfaceOfTheRPE": { "128297": ("Anterior surface of the RPE", [4273, 7151, 7192, 9514]) }, "AnteriorToInferior": {"110874": ("Anterior To Inferior", [7185])}, "AnteriorToPosterior": {"110870": ("Anterior To Posterior", [7185])}, "AnthropomorphicModel": {"128404": ("Anthropomorphic Model", [10064])}, "AntiB22089Zr": {"126754": ("Anti-B220 ^89^Zr", [4021])}, "AnyDecisionToBiopsyShouldBeBasedOnClinicalAssessment": { "111141": ( "Any decision to biopsy should be based on clinical assessment", [6028, 6029], ) }, "AorticIntervention": {"122054": ("Aortic Intervention", [3405, 3406])}, "AorticKnob": { "112102": ("Aortic knob", [6102, 6109, 6117, 7151, 7192, 8134, 9514]) }, "AorticValveClosure": {"130701": ("Aortic Valve Closure", [12307])}, "AorticValveOpening": {"130702": ("Aortic Valve Opening", [12307])}, "ApertureBlock": {"130123": ("Aperture Block", [9517, 9520, 9541, 9545])}, "ApexBaseAxis": {"110863": ("Apex-Base Axis", [7184])}, "ApexToBase": {"110872": ("Apex To Base", [7185])}, "ApicalFourChamberRVFocused": { "130681": ("Apical four chamber RV Focused", [501, 12226]) }, "ApicalFourChamberRVModified": { "130682": ("Apical four chamber RV Modified", [501, 12226]) }, "ApparentDiffusionCoefficient": { "113041": ( "Apparent Diffusion Coefficient", [218, 6311, 7180, 7263, 7272, 7469], ) }, "ApparentKurtosisCoefficient": { "113206": ("Apparent Kurtosis Coefficient", [7263]) }, "Application": {"110150": ("Application", [402])}, "ApplicationActivity": {"110100": ("Application Activity", [400])}, "ApplicationLauncher": {"110151": ("Application Launcher", [402])}, "ApplicationStart": {"110120": ("Application Start", [401, 403])}, "ApplicationStop": {"110121": ("Application Stop", [401, 403])}, "ApplicatorPresent": {"130459": ("Applicator Present", [9564])}, "AppropriateForTheDevice": {"128606": ("Appropriate for the device", [800])}, "AppropriateForTheIndications": { "128601": ("Appropriate for the indications", [800]) }, "ApprovedForExperimentalUse": {"128611": ("Approved for experimental use", [800])}, "ApprovedForUseAtTheInstitution": { "128603": ("Approved for use at the institution", [800]) }, "ApprovedForUseInTheClinicalTrial": { "128604": ("Approved for use in the clinical trial", [800]) }, "ApprovedForUseOnPregnantPatients": { "128605": ("Approved for use on pregnant patients", [800]) }, "ApproximateSpatialLocation": { "121226": ("Approximate spatial location", [7551, 7553]) }, "ArcBeam": {"130103": ("Arc Beam", [9511, 9524, 9583])}, "ArcOfCalcium": {"122355": ("Arc of Calcium", [])}, "ArchOfTheAzygosVein": { "112103": ( "Arch of the Azygos vein", [6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "ArchitecturalDistortion": {"112079": ("Architectural distortion", [6108])}, "Archive": {"ARCHIVE": ("Archive", [30])}, "AreaBasedMethod": {"122650": ("Area Based Method", [3804, 3807])}, "AreaByPressureHalfTime": { "125210": ("Area by Pressure Half-Time", [12227, 12229]) }, "AreaEqualsFlow44Point5SqrtGradientMmhg": { "122262": ("Area = Flow / 44.5 * sqrt(Gradient[mmHg])", []) }, "AreaLengthBiplane": {"125204": ("Area-Length Biplane", [12227, 12228])}, "AreaLengthDodge": {"122559": ("Area Length Dodge", [3453])}, "AreaLengthKennedy": {"122558": ("Area Length Kennedy", [3453])}, "AreaLengthMethod": {"122428": ("Area Length Method", [])}, "AreaLengthSinglePlane": {"125205": ("Area-Length Single Plane", [12227, 12228])}, "AreaLengthWynne": {"122560": ("Area Length Wynne", [3453])}, "AreaOfAClosedNURBS": {"122502": ("Area of a closed NURBS", [7473])}, "AreaOfClosedIrregularPolygon": { "122501": ("Area of closed irregular polygon", [7473]) }, "AreaOfDefinedRegion": {"121202": ("Area of Defined Region", [])}, "AreaOfVascularCalcification": { "112196": ("Area of Vascular Calcification", [6142]) }, "AreaOutline": {"121056": ("Area outline", [])}, "AreaOutline_Retired": {"121201": ("Area Outline", [])}, "AreaSymmetry": {"122545": ("Area Symmetry", [])}, "ArithmeticAverageOfDwZ": {"113990": ("Arithmetic Average of Dw(z)", [])}, "ArithmeticAverageOfSSDEZ": {"113989": ("Arithmetic Average of SSDE(z)", [10023])}, "ArmOfAngle": {"121223": ("Arm of angle", [7551, 7553])}, "ArterialConduitAngiography": { "122058": ("Arterial conduit angiography", [3405, 3428]) }, "ArterialPulseWaveform": {"109116": ("Arterial Pulse Waveform", [3004])}, "ArteriovenousDifference": {"122229": ("Arteriovenous difference", [])}, "ArtifactsOtherThanGridOrDetectorArtifact": { "111215": ( "Artifact(s) other than grid or detector artifact", [6041, 6135, 7011], ) }, "ArtificialIntelligence": {"123110": ("Artificial Intelligence", [7162])}, "AspenChipBedding": {"127230": ("Aspen chip bedding", [605])}, "AspenShavingBedding": {"127231": ("Aspen shaving bedding", [605])}, "Assembly": {"112355": ("Assembly", [])}, "AssessChange": {"130590": ("Assess change", [6327])}, "AssessmentByComparison": {"121375": ("Assessment By Comparison", [703])}, "AssessmentByRules": {"121376": ("Assessment By Rules", [703])}, "AssessmentCategory": {"111005": ("Assessment Category", [])}, "Assisting": {"121099": ("Assisting", [7453])}, "AssociatedChestComponent": {"112003": ("Associated Chest Component", [])}, "AsymmetricImplants": {"111504": ("Asymmetric implants", [6072])}, "AsynchronousInvolution": {"111254": ("Asynchronous involution", [])}, "AtLastAppointment": {"109125": ("At last appointment", [31])}, "AtSurfaceOfPatient": {"113964": ("At Surface of Patient", [10025])}, "AtomicNumber": {"130093": ("Atomic Number", [])}, "AtrialDiastolicFillingDWave": { "125322": ("Atrial Diastolic Filling (D-wave)", [12307]) }, "AtrialPressureMeasurements": {"122121": ("Atrial pressure measurements", [])}, "Attach": {"110124": ("Attach", [401, 403])}, "AttendingConsultant": {"121089": ("Attending [Consultant]", [])}, "AttenuationCoefficient": { "112031": ("Attenuation Coefficient", [218, 6141, 7180, 7469, 10069]) }, "AttenuationCorrectionMethod": {"122713": ("Attenuation correction method", [])}, "AttenuatorCategory": {"128458": ("Attenuator Category", [])}, "AttenuatorCharacteristics": {"130531": ("Attenuator Characteristics", [])}, "AttenuatorDescription": {"128468": ("Attenuator Description", [])}, "AttenuatorPosition": {"130528": ("Attenuator Position", [])}, "Attenuators": {"130513": ("Attenuators", [])}, "Audio": {"AU": ("Audio", [])}, "AuditLogUsed": {"110101": ("Audit Log Used", [400])}, "AuditRecordingStarted": {"110134": ("Audit Recording Started", [401, 403])}, "AuditRecordingStopped": {"110133": ("Audit Recording Stopped", [401, 403])}, "AuthenticationDecision": {"110143": ("Authentication Decision", [401, 403])}, "AuthorizationDecision": {"110144": ("Authorization Decision", [401, 403])}, "AutoKeratometry": {"111754": ("Auto Keratometry", [4235, 4242])}, "AutocorrelationOfGLCM": {"128794": ("Autocorrelation of GLCM", [])}, "AutomatedAdministration": {"130173": ("Automated Administration", [63])}, "AutomatedDataCollection": { "113856": ("Automated Data Collection", [10020, 10021]) }, "AutomatedManualInjectPhase": {"130171": ("Automated Manual Inject Phase", [62])}, "AutomatedOptical": {"111843": ("Automated Optical", [4253])}, "AutomatedSlideStainer": {"STAIN": ("Automated Slide Stainer", [30, 32, 33])}, "AutomaticProgrammedAdministrationPhase": { "130168": ("Automatic Programmed Administration Phase", [62]) }, "AutomaticProgrammedDelayPhase": { "130169": ("Automatic Programmed Delay Phase", [62]) }, "AutomaticProgrammedWaitPhase": { "130263": ("Automatic Programmed Wait Phase", [62]) }, "AutomaticWithManualHoldPhase": { "130170": ("Automatic with Manual Hold Phase", []) }, "AutomaticallyDetectedAIFROI": { "126363": ("Automatically Detected AIF ROI", [4103, 4106]) }, "Autorefraction": {"AR": ("Autorefraction", [29, 30, 33])}, "AutorefractionMeasurementsSOPInstance": { "111784": ("Autorefraction Measurements SOP Instance", [4240]) }, "AutorefractionVisualAcuity": {"111685": ("Autorefraction Visual Acuity", [4216])}, "AverageBreastFeedingPeriod": {"111544": ("Average breast feeding period", [])}, "AverageCalcificationDistanceInACalcificationCluster": { "112200": ("Average calcification distance in a calcification cluster", [6142]) }, "AverageGlandularDose": {"111631": ("Average Glandular Dose", [])}, "AverageXRayTubeCurrent": {"113767": ("Average X-Ray Tube Current", [])}, "AvoidanceVolume": {"130058": ("Avoidance Volume", [9535])}, "AxialDiffusivity": {"113204": ("Axial Diffusivity", [7263])}, "AxialKurtosis": {"113208": ("Axial Kurtosis", [7263])}, "AxialMeasurementsSOPInstance": { "111782": ("Axial Measurements SOP Instance", [4240]) }, "AxillaryNodalMetastases": {"111301": ("Axillary nodal metastases", [6030, 6033])}, "AxillaryNodeHyperplasia": {"111253": ("Axillary node hyperplasia", [6030, 6031])}, "AxillaryNodeWithCalcifications": { "111252": ("Axillary node with calcifications", [6030, 6031]) }, "AxillaryNodeWithLymphoma": { "111300": ("Axillary node with lymphoma", [6030, 6033]) }, "AzygoesophagealRecessInterface": { "112090": ( "Azygoesophageal recess interface", [6102, 6109, 6113, 6148, 7151, 7192, 9514], ) }, "BIC": {"126224": ("BIC", [218, 7180, 7469])}, "BMIEqualsWtHt2": {"122265": ("BMI = Wt / Ht ^ 2", [])}, "BN01Pattern": {"109904": ("BN01 Pattern", [8301])}, "BN02Pattern": {"109905": ("BN02 Pattern", [8301])}, "BN03Pattern": {"109906": ("BN03 Pattern", [8301])}, "BN04Pattern": {"109907": ("BN04 Pattern", [8301])}, "BN05Pattern": {"109908": ("BN05 Pattern", [8301])}, "BN06Pattern": {"109909": ("BN06 Pattern", [8301])}, "BN07Pattern": {"109910": ("BN07 Pattern", [8301])}, "BN08Pattern": {"109911": ("BN08 Pattern", [8301])}, "BN09Pattern": {"109912": ("BN09 Pattern", [8301])}, "BN10Pattern": {"109913": ("BN10 Pattern", [8301])}, "BN11Pattern": {"109914": ("BN11 Pattern", [8301])}, "BN12Pattern": {"109915": ("BN12 Pattern", [8301])}, "BN13Pattern": {"109916": ("BN13 Pattern", [8301])}, "BN14Pattern": {"109917": ("BN14 Pattern", [8301])}, "BN15Pattern": {"109918": ("BN15 Pattern", [8301])}, "BN16Pattern": {"109919": ("BN16 Pattern", [8301])}, "BN17Pattern": {"109920": ("BN17 Pattern", [8301])}, "BN18Pattern": {"109921": ("BN18 Pattern", [8301])}, "BRCA1BreastCancerGene": {"111556": ("BRCA1 breast cancer gene", [6081, 6087])}, "BRCA2BreastCancerGene": {"111557": ("BRCA2 breast cancer gene", [6081, 6087])}, "BRCA3BreastCancerGene": {"111558": ("BRCA3 breast cancer gene", [6081, 6087])}, "BREPRadiationTransportModel": { "128406": ("BREP Radiation Transport Model", [10065]) }, "BSA1Point219": {"122572": ("BSA^1.219", [3455])}, "BSAEquals0Point0004688WT0Point8168To0Point0154LogWT": { "122246": ("BSA = 0.0004688*WT^(0.8168-0.0154*log(WT))", [3663]) }, "BSAEquals0Point003207WT0Point7285To0Point0188LogWTHT0Point3": { "122240": ("BSA = 0.003207*WT^(0.7285-0.0188*log(WT))*HT^0.3", [3663]) }, "BSAEquals0Point007184WT0Point425HT0Point725": { "122241": ("BSA = 0.007184*WT^0.425*HT^0.725", [3663]) }, "BSAEquals0Point007358WT0Point425HT0Point725": { "122266": ("BSA = 0.007358*WT^0.425*HT^0.725", [3663]) }, "BSAEquals0Point008883WT0Point444HT0Point663": { "122268": ("BSA = 0.008883*WT^0.444*HT^0.663", [3663]) }, "BSAEquals0Point009568WT0Point473HT0Point655": { "122270": ("BSA = 0.009568*WT^0.473*HT^0.655", [3663]) }, "BSAEquals0Point010265WT0Point423HT0Point651": { "122267": ("BSA = 0.010265*WT^0.423*HT^0.651", [3663]) }, "BSAEquals0Point0235WT0Point51456HT0Point42246": { "122242": ("BSA = 0.0235*WT^0.51456\u200b*HT^0.42246", []) }, "BSAEquals0Point0235WT0Point51456Htcm0Point42246": { "122242": ("BSA = 0.0235*WT^0.51456*HTcm^0.42246", [3663]) }, "BSAEquals0Point024265WT0Point5378HT0Point3964": { "122243": ("BSA = 0.024265*WT^0.5378\u200b*HT^0.3964", []) }, "BSAEquals0Point024265WT0Point5378Htcm0Point3964": { "122243": ("BSA = 0.024265*WT^0.5378*HTcm^0.3964", [3663]) }, "BSAEquals0Point038189WT0Point423HT0Point362": { "122269": ("BSA = 0.038189*WT^0.423*HT^0.362", [3663]) }, "BSAEquals13210Point3433WT": {"122245": ("BSA = 1321+0.3433*WT", [3663])}, "BSAEqualsHTWT360Point5": {"122244": ("BSA = (HT*WT/36)^0.5", [3663])}, "BackOfCorneaToFrontOfLens": { "111777": ("Back Of Cornea To Front Of Lens", [4239]) }, "Background": { "125040": ("Background", [7151, 7159, 7165, 7168, 7169, 7194, 7196, 12322]) }, "BackgroundForLesionToBackgroundSUVRatio": { "126040": ("Background for Lesion to Background SUV Ratio", [7466]) }, "Backscatter": {"128411": ("Backscatter", [10069])}, "BarcodeValue": {"130231": ("Barcode Value", [])}, "BarrettDesignFactor": {"111867": ("Barrett Design Factor", [4237])}, "BarrettLensFactor": {"111866": ("Barrett Lens Factor", [4237])}, "BarrettToric": {"111862": ("Barrett Toric", [4236])}, "BarrettTrueK": {"111863": ("Barrett True-K", [4236])}, "BarrettTrueKToric": {"111864": ("Barrett True-K Toric", [4236])}, "BarrettUniversalII": {"111865": ("Barrett Universal II", [4236])}, "BasalCellCarcinomaOfNipple": { "111307": ("Basal cell carcinoma of nipple", [6030, 6033]) }, "BaseToApex": {"110873": ("Base To Apex", [7185])}, "Baseline": {"121079": ("Baseline", [280, 7003])}, "BaselineCategory": {"112016": ("Baseline Category", [])}, "BaselineResultCorrection": {"122628": ("Baseline Result Correction", [])}, "BaselineScreeningMammogram": {"111403": ("Baseline screening mammogram", [])}, "BaselineStenosisMeasurement": {"122107": ("Baseline Stenosis Measurement", [])}, "BaselineTIMIFlow": {"122109": ("Baseline TIMI Flow", [])}, "BasicApplicationConfidentialityProfile": { "113100": ("Basic Application Confidentiality Profile", [7050]) }, "BasicVoiceAudio": {"AU": ("Basic Voice Audio", [32, 33])}, "BatWingDistribution": {"112154": ("Bat's wing distribution", [6128])}, "BayesianProbability": {"113270": ("Bayesian-Probability", [7274])}, "BazettQTCorrectionAlgorithm": { "122730": ("Bazett QT Correction Algorithm", [3678]) }, "BazettQtcAlgorithm": {"122730": ("Bazett QTc Algorithm", [])}, "BeadedSeptumSign": {"112066": ("Beaded septum sign", [6102, 6104])}, "BeamBlock": {"128431": ("Beam Block", [10066])}, "BeamEnergyInterlock": {"130831": ("Beam Energy Interlock", [9561, 9568])}, "BeamPosition": {"130524": ("Beam Position", [])}, "BeamShapingNote": {"130023": ("Beam Shaping Note", [])}, "BeamTargetingToleranceViolation": { "130468": ("Beam Targeting Tolerance Violation", [9566]) }, "BeatNumber": {"122149": ("Beat Number", [])}, "BeatsDetectedAccepted": {"109018": ("Beat detected (accepted)", [3337])}, "BeatsDetectedRejected": {"109019": ("Beat detected (rejected)", [3337])}, "BeddingDepth": {"127185": ("Bedding depth", [])}, "BeddingManufacturer": {"127180": ("Bedding manufacturer", [])}, "BeddingMass": {"127184": ("Bedding mass", [])}, "BeddingProductCode": {"127182": ("Bedding product code", [])}, "BeddingProductName": {"127181": ("Bedding product name", [])}, "BeddingVolume": {"127183": ("Bedding volume", [])}, "BeginCirculatorySupport": {"121157": ("Begin Circulatory Support", [3550])}, "BeginOxygenAdministration": {"121161": ("Begin oxygen administration", [3530])}, "BeginPacing": {"121166": ("Begin Pacing", [3552])}, "BeginTransferringDICOMInstances": { "110102": ("Begin Transferring DICOM Instances", [400]) }, "BeginVentilation": {"121168": ("Begin Ventilation", [3551])}, "BeginningOfTimePeriod": {"130533": ("Beginning of Time Period", [10073])}, "BehaviorOfTheFindingSite": {"125312": ("Behavior of the Finding Site", [12302])}, "BenignCalcifications": {"111256": ("Benign Calcifications", [6030, 6031])}, "BenignCystWithBlood": {"111255": ("Benign cyst with blood", [6030, 6031])}, "Benralizumab89Zr": {"126722": ("Benralizumab ^89^Zr", [4021])}, "BesselFilter": {"130763": ("Bessel filter", [3042])}, "BestIllustrationOfFinding": {"121080": ("Best illustration of finding", [7003])}, "BestInSet": {"113013": ("Best In Set", [7010])}, "BestOverallResponse": {"112049": ("Best Overall Response", [])}, "Bevacizumab89Zr": {"126516": ("Bevacizumab ^89^Zr", [4021])}, "BiExponentialIVIMDiffusionModel": { "113251": ("Bi-exponential (IVIM) diffusion model", [7273]) }, "BiPlaneAngiography": {"122060": ("Bi-plane Angiography", [3748])}, "BillingCode": {"121147": ("Billing Code", [])}, "BinarySegmentation": {"110853": ("Binary Segmentation", [218, 7180, 7469])}, "BiomagneticImaging": {"BI": ("Biomagnetic Imaging", [29, 30, 33])}, "BiomedicalEngineering": {"128171": ("Biomedical Engineering", [7030])}, "BiometryGroup": {"125005": ("Biometry Group", [])}, "BiophysicalProfile": {"125006": ("Biophysical Profile", [])}, "BiopsyLocalizer": {"121312": ("Biopsy localizer", [7201])}, "BiopsyShouldBeConsidered": { "111143": ("Biopsy should be considered", [6028, 6029]) }, "BiopsyShouldBeStronglyConsidered": { "111148": ("Biopsy should be strongly considered", [6028, 6029]) }, "Bioptome": {"122052": ("Bioptome", [3429])}, "BiosafetyConditions": {"127010": ("Biosafety conditions", [])}, "BiplaneEllipse": {"125211": ("Biplane Ellipse", [12227, 12228])}, "BiquadFilter": {"130773": ("Biquad filter", [3043])}, "Blinatumomab89Zr": {"126727": ("Blinatumomab ^89^Zr", [4021])}, "BlindEstimationOfAIF": {"126364": ("Blind Estimation of AIF", [4103, 4106])}, "BlindSpotMonitoring": {"111844": ("Blind Spot Monitoring", [4253])}, "BlockPresent": {"130458": ("Block Present", [9564])}, "BloodCarbonDioxideSaturation": { "122187": ("Blood Carbon dioxide saturation", [3526]) }, "BloodDeoxygenationLevel": {"130823": ("Blood Deoxygenation Level", [11006])}, "BloodLabMeasurements": {"122125": ("Blood lab measurements", [])}, "BloodOxygenContent": {"122185": ("Blood Oxygen content", [3525])}, "BloodOxygenationLevel": { "110819": ("Blood Oxygenation Level", [218, 7180, 7469, 11006]) }, "BloodTemperature": {"122183": ("Blood temperature", [])}, "BloodTingedColor": {"111454": ("Blood tinged color", [6067])}, "BloodVelocityMean": { "122205": ( "Blood velocity, mean", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "BloodVelocityMeasurements": {"122124": ("Blood velocity measurements", [])}, "BloodVelocityMinimum": { "122206": ( "Blood velocity, minimum", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "BloodVelocityPeak": { "122207": ( "Blood velocity, peak", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "BloodVelocityVsTimeOfCardiacCycle": { "122667": ("Blood velocity vs. time of cardiac cycle", []) }, "BloodVesselVascularInvasion": { "111303": ("Blood vessel (vascular) invasion", [6030, 6033]) }, "BloomRichardsonGrade": {"111502": ("Bloom-Richardson Grade", [6071])}, "BlueFilter": {"111603": ("Blue filter", [])}, "BlueGreenFilter": {"111605": ("Blue-green filter", [])}, "Boak": {"122563": ("Boak", [3453])}, "BodeFilter": {"130768": ("Bode filter", [3042])}, "BodyFrame": {"130117": ("Body Frame", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "BodyHabitusAttenuation": {"122743": ("Body habitus attenuation", [3115])}, "BodyNodeSet": {"130363": ("Body Node Set", [9556])}, "Bolting": {"112320": ("Bolting", [7310])}, "BolusArrivalTime": {"126371": ("Bolus Arrival Time", [218, 4109, 7180, 7469])}, "BolusPresent": {"130456": ("Bolus Present", [9564])}, "BolusShapingCurve": {"130210": ("Bolus Shaping Curve", [])}, "BoneAndSoftTissue": {"130407": ("Bone and soft tissue", [645, 8134])}, "BoneMineralDensitometry": {"BMD": ("Bone Mineral Densitometry", [29, 30, 33])}, "BoothbyTable": {"122255": ("Boothby table", [3664])}, "Bootstrap": {"113217": ("Bootstrap", [7262])}, "BootstrapTrackingAlgorithm": {"113217": ("Bootstrap Tracking Algorithm", [])}, "BorderDefinition": {"112007": ("Border definition", [])}, "BorderShape": {"112015": ("Border shape", [])}, "Borderline": {"111848": ("Borderline", [4254])}, "BorderlineAndGeneralReductionInSensitivity": { "111851": ("Borderline and general reduction in sensitivity", [4254]) }, "BorgCR10Scale": {"122735": ("Borg CR10 Scale", [3239])}, "BorgRPEScale": {"122734": ("Borg RPE Scale", [3239])}, "BottomZLocationOfReconstructableVolume": { "113896": ("Bottom Z Location of Reconstructable Volume", []) }, "BottomZLocationOfScanningLength": { "113898": ("Bottom Z Location of Scanning Length", []) }, "BoundaryPoint": {"128141": ("Boundary point", [219])}, "BowtieFilter": {"130354": ("Bowtie Filter", [9548])}, "BrachytherapyChannel": { "130080": ("Brachytherapy channel", [7151, 7157, 7193, 9506, 9520]) }, "BrachytherapyChannelShield": { "130079": ("Brachytherapy channel shield", [7151, 7157, 7193, 9506, 9520]) }, "BrachytherapyDevice": {"130045": ("Brachytherapy Device", [9502, 9580])}, "BrachytherapyIsotope": {"130038": ("Brachytherapy Isotope", [])}, "BrachytherapySourceApplicator": { "130078": ("Brachytherapy source applicator", [7151, 7157, 7193, 9506, 9520]) }, "BrandName": {"111529": ("Brand Name", [])}, "BreakoutBoxConnected": {"130891": ("Breakout box connected", [3039])}, "BreakoutBoxDisconnected": {"130892": ("Breakout box disconnected", [3039])}, "BreastAttenuation": {"122744": ("Breast attenuation", [3115])}, "BreastBackgroundEchotexture": {"111350": ("Breast background echotexture", [])}, "BreastBoard": { "130116": ("Breast Board", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "BreastBridge": { "130653": ("Breast Bridge", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "BreastComposition": {"111006": ("Breast composition", [])}, "BreastFeedingHistory": {"111543": ("Breast feeding history", [])}, "BreastGeometry": {"111100": ("Breast geometry", [6014, 6016, 6054])}, "BreastImagingReport": {"111400": ("Breast Imaging Report", [7000])}, "BreastImagingSubjectMatter": {"128738": ("Breast imaging subject matter", [7017])}, "BreastOutlineIncludingPectoralMuscleTissue": { "111007": ("Breast Outline including Pectoral Muscle Tissue", []) }, "BreastThickness": {"128405": ("Breast Thickness", [10069])}, "BreastTissueDensity": {"112191": ("Breast tissue density", [6142])}, "Brentuximab89Zr": {"126735": ("Brentuximab ^89^Zr", [4021])}, "BrightRedColor": {"111453": ("Bright red color", [6067])}, "BrightfieldIllumination": {"111744": ("Brightfield illumination", [8123])}, "Bronchovascular": {"112052": ("Bronchovascular", [6100])}, "BulletMethod": {"125228": ("Bullet Method", [12227, 12228])}, "ButterflyDistribution": {"112155": ("Butterfly distribution", [6128])}, "ButterflyFilter": {"113652": ("Butterfly filter", [10007])}, "ButterworthFilter": {"130760": ("Butterworth filter", [3042])}, "ByVentilator": {"121163": ("By ventilator", [])}, "C0InadequateStudyAwaitingPriorComparisons": { "112240": ("C0 - Inadequate Study/Awaiting Prior Comparisons", [6200]) }, "C1NormalColonOrBenignLesion": { "112241": ("C1 - Normal Colon or Benign Lesion", [6200]) }, "C2IntermediatePolypOrIndeterminateFinding": { "112242": ("C2 - Intermediate Polyp or Indeterminate Finding", [6200]) }, "C3PolypPossiblyAdvancedAdenoma": { "112243": ("C3 - Polyp, Possibly Advanced Adenoma", [6200]) }, "C4ColonicMassLikelyMalignant": { "112244": ("C4 - Colonic Mass, Likely Malignant", [6200]) }, "CADOperatingPoint": {"111071": ("CAD Operating Point", [])}, "CADOperatingPointDescription": {"111081": ("CAD Operating Point Description", [])}, "CADOperatingPointTable": {"111093": ("CAD Operating Point Table", [])}, "CADProcessingAndFindingsSummary": { "111017": ("CAD Processing and Findings Summary", []) }, "CArmMount": {"113955": ("C-Arm Mount", [10031])}, "CCNippleNotCenteredOnImage": { "111203": ("CC Nipple not centered on image", [6041]) }, "CCNotAllMedialTissueVisualized": { "111202": ("CC Not all medial tissue visualized", [6041]) }, "CCPosteriorNippleLineDoesNotMeasureWithin1cmOfMLO": { "111204": ( "CC Posterior nipple line does not measure within 1 cm of MLO", [6041], ) }, "CD": {"110032": ("CD", [405])}, "CDImported": {"110024": ("CD Imported", [7008])}, "CFXRegionInLAOProjection": {"122472": ("CFX Region in LAO Projection", [3461])}, "CHARMED": {"113234": ("CHARMED", [7261])}, "CICFilter": {"130771": ("CIC filter", [3043])}, "CKDEPIFormulaEstimationOfGFR": { "113571": ("CKD-EPI Formula estimation of GFR", [10047]) }, "CKMBBaseline": {"122180": ("CK-MB baseline", [])}, "CKMBPeak": {"122181": ("CK-MB peak", [])}, "CLR1404I124": {"126715": ("CLR1404 I^124^", [4021])}, "CLR1404I131": {"126716": ("CLR1404 I^131^", [4021])}, "CO2Respiration": {"130443": ("CO2 Respiration", [3005])}, "CO2Transcutaneous": {"130434": ("CO2 Transcutaneous", [3005])}, "CO2TrendEndTidalMainStream": { "130436": ("CO2 Trend End-tidal Main-stream", [3005]) }, "CO2TrendEndTidalSideStream": { "130438": ("CO2 Trend End-tidal Side-stream", [3005]) }, "CO2TrendMainStream": {"130441": ("CO2 Trend Main-stream", [3005])}, "CO2TrendSideStream": {"130442": ("CO2 Trend Side-stream", [3005])}, "CO2WaveformEndTidalMainStream": { "130435": ("CO2 Waveform End-tidal Main-stream", [3005]) }, "CO2WaveformEndTidalSideStream": { "130437": ("CO2 Waveform End-tidal Side-stream", [3005]) }, "CO2WaveformMainStream": {"130439": ("CO2 Waveform Main-stream", [3005])}, "CO2WaveformSideStream": {"130440": ("CO2 Waveform Side-stream", [3005])}, "CRDRMechanicalConfiguration": {"113956": ("CR/DR Mechanical Configuration", [])}, "CRTDisplay": {"109991": ("CRT Display", [8303])}, "CRTFrontProjectionSystem": {"109998": ("CRT Front Projection System", [8303])}, "CRTRearProjectionSystem": {"109997": ("CRT Rear Projection System", [8303])}, "CTAccumulatedDoseData": {"113811": ("CT Accumulated Dose Data", [])}, "CTAcquisition": {"113819": ("CT Acquisition", [])}, "CTAcquisitionParameters": {"113822": ("CT Acquisition Parameters", [])}, "CTAcquisitionType": {"113820": ("CT Acquisition Type", [])}, "CTBasedAttenuationCorrection": { "122728": ("CT-based Attenuation Correction", [3112]) }, "CTDose": {"113829": ("CT Dose", [])}, "CTDoseLengthProductSubTotal": { "130745": ("CT Dose Length Product Sub-Total", [10050]) }, "CTDoseLengthProductTotal": {"113813": ("CT Dose Length Product Total", [10050])}, "CTEffectiveDoseTotal": {"113814": ("CT Effective Dose Total", [])}, "CTProtocol": {"CTPROTOCOL": ("CT Protocol", [32, 33])}, "CTVNodal": {"130049": ("CTV Nodal", [9534])}, "CTVPrimary": {"130050": ("CTV Primary", [9534])}, "CTXRaySourceParameters": {"113831": ("CT X-Ray Source Parameters", [])}, "CWavePressure": {"122196": ("C wave pressure", [3611])}, "CalcificationCluster": {"111105": ("Calcification Cluster", [])}, "CalcificationDescriptor": {"112030": ("Calcification Descriptor", [])}, "CalcificationDistribution": {"111008": ("Calcification Distribution", [])}, "CalcificationExtentAsPercentOfSurface": { "112018": ("Calcification extent as percent of surface", [6142]) }, "CalcificationExtentAsPercentOfVolume": { "112019": ("Calcification extent as percent of volume", [6142]) }, "CalcificationType": {"111009": ("Calcification Type", [])}, "CalcificationsOutsideOfAMass": { "111347": ("Calcifications outside of a mass", [6012, 6013]) }, "CalcificationsSeenInTheCore": { "111446": ("Calcifications seen in the core", [6066]) }, "CalcificationsWithinAMass": { "111346": ("Calcifications within a mass", [6012, 6013]) }, "CalcifiedImplant": {"111505": ("Calcified implant", [6072])}, "Calcium": {"112145": ("Calcium", [6122])}, "CalciumLength": {"122341": ("Calcium Length", [3483])}, "CalciumMass": {"122661": ("Calcium Mass", [])}, "CalciumMassThreshold": {"122658": ("Calcium Mass Threshold", [])}, "CalciumScore": {"112058": ("Calcium score", [])}, "CalciumScoringAnalysis": {"122603": ("Calcium Scoring Analysis", [])}, "CalciumScoringCalibration": {"122659": ("Calcium Scoring Calibration", [])}, "CalciumVolume": {"122660": ("Calcium Volume", [])}, "Calculated": {"125315": ("Calculated", [12303])}, "Calculated_Retired": {"121428": ("Calculated", [])}, "CalculationDescription": {"112034": ("Calculation Description", [])}, "CalculationFailure": {"114008": ("Calculation failure", [42, 43])}, "Calibration": {"122505": ("Calibration", [6051, 6058, 6061])}, "CalibrationDatetime": {"113723": ("Calibration DateTime", [])}, "CalibrationFactor": {"122322": ("Calibration Factor", [])}, "CalibrationMethod": {"122422": ("Calibration Method", [])}, "CalibrationObject": {"122421": ("Calibration Object", [])}, "CalibrationObjectSize": {"122423": ("Calibration Object Size", [])}, "CalibrationObjectUsed": {"122488": ("Calibration Object Used", [3452])}, "CalibrationProtocol": {"113720": ("Calibration Protocol", [])}, "CalibrationResponsibleParty": {"113724": ("Calibration Responsible Party", [])}, "CalibrationUncertainty": {"113763": ("Calibration Uncertainty", [])}, "CanadianBorderCollieAssociation": { "109207": ("Canadian Border Collie Association", [7481]) }, "CanadianKennelClub": {"109208": ("Canadian Kennel Club", [7481])}, "CanadianLivestockRecordsAssociation": { "109209": ("Canadian Livestock Records Association", [7481]) }, "CancerElsewhere": {"111480": ("Cancer elsewhere", [6055])}, "CanineFederationOfCanada": {"109210": ("Canine Federation of Canada", [7481])}, "CarcinomaInChildren": {"111304": ("Carcinoma in children", [6030, 6033])}, "CarcinomaInEctopicBreast": { "111305": ("Carcinoma in ectopic breast", [6030, 6033]) }, "CarcinomaInPregnancyAndLactation": { "111310": ("Carcinoma in pregnancy and lactation", [6030, 6033]) }, "CarcinomaWithEndocrineDifferentiation": { "111306": ("Carcinoma with endocrine differentiation", [6030, 6033]) }, "CarcinomaWithMetaplasia": {"111308": ("Carcinoma with metaplasia", [])}, "Carcinosarcoma": {"111311": ("Carcinosarcoma", [])}, "CardiacElectrophysiology": {"EPS": ("Cardiac Electrophysiology", [29, 30, 33])}, "CardiacImagingSpecialty": {"128007": ("Cardiac Imaging Specialty", [7449])}, "CardiacStressState": {"109091": ("Cardiac Stress State", [3102, 10045])}, "Cardiosphere": {"125901": ("CARDIOsphere", [12030])}, "CardiovascularAnalysisReport": {"122600": ("Cardiovascular Analysis Report", [])}, "CardiovascularImagingSubjectMatter": { "128730": ("Cardiovascular imaging subject matter", [7017]) }, "CardiovascularRadiology": {"128172": ("Cardiovascular Radiology", [7030])}, "CarinaAngle": {"112086": ("Carina angle", [6102, 6109, 6111, 7151, 7192, 9514])}, "CarrierGas": {"127330": ("Carrier gas", [621])}, "CarrierTemperatureSensor": {"127240": ("Carrier temperature sensor", [636])}, "CartilaginousAndOsseousChange": { "111309": ("Cartilaginous and osseous change", [6030, 6033]) }, "CaseSensitivity": {"111088": ("Case Sensitivity", [6048])}, "CaseSpecificity": {"111090": ("Case Specificity", [6048])}, "CassetteBasedProjectionRadiographySystem": { "113959": ("Cassette-based Projection Radiography System", [10032]) }, "Cast": {"130114": ("Cast", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "CathLabProcedureLog": {"121120": ("Cath Lab Procedure Log", [3400])}, "CatheterCurve": {"122097": ("Catheter Curve", [3423])}, "CatheterSize": {"122319": ("Catheter Size", [])}, "CatheterizationProcedurePhase": { "109057": ("Catheterization Procedure Phase", []) }, "Caudal10DegreeDistalCranioproximalOblique": { "123019": ("Caudal 10 degree distal-cranioproximal oblique", [7484]) }, "CavityExtentAsPercentOfVolume": { "112017": ("Cavity extent as percent of volume", [6142]) }, "CavityRadiationShield": {"130640": ("Cavity radiation shield", [9572, 9573])}, "Center": {"111010": ("Center", [219])}, "CenterOfGravity": {"122475": ("Center of Gravity", [3458])}, "CenterOfMass": {"128138": ("Center of Mass", [219, 1011])}, "CenterOfRotation": {"130521": ("Center of Rotation", [])}, "CenterOfTableHead": {"128751": ("Center of Table Head", [])}, "Centerline": {"130490": ("Centerline", [219])}, "CenterlineWallMotionAnalysis": {"122449": ("Centerline Wall Motion Analysis", [])}, "CentralBreathingPosition": { "122612": ("central breathing position", [3823, 9272]) }, "CentralLine": {"112174": ("Central line", [6102, 6138, 6404, 7151, 7193])}, "Centrilobular": {"112156": ("Centrilobular", [6128])}, "CentrilobularStructures": { "112087": ("Centrilobular structures", [6102, 6109, 6111, 7151, 7192, 9514]) }, "CertaintyOfFeature": {"111011": ("Certainty of Feature", [])}, "CertaintyOfFinding": {"111012": ("Certainty of Finding", [6048])}, "CertaintyOfImpression": {"111013": ("Certainty of Impression", [])}, "CessationOfExercise": {"125237": ("Cessation of exercise", [12031])}, "CessationOfStimulation": {"125239": ("Cessation of stimulation", [12031])}, "Cetuximab89Zr": {"126513": ("Cetuximab ^89^Zr", [4021])}, "Cg250FAb289Zr": {"126517": ("cG250-F(ab')(2) ^89^Zr", [4021])}, "ChairOfProtocolCommittee": { "128671": ("Chair of Protocol Committee", [7450, 7452]) }, "ChangMethod": {"122721": ("Chang method", [3117])}, "ChangeInPatientAnatomy": {"130464": ("Change in Patient Anatomy", [9565])}, "ChangeOfProcedureForCorrectCharging": { "110509": ("Change of procedure for correct charging", [9300, 9301, 9303]) }, "ChannelObstruction": {"110520": ("Channel Obstruction", [9561])}, "ChebyshevFilter": {"130761": ("Chebyshev filter", [3042])}, "CheckedInStatus": {"121388": ("Checked-In Status", [])}, "Checkerboard": {"114216": ("Checkerboard", [8202])}, "ChestCADReport": {"112000": ("Chest CAD Report", [])}, "ChestTube": {"112173": ("Chest tube", [6102, 6138, 6202, 6203, 6404, 7151, 7193])}, "ChiSquare": {"126221": ("Chi-square", [218, 7180, 7469])}, "CholineC11": {"126703": ("Choline C^11^", [4021])}, "CholineCreatineRatio": { "113081": ("Choline/Creatine Ratio", [218, 4032, 4033, 7180, 7186, 7469]) }, "ChoriocapillarisStructuralReflectanceMap": { "128274": ("Choriocapillaris structural reflectance map", [4271]) }, "ChoriocapillarisVasculatureFlow": { "128273": ("Choriocapillaris vasculature flow", [4271]) }, "ChoroidStructuralReflectanceMap": { "128276": ("Choroid structural reflectance map", [4271]) }, "ChoroidVasculatureFlow": {"128275": ("Choroid vasculature flow", [4271])}, "ChromaticityEvaluation": {"109705": ("Chromaticity evaluation", [8300])}, "CineFilmDigitized": {"110021": ("Cine Film Digitized", [7008])}, "Cinefluorography": {"CF": ("Cinefluorography", [])}, "CircadianEffects": {"127050": ("Circadian effects", [])}, "CircleBScanPattern": {"128284": ("Circle B-scan pattern", [4272])}, "CircleRadialBScanPattern": {"128287": ("Circle-radial B-scan pattern", [4272])}, "CircleRasterBScanPattern": {"128286": ("Circle-raster B-scan pattern", [4272])}, "CircularMethod": {"122473": ("Circular method", [3470])}, "Circulating": {"121100": ("Circulating", [])}, "CirculatorySupport": {"122138": ("Circulatory Support", [])}, "CircumferentialLagrangianStrain": { "130677": ("Circumferential Lagrangian Strain", [12304, 12311]) }, "CircumferentialLagrangianStrainRate": { "130678": ("Circumferential Lagrangian Strain Rate", [12304, 12311]) }, "Circumscribed": {"112142": ("Circumscribed", [])}, "ClassActivation": {"130402": ("Class activation", [217, 218, 7180, 7469])}, "CleanDescriptorsOption": {"113105": ("Clean Descriptors Option", [7050])}, "CleanGraphicsOption": {"113103": ("Clean Graphics Option", [7050])}, "CleanPixelDataOption": {"113101": ("Clean Pixel Data Option", [7050])}, "CleanRecognizableVisualFeaturesOption": { "113102": ("Clean Recognizable Visual Features Option", [7050]) }, "CleanStructuredContentOption": { "113104": ("Clean Structured Content Option", [7050]) }, "ClearanceInterlock": {"130739": ("Clearance Interlock", [9561, 9568])}, "ClinicalContext": {"122127": ("Clinical Context", [])}, "ClinicalEvaluation": {"109710": ("Clinical evaluation", [8300])}, "ClinicalFinding": {"111402": ("Clinical finding", [6051])}, "ClinicalInterpretation": {"122147": ("Clinical Interpretation", [])}, "ClinicalTrialSubmissionInputUsed": { "128223": ("Clinical Trial Submission Input Used", [7010]) }, "ClockfaceOrRegion": {"111014": ("Clockface or region", [])}, "ClusterAnalysis": {"123107": ("Cluster Analysis", [7162])}, "ClusterProminenceOfGLCM": {"128797": ("Cluster Prominence of GLCM", [])}, "ClusterShadeOfGLCM": {"128796": ("Cluster Shade of GLCM", [])}, "ClusterTendencyOfGLCM": {"128795": ("Cluster Tendency of GLCM", [])}, "ClusteredMicrocysts": {"111129": ("Clustered microcysts", [6054, 6064])}, "CmabU3689Zr": {"126746": ("cMAb U36 ^89^Zr", [4021])}, "CoachingDevice": {"130650": ("Coaching Device", [9573, 9578])}, "Coalescent": {"112157": ("Coalescent", [6128])}, "CockroftGaultFormulaEstimationOfGFR": { "113570": ("Cockroft-Gault Formula estimation of GFR", [10047]) }, "CoilMarker": {"129301": ("Coil Marker", [7111, 7112])}, "CoilPlacementConcern": {"130571": ("Coil placement concern", [6314])}, "CoilSelectionConcern": {"130572": ("Coil selection concern", [6314])}, "Coin": {"112178": ("Coin", [6102, 6138, 6202, 6203, 6404, 7151, 7193])}, "CollectionOfPresentationStates": { "113022": ("Collection of Presentation States", [7010]) }, "CollimatedFieldArea": {"113790": ("Collimated Field Area", [])}, "CollimatedFieldHeight": {"113788": ("Collimated Field Height", [])}, "CollimatedFieldWidth": {"113789": ("Collimated Field Width", [])}, "CollimationTooCloseToBreast": { "111195": ("Collimation too close to breast", [6041]) }, "Collimator": {"111173": ("Collimator", [])}, "CollisionChecks": {"130652": ("Collision Checks", [9577])}, "ColonCADReport": {"112220": ("Colon CAD Report", [])}, "ColonOverallAssessment": {"112222": ("Colon Overall Assessment", [])}, "ColorFlowDoppler": {"CD": ("Color flow Doppler", [])}, "ColumnAngulation": {"113770": ("Column Angulation", [])}, "CombinationImplant": {"111484": ("Combination implant", [6058, 6059])}, "CombinedPosteriorEnhancementAndShadowing": { "111370": ("Combined posterior enhancement and shadowing", [6155]) }, "CombinedStructuredLightThermalImager": { "130648": ("Combined Structured Light/Thermal Imager", [9573, 9575]) }, "Comment": {"121106": ("Comment", [12101])}, "CompactFlash": {"110034": ("Compact Flash", [405])}, "ComparativeAverage10YearCHDRisk": { "122231": ("Comparative Average10 Year CHD Risk", [3667]) }, "ComparativeLow10YearCHDRisk": { "122232": ("Comparative Low10 Year CHD Risk", [3667]) }, "ComparisonToPreviousStudies": { "111424": ("Comparison to previous studies", [6052, 6053]) }, "ComparisonWithPriorStudyDone": { "122140": ("Comparison with Prior Study Done", []) }, "CompleteAcquisitionContent": {"113034": ("Complete Acquisition Content", [7010])}, "CompleteRenderingForPresentation": { "121332": ("Complete Rendering for Presentation", [7006]) }, "CompleteStudyContent": {"113032": ("Complete Study Content", [7010])}, "CompletelyEncapsulated": { "130594": ("Completely encapsulated", [6335, 6341, 6342]) }, "Complex": {"111363": ("Complex", [6154])}, "ComplexCyst": {"111460": ("Complex cyst", [6054, 6064])}, "ComplicatedCyst": {"111130": ("Complicated cyst", [6054, 6064])}, "Complications": {"121113": ("Complications", [])}, "ComponentConnection": {"112350": ("Component Connection", [])}, "ComponentID": {"112347": ("Component ID", [])}, "ComponentModel": {"129011": ("Component Model", [7062])}, "ComponentType": {"112370": ("Component Type", [])}, "ComponentVolume": {"130239": ("Component Volume", [])}, "ComposedFromPriorDoses": {"121370": ("Composed from prior doses", [7220])}, "ComposedFromPriorDosesAndCurrentPlan": { "121371": ("Composed from prior doses and current plan", [7220]) }, "ComposedWithRadiobiologicalEffects": { "121377": ("Composed with radiobiological effects", [7220]) }, "ComposedWithWeightingForFractionsDelivered": { "121378": ("Composed with weighting for fractions delivered", [7220]) }, "CompositeFeature": {"111015": ("Composite Feature", [])}, "CompositeFeatureModifier": {"112023": ("Composite Feature Modifier", [])}, "CompositeType": {"111016": ("Composite type", [])}, "CompoundStatement": {"122150": ("Compound Statement", [])}, "CompressionContactArea": {"111649": ("Compression Contact Area", [])}, "CompressionForce": {"111647": ("Compression Force", [])}, "CompressionPressure": {"111648": ("Compression Pressure", [])}, "CompressionThickness": {"111633": ("Compression Thickness", [])}, "ComputationServer": {"COMP": ("Computation Server", [30])}, "ComputedFromImageAttributes": { "113867": ("Computed From Image Attributes", [10020, 10021]) }, "ComputedRadiography": {"CR": ("Computed Radiography", [29, 30, 33])}, "ComputedTomography": {"CT": ("Computed Tomography", [29, 30, 33])}, "ComputerAidedDetection": {"110004": ("Computer Aided Detection", [9231])}, "ComputerAidedDiagnosis": {"110003": ("Computer Aided Diagnosis", [9231])}, "ComputerAssistedDetectionDiagnosis": { "CAD": ("Computer Assisted Detection/Diagnosis", [30]) }, "Concentration": {"122093": ("Concentration", [3410])}, "ConcentricCircleBScanPattern": { "128285": ("Concentric circle B-scan pattern", [4272]) }, "Concern": {"121430": ("Concern", [])}, "Conclusion": {"121077": ("Conclusion", [6053, 7002])}, "Conclusions": {"121076": ("Conclusions", [])}, "ConditionEffectiveDoseMeasured": { "113816": ("Condition Effective Dose measured", []) }, "ConePresent": {"130457": ("Cone Present", [])}, "Conepresent": {"130457": ("ConePresent", [9564])}, "ConfiguredDefaultImagingEnergy": { "130807": ("Configured Default Imaging Energy", [9262]) }, "ConfiguredLowestImagingEnergy": { "130806": ("Configured Lowest Imaging Energy", [9262]) }, "ConfirmationOfTarget": {"111442": ("Confirmation of target", [])}, "ConfocalImaging": {"114207": ("Confocal imaging", [8201])}, "ConfocalMicroscopy": {"CFM": ("Confocal Microscopy", [29, 30, 33])}, "ConformalArcBeam": {"130104": ("Conformal Arc Beam", [9511, 9524, 9583])}, "ConformalityShell": {"130062": ("Conformality Shell", [9535])}, "ConjunctiveTerm": {"122154": ("Conjunctive Term", [])}, "ConnectedImplantationPlanComponent": { "112374": ("Connected Implantation Plan Component", []) }, "ConsistentWithLabelingOfTheDevice": { "128602": ("Consistent with labeling of the device", [800]) }, "ConstantAngleAcquisition": {"113805": ("Constant Angle Acquisition", [10013])}, "ConsultationWith": {"122044": ("Consultation With", [3404])}, "ConsumableCatheterType": {"130257": ("Consumable Catheter Type", [])}, "ConsumableIsNew": {"130224": ("Consumable is New", [])}, "ConsumableReturnedToInventory": { "122077": ("Consumable returned to inventory", [3408]) }, "ConsumableTakenFromInventory": { "122076": ("Consumable taken from inventory", [3408]) }, "ConsumableUnusable": {"122079": ("Consumable unusable", [3408])}, "ContentAssessmentResult": {"ASMT": ("Content Assessment Result", [32, 33])}, "ContentDate": {"111018": ("Content Date", [])}, "ContentTime": {"111019": ("Content Time", [])}, "ContinentalKennelClub": {"109211": ("Continental Kennel Club", [7481])}, "ContinuityEquation": {"125212": ("Continuity Equation", [12227, 12229])}, "ContinuityEquationByMeanVelocity": { "125213": ("Continuity Equation by Mean Velocity", [12227, 12229]) }, "ContinuityEquationByPeakVelocity": { "125214": ("Continuity Equation by Peak Velocity", [12227, 12229]) }, "ContinuityEquationByVelocityTimeIntegral": { "125215": ("Continuity Equation by Velocity Time Integral", [12227, 12229]) }, "Continuous": {"113630": ("Continuous", [10004])}, "ContinuousPermanent": {"130101": ("Continuous Permanent", [9533])}, "ContinuousTemporary": {"130100": ("Continuous Temporary", [9533])}, "ContourEnd": {"122482": ("Contour End", [])}, "ContourRealignment": {"122410": ("Contour Realignment", [])}, "ContourStart": {"122481": ("Contour Start", [])}, "ContouringInputUsed": {"128219": ("Contouring Input Used", [7010])}, "ContrastAdministered": {"122086": ("Contrast administered", [3409])}, "ContrastAgentAngioMRSignalIntensity": { "110801": ("Contrast Agent Angio MR Signal Intensity", [218, 7180, 7469]) }, "ContrastBolusAgent": {"123011": ("Contrast/Bolus Agent", [])}, "ContrastBolusIngredientOpaque": { "121381": ("Contrast/Bolus Ingredient Opaque", [4050]) }, "ContrastEnd": {"122085": ("Contrast end", [3409])}, "ContrastLongitudinalRelaxivity": { "126380": ("Contrast Longitudinal Relaxivity", [4111]) }, "ContrastOfGLCM": {"126063": ("Contrast of GLCM", [])}, "ContrastPhase": {"109058": ("Contrast Phase", [])}, "ContrastReactionProphylacticAgent": { "130259": ("Contrast Reaction Prophylactic Agent", [76]) }, "ContrastStart": {"122084": ("Contrast start", [3409])}, "ContrastTransverseRelaxivity": {"130188": ("Contrast Transverse Relaxivity", [])}, "ContrastVolumeLimit": {"130228": ("Contrast Volume Limit", [])}, "ControlledSSDSetupMethod": {"130631": ("Controlled SSD Setup Method", [9571])}, "ConversionFactor": {"128528": ("Conversion Factor", [])}, "CooperLigamentChanges": { "111111": ("Cooper's ligament changes", [6014, 6015, 6016, 6054, 6056]) }, "CoordinateAlignmentImageSeries": { "128187": ("Coordinate Alignment Image Series", [7010, 7023]) }, "CopiedFromImageAttributes": { "113866": ("Copied From Image Attributes", [10020, 10021]) }, "CornCobBedding": {"127232": ("Corn cob bedding", [605])}, "CornealAxialPowerMap": {"111940": ("Corneal axial power map", [4268])}, "CornealBirefringenceCompensation": { "111923": ("Corneal birefringence compensation", [4261]) }, "CornealElevationMap": {"111943": ("Corneal elevation map", [4268])}, "CornealInstantaneousPowerMap": { "111941": ("Corneal instantaneous power map", [4268]) }, "CornealRefractivePowerMap": {"111942": ("Corneal refractive power map", [4268])}, "CornealWavefrontMap": {"111944": ("Corneal wavefront map", [4268])}, "CoronaRadiata": {"112105": ("Corona radiata", [6102, 6103])}, "CoronaryArteryBypassDuringThisAdmission": { "122164": ("Coronary Artery Bypass During This Admission", []) }, "CoronaryArteryDiseaseAssessment": { "130720": ("Coronary Artery Disease Assessment", []) }, "CoronaryArteryDiseaseStenosisAssessmentModifier": { "130722": ("Coronary Artery Disease Stenosis Assessment Modifier", []) }, "CoronaryFlowReserve": {"122217": ("Coronary Flow reserve", [3620])}, "CoronaryLesionGreaterThanEquals50PercentStenosis": { "122171": ("Coronary lesion > = 50% stenosis", [3726]) }, "CorrectedSinusNodeRecoveryTime": { "122237": ("Corrected Sinus Node Recovery Time", []) }, "CorrectionFactor": {"128452": ("Correction Factor", [10069])}, "CorrectionOfCongenitalCardiovascularDeformity": { "121439": ("Correction of congenital cardiovascular deformity", []) }, "CorrelatesToMRIFindings": {"111383": ("Correlates to MRI findings", [6158])}, "CorrelatesToMammographyFindings": { "111382": ("Correlates to mammography findings", [6158]) }, "CorrelatesToOtherImagingFindings": { "111385": ("Correlates to other imaging findings", [6158]) }, "CorrelatesToPhysicalExaminationFindings": { "111381": ("Correlates to physical examination findings", [6158]) }, "CorrelatesToUltrasoundFindings": { "111384": ("Correlates to ultrasound findings", [6158]) }, "CorrelationOfGLCM": {"126066": ("Correlation of GLCM", [])}, "CorrelationToOtherFindings": {"111380": ("Correlation to other Findings", [])}, "CouchIndexLabel": {"130657": ("Couch Index Label", [])}, "CountryOfLanguage": {"121046": ("Country of Language", [])}, "CreatineAndCholine": { "113094": ("Creatine and Choline", [218, 4032, 4033, 7180, 7186, 7469]) }, "CreatineCholineCitrateRatio": { "113096": ( "Creatine+Choline/Citrate Ratio", [218, 4032, 4033, 7180, 7186, 7469], ) }, "CrossBScanPattern": {"128283": ("Cross B-scan pattern", [4272])}, "CrossSectionalScanPlaneOrientation": { "130546": ("Cross-sectional scan plane orientation", []) }, "CrossedGrid": {"111645": ("Crossed grid", [10017])}, "Crosstable": {"111069": ("Crosstable", [502, 4011])}, "CtdifreeairCalculationFactor": {"113836": ("CTDIfreeair Calculation Factor", [])}, "CtdifreeairToEConversionViaMCComputation": { "113801": ("CTDIfreeair to E conversion via MC computation", [10011]) }, "CtdifreeairToEConversionViaMeasurement": { "113803": ("CTDIfreeair to E conversion via measurement", [10011]) }, "CtdivolAlertValue": {"113904": ("CTDIvol Alert Value", [])}, "CtdivolAlertValueConfigured": {"113902": ("CTDIvol Alert Value Configured", [])}, "CtdivolForwardEstimate": {"113914": ("CTDIvol Forward Estimate", [])}, "CtdivolNotificationValue": {"113912": ("CTDIvol Notification Value", [])}, "CtdivolNotificationValueConfigured": { "113910": ("CTDIvol Notification Value Configured", []) }, "CtdiwPhantomType": {"113835": ("CTDIw Phantom Type", [])}, "Cu3689Zr": {"126515": ("cU36 ^89^Zr", [4021])}, "Cube": {"125206": ("Cube", [])}, "CubeBScanPattern": {"128279": ("Cube B-scan pattern", [4272])}, "CubeMethod": {"125206": ("Cube Method", [12227, 12228])}, "Culposcopy": {"CP": ("Culposcopy", [])}, "CurrentFractionNumber": {"121385": ("Current Fraction Number", [])}, "CurrentPregnancyKnownOrSuspectedMalformationsSyndromes": { "111573": ( "Current pregnancy, known or suspected malformations/syndromes", [6087, 6088], ) }, "CurrentProcedureDescriptions": {"121064": ("Current Procedure Descriptions", [])}, "CurrentProcedureEvidence": {"122073": ("Current procedure evidence", [7009])}, "CurrentResponse": {"112048": ("Current Response", [])}, "CurveFitMethod": {"122627": ("Curve Fit Method", [])}, "CurveFitParameter": {"128453": ("Curve Fit Parameter", [10069])}, "CurveFittedReference": {"122489": ("Curve Fitted Reference", [3465])}, "CurvedLinearUltrasoundTransducerGeometry": { "125253": ("Curved linear ultrasound transducer geometry", [12033]) }, "CurvedMultiplanarReformatting": { "113073": ("Curved multiplanar reformatting", [7203]) }, "CylinderMarker": {"129303": ("Cylinder Marker", [7111, 7112])}, "CystFill": {"111430": ("Cyst fill", [6054, 6057])}, "Cystoscopy": {"CS": ("Cystoscopy", [])}, "CytologicAnalysis": {"111147": ("Cytologic analysis", [6028, 6029])}, "DICOMInstancesAccessed": {"110103": ("DICOM Instances Accessed", [400])}, "DICOMInstancesTransferred": {"110104": ("DICOM Instances Transferred", [400])}, "DICOMObjectCatalog": {"121181": ("DICOM Object Catalog", [])}, "DICOMStudyDeleted": {"110105": ("DICOM Study Deleted", [400])}, "DINGeometryPatternBild3": {"109932": ("DIN Grayscale Pattern", [8301])}, "DINGrayscalePatternBild2": {"109931": ("DIN Geometry Pattern", [8301])}, "DINResolutionPattern": {"109933": ("DIN Resolution Pattern", [8301])}, "DKI": {"113222": ("DKI", [7260])}, "DLP": {"113838": ("DLP", [])}, "DLPAlertValue": {"113903": ("DLP Alert Value", [])}, "DLPAlertValueConfigured": {"113901": ("DLP Alert Value Configured", [])}, "DLPForwardEstimate": {"113913": ("DLP Forward Estimate", [])}, "DLPFrontProjectionSystem": {"109996": ("DLP Front Projection System", [8303])}, "DLPNotificationValue": {"113911": ("DLP Notification Value", [])}, "DLPNotificationValueConfigured": { "113909": ("DLP Notification Value Configured", []) }, "DLPRearProjectionSystem": {"109995": ("DLP Rear Projection System", [8303])}, "DLPToEConversionViaMCComputation": { "113800": ("DLP to E conversion via MC computation", [10011]) }, "DLPToEConversionViaMeasurement": { "113802": ("DLP to E conversion via measurement", [10011]) }, "DN3089Zr": {"126747": ("DN30 ^89^Zr", [4021])}, "DOT": {"113236": ("DOT", [7261])}, "DPA71311C": {"126765": ("DPA-713 ^11^C", [4021])}, "DPA71418F": {"126766": ("DPA-714 ^18^F", [4021])}, "DSI": {"113224": ("DSI", [7260, 7261])}, "DTI": {"113223": ("DTI", [7260])}, "DVD": {"110033": ("DVD", [405])}, "DVDImported": {"110025": ("DVD Imported", [7008])}, "DW": {"126222": ("D-W", [218, 7180, 7469])}, "DarkBrownColor": {"111452": ("Dark brown color", [6067])}, "DarkRedColor": {"111451": ("Dark red color", [6067])}, "DarkfieldIllumination": {"111745": ("Darkfield illumination", [8123])}, "DataNotAccessibleFromStorage": { "130752": ("Data Not Accessible from Storage", [7031]) }, "DataRetentionPolicyExpired": { "113039": ("Data Retention Policy Expired", [7010, 7031]) }, "DateStickerIsMissing": {"111193": ("Date sticker is missing", [6041])}, "DatetimeConcernNoted": {"121431": ("DateTime Concern Noted", [])}, "DatetimeConcernResolved": {"121432": ("DateTime Concern Resolved", [])}, "DatetimeEnded": {"111527": ("DateTime Ended", [])}, "DatetimeEstimated": {"121137": ("DateTime Estimated", [3430])}, "DatetimeOfDeath": {"122165": ("DateTime of Death", [])}, "DatetimeOfIntervention": {"122105": ("DateTime of Intervention", [])}, "DatetimeOfLastEvaluation": {"111536": ("DateTime of last evaluation", [])}, "DatetimeOfProcessing": {"111702": ("DateTime of processing", [])}, "DatetimeOfRecordingOfLogEntry": { "121125": ("DateTime of Recording of Log Entry", []) }, "DatetimeProblemObserved": {"111535": ("DateTime problem observed", [])}, "DatetimeProblemResolved": {"121433": ("DateTime Problem Resolved", [])}, "DatetimeStarted": {"111526": ("DateTime Started", [])}, "DatetimeUnsynchronized": {"121136": ("DateTime Unsynchronized", [3430])}, "DeIdentifyingEquipment": {"109104": ("De-identifying Equipment", [7005])}, "DeathDuringCatheterization": {"122167": ("Death During Catheterization", [3413])}, "DeathDuringThisAdmission": {"122166": ("Death During This Admission", [])}, "DeepRetinaStructuralReflectanceMap": { "128270": ("Deep retina structural reflectance map", [4271]) }, "DeepRetinaVasculatureFlow": {"128269": ("Deep retina vasculature flow", [4271])}, "DeformableModels": {"123111": ("Deformable Models", [7162])}, "DeformedForRegistration": {"125027": ("Deformed for Registration", [7203])}, "DegreeOfFreedomExactRotationalTranslationValue": { "112379": ("Degree of Freedom Exact Rotational Translation Value", []) }, "DegreeOfFreedomExactTranslationalValue": { "112376": ("Degree of Freedom Exact Translational Value", []) }, "DegreeOfFreedomID": {"112363": ("Degree of Freedom ID", [])}, "DegreeOfFreedomMaximumRotationalValue": { "112381": ("Degree of Freedom Maximum Rotational Value", []) }, "DegreeOfFreedomMaximumTranslationalValue": { "112378": ("Degree of Freedom Maximum Translational Value", []) }, "DegreeOfFreedomMinimumRotationalValue": { "112380": ("Degree of Freedom Minimum Rotational Value", []) }, "DegreeOfFreedomMinimumTranslationalValue": { "112377": ("Degree of Freedom Minimum Translational Value", []) }, "DegreeOfThrombus": {"122131": ("Degree of Thrombus", [])}, "DegreesOfFreedomSpecification": { "112362": ("Degrees of Freedom Specification", []) }, "DelayExportUntilClinicalInformationIsAvailable": { "128716": ("Delay export until clinical information is available", [7015]) }, "DelayExportUntilConfirmationOfDiagnosisIsAvailable": { "128717": ("Delay export until confirmation of diagnosis is available", [7015]) }, "DelayExportUntilExpertReviewIsAvailable": { "128722": ("Delay export until expert review is available", [7015]) }, "DelayExportUntilFinalReportIsAvailable": { "128715": ("Delay export until final report is available", [7015]) }, "DelayExportUntilHistopathologyIsAvailable": { "128718": ("Delay export until histopathology is available", [7015]) }, "DelayExportUntilOtherLaboratoryResultsAreAvailable": { "128719": ("Delay export until other laboratory results are available", [7015]) }, "DelayExportUntilPatientDies": { "128721": ("Delay export until patient dies", [7015]) }, "DelayExportUntilPatientIsDischarged": { "128720": ("Delay export until patient is discharged", [7015]) }, "DelayedRedistributionState": {"109094": ("Delayed Redistribution State", [3101])}, "DeliveryRateToleranceViolation": { "130470": ("Delivery Rate Tolerance Violation", [9566]) }, "DeliveryVerificationNote": {"130031": ("Delivery Verification Note", [])}, "DensitometricLuminalCrossSectionalAreaGraph": { "122517": ("Densitometric Luminal Cross-sectional Area Graph", []) }, "DensitometricMethod": {"122474": ("Densitometric method", [3470])}, "Density": {"112118": ("Density", [6102, 6104])}, "Density_Retired": {"111103": ("Density", [])}, "DepartmentSystemScheduler": {"DSS": ("Department System Scheduler", [30])}, "DependentOpacity": {"112119": ("Dependent opacity", [6102, 6104])}, "Deployment": {"121155": ("Deployment", [])}, "DeprecatedProtocol": {"128610": ("Deprecated protocol", [800])}, "Depth": {"111020": ("Depth", [])}, "Derivation": {"121401": ("Derivation", [9000])}, "DerivedAreaNonValve": {"122160": ("Derived Area, Non-Valve", [])}, "DerivedEffectiveDiameter": {"113933": ("Derived Effective Diameter", [])}, "DerivedFiducial": {"112357": ("Derived Fiducial", [])}, "DerivedFromHumanReadableReports": { "113868": ("Derived From Human-Readable Reports", [10020, 10021]) }, "DerivedHemodynamicMeasurements": { "122126": ("Derived Hemodynamic Measurements", []) }, "DerivedImagingMeasurements": {"126011": ("Derived Imaging Measurements", [])}, "DerivedNonValveArea": {"122160": ("Derived Non-Valve Area", [3614, 3615])}, "DerivedPlanningImages": {"112372": ("Derived Planning Images", [])}, "Dermoscopy": {"DMS": ("Dermoscopy", [29, 30, 33])}, "DescriptionOfChange": {"111021": ("Description of Change", [])}, "DescriptionOfMaterial": {"121145": ("Description of Material", [3426])}, "Designator": {"129002": ("Designator", [7453])}, "DestinationMedia": {"110154": ("Destination Media", [402])}, "DestinationRoleID": {"110152": ("Destination Role ID", [402])}, "DestructionOfMicrobubbles": {"125235": ("Destruction of microbubbles", [12031])}, "Detach": {"110125": ("Detach", [401, 403])}, "DetectionPerformed": {"111022": ("Detection Performed", [])}, "DetectorArtifacts": {"111214": ("Detector artifact(s)", [6041, 6135, 7011])}, "DetectorType": {"113947": ("Detector Type", [])}, "Deterministic": {"113211": ("Deterministic", [7262])}, "DeterministicTrackingAlgorithm": { "113211": ("Deterministic Tracking Algorithm", []) }, "DeviationIndex": {"113847": ("Deviation Index", [])}, "Device": {"121007": ("Device", [270])}, "DeviceCode": {"121150": ("Device Code", [])}, "DeviceCrossedLesion": {"122089": ("Device crossed lesion", [3422])}, "DeviceDeployed": {"122305": ("Device deployed", [3412])}, "DeviceDescription": {"120999": ("Device Description", [])}, "DeviceLocalizer": {"121341": ("Device localizer", [7201])}, "DeviceManufacturer": {"113878": ("Device Manufacturer", [])}, "DeviceModelName": {"113879": ("Device Model Name", [])}, "DeviceName": {"113877": ("Device Name", [])}, "DeviceObserverManufacturer": {"121014": ("Device Observer Manufacturer", [])}, "DeviceObserverManufacturerClassUID": { "121061": ("Device Observer Manufacturer Class UID", []) }, "DeviceObserverModelName": {"121015": ("Device Observer Model Name", [])}, "DeviceObserverName": {"121013": ("Device Observer Name", [])}, "DeviceObserverPhysicalLocationDuringObservation": { "121017": ("Device Observer Physical Location During Observation", []) }, "DeviceObserverSerialNumber": {"121016": ("Device Observer Serial Number", [])}, "DeviceObserverUID": {"121012": ("Device Observer UID", [])}, "DeviceRelatedAndEnvironmentRelatedEvent": { "130864": ("Device-related and Environment-related Event", [3047]) }, "DeviceRoleInProcedure": {"113876": ("Device Role in Procedure", [])}, "DeviceSerialNumber": {"113880": ("Device Serial Number", [])}, "DeviceSubject": {"121192": ("Device Subject", [271])}, "DeviceSubjectManufacturer": {"121194": ("Device Subject Manufacturer", [])}, "DeviceSubjectModelName": {"121195": ("Device Subject Model Name", [])}, "DeviceSubjectName": {"121193": ("Device Subject Name", [])}, "DeviceSubjectPhysicalLocationDuringObservation": { "121197": ("Device Subject Physical Location during observation", []) }, "DeviceSubjectSerialNumber": {"121196": ("Device Subject Serial Number", [])}, "DeviceSubjectUID": {"121198": ("Device Subject UID", [])}, "DfCD4589Zr": {"126520": ("Df-CD45 ^89^Zr", [4021])}, "DfFK23PEG489Zr": {"126763": ("Df-[FK](2)-3PEG(4) ^89^Zr", [4021])}, "DfFK289Zr": {"126762": ("Df-[FK](2) ^89^Zr", [4021])}, "DfFK89Zr": {"126760": ("Df-FK ^89^Zr", [4021])}, "DfFKPEG389Zr": {"126761": ("Df-FK-PEG(3) ^89^Zr", [4021])}, "Dgn": {"128407": ("DgN", [10069])}, "DiabeticFibrousMastopathy": { "111259": ("Diabetic fibrous mastopathy", [6030, 6031]) }, "DiagnosisInputUsed": {"128218": ("Diagnosis Input Used", [7010])}, "DiagnosticAdministration": {"130249": ("Diagnostic Administration", [72])}, "DiagnosticSourceImages": { "128181": ("Diagnostic Source Images", [7010, 9509, 9510]) }, "DiameterBasedMethod": {"122651": ("Diameter Based Method", [3804, 3807])}, "DiameterGraph": {"122509": ("Diameter Graph", [])}, "DiameterSymmetry": {"122544": ("Diameter Symmetry", [])}, "DiamondDetector": {"128708": ("Diamond Detector", [7026, 7027, 7151, 7193])}, "Diaphanography": {"DG": ("Diaphanography", [29, 30, 33])}, "DiaphragmaticAttenuation": {"122745": ("Diaphragmatic attenuation", [3115])}, "DiastolicBloodVelocityMean": { "122201": ( "Diastolic blood velocity, mean", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "DiastolicBloodVelocityPeak": { "122202": ( "Diastolic blood velocity, peak", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "DiastolicPressureAverage": {"109020": ("Diastolic pressure, average", [])}, "DiastolicPressureNadir": {"109021": ("Diastolic pressure nadir", [])}, "DiastolicSystolicVelocityRatio": { "122218": ("Diastolic/Systolic velocity ratio", [3620]) }, "Dictation": {"110011": ("Dictation", [])}, "DifferenceAverageOfGLCM": {"128784": ("Difference Average of GLCM", [])}, "DifferenceEntropyOfGLCM": {"128786": ("Difference Entropy of GLCM", [])}, "DifferenceInBorderDefinition": {"112166": ("Difference in border definition", [])}, "DifferenceInBorderShape": {"112165": ("Difference in border shape", [])}, "DifferenceInDistribution": {"112167": ("Difference in distribution", [])}, "DifferenceInEDLVVolume": {"122769": ("Difference in ED LV Volume", [])}, "DifferenceInEjectionFraction": {"122768": ("Difference in Ejection Fraction", [])}, "DifferenceInSiteInvolvement": {"112168": ("Difference in site involvement", [])}, "DifferenceInTexture": {"112170": ("Difference in Texture", [])}, "DifferenceInTypeOfContent": {"112169": ("Difference in Type of Content", [])}, "DifferenceVarianceOfGLCM": {"128785": ("Difference Variance of GLCM", [])}, "DifferentialDiagnosisImpression": { "111023": ("Differential Diagnosis/Impression", []) }, "DifferentialInterferenceContrast": { "111748": ("Differential interference contrast", [8123]) }, "DifferentialSignal": {"109006": ("Differential signal", [3240])}, "DifficultPhysicalClinicalExamination": { "111479": ("Difficult physical/clinical examination", [6055]) }, "DiffuseContrastEnhancement": { "130603": ("Diffuse Contrast Enhancement", [6335, 6345, 6346]) }, "DiffuseDirectIllumination": {"111625": ("Diffuse direct illumination", [4203])}, "DiffuselyIncreasedVascularityInSurroundingTissue": { "111377": ("Diffusely increased vascularity in surrounding tissue", [6157]) }, "DiffusionAnisotropy": {"113044": ("Diffusion Anisotropy", [])}, "DiffusionAttenuated": {"113045": ("Diffusion Attenuated", [])}, "DiffusionCoefficient": { "113289": ("Diffusion Coefficient", [218, 7180, 7272, 7469]) }, "DiffusionImageAnalysis": {"129105": ("Diffusion image analysis", [7203])}, "DiffusionTractography": {"129106": ("Diffusion tractography", [7203])}, "DiffusionWeighted": { "113043": ("Diffusion weighted", [218, 6311, 7180, 7270, 7469]) }, "DiffusionWeightedAcquisitionHighestBValueImage": { "130566": ("Diffusion-weighted Acquisition Highest b-value image", [6311]) }, "DigitalFluoroscopy": {"DF": ("Digital fluoroscopy", [])}, "DigitalMammography": {"111409": ("Digital Mammography", [])}, "DigitalMicroscopy": {"DM": ("Digital microscopy", [])}, "DigitalRadiography": {"DX": ("Digital Radiography", [29, 30, 33])}, "DigitalSubtractionAngiography": {"DS": ("Digital Subtraction Angiography", [])}, "DigitalTimecodeNOS": {"109001": ("Digital timecode (NOS)", [3090])}, "Diode": {"128704": ("Diode", [7026, 7027, 7151, 7193])}, "DiodeArray": {"128702": ("Diode Array", [7026, 7027, 7151, 7193])}, "DirectDetector": {"113948": ("Direct Detector", [10030])}, "DirectlyMeasured": {"125316": ("Directly measured", [12227, 12303])}, "DisagreementWithPriorFindings": { "122776": ("Disagreement with prior findings", [3217]) }, "DisapprovedForAnyUse": {"128609": ("Disapproved for any use", [800])}, "DisapprovedForExperimentalUse": { "128612": ("Disapproved for experimental use", [800]) }, "DisapprovedForUseAtTheInstitution": { "128623": ("Disapproved for use at the institution", [800]) }, "DisapprovedForUseInTheClinicalTrial": { "128624": ("Disapproved for use in the clinical trial", [800]) }, "DisapprovedForUseOnPregnantPatients": { "128617": ("Disapproved for use on pregnant patients", [800]) }, "DiscCentered": {"111901": ("Disc centered", [4207])}, "DiscFovea": {"111934": ("Disc-Fovea", [4266])}, "DiscMaculaCentered": {"111903": ("Disc-macula centered", [4207])}, "Discarded": {"111458": ("Discarded", [])}, "DischargeDatetime": {"122163": ("Discharge DateTime", [])}, "DischargeSummary": {"121115": ("Discharge Summary", [])}, "DiscontinuedForUnspecifiedReason": { "110513": ( "Discontinued for unspecified reason", [9300, 9301, 9302, 9303, 9561], ) }, "DiscontinuedProcedureStepRescheduled": { "110528": ("Discontinued Procedure Step rescheduled", [9300]) }, "DiscontinuedProcedureStepReschedulingRecommended": { "110529": ("Discontinued Procedure Step rescheduling recommended", [9300]) }, "DissectionClassification": {"122387": ("Dissection Classification", [])}, "DissectionWithEntireSpecimenSubmission": { "111726": ("Dissection with entire specimen submission", [8110]) }, "DissectionWithRepresentativeSectionsSubmission": { "111727": ("Dissection with representative sections submission", [8110]) }, "DissimilarityOfGLCM": {"126064": ("Dissimilarity of GLCM", [])}, "DistalCentralizer": {"112325": ("Distal Centralizer", [7307, 7308])}, "DistalFindingSite": {"121117": ("Distal Finding Site", [])}, "DistalReference": {"122381": ("Distal Reference", [3486])}, "DistalStentMargin": {"122386": ("Distal Stent Margin", [3487])}, "Distance": {"121206": ("Distance", [218, 6165, 7469, 7470, 10069])}, "DistanceCorrection": {"128527": ("Distance Correction", [10069])}, "DistanceFromAnus": {"112233": ("Distance from anus", [6212])}, "DistanceFromChestWall": {"121244": ("Distance from chest wall", [6165])}, "DistanceFromNeurovascularBundle": { "130557": ("Distance from neurovascular bundle", [6351]) }, "DistanceFromNipple": {"121242": ("Distance from nipple", [6165])}, "DistanceFromSkin": {"121243": ("Distance from skin", [6165])}, "DistancePupillaryDistance": {"111679": ("Distance Pupillary Distance", [])}, "DistanceSourceToDetector": {"113750": ("Distance Source to Detector", [10008])}, "DistanceSourceToIsocenter": {"113748": ("Distance Source to Isocenter", [10008])}, "DistanceSourceToReferencePoint": { "113737": ("Distance Source to Reference Point", [10008]) }, "DistanceSourceToTablePlane": { "113792": ("Distance Source to Table Plane", [10008]) }, "DistinctlyDefined": {"112138": ("Distinctly defined", [6120])}, "DistortedImplant": {"111506": ("Distorted implant", [6072])}, "DistortionArtifactInTheAreaOfInterest": { "130586": ("Distortion artifact in the area of interest", [6315, 6318]) }, "DistributedDiffusionCoefficient": { "113298": ("Distributed Diffusion Coefficient", [218, 7180, 7272, 7469]) }, "DistributionDescriptor": {"112006": ("Distribution Descriptor", [])}, "DistributionRepresentation": {"128413": ("Distribution Representation", [])}, "DivideByZero": {"114003": ("Divide by zero", [42, 43])}, "DoctorCanceledProcedure": { "110500": ("Doctor canceled procedure", [9300, 9301, 9303, 9561]) }, "Document": {"121003": ("Document", [])}, "DocumentDigitizerEquipment": {"DOCD": ("Document Digitizer Equipment", [7005])}, "DocumentProducer": {"DOC": ("Document", [32, 33])}, "DocumentTitle": {"121144": ("Document Title", [])}, "DocumentTitleModifier": {"113011": ("Document Title Modifier", [])}, "DogRegistryOfAmerica": {"109212": ("Dog Registry of America", [7481])}, "DoorInterlock": {"130478": ("Door Interlock", [9561, 9568])}, "DopplerAngle": {"125106": ("Doppler Angle", [])}, "DopplerAudio": {"109113": ("Doppler audio", [3000])}, "DopplerOCTA": {"128256": ("Doppler OCT-A", [4270])}, "DopplerVolumeFlow": {"125219": ("Doppler Volume Flow", [12227, 12231])}, "DoseAreaProduct": {"122130": ("Dose Area Product", [])}, "DoseAreaProductTotal": {"113722": ("Dose Area Product Total", [10050])}, "DoseCalculationBoundingVolume": { "130065": ("Dose Calculation Bounding Volume", [9535]) }, "DoseCalibrator": {"113541": ("Dose Calibrator", [10041])}, "DoseCheckAlertDetails": {"113900": ("Dose Check Alert Details", [])}, "DoseCheckNotificationDetails": {"113908": ("Dose Check Notification Details", [])}, "DoseFrequency": {"111578": ("Dose frequency", [6092])}, "DoseFromPriorTreatment": {"129212": ("Dose from prior Treatment", [7022])}, "DoseGradient": {"128488": ("Dose Gradient", [10063])}, "DoseImage": {"121342": ("Dose Image", [10063])}, "DoseLimitInterlock": {"130738": ("Dose Limit Interlock", [9561, 9568])}, "DoseMeasurementDevice": {"113794": ("Dose Measurement Device", [])}, "DosePointCloud": {"128496": ("Dose Point Cloud", [10063])}, "DoseRP": {"113738": ("Dose (RP)", [])}, "DoseRPTotal": {"113725": ("Dose (RP) Total", [])}, "DoseRateToleranceViolation": {"130474": ("Dose Rate Tolerance Violation", [9567])}, "DosimeterType": {"113818": ("Dosimeter Type", [])}, "DosimetricResult": {"128190": ("Dosimetric Result", [7010, 7023])}, "DosingFactor": {"130190": ("Dosing Factor", [])}, "DoubleExposure": {"113026": ("Double exposure", [7011])}, "DoubleMDerivedFilter": {"130767": ("Double-m-derived filter", [3042])}, "DoubleProduct": {"122708": ("Double Product", [])}, "DrugAdministered": {"122083": ("Drug administered", [3409])}, "DrugEnd": {"122082": ("Drug end", [3409])}, "DrugProductIdentifier": {"113510": ("Drug Product Identifier", [])}, "DrugStart": {"122081": ("Drug start", [3409])}, "DualSideIllumination": {"130811": ("Dual-side illumination", [11001])}, "DualSpeedOfSoundCorrection": { "130819": ("Dual Speed of Sound Correction", [11004]) }, "DuctNarrowing": {"111429": ("Duct narrowing", [6054, 6057])}, "DuctalAdenoma": {"111258": ("Ductal adenoma", [6030, 6031])}, "DuctalHyperplasia": {"111249": ("Ductal hyperplasia", [])}, "Ductography": {"111139": ("Ductography", [])}, "DuplexDoppler": {"DD": ("Duplex Doppler", [])}, "DuplicateOrder": {"110510": ("Duplicate order", [9300, 9301, 9302, 9303])}, "DurationOfAdministration": {"122095": ("Duration of administration", [3410])}, "DurationOfIntervention": {"122106": ("Duration of Intervention", [])}, "DurationOfTimePeriod": {"130532": ("Duration of Time Period", [10073])}, "DuringTransport": {"127102": ("During transport", [634])}, "DuringVoiding": {"109137": ("During voiding", [91])}, "DwConversionFactorCoefficients": { "113991": ("Dw Conversion Factor Coefficients", []) }, "DynamicContrastEnhancedAcquisition": { "130567": ("Dynamic Contrast-Enhanced Acquisition", [6311]) }, "DynamicContrastEnhancedAcquisitionSubtractionImage": { "130568": ("Dynamic Contrast-Enhanced Acquisition Subtraction image", [6311]) }, "DynamicContrastEnhancedTemporalResolution": { "130547": ("Dynamic contrast-enhanced temporal resolution", []) }, "DynamicContrastMRMeasurementReport": { "126002": ("Dynamic Contrast MR Measurement Report", [7021]) }, "DynamicLight": {"111630": ("Dynamic light", [4203])}, "DynamicWedge": {"130348": ("Dynamic Wedge", [9546])}, "DyssynchronyIndex": {"125325": ("Dyssynchrony Index", [12304])}, "E4G1089Zr": {"126519": ("E4G10 ^89^Zr", [4021])}, "ECGBasedGatingSignalProcessed": { "109002": ("ECG-based gating signal, processed", [3090]) }, "ECGGlobalMeasurements": {"122158": ("ECG Global Measurements", [])}, "ECGLeadMeasurements": {"122159": ("ECG Lead Measurements", [])}, "ECST": {"122656": ("ECST", [3804])}, "EEGAnnotation": {"130861": ("EEG Annotation", [3047])}, "EEMCrossSectionalArea": {"122333": ("EEM Cross-Sectional Area", [3482])}, "EEMDiameter": {"122330": ("EEM Diameter", [3481])}, "EEMDiameterRatio": {"122352": ("EEM Diameter Ratio", [3484])}, "EEMVolume": {"122371": ("EEM Volume", [3485])}, "EMGAnnotation": {"130862": ("EMG Annotation", [3047])}, "EOGAnnotation": {"130863": ("EOG Annotation", [3047])}, "EPProcedurePhase": {"109061": ("EP Procedure Phase", [])}, "ESUR2012ProstateMRIAcquisitionRequirements": { "130606": ("ESUR 2012 prostate MRI acquisition requirements", [6326, 6353]) }, "EarlyContrastEnhancement": { "130602": ("Early Contrast Enhancement", [6335, 6345, 6346]) }, "EarlyGestation": {"125009": ("Early Gestation", [])}, "EchoPattern": {"111360": ("Echo pattern", [])}, "Echocardiography": {"EC": ("Echocardiography", [])}, "EchogenicHalo": {"111359": ("Echogenic halo", [6153])}, "Echogenicity": {"110849": ("Echogenicity", [218, 7180, 7469])}, "Echovist": {"125902": ("Echovist", [12030])}, "Ecromeximab89Zr": {"126732": ("Ecromeximab ^89^Zr", [4021])}, "EdgeDetection": {"123103": ("Edge Detection", [7162])}, "EdgeEnhancement": {"113086": ("Edge enhancement", [7203])}, "EditedModel": {"129010": ("Edited Model", [7062])}, "EducationalIntent": {"129012": ("Educational Intent", [7064])}, "EffectiveAtomicNumber": {"129320": ("Effective Atomic Number", [301])}, "EffectiveDose": {"113839": ("Effective Dose", [10050])}, "EffectiveDoseConversionFactor": { "113840": ("Effective Dose Conversion Factor", []) }, "EffectiveDosePhantomType": {"113817": ("Effective Dose Phantom Type", [])}, "EffectiveOrificeArea": {"125326": ("Effective Orifice Area", [12304])}, "EffectiveZ": {"130084": ("Effective Z", [])}, "EffectiveZPerA": {"130085": ("Effective Z per A", [])}, "Elasticity": {"110830": ("Elasticity", [218, 7180, 7469, 11006, 12308])}, "ElectricalFailure": {"111217": ("Electrical failure", [6041, 6135, 7011])}, "Electrocardiography": {"ECG": ("Electrocardiography", [29, 30, 33])}, "ElectrodePlacement": {"122141": ("Electrode Placement", [])}, "Electroencephalography": {"EEG": ("Electroencephalography", [29, 30, 33])}, "ElectromechanicalDelay": {"125320": ("Electromechanical Delay", [12307])}, "Electromyography": {"EMG": ("Electromyography", [29, 30, 33])}, "ElectronFixedAperture": {"130343": ("Electron Fixed Aperture", [9541, 9545])}, "Electrooculography": {"EOG": ("Electrooculography", [29, 30, 33])}, "ElementalCompositionAtomicMassFraction": { "130094": ("Elemental Composition Atomic Mass Fraction", []) }, "ElevationBasedCornealTomographer": { "111945": ("Elevation-based corneal tomographer", [4210]) }, "Eligibility": {"126075": ("Eligibility", [6146])}, "EligibilityReader": {"129001": ("Eligibility Reader", [7453])}, "EligibleForReimbursement": {"128613": ("Eligible for reimbursement", [800])}, "EligibleForReimbursementOnPerPatientBasis": { "128614": ("Eligible for reimbursement on per patient basis", [800]) }, "Elliptic": {"112134": ("Elliptic", [6119])}, "EllipticFilter": {"130762": ("Elliptic filter", [3042])}, "Email": {"110031": ("Email", [405])}, "EmbryonicKidney": {"127801": ("Embryonic kidney", [645, 8134])}, "EmergencyOverrideStarted": {"110127": ("Emergency Override Started", [401, 403])}, "EmergencyOverrideStopped": {"110138": ("Emergency Override Stopped", [401, 403])}, "EmpiricalAlgorithm": {"128481": ("Empirical Algorithm", [10068])}, "EndCirculatorySupport": {"121158": ("End Circulatory Support", [3550])}, "EndDiastole": {"109022": ("End diastole", [])}, "EndOfExpiration": {"109023": ("End of expiration", [3337])}, "EndOfInspiration": {"109024": ("End of inspiration", [3337])}, "EndOfSystole": {"109070": ("End of systole", [3337])}, "EndOfTimePeriod": {"130534": ("End of Time Period", [10073])}, "EndOfXRayIrradiation": {"113810": ("End of X-Ray Irradiation", [])}, "EndOxygenAdministration": {"121162": ("End oxygen administration", [3530])}, "EndPacing": {"121167": ("End Pacing", [3552])}, "EndProcedureAction": {"121131": ("End Procedure Action", [3421])}, "EndProcedureActionItem": {"121131": ("End Procedure Action Item", [])}, "EndVentilation": {"121169": ("End Ventilation", [3551])}, "EndingFlowRateOfAdministration": { "130209": ("Ending Flow Rate of administration", []) }, "EndocardialMethod": {"130683": ("Endocardial Method", [12227, 12310])}, "EndocavitaryTransducer": {"125266": ("Endocavitary Transducer", [12035])}, "Endoleak": {"122680": ("endoleak", [3813])}, "EndorectalCoilType": {"130544": ("Endorectal coil type", [])}, "EndorectalCoilUsed": {"130543": ("Endorectal coil used", [])}, "EndorectalTransducer": {"125264": ("Endorectal Transducer", [12035])}, "Endoscopy": {"ES": ("Endoscopy", [29, 30, 33])}, "EndovaginalTransducer": {"125263": ("Endovaginal Transducer", [12035])}, "EnhancedMultiFrameConversionEquipment": { "109106": ("Enhanced Multi-frame Conversion Equipment", [7005]) }, "EnrichmentManufacturer": {"127191": ("Enrichment manufacturer", [])}, "EnrichmentMaterial": {"127190": ("Enrichment material", [])}, "EnrichmentMaterialPresent": {"127192": ("Enrichment material present", [])}, "EntireBodyTargetVolume": {"130055": ("Entire Body Target Volume", [9534])}, "EntirePullback": {"122383": ("Stented Region", [3487])}, "EntranceExposureAtRP": {"111636": ("Entrance Exposure at RP", [10050])}, "EnvironmentalExposureHistory": {"111547": ("Environmental Exposure History", [])}, "EnvironmentalFactor": {"111548": ("Environmental Factor", [])}, "EpicardialMethod": {"130684": ("Epicardial Method", [12227, 12310])}, "EpidermalInclusionCyst": {"111262": ("Epidermal inclusion cyst", [])}, "EpifluorescenceIllumination": {"111743": ("Epifluorescence illumination", [8123])}, "Equation": {"121420": ("Equation", [228])}, "EquationCitation": {"121421": ("Equation Citation", [228])}, "EquidistantMethod": {"122574": ("Equidistant method", [3456])}, "EquipmentBroughtToProcedureRoom": { "122047": ("Equipment brought to procedure room", [3427]) }, "EquipmentChange": {"110516": ("Equipment change", [9300, 9301])}, "EquipmentFailure": { "110501": ("Equipment failure", [71, 3427, 4221, 4222, 9300, 9301, 9302, 9561]) }, "EquipmentFailure_Retired": {"122046": ("Equipment failure", [])}, "EquipmentIdentification": {"121122": ("Equipment Identification", [])}, "EquipmentLandmark": {"128750": ("Equipment Landmark", [])}, "EquipmentLandmarkToPatientFiducialZDistance": { "128756": ("Equipment Landmark to Patient Fiducial Z Distance", []) }, "EquipmentLandmarkXPosition": {"128752": ("Equipment Landmark X Position", [])}, "EquipmentLandmarkZPosition": {"128753": ("Equipment Landmark Z Position", [])}, "EquipmentOrigin": {"130537": ("Equipment Origin", [10074])}, "EquipmentReady": {"122048": ("Equipment ready", [3427])}, "EquipmentRemoved": {"122049": ("Equipment removed", [3427])}, "Equivalent2GrayFractionsModel": { "130130": ("Equivalent 2-Gray Fractions Model", [9539]) }, "EquivalentAttenuatorMaterial": {"128465": ("Equivalent Attenuator Material", [])}, "EquivalentAttenuatorThickness": { "128469": ("Equivalent Attenuator Thickness", []) }, "EquivalentCDADocument": {"121331": ("Equivalent CDA Document", [7006])}, "EquivalentDose": {"128512": ("Equivalent Dose", [218, 7180, 7469, 10070])}, "EquivalentKReading": {"111756": ("Equivalent K-reading", [4235, 4242])}, "EquivalentMeaningOfConceptName": { "121050": ("Equivalent Meaning of Concept Name", [9000]) }, "EquivalentMeaningOfValue": {"121051": ("Equivalent Meaning of Value", [])}, "ErgometerPower": {"122704": ("Ergometer power", [])}, "ErodedPlaque": {"122390": ("Eroded Plaque", [3491])}, "EsophagealPressure": {"130425": ("Esophageal Pressure", [3005])}, "Estimated": {"121427": ("Estimated", [])}, "EstimatedExtravasationActivity": { "113506": ("Estimated Extravasation Activity", []) }, "EstimatedExtravasationVolume": {"130214": ("Estimated Extravasation Volume", [])}, "EstimatedFromWaterEquivalentDiameter": { "113988": ("Estimated from Water Equivalent Diameter", [10023]) }, "EstimatedNormalFlow": {"122555": ("Estimated Normal Flow", [])}, "EstimatedTimeframe": {"111395": ("Estimated Timeframe", [])}, "EstrogenReceptor": {"111475": ("Estrogen receptor", [])}, "Euler": {"113218": ("Euler", [7262])}, "EuropiumOrEuropiumCompound": {"113711": ("Europium or Europium compound", [])}, "EventButtonPressed": {"130893": ("Event button pressed", [3039])}, "EventButtonTest": {"130894": ("Event button test", [3039])}, "EventUIDUsed": {"128429": ("Event UID Used", [])}, "ExcellentImageQuality": {"122740": ("Excellent image quality", [3114])}, "ExcursionDistance": {"125327": ("Excursion Distance", [12304])}, "ExerciseDurationAfterStressAgentInjection": { "122711": ("Exercise duration after stress agent injection", []) }, "ExerciserDevicePresent": {"127193": ("Exerciser device present", [])}, "ExogenousSubstance": {"127400": ("Exogenous substance", [])}, "ExpectedADCMapIsMissing": { "130585": ("Expected ADC map is missing", [6315, 6318]) }, "ExpectedBValueIsMissing": { "130583": ("Expected b-value is missing", [6315, 6318]) }, "Explantation": {"111510": ("Explantation", [6072])}, "Export": {"110106": ("Export", [400])}, "ExposedRange": {"113899": ("Exposed Range", [])}, "Exposure": {"113736": ("Exposure", [])}, "ExposureIndex": {"113845": ("Exposure Index", [])}, "ExposureTime": {"113824": ("Exposure Time", [])}, "ExposureTimePerRotation": {"113834": ("Exposure Time per Rotation", [])}, "ExposureTime_Retired": {"113735": ("Exposure Time", [])}, "ExtendedPatientAnatomyModel": { "130068": ("Extended Patient Anatomy Model", [9507]) }, "ExtendedRenderingForPresentation": { "121334": ("Extended Rendering for Presentation", [7006]) }, "ExtendedToftsModel": {"126341": ("Extended Tofts Model", [4101, 4106])}, "ExternalBodyModel": {"130047": ("External Body Model", [9501, 9502, 9580])}, "ExternalBodyStructure": {"130047": ("External Body Structure", [])}, "ExternalCameraPhotography": {"XC": ("External-camera Photography", [29, 30, 33])}, "ExternalDataSource": {"111781": ("External Data Source", [4240])}, "ExternalTransducer": {"125261": ("External Transducer", [12035])}, "ExtraAbdominalDesmoid": {"111260": ("Extra abdominal desmoid", [])}, "ExtraProstaticFinding": {"130559": ("Extra-prostatic Finding", [])}, "ExtractionOfIndividualSubjectFromGroup": { "113131": ("Extraction of individual subject from group", [7203]) }, "Extravasation": {"111428": ("Extravasation", [6054, 6057])}, "ExtravasationVisibleInImage": { "113568": ("Extravasation visible in image", [60, 9300, 10043]) }, "ExtremelySmall": {"112131": ("Extremely small", [6118])}, "FACT": {"113214": ("FACT", [7262])}, "FIRFilter": {"130770": ("FIR filter", [3043])}, "FLB457C11": {"126706": ("FLB 457 C^11^", [4021])}, "FWPByGACampbell1991": {"128040": ("FWP by GA, Campbell, 1991", [12012, 12016])}, "FWPByGAHadlock1991": {"128041": ("FWP by GA, Hadlock, 1991", [12012, 12016])}, "Failed": {"111224": ("Failed", [6042])}, "FailedAnalyses": {"111024": ("Failed Analyses", [])}, "FailedDetections": {"111025": ("Failed Detections", [])}, "FallyprideC11": {"126704": ("Fallypride C^11^", [4021])}, "FallyprideF18": {"126705": ("Fallypride F^18^", [4021])}, "FalseLumen": {"122361": ("False Lumen", [3491])}, "FalseMarkersPerCase": {"111087": ("False Markers per Case", [6048])}, "FalseMarkersPerImage": {"111086": ("False Markers per Image", [6048])}, "FalsePositiveDefectFinding": {"122748": ("False Positive defect finding", [3113])}, "FamilyHistoryFetalMalformationSyndrome": { "111574": ("Family history, fetal malformation/syndrome", [6087, 6088]) }, "FamilyHistoryOfMelanomaInSitu": { "130481": ("Family history of melanoma in situ", []) }, "FamilyHistoryOfNonMelanomaSkinCancer": { "130480": ("Family history of non-melanoma skin cancer", []) }, "FamilyHistoryOfProstateCancer": { "111562": ("Family history of prostate cancer", [6081, 6087, 6322, 6327]) }, "FamilyHistoryUnknown": {"111563": ("Family history unknown", [6081, 6087])}, "FamilyMemberWithRiskFactor": {"111537": ("Family Member with Risk Factor", [])}, "FastDiffusionCoefficient": { "113292": ("Fast Diffusion Coefficient", [218, 7180, 7272, 7469]) }, "FastDiffusionCoefficientFraction": { "113293": ("Fast Diffusion Coefficient Fraction", [218, 7180, 7272, 7469]) }, "FastMode": {"114211": ("Fast mode", [8202])}, "FastingDuration": {"113550": ("Fasting Duration", [])}, "FatFraction": {"129100": ("Fat fraction", [218, 7180, 7469])}, "FeatureDetectedOnImagesFromMultipleModalities": { "111159": ("Feature detected on images from multiple modalities", [6036]) }, "FeatureDetectedOnMultipleImages": { "111158": ("Feature detected on multiple images", [6036]) }, "FeatureDetectedOnOnlyOneOfTheImages": { "111157": ("Feature detected on only one of the images", [6036]) }, "FeatureDetectedOnTheOnlyImage": { "111156": ("Feature detected on the only image", [6036]) }, "FederationOfInternationalCanines": { "109213": ("Federation of International Canines", [7481]) }, "FeedManufacturer": {"127200": ("Feed manufacturer", [])}, "FeedProductCode": {"127202": ("Feed product code", [])}, "FeedProductName": {"127201": ("Feed product name", [])}, "FeedSource": {"127205": ("Feed source", [])}, "FeedbackTemperatureRegulation": { "127210": ("Feedback temperature regulation", []) }, "Fellow": {"121088": ("Fellow", [7450, 7452])}, "Female": {"F": ("Female", [7455, 7457])}, "FemaleChangedToMale": {"FC": ("Female changed to Male", [7455])}, "FemalePseudohermaphrodite": {"FP": ("Female Pseudohermaphrodite", [7455])}, "FemoralHeadBallComponent": { "112308": ("Femoral Head Ball Component", [7307, 7308]) }, "FemoralHeadConeTaperComponent": { "112309": ("Femoral Head Cone Taper Component", [7307, 7308]) }, "FemoralHeadResurfacingComponent": { "112317": ("Femoral Head Resurfacing Component", [7307, 7308]) }, "FemoralStem": {"112310": ("Femoral Stem", [7307, 7308])}, "FemoralStemComponent": {"112313": ("Femoral Stem Component", [7307, 7308])}, "FemoralStemDistalComponent": { "112311": ("Femoral Stem Distal Component", [7307, 7308]) }, "FemoralStemProximalComponent": { "112312": ("Femoral Stem Proximal Component", [7307, 7308]) }, "FemurHeadCenterOfRotation": { "112304": ("Femur Head Center of Rotation", [7305, 7306]) }, "FetalBiometry": {"125002": ("Fetal Biometry", [])}, "FetalBiometryRatios": {"125001": ("Fetal Biometry Ratios", [])}, "FetalCardiacUltrasoundReport": { "125196": ("Fetal Cardiac Ultrasound Report", [7000, 12245]) }, "FetalCranium": {"125004": ("Fetal Cranium", [])}, "FetalLongBones": {"125003": ("Fetal Long Bones", [])}, "FetalMeasurements": {"125016": ("Fetal Measurements", [])}, "Fetus": {"121026": ("Fetus", [271])}, "FetusCharacteristics": {"125015": ("Fetus Characteristics", [])}, "FetusNumber": {"121037": ("Fetus number", [])}, "FetusSummary": {"125008": ("Fetus Summary", [])}, "FibroLipidicPlaque": {"122394": ("Fibro-Lipidic Plaque", [3491, 3495, 3497])}, "Fibroadenolipoma": {"111264": ("Fibroadenolipoma", [6030, 6031])}, "FibroadenomatoidHyperplasia": { "111263": ("Fibroadenomatoid hyperplasia", [6030, 6031]) }, "Fibrocalcific": {"112163": ("Fibrocalcific", [6132])}, "Fibronodular": {"112148": ("Fibronodular", [6123])}, "FiducialAlignment": {"125022": ("Fiducial Alignment", [7100, 8203])}, "FiducialFeature": {"122340": ("Fiducial feature", [])}, "FiducialIntent": {"112369": ("Fiducial Intent", [])}, "FiducialMark": { "112171": ( "Fiducial mark", [6102, 6138, 6202, 6203, 6404, 7110, 7151, 7193, 9581], ) }, "Field1ForJoslin3Field": {"111621": ("Field 1 for Joslin3 field", [4207])}, "Field2ForJoslin3Field": {"111622": ("Field 2 for Joslin 3 field", [4207])}, "Field3ForJoslin3Field": {"111623": ("Field 3 for Joslin 3 field", [4207])}, "FieldMapMRSignalIntensity": { "110807": ("Field Map MR Signal Intensity", [218, 7180, 7469]) }, "FillerNumber": {"121021": ("Filler Number", [])}, "Film": {"110010": ("Film", [405])}, "FilmDetectorType": {"113951": ("Film", [10030])}, "FilmDigitizer": {"FILMD": ("Film Digitizer", [30, 7005])}, "FilmHolder": {"130352": ("Film Holder", [9548])}, "FilmScreenMammography": {"111408": ("Film Screen Mammography", [6050, 6083])}, "FilteredBackProjection": {"113962": ("Filtered Back Projection", [10033])}, "Filtration": {"130512": ("Filtration", [])}, "FinalReport": {"128005": ("Final Report", [9233])}, "Finding": {"121071": ("Finding", [3419, 6053, 7002, 9000])}, "FindingObservationType": {"125305": ("Finding Observation Type", [])}, "Findings": {"121070": ("Findings", [])}, "FinePleomorphicCalcification": { "111344": ("Fine pleomorphic calcification", [6010, 6011]) }, "FirmSkinLesion": {"130485": ("Firm skin lesion", [4407])}, "FirstChordOfAbnormalRegion": {"122452": ("First Chord of Abnormal Region", [])}, "FirstMammogramEver": {"111404": ("First mammogram ever", [])}, "FirstMeasureOfInformationCorrelationOfGLCM": { "128798": ("First Measure of Information Correlation of GLCM", []) }, "FirstPassLeakageProfileFPLPModel": { "126343": ("First Pass Leakage Profile (FPLP) Model", [4101, 4106]) }, "FixationDeviceAngle": {"130658": ("Fixation Device Angle", [])}, "FixationOrPositioningDevice": { "130044": ("Fixation or Positioning Device", [9502, 9580]) }, "FixedBeamDirection": {"125257": ("Fixed beam direction", [12034])}, "FixedDp": {"113267": ("Fixed-Dp", [7274])}, "FixedDurationPauseEnded": {"130155": ("Fixed duration pause ended", [71])}, "FixedGrid": {"111641": ("Fixed grid", [10017])}, "FixedLaserSetupPoint": {"130360": ("Fixed Laser Setup Point", [9554])}, "FlashDoesnTIncludeCassetteScreenDetectorIdentification": { "111191": ( "Flash doesn't include cassette/screen/detector identification", [6041], ) }, "FlashDoesnTIncludeDateOfExamination": { "111188": ("Flash doesn't include date of examination", [6041]) }, "FlashDoesnTIncludeFacilityNameAndLocation": { "111189": ("Flash doesn't include facility name and location", [6041]) }, "FlashDoesnTIncludeMammographyUnitIdentification": { "111192": ("Flash doesn't include mammography unit identification", [6041]) }, "FlashDoesnTIncludePatientNameAndAdditionalPatientId": { "111187": ( "Flash doesn't include patient name and additional patient id", [6041], ) }, "FlashDoesnTIncludeTechnologistIdentification": { "111190": ("Flash doesn't include technologist identification", [6041]) }, "FlashIsIllegibleDoesNotFitOrIsLopsided": { "111186": ("Flash is illegible, does not fit, or is lopsided", [6041]) }, "FlashIsNotNearEdgeOfFilm": {"111185": ("Flash is not near edge of film", [6041])}, "FlatFilter": {"113653": ("Flat filter", [10007])}, "FlatteningFilterBeam": {"130355": ("Flattening Filter Beam", [9549])}, "FleischTable": {"122254": ("Fleisch table", [3664])}, "FleischnerLines": {"112107": ("Fleischner's line(s)", [6102, 6103])}, "Flocculent": {"112164": ("Flocculent", [6132])}, "FlorbetabenF18": {"126501": ("Florbetaben F^18^", [])}, "FlowImageForImageProcessing": { "128251": ("Flow image for image processing", [7202]) }, "FlowQuantification": {"122604": ("Flow Quantification", [])}, "FlowRateAboveAdjustmentLimit": { "130153": ("Flow rate above adjustment limit", [71]) }, "FlowRateAboveWarningLimit": {"130152": ("Flow rate above warning limit", [71])}, "FlowRateVsTime": {"130229": ("Flow Rate vs Time", [])}, "FlowVariance": {"110829": ("Flow Variance", [218, 7180, 7469])}, "FlowVelocity": {"110828": ("Flow Velocity", [218, 7180, 7469, 12119, 12120])}, "FlubatineF18": {"126503": ("Flubatine F^18^", [4021])}, "FlubatineF18_Retired": {"126712": ("Flubatine F^18^", [])}, "Fluffy": {"112149": ("Fluffy", [6123])}, "FluidObtained": {"111449": ("Fluid obtained", [6066])}, "FluoresceinAngiography": {"FA": ("Fluorescein angiography", [])}, "FluoroDoseAreaProductTotal": { "113726": ("Fluoro Dose Area Product Total", [10050]) }, "FluoroDoseRPTotal": {"113728": ("Fluoro Dose (RP) Total", [])}, "FluoroMode": {"113732": ("Fluoro Mode", [])}, "FluoromisonidazoleFMISOF18": {"126708": ("Fluoromisonidazole (FMISO) F^18^", [])}, "FluoroscopyGuidedProjectionRadiographySystem": { "113957": ("Fluoroscopy-Guided Projection Radiography System", [10032]) }, "FluorotrioprideF18": {"126707": ("Fluorotriopride F^18^", [4021])}, "FlurpiridazF18": {"126718": ("Flurpiridaz F^18^", [4021])}, "FlushAdministration": {"130251": ("Flush Administration", [72])}, "FocalAbnormality": {"130591": ("Focal abnormality", [6335, 6336, 6337])}, "FocalContrastEnhancement": { "130604": ("Focal Contrast Enhancement", [6335, 6345, 6346]) }, "FocalPlaneZOffset": {"112708": ("Focal plane Z offset", [])}, "FocalSpotSize": {"113766": ("Focal Spot Size", [])}, "FocusedGrid": {"111642": ("Focused grid", [10017])}, "FollowUpAtShortInterval111Months": { "111142": ("Follow-up at short interval (1-11 months)", [6028, 6029]) }, "FollowUpAtShortIntervalFromPriorStudy": { "111416": ("Follow-up at short interval from prior study", [6051]) }, "FollowUpPostBiopsyAsDirectedByClinician": { "111121": ("Follow-up post biopsy as directed by clinician", [6028]) }, "FoodTreat": {"127391": ("Food treat", [609])}, "FootToHead": {"110869": ("Foot To Head", [7185])}, "ForAttenuationCorrection": {"122403": ("For Attenuation Correction", [7210])}, "ForClinicalTrialExport": {"128711": ("For Clinical Trial Export", [7010, 7014])}, "ForClinicalTrialSubmission": {"128207": ("For Clinical Trial Submission", [7010])}, "ForConference": {"113005": ("For Conference", [7010])}, "ForDiagnosis": {"128195": ("For Diagnosis", [7010])}, "ForLitigation": {"113021": ("For Litigation", [7010])}, "ForMachineQualityAssurance": { "128205": ("For Machine Quality Assurance", [7010, 7024]) }, "ForPatient": {"113007": ("For Patient", [7010])}, "ForPatientSetupVerification": { "128206": ("For Patient Setup Verification", [7010, 7024]) }, "ForPeerReview": {"113008": ("For Peer Review", [7010])}, "ForPhysicianReview": {"128201": ("For Physician Review", [7010, 7024])}, "ForPhysicistReview": {"128202": ("For Physicist Review", [7010, 7024])}, "ForPlanComparison": {"128199": ("For Plan Comparison", [7010])}, "ForPlanQualityAssurance": {"128204": ("For Plan Quality Assurance", [7010, 7024])}, "ForPrinting": {"113018": ("For Printing", [7010])}, "ForProcessingPredecessor": {"121358": ("For Processing predecessor", [7202])}, "ForPublicationExport": {"128714": ("For Publication Export", [7010, 7014])}, "ForRTPlanSummation": {"128200": ("For RT Plan Summation", [7010, 7024])}, "ForRTPrescription": {"128197": ("For RT Prescription", [7010, 7024])}, "ForRTTreatmentPlanning": {"128198": ("For RT Treatment Planning", [7010, 7024])}, "ForRTWorkflow": {"128180": ("For RT Workflow", [7010, 7024])}, "ForReferringProvider": {"113002": ("For Referring Provider", [7010])}, "ForReportAttachment": {"113020": ("For Report Attachment", [7010])}, "ForResearch": {"113009": ("For Research", [7010])}, "ForResearchCollectionExport": { "128713": ("For Research Collection Export", [7010, 7014]) }, "ForSegmentation": {"128196": ("For Segmentation", [7010])}, "ForSurgery": {"113003": ("For Surgery", [7010])}, "ForTeaching": {"113004": ("For Teaching", [7010])}, "ForTeachingFileExport": {"128710": ("For Teaching File Export", [7010, 7014])}, "ForTherapy": {"113006": ("For Therapy", [7010])}, "ForTumorBoard": {"128203": ("For Tumor Board", [7010])}, "ForTumorRegistry": {"128208": ("For Tumor Registry", [7010])}, "ForcedAirHeater": {"127250": ("Forced air heater", [635])}, "ForeignBody": {"111265": ("Foreign body (reaction)", [])}, "FovealSensitivityRelated": {"111841": ("Foveal sensitivity related", [4252])}, "Fp10": {"130711": ("Fp10", [3030])}, "Fp9": {"130710": ("Fp9", [3030])}, "FractalDimension": {"126050": ("Fractal Dimension", [218, 7468])}, "FractionalAnisotropy": { "110808": ("Fractional Anisotropy", [218, 7180, 7263, 7271, 7469]) }, "FractionalChange": {"125314": ("Fractional Change", [12303])}, "FractionalKurtosisAnisotropy": { "113209": ("Fractional Kurtosis Anisotropy", [7263]) }, "FractionalOccupancySegmentation": { "110855": ("Fractional Occupancy Segmentation", [218, 7180, 7469]) }, "FractionalProbabilisticSegmentation": { "110854": ("Fractional Probabilistic Segmentation", [218, 7180, 7469]) }, "FractionationBasedOrTemporallyBasedMethods": { "130127": ("Fractionation-based or temporally-based methods", [9537]) }, "FrameExtractingEquipment": {"109105": ("Frame Extracting Equipment", [7005])}, "FrameOfReferenceIdentity": {"125021": ("Frame of Reference Identity", [7100])}, "FrameOfReferenceUID": {"112227": ("Frame of Reference UID", [])}, "FrameToFrameAnalysis": {"122499": ("Frame to Frame Analysis", [])}, "FraminghamQtcAlgorithm": {"122733": ("Framingham QTc Algorithm", [3678])}, "FreeAcquisition": {"113807": ("Free Acquisition", [10013])}, "FreeSilicone": {"111508": ("Free silicone", [6072])}, "Freehand": {"114215": ("Freehand", [8203])}, "FrequencyOfStimulusEvents": {"130495": ("Frequency of Stimulus Events", [])}, "Fresolimumab89Zr": {"126748": ("Fresolimumab ^89^Zr", [4021])}, "FridericiaQtcAlgorithm": {"122732": ("Fridericia QTc Algorithm", [3678])}, "FrontOfCorneaToFrontOfLens": { "111776": ("Front Of Cornea To Front Of Lens", [4239]) }, "FullBernoulli": {"125217": ("Full Bernoulli", [12227, 12230])}, "FullCardiacCycle": {"125324": ("Full Cardiac Cycle", [12307])}, "FullFidelityImage": {"121327": ("Full fidelity image", [7205])}, "FunctionalConditionPresentDuringAcquisition": { "130324": ("Functional condition present during acquisition", []) }, "FunctionalImage": {"121339": ("Functional image", [7201])}, "Fundoscopy": {"FS": ("Fundoscopy", [])}, "GA20189Zr": {"126731": ("GA201 ^89^Zr", [4021])}, "GDPattern": {"109903": ("GD Pattern", [8301])}, "GGraft": {"130734": ("G - Graft", [3022])}, "GTVNodal": {"130051": ("GTV Nodal", [9534])}, "GTVPrimary": {"130052": ("GTV Primary", [9534])}, "Galactocele": {"111269": ("Galactocele", [])}, "GammaCapillaryTransitTimeGCCTModel": { "126345": ("Gamma Capillary Transit Time (GCCT) Model", []) }, "GammaCapillaryTransitTimeGCTTModel": { "126345": ("Gamma Capillary Transit Time (GCTT) Model", [4101, 4106]) }, "GammaDistributionMode": { "113297": ("Gamma Distribution Mode", [218, 7180, 7272, 7469]) }, "GammaDistributionModel": {"113253": ("Gamma distribution model", [7273])}, "GammaDistributionScaleParameter": { "113295": ("Gamma Distribution Scale Parameter", [218, 7180, 7272, 7469]) }, "GammaDistributionShapeParameter": { "113296": ("Gamma Distribution Shape Parameter", [218, 7180, 7272, 7469]) }, "GanglionCellComplexThickness": { "111926": ("Ganglion cell complex thickness", [4262]) }, "GastrointestinalImagingSubjectMatter": { "128731": ("Gastrointestinal imaging subject matter", [7017]) }, "GaussianBlur": {"113088": ("Gaussian blur", [7203])}, "GaussianFilter": {"130764": ("Gaussian filter", [3042])}, "GeneralMicroscopy": {"GM": ("General Microscopy", [29, 30, 33])}, "GeneralReductionInSensitivity": { "111850": ("General reduction in sensitivity", [4254]) }, "Generator": {"113543": ("Generator", [])}, "Generic2DPlanning": {"112340": ("Generic 2D Planning", [7320])}, "Generic3DPlanning": {"112341": ("Generic 3D Planning", [7320])}, "GenericPlanningForHipReplacement": { "112342": ("Generic Planning for Hip Replacement", [7320]) }, "GenericPlanningForKneeReplacement": { "112343": ("Generic Planning for Knee Replacement", [7320]) }, "GeneticModifications": {"127414": ("Genetic modifications", [])}, "GeneticModificationsDescription": { "127415": ("Genetic modifications description", []) }, "GenitourinaryHistory": {"130548": ("Genitourinary History", [])}, "GenitourinaryImagingSubjectMatter": { "128732": ("Genitourinary imaging subject matter", [7017]) }, "GeometricCenterpoint": {"128137": ("Geometric Centerpoint", [219, 1011])}, "GeometricIsocenter": {"122486": ("Geometric Isocenter", [3452])}, "GeometricNonIsocenter": {"122487": ("Geometric Non-Isocenter", [3452])}, "GeometricPurposeOfRegion": {"130400": ("Geometric purpose of region", [])}, "GeometricRadiationTransportModel": { "128421": ("Geometric Radiation Transport Model", [10065]) }, "GeometricalImageEvaluation": {"109708": ("Geometrical image evaluation", [8300])}, "GlaucomaHemifieldTestAnalysis": { "111855": ("Glaucoma Hemifield Test Analysis", [4257]) }, "GlembatumumabVedotin89Zr": {"126724": ("Glembatumumab vedotin ^89^Zr", [4021])}, "Global": {"113213": ("Global", [7262])}, "GlobalTrackingAlgorithm": {"113213": ("Global Tracking Algorithm", [])}, "GlomerularFiltrationRateBlackMDRD": { "113574": ("Glomerular Filtration Rate black (MDRD)", [10047]) }, "GlomerularFiltrationRateCreatinineBasedFormulaSchwartz": { "113577": ( "Glomerular Filtration Rate Creatinine-based formula (Schwartz)", [10047], ) }, "GlomerularFiltrationRateCystatinBasedFormula": { "113576": ("Glomerular Filtration Rate Cystatin-based formula", [10047]) }, "GlomerularFiltrationRateFemaleMDRD": { "113575": ("Glomerular Filtration Rate female (MDRD)", [10047]) }, "GlomerularFiltrationRateMDRD": { "113572": ("Glomerular Filtration Rate (MDRD)", [10047]) }, "GlomerularFiltrationRateNonBlackMDRD": { "113573": ("Glomerular Filtration Rate non-black (MDRD)", [10047]) }, "GlucoseMeasurementDate": {"127857": ("Glucose Measurement Date", [])}, "GlucoseMeasurementTime": {"127858": ("Glucose Measurement Time", [])}, "GlutamateAndGlutamine": { "113080": ("Glutamate and glutamine", [218, 4032, 4033, 7180, 7186, 7469]) }, "GlutamineC11": {"126709": ("Glutamine C^11^", [4021])}, "GlutamineC14": {"126710": ("Glutamine C^14^", [4021])}, "GlutamineF18": {"126711": ("Glutamine F^18^", [4021])}, "Glycolysis": {"126034": ("Glycolysis", [7466])}, "GoodImageQuality": {"122741": ("Good image quality", [3114])}, "GradientAssessment": {"122123": ("Gradient assessment", [])}, "GradientPressureAverage": {"122197": ("Gradient pressure, average", [3611])}, "GradientPressurePeak": {"122198": ("Gradient pressure, peak", [3611])}, "GradientWeightedClassActivation": { "130403": ("Gradient-weighted class activation", [217, 218, 7180, 7469]) }, "GraftToCitedSegmentDistalSection": { "122104": ("Graft to cited segment, distal section", [3019]) }, "GraftToCitedSegmentMidSection": { "122103": ("Graft to cited segment, mid section", [3019]) }, "GraftToCitedSegmentProximalSection": { "122102": ("Graft to cited segment, proximal section", [3019]) }, "GraftType": {"125102": ("Graft Type", [])}, "GranularPattern": {"112128": ("Granular pattern", [6102, 6106])}, "GraphIncrement": {"122511": ("Graph Increment", [])}, "Graticule": {"130349": ("Graticule", [9548])}, "GrayLevelCoOccurrenceMatrix": {"126067": ("Gray Level Co-occurrence Matrix", [])}, "GrayLevelDistanceZoneMatrix": {"128778": ("Gray Level Distance Zone Matrix", [])}, "GrayLevelNonuniformityInRuns": { "128809": ("Gray Level Nonuniformity in Runs", []) }, "GrayLevelNonuniformityInRunsNormalized": { "128810": ("Gray Level Nonuniformity in Runs Normalized", []) }, "GrayLevelNonuniformityOfZoneCounts": { "128829": ("Gray Level Nonuniformity of Zone Counts", []) }, "GrayLevelNonuniformityOfZoneCountsNormalized": { "128830": ("Gray Level Nonuniformity of Zone Counts Normalized", []) }, "GrayLevelRunLengthMatrix": {"128776": ("Gray Level Run Length Matrix", [])}, "GrayLevelSizeZoneMatrix": {"128777": ("Gray Level Size Zone Matrix", [])}, "GrayLevelVarianceInRuns": {"128814": ("Gray Level Variance in Runs", [])}, "GrayLevelVarianceInZones": {"128834": ("Gray Level Variance in Zones", [])}, "GrayscaleResolutionEvaluation": { "109702": ("Grayscale resolution evaluation", [8300]) }, "GreaterThan1YearAgo": {"111398": ("> 1 year ago", [6164])}, "GreenFilter": {"111601": ("Green filter", [])}, "GridArtifacts": {"111208": ("Grid artifact(s)", [6041, 6135, 7011])}, "GridBScanPattern": {"128288": ("Grid B-scan pattern", [4272])}, "GrossSpecimenImaging": {"112701": ("Gross Specimen Imaging", [])}, "GroundGlassOpacity": {"112120": ("Ground glass opacity", [6102, 6104])}, "GroupOfFramesForDisplay": {"113036": ("Group of Frames for Display", [7010])}, "GrowthPercentileRank": {"125012": ("Growth Percentile Rank", [12017])}, "GrowthZScore": {"125013": ("Growth Z-score", [12017])}, "GuidewireCrossingLesionSuccessful": { "122302": ("Guidewire crossing lesion successful", [3412, 3752]) }, "GuidewireCrossingLesionUnsuccessful": { "122301": ("Guidewire crossing lesion unsuccessful", [3412, 3752]) }, "GynecologicCondition": {"111567": ("Gynecologic condition", [6087, 6088])}, "GynecologicSurgery": {"111568": ("Gynecologic surgery", [6087, 6088])}, "HARDI": {"113221": ("HARDI", [7260])}, "HISBundleWave": {"109040": ("HIS bundle wave", [3339])}, "HabitualVisualAcuity": {"111686": ("Habitual Visual Acuity", [4216])}, "Haigis": {"111760": ("Haigis", [4236])}, "HaigisA0": {"111769": ("Haigis a0", [4237])}, "HaigisA1": {"111770": ("Haigis a1", [4237])}, "HaigisA2": {"111771": ("Haigis a2", [4237])}, "HaigisL": {"111761": ("Haigis-L", [4236])}, "HaigisLToric": {"111861": ("Haigis-L Toric", [4236])}, "HaigisToric": {"111860": ("Haigis Toric", [4236])}, "HalfTimeForTissueRepair": {"130091": ("Half-time for Tissue Repair", [])}, "HalfValueLayer": {"111634": ("Half Value Layer", [10069])}, "HaloSign": {"112073": ("Halo sign", [6102, 6105])}, "HandGrips": {"130854": ("Hand Grips", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "HardCopy": {"HC": ("Hard Copy", [32, 33])}, "HardCopyPrintServer": {"PRINT": ("Hard Copy Print Server", [30])}, "HardWedge": {"130346": ("Hard Wedge", [9546])}, "HardwareConfiguration": {"110130": ("Hardware Configuration", [401, 403])}, "HeadAndNeckImagingSpecialty": { "128008": ("Head and Neck Imaging Specialty", [7449]) }, "HeadAndNeckMask": { "130112": ("Head and Neck Mask", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "HeadFixationBoard": { "130656": ("Head Fixation Board", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "HeadFootAxis": {"110861": ("Head-Foot Axis", [7184])}, "HeadMask": {"130111": ("Head Mask", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "HeadNodeSet": {"130362": ("Head Node Set", [9556])}, "HeadOfCardiology": {"128675": ("Head of Cardiology", [7450, 7452])}, "HeadOfRadiology": {"128670": ("Head of Radiology", [7450, 7452])}, "HeadToFoot": {"110868": ("Head To Foot", [7185])}, "Headframe": {"130110": ("Headframe", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "HeadframePresent": {"130460": ("Headframe Present", [9564])}, "HeartValveFlail": {"127856": ("Heart Valve Flail", [3711])}, "HeatedImagingDevice": {"127251": ("Heated imaging device", [635])}, "HeatedPatientSupport": {"127252": ("Heated patient support", [635])}, "HeatedWaterBlanket": {"127253": ("Heated water blanket", [635])}, "HeatingConditions": {"127040": ("Heating conditions", [])}, "HeelStop": {"130853": ("Heel Stop", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "Height": {"121207": ("Height", [218, 6165, 7469, 7470])}, "HelicalBeam": {"130108": ("Helical Beam", [9512, 9524, 9583])}, "HemangiomaNonparenchymalSubcutaneous": { "111271": ("Hemangioma - nonparenchymal, subcutaneous", []) }, "HemisphericalUltrasoundTransducerGeometry": { "130809": ("Hemispherical ultrasound transducer geometry", [12033]) }, "HemodynamicResistance": {"110825": ("Hemodynamic Resistance", [218, 7180, 7469])}, "HemodynamicResistanceIndex": {"122220": ("Hemodynamic Resistance Index", [3620])}, "HemodynamicWaveform": {"HD": ("Hemodynamic Waveform", [29, 30, 33])}, "HemodynamicsReport": {"122120": ("Hemodynamics Report", [])}, "HemostasisAchieved": {"122033": ("Hemostasis achieved", [3402])}, "HemostasisNotAchievedActivelyBleeding": { "122035": ("Hemostasis not achieved - actively bleeding", [3402]) }, "HemostasisNotAchievedOozing": { "122034": ("Hemostasis not achieved - oozing", [3402]) }, "Hermaphrodite": {"H": ("Hermaphrodite", [7455])}, "HerniatedImplant": {"111509": ("Herniated implant", [6072])}, "HeterogeneousEchotexture": {"111353": ("Heterogeneous echotexture", [6151])}, "Hiatus": {"112095": ("Hiatus", [6102, 6109, 6113, 6148, 7151, 7192, 9514])}, "High": {"111575": ("High", [6090])}, "HighDoseFractionLinearCellKillFactor": { "130090": ("High Dose Fraction Linear Cell Kill Factor", []) }, "HighDoseFractionTransitionDose": { "130092": ("High Dose Fraction Transition Dose", []) }, "HighGrayLevelRunEmphasis": {"128804": ("High Gray Level Run Emphasis", [])}, "HighGrayLevelZoneEmphasis": {"128824": ("High Gray Level Zone Emphasis", [])}, "HighResolution": {"114210": ("High resolution", [8202])}, "HighThresholdEmptyTileSuppression": { "112720": ("High threshold empty tile suppression", [8133]) }, "HighThyroidUptake": {"113562": ("High Thyroid Uptake", [64, 10045])}, "HighlySuggestiveOfMalignancyTakeAppropriateAction": { "111149": ( "Highly suggestive of malignancy - take appropriate action", [6028, 6029], ) }, "HisBundleElectrogram": {"109007": ("His bundle electrogram", [3240])}, "HistogramAnalysis": {"123105": ("Histogram Analysis", [7162])}, "HistologyUsingCoreBiopsy": { "111145": ("Histology using core biopsy", [6028, 6029]) }, "HistoricalRTPrescription": {"130135": ("Historical RT Prescription", [9509])}, "History": {"121060": ("History", [])}, "HistoryOfBenignBreastBiopsy": { "111420": ("History of benign breast biopsy", [6051]) }, "HistoryOfBreastAugmentationAsymptomatic": { "111417": ("History of breast augmentation, asymptomatic", [6051]) }, "HistoryOfEndometrialCancer": { "111551": ("History of endometrial cancer", [6081, 6087]) }, "HistoryOfHighRiskLesionOnPreviousBiopsy": { "111553": ("History of high risk lesion on previous biopsy", [6081, 6087]) }, "HistoryOfMultipleFetuses": { "111572": ("History of multiple fetuses", [6087, 6088]) }, "HistoryOfNonMelanomaSkinCancer": { "130482": ("History of non-melanoma skin cancer", []) }, "HistoryOfOvarianCancer": {"111552": ("History of ovarian cancer", [6081, 6087])}, "HodgesQTCorrectionAlgorithm": { "122731": ("Hodges QT Correction Algorithm", [3678]) }, "HodgesQtcAlgorithm": {"122731": ("Hodges QTc Algorithm", [])}, "HofferPacdConstant": {"111772": ("Hoffer pACD Constant", [4237])}, "HofferQ": {"111764": ("Hoffer Q", [4236])}, "Holladay1": {"111762": ("Holladay 1", [4236])}, "Holladay2": {"111763": ("Holladay 2", [4236])}, "HomogeneityFactor": {"128455": ("Homogeneity Factor", [10069])}, "Homogeneous": {"112160": ("Homogeneous", [6131, 6335, 6343, 6344])}, "HomogeneousFatEchotexture": {"111351": ("Homogeneous fat echotexture", [6151])}, "HomogeneousFibroglandularEchotexture": { "111352": ("Homogeneous fibroglandular echotexture", [6151]) }, "HoneycombPattern": {"112106": ("Honeycomb pattern", [6102, 6103, 6106])}, "HorizontalPixelSpacing": {"111026": ("Horizontal Pixel Spacing", [])}, "HorizontalPrismBase": {"111676": ("Horizontal Prism Base", [])}, "HorizontalPrismPower": {"111675": ("Horizontal Prism Power", [])}, "HousingChangeInterval": {"127151": ("Housing change interval", [])}, "HousingIndividuallyVentilated": { "127170": ("Housing individually ventilated", []) }, "HousingManufacturer": {"127125": ("Housing manufacturer", [])}, "HousingRackProductCode": {"127127": ("Housing rack product code", [])}, "HousingRackProductName": {"127126": ("Housing rack product name", [])}, "HousingRole": {"127110": ("Housing role", [])}, "HousingUnitHeight": {"127161": ("Housing unit height", [])}, "HousingUnitLength": {"127162": ("Housing unit length", [])}, "HousingUnitLidProductCode": {"127131": ("Housing unit lid product code", [])}, "HousingUnitLidProductName": {"127130": ("Housing unit lid product name", [])}, "HousingUnitLocationInRack": {"127142": ("Housing unit location in rack", [])}, "HousingUnitMovement": {"127153": ("Housing unit movement", [])}, "HousingUnitProductCode": {"127129": ("Housing unit product code", [])}, "HousingUnitProductName": {"127128": ("Housing unit product name", [])}, "HousingUnitReuse": {"127175": ("Housing unit reuse", [])}, "HousingUnitWidth": {"127160": ("Housing unit width", [])}, "HumanAlphaSynucleinPreformedFibrils": { "127851": ("Human alpha synuclein preformed fibrils", [638, 640]) }, "HumanTauPreformedFibrils": {"127853": ("Human Tau preformed fibrils", [638, 640])}, "HydrationVolume": {"113551": ("Hydration Volume", [])}, "HyperAcute": {"112159": ("Hyper-acute", [6130])}, "HyperFractionation": {"130099": ("Hyper-fractionation", [9533])}, "Hyperechoic": {"111362": ("Hyperechoic", [6154])}, "HyperemicRatio": {"122219": ("Hyperemic ratio", [3620])}, "HyperplasiaUsual": {"111273": ("Hyperplasia, usual", [])}, "HyperventilationBegin": {"130413": ("Hyperventilation begin", [3038])}, "HyperventilationEnd": {"130414": ("Hyperventilation end", [3038])}, "HypoFractionation": {"130098": ("Hypo-fractionation", [9533])}, "Hypoechoic": {"111364": ("Hypoechoic", [6154])}, "HzAngular": {"130775": ("Hz angular", [3044])}, "HzNormalized": {"130774": ("Hz normalized", [3044])}, "IAUC": {"126320": ("IAUC", [218, 4109, 7180, 7469])}, "IAUC180": {"126323": ("IAUC180", [218, 4109, 7180, 7469])}, "IAUC180BN": {"126327": ("IAUC180BN", [218, 4109, 7180, 7469])}, "IAUC60": {"126321": ("IAUC60", [218, 4109, 7180, 7469])}, "IAUC60BN": {"126325": ("IAUC60BN", [218, 4109, 7180, 7469])}, "IAUC90": {"126322": ("IAUC90", [218, 4109, 7180, 7469])}, "IAUC90BN": {"126326": ("IAUC90BN", [218, 4109, 7180, 7469])}, "IAUCBN": {"126324": ("IAUCBN", [218, 4109, 7180, 7469])}, "IAUCBN60": {"126325": ("IAUCBN60", [])}, "IAUCBN90": {"126326": ("IAUCBN90", [])}, "ICRPPub103": {"113841": ("ICRP Pub 103", [10015])}, "ICRPPub60": {"113808": ("ICRP Pub 60", [10015])}, "ICRPPublication106": {"113523": ("ICRP Publication 106", [10040])}, "ICRPPublication53": {"113521": ("ICRP Publication 53", [10040])}, "ICRPPublication80": {"113522": ("ICRP Publication 80", [10040])}, "IDPlate": {"111174": ("ID Plate", [])}, "IEC61217GantryContinuousPitchAngle": { "126810": ("IEC61217 Gantry Continuous Pitch Angle", [9401, 9402, 9570]) }, "IEC61217GantryContinuousRollAngle": { "126809": ("IEC61217 Gantry Continuous Roll Angle", [9401, 9402, 9570]) }, "IEC61217GantryContinuousYawAngle": { "126811": ("IEC61217 Gantry Continuous Yaw Angle", [9401, 9402, 9570]) }, "IEC61217ImagingSourceToAxisDistance": { "130801": ("IEC61217 Imaging Source to Axis Distance", []) }, "IEC61217PatientSupportContinuousYawAngle": { "126801": ("IEC61217 Patient Support Continuous Yaw Angle", [9401, 9403, 9570]) }, "IEC61217TableTopContinuousEccentricAngle": { "126805": ("IEC61217 Table Top Continuous Eccentric Angle", [9401, 9403, 9570]) }, "IEC61217TableTopContinuousPitchAngle": { "126802": ("IEC61217 Table Top Continuous Pitch Angle", [9401, 9403, 9570]) }, "IEC61217TableTopContinuousRollAngle": { "126803": ("IEC61217 Table Top Continuous Roll Angle", [9401, 9403, 9570]) }, "IEC61217TableTopEccentricAxisDistance": { "126804": ("IEC61217 Table Top Eccentric Axis Distance", [9401, 9403, 9570]) }, "IEC61217TableTopLateralPosition": { "126806": ("IEC61217 Table Top Lateral Position", [9401, 9403, 9570]) }, "IEC61217TableTopLongitudinalPosition": { "126807": ("IEC61217 Table Top Longitudinal Position", [9401, 9403, 9570]) }, "IEC61217TableTopVerticalPosition": { "126808": ("IEC61217 Table Top Vertical Position", [9401, 9403, 9570]) }, "IEC61217XRayImageReceptorLateralDisplacement": { "130804": ("IEC61217 X-Ray Image Receptor Lateral Displacement", []) }, "IEC61217XRayImageReceptorLongitudinalDisplacement": { "130803": ("IEC61217 X-Ray Image Receptor Longitudinal Displacement", []) }, "IEC61217XRayImageReceptorRadialDisplacementFromIsocenter": { "130802": ( "IEC61217 X-Ray Image Receptor Radial Displacement from Isocenter", [], ) }, "IEC61217XRayImageReceptorRotation": { "130805": ("IEC61217 X-Ray Image Receptor Rotation", []) }, "IECBodyDosimetryPhantom": {"113691": ("IEC Body Dosimetry Phantom", [4051, 4052])}, "IECHeadDosimetryPhantom": {"113690": ("IEC Head Dosimetry Phantom", [4051, 4052])}, "IIRFilter": {"130772": ("IIR filter", [3043])}, "ILCR": {"126850": ("ILCR", [7490])}, "IRIGBTimecode": {"109003": ("IRIG-B timecode", [3090])}, "ITV": {"130056": ("ITV", [9534])}, "IVUSReport": {"122325": ("IVUS Report", [])}, "IdentifiableEffectOnSurroundingTissues": { "111371": ("Identifiable effect on surrounding tissues", []) }, "IdentificationOfTheAttenuator": { "130527": ("Identification of the Attenuator", []) }, "IdentificationOfTheXRaySource": { "113832": ("Identification of the X-Ray Source", []) }, "Identifier": {"125010": ("Identifier", [])}, "IdentifierWithinPersonObserverRole": { "128775": ("Identifier within Person Observer's Role", []) }, "IdentifyingSegment": {"112229": ("Identifying Segment", [])}, "IfAgeGreaterThan60YearsP50Equals29Point3": { "122261": ("if (age > 60y) P50 = 29.3", [3666]) }, "IfAgeLesserThan18YearsP50Equals27Point2": { "122259": ("if (age < 18y) P50 = 27.2", [3666]) }, "IfAgeLesserThan1DayP50Equals21Point6": { "122257": ("if (age < 1day) P50 = 21.6", [3666]) }, "IfAgeLesserThan30DayP50Equals24Point6": { "122258": ("if (age < 30day) P50 = 24.6", [3666]) }, "IfAgeLesserThan40YearsP50Equals27Point4": { "122260": ("if (age < 40y) P50 = 27.4", [3666]) }, "IfPremAgeLesserThan3DaysP50Equals19Point9": { "122256": ("if (prem age< 3days) P50 = 19.9", [3666]) }, "Igloo": {"127220": ("Igloo", [606])}, "IlluminationMethod": {"112706": ("Illumination Method", [])}, "IlluminationSpectralBand": {"112711": ("Illumination spectral band", [])}, "IlluminationWavelength": {"112710": ("Illumination wavelength", [])}, "IllustrationOfFinding": {"125201": ("Illustration of Finding", [])}, "IllustrationOfROI": {"121200": ("Illustration of ROI", [7003])}, "ImageAcquired": {"121138": ("Image Acquired", [])}, "ImageAcquiredDuringTreatment": { "129203": ("Image Acquired during Treatment", [7201]) }, "ImageArtifacts": {"111207": ("Image artifact(s)", [7011])}, "ImageCapture": {"CAPTURE": ("Image Capture", [30])}, "ImageContentAndFiducialBasedAlignment": { "125026": ("Image Content and Fiducial Based Alignment", [7100]) }, "ImageContentBasedAlignment": {"125024": ("Image Content-based Alignment", [7100])}, "ImageDetectedMass": {"111126": ("Image detected mass", [6055])}, "ImageDetector": {"130351": ("Image Detector", [9548])}, "ImageFrame": {"130781": ("Image frame", [272])}, "ImageInterval": {"122640": ("Image Interval", [])}, "ImageLaterality": {"111027": ("Image Laterality", [])}, "ImageLibrary": {"111028": ("Image Library", [])}, "ImageLibraryGroup": {"126200": ("Image Library Group", [])}, "ImageOrientationPatientColumnX": { "110907": ("Image Orientation (Patient) Column X", []) }, "ImageOrientationPatientColumnY": { "110908": ("Image Orientation (Patient) Column Y", []) }, "ImageOrientationPatientColumnZ": { "110909": ("Image Orientation (Patient) Column Z", []) }, "ImageOrientationPatientRowX": { "110904": ("Image Orientation (Patient) Row X", []) }, "ImageOrientationPatientRowY": { "110905": ("Image Orientation (Patient) Row Y", []) }, "ImageOrientationPatientRowZ": { "110906": ("Image Orientation (Patient) Row Z", []) }, "ImagePositionPatientX": {"110901": ("Image Position (Patient) X", [])}, "ImagePositionPatientY": {"110902": ("Image Position (Patient) Y", [])}, "ImagePositionPatientZ": {"110903": ("Image Position (Patient) Z", [])}, "ImageProcessing": {"110001": ("Image Processing", [9231])}, "ImageQuality": {"111101": ("Image Quality", [6014, 6016, 6054, 6101, 6201])}, "ImageQualityController": {"129003": ("Image Quality Controller", [7453])}, "ImageQualityRating": {"111029": ("Image Quality Rating", [])}, "ImageRegion": {"111030": ("Image Region", [])}, "ImageSetProperties": {"112224": ("Image Set Properties", [])}, "ImageSetQualityRating": {"111694": ("Image Set Quality Rating", [])}, "ImageSpecificity": {"111091": ("Image Specificity", [6048])}, "ImageStitching": {"113090": ("Image stitching", [7203])}, "ImageType": {"121141": ("Image Type", [])}, "ImageUsedAsReferenceImageForTreatment": { "129204": ("Image used as Reference Image for Treatment", [7201]) }, "ImageUsedForDoseCalculation": { "129202": ("Image used for Dose Calculation", [7201]) }, "ImageUsedForTreatmentPlanning": { "129201": ("Image used for Treatment Planning", [7201]) }, "ImageView": {"111031": ("Image View", [])}, "ImageViewModifier": {"111032": ("Image View Modifier", [])}, "ImagedContainerLabel": {"121354": ("Imaged container label", [8120])}, "ImagesRelatedToStandaloneObject": { "121316": ("Images related to standalone object", [7201]) }, "Imagify": {"125903": ("Imagify", [12030])}, "ImagingAgentAdministrationActivity": { "130237": ("Imaging Agent Administration Activity", []) }, "ImagingAgentAdministrationAdverseEvents": { "130212": ("Imaging Agent Administration Adverse Events", []) }, "ImagingAgentAdministrationCompletionStatus": { "130211": ("Imaging Agent Administration Completion Status", []) }, "ImagingAgentAdministrationConsumable": { "130222": ("Imaging Agent Administration Consumable", []) }, "ImagingAgentAdministrationConsumableType": { "130223": ("Imaging Agent Administration Consumable Type", []) }, "ImagingAgentAdministrationDelay": { "130197": ("Imaging Agent Administration Delay", []) }, "ImagingAgentAdministrationGraph": { "130232": ("Imaging Agent Administration Graph", []) }, "ImagingAgentAdministrationInjectorEventType": { "130234": ("Imaging Agent Administration Injector Event Type", []) }, "ImagingAgentAdministrationInjectorEvents": { "130233": ("Imaging Agent Administration Injector Events", []) }, "ImagingAgentAdministrationInjectorPhaseIdentifier": { "130264": ("Imaging Agent Administration Injector Phase Identifier", []) }, "ImagingAgentAdministrationPerformedPhaseUID": { "130261": ("Imaging Agent Administration Performed Phase UID", []) }, "ImagingAgentAdministrationPerformedStepUID": { "130246": ("Imaging Agent Administration Performed Step UID", []) }, "ImagingAgentAdministrationPhase": { "130202": ("Imaging Agent Administration Phase", []) }, "ImagingAgentAdministrationPhaseIdentifier": { "130203": ("Imaging Agent Administration Phase Identifier", []) }, "ImagingAgentAdministrationPhaseType": { "130204": ("Imaging Agent Administration Phase Type", []) }, "ImagingAgentAdministrationPhaseWithManualHold": { "130265": ("Imaging Agent Administration Phase with Manual Hold", []) }, "ImagingAgentAdministrationProtocolName": { "130200": ("Imaging Agent Administration Protocol Name", []) }, "ImagingAgentAdministrationStep": { "130195": ("Imaging Agent Administration Step", []) }, "ImagingAgentAdministrationStepIdentifier": { "130196": ("Imaging Agent Administration Step Identifier", []) }, "ImagingAgentAdministrationStepSequenceNumber": { "130445": ("Imaging Agent Administration Step Sequence Number", []) }, "ImagingAgentAdministrationSteps": { "130192": ("Imaging Agent Administration Steps", []) }, "ImagingAgentAdministrationStepsDescription": { "130199": ("Imaging Agent Administration Steps Description", []) }, "ImagingAgentComponent": {"130238": ("Imaging Agent Component", [])}, "ImagingAgentComponentUsage": {"130191": ("Imaging Agent Component Usage", [])}, "ImagingAgentIdentifier": {"130254": ("Imaging Agent Identifier", [])}, "ImagingAgentInformation": {"130183": ("Imaging Agent Information", [])}, "ImagingAgentVolumePerUnitOfPresentation": { "130221": ("Imaging Agent Volume per Unit of Presentation", []) }, "ImagingAgentWarmed": {"130187": ("Imaging Agent Warmed", [])}, "ImagingConditions": {"123016": ("Imaging Conditions", [])}, "ImagingDirection": {"123015": ("Imaging Direction", [])}, "ImagingMeasurementReport": {"126000": ("Imaging Measurement Report", [7021])}, "ImagingMeasurements": {"126010": ("Imaging Measurements", [])}, "ImagingProcedureRoom": {"127372": ("Imaging procedure room", [603])}, "ImagingSeriesQuality": {"130550": ("Imaging Series Quality", [])}, "ImagingStartDatetime": {"122712": ("Imaging Start DateTime", [])}, "ImagingStudyQuality": {"130549": ("Imaging Study Quality", [])}, "ImpairedRenalFunction": {"128144": ("Impaired Renal Function", [])}, "ImplantAssemblyTemplate": {"112366": ("Implant Assembly Template", [])}, "ImplantComponentList": {"112360": ("Implant Component List", [])}, "ImplantFabrication": {"129016": ("Implant Fabrication", [7064])}, "ImplantFinding": {"111407": ("Implant finding", [])}, "ImplantTemplate": {"112348": ("Implant Template", [])}, "ImplantType": {"111405": ("Implant type", [])}, "ImplantationPatientPositioning": { "112368": ("Implantation Patient Positioning", []) }, "ImplantationPlan": {"112345": ("Implantation Plan", [])}, "Import": {"110107": ("Import", [400])}, "Impression": {"121073": ("Impression", [3419, 6053, 7002])}, "ImpressionDescription": {"111033": ("Impression Description", [])}, "Impressions": {"121072": ("Impressions", [])}, "InDetectorPlane": {"113941": ("In Detector Plane", [10025])}, "InHomeCage": {"127101": ("In home cage", [634])}, "InStentNeointima": {"122357": ("In-Stent Neointima", [3491])}, "InStentNeointimalCrossSectionalArea": { "122335": ("In-Stent Neointimal Cross-Sectional Area", [3482]) }, "InStentNeointimalVolume": {"122374": ("In-Stent Neointimal Volume", [3485])}, "InadequateCompression": {"111196": ("Inadequate compression", [6041])}, "InadequateContrastEnhancement": { "130580": ("Inadequate contrast enhancement", [6315, 6317]) }, "InappropriateForTheDevice": {"128618": ("Inappropriate for the device", [800])}, "InappropriateForTheIndications": { "128621": ("Inappropriate for the indications", [800]) }, "InappropriateImageProcessing": { "111219": ("Inappropriate image processing", [6041, 6135, 7011]) }, "InappropriatePatientOrientation": { "130461": ("Inappropriate Patient Orientation", [9565]) }, "InappropriatePatientPosition": { "130462": ("Inappropriate Patient Position", [9565]) }, "IncisionMade": {"111440": ("Incision made", [])}, "IncompleteStudy": {"130574": ("Incomplete study", [6314])}, "InconsistentWithLabelingOfTheDevice": { "128622": ("Inconsistent with labeling of the device", [800]) }, "IncorrectModalityWorklistEntry": { "113038": ("Incorrect Modality Worklist Entry", [7010, 7031]) }, "IncorrectProcedureOrdered": { "110502": ("Incorrect procedure ordered", [9300, 9301, 9303]) }, "IncorrectSideOrdered": {"110512": ("Incorrect side ordered", [9300, 9301])}, "IncorrectWorklistEntrySelected": { "110514": ("Incorrect worklist entry selected", [9300, 9301, 9302]) }, "IncrementalAcquisitionTriggering": { "130796": ("Incremental Acquisition Triggering", []) }, "IndependentRadiationShield": { "130641": ("Independent radiation shield", [9572, 9573]) }, "Index": {"121425": ("Index", [])}, "Indexed": {"125313": ("Indexed", [12303])}, "IndexedHemodynamicResistance": { "110826": ("Indexed Hemodynamic Resistance", [218, 7180, 7469]) }, "IndicatedProblem": {"111533": ("Indicated Problem", [])}, "IndicationsForPharmacologicalStress": { "122700": ("Indications for Pharmacological Stress", []) }, "IndicationsForProcedure": {"121109": ("Indications for Procedure", [])}, "IndicatorAppearanceTime": {"122192": ("Indicator appearance time", [])}, "IndicatorMeanTransitTime": { "109071": ( "Indicator mean transit time", [ 3337, 3613, 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "IndirectDetector": {"113949": ("Indirect Detector", [10030])}, "IndividualCalcification": {"111104": ("Individual Calcification", [])}, "IndividualImpressionRecommendation": { "111034": ("Individual Impression/\u200bRecommendation", []) }, "IndividualImpressionRecommendationAnalysis": { "111233": ("Individual Impression/\u200bRecommendation Analysis", [6043]) }, "IneligibleForReimbursement": {"128615": ("Ineligible for reimbursement", [800])}, "InferiorToAnterior": {"110875": ("Inferior To Anterior", [7185])}, "InferolateralToSuperomedial": { "111432": ("Inferolateral to superomedial", [6065]) }, "InferomedialToSuperolateral": { "111433": ("Inferomedial to superolateral", [6065]) }, "Infiltrate": {"112121": ("Infiltrate", [6102, 6104])}, "InflatableEndorectalCoilFillSubstance": { "130545": ("Inflatable endorectal coil fill substance", []) }, "InflowAngle": {"122546": ("Inflow Angle", [])}, "InformationTechnology": {"128173": ("Information Technology", [7030])}, "InformationUsedForPlanning": {"112358": ("Information used for planning", [])}, "InfraredFilter": {"111606": ("Infrared filter", [])}, "InfraredMarker": {"130645": ("Infrared Marker", [9573, 9575])}, "InfraredReflectorMarker": {"129309": ("Infrared Reflector Marker", [7111, 7112])}, "InfusateEnd": {"122088": ("Infusate end", [3409])}, "InfusateStart": {"122087": ("Infusate start", [3409])}, "InfusionSystem": {"113542": ("Infusion System", [10041])}, "Inhomogeneous": {"112161": ("Inhomogeneous", [6131])}, "InitialVolumeOfImagingAgentInContainer": { "130205": ("Initial Volume of Imaging Agent in Container", []) }, "InjectateTemperature": {"122320": ("Injectate Temperature", [])}, "InjectateVolume": {"122321": ("Injectate Volume", [])}, "InjectorEventDetectionDatetime": { "130235": ("Injector Event Detection DateTime", []) }, "InnerLimitsOfFuzzyMargin": {"113662": ("Inner limits of fuzzy margin", [6166])}, "InsideOperationalLimitsOfTheDevice": { "128607": ("Inside operational limits of the device", [800]) }, "InstanceNumber": {"113609": ("Instance Number", [10022])}, "InstancesImported": {"110028": ("Instances Imported", [7008])}, "InstitutionallyApprovedEstimates": { "113529": ("Institutionally Approved Estimates", [10040]) }, "InstitutionallyDefinedQualityControlStandard": { "111240": ( "Institutionally defined quality control standard", [6045, 6136, 6208, 6326, 6353], ) }, "InstrumentApproach": {"111431": ("Instrument Approach", [])}, "InsufficientImplantDisplacementIncorrect": { "111206": ("Insufficient implant displacement incorrect", [6041]) }, "InsufficientQualityForInterpretation": { "110531": ("Insufficient quality for interpretation", [9303]) }, "IntegratedProjectionRadiographySystem": { "113958": ("Integrated Projection Radiography System", [10032]) }, "IntegrationOfSumOfClosedAreasOnContiguousSlicesMethodForVolume": { "122503": ( "Integration of sum of closed areas on contiguous slices method for volume", [7474], ) }, "InterHemisphericPlane": {"125030": ("Inter-Hemispheric Plane", [7101, 7111])}, "InterMarkerDistance": {"121208": ("Inter-Marker Distance", [3423])}, "Interface": {"112082": ("Interface", [6102, 6109, 7151, 7196])}, "InterferingTearsOrDrops": {"111695": ("Interfering Tears or Drops", [4222])}, "InterferometricTransducer": {"130817": ("Interferometric Transducer", [11003])}, "Interferometry": {"114202": ("Interferometry", [8201])}, "InterferometryBasedCornealTomographer": { "111947": ("Interferometry-based corneal tomographer", [4210]) }, "InterlockOverridden": {"130454": ("Interlock Overridden", [9563])}, "InterlockResolved": {"130744": ("Interlock Resolved", [9563])}, "IntermediateFamilyHistoryOfBreastCancer": { "111560": ("Intermediate family history of breast cancer", [6081, 6087]) }, "IntermediateLevel": {"128726": ("Intermediate level", [7016])}, "Intern": {"121085": ("Intern", [])}, "InternationalProgressiveDogBreedersAlliance": { "109214": ("International Progressive Dog Breeders' Alliance", [7481]) }, "InterpolatedLocalReference": {"122490": ("Interpolated Local Reference", [3465])}, "Interpretation": {"110005": ("Interpretation", [9231])}, "InterpretationRequiresSpecialistExpertise": { "110532": ("Interpretation requires specialist expertise", [9303]) }, "InterquartileRangeOfPopulation": { "130614": ("Interquartile Range of population", [221, 226, 7465]) }, "InterquartileRangeToMedianRatioOfPopulation": { "130615": ( "Interquartile Range to Median ratio of population", [221, 226, 7465], ) }, "InterstitialIllumination": {"130814": ("Interstitial illumination", [11001])}, "InterventionAction": {"122090": ("Intervention Action", [])}, "InterventionAttemptIdentifier": { "121154": ("Intervention attempt identifier", []) }, "InterventionPerformed": {"122312": ("Intervention performed", [3412])}, "InterventionalDevicePlaced": {"122311": ("Interventional device placed", [3412])}, "InterventionalDevicePlacementUnsuccessful": { "122310": ("Interventional device placement unsuccessful", [3412]) }, "InterventionalDeviceWithdrawn": { "122313": ("Interventional device withdrawn", [3412]) }, "IntimalDissection": {"122398": ("Intimal Dissection", [3492])}, "IntraOralRadiography": {"IO": ("Intra-oral Radiography", [29, 30, 33])}, "IntraStentDissection": {"122388": ("Intra-stent Dissection", [3492])}, "IntracysticLesion": {"111461": ("Intracystic lesion", [6054, 6064])}, "IntracysticPapillaryCarcinoma": { "111315": ("Intracystic papillary carcinoma", [6030, 6033]) }, "IntracysticPapilloma": {"111257": ("Intracystic papilloma", [])}, "IntraductalCarcinomaHighGrade": { "111341": ("Intraductal carcinoma, high grade", [6030, 6033]) }, "IntraductalCarcinomaLowGrade": { "111313": ("Intraductal carcinoma, low grade", [6030, 6033]) }, "IntraductalCarcinomaMicroPapillary": { "111314": ("Intraductal carcinoma micro-papillary", []) }, "IntraductalComedocarcinomaWithNecrosis": { "111312": ("Intraductal comedocarcinoma with necrosis", [6030, 6033]) }, "IntralobularLines": {"112108": ("Intralobular lines", [6102, 6103])}, "IntraluminalFillingDefect": { "111425": ("Intraluminal filling defect", [6054, 6057]) }, "IntraocularLensCalculation": {"IOL": ("Intraocular Lens Calculation", [32, 33])}, "IntraoperativeFixedAperture": { "130345": ("Intraoperative Fixed Aperture", [9541, 9545]) }, "IntraoperativeTransducer": {"125267": ("Intraoperative Transducer", [12035])}, "IntravascularOpticalCoherenceTomography": { "IVOCT": ("Intravascular Optical Coherence Tomography", [29, 30, 33]) }, "IntravascularTransducer": {"125265": ("Intravascular Transducer", [12035])}, "IntravascularUltrasound": {"IVUS": ("Intravascular Ultrasound", [29, 30, 33])}, "IntravenousExtravasationSymptoms": { "113505": ("Intravenous Extravasation Symptoms", []) }, "InvasiveAndInSituCarcinoma": { "111316": ("Invasive and in-situ carcinoma", [6030, 6033]) }, "InvasiveBreastCarcinoma": {"111389": ("Invasive breast carcinoma", [6159])}, "InvasiveCribriformCarcinoma": {"111342": ("Invasive cribriform carcinoma", [])}, "InvasiveLobularCarcinoma": {"111317": ("Invasive lobular carcinoma", [])}, "InverseDifferenceMomentNormalizedOfGLCM": { "128792": ("Inverse Difference Moment Normalized of GLCM", []) }, "InverseDifferenceMomentOfGLCM": { "126062": ("Inverse Difference Moment of GLCM", []) }, "InverseDifferenceNormalizedOfGLCM": { "128791": ("Inverse Difference Normalized of GLCM", []) }, "InverseDifferenceOfGLCM": {"128790": ("Inverse Difference of GLCM", [])}, "InverseVarianceOfGLCM": {"128793": ("Inverse Variance of GLCM", [])}, "InvestigationalNewDrug": {"113530": ("Investigational New Drug", [10040])}, "Involved": {"111471": ("Involved", [])}, "IodinatedI125DPA713": {"126764": ("Iodinated I^125^ DPA-713", [25])}, "IonChamber": {"128707": ("Ion Chamber", [7026, 7027, 7151, 7193])}, "IonChamberArray": {"128703": ("Ion Chamber Array", [7026, 7027, 7151, 7193])}, "IonTherapyParticle": {"130037": ("Ion Therapy Particle", [])}, "IrradiatingDevice": {"113859": ("Irradiating Device", [7445])}, "IrradiationAdministering": {"113851": ("Irradiation Administering", [7453])}, "IrradiationAuthorizing": {"113850": ("Irradiation Authorizing", [7453])}, "IrradiationDetails": {"130505": ("Irradiation Details", [])}, "IrradiationDuration": {"113742": ("Irradiation Duration", [])}, "IrradiationEvent": {"113852": ("Irradiation Event", [10000])}, "IrradiationEventLabel": {"113605": ("Irradiation Event Label", [])}, "IrradiationEventSummaryData": {"130501": ("Irradiation Event Summary Data", [])}, "IrradiationEventType": {"113721": ("Irradiation Event Type", [])}, "IrradiationEventUID": {"113769": ("Irradiation Event UID", [10001])}, "IrradiationEventUID_Retired": {"113853": ("Irradiation Event UID", [])}, "IrradiationEventXRayData": {"113706": ("Irradiation Event X-Ray Data", [])}, "IsIonic": {"130189": ("Is Ionic", [])}, "IsRejectedAcquisition": {"130503": ("Is Rejected Acquisition", [])}, "IsRepeatedAcquisition": {"128551": ("Is Repeated Acquisition", [])}, "IsocenterOrigin": {"130539": ("Isocenter Origin", [10074])}, "IsocentricPatientSupportContinuousPitchAngle": { "126812": ("Isocentric Patient Support Continuous Pitch Angle", [9569, 9570]) }, "IsocentricPatientSupportContinuousRollAngle": { "126813": ("Isocentric Patient Support Continuous Roll Angle", [9569, 9570]) }, "IsocentricPatientSupportContinuousYawAngle": { "126814": ("Isocentric Patient Support Continuous Yaw Angle", [9569, 9570]) }, "IsocentricPatientSupportLateralPosition": { "126815": ("Isocentric Patient Support Lateral Position", [9569, 9570]) }, "IsocentricPatientSupportLongitudinalPosition": { "126816": ("Isocentric Patient Support Longitudinal Position", [9569, 9570]) }, "IsocentricPatientSupportVerticalPosition": { "126817": ("Isocentric Patient Support Vertical Position", [9569, 9570]) }, "IsocentricSetupMethod": {"130630": ("Isocentric Setup Method", [9571])}, "IsocentricTreatmentLocationPoint": { "130073": ("Isocentric Treatment Location Point", [9504, 9553, 9574]) }, "Isodose": {"128484": ("Isodose", [10063])}, "IsodoseVolume": {"130747": ("Isodose Volume", [9582])}, "Isoechoic": {"111365": ("Isoechoic", [6154])}, "IssuerOfIdentifier": {"110190": ("Issuer of Identifier", [])}, "IssuerOfParentSpecimenIdentifier": { "111706": ("Issuer of Parent Specimen Identifier", []) }, "IssuerOfSpecimenIdentifier": {"111724": ("Issuer of Specimen Identifier", [])}, "IterativeClosestPoint": {"114213": ("Iterative Closest Point", [8203])}, "IterativeReconstruction": {"113963": ("Iterative Reconstruction", [10033])}, "J59189Zr": {"126514": ("J591 ^89^Zr", [4021])}, "JWire": {"111170": ("J Wire", [])}, "JawPair": {"130330": ("Jaw Pair", [9540, 9541])}, "JawPositionToleranceViolation": { "130471": ("Jaw Position Tolerance Violation", [9567]) }, "JointAverageOfGLCM": {"128782": ("Joint Average of GLCM", [])}, "JointEntropyOfGLCM": {"126060": ("Joint Entropy of GLCM", [])}, "JointMaximumOfGLCM": {"128781": ("Joint Maximum of GLCM", [])}, "JointPositionMethod": {"109132": ("Joint position method", [])}, "JointVarianceOfGLCM": {"128783": ("Joint Variance of GLCM", [])}, "JuvenilePapillomatosis": {"111277": ("Juvenile papillomatosis", [6030, 6031])}, "KTypeFilter": {"130765": ("K-type filter", [3042])}, "KVP": {"113733": ("KVP", [])}, "KeepVeinOpenEnded": {"130162": ("Keep vein open ended", [71])}, "KeepVeinOpenStarted": {"130161": ("Keep vein open started", [71])}, "Kep": {"126313": ("kep", [218, 4107, 7180, 7469])}, "Keratometry": {"KER": ("Keratometry", [29, 30, 33])}, "KeratometryMeasurementsSOPInstance": { "111757": ("Keratometry Measurements SOP Instance", [4240]) }, "KerleyALine": {"112109": ("Kerley A line", [6102, 6103])}, "KerleyBLine": {"112110": ("Kerley B line", [6102, 6103])}, "KerleyCLines": {"112111": ("Kerley C lines", [6102, 6103])}, "KeyImages": {"121180": ("Key Images", [])}, "KeyObjectDescription": {"113012": ("Key Object Description", [])}, "KeyObjectSelection": {"KO": ("Key Object Selection", [32, 33])}, "KidneyStent": { "112175": ("Kidney stent", [6102, 6138, 6202, 6203, 6404, 7151, 7193]) }, "KnownBiopsyProvenMalignancy": { "111125": ("Known biopsy proven malignancy", [6051]) }, "KnownBiopsyProvenMalignancyTakeAppropriateAction": { "111122": ( "Known biopsy proven malignancy - take appropriate action", [6028, 6029], ) }, "Ktrans": {"126312": ("Ktrans", [218, 4107, 7180, 7469])}, "Kurtosis": {"126052": ("Kurtosis", [7464])}, "KurtosisDiffusionCoefficient": { "113294": ("Kurtosis Diffusion Coefficient", [218, 7180, 7272, 7469]) }, "KurtosisDiffusionModel": {"113252": ("Kurtosis diffusion model", [7273])}, "LADRegionInLAOProjection": {"122470": ("LAD Region in LAO Projection", [3461])}, "LADRegionInRAOProjection": {"122464": ("LAD Region in RAO Projection", [3460])}, "LBWOrIUGR": {"111593": ("LBW or IUGR", [])}, "LDLCholesterolScoreSheetForMen": { "122233": ("LDL Cholesterol Score Sheet for Men", [3668]) }, "LDLCholesterolScoreSheetForWomen": { "122234": ("LDL Cholesterol Score Sheet for Women", [3668]) }, "LSDI": {"113225": ("LSDI", [7260])}, "LVEndSystolicGLS2CHEndocardial": { "130688": ("LV End-systolic GLS 2CH (Endocardial)", [12300, 12309]) }, "LVEndSystolicGLS4CHEndocardial": { "130687": ("LV End-systolic GLS 4CH (Endocardial)", [12300, 12309]) }, "LVEndSystolicGLSALAXEndocardial": { "130689": ("LV End-systolic GLS ALAX (Endocardial)", [12300, 12309]) }, "LVEndSystolicGLSMultiviewMeanEndocardial": { "130686": ("LV End-systolic GLS Multiview Mean (Endocardial)", [12300, 12309]) }, "LVEndSystolicMechanicalDispersion": { "130698": ("LV End-systolic Mechanical Dispersion", [12300, 12309]) }, "LVPeakGLS2CHEndocardial": { "130696": ("LV Peak GLS 2CH (Endocardial)", [12300, 12309]) }, "LVPeakGLS4CHEndocardial": { "130695": ("LV Peak GLS 4CH (Endocardial)", [12300, 12309]) }, "LVPeakGLSALAXEndocardial": { "130697": ("LV Peak GLS ALAX (Endocardial)", [12300, 12309]) }, "LVPeakGLSMultiviewMeanEndocardial": { "130694": ("LV Peak GLS Multiview Mean (Endocardial)", [12300, 12309]) }, "LVPeakSystolicGLS2CHEndocardial": { "130692": ("LV Peak Systolic GLS 2CH (Endocardial)", [12300, 12309]) }, "LVPeakSystolicGLS4CHEndocardial": { "130691": ("LV Peak Systolic GLS 4CH (Endocardial)", [12300, 12309]) }, "LVPeakSystolicGLSALAXEndocardial": { "130693": ("LV Peak Systolic GLS ALAX (Endocardial)", [12300, 12309]) }, "LVPeakSystolicGLSMultiviewMeanEndocardial": { "130690": ("LV Peak Systolic GLS Multiview Mean (Endocardial)", [12300, 12309]) }, "LVWallMotionScoreIndex": {"125202": ("LV Wall Motion Score Index", [])}, "LWHMethodForVolumeOfEllipsoid": { "126029": ("LWH method for volume of ellipsoid", [7474]) }, "LabelType": {"113606": ("Label Type", [])}, "LactatingAdenoma": {"111278": ("Lactating adenoma", [])}, "LactationalChange": {"111279": ("Lactational change", [6030, 6031])}, "LandmarkBasedWallMotionAnalysis": { "122497": ("Landmark Based Wall Motion Analysis", []) }, "Language": {"121045": ("Language", [])}, "LanguageOfContentItemAndDescendants": { "121049": ("Language of Content Item and Descendants", []) }, "LanguageOfNameAndValue": {"121048": ("Language of Name and Value", [])}, "LanguageOfValue": {"121047": ("Language of Value", [])}, "Laparoscopy": {"LP": ("Laparoscopy", [])}, "LargeDuctPapilloma": {"111281": ("Large duct papilloma", [6030, 6031])}, "LargeGreaterThan38Point0cmLateralThickness": { "113603": ("Large: > 38.0 cm lateral thickness", [7041, 7042]) }, "LargeZoneEmphasis": {"128822": ("Large Zone Emphasis", [])}, "LargeZoneHighGrayLevelEmphasis": { "128828": ("Large Zone High Gray Level Emphasis", []) }, "LargeZoneLowGrayLevelEmphasis": { "128827": ("Large Zone Low Gray Level Emphasis", []) }, "LaserCrossHairs": {"128151": ("Laser Cross-hairs", [1015, 9573, 9575])}, "LaserScan": {"LS": ("Laser Scan", [29, 30, 33])}, "LaserScanning": {"114203": ("Laser scanning", [8201])}, "LaserScanning3DCAMModel": {"129021": ("Laser Scanning 3D CAM model", [7061])}, "LaserSurfaceScan": {"LS": ("Laser Surface Scan", [9573, 9575])}, "LastChordOfAbnormalRegion": {"122453": ("Last Chord of Abnormal Region", [])}, "LateChildBearingAfter30": { "111555": ("Late child bearing (after 30)", [6081, 6087]) }, "LateContrastEnhancement": { "122664": ("Late Contrast Enhancement", [6335, 6345, 6346]) }, "LeadID": {"122148": ("Lead ID", [])}, "LeadRadiologicTechnologist": { "128674": ("Lead Radiologic Technologist", [7450, 7452, 9536]) }, "LeafPairs": {"130331": ("Leaf Pairs", [9540, 9541])}, "LeastMeanSquareLMSDeconvolution": { "126310": ("Least Mean Square (LMS) deconvolution", [4105, 4106]) }, "LeastSquaresFitOfMultipleSamples": { "113261": ("Least squares fit of multiple samples", [7274]) }, "LeftAtrialEDVolume": {"122407": ("Left Atrial ED Volume", [3468, 3835])}, "LeftAtrialESVolume": {"122408": ("Left Atrial ES Volume", [3469, 3835])}, "LeftAtrialEjectionFractionByAngiography": { "122406": ("Left Atrial Ejection Fraction by Angiography", [3467]) }, "LeftContour": {"122507": ("Left Contour", [])}, "LeftEyeRx": {"111689": ("Left Eye Rx", [])}, "LeftFirst": {"126830": ("left first", [21])}, "LeftHemisphereMostAnterior": { "125035": ("Left Hemisphere Most Anterior", [7101, 7111]) }, "LeftHemisphereMostInferior": { "125038": ("Left Hemisphere Most Inferior", [7101, 7111]) }, "LeftHemisphereMostPosterior": { "125036": ("Left Hemisphere Most Posterior", [7101, 7111]) }, "LeftHemisphereMostSuperior": { "125037": ("Left Hemisphere Most Superior", [7101, 7111]) }, "LeftRightAxis": {"110860": ("Left-Right Axis", [7184])}, "LeftToRight": {"110867": ("Left To Right", [7185])}, "LeftToRightFlow": {"122227": ("Left to Right Flow", [])}, "LeftVentricleApicalAnterolateralSegment": { "130623": ("left ventricle apical anterolateral segment", [3781, 3785, 12305]) }, "LeftVentricleApicalAnteroseptalSegment": { "130620": ("left ventricle apical anteroseptal segment", [3781, 3785, 12305]) }, "LeftVentricleApicalInferolateralSegment": { "130622": ("left ventricle apical inferolateral segment", [3781, 3785, 12305]) }, "LeftVentricleApicalInferoseptalSegment": { "130621": ("left ventricle apical inferoseptal segment", [3781, 3785, 12305]) }, "LeftVentricleMassByAreaLength": { "125270": ("Left Ventricle Mass by Area Length", [12227, 12232]) }, "LeftVentricleMassByAreaLengthAdjustedByHeight": { "125273": ( "Left Ventricle Mass by Area Length - adjusted by Height", [12227, 12232], ) }, "LeftVentricleMassByMMode": { "125221": ("Left Ventricle Mass by M-mode", [12227, 12232]) }, "LeftVentricleMassByMModeAdjustedByHeight": { "125271": ("Left Ventricle Mass by M-mode - adjusted by Height", [12227, 12232]) }, "LeftVentricleMassByTruncatedEllipse": { "125222": ("Left Ventricle Mass by Truncated Ellipse", [12227, 12232]) }, "LeftVentricleMassByTruncatedEllipseAdjustedByHeight": { "125272": ( "Left Ventricle Mass by Truncated Ellipse - adjusted by Height", [12227, 12232], ) }, "LeftVentricularEjectionTime": { "122211": ("Left Ventricular ejection time", [3613]) }, "LeftVentricularFillingTime": {"122212": ("Left Ventricular filling time", [3613])}, "LeftVentricularPosterobasalSegment": { "122582": ("Left ventricular posterobasal segment", []) }, "LengthLuminalSegment": {"122510": ("Length Luminal Segment", [])}, "LengthOfReconstructableVolume": { "113893": ("Length of Reconstructable Volume", []) }, "Lensometry": {"LEN": ("Lensometry", [29, 30, 33])}, "LesionBoundary": {"111357": ("Lesion boundary", [])}, "LesionCapsularContactLength": { "130558": ("Lesion capsular contact length", [6351]) }, "LesionCentered": {"111902": ("Lesion centered", [4207])}, "LesionCompletelyRemoved": {"111447": ("Lesion completely removed", [6066])}, "LesionDensity": {"111035": ("Lesion Density", [])}, "LesionIdentifier": {"121151": ("Lesion Identifier", [])}, "LesionInterventionInformation": { "122178": ("Lesion Intervention Information", []) }, "LesionMorphology": {"122133": ("Lesion Morphology", [])}, "LesionPartiallyRemoved": {"111448": ("Lesion partially removed", [6066])}, "LesionRisk": {"121153": ("Lesion Risk", [])}, "LesionSensitivity": {"111089": ("Lesion Sensitivity", [6048])}, "LesionToBackgroundSUVRatio": { "126039": ("Lesion to Background SUV Ratio", [7466]) }, "LesserThan3MonthsAgo": {"111396": ("< 3 months ago", [6164])}, "LeukemicInfiltration": {"111318": ("Leukemic infiltration", [6030, 6033])}, "LevelOfDifficulty": {"128724": ("Level of Difficulty", [])}, "LevelOfSignificance": {"121403": ("Level of Significance", [])}, "LevenbergMarquardt": {"113265": ("Levenberg-Marquardt", [7274])}, "Levovist": {"125904": ("Levovist", [12030])}, "LightBrownColor": {"111450": ("Light brown color", [6067])}, "LightsOnTimeOfDay": {"127215": ("Lights on time of day", [])}, "Line": {"112083": ("Line", [6102, 6109, 7151, 7196])}, "LineBScanPattern": {"128281": ("Line B-scan pattern", [4272])}, "LineNoiseArtifact": {"130886": ("Line noise artifact", [3035])}, "LineScanPattern": {"125240": ("Line scan pattern", [12032])}, "LineSegmentLength": {"121227": ("Line segment length", [218, 6165, 7469, 7470])}, "Linear": {"112150": ("Linear", [6123, 6335, 6339, 6340])}, "LinearCellKillFactor": {"130088": ("Linear Cell Kill Factor", [])}, "LinearCurve": {"130253": ("Linear Curve", [73])}, "LinearDisplacement": {"110856": ("Linear Displacement", [7182])}, "LinearQuadraticLinearModel": {"130133": ("Linear-Quadratic-Linear Model", [9539])}, "LinearQuadraticModel": {"130131": ("Linear-Quadratic Model", [9539])}, "LinearQuadraticModelForLowDoseRateBrachytherapy": { "130134": ("Linear-Quadratic Model for Low-Dose Rate Brachytherapy", [9539]) }, "LinearQuadraticModelWithTimeFactor": { "130132": ("Linear-Quadratic Model with Time Factor", [9539]) }, "LinearSpiculation": {"113665": ("Linear spiculation", [6166])}, "LinearUltrasoundTransducerGeometry": { "125252": ("Linear ultrasound transducer geometry", [12033]) }, "LipidAndLactate": { "113095": ("Lipid and Lactate", [218, 4032, 4033, 7180, 7186, 7469]) }, "LiquidCrystalDisplay": {"109992": ("Liquid Crystal Display", [8303])}, "LiquidIonChamber": {"128705": ("Liquid Ion Chamber", [7026, 7027, 7151, 7193])}, "Lobar": {"112158": ("Lobar", [6128, 6129, 8134])}, "Lobulated": {"112135": ("Lobulated", [6119, 6335, 6339, 6340])}, "LocalEffectModel": {"130128": ("Local Effect Model", [9538])}, "LocalServiceOperationStarted": { "110141": ("Local Service Operation Started", [401, 403]) }, "LocalServiceOperationStopped": { "110142": ("Local Service Operation Stopped", [401, 403]) }, "LocalizedProstateFinding": {"130555": ("Localized Prostate Finding", [])}, "Localizer": {"121311": ("Localizer", [4264, 7201, 8120])}, "LocallyManufacturedProduct": {"127390": ("Locally manufactured product", [608])}, "LocationInChest": {"112013": ("Location in Chest", [])}, "LocationOfSamplingSite": {"111709": ("Location of sampling site", [])}, "LocationOfSamplingSiteXOffset": { "111710": ("Location of sampling site X offset", []) }, "LocationOfSamplingSiteYOffset": { "111711": ("Location of sampling site Y offset", []) }, "LocationOfSamplingSiteZOffset": { "111712": ("Location of sampling site Z offset", []) }, "LocationOfSpecimen": {"111718": ("Location of Specimen", [])}, "LocationOfSpecimenXOffset": {"111719": ("Location of Specimen X offset", [])}, "LocationOfSpecimenYOffset": {"111720": ("Location of Specimen Y offset", [])}, "LocationOfSpecimenZOffset": {"111721": ("Location of Specimen Z offset", [])}, "LogOfRatioOfTwoSamples": {"113260": ("Log of ratio of two samples", [7274])}, "Login": {"110122": ("Login", [401, 403])}, "Logout": {"110123": ("Logout", [401, 403])}, "LongAxisBased": {"122476": ("Long Axis Based", [3458])}, "LongRunHighGrayLevelEmphasis": { "128808": ("Long Run High Gray Level Emphasis", []) }, "LongRunLowGrayLevelEmphasis": {"128807": ("Long Run Low Gray Level Emphasis", [])}, "LongRunsEmphasis": {"128802": ("Long Runs Emphasis", [])}, "LongitudinalLagrangianStrain": { "130670": ("Longitudinal Lagrangian Strain", [12304, 12311]) }, "LongitudinalLagrangianStrainRate": { "130674": ("Longitudinal Lagrangian Strain Rate", [12304, 12311]) }, "LongitudinalPositionZ": {"113994": ("Longitudinal Position Z", [])}, "LongitudinalTemporalEventType": { "128741": ("Longitudinal Temporal Event Type", []) }, "LongitudinalTemporalOffsetFromEvent": { "128740": ("Longitudinal Temporal Offset from Event", []) }, "LossyCompressedImage": {"121325": ("Lossy compressed image", [7205])}, "LossyCompressedPredecessor": {"121330": ("Lossy compressed predecessor", [7202])}, "LossyCompression": {"113040": ("Lossy Compression", [7203])}, "LotIdentifier": {"121149": ("Lot Identifier", [3426])}, "Low": {"111577": ("Low", [6090])}, "LowGrayLevelRunEmphasis": {"128803": ("Low Gray Level Run Emphasis", [])}, "LowGrayLevelZoneEmphasis": {"128823": ("Low Gray Level Zone Emphasis", [])}, "LowThyroidUptake": {"113561": ("Low Thyroid Uptake", [64, 10045])}, "Lucency": {"112084": ("Lucency", [6102, 6109, 7151, 7196])}, "LumenDiameterRatio": {"122350": ("Lumen Diameter Ratio", [3484])}, "LumenEccentricityIndex": {"122343": ("Lumen Eccentricity Index", [3484])}, "LumenPerimeter": {"122332": ("Lumen Perimeter", [3481])}, "LumenShapeIndex": {"122348": ("Lumen Shape Index", [3484])}, "LumenVolume": {"122372": ("Lumen Volume", [3485])}, "LuminanceResponseEvaluation": { "109703": ("Luminance response evaluation", [8300]) }, "LuminanceUniformityEvaluation": { "109704": ("Luminance uniformity evaluation", [8300]) }, "Lutetium177NAcetylaspartylglutamate": { "126509": ("Lutetium^177^ n-acetylaspartylglutamate", [25]) }, "LympathicVesselInvasion": {"111320": ("Lympathic vessel invasion", [6030, 6033])}, "Lymphoma": {"111321": ("Lymphoma", [])}, "MDerivedFilter": {"130766": ("M-derived filter", [3042])}, "MEDI55189Zr": {"126730": ("MEDI-551 ^89^Zr", [4021])}, "MEMSBasedTransducer": {"130816": ("MEMS-based Transducer", [11003])}, "MIRDOSE": {"113526": ("MIRDOSE", [10040])}, "MIRDPamphlet1": {"113520": ("MIRD Pamphlet 1", [10040])}, "MLCPositionInterlock": {"130829": ("MLC Position Interlock", [9561, 9568])}, "MLCPositionToleranceViolation": { "130472": ("MLC Position Tolerance Violation", [9567]) }, "MLOEvidenceOfMotionBlur": {"111200": ("MLO Evidence of motion blur", [6041])}, "MLOInframammaryFoldIsNotOpen": { "111201": ("MLO Inframammary fold is not open", [6041]) }, "MLOInsufficientPectoralMuscle": { "111197": ("MLO Insufficient pectoral muscle", [6041]) }, "MLONoFatIsVisualizedPosteriorToFibroglandularTissues": { "111198": ( "MLO No fat is visualized posterior to fibroglandular tissues", [6041], ) }, "MLOPoorSeparationOfDeepAndSuperficialBreastTissues": { "111199": ("MLO Poor separation of deep and superficial breast tissues", [6041]) }, "MODImported": {"110026": ("MOD Imported", [7008])}, "MPPSContent": {"113858": ("MPPS Content", [10020])}, "MRMarker": {"129308": ("MR Marker", [7111, 7112])}, "MRPerfusionPeak": {"122635": ("MR Perfusion Peak", [])}, "MRPerfusionSlope": {"122636": ("MR Perfusion Slope", [])}, "MRPerfusionTimeIntegral": {"122637": ("MR Perfusion Time Integral", [])}, "MRSignalIntensity": {"110852": ("MR signal intensity", [218, 7180, 7469])}, "MVAEqualsFlow38Point0SqrtGradientMmhg": { "122263": ("MVA = Flow / 38.0 * sqrt(Gradient[mmHg])", []) }, "MachineCalibrationAdjustment": { "130465": ("Machine Calibration Adjustment", [9565]) }, "MachineCapabilityLicenseExpired": { "130467": ("Machine Capability License Expired", [9565]) }, "MachineClearanceInterlock": { "130740": ("Machine Clearance Interlock", [9561, 9568]) }, "MachineNotAvailable": {"130463": ("Machine Not Available", [9565])}, "MachineQualityAssuranceInputUsed": { "128216": ("Machine Quality Assurance Input Used", [7010, 7025]) }, "Macrocalcifications": {"111345": ("Macrocalcifications", [6010, 6011])}, "MaculaCentered": {"111900": ("Macula centered", [4207])}, "MacularFixationTesting": {"111845": ("Macular Fixation Testing", [4253])}, "MacularGridThicknessAndVolumeReport": { "111690": ("Macular Grid Thickness and Volume Report", []) }, "MagneticFieldStrength": {"130542": ("Magnetic field strength", [])}, "MagneticResonance": {"MR": ("Magnetic Resonance", [29, 30, 33])}, "MagneticResonanceAngiography": {"MA": ("Magnetic resonance angiography", [])}, "MagneticResonanceSpectroscopy": {"MS": ("Magnetic resonance spectroscopy", [])}, "MagneticSusceptibility": { "126396": ("Magnetic Susceptibility", [218, 7180, 7469]) }, "MagnetizationTransferRatio": { "113098": ("Magnetization Transfer Ratio", [218, 7180, 7469]) }, "MagnificationSelection": {"112709": ("Magnification selection", [])}, "MagnitudeNormalized": {"130776": ("Magnitude normalized", [3045])}, "Male": {"M": ("Male", [7455, 7457])}, "MaleChangedToFemale": {"MC": ("Male changed to Female", [7455])}, "MalePseudohermaphrodite": {"MP": ("Male Pseudohermaphrodite", [7455])}, "MalignancyType": {"111388": ("Malignancy Type", [])}, "MalignantFibrousHistiocytoma": {"111331": ("Malignant fibrous histiocytoma", [])}, "MalignantMelanomaOfNipple": { "111334": ("Malignant melanoma of nipple", [6030, 6033]) }, "MammographicCrosshair": {"111487": ("Mammographic (crosshair)", [6058, 6060])}, "MammographicGrid": {"111488": ("Mammographic (grid)", [6058, 6060])}, "Mammography": {"MG": ("Mammography", [29, 30, 33])}, "MammographyCAD": {"111411": ("Mammography CAD", [6050, 6083])}, "MammographyCADReport": {"111036": ("Mammography CAD Report", [])}, "MammographyQualityControlManual1999ACR": { "111238": ("Mammography Quality Control Manual 1999, ACR", [6045, 6326]) }, "Manifest": {"113030": ("Manifest", [7010])}, "ManualAdministration": {"130174": ("Manual Administration", [63])}, "ManualEntry": {"113857": ("Manual Entry", [4240, 10020, 10021, 12303])}, "ManualHandlingInterval": {"127152": ("Manual handling interval", [])}, "ManualHoldStarted": {"130267": ("Manual hold started", [71])}, "ManualKeratometry": {"111753": ("Manual Keratometry", [4235, 4242])}, "ManualProcessing": {"123109": ("Manual Processing", [7162])}, "ManualResumeFromHold": {"130268": ("Manual resume from hold", [71])}, "ManuallyTriggeredInjectionInformation": { "130172": ("Manually Triggered Injection Information", []) }, "ManufacturerImplantTemplate": {"112371": ("Manufacturer Implant Template", [])}, "Margetuximab89Zr": {"126740": ("Margetuximab ^89^Zr", [4021])}, "Margin": {"Margin": ("Margin", [6333, 6334])}, "Margins": {"111037": ("Margins", [])}, "MarkerPlacement": {"111123": ("Marker placement", [6050, 6051, 6058, 6061, 6083])}, "MaskImageForImageProcessingOperation": { "121321": ("Mask image for image processing operation", [7202]) }, "MassAdministered": {"121383": ("Mass administered", [3410])}, "MassInTheSkin": {"111112": ("Mass in the skin", [6014, 6015, 6016, 6054, 6056])}, "MassOccupancyImage": {"129329": ("Mass Occupancy Image", [])}, "MassOfBreast": {"112195": ("Mass of breast", [6142])}, "MassOfParenchymalTissue": {"112194": ("Mass of parenchymal tissue", [6142])}, "MassOfVascularCalcification": { "112199": ("Mass of Vascular Calcification", [6142]) }, "MassOnTheSkin": {"111113": ("Mass on the skin", [6014, 6015, 6016, 6054, 6056])}, "MassScoringMethod": {"112057": ("Mass scoring method", [6140])}, "MassWithCalcifications": {"111459": ("Mass with calcifications", [6016, 6054])}, "MaterialHighlightedImage": {"129325": ("Material Highlighted Image", [])}, "MaterialRecalculatedImage": {"129327": ("Material Recalculated Image", [])}, "MaterialRemovedImage": {"129324": ("Material Removed Image", [])}, "MaterialSpecificImage": {"129323": ("Material Specific Image", [])}, "MaterialSuppressedImage": {"129326": ("Material Suppressed Image", [])}, "Maternal": {"111541": ("Maternal", [6097])}, "MatingFeatureID": {"112352": ("Mating Feature ID", [])}, "MatingFeatureSetID": {"112351": ("Mating Feature Set ID", [])}, "MaxDpDt": {"109025": ("Max dp/dt", [3337])}, "MaxDpDtP": {"122190": ("Max dp/dt/P", [])}, "MaxNegDpDt": {"109026": ("Max neg dp/dt", [3337])}, "MaxVolumeNormalizedTo50mmhgPulsePressure": { "122238": ("Max volume normalized to 50mmHg pulse pressure", []) }, "MaximumAbsoluteVolumeAtRadiationDose": { "130017": ("Maximum Absolute Volume at Radiation Dose", [9500, 9531]) }, "MaximumAbsorbedRadiationDose": { "128531": ("Maximum Absorbed Radiation Dose", [10061]) }, "MaximumAttenuationCoefficient": { "112180": ("Maximum Attenuation Coefficient", [6141]) }, "MaximumCADOperatingPoint": {"111072": ("Maximum CAD Operating Point", [])}, "MaximumDifference": {"126376": ("Maximum Difference", [218, 4109, 7180, 7469])}, "MaximumEquivalentRadiationDose": { "128535": ("Maximum Equivalent Radiation Dose", [10062]) }, "MaximumEquivalentUniformDose": { "130008": ("Maximum Equivalent Uniform Dose", [9500, 9529]) }, "MaximumHomogeneityIndex": {"130013": ("Maximum Homogeneity Index", [])}, "MaximumIntensityProjection": {"113078": ("Maximum intensity projection", [7203])}, "MaximumMeanRadiationDose": { "130006": ("Maximum Mean Radiation Dose", [9500, 9529]) }, "MaximumOrificeArea": {"125328": ("Maximum Orifice Area", [12304])}, "MaximumPercentVolumeAtRadiationDose": { "130015": ("Maximum Percent Volume at Radiation Dose", [9500, 9530]) }, "MaximumPowerOutputAchieved": {"122716": ("Maximum Power Output Achieved", [])}, "MaximumPressureAcceleration": {"122193": ("Maximum pressure acceleration", [])}, "MaximumRadiationDose": {"130004": ("Maximum Radiation Dose", [9500, 9529])}, "MaximumSlope": {"126375": ("Maximum Slope", [218, 4109, 7180, 7469])}, "MaximumSurfaceRadiationDose": { "130002": ("Maximum Surface Radiation Dose", [9500, 9529]) }, "MaximumXRayTubeCurrent": {"113833": ("Maximum X-Ray Tube Current", [])}, "MeanAbsorbedRadiationDose": {"128533": ("Mean Absorbed Radiation Dose", [10061])}, "MeanAttenuationCoefficient": {"112181": ("Mean Attenuation Coefficient", [6141])}, "MeanBloodPressure": {"109027": ("Mean blood pressure", [])}, "MeanCtdifreeair": {"113837": ("Mean CTDIfreeair", [])}, "MeanCtdivol": {"113830": ("Mean CTDIvol", [10050])}, "MeanDiffusivity": {"113202": ("Mean Diffusivity", [7263])}, "MeanEquivalentRadiationDose": { "128537": ("Mean Equivalent Radiation Dose", [10062]) }, "MeanKurtosis": {"113205": ("Mean Kurtosis", [7263])}, "MeanLocalReference": {"122491": ("Mean Local Reference", [3465])}, "MeanTransitTime": {"113052": ("Mean Transit Time", [218, 4108, 7180, 7469])}, "MeanValueChosen": {"121412": ("Mean value chosen", [224, 4241, 12301])}, "MeasuredAPDimension": {"113932": ("Measured AP Dimension", [])}, "MeasuredLateralDimension": {"113931": ("Measured Lateral Dimension", [])}, "MeasuredProperty": {"125307": ("Measured Property", [])}, "MeasuredRadiationDose": {"128497": ("Measured Radiation Dose", [10065])}, "MeasurementDivisor": {"125308": ("Measurement Divisor", [])}, "MeasurementFailure": {"114006": ("Measurement failure", [42, 43])}, "MeasurementFromThisDevice": {"111780": ("Measurement From This Device", [4240])}, "MeasurementGroup": {"125007": ("Measurement Group", [])}, "MeasurementNotAttempted": {"114007": ("Measurement not attempted", [42, 44])}, "MeasurementOfResponse": {"112051": ("Measurement of Response", [])}, "MeasurementOrientation": {"125105": ("Measurement Orientation", [])}, "MeasurementType": {"125306": ("Measurement Type", [])}, "MechanicalBeamSteering": {"125258": ("Mechanical beam steering", [12034])}, "MechanicalDispersion": {"130673": ("Mechanical Dispersion", [12304, 12311])}, "MechanicalFailure": {"111216": ("Mechanical failure", [6041, 6135, 7011])}, "MechanicalPointer": {"130643": ("Mechanical Pointer", [9573, 9575])}, "MediaCreationDevice": {"MCD": ("Media Creation Device", [30])}, "MediaFailure": {"110524": ("Media Failure", [9300, 9302])}, "MediaImport": {"110013": ("Media Import", [9231])}, "MedialDissection": {"122399": ("Medial Dissection", [3492])}, "Median": {"130290": ("Median", [2, 211, 212, 245, 3019])}, "MedianAbsorbedRadiationDose": { "128539": ("Median Absorbed Radiation Dose", [10061]) }, "MedianAttenuationCoefficient": { "112182": ("Median Attenuation Coefficient", [6141]) }, "MedianEquivalentRadiationDose": { "128540": ("Median Equivalent Radiation Dose", [10062]) }, "MedicalDeviceUsed": {"121436": ("Medical Device Used", [])}, "MedicalPhysics": {"128174": ("Medical Physics", [7030])}, "MedicationHistory": {"111512": ("Medication History", [])}, "MedicationType": {"111516": ("Medication Type", [])}, "MedicationsSet": {"127320": ("Medications Set", [])}, "Medium": {"111576": ("Medium", [6090])}, "Medium32Point0To38Point0cmLateralThickness": { "113602": ("Medium: 32.0-38.0 cm lateral thickness", [7041, 7042]) }, "MenopausalPhase": {"111539": ("Menopausal phase", [])}, "MenstrualCyclePhase": {"111391": ("Menstrual Cycle Phase", [])}, "MeshRadiationTransportModel": { "128423": ("Mesh Radiation Transport Model", [10065]) }, "MesopicLight": {"111628": ("Mesopic light", [4203])}, "MetabolicVolume": {"126032": ("Metabolic Volume", [7466])}, "MetaboliteMapsFromSpectroscopyData": { "113050": ("Metabolite Maps from spectroscopy data", [7203]) }, "MetastasisToAnIntramammaryLymphNode": { "111333": ("Metastasis to an intramammary lymph node", [6030, 6033]) }, "MetastaticCancerToTheBreast": { "111323": ("Metastatic cancer to the breast", [6030, 6033]) }, "MetastaticCancerToTheBreastFromTheColon": { "111324": ("Metastatic cancer to the breast from the colon", [6030, 6033]) }, "MetastaticCancerToTheBreastFromTheLung": { "111325": ("Metastatic cancer to the breast from the lung", [6030, 6033]) }, "MetastaticCancerToTheBreastFromTheOvary": { "111327": ("Metastatic cancer to the breast from the ovary", [6030, 6033]) }, "MetastaticDiseaseToAxillaryNode": { "111330": ("Metastatic disease to axillary node", [6030, 6033]) }, "MetastaticMelanomaToTheBreast": { "111326": ("Metastatic melanoma to the breast", [6030, 6033]) }, "MetastaticSarcomaToTheBreast": { "111328": ("Metastatic sarcoma to the breast", [6030, 6033]) }, "Meterset": {"130797": ("Meterset", [])}, "MetersetRateInterlock": {"130830": ("Meterset Rate Interlock", [9561, 9568])}, "MetersetToleranceViolation": {"130469": ("Meterset Tolerance Violation", [9566])}, "MethodCitation": {"121423": ("Method Citation", [228])}, "MethodOfDisksBiplane": {"125207": ("Method of Disks, Biplane", [12227, 12228])}, "MethodOfDisksSinglePlane": { "125208": ("Method of Disks, Single Plane", [12227, 12228]) }, "MicroclipPlaced": {"111441": ("Microclip placed", [])}, "MicrodosimetricKineticModel": { "130129": ("Microdosimetric Kinetic Model", [9538]) }, "MicroglandularAdenosis": {"111284": ("Microglandular adenosis", [6030, 6031])}, "Micronodule": {"112122": ("Micronodule", [6102, 6104])}, "MidPeripheralInferior": {"111908": ("Mid-peripheral-inferior", [4207])}, "MidPeripheralInferiorNasal": {"111909": ("Mid-peripheral-inferior nasal", [4207])}, "MidPeripheralInferiorTemporal": { "111907": ("Mid-peripheral-inferior temporal", [4207]) }, "MidPeripheralNasal": {"111910": ("Mid-peripheral-nasal", [4207])}, "MidPeripheralSuperior": {"111904": ("Mid-peripheral-superior", [4207])}, "MidPeripheralSuperiorNasal": {"111911": ("Mid-peripheral-superior nasal", [4207])}, "MidPeripheralSuperiorTemporal": { "111905": ("Mid-peripheral-superior temporal", [4207]) }, "MidPeripheralTemporal": {"111906": ("Mid-peripheral-temporal", [4207])}, "MiddleInnerRetinaVasculatureFlow": { "128267": ("Middle inner retina vasculature flow", [4271]) }, "MiddleInnerStructuralReflectanceMap": { "128268": ("Middle inner structural reflectance map", [4271]) }, "MiddleOfTimePeriod": {"130535": ("Middle of Time Period", [10073])}, "MidlungWindow": { "112085": ("Midlung window", [6102, 6109, 6110, 7151, 7192, 9514]) }, "MiliaryPattern": {"112129": ("Miliary pattern", [6102, 6106])}, "MinimizeMeterset": {"130018": ("Minimize Meterset", [9500, 9532])}, "MinimumAbsoluteVolumeAtRadiationDose": { "130016": ("Minimum Absolute Volume at Radiation Dose", [9500, 9531]) }, "MinimumAbsorbedRadiationDose": { "128532": ("Minimum Absorbed Radiation Dose", [10061]) }, "MinimumAttenuationCoefficient": { "112179": ("Minimum Attenuation Coefficient", [6141]) }, "MinimumConformationNumber": {"130012": ("Minimum Conformation Number", [])}, "MinimumConformityIndex": {"130010": ("Minimum Conformity Index", [])}, "MinimumEquivalentRadiationDose": { "128536": ("Minimum Equivalent Radiation Dose", [10062]) }, "MinimumEquivalentUniformDose": { "130007": ("Minimum Equivalent Uniform Dose", [9500, 9529]) }, "MinimumHealthyTissueConformityIndex": { "130011": ("Minimum Healthy Tissue Conformity Index", []) }, "MinimumIntensityProjection": {"113079": ("Minimum intensity projection", [7203])}, "MinimumMeanRadiationDose": { "130005": ("Minimum Mean Radiation Dose", [9500, 9529]) }, "MinimumPercentVolumeAtRadiationDose": { "130014": ("Minimum Percent Volume at Radiation Dose", [9500, 9530]) }, "MinimumRadiationDose": {"130003": ("Minimum Radiation Dose", [9500, 9529])}, "MinimumSurfaceRadiationDose": { "130001": ("Minimum Surface Radiation Dose", [9500, 9529]) }, "MitralValveClosure": {"130699": ("Mitral Valve Closure", [12307])}, "MitralValveOpening": {"130700": ("Mitral Valve Opening", [12307])}, "MixedModality3DCAMModel": {"129019": ("Mixed Modality 3D CAM model", [7061])}, "MixedSex": {"127146": ("Mixed sex", [7457])}, "Modality": {"121139": ("Modality", [])}, "ModalityToRead": {"128002": ("Modality to Read", [])}, "ModeAbsorbedRadiationDose": {"128534": ("Mode Absorbed Radiation Dose", [10061])}, "ModeEquivalentRadiationDose": { "128538": ("Mode Equivalent Radiation Dose", [10062]) }, "ModelFittingMethod": {"113241": ("Model fitting method", [9000])}, "ModelFor3DManufacturing": {"M3D": ("Model for 3D Manufacturing", [32, 33])}, "ModelFree": {"113233": ("Model Free", [7261])}, "ModelFreeConcentrationTimeQuantitification": { "126342": ("Model-free concentration-time quantitification", [4106]) }, "ModelMaximumAge": {"128430": ("Model Maximum Age", [])}, "ModelMaximumHeight": {"128442": ("Model Maximum Height", [])}, "ModelMaximumWeight": {"128441": ("Model Maximum Weight", [])}, "ModelMinimumAge": {"128428": ("Model Minimum Age", [])}, "ModelMinimumHeight": {"128439": ("Model Minimum Height", [])}, "ModelMinimumWeight": {"128438": ("Model Minimum Weight", [])}, "ModelPatientSex": {"128437": ("Model Patient Sex", [])}, "ModifiedHounsfieldUnit": {"129321": ("Modified Hounsfield Unit", [301])}, "ModifiedSimpson": {"125227": ("Modified Simpson", [12227, 12228])}, "ModifyingEquipment": {"109103": ("Modifying Equipment", [7005])}, "Mogamulizumab89Zr": {"126738": ("Mogamulizumab ^89^Zr", [4021])}, "Mold": {"130113": ("Mold", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "MonoExponentialApparentDiffusionCoefficient": { "113290": ( "Mono-exponential Apparent Diffusion Coefficient", [218, 7180, 7272, 7469], ) }, "MonoExponentialDiffusionModel": { "113250": ("Mono-exponential diffusion model", [7273]) }, "MonoblockStem": {"112315": ("Monoblock Stem", [7307, 7308])}, "MonoclonalAntibody64Cu": {"126510": ("Monoclonal Antibody ^64^Cu", [4021])}, "MonoclonalAntibody89Zr": {"126511": ("Monoclonal Antibody ^89^Zr", [4021])}, "MonoclonalAntibodyMab64Cu": {"126510": ("Monoclonal Antibody (mAb) ^64^Cu", [])}, "MonoclonalAntibodyMab89Zr": {"126511": ("Monoclonal Antibody (mAb) ^89^Zr", [])}, "MonopoleSignal": {"109008": ("Monopole signal", [3240])}, "MorphologicalOperations": {"123104": ("Morphological Operations", [7162])}, "MosaicPattern": {"112130": ("Mosaic pattern", [6102, 6106])}, "MosaicPerfusion": {"112080": ("Mosaic perfusion", [6108])}, "MostRecentValueChosen": {"121411": ("Most recent value chosen", [224, 12301])}, "MotherOfFetus": {"121036": ("Mother of fetus", [])}, "MotionBlur": {"111210": ("Motion blur", [3115, 6041, 6135, 7011])}, "MotorizedWedge": {"130347": ("Motorized Wedge", [9546])}, "MouseAlphaSynucleinPreformedFibrils": { "127852": ("Mouse alpha synuclein preformed fibrils", [638, 640]) }, "MouseTauPreformedFibrils": {"127854": ("Mouse Tau preformed fibrils", [638, 640])}, "MoveableLaserPatientSetupPoint": { "130071": ("Moveable Laser Patient Setup Point", [9504, 9574]) }, "MultiEnergyProportionalWeighting": { "113097": ("Multi-energy proportional weighting", [7203]) }, "MultiMediaCard": {"110035": ("Multi-media Card", [405])}, "MultiScaleResolutionFiltering": { "123106": ("Multi-Scale/Resolution Filtering", [7162]) }, "MultiShotEPI": {"113227": ("Multi Shot EPI", [])}, "MultiSideIllumination": {"130812": ("Multi-side illumination", [11001])}, "MultiTensor": {"113232": ("Multi Tensor", [7261])}, "MultifocalIntraductalCarcinoma": { "111329": ("Multifocal intraductal carcinoma", [6030, 6033]) }, "MultifocalInvasiveDuctalCarcinoma": { "111332": ("Multifocal invasive ductal carcinoma", [6030, 6033]) }, "MultiparametricMRI": {"126020": ("Multiparametric MRI", [100])}, "MultiparametricMRIOfProstate": {"126021": ("Multiparametric MRI of prostate", [])}, "MultiparametricMRIOfWholeBody": { "126022": ("Multiparametric MRI of whole body", [100]) }, "MultiplanarReformatting": {"113072": ("Multiplanar reformatting", [7203])}, "MultipleFillingDefect": {"111426": ("Multiple filling defect", [6054, 6057])}, "MultipleFixedSources": {"130138": ("Multiple Fixed Sources", [9522, 9524])}, "MultipleIntraductalPapillomas": { "111285": ("Multiple Intraductal Papillomas", [6030, 6031]) }, "MultipleLADRegionInRAOProjection": { "122468": ("Multiple LAD Region in RAO Projection", [3461]) }, "MultiplePlanes": {"112714": ("Multiple planes", [])}, "MultipleRCARegionInRAOProjection": { "122469": ("Multiple RCA Region in RAO Projection", [3461]) }, "MultipleShotEPI": {"113227": ("Multiple Shot EPI", [7260])}, "MultipleSlices": {"122562": ("Multiple Slices", [3453])}, "MultispectralProcessing": {"123108": ("Multispectral Processing", [7162])}, "MusculoskeletalImagingSpecialty": { "128009": ("Musculoskeletal Imaging Specialty", [7449]) }, "MusculoskeletalImagingSubjectMatter": { "128728": ("Musculoskeletal imaging subject matter", [7017]) }, "MusculoskeletalRadiology": {"128175": ("Musculoskeletal Radiology", [7030])}, "MyocardialBiopsy": {"122057": ("Myocardial biopsy", [3405, 3406])}, "MyocardialMidlayerMethod": { "130685": ("Myocardial Midlayer Method", [12227, 12310]) }, "MyocardialPerfusionAnalysis": {"122602": ("Myocardial Perfusion Analysis", [])}, "Myofibroblastoma": {"111283": ("Myofibroblastoma", [])}, "MüllerMethodPlanningForHipReplacement": { "112344": ("Müller Method Planning for Hip Replacement", [7320]) }, "NASCET": {"122655": ("NASCET", [3804])}, "NAcetylaspartateCholineRatio": { "113083": ( "N-acetylaspartate/Choline Ratio", [218, 4032, 4033, 7180, 7186, 7469], ) }, "NAcetylaspartateCreatineRatio": { "113082": ( "N-acetylaspartate/Creatine Ratio", [218, 4032, 4033, 7180, 7186, 7469], ) }, "NEMAXR212000Phantom": {"113692": ("NEMA XR21-2000 Phantom", [4051, 4052])}, "NIH07": {"127271": ("NIH07", [607])}, "NIH31": {"127270": ("NIH31", [607])}, "NMMyocardialViabilityProcedure": { "122785": ("NM Myocardial Viability procedure", [3110]) }, "NMTransmissionAttenuationCorrection": { "122727": ("NM Transmission Attenuation Correction", [3112]) }, "NNonDiagnosticSegments": {"130732": ("N - Non-diagnostic segments", [3022])}, "NNonDiagnosticStudy": {"130731": ("N - Non-diagnostic study", [3020])}, "NURBSRadiationTransportModel": { "128424": ("NURBS Radiation Transport Model", [10065]) }, "NanocolloidalAlbumin89Zr": {"126753": ("Nanocolloidal albumin ^89^Zr", [4021])}, "NarrativeSummary": {"111412": ("Narrative Summary", [])}, "NasalCannula": {"127061": ("Nasal cannula", [617, 618])}, "NationalKennelClub": {"109215": ("National Kennel Club", [7481])}, "NativePlaqueVolume": {"122375": ("Native Plaque Volume", [3485])}, "NearPupillaryDistance": {"111680": ("Near Pupillary Distance", [])}, "Nearline": {"NEARLINE": ("Nearline", [50])}, "NeckComponent": {"112314": ("Neck Component", [7307, 7308])}, "NecroticLipidicPlaque": { "122395": ("Necrotic-Lipidic Plaque", [3491, 3495, 3497]) }, "NeedleGauge": {"111465": ("Needle Gauge", [6095])}, "NeedleInTarget": {"111438": ("Needle in target", [])}, "NeedleLength": {"111467": ("Needle Length", [6095])}, "NeedleLocalizationAndBiopsy": { "111144": ("Needle localization and biopsy", [6028, 6029, 6051, 6058, 6061]) }, "NegativeDCE": {"130601": ("Negative DCE", [6335, 6345, 6346])}, "NegativeEnhancementIntegral": { "113054": ("Negative enhancement integral", [218, 7180, 7469]) }, "NegativeExponential": {"130252": ("Negative exponential", [73])}, "NegativeInfinity": {"114001": ("Negative Infinity", [42, 43])}, "NeighborhoodAnalysis": {"123101": ("Neighborhood Analysis", [7162])}, "NeighbourhoodGreyToneDifferenceMatrix": { "128779": ("Neighbourhood Grey Tone Difference Matrix", []) }, "NeighbouringGreyLevelDependenceMatrix": { "128780": ("Neighbouring Grey Level Dependence Matrix", []) }, "NeoplasmOfTheMammarySkin": {"111335": ("Neoplasm of the mammary skin", [])}, "NetForwardVolume": {"122645": ("Net Forward Volume", [])}, "NetworkConfiguration": {"110128": ("Network Configuration", [401, 403])}, "NetworkEntry": {"110108": ("Network Entry", [400])}, "Neurofibromatosis": {"111288": ("Neurofibromatosis", [])}, "NeuroimagingSubjectMatter": {"128733": ("Neuroimaging subject matter", [7017])}, "NeurologySpecialty": {"128010": ("Neurology Specialty", [7449])}, "NeurophysiologyAutomatedAnalysisAnnotations": { "130869": ("Neurophysiology Automated Analysis Annotations", [3048]) }, "NeurophysiologyPostHocReviewAnnotations": { "130868": ("Neurophysiology Post-hoc Review Annotations", [3048]) }, "NeurophysiologyRecordingAnnotations": { "130867": ("Neurophysiology Recording Annotations", [3048]) }, "NeuroradiologicImagingSpecialty": { "128011": ("Neuroradiologic Imaging Specialty", []) }, "NeuroradiologyImagingSpecialty": { "128011": ("Neuroradiology Imaging Specialty", [7449]) }, "NeutralMusculoskeletalPosition": { "109136": ("Neutral musculoskeletal position", [92]) }, "NifeneF18": {"126714": ("Nifene F^18^", [4021])}, "NilPerOsNPOStatusConfirmed": { "122006": ("Nil Per Os (NPO) status confirmed", [3402]) }, "NiobiumOrNiobiumCompound": {"113710": ("Niobium or Niobium compound", [])}, "NippleCharacteristic": {"111297": ("Nipple Characteristic", [])}, "NippleDischargeCytology": {"111564": ("Nipple discharge cytology", [6083])}, "NippleInvolved": {"111472": ("Nipple involved", [])}, "NippleNotInProfile": {"111205": ("Nipple not in profile", [6041])}, "NippleRing": {"112177": ("Nipple ring", [6102, 6138, 6404, 7151, 7193])}, "NoAbnormality": {"111286": ("No abnormality", [6030, 6031])}, "NoAlgorithmsSucceededWithoutFindings": { "111245": ("No algorithms succeeded; without findings", [6047]) }, "NoAttenuationCorrection": {"122729": ("No Attenuation Correction", [3112])}, "NoComplications": {"111492": ("No complications", [6062])}, "NoCornealCompensation": {"111922": ("No corneal compensation", [4261])}, "NoCorrelationToClinicalFindings": { "111387": ("No correlation to clinical findings", [6158]) }, "NoCorrelationToOtherImagingFindings": { "111386": ("No correlation to other imaging findings", [6158]) }, "NoEmptyTileSuppression": {"112721": ("No empty tile suppression", [8133])}, "NoFamilyHistoryOfProstateCancer": { "130587": ("No family history of prostate cancer", [6322]) }, "NoFilter": {"111609": ("No filter", [4204, 8124, 10007])}, "NoGrid": {"111646": ("No grid", [10017])}, "NoImage": {"111213": ("No image", [6041, 6135, 7011])}, "NoKnownExposure": {"111587": ("No known exposure", [6090])}, "NoPosteriorAcousticFeatures": { "111367": ("No posterior acoustic features", [6155]) }, "NoRealignment": {"122477": ("No Realignment", [3458])}, "NoSubsequentWorkitems": {"110009": ("No subsequent Workitems", [9231])}, "NodeAuthentication": {"110126": ("Node Authentication", [401, 403])}, "NodeID": {"110182": ("Node ID", [404])}, "NodularPattern": {"112067": ("Nodular pattern", [6102, 6104, 6106])}, "Nomenclature": {"127413": ("Nomenclature", [])}, "NominalEmptyTileSuppression": { "112719": ("Nominal empty tile suppression", [8133]) }, "NominalImagingSourceLocation": { "130789": ("Nominal Imaging Source Location", [9261]) }, "NominalRadiationSourceLocation": { "130358": ("Nominal Radiation Source Location", [9261, 9544, 9554]) }, "NominalSingleCollimationWidth": { "113826": ("Nominal Single Collimation Width", []) }, "NominalTotalCollimationWidth": {"113827": ("Nominal Total Collimation Width", [])}, "NonBloodyDischarge": {"111478": ("Non-bloody discharge (from nipple)", [6055])}, "NonDiagnosticECG": {"122753": ("Non-diagnostic ECG", [3677])}, "NonDiagnosticLowHeartRate": { "122750": ("Non-diagnostic - low heart rate", [3231]) }, "NonDiagnosticRestingSTAbnormalities": { "122751": ("Non-diagnostic - resting ST abnormalities", [3231]) }, "NonDiagnosticVentricularPacingOrLBBB": { "122752": ("Non-diagnostic - ventricular pacing or LBBB", [3231]) }, "NonFlatteningFilterBeam": {"130356": ("Non-Flattening Filter Beam", [9549])}, "NonFocalAbnormality": {"130592": ("Non-focal abnormality", [6335, 6336, 6337])}, "NonImagingDopplerUltrasoundTransducerGeometry": { "125251": ("Non-imaging Doppler ultrasound transducer geometry", [12033]) }, "NonIonicIodinatedContrastAgent": { "127855": ("Non-ionic iodinated contrast agent", []) }, "NonLesion": {"111102": ("Non-lesion", [6014, 6016, 6054, 6101, 6201])}, "NonLesionAtBaseline": {"112076": ("Non-Lesion at Baseline", [6145])}, "NonLesionModifier": {"112037": ("Non-lesion Modifier", [])}, "NonSpecificVolume": {"130046": ("Non-specific Volume", [9501, 9502, 9580])}, "NonSynchronizedRoboticTreatment": { "130140": ("Non-Synchronized Robotic Treatment", [9523, 9524]) }, "NonTargetLesionAtBaseline": {"112075": ("Non-Target Lesion at Baseline", [6145])}, "NonTargetLesionCompleteResponse": { "112045": ("Non-Target Lesion Complete Response", [6143, 6144]) }, "NonTargetLesionIncompleteResponseOrStableDisease": { "112046": ( "Non-Target Lesion Incomplete Response or Stable Disease", [6143, 6144], ) }, "NonTargetLesionProgressiveDisease": { "112047": ("Non-Target Lesion Progressive Disease", [6143, 6144]) }, "NonUterineLeiomyosarcoma": {"130406": ("Non-uterine leiomyosarcoma", [638, 639])}, "NormalAxillaryNode": {"111251": ("Normal axillary node", [6030, 6031])}, "NormalBreastTissue": { "111287": ("Normal breast tissue", [6030, 6031, 6054, 6057]) }, "NormalImplants": {"111503": ("Normal implants", [6072])}, "NormalIntervalFollowUp": {"111140": ("Normal interval follow-up", [6028, 6029])}, "NormalMyocardium": {"122112": ("Normal Myocardium", [3704])}, "NormalRangeAuthority": {"121408": ("Normal Range Authority", [])}, "NormalRangeDescription": {"121407": ("Normal Range description", [])}, "Normality": {"121402": ("Normality", [])}, "NormalizationFactor": {"128522": ("Normalization Factor", [10069])}, "NormalizedChordLength": {"122450": ("Normalized Chord Length", [])}, "NormalizedValuesOfVentricularMeasurements": { "122609": ("Normalized Values Of Ventricular Measurements", []) }, "NorthAmericanPurebredDogRegistry": { "109216": ("North American Purebred Dog Registry", [7481]) }, "NoseCone": {"127060": ("Nose cone", [617])}, "NotANumber": {"114000": ("Not a number", [42, 43])}, "NotAllAlgorithmsSucceededWithFindings": { "111244": ("Not all algorithms succeeded; with findings", [6047]) }, "NotAllAlgorithmsSucceededWithoutFindings": { "111243": ("Not all algorithms succeeded; without findings", [6047]) }, "NotAttempted": {"111225": ("Not Attempted", [6042])}, "NotForPresentationRenderingDeviceExpectedNotToPresent": { "111152": ( "Not for Presentation: Rendering device expected not to present", [6034], ) }, "NotOptimizedForTheDeviceInstance": { "128620": ("Not optimized for the device instance", [800]) }, "NotParallel": {"111356": ("Not parallel", [6152])}, "NotSure": {"111399": ("Not sure", [6164])}, "NotVisualized": {"122288": ("Not visualized", [3703])}, "NuclearMedicine": {"NM": ("Nuclear Medicine", [29, 30, 33])}, "NuclearMedicineImagingSubjectMatter": { "128735": ("Nuclear medicine imaging subject matter", [7017]) }, "NuclearMedicineProjectionActivity": { "110820": ("Nuclear Medicine Projection Activity", [218, 7180, 7469]) }, "NuclearMedicineTomographicActivity": { "110821": ("Nuclear Medicine Tomographic Activity", [218, 7180, 7469]) }, "NumberOfAnimalsWithinSameHousingUnit": { "127143": ("Number of animals within same housing unit", []) }, "NumberOfCalcifications": {"111038": ("Number of calcifications", [])}, "NumberOfDiseasedVesselTerritories": { "122762": ("Number of diseased vessel territories", []) }, "NumberOfEctopicBeats": {"122707": ("Number of Ectopic Beats", [])}, "NumberOfFetuses": {"121038": ("Number of Fetuses", [])}, "NumberOfFirstDegreeRelativesAffectedByMalignantMelanoma": { "130487": ( "Number of first-degree relatives affected by malignant melanoma", [], ) }, "NumberOfFocalPlanes": {"112707": ("Number of focal planes", [])}, "NumberOfFractionsCompleted": {"121387": ("Number of Fractions Completed", [])}, "NumberOfFractionsPlanned": {"121386": ("Number of Fractions Planned", [])}, "NumberOfFrames": {"121140": ("Number of Frames", [])}, "NumberOfHousingUnitsPerRack": {"127141": ("Number of housing units per rack", [])}, "NumberOfImagesUsedForMacularMeasurements": { "111691": ("Number of Images Used for Macular Measurements", []) }, "NumberOfInjectorHeads": {"130219": ("Number of Injector Heads", [])}, "NumberOfLesionInterventionsAttempted": { "122175": ("Number of lesion interventions attempted", []) }, "NumberOfLesionInterventionsSuccessful": { "122176": ("Number of lesion interventions successful", []) }, "NumberOfMalignantMelanomas": {"130483": ("Number of malignant melanomas", [])}, "NumberOfMelanomasInSitu": {"130484": ("Number of melanomas in situ", [])}, "NumberOfNeedlesAroundTarget": {"111439": ("Number of needles around target", [])}, "NumberOfNodesPositive": {"111474": ("Number of nodes positive", [])}, "NumberOfNodesRemoved": {"111473": ("Number of nodes removed", [])}, "NumberOfPasses": {"111436": ("Number of passes", [])}, "NumberOfPulses": {"113768": ("Number of Pulses", [])}, "NumberOfRacksPerRoom": {"127140": ("Number of racks per room", [])}, "NumberOfSamplesUsedPerImage": {"111692": ("Number of Samples Used per Image", [])}, "NumberOfSimilarFindings": {"111406": ("Number of similar findings", [])}, "NumberOfSpecimens": {"111437": ("Number of specimens", [])}, "NumberOfStimulusEvents": {"130494": ("Number of Stimulus Events", [])}, "NumberOfXRaySources": {"113823": ("Number of X-Ray Sources", [])}, "NumericalAcousticModel": {"130822": ("Numerical Acoustic Model", [11005])}, "Nurse": {"121082": ("Nurse", [])}, "NursingNote": {"121172": ("Nursing Note", [3401])}, "NursingUnitCancel": {"110511": ("Nursing unit cancel", [9300, 9301])}, "O10": {"130717": ("O10", [3030])}, "O9": {"130716": ("O9", [3030])}, "OBGYNUltrasoundProcedureReport": { "125000": ("OB-GYN Ultrasound Procedure Report", [12024]) }, "OBGynImagingSpecialty": {"128012": ("OB/Gyn Imaging Specialty", [7449])}, "OCTAAmplitudeDecorrelation": {"128252": ("OCT-A amplitude decorrelation", [4270])}, "OCTAComplexVariance": {"128253": ("OCT-A complex variance", [4270])}, "OCTACorrelationMapping": {"128255": ("OCT-A correlation mapping", [4270])}, "OCTAOneSidedRatioGreater": {"128305": ("OCT-A one-sided ratio (greater)", [4270])}, "OCTAOneSidedRatioLesser": {"128304": ("OCT-A one-sided ratio (lesser)", [4270])}, "OCTASpeckleVariance": {"128254": ("OCT-A speckle variance", [4270])}, "OCTBScanAnalysis": {"128303": ("OCT B-scan analysis", [7203])}, "OIQPattern": {"109901": ("OIQ Pattern", [8301])}, "OLED": {"109994": ("OLED", [8303])}, "OLINDAEXM": {"113527": ("OLINDA-EXM", [10040])}, "OSEMAlgorithm": {"122720": ("OSEM algorithm", [3117])}, "OSLD": {"128706": ("OSLD", [7026, 7027, 7151, 7193])}, "Obinituzimab89Zr": {"126721": ("Obinituzimab ^89^Zr", [4021])}, "ObjectRemoved": {"122307": ("Object removed", [3412])}, "ObjectSecurityAttributesChanged": { "110135": ("Object Security Attributes Changed", [401, 403]) }, "ObjectSetIncomplete": {"110523": ("Object Set incomplete", [9300, 9302, 9303])}, "ObjectType": {"111039": ("Object type", [])}, "ObjectTypesNotSupported": {"110522": ("Object Types not supported", [9300, 9302])}, "ObjectsIncorrectlyFormatted": { "110521": ("Objects incorrectly formatted", [9300, 9302]) }, "ObliqueIllumination": {"111746": ("Oblique illumination", [8123])}, "ObservationByExaminer": {"111846": ("Observation by Examiner", [4253])}, "ObservationDatetimeQualifier": {"121135": ("Observation DateTime Qualifier", [])}, "ObserverType": {"121005": ("Observer Type", [])}, "Ocaratuzumab89Zr": {"126723": ("Ocaratuzumab ^89^Zr", [4021])}, "OccultBloodTestResult": {"111455": ("Occult blood test result", [])}, "OccultCarcinomaPresentingWithAxillaryLymphNodeMetastases": { "111322": ( "Occult carcinoma presenting with axillary lymph node metastases", [6030, 6033], ) }, "OcularFixationLight": {"130649": ("Ocular Fixation Light", [9573, 9575])}, "OcularGazeSetupMethod": {"130635": ("Ocular Gaze Setup Method", [9571])}, "OfInterest": {"113000": ("Of Interest", [7010])}, "OfficeCalled": {"122045": ("Office called", [3404])}, "Offline": {"OFFLINE": ("Offline", [50])}, "OffsetFactor": {"128523": ("Offset Factor", [10069])}, "OilCyst": {"111290": ("Oil cyst (fat necrosis cyst)", [6030, 6031])}, "OldFilmsForComparison": {"111138": ("Old films for comparison", [6028, 6029])}, "Oligemia": {"112060": ("Oligemia", [6108])}, "Olsen": {"111765": ("Olsen", [4236])}, "OnAdmissionToUnit": {"109120": ("On admission to unit", [31])}, "OnDischarge": {"109121": ("On discharge", [31])}, "OnDischargeFromUnit": {"109122": ("On discharge from unit", [31])}, "OncologicImagingSpecialty": {"128013": ("Oncologic Imaging Specialty", [7449])}, "OncologyMeasurementReport": {"126001": ("Oncology Measurement Report", [7021])}, "OncologySpecialty": {"128014": ("Oncology Specialty", [7449])}, "Ongoing": {"111528": ("Ongoing", [])}, "Online": {"ONLINE": ("Online", [50])}, "OnsetOfExercise": {"125236": ("Onset of exercise", [12031])}, "OnsetOfStimulation": {"125238": ("Onset of stimulation", [12031])}, "Opacity": {"112001": ("Opacity", [6102, 6104])}, "OpacityDescriptor": {"112027": ("Opacity Descriptor", [])}, "OperatorDecisionToTerminateTreatment": { "130450": ("Operator decision to terminate treatment", []) }, "OperatorError": {"110519": ("Operator Error", [4221, 4222, 9561])}, "OperatorNarrative": {"109111": ("Operator's narrative", [3000])}, "OphthalmicAxialMeasurements": { "OAM": ("Ophthalmic Axial Measurements", [29, 30, 33]) }, "OphthalmicMacularGridProblem": {"111698": ("Ophthalmic Macular Grid Problem", [])}, "OphthalmicMapping": {"OPM": ("Ophthalmic Mapping", [29, 30, 33])}, "OphthalmicPhotography": {"OP": ("Ophthalmic Photography", [29, 30, 33])}, "OphthalmicRefraction": {"OPR": ("Ophthalmic Refraction", [])}, "OphthalmicTomography": {"OPT": ("Ophthalmic Tomography", [29, 30, 33])}, "OphthalmicTomographyBScanVolumeAnalysis": { "OPTBSV": ("Ophthalmic Tomography B-scan Volume Analysis", [29, 30, 33]) }, "OphthalmicTomographyEnFace": { "OPTENF": ("Ophthalmic Tomography En Face", [29, 30, 33]) }, "OphthalmicVisualField": {"OPV": ("Ophthalmic Visual Field", [29, 30, 33])}, "OppositeRegionSeverity": {"122461": ("Opposite Region Severity", [])}, "Optical": {"111752": ("Optical", [])}, "OpticalCoherenceTomography": { "OCT": ("Optical Coherence Tomography", [29, 30, 33]) }, "OpticalDistanceMeter": {"130642": ("Optical Distance Meter", [9573, 9575])}, "OpticalFilterType": {"112712": ("Optical filter type", [])}, "OpticalFixationMeasurements": { "111856": ("Optical Fixation Measurements", [4257]) }, "OpticalSurfaceScanner": { "OSS": ("Optical Surface Scanner", [29, 30, 33, 9573, 9575]) }, "OptimizedForTheDeviceInstance": { "128608": ("Optimized for the device instance", [800]) }, "OrderRecord": {"110109": ("Order Record", [400])}, "OrganAtRisk": {"130060": ("Organ At Risk", [9535])}, "OrganDose": {"113518": ("Organ Dose", [])}, "OrganDoseInformation": {"113517": ("Organ Dose Information", [])}, "OrganizationName": {"113873": ("Organization Name", [])}, "Orientation": {"111354": ("Orientation", [])}, "OrientationDescriptor": {"112014": ("Orientation Descriptor", [])}, "OriginalSource": {"111040": ("Original Source", [])}, "OronaryArteryDiseaseAssessmentModifier": { "130721": ("oronary Artery Disease Assessment Modifier", []) }, "OrthogonalLocationArc": {"113669": ("Orthogonal location arc", [6166])}, "OrthogonalLocationArcInnerMargin": { "113670": ("Orthogonal location arc inner margin", [6166]) }, "OrthogonalLocationArcOuterMargin": { "113671": ("Orthogonal location arc outer margin", [6166]) }, "OsmolalityAt37C": {"130184": ("Osmolality at 37C", [])}, "OsmolarityAt37C": {"130185": ("Osmolarity at 37C", [])}, "Osseous": {"112053": ("Osseous", [6100])}, "OsseousModifier": {"112038": ("Osseous Modifier", [])}, "Other": {"OT": ("Other", [32, 33])}, "OtherDerivedPlanningData": {"112373": ("Other Derived Planning Data", [])}, "OtherFailure": {"111220": ("Other failure", [6041, 6135, 7011])}, "OtherImageOfBiplanePair": {"121314": ("Other image of biplane pair", [7201])}, "OtherImageOfStereoscopicPair": { "121315": ("Other image of stereoscopic pair", [7201]) }, "OtherMalignancyType": {"111390": ("Other malignancy type", [6159])}, "OtherMarker": {"111175": ("Other Marker", [6040, 6401, 7151, 7193])}, "OtherModality": {"OT": ("Other Modality", [])}, "OtherPartialViews": {"121313": ("Other partial views", [7201])}, "OtherProjectionSystem": {"109999": ("Other Projection System", [])}, "OtherSex": {"121102": ("Other sex", [7455])}, "OutOfToleranceInterlock": {"130743": ("Out of Tolerance Interlock", [9561, 9568])}, "OuterLimitsOfFuzzyMargin": {"113663": ("Outer limits of fuzzy margin", [6166])}, "OuterRetinaStructuralReflectanceMap": { "128272": ("Outer retina structural reflectance map", [4271]) }, "OuterRetinaVasculatureFlow": {"128271": ("Outer retina vasculature flow", [4271])}, "OuterSurfaceOfGCL": {"128290": ("Outer surface of GCL", [4273, 7151, 7192, 9514])}, "OuterSurfaceOfHFL": {"128294": ("Outer surface of HFL", [4273, 7151, 7192, 9514])}, "OuterSurfaceOfINL": {"128292": ("Outer surface of INL", [4273, 7151, 7192, 9514])}, "OuterSurfaceOfIPL": {"128291": ("Outer surface of IPL", [4273, 7151, 7192, 9514])}, "OuterSurfaceOfOPL": {"128293": ("Outer surface of OPL", [4273, 7151, 7192, 9514])}, "OuterSurfaceOfRNFL": { "128289": ("Outer surface of RNFL", [4273, 7151, 7192, 9514]) }, "OuterSurfaceOfTheBM": { "128300": ("Outer surface of the BM", [4273, 7151, 7192, 9514]) }, "OuterSurfaceOfTheCC": { "128302": ("Outer surface of the CC", [4273, 7151, 7192, 9514]) }, "OutflowAngle": {"122547": ("Outflow Angle", [])}, "Outline": {"111041": ("Outline", [219])}, "OutlineOfLobulations": {"113661": ("Outline of lobulations", [6166])}, "OutlineOfSpiculations": {"113664": ("Outline of spiculations", [6166])}, "OutputMeasurementPointPosition": { "130525": ("Output Measurement Point Position", []) }, "OutsideNormalLimits": {"111847": ("Outside normal limits", [4254])}, "OutsideOperationalLimitsOfTheDevice": { "128619": ("Outside operational limits of the device", [800]) }, "OverExposed": {"111212": ("Over exposed", [6041, 6135, 7011])}, "OverallAssessment": {"111413": ("Overall Assessment", [6052, 6053])}, "OverallImageQualityEvaluation": { "109701": ("Overall image quality evaluation", [8300]) }, "OverallImpressionRecommendationAnalysis": { "111234": ("Overall Impression/\u200bRecommendation Analysis", [6043]) }, "OverallProstateFinding": {"130554": ("Overall Prostate Finding", [])}, "OverallStudyQuality": {"122739": ("Overall study quality", [])}, "Overflow": {"114005": ("Overflow", [42, 43])}, "OxygenAdministrationByVentilator": { "121163": ("Oxygen Administration by ventilator", [3531]) }, "OxygenAdministrationRate": {"121160": ("Oxygen Administration Rate", [])}, "OxygenConsumption": {"122239": ("Oxygen Consumption", [])}, "OxygenExtractionFraction": { "126392": ("Oxygen Extraction Fraction", [218, 4108, 7180, 7469]) }, "PAPLeakPressure": {"130423": ("PAP Leak Pressure", [3005])}, "PAPPressure": {"130422": ("PAP Pressure", [3005])}, "PAPTidalVolume": {"130424": ("PAP Tidal Volume", [3005])}, "PAS": {"113237": ("PAS", [7261])}, "PCIDuringThisProcedure": {"122129": ("PCI during this procedure", [])}, "PETMeasurementReport": {"126003": ("PET Measurement Report", [7021])}, "PETMyocardialPerfusionRestAndStress": { "122793": ("PET Myocardial Perfusion, Rest and Stress", [3106]) }, "PETMyocardialPerfusionRestOnly": { "122791": ("PET Myocardial Perfusion, Rest only", [3106]) }, "PETMyocardialPerfusionStressOnly": { "122792": ("PET Myocardial Perfusion, Stress only", [3106]) }, "PETMyocardialViabilityRestAndStress": { "122797": ("PET Myocardial Viability, Rest and Stress", [3106]) }, "PETMyocardialViabilityRestOnly": { "122795": ("PET Myocardial Viability, Rest only", [3106]) }, "PETMyocardialViabilityStressOnly": { "122796": ("PET Myocardial Viability, Stress only", [3106]) }, "PETRadionuclideIncubationTime": { "126203": ("PET Radionuclide Incubation Time", []) }, "PGreaterThan5Percent": {"111935": ("p>5%", [4265])}, "PIRADS2Point0ProstateMRIAcquisitionRequirements": { "130607": ("PI-RADS 2.0 prostate MRI acquisition requirements", [6326, 6353]) }, "PIRADS2Point1ProstateMRIAcquisitionRequirements": { "130608": ("PI-RADS 2.1 prostate MRI acquisition requirements", [6326, 6353]) }, "PIRADSDCELesionAssessment": {"130563": ("PI-RADS DCE Lesion Assessment", [])}, "PIRADSDWILesionAssessment": {"130562": ("PI-RADS DWI Lesion Assessment", [])}, "PIRADSLocalizedAbnormalityAssessment": { "130560": ("PI-RADS Localized Abnormality Assessment", []) }, "PIRADST2WILesionAssessment": {"130561": ("PI-RADS T2WI Lesion Assessment", [])}, "PIRADSV2Point0": {"130564": ("PI-RADS v2.0", [6310])}, "PIRADSV2Point1": {"130565": ("PI-RADS v2.1", [6310])}, "PISARadius": {"125331": ("PISA Radius", [12304])}, "PLesserThan0Point5Percent": {"111939": ("p<0.5%", [4265])}, "PLesserThan1Percent": {"111938": ("p<1%", [4265])}, "PLesserThan2Percent": {"111937": ("p<2%", [4265])}, "PLesserThan5Percent": {"111936": ("p<5%", [4265])}, "PO10": {"130715": ("PO10", [3030])}, "PO9": {"130714": ("PO9", [3030])}, "PSMA1007F18": {"126758": ("PSMA-1007 F^18^", [4021])}, "PSMA617Ga68": {"126759": ("PSMA-617 Ga^68^", [4021])}, "PTVNodal": {"130053": ("PTV Nodal", [9534])}, "PTVPrimary": {"130054": ("PTV Primary", [9534])}, "PWave": {"109041": ("P wave", [3339])}, "Paced": {"109083": ("Paced", [3104])}, "PacedStressTest": {"121438": ("Paced stress test", [])}, "Pacemaker": {"111171": ("Pacemaker", [])}, "PacingElectricalStimulusVoltage": { "109009": ("Pacing (electrical) stimulus, voltage", [3240]) }, "PackageInsert": {"113528": ("Package Insert", [10040])}, "Paddle": {"111172": ("Paddle", [])}, "PageSentTo": {"122043": ("Page Sent To", [3404])}, "PalpationGuided": {"111489": ("Palpation guided", [6058, 6060])}, "PancreaticStent": { "112176": ("Pancreatic stent", [6102, 6138, 6202, 6203, 6404, 7151, 7193]) }, "Panitumumab89Zr": {"126736": ("Panitumumab ^89^Zr", [4021])}, "PanoramicXRay": {"PX": ("Panoramic X-Ray", [29, 30, 33])}, "PaperBasedBedding": {"127233": ("Paper-based bedding", [605])}, "PaperDigitized": {"110023": ("Paper Digitized", [7008])}, "PaperDocument": {"110038": ("Paper Document", [405])}, "PapillaryCarcinomaInSitu": {"111336": ("Papillary carcinoma in-situ", [])}, "PapillaryMuscleExcluded": {"122620": ("Papillary Muscle Excluded", [3821])}, "PapillaryMuscleIncluded": {"122621": ("Papillary Muscle Included", [3821])}, "PapillaryMuscleIncludedExcluded": { "122670": ("Papillary Muscle Included/Excluded", []) }, "Parallel": {"111355": ("Parallel", [6152])}, "ParallelGrid": {"111644": ("Parallel grid", [10017])}, "ParallelImaging": {"113228": ("Parallel Imaging", [7260])}, "Parallelepiped": {"122566": ("Parallelepiped", [3453])}, "ParaspinalLine": { "112091": ("Paraspinal line", [6102, 6109, 6113, 6148, 7151, 7192, 9514]) }, "ParenchymalBand": {"112112": ("Parenchymal band", [6102, 6103])}, "ParentSpecimenIdentifier": {"111705": ("Parent Specimen Identifier", [])}, "ParentSpecimenType": {"111707": ("Parent specimen type", [])}, "ParentVesselFinding": {"122686": ("Parent Vessel Finding", [])}, "PartialFlatteningFilterBeam": { "130357": ("Partial Flattening Filter Beam", [9549]) }, "PartialRenderingForPresentation": { "121333": ("Partial Rendering for Presentation", [7006]) }, "PartialReport": {"121363": ("Partial report", [7009])}, "PartiallyEncapsulated": {"130593": ("Partially encapsulated", [6335, 6341, 6342])}, "PartiallySucceeded": {"111223": ("Partially Succeeded", [6042])}, "ParticleDisplacementMethod": {"130756": ("Particle Displacement Method", [12324])}, "ParticleVelocityMethod": {"130757": ("Particle Velocity Method", [12324])}, "PatencyTestInjection": {"130247": ("Patency Test Injection", [72])}, "Path": {"121055": ("Path", [])}, "PathLength": {"121211": ("Path length", [218, 6165, 7469, 7470])}, "PathVertex": {"121230": ("Path Vertex", [])}, "Path_Retired": {"121210": ("Path", [])}, "Pathology": {"111042": ("Pathology", [])}, "PathologyResults": {"111468": ("Pathology Results", [])}, "Patient": {"121025": ("Patient", [271, 272, 7450])}, "PatientAPDimension": {"128408": ("Patient AP Dimension", [10069])}, "PatientAdmittedToProcedureRoom": { "122002": ("Patient admitted to procedure room", [3402]) }, "PatientAdvanceDirectiveGiven": { "122005": ("Patient advance directive given", [3402]) }, "PatientAlert": {"122025": ("Patient alert", [3402])}, "PatientAlignmentProcedure": {"130638": ("Patient Alignment Procedure", [9577])}, "PatientAllergicToMediaContrast": { "110503": ("Patient allergic to media/contrast", [64, 9300, 9301]) }, "PatientAnatomyModel": {"130067": ("Patient Anatomy Model", [9507])}, "PatientAsleep": {"122028": ("Patient asleep", [3402])}, "PatientAssessmentPerformed": {"121165": ("Patient Assessment Performed", [])}, "PatientAssistedToTable": {"122007": ("Patient assisted to table", [3402])}, "PatientAttachedDoseControlObject": { "130405": ("Patient-Attached Dose Control Object", [9502, 9580]) }, "PatientAttenuationCharacteristics": { "130529": ("Patient Attenuation Characteristics", []) }, "PatientCalledToProcedureRoom": { "122001": ("Patient called to procedure room", [3402]) }, "PatientCharacteristics": {"121118": ("Patient Characteristics", [])}, "PatientClearanceInterlock": { "130741": ("Patient Clearance Interlock", [9561, 9568]) }, "PatientConditionPreventedContinuing": { "110515": ("Patient condition prevented continuing", [60, 9300, 9301, 9561]) }, "PatientConnectedToContinuousMonitoring": { "122009": ("Patient connected to continuous monitoring", [3402]) }, "PatientConsciousness": {"130865": ("Patient Consciousness", [3047])}, "PatientCoordinateSystemOrigin": { "130540": ("Patient Coordinate System Origin", [10074]) }, "PatientCoughed": {"122031": ("Patient coughed", [3402])}, "PatientDataUsedDuringPlanning": { "112361": ("Patient Data Used During Planning", []) }, "PatientDecisionToTerminateTreatment": { "130451": ("Patient decision to terminate treatment", []) }, "PatientDidNotArrive": {"110507": ("Patient did not arrive", [9300, 9301])}, "PatientDied": {"110504": ("Patient died", [9300, 9301, 9303, 9561])}, "PatientDischargedFromDepartment": { "122037": ("Patient discharged from department", [3402]) }, "PatientDisconnectedFromContinuousMonitoring": { "122032": ("Patient disconnected from continuous monitoring", [3402]) }, "PatientDisoriented": {"122020": ("Patient disoriented", [3402])}, "PatientDistractionDevice": { "130651": ("Patient Distraction Device", [9573, 9578]) }, "PatientElevation": {"130412": ("Patient elevation", [3034])}, "PatientEquivalentThickness": {"111638": ("Patient Equivalent Thickness", [])}, "PatientExposureToIonizingRadiation": { "121290": ("Patient exposure to ionizing radiation", []) }, "PatientFixationProcedure": {"130637": ("Patient Fixation Procedure", [9577])}, "PatientGivenPostProcedureInstruction": { "122036": ("Patient given post-procedure instruction", [3402]) }, "PatientGivenPreProcedureInstruction": { "122003": ("Patient given pre-procedure instruction", [3402]) }, "PatientHasRespiratoryDifficulty": { "122030": ("Patient has respiratory difficulty", [3402]) }, "PatientImage": {"112354": ("Patient Image", [])}, "PatientInformedConsentGiven": { "122004": ("Patient informed consent given", [3402]) }, "PatientLateralDimension": {"128409": ("Patient Lateral Dimension", [10069])}, "PatientLocationFiducial": {"128754": ("Patient Location Fiducial", [])}, "PatientModel": {"113815": ("Patient Model", [])}, "PatientModelDemographics": {"128427": ("Patient Model Demographics", [])}, "PatientModelRegistration": {"128456": ("Patient Model Registration", [])}, "PatientModelType": {"128417": ("Patient Model Type", [])}, "PatientMotion": {"128553": ("Patient motion", [10034])}, "PatientMotionInterlock": {"130479": ("Patient Motion Interlock", [9561, 9568])}, "PatientMotionManagementSetupProcedure": { "130639": ("Patient Motion Management Setup Procedure", [9577]) }, "PatientMovement": {"110518": ("Patient Movement", [4221, 4222, 9561])}, "PatientOrientation": {"113743": ("Patient Orientation", [])}, "PatientOrientationColumn": {"111043": ("Patient Orientation Column", [])}, "PatientOrientationModifier": {"113744": ("Patient Orientation Modifier", [])}, "PatientOrientationRow": {"111044": ("Patient Orientation Row", [])}, "PatientPosition": {"130410": ("Patient position", [3034])}, "PatientPositioningNote": {"130026": ("Patient Positioning Note", [])}, "PatientPositioningProblem": {"111209": ("Patient Positioning Problem", [4222])}, "PatientPositioningProcedureNote": { "130035": ("Patient Positioning Procedure Note", []) }, "PatientPregnant": {"110508": ("Patient pregnant", [9300, 9301])}, "PatientPreppedAndDraped": {"122008": ("Patient prepped and draped", [3402])}, "PatientPresentation": {"121110": ("Patient Presentation", [])}, "PatientPronouncedDead": {"122038": ("Patient pronounced dead", [3402])}, "PatientRadiationDoseModel": {"128500": ("Patient Radiation Dose Model", [])}, "PatientRadiationDoseModelData": { "128425": ("Patient Radiation Dose Model Data", []) }, "PatientRadiationDoseModelReference": { "128426": ("Patient Radiation Dose Model Reference", []) }, "PatientRadiationDoseReport": {"128401": ("Patient Radiation Dose Report", [])}, "PatientRecord": {"110110": ("Patient Record", [400])}, "PatientRefusedToContinueProcedure": { "110505": ("Patient refused to continue procedure", [9300, 9301, 9561]) }, "PatientReportsChestPain": {"122023": ("Patient reports chest pain", [3402])}, "PatientReportsDiscomfort": {"122022": ("Patient reports discomfort", [3402])}, "PatientReportsNausea": {"122021": ("Patient reports nausea", [3402])}, "PatientReportsNoPain": {"122024": ("Patient reports no pain", [3402])}, "PatientRepositioned": {"130455": ("Patient Repositioned", [9563])}, "PatientRestless": {"122026": ("Patient restless", [3402])}, "PatientRotationLongitudinal": { "130411": ("Patient rotation longitudinal", [3034]) }, "PatientSedated": {"122027": ("Patient sedated", [3402])}, "PatientSegmentedModel": {"128494": ("Patient Segmented Model", [10064])}, "PatientSetupNote": {"130028": ("Patient Setup Note", [])}, "PatientSetupPoint": {"130069": ("Patient Setup Point", [9504, 9574])}, "PatientSetupVerificationInputUsed": { "128217": ("Patient Setup Verification Input Used", [7010, 7025]) }, "PatientSetupVerificationResult": { "128191": ("Patient Setup Verification Result", [7010, 7023]) }, "PatientShieldingProcedure": {"130636": ("Patient Shielding Procedure", [9577])}, "PatientState": {"109054": ("Patient State", [])}, "PatientStatusOrEvent": {"121123": ("Patient Status or Event", [3401])}, "PatientSupport": {"128492": ("Patient Support", [10066])}, "PatientSupportOrigin": {"130538": ("Patient Support Origin", [10074])}, "PatientTableRelationship": {"113745": ("Patient Table Relationship", [])}, "PatientTakenForTreatmentOrSurgery": { "110506": ("Patient taken for treatment or surgery", [9300, 9301]) }, "PatientTransferredFrom": {"122128": ("Patient Transferred From", [])}, "PatientTransferredToCCU": {"122012": ("Patient transferred to CCU", [3402])}, "PatientTransferredToHoldingArea": { "122010": ("Patient transferred to holding area", [3402]) }, "PatientTransferredToMorgue": {"122039": ("Patient transferred to morgue", [3402])}, "PatientTransferredToSurgery": { "122011": ("Patient transferred to surgery", [3402]) }, "PatientUnresponsive": {"122029": ("Patient unresponsive", [3402])}, "PatientWeightExceedsEquipmentLimit": { "122764": ("Patient weight exceeds equipment limit", [3205]) }, "PatternEvent": {"130860": ("Pattern Event", [3047])}, "PatternProjection": {"114204": ("Pattern projection", [8201])}, "PeakActivityWorkload": {"122717": ("Peak activity workload", [])}, "PeakBloodPressure": {"125329": ("Peak Blood Pressure", [12304])}, "PeakDoubleProduct": {"122718": ("Peak Double Product", [])}, "PeakEjectionRate": {"122616": ("Peak Ejection Rate", [])}, "PeakEjectionTime": {"122617": ("Peak Ejection Time", [])}, "PeakFillingRate": {"122618": ("Peak Filling Rate", [])}, "PeakFillingTime": {"122619": ("Peak Filling Time", [])}, "PeakFlowRateInPhaseActivity": {"130244": ("Peak Flow Rate in Phase Activity", [])}, "PeakLongitudinalLagrangianStrain": { "130671": ("Peak Longitudinal Lagrangian Strain", [12304, 12311]) }, "PeakOfThermalCardiacOutputBolus": { "109028": ("Peak of thermal cardiac output bolus", [3337]) }, "PeakPressureInPhaseActivity": {"130245": ("Peak Pressure in Phase Activity", [])}, "PeakStressState": {"109095": ("Peak stress state", [])}, "PeakTissueVelocity": {"125330": ("Peak Tissue Velocity", [12304])}, "PeakValueWithinROI": {"126031": ("Peak Value Within ROI", [7464])}, "PectoralMuscleOutline": {"111045": ("Pectoral Muscle Outline", [])}, "PediatricCardiacUltrasoundReport": { "125195": ("Pediatric Cardiac Ultrasound Report", [7000, 12245]) }, "PediatricImagingSpecialty": {"128016": ("Pediatric Imaging Specialty", [7449])}, "PediatricImagingSubjectMatter": { "128737": ("Pediatric imaging subject matter", [7017]) }, "PediatricRadiology": {"128177": ("Pediatric Radiology", [7030])}, "Pegdinetanib89Zr": {"126728": ("Pegdinetanib ^89^Zr", [4021])}, "PelvisAndUterus": {"125011": ("Pelvis and Uterus", [])}, "PercentFibroglandularTissue": { "111046": ("Percent Fibroglandular Tissue", [10069]) }, "PercentageOfExpectedBeamOnTimeOfRadiation": { "130800": ("Percentage of expected beam-on time of Radiation", []) }, "PercentageOfVascularCalcification": { "112198": ("Percentage of Vascular Calcification", [6142]) }, "PercentileRankingOfMeasurement": { "121415": ("Percentile Ranking of measurement", [221, 227, 7465]) }, "PercutaneousCoronaryIntervention": { "122061": ("Percutaneous Coronary Intervention", [3739]) }, "PercutaneousEntryAction": {"121156": ("Percutaneous Entry Action", [])}, "PercutaneousSiliconeInjection": { "111483": ("Percutaneous silicone injection", [6058, 6059]) }, "Perfluorocarbon": {"130605": ("Perfluorocarbon", [6350])}, "PerformanceOfCTForDetectionOfPulmonaryEmbolismInAdults": { "112185": ( "Performance of CT for Detection of Pulmonary Embolism in Adults", [6136], ) }, "PerformanceOfHighResolutionCTOfTheLungsInAdults": { "112186": ("Performance of High-Resolution CT of the Lungs in Adults", [6136]) }, "PerformanceOfPediatricAndAdultChestRadiographyACR": { "112035": ("Performance of Pediatric and Adult Chest Radiography, ACR", [6136]) }, "PerformanceOfPediatricAndAdultThoracicCT": { "112184": ("Performance of Pediatric and Adult Thoracic CT", [6136]) }, "PerformedImagingAgentAdministration": { "130227": ("Performed Imaging Agent Administration", []) }, "PerformedProcedureStep": {"113016": ("Performed Procedure Step", [7012, 10000])}, "PerformedProcedureStepSOPClassUID": { "121127": ("Performed Procedure Step SOP Class UID", []) }, "PerformedProcedureStepSOPInstanceUID": { "121126": ("Performed Procedure Step SOP Instance UID", [10001]) }, "Performing": {"121094": ("Performing", [7453])}, "PerformingPhysician": {"121114": ("Performing Physician", [])}, "Perfusion": {"110831": ("Perfusion", [218, 7180, 7469, 11006])}, "PerfusionAnalysisByArterialSpinLabelingMRTechnique": { "126302": ( "Perfusion analysis by Arterial Spin Labeling MR technique", [4102, 4106], ) }, "PerfusionAnalysisByIVIodinatedContrastCTTechnique": { "126301": ( "Perfusion analysis by IV Iodinated Contrast CT technique", [4102, 4106], ) }, "PerfusionAnalysisByStableXenonCTTechnique": { "126300": ("Perfusion analysis by Stable Xenon CT technique", [4102, 4106]) }, "PerfusionAnalysisBySusceptibilityMRTechnique": { "126303": ("Perfusion analysis by Susceptibility MR technique", [4102, 4106]) }, "PerfusionImageAnalysis": {"129104": ("Perfusion image analysis", [7203])}, "PeriOperativePhotographicImaging": { "112700": ("Peri-operative Photographic Imaging", [8131]) }, "PeriProceduralMIOccurred": {"122179": ("Peri-procedural MI occurred", [])}, "PerilesionalWhiteMatter": {"110706": ("Perilesional White Matter", [7710, 8134])}, "PerimeterOutline": {"121057": ("Perimeter outline", [])}, "PerimeterOutline_Retired": {"121213": ("Perimeter Outline", [])}, "PeripheralDuctPapillomas": { "111299": ("Peripheral duct papillomas", [6030, 6032]) }, "PeripheralInferior": {"111916": ("Peripheral-inferior", [4207])}, "PeripheralInferiorNasal": {"111917": ("Peripheral-inferior nasal", [4207])}, "PeripheralInferiorTemporal": {"111915": ("Peripheral-inferior temporal", [4207])}, "PeripheralNasal": {"111918": ("Peripheral-nasal", [4207])}, "PeripheralSuperior": {"111912": ("Peripheral-superior", [4207])}, "PeripheralSuperiorNasal": {"111919": ("Peripheral-superior nasal", [4207])}, "PeripheralSuperiorTemporal": {"111913": ("Peripheral-superior temporal", [4207])}, "PeripheralTemporal": {"111914": ("Peripheral-temporal", [4207])}, "PerivascularAdiposeTissueFatAttenuationIndex": { "130408": ("Perivascular adipose tissue fat attenuation index", []) }, "PersistentDelayedPhaseType1Curve": { "130597": ("Persistent delayed phase: Type 1 curve", [6335, 6345, 6346]) }, "Person": {"121006": ("Person", [270])}, "PersonAdministeringDrugContrast": { "121152": ("Person administering drug/contrast", []) }, "PersonID": {"113871": ("Person ID", [])}, "PersonIDIssuer": {"113872": ("Person ID Issuer", [])}, "PersonName": {"113870": ("Person Name", [])}, "PersonObserverLoginName": {"128774": ("Person Observer's Login Name", [])}, "PersonObserverName": {"121008": ("Person Observer Name", [])}, "PersonObserverOrganizationName": { "121009": ("Person Observer's Organization Name", []) }, "PersonObserverRoleInTheOrganization": { "121010": ("Person Observer's Role in the Organization", []) }, "PersonObserverRoleInThisProcedure": { "121011": ("Person Observer's Role in this Procedure", []) }, "PersonRoleInOrganization": {"113874": ("Person Role in Organization", [])}, "PersonRoleInProcedure": {"113875": ("Person Role in Procedure", [])}, "PersonalBreastCancerHistory": { "111550": ("Personal breast cancer history", [6081, 6087]) }, "PersonalHistoryOfBreastCancerWithBreastConservationTherapy": { "111421": ( "Personal history of breast cancer with breast conservation therapy", [6051], ) }, "PersonalHistoryOfBreastCancerWithMastectomy": { "111124": ("Personal history of breast cancer with mastectomy", [6051]) }, "PersonnelArrived": {"122041": ("Personnel Arrived", [3404])}, "PersonnelDeparted": {"122042": ("Personnel Departed", [3404])}, "Phantom": {"113681": ("Phantom", [])}, "PhantomTumor": {"112123": ("Phantom tumor (pseudotumor)", [6102, 6104])}, "PharmacologicAndExerciseStressTest": { "121437": ("Pharmacologic and exercise stress test", []) }, "PharmacologicalStressAgentDose": { "122715": ("Pharmacological Stress Agent Dose", []) }, "PharmacologicalStressAgentDoseRate": { "122705": ("Pharmacological Stress Agent Dose Rate", []) }, "PhaseContrastIllumination": {"111747": ("Phase contrast illumination", [8123])}, "PhaseOfAnimalHandling": {"127006": ("Phase of animal handling", [])}, "PhasedBeamSteering": {"125259": ("Phased beam steering", [12034])}, "Phonocardiogram": {"109114": ("Phonocardiogram", [3000])}, "Photoacoustic": {"PA": ("Photoacoustic", [29, 30, 33])}, "PhotogrammetricImaging3DCAMModel": { "129020": ("Photogrammetric Imaging 3D CAM model", [7061]) }, "PhotonEnergy": {"110857": ("Photon Energy", [7182])}, "PhotonFixedAperture": {"130344": ("Photon Fixed Aperture", [9541, 9545])}, "PhotopicLight": {"111629": ("Photopic light", [4203])}, "PhysicalCompensator": {"130340": ("Physical Compensator", [9542])}, "PhysicalExaminationResults": { "111423": ("Physical Examination Results", [6052, 6053]) }, "PhysicalForce": {"109133": ("Physical force", [])}, "PhysicalSupport": {"128492": ("Physical Support", [])}, "Physician": {"121081": ("Physician", [])}, "PhysicianDecisionToTerminateTreatment": { "130452": ("Physician decision to terminate treatment", []) }, "PhysicianNote": {"121173": ("Physician Note", [3401])}, "PhysicianReviewInputUsed": { "128213": ("Physician Review Input Used", [7010, 7025]) }, "PhysicistReviewInputUsed": { "128214": ("Physicist Review Input Used", [7010, 7025]) }, "PhysicsAssistant": {"128678": ("Physics Assistant", [9555, 9562])}, "PhysiologicalAudioSignal": {"109115": ("Physiological audio signal", [3000])}, "PhysiologicalChallenges": {"109059": ("Physiological challenges", [])}, "PiezocompositeTransducer": {"130815": ("Piezocomposite Transducer", [11003])}, "PinatuzumabVedotin89Zr": {"126725": ("Pinatuzumab vedotin ^89^Zr", [4021])}, "PineChipBedding": {"127234": ("Pine chip bedding", [605])}, "PineShavingBedding": {"127235": ("Pine shaving bedding", [605])}, "Pinning": {"112318": ("Pinning", [7310])}, "PitchFactor": {"113828": ("Pitch Factor", [])}, "PittsburghCompoundBC11": {"126500": ("Pittsburgh compound B C^11^", [4021])}, "PixelByPixelAddition": {"113042": ("Pixel by pixel addition", [7203])}, "PixelByPixelDivision": {"113046": ("Pixel by pixel division", [7203])}, "PixelByPixelMask": {"113047": ("Pixel by pixel mask", [7203])}, "PixelByPixelMaximum": {"113048": ("Pixel by pixel Maximum", [7203])}, "PixelByPixelMean": {"113049": ("Pixel by pixel mean", [7203])}, "PixelByPixelMinimum": {"113051": ("Pixel by pixel Minimum", [7203])}, "PixelByPixelMultiplication": {"113053": ("Pixel by pixel multiplication", [7203])}, "PixelByPixelSubtraction": {"113062": ("Pixel by pixel subtraction", [7203])}, "PixelDataColumns": {"110911": ("Pixel Data Columns", [])}, "PixelDataRows": {"110910": ("Pixel Data Rows", [])}, "PixelFaultsEvaluation": {"109706": ("Pixel faults evaluation", [8300])}, "PixelatedSpiculations": {"113666": ("Pixelated spiculations", [6166])}, "PlacerNumber": {"121020": ("Placer Number", [])}, "Plan": {"PLAN": ("Plan", [32, 33])}, "PlanComparisonInputUsed": {"128220": ("Plan Comparison Input Used", [7010])}, "PlanQualityAssuranceInputUsed": { "128215": ("Plan Quality Assurance Input Used", [7010, 7025]) }, "PlanarMatrixUltrasoundTransducerGeometry": { "130808": ("Planar matrix ultrasound transducer geometry", [12033]) }, "PlaneA": {"113620": ("Plane A", [10003])}, "PlaneB": {"113621": ("Plane B", [10003])}, "PlaneScanPattern": {"125241": ("Plane scan pattern", [12032])}, "PlaneThroughAnteriorExtent": {"128128": ("Plane through Anterior Extent", [1010])}, "PlaneThroughCenter": {"128130": ("Plane through Center", [1010])}, "PlaneThroughDistalExtent": {"128123": ("Plane through Distal Extent", [1010])}, "PlaneThroughInferiorExtent": {"128121": ("Plane through Inferior Extent", [1010])}, "PlaneThroughLateralExtent": {"128125": ("Plane through Lateral Extent", [1010])}, "PlaneThroughLeftmostExtent": {"128126": ("Plane through Leftmost Extent", [1010])}, "PlaneThroughMedialExtent": {"128124": ("Plane through Medial Extent", [1010])}, "PlaneThroughPosteriorExtent": { "128129": ("Plane through Posterior Extent", [1010]) }, "PlaneThroughProximalExtent": {"128122": ("Plane through Proximal Extent", [1010])}, "PlaneThroughRightmostExtent": { "128127": ("Plane through Rightmost Extent", [1010]) }, "PlaneThroughSuperiorExtent": {"128120": ("Plane through Superior Extent", [1010])}, "Planimetry": {"125220": ("Planimetry", [12227, 12229])}, "PlannedImagingAgentAdministration": { "130226": ("Planned Imaging Agent Administration", []) }, "PlannedImagingAgentAdministrationProcedureReport": { "130182": ("Planned Imaging Agent Administration Procedure Report", []) }, "PlannedImagingAgentAdministrationSOPInstance": { "130236": ("Planned Imaging Agent Administration SOP Instance", []) }, "PlanningImagingNote": {"130030": ("Planning Imaging Note", [])}, "PlanningInformationForIntraoperativeUsage": { "112367": ("Planning Information for Intraoperative Usage", []) }, "PlanningIntent": {"129013": ("Planning Intent", [7064])}, "PlanningMethod": {"112375": ("Planning Method", [])}, "PlanningOrganAtRiskVolume": {"130057": ("Planning Organ At Risk Volume", [9535])}, "PlaqueArea": {"122542": ("Plaque Area", [])}, "PlaqueBurden": {"122354": ("Plaque Burden", [])}, "PlaquePlusMediaCrossSectionalArea": { "122334": ("Plaque plus Media Cross-Sectional Area", [3482]) }, "PlaquePlusMediaEccentricityIndex": { "122344": ("Plaque plus Media Eccentricity Index", [3484]) }, "PlaquePlusMediaThickness": {"122331": ("Plaque Plus Media Thickness", [3481])}, "PlaqueRupture": {"122363": ("Plaque Rupture", [3491])}, "PlasmaDisplay": {"109993": ("Plasma Display", [8303])}, "PlateauDelayedPhaseType2Curve": { "130598": ("Plateau delayed phase: Type 2 curve", [6335, 6345, 6346]) }, "Pleonemia": {"112081": ("Pleonemia", [6108])}, "PointCloudAlgorithmic": {"114208": ("Point Cloud Algorithmic", [8201])}, "PointShearWaveElastography": { "130616": ("Point Shear Wave Elastography", [6058, 12224]) }, "PoiseuilleResistance": {"122549": ("Poiseuille Resistance", [])}, "PolarToRectangularScanConversion": { "113093": ("Polar to Rectangular Scan Conversion", [7203]) }, "PolarizingFilter": {"111607": ("Polarizing filter", [])}, "PolatuzumabVedotin89Zr": {"126726": ("Polatuzumab vedotin ^89^Zr", [4021])}, "PolypStalkWidth": {"112232": ("Polyp stalk width", [6212])}, "PolyurethaneImplant": {"111482": ("Polyurethane implant", [6058, 6059])}, "PoorContrastTiming": {"130579": ("Poor contrast timing", [6315, 6317])}, "PoorFOVSelection": {"130577": ("Poor FOV selection", [6315])}, "PoorImageQuality": {"122742": ("Poor image quality", [3114])}, "PoorSNR": {"130578": ("Poor SNR", [6315])}, "PoorlyDemarcated": {"112141": ("Poorly demarcated", [6120])}, "PopulationAveragedAIF": {"126361": ("Population Averaged AIF", [4103, 4106])}, "PopulationDescription": {"121405": ("Population description", [])}, "PortableMediaImporterEquipment": { "MEDIM": ("Portable Media Importer Equipment", [7005]) }, "Portacath": {"112172": ("Portacath", [6102, 6138, 6404, 7151, 7193])}, "PositionFrameOfReference": {"111708": ("Position Frame of Reference", [])}, "PositionOfDistalBorder": {"122529": ("Position of Distal Border", [])}, "PositionOfProximalBorder": {"122528": ("Position of Proximal Border", [])}, "PositionReferenceIndicator": {"127451": ("Position reference indicator", [])}, "PositionSensor": {"POS": ("Position Sensor", [29, 30, 33])}, "PositionerIsocenterDetectorRotationAngle": { "128759": ("Positioner Isocenter Detector Rotation Angle", []) }, "PositionerIsocenterDetectorRotationEndAngle": { "128762": ("Positioner Isocenter Detector Rotation End Angle", []) }, "PositionerIsocenterPrimaryAngle": { "128757": ("Positioner Isocenter Primary Angle", []) }, "PositionerIsocenterPrimaryEndAngle": { "128760": ("Positioner Isocenter Primary End Angle", []) }, "PositionerIsocenterSecondaryAngle": { "128758": ("Positioner Isocenter Secondary Angle", []) }, "PositionerIsocenterSecondaryEndAngle": { "128761": ("Positioner Isocenter Secondary End Angle", []) }, "PositionerPrimaryAngle": {"112011": ("Positioner Primary Angle", [])}, "PositionerPrimaryEndAngle": {"113739": ("Positioner Primary End Angle", [])}, "PositionerSecondaryAngle": {"112012": ("Positioner Secondary Angle", [])}, "PositionerSecondaryEndAngle": {"113740": ("Positioner Secondary End Angle", [])}, "Positioning": {"111209": ("Positioning", [6041, 6135, 7011])}, "PositiveDCE": {"130600": ("Positive DCE", [6335, 6345, 6346])}, "PositiveInfinity": {"114002": ("Positive Infinity", [42, 43])}, "PositronEmissionTomography": { "PT": ("Positron emission tomography", [29, 30, 33]) }, "PostAdministrationMeasuredActivity": { "113509": ("Post-Administration Measured Activity", []) }, "PostCoordinatedMeasurements": {"125302": ("Post-coordinated Measurements", [])}, "PostHyperventilation": {"130415": ("Post-hyperventilation", [3038])}, "PostIntervention": {"109124": ("Post-intervention", [31])}, "PostInterventionStenosisMeasurement": { "122108": ("Post-Intervention Stenosis Measurement", []) }, "PostInterventionTIMIFlow": {"122110": ("Post-Intervention TIMI Flow", [])}, "PostMenopausalPatient": {"111554": ("Post menopausal patient", [6081, 6087])}, "PostProcedureMammogramsForMarkerPlacement": { "111120": ("Post Procedure Mammograms for Marker Placement", [6026]) }, "PostReductionMammoplasty": { "111291": ("Post reduction mammoplasty", [6030, 6031]) }, "PostVoiding": {"109135": ("Post voiding", [91, 9272])}, "PosteriorAcousticFeatures": {"111366": ("Posterior acoustic features", [])}, "PosteriorCorneaSurfaceMeasurementMethod": { "111759": ("Posterior Cornea Surface Measurement Method", [4242]) }, "PosteriorEnhancement": {"111368": ("Posterior enhancement", [6155])}, "PosteriorFirst": {"126832": ("posterior first", [21])}, "PosteriorJunctionLine": { "112089": ("Posterior junction line", [6102, 6109, 6112, 7151, 7192, 9514]) }, "PosteriorLens": {"111779": ("Posterior Lens", [4233])}, "PosteriorShadowing": {"111369": ("Posterior shadowing", [6155])}, "PosteriorSurfaceOfTheRPE": { "128299": ("Posterior surface of the RPE", [4273, 7151, 7192, 9514]) }, "PosteriorToAnterior": {"110871": ("Posterior To Anterior", [7185])}, "PosteriorTrachealStripe": { "112092": ( "Posterior tracheal stripe", [6102, 6109, 6113, 6148, 7151, 7192, 9514], ) }, "Posttreatment": {"126074": ("Posttreatment", [6146])}, "PowerDoppler": {"125230": ("Power Doppler", [])}, "PreAdministrationMeasuredActivity": { "113508": ("Pre-Administration Measured Activity", []) }, "PreBiopsyLocalizationOfProstateLesion": { "130588": ("Pre-biopsy localization of prostate lesion", [6327]) }, "PreCoordinatedMeasurements": {"125301": ("Pre-coordinated Measurements", [])}, "PreEjectionPeriod": {"125321": ("Pre-ejection Period", [12307])}, "PreHeatedPad": {"127254": ("Pre-heated pad", [635])}, "PreIntervention": {"109123": ("Pre-intervention", [31])}, "PreMedication": {"123012": ("Pre-Medication", [76])}, "PrePectoralImplant": {"111485": ("Pre-pectoral implant", [6058, 6059])}, "PrePlanningResult": {"128184": ("Pre-Planning Result", [7010, 7023])}, "PreProcedureLog": {"122072": ("Pre-procedure log", [3407])}, "PreSurgicalAnatomy": {"130833": ("Pre-surgical anatomy", [9272])}, "PreamplifierConnected": {"130889": ("Preamplifier connected", [3039])}, "PreamplifierDisconnected": {"130890": ("Preamplifier disconnected", [3039])}, "PreclinicalSmallAnimalImagingAcquisitionContext": { "127001": ("Preclinical Small Animal Imaging Acquisition Context", []) }, "PredecessorContainingGroupOfImagingSubjects": { "113130": ("Predecessor containing group of imaging subjects", [7202]) }, "PregnancyStatus": {"111532": ("Pregnancy Status", [])}, "PreliminaryReport": {"121362": ("Preliminary report", [7009, 9233])}, "PreparationForImaging": {"127104": ("Preparation for imaging", [634])}, "PreparationRoom": {"127371": ("Preparation room", [603])}, "PrescriptionIdentifier": {"113516": ("Prescription Identifier", [])}, "PrescriptionRadiationDose": { "130009": ("Prescription Radiation Dose", [9500, 9529]) }, "PrescriptionVisualAcuity": {"111687": ("Prescription Visual Acuity", [4216])}, "PresenceOfProperty": {"121052": ("Presence of property", [])}, "PresenceUndetermined": {"121059": ("Presence Undetermined", [])}, "Present": {"121053": ("Present", [])}, "PresentationOptionalRenderingDeviceMayPresent": { "111151": ("Presentation Optional: Rendering device may present", [6034]) }, "PresentationRequiredRenderingDeviceIsExpectedToPresent": { "111150": ( "Presentation Required: Rendering device is expected to present", [6034], ) }, "PresentationState": {"PR": ("Presentation State", [32, 33])}, "PressureAboveAdjustmentLimit": { "130151": ("Pressure above adjustment limit", [71]) }, "PressureAboveWarningLimit": {"130150": ("Pressure above warning limit", [71])}, "PressureAtDpDtMax": {"122199": ("Pressure at dp/dt max", [3611])}, "PressureDropAtSFR": {"122551": ("Pressure Drop at SFR", [])}, "PressureLimit": {"130193": ("Pressure Limit", [])}, "PressureVsTime": {"130230": ("Pressure vs Time", [])}, "PreviousFetalMalformationSyndrome": { "111570": ("Previous fetal malformation/syndrome", [6087, 6088]) }, "PreviousFinding": {"121069": ("Previous Finding", [7002])}, "PreviousFindings": {"121068": ("Previous Findings", [])}, "PreviousLBWOrIUGRBirth": {"111569": ("Previous LBW or IUGR birth", [6087, 6088])}, "PreviousProcedure": {"111531": ("Previous Procedure", [])}, "PreviousRHNegativeOrBloodDyscrasiaAtBirth": { "111571": ("Previous RH negative or blood dyscrasia at birth", [6087, 6088]) }, "PreviousReports": {"111549": ("Previous Reports", [])}, "PreviousTreatmentNote": {"130029": ("Previous Treatment Note", [])}, "PrimaryComplex": {"112059": ("Primary complex", [6102, 6104])}, "PrimaryFluenceMonitoringSystemInterlock": { "130475": ("Primary Fluence Monitoring System Interlock", [9561, 9568]) }, "PrimaryInterventionDevice": {"122111": ("Primary Intervention Device", [])}, "PrimaryLevel": {"128725": ("Primary level", [7016])}, "Print": {"110008": ("Print", [9231])}, "PriorProcedureDescriptions": {"121066": ("Prior Procedure Descriptions", [])}, "PriorReportForCurrentPatient": { "122075": ("Prior report for current patient", [3407]) }, "PriorToVoiding": {"109134": ("Prior to voiding", [91, 9272])}, "Probabilistic": {"113212": ("Probabilistic", [7262])}, "ProbabilisticTrackingAlgorithm": { "113212": ("Probabilistic Tracking Algorithm", []) }, "Probability": {"122157": ("Probability", [])}, "ProbabilityOfCancer": {"111047": ("Probability of cancer", [6048])}, "ProcedureActionDuration": {"121128": ("Procedure Action Duration", [])}, "ProcedureActionItemID": {"121124": ("Procedure Action Item ID", [])}, "ProcedureCharacteristics": {"130530": ("Procedure Characteristics", [])}, "ProcedureCode": {"121023": ("Procedure Code", [])}, "ProcedureDatetime": {"122146": ("Procedure DateTime", [])}, "ProcedureDescription": {"121065": ("Procedure Description", [7002])}, "ProcedureEnvironmentalCharacteristics": { "122222": ("Procedure Environmental Characteristics", []) }, "ProcedureLogging": {"LOG": ("Procedure Logging", [30])}, "ProcedureModifier": {"111464": ("Procedure Modifier", [])}, "ProcedureNote": {"121174": ("Procedure Note", [3401])}, "ProcedureRecord": {"110111": ("Procedure Record", [400])}, "ProcedureReported": {"121058": ("Procedure reported", [6052, 6053])}, "ProcedureResult": {"122177": ("Procedure Result", [])}, "ProcedureStepNumber": {"109060": ("Procedure Step Number", [])}, "ProcedureStepToThisPoint": {"113970": ("Procedure Step To This Point", [10000])}, "ProcedureStudyComponentUID": {"121019": ("Procedure Study Component UID", [])}, "ProcedureStudyInstanceUID": {"121018": ("Procedure Study Instance UID", [])}, "ProcedureTimeBase": {"122701": ("Procedure time base", [])}, "ProcessedKeyObjectSelection": { "130753": ("Processed Key Object Selection", [7031]) }, "ProcessingEquipment": {"109102": ("Processing Equipment", [7005])}, "ProcessingStepDescription": {"111703": ("Processing step description", [])}, "ProcessingType": {"111701": ("Processing type", [])}, "Profusion": {"112151": ("Profusion", [6123])}, "ProgesteroneReceptor": {"111476": ("Progesterone receptor", [])}, "ProgrammableInjectorDevice": {"130218": ("Programmable Injector Device", [])}, "ProgrammedHoldStarted": {"130266": ("Programmed hold started", [71])}, "ProjectionEponymousName": {"113946": ("Projection Eponymous Name", [])}, "ProjectionXRay": {"113704": ("Projection X-Ray", [])}, "ProliferativeActivity": {"126036": ("Proliferative Activity", [7466])}, "ProspectiveGating": {"109081": ("Prospective gating", [3104])}, "ProstateImagingFindings": {"130553": ("Prostate Imaging Findings", [])}, "ProstateMRIRelevantProcedureInformation": { "130552": ("Prostate MRI relevant procedure information", []) }, "ProstateRelationalMeasurements": { "130556": ("Prostate relational measurements", []) }, "ProstheticFabrication": {"129015": ("Prosthetic Fabrication", [7064])}, "ProstheticShaftAugment": {"112316": ("Prosthetic Shaft Augment", [7307, 7308])}, "ProtocolNotFollowed": {"130570": ("Protocol not followed", [6314])}, "ProtocolStage": {"109055": ("Protocol Stage", [])}, "ProtocolTimePointIdentifier": {"126071": ("Protocol Time Point Identifier", [])}, "ProtonDensity": {"113058": ("Proton Density", [218, 7180, 7469])}, "ProtonDensityWeightedMRSignalIntensity": { "110803": ("Proton Density Weighted MR Signal Intensity", [218, 7180, 7469]) }, "ProximalFindingSite": {"121116": ("Proximal Finding Site", [])}, "ProximalIsovelocitySurfaceArea": { "125216": ("Proximal Isovelocity Surface Area", [12227, 12229, 12231]) }, "ProximalReference": {"122380": ("Proximal Reference", [3486])}, "ProximalStentMargin": {"122385": ("Proximal Stent Margin", [3487])}, "PseudoangiomatousStromalHyperplasia": { "111292": ("Pseudoangiomatous stromal hyperplasia", [6030, 6031]) }, "Pseudoplaque": {"112068": ("Pseudoplaque", [6102, 6104])}, "PulmonaryArterialContentFcpa": { "122188": ("Pulmonary Arterial Content (FCpa)", [3529]) }, "PulmonaryFlow": {"122161": ("Pulmonary Flow", [3618])}, "PulmonaryImagingSubjectMatter": { "128729": ("Pulmonary imaging subject matter", [7017]) }, "PulmonaryVenousContentFcpv": { "122189": ("Pulmonary Venous Content (FCpv)", [3529]) }, "PulseRate": {"113791": ("Pulse Rate", [])}, "PulseSequenceName": {"128230": ("Pulse Sequence Name", [])}, "PulseStrength": {"122195": ("Pulse Strength", [])}, "PulseTrainDefinition": {"109063": ("Pulse train definition", [])}, "PulseWidth": {"113793": ("Pulse Width", [])}, "Pulsed": {"113631": ("Pulsed", [10004])}, "QANode": {"130366": ("QA Node", [9556])}, "QANodePair": {"130365": ("QA Node Pair", [9556])}, "QAProcessNote": {"130036": ("QA Process Note", [])}, "QWave": {"109042": ("Q wave", [3339])}, "QuadrantLocation": {"111048": ("Quadrant location", [])}, "QuadraticCellKillFactor": {"130089": ("Quadratic Cell Kill Factor", [])}, "QualitativeAnalysis": {"122145": ("Qualitative Analysis", [])}, "QualitativeDifference": {"111049": ("Qualitative Difference", [])}, "QualityAssessment": {"111050": ("Quality Assessment", [])}, "QualityControl": {"110002": ("Quality Control", [6051, 6058, 6061, 9231])}, "QualityControlIntent": {"113680": ("Quality Control Intent", [3629, 7031, 7064])}, "QualityControlMaterialImage": { "130750": ("Quality control material image", [7201]) }, "QualityControlStandard": {"111051": ("Quality Control Standard", [])}, "QualityFinding": {"111052": ("Quality Finding", [])}, "QualityIssue": {"113010": ("Quality Issue", [7010])}, "QuantitativeAnalysis": {"122144": ("Quantitative Analysis", [])}, "QuantitativeArteriographyReport": { "122291": ("Quantitative Arteriography Report", []) }, "QuantitativeVentriculographyReport": { "122292": ("Quantitative Ventriculography Report", []) }, "QuantityAdministered": {"121382": ("Quantity administered", [3410])}, "QuantityOfMaterial": {"121146": ("Quantity of Material", [])}, "Query": {"110112": ("Query", [400])}, "QuotationMode": {"121001": ("Quotation Mode", [])}, "QuotedSource": {"121002": ("Quoted Source", [])}, "R1": {"126393": ("R1", [218, 7180, 7469])}, "R150789Zr": {"126518": ("R1507 ^89^Zr", [4021])}, "R2": {"126394": ("R2", [218, 7180, 7469])}, "R2Coefficient": {"126220": ("R2-Coefficient", [218, 7180, 7469])}, "R2Star": {"126395": ("R2*", [218, 7180, 7469])}, "RCARegionInLAOProjection": {"122471": ("RCA Region in LAO Projection", [3461])}, "RCARegionInRAOProjection": {"122465": ("RCA Region in RAO Projection", [3460])}, "RCARegionInROAProjection": {"122465": ("RCA Region in ROA Projection", [])}, "RCoefficient": {"113057": ("R-Coefficient", [218, 7180, 7469])}, "RDSRFrameOfReferenceDescription": { "130507": ("RDSR Frame of Reference Description", []) }, "RDSRFrameOfReferenceOrigin": {"130506": ("RDSR Frame of Reference Origin", [])}, "RECIST": {"112022": ("RECIST", [])}, "RECIST1Point0": {"126080": ("RECIST 1.0", [6147])}, "RECIST1Point1": {"126081": ("RECIST 1.1", [6147])}, "RGBBComponent": {"110836": ("RGB B Component", [218, 7180, 7186, 7469])}, "RGBGComponent": {"110835": ("RGB G Component", [218, 7180, 7186, 7469])}, "RGBRComponent": {"110834": ("RGB R Component", [218, 7180, 7186, 7469])}, "RO532344189Zr": {"126755": ("RO5323441 ^89^Zr", [4021])}, "RO54290889Zr": {"126756": ("RO542908 ^89^Zr", [4021])}, "RO692496311C": {"126719": ("RO6924963 ^11^C", [4021])}, "RO693164311C": {"126720": ("RO6931643 ^11^C", [4021])}, "RO695894818F": {"126757": ("RO6958948 ^18^F", [4021])}, "ROIDepth": {"130613": ("ROI Depth", [12308])}, "RPLGD": {"128709": ("RPLGD", [7026, 7027, 7151, 7193])}, "RRInterval": { "122182": ( "R-R interval", [ 3613, 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "RTBeamEnergy": {"130034": ("RT Beam Energy", [])}, "RTBrachyTreatment": {"121735": ("RT Brachy Treatment", [9241])}, "RTDose": {"RTDOSE": ("RT Dose", [32, 33])}, "RTDoseCalculationStructure": { "130042": ("RT Dose Calculation Structure", [9502, 9503]) }, "RTGeometricInformation": {"130043": ("RT Geometric Information", [9502, 9580])}, "RTImage": {"RTIMAGE": ("RT Image", [29, 30, 33])}, "RTImageGuidedPatientPositioningAndTreatmentDelivery": { "121736": ("RT Image-Guided Patient Positioning and Treatment Delivery", [9241]) }, "RTMachineQA": {"121730": ("RT Machine QA", [9241])}, "RTPatientPositionAcquisitionCTKv": { "121707": ("RT Patient Position Acquisition, CT kV", [9242, 9260, 9263, 9266]) }, "RTPatientPositionAcquisitionCTMV": { "121708": ("RT Patient Position Acquisition, CT MV", [9242, 9260, 9264, 9266]) }, "RTPatientPositionAcquisitionConeBeamCTKv": { "130785": ( "RT Patient Position Acquisition, Cone-Beam CT kV", [9242, 9260, 9263, 9266], ) }, "RTPatientPositionAcquisitionConeBeamCTMV": { "130787": ( "RT Patient Position Acquisition, Cone-Beam CT MV", [9242, 9260, 9264, 9266], ) }, "RTPatientPositionAcquisitionConventionalCTKv": { "130786": ( "RT Patient Position Acquisition, Conventional CT kV", [9242, 9260, 9263, 9266], ) }, "RTPatientPositionAcquisitionConventionalCTMV": { "130788": ( "RT Patient Position Acquisition, Conventional CT MV", [9242, 9260, 9264, 9266], ) }, "RTPatientPositionAcquisitionDualPlaneKv": { "121705": ("RT Patient Position Acquisition, dual plane kV", [9260]) }, "RTPatientPositionAcquisitionDualPlaneKvMV": { "121706": ("RT Patient Position Acquisition, dual plane kV/MV", [9260]) }, "RTPatientPositionAcquisitionDualPlaneMV": { "121703": ("RT Patient Position Acquisition, dual plane MV", [9260]) }, "RTPatientPositionAcquisitionFilmCassetteKv": { "130784": ( "RT Patient Position Acquisition, Film Cassette kV", [9242, 9260, 9263, 9265], ) }, "RTPatientPositionAcquisitionFilmCassetteMV": { "130783": ( "RT Patient Position Acquisition, Film Cassette MV", [9242, 9260, 9264, 9265], ) }, "RTPatientPositionAcquisitionIntegratedDoseMV": { "130782": ( "RT Patient Position Acquisition, Integrated Dose MV", [9242, 9260, 9264, 9265], ) }, "RTPatientPositionAcquisitionMR": { "121737": ("RT Patient Position Acquisition, MR", [9242, 9273]) }, "RTPatientPositionAcquisitionOptical": { "121709": ("RT Patient Position Acquisition, Optical", [9242]) }, "RTPatientPositionAcquisitionSinglePlaneKv": { "121704": ( "RT Patient Position Acquisition, single plane kV", [9242, 9260, 9263, 9265], ) }, "RTPatientPositionAcquisitionSinglePlaneMV": { "121702": ( "RT Patient Position Acquisition, single plane MV", [9242, 9260, 9264, 9265], ) }, "RTPatientPositionAcquisitionSpatialFiducials": { "121711": ("RT Patient Position Acquisition, Spatial Fiducials", [9242]) }, "RTPatientPositionAcquisitionUltrasound": { "121710": ("RT Patient Position Acquisition, Ultrasound", [9242]) }, "RTPatientPositionAdjustment": { "121722": ("RT Patient Position Adjustment", [9241]) }, "RTPatientPositionInTreatmentSessionReview": { "121723": ("RT Patient Position In-treatment-session Review", [9241]) }, "RTPatientPositionRegistration2DOn3DReference": { "121718": ("RT Patient Position Registration, 2D on 3D reference", [9243]) }, "RTPatientPositionRegistration3DCTGeneral": { "121714": ("RT Patient Position Registration, 3D CT general", [9243]) }, "RTPatientPositionRegistration3DCTMarkerBased": { "121715": ("RT Patient Position Registration, 3D CT marker-based", [9243]) }, "RTPatientPositionRegistration3DCTVolumeBased": { "121716": ("RT Patient Position Registration, 3D CT volume-based", [9243]) }, "RTPatientPositionRegistration3DOn2DReference": { "121717": ("RT Patient Position Registration, 3D on 2D reference", [9243]) }, "RTPatientPositionRegistrationDualPlane": { "121713": ("RT Patient Position Registration, dual plane", [9243]) }, "RTPatientPositionRegistrationMR": { "121738": ("RT Patient Position Registration, MR", [9243]) }, "RTPatientPositionRegistrationOptical": { "121719": ("RT Patient Position Registration, Optical", [9243]) }, "RTPatientPositionRegistrationSinglePlane": { "121712": ("RT Patient Position Registration, single plane", [9243]) }, "RTPatientPositionRegistrationSpatialFiducials": { "121721": ("RT Patient Position Registration, Spatial Fiducials", [9243]) }, "RTPatientPositionRegistrationUltrasound": { "121720": ("RT Patient Position Registration, Ultrasound", [9243]) }, "RTPatientPositioningReferenceImage": { "130790": ("RT Patient Positioning Reference Image", [9267]) }, "RTPatientSetup": {"121701": ("RT Patient Setup", [9241])}, "RTPlan": {"RTPLAN": ("RT Plan", [32, 33])}, "RTPlanLabel": {"121384": ("RT Plan Label", [])}, "RTPlanSummationInputUsed": { "128212": ("RT Plan Summation Input Used", [7010, 7025]) }, "RTPlanningResult": {"128189": ("RT Planning Result", [7010, 7023])}, "RTPreTreatmentConsistencyCheck": { "121374": ("RT Pre-Treatment Consistency Check", [701, 702]) }, "RTPreTreatmentDoseCheck": {"121373": ("RT Pre-Treatment Dose Check", [701, 702])}, "RTPrescriptionInputImages": {"130136": ("RT Prescription Input Images", [9509])}, "RTPrescriptionInputUsed": {"128210": ("RT Prescription Input Used", [7010, 7025])}, "RTPrescriptionResult": {"128185": ("RT Prescription Result", [7010, 7023])}, "RTPrescriptionResultForRTTreatmentPlanning": { "128186": ("Dose Calculation Image Series", [7010, 7023, 9510]) }, "RTRadiationPreviouslyDelivered": { "130663": ("RT Radiation previously delivered", [9576]) }, "RTRegistrationMark": {"130746": ("RT Registration Mark", [9502, 9503])}, "RTSegmentMaterial": {"130737": ("RT Segment Material", [])}, "RTStructureSet": {"RTSTRUCT": ("RT Structure Set", [32, 33])}, "RTTarget": {"130041": ("RT Target", [9502, 9503, 9580])}, "RTTreatmentCourseSummary": { "128193": ("RT Treatment Course Summary", [7010, 7023]) }, "RTTreatmentPlanForThePositionBeingVerified": { "121310": ("RT treatment plan for the position being verified", [7022]) }, "RTTreatmentPlanningInputImages": { "130137": ("RT Treatment Planning Input Images", [9510]) }, "RTTreatmentPlanningInputUsed": { "128211": ("RT Treatment Planning Input Used", [7010, 7025]) }, "RTTreatmentQAByRTIonPlanDifferenceCheck": { "121734": ("RT Treatment QA by RT Ion Plan Difference Check", [9241]) }, "RTTreatmentQAByRTIonPlanDoseCheck": { "121733": ("RT Treatment QA by RT Ion Plan Dose Check", [9241]) }, "RTTreatmentQAByRTPlanDifferenceCheck": { "121732": ("RT Treatment QA by RT Plan Difference Check", [9241]) }, "RTTreatmentQAByRTPlanDoseCheck": { "121731": ("RT Treatment QA by RT Plan Dose Check", [9241]) }, "RTTreatmentQAResult": {"128194": ("RT Treatment QA Result", [7010, 7023])}, "RTTreatmentQAWithExternalVerification": { "121729": ("RT Treatment QA with External Verification", [9241]) }, "RTTreatmentQAWithInternalVerification": { "121728": ("RT Treatment QA with Internal Verification", [9241]) }, "RTTreatmentQAWithRTIonPlanDifferenceCheck": { "121734": ("RT Treatment QA with RT Ion Plan Difference Check", []) }, "RTTreatmentRecord": {"RTRECORD": ("RT Treatment Record", [32, 33])}, "RTTreatmentSessionResult": { "128192": ("RT Treatment Session Result", [7010, 7023]) }, "RTTreatmentSimulationResult": { "128188": ("RT Treatment Simulation Result", [7010, 7023]) }, "RTTreatmentSimulationWithExternalVerification": { "121725": ("RT Treatment Simulation with External Verification", [9241]) }, "RTTreatmentSimulationWithInternalVerification": { "121724": ("RT Treatment Simulation with Internal Verification", [9241]) }, "RTTreatmentWithAdHocPlanning": { "130444": ("RT Treatment with Ad Hoc Planning", [9241]) }, "RTTreatmentWithExternalVerification": { "121727": ("RT Treatment with External Verification", [9241]) }, "RTTreatmentWithInternalVerification": { "121726": ("RT Treatment with Internal Verification", [9241]) }, "RTVAudioAndStereoVideoRendition": { "130373": ("RTV Audio and Stereo Video Rendition", [7010, 7070]) }, "RTVAudioAndVideoRendition": { "130371": ("RTV Audio and Video Rendition", [7010, 7070]) }, "RTVRendition": {"130370": ("RTV Rendition", [7010, 7070])}, "RTVStereoVideoRendition": {"130372": ("RTV Stereo Video Rendition", [7010, 7070])}, "RTWorkflowInputUsed": {"128209": ("RT Workflow Input Used", [7010, 7025])}, "RWave": {"109043": ("R wave", [3339])}, "RadialBScanPattern": {"128282": ("Radial B-scan pattern", [4272])}, "RadialBasedWallMotionAnalysis": { "122493": ("Radial Based Wall Motion Analysis", []) }, "RadialDiffusivity": {"113203": ("Radial Diffusivity", [7263])}, "RadialKurtosis": {"113207": ("Radial Kurtosis", [7263])}, "RadialLagrangianStrain": {"130675": ("Radial Lagrangian Strain", [12304, 12311])}, "RadialLagrangianStrainRate": { "130676": ("Radial Lagrangian Strain Rate", [12304, 12311]) }, "RadialPeripapillaryStructuralReflectanceMap": { "128264": ("Radial peripapillary structural reflectance map", [4271]) }, "RadialPeripapillaryVasculatureFlow": { "128263": ("Radial peripapillary vasculature flow", [4271]) }, "RadialScar": {"111293": ("Radial scar", [])}, "RadialShortening": {"122496": ("Radial Shortening", [])}, "RadialUltrasoundTransducerGeometry": { "125255": ("Radial ultrasound transducer geometry", [12033]) }, "RadiationApplied": {"122308": ("Radiation applied", [3412])}, "RadiationCharacteristicsNote": {"130022": ("Radiation Characteristics Note", [])}, "RadiationDetectedDuringBeamHoldInterlock": { "130828": ("Radiation Detected During Beam Hold Interlock", [9561, 9568]) }, "RadiationDoseCompositeParameters": { "128436": ("Radiation Dose Composite Parameters", []) }, "RadiationDoseEstimate": {"128402": ("Radiation Dose Estimate", [])}, "RadiationDoseEstimateMethod": {"128476": ("Radiation Dose Estimate Method", [])}, "RadiationDoseEstimateMethodReference": { "128482": ("Radiation Dose Estimate Method Reference", []) }, "RadiationDoseEstimateMethodType": { "128477": ("Radiation Dose Estimate Method Type", []) }, "RadiationDoseEstimateMethodology": { "128415": ("Radiation Dose Estimate Methodology", []) }, "RadiationDoseEstimateName": {"128403": ("Radiation Dose Estimate Name", [])}, "RadiationDoseEstimateParameterType": { "128464": ("Radiation Dose Estimate Parameter Type", []) }, "RadiationDoseEstimateParameters": { "128434": ("Radiation Dose Estimate Parameters", []) }, "RadiationDoseEstimateRepresentation": { "128412": ("Radiation Dose Estimate Representation", []) }, "RadiationDoseNormalizationPoint": { "130063": ("Radiation Dose Normalization Point", [9534]) }, "RadiationDoseReferencePoint": { "130064": ("Radiation Dose Reference Point", [9534]) }, "RadiationDoseRepresentationData": { "128414": ("Radiation Dose Representation Data", []) }, "RadiationDoseShapingVolume": {"130061": ("Radiation Dose Shaping Volume", [9535])}, "RadiationExposure": {"113921": ("Radiation Exposure", [])}, "RadiationExposureAndProtectionInformation": { "113923": ("Radiation Exposure and Protection Information", []) }, "RadiationFieldArea": {"130516": ("Radiation Field Area", [])}, "RadiationFieldOutline": {"130517": ("Radiation Field Outline", [])}, "RadiationInteractionVolume": {"130066": ("Radiation Interaction Volume", [9535])}, "RadiationOutput": {"130514": ("Radiation Output", [])}, "RadiationPhysicist": {"121105": ("Radiation Physicist", [])}, "RadiationRemoved": {"122309": ("Radiation removed", [3412])}, "RadiationSourceCharacteristics": { "130508": ("Radiation Source Characteristics", []) }, "RadiationTechnique": {"130511": ("Radiation Technique", [])}, "RadiationTherapyDevice": {"RT": ("Radiation Therapy Device", [30])}, "RadiationTherapyParticle": {"130033": ("Radiation Therapy Particle", [])}, "RadiationTransportBasedMethods": { "130126": ("Radiation transport-based methods", [9537]) }, "RadiationTransportModelType": {"128420": ("Radiation Transport Model Type", [])}, "RadioFrequencyAblationPower": { "109010": ("Radio frequency ablation, power", [3240]) }, "RadioactiveMarker": {"130646": ("Radioactive Marker", [9573, 9575])}, "RadioactiveSubstanceAdministered": { "113922": ("Radioactive Substance Administered", []) }, "Radiofluoroscopy": {"RF": ("Radiofluoroscopy", [29, 30, 33])}, "RadiofrequencyTransponder": { "130644": ("Radiofrequency Transponder", [9573, 9575]) }, "Radiographer": {"121084": ("Radiographer", [])}, "RadiographicAnatomy": {"112005": ("Radiographic anatomy", [6101])}, "RadiographicImaging": {"RG": ("Radiographic imaging", [29, 30, 33])}, "RadioisotopeGenerator": {"113543": ("Radioisotope Generator", [10041])}, "RadionuclideResidualSyringeCounts": { "123010": ("Radionuclide Residual Syringe Counts", []) }, "RadionuclideSyringeCounts": {"123009": ("Radionuclide Syringe Counts", [])}, "RadionuclideTotalDose": {"123006": ("Radionuclide Total Dose", [])}, "RadionuclideVialIdentifier": {"113514": ("Radionuclide Vial Identifier", [])}, "Radiopharmaceutical": {"123001": ("Radiopharmaceutical", [])}, "RadiopharmaceuticalAdministration": { "113502": ("Radiopharmaceutical Administration", []) }, "RadiopharmaceuticalAdministrationEventUID": { "113503": ("Radiopharmaceutical Administration Event UID", []) }, "RadiopharmaceuticalDispenseUnitIdentifier": { "113511": ("Radiopharmaceutical Dispense Unit Identifier", []) }, "RadiopharmaceuticalLotIdentifier": { "113512": ("Radiopharmaceutical Lot Identifier", []) }, "RadiopharmaceuticalRadiationDoseReport": { "113500": ("Radiopharmaceutical Radiation Dose Report", []) }, "RadiopharmaceuticalSpecificActivity": { "123007": ("Radiopharmaceutical Specific Activity", []) }, "RadiopharmaceuticalStartDatetime": { "123003": ("Radiopharmaceutical Start DateTime", []) }, "RadiopharmaceuticalStopDatetime": { "123004": ("Radiopharmaceutical Stop DateTime", []) }, "RadiopharmaceuticalVolume": {"123005": ("Radiopharmaceutical Volume", [])}, "RadiotherapyApplicator": {"130125": ("Radiotherapy Applicator", [9519, 9520])}, "RadiotherapyDose": {"RTDOSE": ("Radiotherapy Dose", [])}, "RadiotherapyDoseRegion": {"130748": ("Radiotherapy Dose Region", [9502, 9580])}, "RadiotherapyFiducial": {"130666": ("Radiotherapy Fiducial", [9502, 9580])}, "RadiotherapyImage": {"RTIMAGE": ("Radiotherapy Image", [])}, "RadiotherapyPlan": {"RTPLAN": ("Radiotherapy Plan", [])}, "RadiotherapyStructureSet": {"RTSTRUCT": ("Radiotherapy Structure Set", [])}, "RadiotherapyTreatmentDevice": { "130361": ("Radiotherapy Treatment Device", [9551]) }, "RadiotherapyTreatmentRecord": {"RTRECORD": ("Radiotherapy Treatment Record", [])}, "RaisedSkinLesion": {"130486": ("Raised skin lesion", [4407])}, "Ranibizumab89Zr": {"126742": ("Ranibizumab ^89^Zr", [4021])}, "RasterBScanPattern": {"128280": ("Raster B-scan pattern", [4272])}, "RateOfAdministration": {"122094": ("Rate of administration", [3410])}, "RateOfExposure": {"111579": ("Rate of exposure", [6092])}, "RatingOfPerceivedExertion": {"122706": ("Rating of Perceived Exertion", [])}, "RatioOfAchievedToPredictedFunctionalCapacity": { "122771": ("Ratio of achieved to predicted functional capacity", [3238]) }, "RatioOfAchievedToPredictedMaximalOxygenConsumption": { "122770": ("Ratio of achieved to predicted maximal oxygen consumption", [3238]) }, "ReaderSpecialty": {"128003": ("Reader Specialty", [])}, "ReagentVialIdentifier": {"113513": ("Reagent Vial Identifier", [])}, "RealTimeAcquisition": {"109080": ("Real time acquisition", [3104])}, "RealWorldValueMap": {"RWV": ("Real World Value Map", [32, 33])}, "RealWorldValueMapUsedForMeasurement": { "126100": ("Real World Value Map used for measurement", []) }, "ReasonForBiosafetyControls": {"127011": ("Reason for biosafety controls", [])}, "ReasonForProcedure": {"111401": ("Reason for Procedure", [])}, "ReasonForProceeding": {"113907": ("Reason for Proceeding", [])}, "ReasonForRejectingAcquisition": { "130504": ("Reason for Rejecting Acquisition", []) }, "ReasonForRepeatingAcquisition": { "128552": ("Reason for Repeating Acquisition", []) }, "ReasonForStudy": {"122139": ("Reason for Study", [])}, "RecallForImagingFindings": {"111591": ("Recall for imaging findings", [6051])}, "RecallForPatientSymptomsClinicalFindings": { "111592": ("Recall for patient symptoms/ clinical findings", [6051]) }, "RecallForTechnicalReasons": {"111590": ("Recall for technical reasons", [6051])}, "RecentPhysicalActivity": {"113552": ("Recent Physical Activity", [])}, "ReciprocatingGrid": {"111643": ("Reciprocating grid", [10017])}, "Recommendation": {"121075": ("Recommendation", [3419, 6053, 7002])}, "Recommendations": {"121074": ("Recommendations", [])}, "RecommendedCADOperatingPoint": {"111092": ("Recommended CAD Operating Point", [])}, "RecommendedFollowUp": {"111053": ("Recommended Follow-up", [])}, "RecommendedFollowUpDate": {"111054": ("Recommended Follow-up Date", [])}, "RecommendedFollowUpInterval": {"111055": ("Recommended Follow-up Interval", [])}, "Reconstructed": {"122404": ("Reconstructed", [])}, "ReconstructionAlgorithm": {"113961": ("Reconstruction Algorithm", [])}, "Recording": {"121097": ("Recording", [7445, 7453])}, "RecoveryState": {"109096": ("Recovery state", [])}, "RectalBalloon": { "130120": ("Rectal Balloon", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "RecumbentPatientPositionWithRespectToGravity": { "112228": ("Recumbent Patient Position with respect to gravity", []) }, "RecurrentMalignancy": {"111338": ("Recurrent malignancy", [6030, 6033])}, "RedFilter": {"111602": ("Red filter", [])}, "RedTranslucentIgloo": {"127221": ("Red translucent igloo", [606])}, "RedistributionState": {"109093": ("Redistribution State", [3101])}, "ReferenceAcquisitionPoint": {"130072": ("Reference Acquisition Point", [9504])}, "ReferenceAuthority": {"121406": ("Reference Authority", [])}, "ReferenceBasis": {"128772": ("Reference Basis", [])}, "ReferenceEnergy": {"130087": ("Reference Energy", [])}, "ReferenceGeometry": {"128773": ("Reference Geometry", [])}, "ReferenceMeasurementGroup": {"130755": ("Reference Measurement Group", [])}, "ReferenceMethod": {"122430": ("Reference Method", [])}, "ReferencePoint": {"122611": ("Reference Point", [])}, "ReferencePointDefinition": {"113780": ("Reference Point Definition", [])}, "ReferencePointDosimetry": {"130502": ("Reference Point Dosimetry", [])}, "ReferencePointPosition": {"130526": ("Reference Point Position", [])}, "ReferencePoints": {"122438": ("Reference Points", [])}, "ReferenceToUncertaintyDeterminationMethod": { "128511": ("Reference to Uncertainty Determination Method", []) }, "ReferencedBeamNumber": {"121389": ("Referenced Beam Number", [])}, "ReferencedFrames": {"121190": ("Referenced Frames", [7250])}, "ReferencedImagingAgentAdministrationPhaseIdentifier": { "130217": ("Referenced Imaging Agent Administration Phase Identifier", []) }, "ReferencedImagingAgentAdministrationPhaseUID": { "130262": ("Referenced Imaging Agent Administration Phase UID", []) }, "ReferencedImagingAgentAdministrationStepUID": { "130216": ("Referenced Imaging Agent Administration Step UID", []) }, "ReferencedImagingAgentIdentifier": { "130255": ("Referenced Imaging Agent Identifier", []) }, "ReferencedPatientAlignmentReference": { "130662": ("Referenced Patient Alignment Reference", []) }, "ReferencedRegionOfInterestIdentifier": { "130489": ("Referenced Region of Interest Identifier", []) }, "ReferencedSegment": {"121191": ("Referenced Segment", [7250])}, "ReferencedSegmentationFrame": {"121214": ("Referenced Segmentation Frame", [])}, "Referring": {"121095": ("Referring", [])}, "ReflectionBasedCornealTopographer": { "111946": ("Reflection-based corneal topographer", [4210]) }, "ReflectionIllumination": {"111742": ("Reflection illumination", [8123])}, "RefractiveMeasurementsSOPInstance": { "111783": ("Refractive Measurements SOP Instance", [4240]) }, "RegionInSpace": {"130488": ("Region in Space", [])}, "RegionalAbnormalWallMotion": {"122417": ("Regional Abnormal Wall Motion", [])}, "RegionalCerebralBloodFlow": {"113055": ("Regional Cerebral Blood Flow", [])}, "RegionalCerebralBloodVolume": {"113056": ("Regional Cerebral Blood Volume", [])}, "RegionalContributionToEjectionFraction": { "122495": ("Regional Contribution to Ejection Fraction", []) }, "Registrar": {"121087": ("Registrar", [])}, "Registration": {"REG": ("Registration", [32, 33])}, "RegistrationCreatedDuringTreatment": { "129211": ("Registration created during Treatment", [7022]) }, "RegistrationInput": {"125041": ("Registration Input", [7151, 7165, 7196])}, "RegistrationMethod": {"128446": ("Registration Method", [])}, "RegistrationResult": {"128183": ("Registration Result", [7010, 9509, 9510])}, "RegistrationUsedInPlanning": {"129210": ("Registration used in Planning", [7022])}, "RegressionOffsetED": {"122432": ("Regression Offset ED", [])}, "RegressionOffsetES": {"122434": ("Regression Offset ES", [])}, "RegressionSlopeED": {"122431": ("Regression Slope ED", [])}, "RegressionSlopeES": {"122433": ("Regression Slope ES", [])}, "RegressionVolumeExponent": {"122435": ("Regression Volume Exponent", [])}, "RegurgitationJetArea": {"125332": ("Regurgitation Jet Area", [12304])}, "RegurgitationJetWidth": {"125333": ("Regurgitation Jet Width", [12304])}, "ReinjectionState": {"109092": ("Reinjection State", [3101])}, "RejectedForPatientSafetyReasons": { "113037": ("Rejected for Patient Safety Reasons", [7010, 7031]) }, "RejectedForQualityReasons": { "113001": ("Rejected for Quality Reasons", [7010, 7031]) }, "RelatedImplantationReports": {"112365": ("Related Implantation Reports", [])}, "RelatedOphthalmicThicknessMap": { "111933": ("Related ophthalmic thickness map", [4264]) }, "RelatedPatientDataNotUsedDuringPlanning": { "112364": ("Related Patient Data Not Used During Planning", []) }, "RelatedToNonMacularSensitivity": { "111842": ("Related to non macular sensitivity", [4252]) }, "RelativeAmountOfExposure": {"111582": ("Relative amount of exposure", [6093])}, "RelativeAmountOfUse": {"111583": ("Relative amount of use", [6093])}, "RelativeAnisotropy": { "110809": ("Relative Anisotropy", [218, 7180, 7263, 7271, 7469]) }, "RelativeDoseAmount": {"111581": ("Relative dose amount", [6093])}, "RelativeDoseFrequency": {"111584": ("Relative dose frequency", [6094])}, "RelativeElectronDensity": {"130083": ("Relative Electron Density", [])}, "RelativeFrequencyOfExposure": { "111585": ("Relative frequency of exposure", [6094]) }, "RelativeFrequencyOfUse": {"111586": ("Relative frequency of use", [6094])}, "RelativeLinearStoppingPower": { "130086": ("Relative Linear Stopping Power", [218, 7180, 7469]) }, "RelativeMassDensity": {"130082": ("Relative Mass Density", [])}, "RelativePosition": {"122337": ("Relative position", [])}, "RelativeRegionalBloodFlow": { "126397": ("Relative Regional Blood Flow", [218, 4108, 7180, 7469]) }, "RelativeRegionalBloodVolume": { "126398": ("Relative Regional Blood Volume", [218, 4108, 7180, 7469]) }, "RelativeStenosisSeverity": {"122391": ("Relative Stenosis Severity", [])}, "RelevantIndicatedProblems": {"111514": ("Relevant Indicated Problems", [])}, "RelevantPatientInformation": {"111517": ("Relevant Patient Information", [])}, "RelevantPatientInformationForBreastImaging": { "111511": ("Relevant Patient Information for Breast Imaging", []) }, "RelevantPreviousProcedures": {"111513": ("Relevant Previous Procedures", [])}, "RelevantRiskFactors": {"111515": ("Relevant Risk Factors", [])}, "RemainingConsumableDisposed": { "122078": ("Remaining consumable disposed", [3408]) }, "RemodelingIndex": {"122345": ("Remodeling Index", [3484])}, "RemoteServiceOperationStarted": { "110139": ("Remote Service Operation Started", [401, 403]) }, "RemoteServiceOperationStopped": { "110140": ("Remote Service Operation Stopped", [401, 403]) }, "RenderingIntent": {"111056": ("Rendering Intent", [])}, "ReplacedByAlternateRepresentation": { "130754": ("Replaced by Alternate Representation", [7031]) }, "ReplacedReport": {"121360": ("Replaced report", [7009])}, "ReportRequested": {"128004": ("Report Requested", [])}, "ReportVerification": {"110007": ("Report Verification", [9231])}, "ReportedValueType": {"130510": ("Reported Value Type", [])}, "ReportingSystem": {"130551": ("Reporting system", [])}, "RepresentativeOfEthicsCommittee": { "128677": ("Representative of Ethics Committee", [7450, 7452]) }, "RepresentativeOfProtocolCommittee": { "128676": ("Representative of Protocol Committee", [7450, 7452]) }, "RepresentativePoint": {"128140": ("Representative point", [219])}, "Request": {"121062": ("Request", [])}, "Requesting": {"121096": ("Requesting", [7453])}, "Resident": {"121086": ("Resident", [])}, "ResidualVolumeOfImagingAgentInContainer": { "130206": ("Residual Volume of Imaging Agent in Container", []) }, "ResolvedByOverridingInterlock": { "130454": ("Resolved by overriding Interlock", []) }, "ResolvedByRepositioningPatient": { "130455": ("Resolved by repositioning Patient", []) }, "ResourceInadequate": {"110527": ("Resource inadequate", [71, 9300])}, "ResourcePreEmpted": {"110526": ("Resource pre-empted", [9300, 9303])}, "RespirationWaveform": {"109117": ("Respiration Waveform", [3005])}, "RespiratoryEffort": {"130433": ("Respiratory Effort", [3005])}, "RespiratoryPressure": {"130426": ("Respiratory Pressure", [3005])}, "RespiratoryWaveform": {"RESP": ("Respiratory Waveform", [29, 30, 33])}, "ResponseEvaluation": {"112020": ("Response Evaluation", [])}, "ResponseEvaluationMethod": {"112021": ("Response Evaluation Method", [])}, "RestTechnetiumStressTechnetium1DayProcedure": { "122782": ("Rest technetium/stress technetium 1 day procedure", [3110]) }, "RestTechnetiumStressTechnetium2DayProcedure": { "122783": ("Rest technetium/stress technetium 2 day procedure", [3110]) }, "RestThalliumStressTechnetiumProcedure": { "122781": ("Rest thallium/stress technetium procedure", [3110]) }, "RestenoticLesion": {"122393": ("Restenotic Lesion", [])}, "ResultsCommunicated": {"121291": ("Results communicated", [])}, "ResultsQualityController": {"129004": ("Results Quality Controller", [7453])}, "ResumeProcedureAction": {"121133": ("Resume Procedure Action", [3421])}, "ResumeProcedureActionItem": {"121133": ("Resume Procedure Action Item", [])}, "RetainDeviceIdentityOption": {"113109": ("Retain Device Identity Option", [7050])}, "RetainInstitutionIdentityOption": { "113112": ("Retain Institution Identity Option", [7050]) }, "RetainLongitudinalTemporalInformationFullDatesOption": { "113106": ("Retain Longitudinal Temporal Information Full Dates Option", [7050]) }, "RetainLongitudinalTemporalInformationModifiedDatesOption": { "113107": ( "Retain Longitudinal Temporal Information Modified Dates Option", [7050], ) }, "RetainPatientCharacteristicsOption": { "113108": ("Retain Patient Characteristics Option", [7050]) }, "RetainSafePrivateOption": {"113111": ("Retain Safe Private Option", [7050])}, "RetainUidsOption": {"113110": ("Retain UIDs Option", [7050])}, "Reticle": {"130350": ("Reticle", [9548])}, "ReticularPattern": {"112113": ("Reticular pattern", [6102, 6103, 6106])}, "ReticulonodularPattern": { "112065": ("Reticulonodular pattern", [6102, 6103, 6104, 6106]) }, "RetinaDepthEncodedStructuralReflectanceMap": { "128258": ("Retina depth encoded structural reflectance map", [4271]) }, "RetinaDepthEncodedVasculatureFlow": { "128257": ("Retina depth encoded vasculature flow", [4271]) }, "RetinaStructuralReflectanceMap": { "128260": ("Retina structural reflectance map", [4271]) }, "RetinaVasculatureFlow": {"128259": ("Retina vasculature flow", [4271])}, "RetinalNerveFiberLayerThickness": { "111925": ("Retinal nerve fiber layer thickness", [4262]) }, "RetinalTopography": {"111924": ("Retinal topography", [4261])}, "RetroOrbitalRoute": {"127070": ("Retro-orbital route", [11])}, "RetroPectoralImplant": {"111486": ("Retro-pectoral implant", [6058, 6059])}, "RetrospectiveGating": {"109082": ("Retrospective gating", [3104])}, "Reused": {"127178": ("Reused", [604])}, "ReverseOsmosisPurifiedHclAcidifiedWater": { "127291": ("Reverse osmosis purified, HCl acidified water", [610]) }, "ReverseOsmosisPurifiedWater": { "127290": ("Reverse osmosis purified water", [610]) }, "ReviewOfAnOutsideStudy": {"111418": ("Review of an outside study", [6051, 6327])}, "RibScaleneTubercle": {"112096": ("Rib Scalene Tubercle", [6115, 8134])}, "RightContour": {"122508": ("Right Contour", [])}, "RightEyeRx": {"111688": ("Right Eye Rx", [])}, "RightFirst": {"126831": ("right first", [21])}, "RightHemisphereMostAnterior": { "125031": ("Right Hemisphere Most Anterior", [7101, 7111]) }, "RightHemisphereMostInferior": { "125034": ("Right Hemisphere Most Inferior", [7101, 7111]) }, "RightHemisphereMostPosterior": { "125032": ("Right Hemisphere Most Posterior", [7101, 7111]) }, "RightHemisphereMostSuperior": { "125033": ("Right Hemisphere Most Superior", [7101, 7111]) }, "RightToLeft": {"110866": ("Right To Left", [7185])}, "RightToLeftFlow": {"122228": ("Right to Left Flow", [])}, "RightTrachealStripe": { "112093": ("Right tracheal stripe", [6102, 6109, 6113, 6148, 7151, 7192, 9514]) }, "RightVentricleAnteriorWall": { "125319": ("Right Ventricle Anterior Wall", [12305]) }, "RightVentricleOutflowTractDistal": { "125317": ("Right Ventricle Outflow Tract, Distal", [12305]) }, "RightVentricleOutflowTractProximal": { "125318": ("Right Ventricle Outflow Tract, Proximal", [12305]) }, "RightVentricularEjectionTime": { "122213": ("Right Ventricular ejection time", [3613]) }, "RightVentricularFillingTime": { "122214": ("Right Ventricular filling time", [3613]) }, "RingUltrasoundTransducerGeometry": { "125256": ("Ring ultrasound transducer geometry", [12033]) }, "RiseTime": {"130207": ("Rise Time", [])}, "RiskFactorModifier": {"111530": ("Risk Factor modifier", [])}, "Rituximab89Zr": {"126737": ("Rituximab ^89^Zr", [4021])}, "RobertsonReidTable": {"122253": ("Robertson & Reid table", [3664])}, "RoleOfPersonReporting": {"111534": ("Role of person reporting", [])}, "Roledumab89Zr": {"126733": ("Roledumab ^89^Zr", [4021])}, "RoomBarometricPressure": {"122225": ("Room Barometric pressure", [])}, "RoomIdentification": {"121121": ("Room identification", [])}, "RoomLaserPatientSetupPoint": { "130070": ("Room Laser Patient Setup Point", [9504, 9574]) }, "RoomOrigin": {"130536": ("Room Origin", [10074])}, "RoomOxygenConcentration": {"122223": ("Room oxygen concentration", [])}, "RoomTemperature": {"122224": ("Room temperature", [])}, "RootAngularSecondMomentOfGLCM": { "126061": ("Root Angular Second Moment of GLCM", [218, 7467, 7468]) }, "RotationAngle": {"130523": ("Rotation Angle", [])}, "RotationPlaneNormalPoint": {"130522": ("Rotation Plane Normal Point", [])}, "RotationalAcquisition": {"113613": ("Rotational Acquisition", [10002])}, "RunEntropy": {"128816": ("Run Entropy", [])}, "RunLengthNonuniformity": {"128811": ("Run Length Nonuniformity", [])}, "RunLengthNonuniformityNormalized": { "128812": ("Run Length Nonuniformity Normalized", []) }, "RunLengthVariance": {"128815": ("Run Length Variance", [])}, "RunPercentage": {"128813": ("Run Percentage", [])}, "RungeKutta": {"113219": ("Runge-Kutta", [7262])}, "SAR341989Zr": {"126741": ("SAR3419 ^89^Zr", [4021])}, "SMILE": {"111681": ("SMILE", [4234])}, "SMPTEPattern": {"109943": ("SMPTE Pattern", [8301])}, "SOPClassUID": {"110181": ("SOP Class UID", [404])}, "SPECTCTOfWholeBody": {"127902": ("SPECT CT of whole body", [646])}, "SPECTOfWholeBody": {"127901": ("SPECT of whole body", [646])}, "SPhase": {"111477": ("S Phase", [])}, "SRInstanceUsed": {"128416": ("SR Instance Used", [])}, "SRKII": {"111766": ("SRKII", [4236])}, "SRKT": {"111767": ("SRK-T", [4236])}, "SSDEConversionFactor": {"128410": ("SSDE Conversion Factor", [10069])}, "SStent": {"130733": ("S - Stent", [3022])}, "STChangeFromBaseline": {"122099": ("ST change from baseline", [])}, "STDepressionDownsloping": {"122759": ("ST Depression - Downsloping", [3233])}, "STDepressionHorizontal": {"122757": ("ST Depression - Horizontal", [3233])}, "STDepressionUpsloping": {"122758": ("ST Depression - Upsloping", [3233])}, "STElevationOnsetDatetime": {"122173": ("ST Elevation Onset DateTime", [])}, "STHRIndex": {"122773": ("ST/HR Index", [3238])}, "SUVBodySurfaceAreaCalculationMethod": { "126412": ("SUV body surface area calculation method", []) }, "SUVBodyWeightCalculationMethod": { "126410": ("SUV body weight calculation method", []) }, "SUVIdealBodyWeightCalculationMethod": { "126413": ("SUV ideal body weight calculation method", []) }, "SUVLeanBodyMassCalculationJanmahasatianMethod": { "126414": ("SUV lean body mass calculation Janmahasatian method", []) }, "SUVLeanBodyMassCalculationMethod": { "126411": ("SUV lean body mass calculation method", []) }, "SUVLeanBodyMassCalculationMethodUsing128Multiplier": { "126415": ("SUV lean body mass calculation method using 128 multiplier", []) }, "SWave": {"109044": ("S wave", [3339])}, "Saliency": {"130404": ("Saliency", [217, 218, 7180, 7469])}, "SalineImplant": {"111481": ("Saline implant", [6058, 6059])}, "SameAcquisitionAtDifferentFocalDepth": { "121352": ("Same acquisition at different focal depth", [8120]) }, "SameAcquisitionAtDifferentSpectralBand": { "121353": ("Same acquisition at different spectral band", [8120]) }, "SameAcquisitionAtHigherResolution": { "121351": ("Same acquisition at higher resolution", [8120]) }, "SameAcquisitionAtLowerResolution": { "121350": ("Same acquisition at lower resolution", [8120]) }, "SameAnatomy": {"122401": ("Same Anatomy", [7210])}, "SameIndication": {"122402": ("Same Indication", [7210])}, "SampleVolumeDepth": {"125107": ("Sample Volume Depth", [])}, "SamplingDatetime": {"111469": ("Sampling DateTime", [])}, "SamplingMethod": {"111704": ("Sampling Method", [])}, "ScanDelay": {"130198": ("Scan Delay", [])}, "ScanSpotInterlock": {"130824": ("Scan Spot Interlock", [9561, 9568])}, "ScanSpotMetersetInterlock": { "130827": ("Scan Spot Meterset Interlock", [9561, 9568]) }, "ScanSpotPositionInterlock": { "130825": ("Scan Spot Position Interlock", [9561, 9568]) }, "ScanSpotSizeInterlock": {"130826": ("Scan Spot Size Interlock", [9561, 9568])}, "ScanningLength": {"113825": ("Scanning Length", [])}, "ScapularInfraspinatusFossa": { "112101": ("Scapular Infraspinatus Fossa", [6115, 8134]) }, "ScapularSpine": {"112099": ("Scapular Spine", [6115, 8134])}, "ScapularSupraspinatusFossa": { "112100": ("Scapular Supraspinatus Fossa", [6115, 8134]) }, "ScarTissue": {"111168": ("Scar tissue", [])}, "ScarredMyocardium": {"122113": ("Scarred Myocardium", [3704])}, "ScheimpflugCamera": {"111626": ("Scheimpflug Camera", [4210])}, "SclerosingAdenosis": {"111294": ("Sclerosing adenosis", [])}, "ScopeOfAccumulation": {"113705": ("Scope of Accumulation", [])}, "ScopeOfFeature": {"111057": ("Scope of Feature", [])}, "ScotopicLight": {"111627": ("Scotopic light", [4203])}, "ScrubNurse": {"121090": ("Scrub nurse", [])}, "SeatPan": {"130855": ("Seat Pan", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "SecondMeasureOfInformationCorrelationOfGLCM": { "128799": ("Second Measure of Information Correlation of GLCM", []) }, "SecondaryFluenceMonitoringSystemInterlock": { "130476": ("Secondary Fluence Monitoring System Interlock", [9561, 9568]) }, "SecondaryPulmonaryLobule": { "112054": ("Secondary pulmonary lobule", [6102, 6109, 6110, 7151, 7192, 9514]) }, "SectorUltrasoundTransducerGeometry": { "125254": ("Sector ultrasound transducer geometry", [12033]) }, "SecureDigitalCard": {"110036": ("Secure Digital Card", [405])}, "SecurityAlert": {"110113": ("Security Alert", [400])}, "SecurityConfiguration": {"110129": ("Security Configuration", [401, 403])}, "SecurityRolesChanged": {"110136": ("Security Roles Changed", [401, 403])}, "SeedPoint": {"128139": ("Seed point", [219])}, "Segmentation": {"SEG": ("Segmentation", [32, 33])}, "SegmentationImageDerivation": {"113076": ("Segmentation", [7203])}, "SegmentationMethod": {"122554": ("Segmentation Method", [])}, "SegmentationResult": {"128182": ("Segmentation Result", [7010, 9509, 9510])}, "SegmentedConstrained": {"113269": ("Segmented-Constrained", [7274])}, "SegmentedUnconstrained": {"113268": ("Segmented-Unconstrained", [7274])}, "SelectedImplantComponent": {"112346": ("Selected Implant Component", [])}, "SelectedRegion": {"111099": ("Selected region", [6014, 6016, 6054, 6101, 6201])}, "SelectedRegionDescription": {"111058": ("Selected Region Description", [])}, "SelectionStatus": {"121404": ("Selection Status", [])}, "SentForAnalysis": {"111457": ("Sent for analysis", [])}, "SeptalDefectIntervention": { "122055": ("Septal Defect Intervention", [3405, 3406]) }, "SeptalLines": {"112114": ("Septal line(s)", [6102, 6103])}, "SeptumToWall": {"110876": ("Septum To Wall", [7185])}, "SeptumWallAxis": {"110865": ("Septum-Wall Axis", [7184])}, "SequencedAcquisition": {"113804": ("Sequenced Acquisition", [10013])}, "Series": {"113015": ("Series", [272, 7012, 10000])}, "SeriesInstanceUID": {"112002": ("Series Instance UID", [10001])}, "SeriesNumber": {"113607": ("Series Number", [10022])}, "SeriesOrInstanceUsedForWaterEquivalentDiameterEstimation": { "113985": ( "Series or Instance used for Water Equivalent Diameter estimation", [], ) }, "ServiceDeliveryLocation": {"121434": ("Service Delivery Location", [])}, "ServicePerformer": {"121435": ("Service Performer", [])}, "SessionStart": {"110145": ("Session start", [401, 403])}, "SessionStop": {"110146": ("Session stop", [401, 403])}, "SevereDistortionInTheAreaOfInterest": { "130584": ("Severe distortion in the area of interest", [6315, 6318]) }, "SeverelyJaundiced": {"113563": ("Severely Jaundiced", [64, 10045])}, "SeverityOfCalcification": {"122132": ("Severity of Calcification", [])}, "SeverityOfComplication": {"111466": ("Severity of Complication", [])}, "Sewing": {"112319": ("Sewing", [7310])}, "SexOfAnimalsWithinSameHousingUnit": { "127144": ("Sex of animals within same housing unit", []) }, "SexOfHandler": {"127145": ("Sex of handler", [])}, "Shadow": {"112124": ("Shadow", [6102, 6104])}, "ShapeFromMotion": {"114206": ("Shape from motion", [8201])}, "ShapeFromShading": {"114205": ("Shape from shading", [8201])}, "SharplyDefined": {"112137": ("Sharply defined", [6120])}, "SharplyDemarcated": {"112140": ("Sharply demarcated", [6120])}, "ShearWaveDetectionMethod": {"130759": ("Shear Wave Detection Method", [])}, "ShearWaveDispersionSlope": {"130612": ("Shear Wave Dispersion Slope", [12308])}, "ShearWaveDispersionSlopeCenterFrequency": { "130758": ("Shear Wave Dispersion Slope Center Frequency", []) }, "ShearWaveSpeed": {"130611": ("Shear Wave Speed", [12308])}, "SheetFilmDigitized": {"110020": ("Sheet Film Digitized", [7008])}, "ShelterManufacturer": {"127196": ("Shelter manufacturer", [])}, "ShelterProductCode": {"127198": ("Shelter product code", [])}, "ShelterProductName": {"127197": ("Shelter product name", [])}, "ShelterType": {"127195": ("Shelter type", [])}, "ShinRest": {"130852": ("Shin Rest", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "ShortLabel": {"125309": ("Short Label", [])}, "ShortRunHighGrayLevelEmphasis": { "128806": ("Short Run High Gray Level Emphasis", []) }, "ShortRunLowGrayLevelEmphasis": { "128805": ("Short Run Low Gray Level Emphasis", []) }, "ShortRunsEmphasis": {"128801": ("Short Runs Emphasis", [])}, "ShutterSpeedModelSSM": {"126344": ("Shutter-Speed Model (SSM)", [4101, 4106])}, "SideOfFamily": {"111540": ("Side of Family", [])}, "SignalBaselineEnd": {"122639": ("Signal Baseline End", [3836])}, "SignalBaselineStart": {"122638": ("Signal Baseline Start", [3836])}, "SignalChange": {"113059": ("Signal change", [218, 7180, 7469])}, "SignalEarliestPeakTime": {"122631": ("Signal Earliest Peak Time", [3836])}, "SignalIncreaseStartTime": {"122633": ("Signal Increase Start Time", [3836])}, "SignalTimeToPeak": {"122634": ("Signal Time to Peak", [3836])}, "SignalToNoise": {"113060": ("Signal to noise", [218, 7180, 7469])}, "SignalToNoiseRatio": {"111787": ("Signal to Noise Ratio", [4243])}, "SignedCompleteAcquisitionContent": { "113035": ("Signed Complete Acquisition Content", [7010]) }, "SignedCompleteStudyContent": {"113033": ("Signed Complete Study Content", [7010])}, "SignedManifest": {"113031": ("Signed Manifest", [7010])}, "SignetRingSign": {"112069": ("Signet-ring sign", [6102, 6104])}, "SilhouetteSign": {"112152": ("Silhouette sign", [6123])}, "SiliconeGranuloma": {"111296": ("Silicone granuloma", [6030, 6031])}, "SiliconeLadenLymphNodes": {"111507": ("Silicone-laden lymph nodes", [6072])}, "SimpleObjectModel": {"128418": ("Simple Object Model", [10064])}, "SimplifiedBernoulli": {"125218": ("Simplified Bernoulli", [12227, 12230])}, "SimulatedKeratometry": {"111755": ("Simulated Keratometry", [4235, 4242])}, "SimulationIntent": {"129017": ("Simulation Intent", [7064])}, "SimulationNote": {"130032": ("Simulation Note", [])}, "SimultaneousArterialPulseWaveform": { "121306": ("Simultaneous Arterial Pulse Waveform", [7004]) }, "SimultaneousDoppler": {"121301": ("Simultaneous Doppler", [7004])}, "SimultaneousECG": {"121303": ("Simultaneous ECG", [7004])}, "SimultaneousHemodynamic": {"121302": ("Simultaneous Hemodynamic", [7004])}, "SimultaneousPhonocardiographicWaveform": { "121307": ("Simultaneous Phonocardiographic Waveform", [7004]) }, "SimultaneousRespiratoryWaveform": { "121305": ("Simultaneous Respiratory Waveform", [7004]) }, "SimultaneousVoiceNarrative": {"121304": ("Simultaneous Voice Narrative", [7004])}, "SimultaneouslyAcquired": {"122400": ("Simultaneously Acquired", [7210])}, "SingleFraction": {"130096": ("Single Fraction", [9533])}, "SingleImageFinding": {"111059": ("Single Image Finding", [])}, "SingleImageFindingModifier": {"112024": ("Single Image Finding Modifier", [])}, "SingleLADRegionInRAOProjection": { "122466": ("Single LAD Region in RAO Projection", [3461]) }, "SingleLeaves": {"130333": ("Single Leaves", [9540, 9541])}, "SingleLuminance": {"111840": ("Single luminance", [4252])}, "SingleOrAnteriorLens": {"111778": ("Single or Anterior Lens", [4233])}, "SinglePhotonEmissionComputedTomography": { "ST": ("Single-photon emission computed tomography", []) }, "SinglePlane": {"113622": ("Single Plane", [10003])}, "SinglePlaneAngiography": {"122059": ("Single plane Angiography", [3748])}, "SinglePlaneEllipse": {"125226": ("Single Plane Ellipse", [12227, 12228])}, "SingleRCARegionInRAOProjection": { "122467": ("Single RCA Region in RAO Projection", [3461]) }, "SingleShotEPI": {"113226": ("Single Shot EPI", [7260])}, "SingleSideIllumination": {"130810": ("Single-side illumination", [11001])}, "SingleSubjectExtractedFromGroup": { "113132": ("Single subject extracted from group", [7151, 7165, 7196]) }, "SingleSubjectSelectedFromGroup": { "113132": ("Single subject selected from group", []) }, "SingleTensor": {"113231": ("Single Tensor", [7261])}, "SingularValueDecompositionSVDDeconvolution": { "126311": ("Singular Value Decomposition (SVD) deconvolution", [4105, 4106]) }, "SiteInvolvement": {"112008": ("Site involvement", [])}, "SiteOfLumenMaximum": {"122687": ("Site of Lumen Maximum", [3486])}, "SiteOfLumenMinimum": {"122382": ("Site of Lumen Minimum", [3486])}, "SiteOfMaximumLuminal": {"122516": ("Site of Maximum Luminal", [])}, "SizeDescriptor": {"112025": ("Size Descriptor", [])}, "SizeSpecificDoseEstimate": {"113930": ("Size Specific Dose Estimate", [])}, "SizeSpecificDoseEstimateAtLongitudinalPositionZ": { "113993": ("Size Specific Dose Estimate At Longitudinal Position Z", []) }, "Skewness": {"126051": ("Skewness", [7464])}, "SkinAppositionSetupMethod": {"130634": ("Skin Apposition Setup Method", [9571])}, "SkinConditionClammy": {"122275": ("skin condition Clammy", [3446])}, "SkinConditionCold": {"122273": ("skin condition Cold", [3446])}, "SkinConditionCool": {"122272": ("skin condition Cool", [3446])}, "SkinConditionDiaphoretic": {"122276": ("skin condition Diaphoretic", [3446])}, "SkinConditionDry": {"122274": ("skin condition Dry", [3446])}, "SkinConditionFlush": {"122277": ("skin condition Flush", [3446])}, "SkinConditionMottled": {"122278": ("skin condition Mottled", [3446])}, "SkinConditionPale": {"122279": ("skin condition Pale", [3446])}, "SkinConditionWarm": {"122271": ("skin condition Warm", [3446])}, "SkinDoseMap": {"128485": ("Skin Dose Map", [10063])}, "SkinLesionColor": {"130832": ("Skin lesion color", [])}, "SkinOfAnteriorHelixOfEar": { "130305": ("Skin of anterior helix of ear", [4029, 8134]) }, "SkinOfCaruncleOfEye": {"130306": ("Skin of caruncle of eye", [4029, 8134])}, "SkinOfInferiorHelixOfEar": { "130307": ("Skin of inferior helix of ear", [4029, 8134]) }, "SkinOfInferiorPosteriorSurfaceOfThePinna": { "130308": ("Skin of inferior posterior surface of the pinna", [4029, 8134]) }, "SkinOfInfraalarGroove": {"130312": ("Skin of infraalar groove", [4029, 8134])}, "SkinOfLateralPartOfDorsumOfFoot": { "130309": ("Skin of lateral part of dorsum of foot", [4029, 8134]) }, "SkinOfLowerAntihelixOfEar": { "130310": ("Skin of lower antihelix of ear", [4029, 8134]) }, "SkinOfLowerEyelidMargin": { "130311": ("Skin of lower eyelid margin", [4029, 8134]) }, "SkinOfLowerParaspinalRegion": { "130304": ("Skin of lower paraspinal region", [4029, 8134]) }, "SkinOfMedialPartOfDorsumOfFoot": { "130313": ("Skin of medial part of dorsum of foot", [4029, 8134]) }, "SkinOfMidBack": {"130323": ("Skin of mid back", [4029, 8134])}, "SkinOfMidParaspinalRegion": { "130303": ("Skin of mid paraspinal region", [4029, 8134]) }, "SkinOfParanasalCheek": {"130314": ("Skin of paranasal cheek", [4029, 8134])}, "SkinOfParaspinalAreaOfTheNeck": { "130300": ("Skin of paraspinal area of the neck", [4029, 8134]) }, "SkinOfParaspinalAreaOfTheSuperiorBack": { "130301": ("Skin of paraspinal area of the superior back", [4029, 8134]) }, "SkinOfPosteriorHelixOfEar": { "130315": ("Skin of posterior helix of ear", [4029, 8134]) }, "SkinOfPosteriorLobuleOfTheEar": { "130316": ("Skin of posterior lobule of the ear", [4029, 8134]) }, "SkinOfSoleOfForefoot": {"130317": ("Skin of sole of forefoot", [4029, 8134])}, "SkinOfSuperiorAntihelixOfEar": { "130318": ("Skin of superior antihelix of ear", [4029, 8134]) }, "SkinOfSuperiorPosteriorHelixOfEar": { "130319": ("Skin of superior posterior helix of ear", [4029, 8134]) }, "SkinOfSuperiorPosteriorSurfaceOfThePinna": { "130320": ("Skin of superior posterior surface of the pinna", [4029, 8134]) }, "SkinOfUpperAntihelixOfEar": { "130321": ("Skin of upper antihelix of ear", [4029, 8134]) }, "SkinOfUpperEyelidMargin": { "130322": ("Skin of upper eyelid margin", [4029, 8134]) }, "SkinOfUpperParaspinalRegion": { "130302": ("Skin of upper paraspinal region", [4029, 8134]) }, "SleepStageN1": {"130834": ("Sleep Stage N1", [3035, 3046])}, "SleepStageN2": {"130835": ("Sleep Stage N2", [3035, 3046])}, "SleepStageN3": {"130836": ("Sleep Stage N3", [3035, 3046])}, "SliceContributionToEjectionFraction": { "122498": ("Slice Contribution to Ejection Fraction", []) }, "SliceThickness": {"112225": ("Slice Thickness", [])}, "SlideIdentifier": {"121043": ("Slide Identifier", [])}, "SlideMicroscopy": {"SM": ("Slide Microscopy", [29, 30, 33])}, "SlideMicroscopyPathologyImaging": {"112702": ("Slide Microscopy", [8131])}, "SlideUID": {"121044": ("Slide UID", [])}, "SlidingWindowBeam": {"130106": ("Sliding Window Beam", [9511, 9524, 9583])}, "SlowDiffusionCoefficient": { "113291": ("Slow Diffusion Coefficient", [218, 7180, 7272, 7469]) }, "SmallIrregularOpacities": { "112125": ("Small irregular opacities", [6102, 6104, 6106]) }, "SmallLesserThan32Point0cmLateralThickness": { "113601": ("Small: < 32.0 cm lateral thickness", [7041, 7042]) }, "SmallRoundedOpacities": {"112126": ("Small rounded opacities", [6102, 6104])}, "SmallZoneEmphasis": {"128821": ("Small Zone Emphasis", [])}, "SmallZoneHighGrayLevelEmphasis": { "128826": ("Small Zone High Gray Level Emphasis", []) }, "SmallZoneLowGrayLevelEmphasis": { "128825": ("Small Zone Low Gray Level Emphasis", []) }, "Smoothing": {"113087": ("Smoothing", [7203])}, "SoftPlaque": {"122356": ("Soft plaque", [3491])}, "SoftTissue": {"112144": ("Soft tissue", [])}, "SoftwareConfiguration": {"110131": ("Software Configuration", [401, 403])}, "SoftwareFailure": {"111218": ("Software failure", [6041, 6135, 7011])}, "SolidMass": {"111462": ("Solid mass", [6054, 6064])}, "Sonazoid": {"125905": ("Sonazoid", [12030])}, "Sonographer": {"121093": ("Sonographer", [])}, "Sonologist": {"121092": ("Sonologist", [7450, 7452])}, "Sonovue": {"125906": ("SonoVue", [12030])}, "SourceContinuousRollAngle": {"130798": ("Source Continuous Roll Angle", [])}, "SourceDeformableSpatialRegistration": { "125028": ("Source Deformable Spatial Registration", [7013, 7060]) }, "SourceDocument": {"121335": ("Source Document", [7006])}, "SourceDoseForComposingCurrentDose": { "121372": ("Source dose for composing current dose", [7221]) }, "SourceImage": {"121324": ("Source image", [7060, 7061, 7205])}, "SourceImageDiffusionBValue": { "113240": ("Source image diffusion b-value", [7276, 9000]) }, "SourceImageForImageProcessingOperation": { "121322": ("Source image for image processing operation", [4264, 7202, 7222]) }, "SourceImageForMontage": {"121329": ("Source image for montage", [7202])}, "SourceImageForSegmentation": {"121233": ("Source image for segmentation", [])}, "SourceMeasurement": {"128224": ("Source measurement", [7013, 7060])}, "SourceMedia": {"110155": ("Source Media", [402])}, "SourceOfDoseInformation": {"113854": ("Source of Dose Information", [])}, "SourceOfMeasurement": {"121112": ("Source of Measurement", [7003, 7551, 7552])}, "SourcePositionToleranceViolation": { "130473": ("Source Position Tolerance Violation", [9567]) }, "SourceRawData": {"128226": ("Source raw data", [7013, 7060])}, "SourceRealWorldValueMap": { "128227": ("Source real world value map", [7013, 7019, 7060]) }, "SourceReport": {"128225": ("Source report", [7013, 7060])}, "SourceRoleID": {"110153": ("Source Role ID", [402])}, "SourceSeriesForImageProcessingOperation": { "121323": ("Source series for image processing operation", [7210]) }, "SourceSeriesForSegmentation": {"121232": ("Source series for segmentation", [])}, "SpacingBetweenSlices": {"112226": ("Spacing between slices", [])}, "SpatialDisplacementXComponent": { "110822": ("Spatial Displacement X Component", [218, 7180, 7469]) }, "SpatialDisplacementYComponent": { "110823": ("Spatial Displacement Y Component", [218, 7180, 7469]) }, "SpatialDisplacementZComponent": { "110824": ("Spatial Displacement Z Component", [218, 7180, 7469]) }, "SpatialFiducials": {"128447": ("Spatial Fiducials", [])}, "SpatialFiducialsProducer": {"FID": ("Spatial Fiducials", [32, 33])}, "SpatialRegistration": {"112353": ("Spatial Registration", [])}, "SpatialRegistrationReference": {"128444": ("Spatial Registration Reference", [])}, "SpatialResampling": {"113085": ("Spatial resampling", [7203])}, "SpatiallyRelatedFramesExtractedFromTheVolume": { "113091": ("Spatially-related frames extracted from the volume", [7203]) }, "SpecialProcedureNote": {"130025": ("Special Procedure Note", [])}, "SpecificObservationSubjectClass": { "130780": ("Specific observation subject class", []) }, "SpecifiedConformationNumber": { "130076": ("Specified Conformation Number", [9500]) }, "SpecifiedConformityIndex": {"130074": ("Specified Conformity Index", [9500])}, "SpecifiedHealthyTissueConformityIndex": { "130075": ("Specified Healthy Tissue Conformity Index", [9500]) }, "SpecifiedHomogeneityIndex": {"130077": ("Specified Homogeneity Index", [9500])}, "SpecifiedRadiationDose": {"130019": ("Specified Radiation Dose", [])}, "SpecifiedVolumePercentage": {"130021": ("Specified Volume Percentage", [])}, "SpecifiedVolumeSize": {"130020": ("Specified Volume Size", [])}, "Specimen": {"121027": ("Specimen", [271])}, "SpecimenAccessionNumber": {"121040": ("Specimen Accession Number", [])}, "SpecimenContainerIdentifier": {"111700": ("Specimen Container Identifier", [])}, "SpecimenIdentifier": {"121041": ("Specimen Identifier", [])}, "SpecimenStorage": {"111729": ("Specimen storage", [8111])}, "SpecimenType": {"121042": ("Specimen Type", [])}, "SpecimenUID": {"121039": ("Specimen UID", [])}, "SpectaclePrescriptionReport": {"111671": ("Spectacle Prescription Report", [])}, "SpectralDomain": {"111921": ("Spectral domain", [4261])}, "SpectralFilteredImage": {"121340": ("Spectral filtered image", [7201])}, "Spectroscopy": {"121317": ("Spectroscopy", [7201])}, "SpectroscopyDataForWaterPhaseCorrection": { "121318": ("Spectroscopy Data for Water Phase Correction", [7215]) }, "SpeedOfSound": {"110832": ("Speed of sound", [218, 7180, 7469])}, "SpeedOfSoundMapCorrection": {"130820": ("Speed of Sound Map Correction", [11004])}, "Sphere": {"122485": ("Sphere", [8, 3451, 4051, 7111, 7112, 7151, 7193])}, "SphericalBackProjection": {"130821": ("Spherical Back Projection", [11005])}, "SphericalDeconvolution": {"113238": ("Spherical Deconvolution", [7261])}, "SphericalProjection": {"111791": ("Spherical projection", [4245])}, "Spiculated": {"112136": ("Spiculated", [6119])}, "SpinTaggingPerfusionMRSignalIntensity": { "110800": ("Spin Tagging Perfusion MR Signal Intensity", [218, 7180, 7469]) }, "SpontaneousAbortion": {"111566": ("Spontaneous Abortion", [6087, 6088])}, "SpotMagnificationViews": {"111136": ("Spot magnification view(s)", [6028, 6029])}, "SquamousCellCarcinomaOfTheNipple": { "111340": ("Squamous cell carcinoma of the nipple", [6030, 6033]) }, "Stage0": {"111494": ("Stage 0", [6068])}, "StageI": {"111495": ("Stage I", [6068])}, "StageIIA": {"111496": ("Stage IIA", [6068])}, "StageIIB": {"111497": ("Stage IIB", [6068])}, "StageIIIA": {"111498": ("Stage IIIA", [6068])}, "StageIIIB": {"111499": ("Stage IIIB", [6068])}, "StageIIIC": {"111500": ("Stage IIIC", [6068])}, "StageIV": {"111501": ("Stage IV", [6068])}, "StageView": {"113017": ("Stage-View", [7012])}, "StagedMeasurements": {"125310": ("Staged Measurements", [])}, "StagingPriorToImaging": {"127103": ("Staging prior to imaging", [634])}, "StandardDeviation": {"113061": ("Standard Deviation", [])}, "StandardDeviationDistanceOfCalcificationsInACluster": { "112201": ("Standard deviation distance of calcifications in a cluster", [6142]) }, "StandardDeviationOfAttenuationCoefficient": { "112183": ("Standard Deviation of Attenuation Coefficient", [6141]) }, "StandardDeviationOfMeasurementsUsed": { "111786": ("Standard Deviation of measurements used", [4243]) }, "StandardDeviationOfPopulation": { "121414": ("Standard deviation of population", [221, 226, 7465]) }, "StandardFractionation": {"130097": ("Standard Fractionation", [9533])}, "StandardToftsModel": {"126340": ("Standard Tofts Model", [4101, 4106])}, "StandardizedAddedMetabolicActivity": { "126037": ("Standardized Added Metabolic Activity", [7466]) }, "StandardizedAddedMetabolicActivityBackground": { "126038": ("Standardized Added Metabolic Activity Background", [7466]) }, "StandardizedAddedMetabolicActivitySAM": { "126037": ("Standardized Added Metabolic Activity (SAM)", []) }, "StandardizedAddedMetabolicActivitySAMBackground": { "126038": ("Standardized Added Metabolic Activity (SAM) Background", []) }, "StandardizedUptakeValue": { "126400": ("Standardized Uptake Value", [218, 7180, 7469]) }, "Standby": {"121101": ("Standby", [7453])}, "StartOfAtrialContraction": {"109045": ("Start of atrial contraction", [3339])}, "StartOfAtrialContractionSubsequent": { "109046": ("Start of atrial contraction (subsequent)", [3339]) }, "StartOfContrastAgentAdministration": { "125234": ("Start of contrast agent administration", [12031]) }, "StartOfDrugDoseAdministration": { "125233": ("Start of drug dose administration", [12031]) }, "StartOfExpiration": {"109029": ("Start of expiration", [3337])}, "StartOfInspiration": {"109030": ("Start of inspiration", [3337])}, "StartOfThermalCO": {"109031": ("Start of thermal CO", [3337])}, "StartOfThermalCardiacOutputBolus": { "109031": ("Start of thermal cardiac output bolus", []) }, "StartOfXRayIrradiation": {"113809": ("Start of X-Ray Irradiation", [])}, "StartProcedureAction": {"121130": ("Start Procedure Action", [3421])}, "StartProcedureActionItem": {"121130": ("Start Procedure Action Item", [])}, "StartingFlowRateOfAdministration": { "130208": ("Starting Flow Rate of administration", []) }, "Statement": {"122152": ("Statement", [])}, "StatementModifier": {"122153": ("Statement Modifier", [])}, "StaticBeam": {"130102": ("Static Beam", [9511, 9524, 9583])}, "StationAETitle": {"110119": ("Station AE Title", [])}, "StationaryAcquisition": {"113611": ("Stationary Acquisition", [10002])}, "StationaryAcquisitionCT": {"113806": ("Stationary Acquisition", [10013])}, "StenoticFlowReserve": {"122548": ("Stenotic Flow Reserve", [])}, "StentComposition": {"122685": ("Stent Composition", [])}, "StentDiameterRatio": {"122351": ("Stent Diameter Ratio", [3484])}, "StentDisintegration": {"122684": ("stent disintegration", [3813])}, "StentExpansionIndex": {"122347": ("Stent Expansion Index", [3484])}, "StentFracture": {"122683": ("stent fracture", [3813])}, "StentGap": {"122364": ("Stent Gap", [3483])}, "StentReExpanded": {"122306": ("Stent re-expanded", [3412])}, "StentSymmetryIndex": {"122346": ("Stent Symmetry Index", [3484])}, "StentVolumeObstruction": {"122339": ("Stent Volume Obstruction", [])}, "StentedRegion": {"122384": ("Entire Pullback", [3487])}, "StepAndShootBeam": {"130105": ("Step and Shoot Beam", [9511, 9524, 9583])}, "SteppingAcquisition": {"113612": ("Stepping Acquisition", [10002])}, "StereometricRelationship": {"SMR": ("Stereometric Relationship", [32, 33])}, "StereotacticCoordinates": {"127450": ("Stereotactic coordinates", [])}, "StereotacticSetupMethod": {"130633": ("Stereotactic Setup Method", [9571])}, "StimulationAtRate1Interval": { "109047": ("Stimulation at rate 1 interval", [3339]) }, "StimulationAtRate2Interval": { "109048": ("Stimulation at rate 2 interval", [3339]) }, "StimulationAtRate3Interval": { "109049": ("Stimulation at rate 3 interval", [3339]) }, "StimulationAtRate4Interval": { "109050": ("Stimulation at rate 4 interval", [3339]) }, "StimulationMode": {"130491": ("Stimulation Mode", [])}, "StimulusSamplePosition": {"130492": ("Stimulus Sample Position", [])}, "StimulusTimeOffset": {"130493": ("Stimulus Time Offset", [])}, "StorageDetector": {"113950": ("Storage Detector", [10030])}, "Strain": {"127411": ("Strain", [])}, "StrainDescription": {"127412": ("Strain description", [])}, "Streamline": {"113215": ("Streamline", [7262])}, "StressProtocol": {"109056": ("Stress Protocol", [])}, "StressTechnetiumRestTechnetium1DayProcedure": { "122784": ("Stress technetium/rest technetium 1 day procedure", [3110]) }, "StressTestScore": {"122760": ("Stress test score", [])}, "StretchedExponentialDiffusionModel": { "113254": ("Stretched exponential diffusion model", [7273]) }, "StripFilter": {"113650": ("Strip filter", [10007])}, "Stripe": {"112094": ("Stripe", [6102, 6109, 6113, 6148, 7151, 7192, 9514])}, "StronglyPositive": {"122755": ("Strongly positive", [3231])}, "StronglyPositiveSTElevation": { "122756": ("Strongly positive - ST elevation", [3231]) }, "StructuralImageForImageProcessing": { "128250": ("Structural image for image processing", [7202]) }, "StructureOfTheFindingSite": {"125311": ("Structure of the Finding Site", [12302])}, "StructuredReportDocument": {"SR": ("Structured Report Document", [32, 33])}, "StudentTTest": {"113068": ("Student's T-test", [218, 7180, 7469])}, "StudiesImported": {"110027": ("Studies Imported", [7008])}, "Study": {"113014": ("Study", [272, 7012, 10000])}, "StudyDate": {"111060": ("Study Date", [])}, "StudyInstanceUID": {"110180": ("Study Instance UID", [404, 10001])}, "StudyPerformedDidNotMatchRequest": { "130573": ("Study performed did not match request", [6314]) }, "StudyTime": {"111061": ("Study Time", [])}, "SubjectAge": {"121033": ("Subject Age", [])}, "SubjectBirthDate": {"121031": ("Subject Birth Date", [])}, "SubjectBreed": {"121035": ("Subject Breed", [])}, "SubjectClass": {"121024": ("Subject Class", [])}, "SubjectID": {"121030": ("Subject ID", [])}, "SubjectName": {"121029": ("Subject Name", [])}, "SubjectSex": {"121032": ("Subject Sex", [])}, "SubjectSpecies": {"121034": ("Subject Species", [])}, "SubjectTimePointIdentifier": {"126070": ("Subject Time Point Identifier", [])}, "SubjectUID": {"121028": ("Subject UID", [])}, "SubjectiveRefraction": {"SRF": ("Subjective Refraction", [29, 30, 33])}, "SuboptimalContrastTiming": {"128554": ("Suboptimal contrast timing", [10034])}, "SuboptimalPatientPreparation": { "130575": ("Suboptimal patient preparation", [6314]) }, "Subpleural": {"112153": ("Subpleural", [])}, "SubpleuralLine": {"112115": ("Subpleural line", [6102, 6103])}, "SubscapularFossa": {"112098": ("Subscapular Fossa", [6115, 8134])}, "SubstanceUseHistory": {"111545": ("Substance Use History", [])}, "SubtractionImageMissing": {"130581": ("Subtraction image missing", [6315, 6317])}, "Succeeded": {"111222": ("Succeeded", [6042])}, "SuccessfulAnalyses": {"111062": ("Successful Analyses", [])}, "SuccessfulDetections": {"111063": ("Successful Detections", [])}, "SuggestiveOfMalignancyTakeAppropriateAction": { "111146": ("Suggestive of malignancy - take appropriate action", [6028, 6029]) }, "SumAverageOfGLCM": {"128787": ("Sum Average of GLCM", [])}, "SumEntropyOfGLCM": {"128789": ("Sum Entropy of GLCM", [])}, "SumOfSegmentedVoxelMethodForVolume": { "126030": ("Sum of segmented voxel method for volume", [7474]) }, "SumVarianceOfGLCM": {"128788": ("Sum Variance of GLCM", [])}, "Summary": {"121111": ("Summary", [])}, "SummaryOfAnalyses": {"111065": ("Summary of Analyses", [])}, "SummaryOfDetections": {"111064": ("Summary of Detections", [])}, "SuperficialRetinaStructuralReflectanceMap": { "128266": ("Superficial retina structural reflectance map", [4271]) }, "SuperficialRetinaVasculatureFlow": { "128265": ("Superficial retina vasculature flow", [4271]) }, "SuperiorLongitudinalFasciculusI": { "110703": ("superior longitudinal fasciculus I", [7703, 7710, 8134]) }, "SuperiorLongitudinalFasciculusII": { "110704": ("superior longitudinal fasciculus II", [7703, 7710, 8134]) }, "SuperiorLongitudinalFasciculusIII": { "110705": ("superior longitudinal fasciculus III", [7703, 7710, 8134]) }, "SuperolateralToInferomedial": { "111434": ("Superolateral to inferomedial", [6065]) }, "SuperomedialToInferolateral": { "111435": ("Superomedial to inferolateral", [6065]) }, "SupplementaryData": {"111414": ("Supplementary Data", [])}, "SupplementaryDataForIntervention": { "111463": ("Supplementary Data for Intervention", []) }, "SupportingInformation": {"112359": ("Supporting Information", [])}, "SurfaceBetweenInnerAndOuterSegmentsOfThePhotoreceptors": { "128295": ( "Surface between Inner and Outer Segments of the photoreceptors", [4273, 7151, 7192, 9514], ) }, "SurfaceContourMapping": {"111792": ("Surface contour mapping", [4245])}, "SurfaceOfTheCenterOfTheRPE": { "128298": ("Surface of the center of the RPE", [4273, 7151, 7192, 9514]) }, "SurfaceOfTheChoroidScleraInterface": { "128301": ("Surface of the choroid-sclera interface", [4273, 7151, 7192, 9514]) }, "SurfaceOfTheInterdigitatingZoneBetweenRetinaAndRPE": { "128296": ( "Surface of the interdigitating zone between retina and RPE", [4273, 7151, 7192, 9514], ) }, "SurfaceRendering": {"113075": ("Surface rendering", [7203])}, "Surgeon": {"121091": ("Surgeon", [])}, "SurgeonFactor": {"111773": ("Surgeon Factor", [4237])}, "SurgicalConsult": {"111410": ("Surgical consult", [6028, 6050, 6083])}, "Survey": {"111128": ("Survey", [6051, 6058, 6061])}, "SuspendProcedureAction": {"121132": ("Suspend Procedure Action", [3421])}, "SuspendProcedureActionItem": {"121132": ("Suspend Procedure Action Item", [])}, "Suvbsa": {"126403": ("SUVbsa", [218, 7180, 7469])}, "Suvbw": {"126401": ("SUVbw", [218, 7180, 7469])}, "Suvibw": {"126404": ("SUVibw", [218, 7180, 7469])}, "Suvlbm": {"126402": ("SUVlbm", [218, 7180, 7469])}, "SuvlbmJames128": {"126406": ("SUVlbm(James128)", [218, 7180, 7469])}, "SuvlbmJanma": {"126405": ("SUVlbm(Janma)", [218, 7180, 7469])}, "SynchronizedRoboticTreatment": { "130139": ("Synchronized Robotic Treatment", [9523, 9524]) }, "SynthesizingEquipment": {"109100": ("Synthesizing Equipment", [7005])}, "SyringeAttached": {"130163": ("Syringe attached", [71])}, "SyringeDetached": {"130164": ("Syringe detached", [71])}, "SystemCalculated": {"113940": ("System Calculated", [10020])}, "SystemicFlow": {"122162": ("Systemic Flow", [3618])}, "SystolicBloodVelocityMean": { "122203": ( "Systolic blood velocity, mean", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "SystolicBloodVelocityPeak": { "122204": ( "Systolic blood velocity, peak", [3612, 12261, 12263, 12264, 12266, 12267, 12268, 12276], ) }, "SystolicPeakPressure": {"109033": ("Systolic peak pressure", [])}, "SystolicPressureAverage": {"109032": ("Systolic pressure, average", [])}, "T1": {"113063": ("T1", [218, 7180, 7469])}, "T1ByFixedValue": {"126352": ("T1 by Fixed Value", [4100, 4106])}, "T1ByInversionRecovery": {"126351": ("T1 by Inversion Recovery", [4100, 4106])}, "T1ByMultipleFlipAngles": {"126350": ("T1 by Multiple Flip Angles", [4100, 4106])}, "T1UsedForCalculation": {"126353": ("T1 Used For Calculation", [])}, "T1WeightedDynamicContrastEnhancedMRSignalIntensity": { "110816": ( "T1 Weighted Dynamic Contrast Enhanced MR Signal Intensity", [218, 7180, 7469], ) }, "T1WeightedMRSignalIntensity": { "110804": ("T1 Weighted MR Signal Intensity", [218, 6311, 7180, 7469]) }, "T1Worst": {"122367": ("T-1 Worst", [3493])}, "T2": {"113065": ("T2", [218, 7180, 7469])}, "T2Secondary": {"122368": ("T-2 Secondary", [3493])}, "T2Star": {"113064": ("T2*", [218, 7180, 7469])}, "T2StarWeightedDynamicContrastEnhancedMRSignalIntensity": { "110818": ( "T2* Weighted Dynamic Contrast Enhanced MR Signal Intensity", [218, 7180, 7469], ) }, "T2StarWeightedMRSignalIntensity": { "110806": ("T2* Weighted MR Signal Intensity", [218, 7180, 7469]) }, "T2WeightedDynamicContrastEnhancedMRSignalIntensity": { "110817": ( "T2 Weighted Dynamic Contrast Enhanced MR Signal Intensity", [218, 7180, 7469], ) }, "T2WeightedMRSignalIntensity": { "110805": ("T2 Weighted MR Signal Intensity", [218, 6311, 7180, 7469]) }, "T3Secondary": {"122369": ("T-3 Secondary", [3493])}, "T4Secondary": {"122370": ("T-4 Secondary", [3493])}, "T807F18": {"126502": ("T807 F^18^", [4021])}, "TBISetupMethod": {"130632": ("TBI Setup Method", [9571])}, "TEND": {"113216": ("TEND", [7262])}, "TG18ADPattern": {"109845": ("TG18-AD Pattern", [8301])}, "TG18AFCPattern": {"109861": ("TG18-AFC Pattern", [8301])}, "TG18BRPattern": {"109802": ("TG18-BR Pattern", [8301])}, "TG18CHImage": {"109878": ("TG18-CH Image", [8301])}, "TG18CTPattern": {"109804": ("TG18-CT Pattern", [8301])}, "TG18CXPattern": {"109854": ("TG18-CX Pattern", [8301])}, "TG18GA03Pattern": {"109870": ("TG18-GA03 Pattern", [8301])}, "TG18GA05Pattern": {"109871": ("TG18-GA05 Pattern", [8301])}, "TG18GA08Pattern": {"109872": ("TG18-GA08 Pattern", [8301])}, "TG18GA10Pattern": {"109873": ("TG18-GA10 Pattern", [8301])}, "TG18GA15Pattern": {"109874": ("TG18-GA15 Pattern", [8301])}, "TG18GA20Pattern": {"109875": ("TG18-GA20 Pattern", [8301])}, "TG18GA25Pattern": {"109876": ("TG18-GA25 Pattern", [8301])}, "TG18GA30Pattern": {"109877": ("TG18-GA30 Pattern", [8301])}, "TG18GQBPattern": {"109869": ("TG18-GQB Pattern", [8301])}, "TG18GQNPattern": {"109868": ("TG18-GQN Pattern", [8301])}, "TG18GQPattern": {"109867": ("TG18-GQ Pattern", [8301])}, "TG18GVNPattern": {"109866": ("TG18-GVN Pattern", [8301])}, "TG18GVPattern": {"109865": ("TG18-GV Pattern", [8301])}, "TG18KNImage": {"109879": ("TG18-KN Image", [8301])}, "TG18LN1201Pattern": {"109823": ("TG18-LN12-01 Pattern", [8301])}, "TG18LN1202Pattern": {"109824": ("TG18-LN12-02 Pattern", [8301])}, "TG18LN1203Pattern": {"109825": ("TG18-LN12-03 Pattern", [8301])}, "TG18LN1204Pattern": {"109826": ("TG18-LN12-04 Pattern", [8301])}, "TG18LN1205Pattern": {"109827": ("TG18-LN12-05 Pattern", [8301])}, "TG18LN1206Pattern": {"109828": ("TG18-LN12-06 Pattern", [8301])}, "TG18LN1207Pattern": {"109829": ("TG18-LN12-07 Pattern", [8301])}, "TG18LN1208Pattern": {"109830": ("TG18-LN12-08 Pattern", [8301])}, "TG18LN1209Pattern": {"109831": ("TG18-LN12-09 Pattern", [8301])}, "TG18LN1210Pattern": {"109832": ("TG18-LN12-10 Pattern", [8301])}, "TG18LN1211Pattern": {"109833": ("TG18-LN12-11 Pattern", [8301])}, "TG18LN1212Pattern": {"109834": ("TG18-LN12-12 Pattern", [8301])}, "TG18LN1213Pattern": {"109835": ("TG18-LN12-13 Pattern", [8301])}, "TG18LN1214Pattern": {"109836": ("TG18-LN12-14 Pattern", [8301])}, "TG18LN1215Pattern": {"109837": ("TG18-LN12-15 Pattern", [8301])}, "TG18LN1216Pattern": {"109838": ("TG18-LN12-16 Pattern", [8301])}, "TG18LN1217Pattern": {"109839": ("TG18-LN12-17 Pattern", [8301])}, "TG18LN1218Pattern": {"109840": ("TG18-LN12-18 Pattern", [8301])}, "TG18LN801Pattern": {"109805": ("TG18-LN8-01 Pattern", [8301])}, "TG18LN802Pattern": {"109806": ("TG18-LN8-02 Pattern", [8301])}, "TG18LN803Pattern": {"109807": ("TG18-LN8-03 Pattern", [8301])}, "TG18LN804Pattern": {"109808": ("TG18-LN8-04 Pattern", [8301])}, "TG18LN805Pattern": {"109809": ("TG18-LN8-05 Pattern", [8301])}, "TG18LN806Pattern": {"109810": ("TG18-LN8-06 Pattern", [8301])}, "TG18LN807Pattern": {"109811": ("TG18-LN8-07 Pattern", [8301])}, "TG18LN808Pattern": {"109812": ("TG18-LN8-08 Pattern", [8301])}, "TG18LN809Pattern": {"109813": ("TG18-LN8-09 Pattern", [8301])}, "TG18LN810Pattern": {"109814": ("TG18-LN8-10 Pattern", [8301])}, "TG18LN811Pattern": {"109815": ("TG18-LN8-11 Pattern", [8301])}, "TG18LN812Pattern": {"109816": ("TG18-LN8-12 Pattern", [8301])}, "TG18LN813Pattern": {"109817": ("TG18-LN8-13 Pattern", [8301])}, "TG18LN814Pattern": {"109818": ("TG18-LN8-14 Pattern", [8301])}, "TG18LN815Pattern": {"109819": ("TG18-LN8-15 Pattern", [8301])}, "TG18LN816Pattern": {"109820": ("TG18-LN8-16 Pattern", [8301])}, "TG18LN817Pattern": {"109821": ("TG18-LN8-17 Pattern", [8301])}, "TG18LN818Pattern": {"109822": ("TG18-LN8-18 Pattern", [8301])}, "TG18LPH10Pattern": {"109855": ("TG18-LPH10 Pattern", [8301])}, "TG18LPH50Pattern": {"109856": ("TG18-LPH50 Pattern", [8301])}, "TG18LPH89Pattern": {"109857": ("TG18-LPH89 Pattern", [8301])}, "TG18LPV10Pattern": {"109858": ("TG18-LPV10 Pattern", [8301])}, "TG18LPV50Pattern": {"109859": ("TG18-LPV50 Pattern", [8301])}, "TG18LPV89Pattern": {"109860": ("TG18-LPV89 Pattern", [8301])}, "TG18MM1Image": {"109880": ("TG18-MM1 Image", [8301])}, "TG18MM2Image": {"109881": ("TG18-MM2 Image", [8301])}, "TG18MPPattern": {"109846": ("TG18-MP Pattern", [8301])}, "TG18NS10Pattern": {"109862": ("TG18-NS10 Pattern", [8301])}, "TG18NS50Pattern": {"109863": ("TG18-NS50 Pattern", [8301])}, "TG18NS89Pattern": {"109864": ("TG18-NS89 Pattern", [8301])}, "TG18PQCPattern": {"109803": ("TG18-PQC Pattern", [8301])}, "TG18PXPattern": {"109853": ("TG18-PX Pattern", [8301])}, "TG18QCPattern": {"109801": ("TG18-QC Pattern", [8301])}, "TG18RH10Pattern": {"109847": ("TG18-RH10 Pattern", [8301])}, "TG18RH50Pattern": {"109848": ("TG18-RH50 Pattern", [8301])}, "TG18RH89Pattern": {"109849": ("TG18-RH89 Pattern", [8301])}, "TG18RV10Pattern": {"109850": ("TG18-RV10 Pattern", [8301])}, "TG18RV50Pattern": {"109851": ("TG18-RV50 Pattern", [8301])}, "TG18RV89Pattern": {"109852": ("TG18-RV89 Pattern", [8301])}, "TG18UN10Pattern": {"109841": ("TG18-UN10 Pattern", [8301])}, "TG18UN80Pattern": {"109842": ("TG18-UN80 Pattern", [8301])}, "TG18UNL10Pattern": {"109843": ("TG18-UNL10 Pattern", [8301, 8302])}, "TG18UNL80Pattern": {"109844": ("TG18-UNL80 Pattern", [8301, 8302])}, "THK5351F18": {"126717": ("THK5351 F^18^", [])}, "TRC10589Zr": {"126749": ("TRC105 ^89^Zr", [4021])}, "TSPyramid": {"122564": ("TS Pyramid", [3453])}, "TWave": {"109051": ("T wave", [3339])}, "Table": {"128459": ("Table", [10066])}, "TableCore": {"128460": ("Table Core", [10066])}, "TableCradleTiltAngle": {"113756": ("Table Cradle Tilt Angle", [])}, "TableCradleTiltEndAngle": {"128765": ("Table Cradle Tilt End Angle", [])}, "TableHeadTiltAngle": {"113754": ("Table Head Tilt Angle", [])}, "TableHeadTiltEndAngle": {"128763": ("Table Head Tilt End Angle", [])}, "TableHeightEndPosition": {"113761": ("Table Height End Position", [10008])}, "TableHeightPosition": {"113753": ("Table Height Position", [10008])}, "TableHorizontalRotationAngle": {"113755": ("Table Horizontal Rotation Angle", [])}, "TableHorizontalRotationEndAngle": { "128764": ("Table Horizontal Rotation End Angle", []) }, "TableLateralEndPosition": {"113760": ("Table Lateral End Position", [10008])}, "TableLateralPosition": {"113752": ("Table Lateral Position", [10008])}, "TableLongitudinalEndPosition": { "113759": ("Table Longitudinal End Position", [10008]) }, "TableLongitudinalPosition": {"113751": ("Table Longitudinal Position", [10008])}, "TableMount": {"113952": ("Table Mount", [10031])}, "TableOfValues": {"121424": ("Table of Values", [228])}, "TableOfValuesCitation": {"121422": ("Table of Values Citation", [228])}, "TableOuterLiner": {"128461": ("Table Outer Liner", [10066])}, "TablePad": {"128462": ("Table Pad", [10066])}, "TableXEndPositionToIsocenter": { "128769": ("Table X End Position to Isocenter", [10008]) }, "TableXPositionToIsocenter": {"128766": ("Table X Position to Isocenter", [10008])}, "TableYEndPositionToIsocenter": { "128770": ("Table Y End Position to Isocenter", [10008]) }, "TableYPositionToIsocenter": {"128767": ("Table Y Position to Isocenter", [10008])}, "TableZEndPositionToIsocenter": { "128771": ("Table Z End Position to Isocenter", [10008]) }, "TableZPositionToIsocenter": {"128768": ("Table Z Position to Isocenter", [10008])}, "TabularDataAlgorithm": {"128479": ("Tabular Data Algorithm", [10068])}, "TapTestBegin": {"130895": ("Tap test begin", [3039])}, "TapTestEnd": {"130896": ("Tap test end", [3039])}, "TargestarB": {"125907": ("Targestar-B", [12030])}, "TargestarP": {"125908": ("Targestar-P", [12030])}, "Target": {"112162": ("Target", [6132])}, "TargetCompletelyContainedInTheSpecimen": { "111443": ("Target completely contained in the specimen", []) }, "TargetContainedInTheSpecimen": { "111443": ("Target contained in the specimen", [6066]) }, "TargetContentItemsAreRelatedContraLaterally": { "111155": ("Target Content Items are related contra-laterally", [6035]) }, "TargetContentItemsAreRelatedSpatially": { "111154": ("Target Content Items are related spatially", [6035]) }, "TargetContentItemsAreRelatedTemporally": { "111153": ("Target Content Items are related temporally", [6035]) }, "TargetExposureIndex": {"113846": ("Target Exposure Index", [])}, "TargetLesionAtBaseline": {"112074": ("Target Lesion at Baseline", [6145])}, "TargetLesionCompleteResponse": { "112041": ("Target Lesion Complete Response", [6143, 6144]) }, "TargetLesionPartialResponse": { "112042": ("Target Lesion Partial Response", [6143, 6144]) }, "TargetLesionProgressiveDisease": { "112043": ("Target Lesion Progressive Disease", [6143, 6144]) }, "TargetLesionStableDisease": { "112044": ("Target Lesion Stable Disease", [6143, 6144]) }, "TargetNotInTheSpecimen": {"111445": ("Target not in the specimen", [6066])}, "TargetPartiallyObtainedInTheSpecimen": { "111444": ("Target partially obtained in the specimen", [6066]) }, "TargetRegion": {"123014": ("Target Region", [])}, "Targeted": {"111127": ("Targeted", [6051, 6058, 6061])}, "Tau": { "109072": ( "Tau", [ 3337, 3613, 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "TauM": {"126330": ("tau_m", [218, 4107, 7180, 7469])}, "TaxonomicRankOfOrigin": {"127402": ("Taxonomic rank of origin", [])}, "TeachingFileCategory": {"128723": ("Teaching File Category", [])}, "TechNote": {"121171": ("Tech Note", [3401])}, "TechnicalFactorsMissing": {"111194": ("Technical factors missing", [6041])}, "Technologist": {"121083": ("Technologist", [])}, "Teichholz": {"125209": ("Teichholz", [12227, 12228])}, "TeletherapyIsotope": {"130040": ("Teletherapy Isotope", [])}, "TemperatureEncoded": {"113067": ("Temperature encoded", [218, 7180, 7469])}, "TemporalDerivativeExceedsThreshold": { "126373": ("Temporal Derivative Exceeds Threshold", [4104, 4106]) }, "TemporalDerivativeThreshold": { "126374": ("Temporal Derivative Threshold", [218, 4109, 7180, 7469]) }, "TemporalPredecessor": {"121348": ("Temporal Predecessor", [7201])}, "TemporalSuccessor": {"121349": ("Temporal Successor", [7201])}, "TemporallyRelatedFramesExtractedFromTheSetOfVolumes": { "113092": ( "Temporally-related frames extracted from the set of volumes", [7203], ) }, "TerminatedByScanner": {"130177": ("Terminated by scanner", [67, 71])}, "TerminatedDueToAirDetected": { "130176": ("Terminated due to air detected", [67, 71]) }, "TerminatedDueToConsumableRemoval": { "130179": ("Terminated due to consumable removal", [67, 71]) }, "TerminatedDueToCriticalBatteryLevel": { "130178": ("Terminated due to critical battery level", [67, 71]) }, "TerminatedDueToExcessiveDurationPause": { "130158": ("Terminated due to excessive duration pause", [67, 71]) }, "TerminatedDueToFlowRateAboveTerminationLimit": { "130157": ("Terminated due to flow rate above termination limit", [67, 71]) }, "TerminatedDueToInjectorCommunicationLoss": { "130159": ("Terminated due to injector communication loss", [67, 71]) }, "TerminatedDueToPressureAboveTerminationLimit": { "130156": ("Terminated due to pressure above termination limit", [67, 71]) }, "TerminatedDueToRequestFromOperator": { "130154": ("Terminated due to request from operator", [67, 71]) }, "TerminatedDueToUnspecifiedInjectorFailure": { "130160": ("Terminated due to unspecified injector failure", [67, 71]) }, "TerminatedHoldDueToTimeout": {"130269": ("Terminated hold due to timeout", [71])}, "TerritoryRegionSeverity": {"122459": ("Territory Region Severity", [])}, "TextureDescriptor": {"112010": ("Texture Descriptor", [])}, "TextureMap": {"TEXTUREMAP": ("Texture Map", [32, 33])}, "ThermalImager": {"130647": ("Thermal Imager", [9573, 9575])}, "Thermography": {"TG": ("Thermography", [29, 30, 33])}, "ThickeningAnalysis": {"122607": ("Thickening Analysis", [])}, "ThicknessDeviationCategoryFromNormativeData": { "111931": ("Thickness deviation category from normative data", [4263]) }, "ThicknessDeviationFromNormativeData": { "111932": ("Thickness deviation from normative data", [4263]) }, "ThinningMyocardium": {"122114": ("Thinning Myocardium", [3704])}, "ThoracicImagingSpecialty": {"128015": ("Thoracic Imaging Specialty", [7449])}, "ThoracicRadiology": {"128179": ("Thoracic Radiology", [7030])}, "ThoracicRespiratoryEffort": {"130431": ("Thoracic Respiratory Effort", [3005])}, "ThoracicRespiratoryInductance": { "130427": ("Thoracic Respiratory Inductance", [3005]) }, "ThoracicRespiratoryPVDF": {"130429": ("Thoracic Respiratory PVDF", [3005])}, "ThoraxDiameterSagittal": {"122221": ("Thorax diameter, sagittal", [])}, "ThreeDimensionalMethod": {"112189": ("Three-dimensional method", [6140])}, "ThresholdAttenuationCoefficient": { "112032": ("Threshold Attenuation Coefficient", []) }, "ThresholdRelated": {"111839": ("Threshold related", [4252])}, "ThresholdValue": {"122411": ("Threshold Value", [])}, "ThroughTransducerIllumination": { "130813": ("Through-transducer illumination", [11001]) }, "Time": {"110858": ("Time", [7182])}, "TimeAfterStartOfRadiation": {"130799": ("Time after start of Radiation", [])}, "TimeAfterTheStartOfInjection": { "130194": ("Time after the start of injection", []) }, "TimeCourseOfSignal": {"113066": ("Time course of signal", [218, 7180, 7469])}, "TimeDomain": {"111920": ("Time domain", [4261])}, "TimeIntervalSinceDetectionOfContrastBolus": { "122668": ("Time interval since detection of contrast bolus", []) }, "TimeIntervalSinceInjectionOfContrastMedia": { "122665": ("Time interval since injection of contrast media", []) }, "TimeOfFlight": {"114201": ("Time of flight", [8201])}, "TimeOfFlightAngioMRSignalIntensity": { "110802": ("Time Of Flight Angio MR Signal Intensity", [218, 7180, 7469]) }, "TimeOfLeadingHalfPeakConcentration": { "126372": ( "Time of Leading Half-Peak Concentration", [218, 4104, 4106, 4109, 7180, 7469], ) }, "TimeOfPeakConcentration": { "126370": ("Time of Peak Concentration", [218, 4104, 4106, 4109, 7180, 7469]) }, "TimePointOrder": {"126073": ("Time Point Order", [])}, "TimePointType": {"126072": ("Time Point Type", [])}, "TimeRelativeToRWavePeak": {"122666": ("Time relative to R-wave peak", [])}, "TimeSinceStartOfStage": {"122710": ("Time since start of stage", [])}, "TimeToPeak": {"113069": ("Time To Peak", [218, 4108, 4109, 7180, 7469])}, "TimeToPeakLongitudinalLagrangianStrain": { "130672": ("Time to Peak Longitudinal Lagrangian Strain", [12304, 12311]) }, "TimeframeUncertain": {"111399": ("Timeframe uncertain", [])}, "TimerInterlock": {"130477": ("Timer Interlock", [9561, 9568])}, "TissueAirRatio": {"128433": ("Tissue Air Ratio", [10069])}, "TissueFraction": {"128526": ("Tissue Fraction", [10069])}, "TissueNotOfInterest": {"130751": ("Tissue not of interest", [7151, 7165, 7196])}, "TissueOfOrigin": {"127401": ("Tissue of origin", [])}, "TissueSelectionMethod": {"112713": ("Tissue selection method", [])}, "TissueVelocity": {"110827": ("Tissue Velocity", [218, 7180, 7469])}, "TitaniumAlloyTitaniumMolybdenum15Zirconium5Aluminium3": { "130736": ( "Titanium alloy (Titanium Molybdenum-15 Zirconium-5 Aluminium-3)", [7300, 9579], ) }, "Title21CFRSection900SubpartB": { "111239": ("Title 21 CFR Section 900, Subpart B", [6045, 6326]) }, "Tmax": {"113084": ("Tmax", [218, 4108, 7180, 7469])}, "TooSmall": {"112133": ("Too small", [6118])}, "ToolFabrication": {"129014": ("Tool Fabrication", [7064])}, "TopZLocationOfReconstructableVolume": { "113895": ("Top Z Location of Reconstructable Volume", []) }, "TopZLocationOfScanningLength": { "113897": ("Top Z Location of Scanning Length", []) }, "TopographicBeam": {"130109": ("Topographic Beam", [9512, 9524, 9583])}, "TotalAcquisitionTime": {"113855": ("Total Acquisition Time", [])}, "TotalBodyIrradiation": {"130341": ("Total Body Irradiation", [9543])}, "TotalCholesterolScoreSheetForMen": { "122235": ("Total Cholesterol Score Sheet for Men", [3668]) }, "TotalCholesterolScoreSheetForWomen": { "122236": ("Total Cholesterol Score Sheet for Women", [3668]) }, "TotalCorneaPowerMeasurementMethod": { "111758": ("Total Cornea Power Measurement Method", [4242]) }, "TotalDurationInHousing": {"127150": ("Total duration in housing", [])}, "TotalDurationOfLightDarkCycle": { "127214": ("Total duration of light-dark cycle", []) }, "TotalFluoroTime": {"113730": ("Total Fluoro Time", [10050])}, "TotalInternalReflectionFluorescence": { "111749": ("Total internal reflection fluorescence", [8123]) }, "TotalKeepVeinOpenVolumeAdministered": { "130165": ("Total Keep Vein Open Volume Administered", []) }, "TotalLesionGlycolysis": {"126033": ("Total Lesion Glycolysis", [7466])}, "TotalLesionProliferation": {"126035": ("Total Lesion Proliferation", [7466])}, "TotalNumberOfIrradiationEvents": { "113812": ("Total Number of Irradiation Events", []) }, "TotalNumberOfManuallyTriggeredInjections": { "130242": ("Total number of manually triggered injections", []) }, "TotalNumberOfRadiographicFrames": { "113731": ("Total Number of Radiographic Frames", [10050]) }, "TotalPhaseVolumeAdministered": {"130240": ("Total Phase Volume Administered", [])}, "TotalPlaqueVolume": {"122376": ("Total Plaque Volume", [3485])}, "TotalPulmonaryResistance": {"122215": ("Total Pulmonary Resistance", [3619])}, "TotalRetinalThicknessILMToBM": { "111929": ("Total retinal thickness (ILM to BM)", [4262]) }, "TotalRetinalThicknessILMToISOS": { "111927": ("Total retinal thickness (ILM to IS-OS)", [4262]) }, "TotalRetinalThicknessILMToRPE": { "111928": ("Total retinal thickness (ILM to RPE)", [4262]) }, "TotalSkinIrradiation": {"130342": ("Total Skin Irradiation", [9543])}, "TotalStepVolumeAdministered": {"130241": ("Total Step Volume Administered", [])}, "TotalVascularResistance": {"122216": ("Total Vascular Resistance", [3619])}, "Trace": {"113201": ("Trace", [7263])}, "TracerConcentration": { "126377": ("Tracer Concentration", [218, 4109, 7180, 7469]) }, "TrackingIdentifier": {"112039": ("Tracking Identifier", [])}, "TrackingUniqueIdentifier": {"112040": ("Tracking Unique Identifier", [])}, "TramlineShadow": {"112116": ("Tramline shadow", [6102, 6103])}, "Transcription": {"110006": ("Transcription", [9231])}, "TranscriptionOutput": {"110012": ("Transcription", [])}, "TransesophagealTransducer": {"125262": ("Transesophageal Transducer", [12035])}, "TransformationMatrix": {"130520": ("Transformation Matrix", [])}, "TransitTimeTestInjection": {"130248": ("Transit Time Test Injection", [72])}, "TransmissionIllumination": {"111741": ("Transmission illumination", [8123])}, "TransmitFrequency": {"122098": ("Transmit Frequency", [3423])}, "TransponderMarker": {"129306": ("Transponder Marker", [7111, 7112])}, "Trastuzumab89Zr": {"126512": ("Trastuzumab ^89^Zr", [4021])}, "TreadmillGradient": {"122703": ("Treadmill gradient", [])}, "TreadmillSpeed": {"122702": ("Treadmill speed", [])}, "TreatedVolume": {"130059": ("Treated Volume", [9534])}, "TreatmentDeliveryType": {"121740": ("Treatment Delivery Type", [9250])}, "TreatmentExceedsPatientTolerance": { "130665": ("Treatment exceeds patient tolerance", [9576]) }, "TreatmentMachineIsocenter": { "130359": ("Treatment Machine Isocenter", [9544, 9554]) }, "TreatmentPlanningNote": {"130024": ("Treatment Planning Note", [])}, "TreatmentTerminated": {"130453": ("Treatment Terminated", [9563])}, "TreatmentUnnecessary": {"130664": ("Treatment unnecessary", [9576])}, "TreeInBudSign": {"112127": ("Tree-in-bud sign", [6102, 6104])}, "Trend": {"122151": ("Trend", [])}, "TrigeminalNodeSet": {"130364": ("Trigeminal Node Set", [9556])}, "TrueLumen": {"122360": ("True Lumen", [3494])}, "TruncatedGaussianDiffusionModel": { "113255": ("Truncated Gaussian diffusion model", [7273]) }, "TrustRegion": {"113266": ("Trust-Region", [7274])}, "TubularShadow": {"112117": ("Tubular shadow", [6102, 6103])}, "TumorBoardInputUsed": {"128221": ("Tumor Board Input Used", [7010])}, "TumorGraft": {"127460": ("Tumor Graft", [637])}, "TumorRegistryInputUsed": {"128222": ("Tumor Registry Input Used", [7010])}, "TurbulenceResistance": {"122550": ("Turbulence Resistance", [])}, "TurntableScanMethod": {"114209": ("Turntable Scan Method", [8202])}, "TwoChamber": {"122565": ("Two Chamber", [3453])}, "TwoCompartmentExchange2CXModel": { "126347": ("Two Compartment Exchange (2CX) Model", [4101, 4106]) }, "TwoDimensionalMethod": {"112188": ("Two-dimensional method", [6140])}, "TypeOfContent": {"112009": ("Type of Content", [])}, "TypeOfMyocardialInfarction": {"122170": ("Type of Myocardial Infarction", [])}, "UDI": {"128739": ("UDI", [])}, "URI": {"110037": ("URI", [405])}, "US3DCAMModel": {"129018": ("US 3D CAM model", [7061])}, "USBDiskEmulation": {"110030": ("USB Disk Emulation", [405])}, "Ublituximab89Zr": {"126739": ("Ublituximab ^89^Zr", [4021])}, "Ultrasound": {"US": ("Ultrasound", [29, 30, 33])}, "UltrasoundAttenuation": {"110833": ("Ultrasound Attenuation", [218, 7180, 7469])}, "UltrasoundBoneDensitometry": { "BDUS": ("Ultrasound Bone Densitometry", [29, 30, 33]) }, "UltrasoundContact": {"111750": ("Ultrasound Contact", [4230])}, "UltrasoundImagingSubjectMatter": { "128736": ("Ultrasound imaging subject matter", [7017]) }, "UltrasoundImmersion": {"111751": ("Ultrasound Immersion", [4230])}, "Ultrasound_Retired": {"111137": ("Ultrasound", [])}, "UnavailabilityOfABeamModifier": { "130466": ("Unavailability of a Beam Modifier", [9565]) }, "Unavailable": {"UNAVAILABLE": ("Unavailable", [50])}, "UnclassifiedCombination": {"130081": ("Unclassified Combination", [9508])}, "UnclassifiedVolume": {"130048": ("Unclassified Volume", [9508])}, "UncompressedPredecessor": {"121320": ("Uncompressed predecessor", [7202])}, "UnderExposed": {"111211": ("Under exposed", [6041, 6135, 7011])}, "Underflow": {"114004": ("Underflow", [42, 43])}, "UndeterminedSex": {"121103": ("Undetermined sex", [7455])}, "UndilutedDoseAdministered": {"122092": ("Undiluted dose administered", [3410])}, "Unheated": {"127255": ("Unheated", [635])}, "UniformSpeedOfSoundCorrection": { "130818": ("Uniform Speed of Sound Correction", [11004]) }, "Uninvolved": {"111470": ("Uninvolved", [])}, "UniqueDeviceIdentifiers": {"121000": ("Unique Device Identifiers", [])}, "UnitSerialIdentifier": {"121148": ("Unit Serial Identifier", [3426])}, "UnitedAllBreedRegistry": {"109217": ("United All Breed Registry", [7481])}, "UnitedKennelClub": {"109218": ("United Kennel Club", [7481])}, "UniversalKennelClubInternational": { "109219": ("Universal Kennel Club International", [7481]) }, "UnknownFailure": {"111221": ("Unknown failure", [6041, 6135, 7011])}, "UnknownSex": {"U": ("Unknown sex", [7455])}, "UnmountedDetector": {"113953": ("Unmounted Detector", [10031])}, "UnsharpMask": {"113089": ("Unsharp mask", [7203])}, "Unspecified": {"111176": ("Unspecified", [6040])}, "UnspecifiedGynecologicalHormone": { "111542": ("Unspecified gynecological hormone", [6080]) }, "UnspecifiedMethodOfCalculation": { "112187": ("Unspecified method of calculation", [6140]) }, "UntrackableMeasurement": {"125304": ("Untrackable Measurement", [])}, "UnusableQualityRendersImageUnusable": { "111235": ("Unusable - Quality renders image unusable", [3114, 6044]) }, "Unused": {"127177": ("Unused", [604])}, "UnwantedSubtractionImages": { "130582": ("Unwanted subtraction images", [6315, 6317]) }, "UprightStandMount": {"113954": ("Upright Stand Mount", [10031])}, "UsableDoesNotMeetTheQualityControlStandard": { "111236": ("Usable - Does not meet the quality control standard", [6044]) }, "UsableMeetsTheQualityControlStandard": { "111237": ("Usable - Meets the quality control standard", [6044]) }, "UseOfRestrictedFunction": {"110132": ("Use of Restricted Function", [401, 403])}, "UsedSubstanceType": {"111546": ("Used Substance Type", [])}, "UserAuthentication": {"110114": ("User Authentication", [400])}, "UserChosenValue": {"121410": ("User chosen value", [224, 4241, 4252, 12301])}, "UserDefinedAIFROI": {"126362": ("User-defined AIF ROI", [4103, 4106])}, "UserSecurityAttributesChanged": { "110137": ("User Security Attributes Changed", [401, 403]) }, "UserSelectedFiducial": {"112356": ("User Selected Fiducial", [])}, "UserSelectedMethod": {"122575": ("User selected method", [3456])}, "UterineMalformations": {"111565": ("Uterine malformations", [6087, 6088])}, "UtricleCyst": {"130569": ("Utricle cyst", [6313])}, "VMAT": {"130107": ("VMAT", [9511, 9524, 9583])}, "VMaxMyocardial": {"109073": ("V max myocardial", [3337])}, "VO2Equals152BSA": {"122250": ("VO2 = 152 * BSA", [3664])}, "VO2Equals175BSA": {"122251": ("VO2 = 175 * BSA", [3664])}, "VO2Equals176BSA": {"122252": ("VO2 = 176 * BSA", [3664])}, "VO2EqualsVestpd10FIO2FE02": { "122249": ("VO2 = VeSTPD * 10 * (FIO2 - FE02)", [3664]) }, "VVulnerablePlaque": {"130735": ("V - Vulnerable plaque", [3022])}, "VWave": {"109052": ("V wave", [3339])}, "VWaveOfNextBeat": {"109053": ("V wave of next beat", [3339])}, "VWavePeakPressure": {"109034": ("V wave peak pressure", [3337, 3611])}, "VWavePressureAverage": {"109035": ("V wave pressure, average", [3337])}, "VacuumAssisted": {"111490": ("Vacuum assisted", [6058, 6060])}, "VacuumMold": { "130118": ("Vacuum Mold", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "VaginalCylinder": { "130121": ("Vaginal Cylinder", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "ValueBasedImage": {"129322": ("Value-based Image", [])}, "ValueIndeterminate": {"114011": ("Value indeterminate", [42, 44])}, "ValueOutOfRange": {"114009": ("Value out of range", [42, 43])}, "ValueTiming": {"130518": ("Value Timing", [])}, "ValueUnknown": {"114010": ("Value unknown", [42, 44])}, "ValveClose": {"109036": ("Valve close", [3337])}, "ValveOpen": {"109037": ("Valve open", [3337])}, "ValvularIntervention": {"122053": ("Valvular Intervention", [3405, 3406])}, "VariableCircularCollimator": { "130332": ("Variable Circular Collimator", [9540, 9541]) }, "VascularAndInterventionalImagingSubjectMatter": { "128734": ("Vascular and interventional imaging subject matter", [7017]) }, "VascularFunctionalAnalysis": {"122606": ("Vascular Functional Analysis", [])}, "VascularImagingSpecialty": {"128017": ("Vascular Imaging Specialty", [7449])}, "VascularIntervention": {"122056": ("Vascular Intervention", [3405, 3406])}, "VascularMorphologicalAnalysis": { "122605": ("Vascular Morphological Analysis", []) }, "VascularUltrasoundProcedureReport": { "125100": ("Vascular Ultrasound Procedure Report", []) }, "VascularVolumeMeasurementLength": { "122336": ("Vascular Volume measurement length", []) }, "Vascularity": {"111372": ("Vascularity", [])}, "VascularityNotAssessed": {"111374": ("Vascularity not assessed", [6157])}, "VascularityNotPresent": {"111373": ("Vascularity not present", [6157])}, "VascularityPresentImmediatelyAdjacentToLesion": { "111376": ("Vascularity present immediately adjacent to lesion", [6157]) }, "VascularityPresentInLesion": {"111375": ("Vascularity present in lesion", [6157])}, "Vasoconstriction": {"112077": ("Vasoconstriction", [6107])}, "Vasodilation": {"112078": ("Vasodilation", [6107])}, "Ve": {"126314": ("ve", [218, 4107, 7180, 7469])}, "Vector": {"121225": ("Vector", [7551, 7553])}, "VeilingGlareEvaluation": {"109707": ("Veiling glare evaluation", [8300])}, "VelocityEncoded": {"113070": ("Velocity encoded", [218, 7180, 7469])}, "VelocityEncodingMaximumValue": {"122643": ("Velocity Encoding Maximum Value", [])}, "VelocityEncodingMinimumValue": {"122642": ("Velocity Encoding Minimum Value", [])}, "VenaContractaWidth": {"125334": ("Vena Contracta Width", [12304])}, "VentralDiencephalon": {"110700": ("Ventral Diencephalon", [7140])}, "VentricularAnalysis": {"122601": ("Ventricular Analysis", [])}, "VentricularEndDiastolicPressure": { "122191": ("Ventricular End Diastolic pressure", [3611]) }, "VentricularPressureMeasurements": { "122122": ("Ventricular pressure measurements", []) }, "VentricularSystolicBloodPressure": { "122194": ("Ventricular Systolic blood pressure", []) }, "Verbal": {"121004": ("Verbal", [])}, "Verifying": {"121098": ("Verifying", [7453])}, "VertebralIntervertebralNotch": { "112097": ("Vertebral Intervertebral Notch", [6115, 8134]) }, "VerticalPixelSpacing": {"111066": ("Vertical Pixel Spacing", [])}, "VerticalPrismBase": {"111678": ("Vertical Prism Base", [])}, "VerticalPrismPower": {"111677": ("Vertical Prism Power", [])}, "VerySmall": {"112132": ("Very small", [6118])}, "VeryStrongFamilyHistoryOfBreastCancer": { "111561": ("Very strong family history of breast cancer", [6081, 6087]) }, "VesselBranch": {"125101": ("Vessel Branch", [])}, "VesselLumenCrossSectionalArea": { "122480": ("Vessel Lumen Cross-Sectional Area", []) }, "VesselMorphology": {"122134": ("Vessel Morphology", [])}, "VideoRecordingOff": {"130888": ("Video recording off", [3039])}, "VideoRecordingOn": {"130887": ("Video recording on", [3039])}, "VideoTapeDigitized": {"110022": ("Video Tape Digitized", [7008])}, "VideoTapeDigitizerEquipment": {"VIDD": ("Video Tape Digitizer Equipment", [7005])}, "Videofluorography": {"VF": ("Videofluorography", [])}, "ViewAndLateralityMarkerDoesNotHaveApprovedCodes": { "111179": ("View and Laterality Marker does not have approved codes", [6041]) }, "ViewAndLateralityMarkerDoesNotHaveBothViewAndLaterality": { "111178": ( "View and Laterality Marker does not have both view and laterality", [6041], ) }, "ViewAndLateralityMarkerIsIncorrect": { "111183": ("View and Laterality Marker is incorrect", [6041]) }, "ViewAndLateralityMarkerIsMissing": { "111177": ("View and Laterality Marker is missing", [6041]) }, "ViewAndLateralityMarkerIsNotNearTheAxilla": { "111180": ("View and Laterality Marker is not near the axilla", [6041]) }, "ViewAndLateralityMarkerIsOffImage": { "111184": ("View and Laterality Marker is off image", [6041]) }, "ViewAndLateralityMarkerIsPartiallyObscured": { "111182": ("View and Laterality Marker is partially obscured", [6041]) }, "ViewAndLateralityMarkerOverlapsBreastTissue": { "111181": ("View and Laterality Marker overlaps breast tissue", [6041]) }, "VirginalHyperplasia": {"111298": ("Virginal hyperplasia", [6030, 6031])}, "VirtualGrid": {"111640": ("Virtual grid", [10017])}, "ViscosityAt37C": {"130186": ("Viscosity at 37C", [])}, "VisibleReflectorMarker": {"129310": ("Visible Reflector Marker", [7111, 7112])}, "VisualAcuity": {"VA": ("Visual Acuity", [29, 30, 33])}, "VisualAlignment": {"125025": ("Visual Alignment", [7100])}, "VisualExplanation": {"130401": ("Visual explanation", [])}, "VisualField07TestPattern": {"111812": ("Visual Field 07 Test Pattern", [4250])}, "VisualField10To2TestPattern": { "111801": ("Visual Field 10-2 Test Pattern", [4250]) }, "VisualField1LTTestStrategy": { "111828": ("Visual Field 1-LT Test Strategy", [4251]) }, "VisualField24To2TestPattern": { "111800": ("Visual Field 24-2 Test Pattern", [4250]) }, "VisualField2LTDynamicTestStrategy": { "111833": ("Visual Field 2LT-Dynamic Test Strategy", [4251]) }, "VisualField2LTNormalTestStrategy": { "111834": ("Visual Field 2LT-Normal Test Strategy", [4251]) }, "VisualField2LTTestStrategy": { "111829": ("Visual Field 2-LT Test Strategy", [4251]) }, "VisualField30To2TestPattern": { "111802": ("Visual Field 30-2 Test Pattern", [4250]) }, "VisualField60To4TestPattern": { "111803": ("Visual Field 60-4 Test Pattern", [4250]) }, "VisualFieldCLASSStrategy": {"111837": ("Visual Field CLASS Strategy", [4251])}, "VisualFieldCLIPTestStrategy": { "111836": ("Visual Field CLIP Test Strategy", [4251]) }, "VisualFieldCentral40PointTestPattern": { "111805": ("Visual Field Central 40 Point Test Pattern", [4250]) }, "VisualFieldCentral76PointTestPattern": { "111806": ("Visual Field Central 76 Point Test Pattern", [4250]) }, "VisualFieldCentralTestPattern": { "111814": ("Visual Field Central Test Pattern", [4250]) }, "VisualFieldDynamicTestStrategy": { "111826": ("Visual Field Dynamic Test Strategy", [4251]) }, "VisualFieldFastThresholdTestStrategy": { "111835": ("Visual Field Fast Threshold Test Strategy", [4251]) }, "VisualFieldFastpacTestStrategy": { "111819": ("Visual Field FastPac Test Strategy", [4251]) }, "VisualFieldFullField120PointTestPattern": { "111809": ("Visual Field Full Field 120 Point Test Pattern", [4250]) }, "VisualFieldFullField81PointTestPattern": { "111808": ("Visual Field Full Field 81 Point Test Pattern", [4250]) }, "VisualFieldFullFromPriorTestStrategy": { "111820": ("Visual Field Full From Prior Test Strategy", [4251]) }, "VisualFieldFullThresholdTestStrategy": { "111818": ("Visual Field Full Threshold Test Strategy", [4251]) }, "VisualFieldGATETestStrategy": { "111831": ("Visual Field GATE Test Strategy", [4251]) }, "VisualFieldGTestPattern": {"111810": ("Visual Field G Test Pattern", [4250])}, "VisualFieldGateiTestStrategy": { "111832": ("Visual Field GATEi Test Strategy", [4251]) }, "VisualFieldIndex": {"111852": ("Visual Field Index", [4257])}, "VisualFieldLVCTestPattern": {"111813": ("Visual Field LVC Test Pattern", [4250])}, "VisualFieldLVSTestStrategy": { "111830": ("Visual Field LVS Test Strategy", [4251]) }, "VisualFieldLossDueToDiffuseDefect": { "111853": ("Visual Field Loss Due to Diffuse Defect", [4257]) }, "VisualFieldLossDueToLocalDefect": { "111854": ("Visual Field Loss Due to Local Defect", [4257]) }, "VisualFieldMTestPattern": {"111811": ("Visual Field M Test Pattern", [4250])}, "VisualFieldMaculaTestPattern": { "111804": ("Visual Field Macula Test Pattern", [4250]) }, "VisualFieldNormalTestStrategy": { "111827": ("Visual Field Normal Test Strategy", [4251]) }, "VisualFieldOptimaTestStrategy": { "111821": ("Visual Field Optima Test Strategy", [4251]) }, "VisualFieldPeripheral60PointTestPattern": { "111807": ("Visual Field Peripheral 60 Point Test Pattern", [4250]) }, "VisualFieldQuantifyDefectsTestStrategy": { "111824": ("Visual Field Quantify-Defects Test Strategy", [4251]) }, "VisualFieldSITAFastTestStrategy": { "111817": ("Visual Field SITA-Fast Test Strategy", [4251]) }, "VisualFieldSITASWAPTestStrategy": { "111816": ("Visual Field SITA-SWAP Test Strategy", [4251]) }, "VisualFieldSITAStandardTestStrategy": { "111815": ("Visual Field SITA-Standard Test Strategy", [4251]) }, "VisualFieldTOPTestStrategy": { "111825": ("Visual Field TOP Test Strategy", [4251]) }, "VisualFieldThreeZoneTestStrategy": { "111823": ("Visual Field Three-Zone Test Strategy", [4251]) }, "VisualFieldTwoZoneTestStrategy": { "111822": ("Visual Field Two-Zone Test Strategy", [4251]) }, "VisualFixationQualityDuringAcquisition": { "111696": ("Visual Fixation Quality During Acquisition", []) }, "VisualFixationQualityProblem": {"111697": ("Visual Fixation Quality Problem", [])}, "VisualMarkingOfSpecimen": {"111723": ("Visual Marking of Specimen", [])}, "VitreousStructuralReflectanceMap": { "128262": ("Vitreous structural reflectance map", [4271]) }, "VitreousVasculatureFlow": {"128261": ("Vitreous vasculature flow", [4271])}, "Vo2femaleEqualsBSA138Point117Point04LogeAge0Point378Hrf": { "122248": ("VO2female = BSA (138.1 - 17.04 * loge(age) + 0.378*HRf)", [3664]) }, "Vo2maleEqualsBSA138Point111Point49LogeAge0Point378Hrf": { "122247": ("VO2male = BSA (138.1 - 11.49 * loge(age) + 0.378*HRf)", [3664]) }, "Voice": {"109110": ("Voice", [3000])}, "VoltageMeasurement": {"109013": ("Voltage measurement", [3240])}, "VoltageMeasurementByBasketCatheter": { "109011": ("Voltage measurement by basket catheter", [3240]) }, "VoltageMeasurementByMappingCatheter": { "109012": ("Voltage measurement by mapping catheter", [3240]) }, "VolumeAdministered": {"122091": ("Volume administered", [3410])}, "VolumeBasedMethod": {"122652": ("Volume Based Method", [3807])}, "VolumeCorrespondingToSpatiallyRelatedAcquisitionFrames": { "121347": ( "Volume corresponding to spatially-related acquisition frames", [7201], ) }, "VolumeEditing": {"113077": ("Volume editing", [7203])}, "VolumeEstimatedFromSingle2DRegion": { "121216": ("Volume estimated from single 2D region", [218, 3471, 7469, 7472]) }, "VolumeEstimatedFromThreeOrMoreNonCoplanar2DRegions": { "121217": ( "Volume estimated from three or more non-coplanar 2D regions", [218, 7469, 7472], ) }, "VolumeEstimatedFromTwoNonCoplanar2DRegions": { "121218": ( "Volume estimated from two non-coplanar 2D regions", [218, 3471, 7469, 7472], ) }, "VolumeMethod": {"122429": ("Volume Method", [])}, "VolumeOccupancyImage": {"129328": ("Volume Occupancy Image", [])}, "VolumeOfBoundingThreeDimensionalRegion": { "121219": ("Volume of bounding three dimensional region", [218, 7469, 7472]) }, "VolumeOfBreast": {"112193": ("Volume of breast", [6142])}, "VolumeOfCircumscribedSphere": { "121220": ("Volume of circumscribed sphere", [218, 7469, 7472]) }, "VolumeOfEllipsoid": {"121221": ("Volume of ellipsoid", [218, 7469, 7472])}, "VolumeOfParenchymalTissue": {"112192": ("Volume of parenchymal tissue", [6142])}, "VolumeOfSphere": {"121222": ("Volume of sphere", [218, 7469, 7472])}, "VolumeOfUse": {"111580": ("Volume of use", [6092])}, "VolumeOfVascularCalcification": { "112197": ("Volume of Vascular Calcification", [6142]) }, "VolumeRatio": {"113288": ("Volume Ratio", [218, 7180, 7271, 7469])}, "VolumeRendering": {"113074": ("Volume rendering", [7203])}, "VolumeScanPattern": {"125242": ("Volume scan pattern", [12032])}, "VolumeScoringMethod": {"112056": ("Volume scoring method", [6140])}, "VolumeSurface": {"121231": ("Volume Surface", [])}, "VolumeUnadministeredOrDiscarded": { "122096": ("Volume unadministered or discarded", [3410]) }, "VolumetricDiffusionDxxComponent": { "110810": ( "Volumetric Diffusion Dxx Component", [218, 7180, 7186, 7263, 7270, 7469], ) }, "VolumetricDiffusionDxyComponent": { "110811": ( "Volumetric Diffusion Dxy Component", [218, 7180, 7186, 7263, 7270, 7469], ) }, "VolumetricDiffusionDxzComponent": { "110812": ( "Volumetric Diffusion Dxz Component", [218, 7180, 7186, 7263, 7270, 7469], ) }, "VolumetricDiffusionDyyComponent": { "110813": ( "Volumetric Diffusion Dyy Component", [218, 7180, 7186, 7263, 7270, 7469], ) }, "VolumetricDiffusionDyzComponent": { "110814": ( "Volumetric Diffusion Dyz Component", [218, 7180, 7186, 7263, 7270, 7469], ) }, "VolumetricDiffusionDzzComponent": { "110815": ( "Volumetric Diffusion Dzz Component", [218, 7180, 7186, 7263, 7270, 7469], ) }, "VoxelizedRadiationTransportModel": { "128422": ("Voxelized Radiation Transport Model", [10065]) }, "VoxelwiseSelectionOfBValue": { "113285": ("Voxelwise selection of b-value", [7275]) }, "Vp": {"126331": ("vp", [218, 4107, 7180, 7469])}, "VulnerablePlaque": {"122389": ("Vulnerable Plaque", [3491])}, "WHO": {"112029": ("WHO", [6147])}, "WSI20XRGB": {"112704": ("WSI 20X RGB", [8131])}, "WSI40XRGB": {"112705": ("WSI 40X RGB", [8131])}, "WallMass": {"122447": ("Wall Mass", [12255, 12257, 12258, 12259, 12265, 12271])}, "WallStress": {"122448": ("Wall Stress", [])}, "WallThickness": {"122445": ("Wall Thickness", [])}, "WallThicknessRatioEndSystolicToEndDiastolic": { "122624": ("Wall Thickness Ratio end-systolic to end-diastolic", []) }, "WallToSeptum": {"110877": ("Wall To Septum", [7185])}, "WallVolume": {"122446": ("Wall Volume", [])}, "WashoutDelayedPhaseType3Curve": { "130599": ("Washout delayed phase: Type 3 curve", [6335, 6345, 6346]) }, "WaterEquivalentDiameter": {"113980": ("Water Equivalent Diameter", [])}, "WaterEquivalentDiameterAtLongitudinalPositionZ": { "113995": ("Water Equivalent Diameter At Longitudinal Position Z", []) }, "WaterEquivalentDiameterFromLimitedFOVImages": { "113992": ("Water Equivalent Diameter From Limited FOV Images", []) }, "WaterEquivalentDiameterFromLocalizer": { "113984": ("Water Equivalent Diameter From Localizer", [10024, 10069]) }, "WaterEquivalentDiameterFromRawData": { "113983": ("Water Equivalent Diameter From Raw Data", [10024, 10069]) }, "WaterEquivalentDiameterIntegratedAcrossScanRange": { "113982": ( "Water Equivalent Diameter Integrated Across Scan Range", [10024, 10069], ) }, "WaterEquivalentDiameterRepresentativeValue": { "113981": ("Water Equivalent Diameter Representative Value", [10024, 10069]) }, "WaterFatInPhase": {"129101": ("Water/fat in phase", [218, 7180, 7469])}, "WaterFatOutOfPhase": {"129102": ("Water/fat out of phase", [218, 7180, 7469])}, "WaterFraction": {"129103": ("Water fraction", [218, 7180, 7469])}, "WaveformAcquired": {"121143": ("Waveform Acquired", [])}, "WeakFamilyHistoryOfBreastCancer": { "111559": ("Weak family history of breast cancer", [6081, 6087]) }, "WedgeFilter": {"113651": ("Wedge filter", [10007])}, "Wedging": {"112321": ("Wedging", [7310])}, "WeightExceedsEquipmentLimit": {"122764": ("Weight exceeds equipment limit", [])}, "WellDemarcated": {"112139": ("Well demarcated", [6120])}, "WhiteMatterT1Hypointensity": {"110701": ("White Matter T1 Hypointensity", [7140])}, "WhiteMatterT2Hyperintensity": { "110702": ("White Matter T2 Hyperintensity", [7140]) }, "WhitePattern": {"109941": ("White Pattern", [8301])}, "WholeBodyPod": { "130119": ("Whole Body Pod", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "WholeEyeStructuralReflectanceMap": { "128278": ("Whole eye structural reflectance map", [4271]) }, "WholeEyeVasculatureFlow": {"128277": ("Whole eye vasculature flow", [4271])}, "WholeSlideImaging": {"112703": ("Whole Slide Imaging", [8131])}, "WidthDescriptor": {"112026": ("Width Descriptor", [])}, "WinstonLutzPointer": {"130353": ("Winston-Lutz Pointer", [9548])}, "WireMarker": {"129305": ("Wire Marker", [7111, 7112])}, "WorkingCanineAssociationOfCanada": { "109220": ("Working Canine Association of Canada", [7481]) }, "WorkitemAssignmentRejectedByAssignedResource": { "110530": ("Workitem assignment rejected by assigned resource", [9300, 9303]) }, "WorkitemExpired": {"110533": ("Workitem expired", [9300])}, "Workstation": {"WSD": ("Workstation", [30])}, "WorldKennelClub": {"109221": ("World Kennel Club", [7481])}, "WorldWideKennelClub": {"109222": ("World Wide Kennel Club", [7481])}, "XConcept": {"122698": ("X-Concept", [])}, "XDescentPressure": {"122208": ("x-descent pressure", [3611])}, "XOrientation": {"130334": ("X Orientation", [9547])}, "XRayAngiography": {"XA": ("X-Ray Angiography", [29, 30, 33])}, "XRayAttenuation": {"110850": ("X-Ray Attenuation", [218, 7180, 7469])}, "XRayAttenuationCoefficient": {"110851": ("X-Ray Attenuation Coefficient", [])}, "XRayAttenuatorModelData": {"128470": ("X-Ray Attenuator Model Data", [])}, "XRayBeamAttenuator": {"128457": ("X-Ray Beam Attenuator", [])}, "XRayBeamAttenuatorModel": {"128472": ("X-Ray Beam Attenuator Model", [])}, "XRayBeamAttenuatorModelReference": { "128474": ("X-Ray Beam Attenuator Model Reference", []) }, "XRayBeamAttenuatorModelRegistration": { "128475": ("X-Ray Beam Attenuator Model Registration", []) }, "XRayDetectorDataAvailable": {"113945": ("X-Ray Detector Data Available", [])}, "XRayFilterAluminumEquivalent": { "113821": ("X-Ray Filter Aluminum Equivalent", []) }, "XRayFilterMaterial": {"113757": ("X-Ray Filter Material", [])}, "XRayFilterThickness": {"130509": ("X-Ray Filter Thickness", [])}, "XRayFilterThicknessMaximum": {"113773": ("X-Ray Filter Thickness Maximum", [])}, "XRayFilterThicknessMinimum": {"113758": ("X-Ray Filter Thickness Minimum", [])}, "XRayFilterType": {"113772": ("X-Ray Filter Type", [])}, "XRayFilters": {"113771": ("X-Ray Filters", [10066])}, "XRayFluoroscopyOnSignal": {"109004": ("X-Ray Fluoroscopy On Signal", [3090])}, "XRayGrid": {"111635": ("X-Ray Grid", [])}, "XRayMechanicalDataAvailable": {"113944": ("X-Ray Mechanical Data Available", [])}, "XRayModulationType": {"113842": ("X-Ray Modulation Type", [])}, "XRayOnTrigger": {"109005": ("X-Ray On Trigger", [3090])}, "XRayRadiationDoseReport": {"113701": ("X-Ray Radiation Dose Report", [])}, "XRayReadingDevice": {"113942": ("X-Ray Reading Device", [7445])}, "XRaySourceDataAvailable": {"113943": ("X-Ray Source Data Available", [])}, "XRaySourceReferenceCoordinateSystem": { "130519": ("X-Ray Source Reference Coordinate System", []) }, "XRayTubeCurrent": {"113734": ("X-Ray Tube Current", [])}, "Xmab557489Zr": {"126734": ("XmAb5574 ^89^Zr", [4021])}, "YBRFULLCBComponent": { "110838": ("YBR FULL CB Component", [218, 7180, 7186, 7469]) }, "YBRFULLCRComponent": { "110839": ("YBR FULL CR Component", [218, 7180, 7186, 7469]) }, "YBRFULLYComponent": {"110837": ("YBR FULL Y Component", [218, 7180, 7186, 7469])}, "YBRICTCBComponent": {"110844": ("YBR ICT CB Component", [218, 7180, 7186, 7469])}, "YBRICTCRComponent": {"110845": ("YBR ICT CR Component", [218, 7180, 7186, 7469])}, "YBRICTYComponent": {"110843": ("YBR ICT Y Component", [218, 7180, 7186, 7469])}, "YBRPARTIALCBComponent": { "110841": ("YBR PARTIAL CB Component", [218, 7180, 7186, 7469]) }, "YBRPARTIALCRComponent": { "110842": ("YBR PARTIAL CR Component", [218, 7180, 7186, 7469]) }, "YBRPARTIALYComponent": { "110840": ("YBR PARTIAL Y Component", [218, 7180, 7186, 7469]) }, "YBRRCTCBComponent": {"110847": ("YBR RCT CB Component", [218, 7180, 7186, 7469])}, "YBRRCTCRComponent": {"110848": ("YBR RCT CR Component", [218, 7180, 7186, 7469])}, "YBRRCTYComponent": {"110846": ("YBR RCT Y Component", [218, 7180, 7186, 7469])}, "YConcept": {"122699": ("Y-Concept", [])}, "YDescentPressure": {"122209": ("y-descent pressure", [3611])}, "YOrientation": {"130335": ("Y Orientation", [9547])}, "YellowGreenFilter": {"111604": ("Yellow-green filter", [])}, "ZPointPressure": {"122210": ("z-point pressure", [3611])}, "ZScore": {"113071": ("Z-score", [218, 7180, 7469])}, "ZScoreOfMeasurement": {"121416": ("Z-Score of measurement", [221, 227, 7465])}, "ZValueOfLocationOfWaterEquivalentDiameterEstimation": { "113986": ("Z value of location of Water Equivalent Diameter estimation", []) }, "ZobelFilter": {"130769": ("Zobel filter", [3042])}, "ZonePercentage": {"128833": ("Zone Percentage", [])}, "ZoneSizeEntropy": {"128836": ("Zone Size Entropy", [])}, "ZoneSizeNonuniformity": {"128831": ("Zone Size Nonuniformity", [])}, "ZoneSizeNonuniformityNormalized": { "128832": ("Zone Size Nonuniformity Normalized", []) }, "ZoneSizeVariance": {"128835": ("Zone Size Variance", [])}, "_0DocumentedAbsenceOfCAD": {"130723": ("0 - Documented absence of CAD", [3020])}, "_100cmFromXRaySource": {"113965": ("100cm from X-Ray Source", [10025])}, "_10X": {"112716": ("10X", [8132])}, "_10YearCHDRisk": {"122230": ("10 Year CHD Risk", [3667])}, "_10cmDosimetryPhantom": {"130541": ("10 cm Dosimetry Phantom", [4051, 4052])}, "_12CarbonNucleus": {"130143": ("^12^Carbon nucleus", [9526])}, "_152Terbium": {"126606": ("^152^Terbium", [4020])}, "_15LeadECG": {"122062": ("15-Lead ECG", [])}, "_15cmFromIsocenterTowardSource": { "113860": ("15cm from Isocenter toward Source", [10025]) }, "_15cmFromTableCenterline": {"113864": ("15cm from Table Centerline", [10025])}, "_16OxygenNucleus": {"130144": ("^16^Oxygen nucleus", [9526])}, "_191mIridium": {"126604": ("^191m^Iridium", [18])}, "_1MinimalNonObstructiveCAD": { "130724": ("1 - Minimal non-obstructive CAD", [3020]) }, "_1cmAboveTabletop": {"113862": ("1cm above Tabletop", [10025])}, "_1stWeek": {"111392": ("1st week", [6163])}, "_20X": {"112717": ("20X", [8132])}, "_28H189Zr": {"126752": ("28H1 ^89^Zr", [4021])}, "_2DShearWaveElastography": { "130609": ("2D Shear Wave Elastography", [6058, 12224]) }, "_2DSpeckleTracking": {"130679": ("2D Speckle Tracking", [6058, 12224])}, "_2FAF18": {"126713": ("2FA F^18^", [4021])}, "_2MildNonObstructiveCAD": {"130725": ("2 - Mild non-obstructive CAD", [3020])}, "_2SigmaDeviationOfPopulation": { "121417": ("2 Sigma deviation of population", [221, 226, 7465]) }, "_2ndWeek": {"111393": ("2nd week", [6163])}, "_30cmAboveTabletop": {"113863": ("30cm above Tabletop", [10025])}, "_30cmInFrontOfImageInputSurface": { "113861": ("30cm in Front of Image Input Surface", [10025]) }, "_35PercentOfThermalCO": {"109014": ("35% of thermal CO", [])}, "_35PercentOfThermalDyeDilutionCO": { "109014": ("35% of thermal/dye dilution CO", [3337]) }, "_3DDoseMap": {"128487": ("3D Dose Map", [10063])}, "_3DGel": {"128701": ("3D Gel", [7026])}, "_3DManufacturingModelingSystem": { "M3D": ("3D Manufacturing Modeling System", [30]) }, "_3DMode": {"125231": ("3D mode", [])}, "_3DShearWaveElastography": { "130610": ("3D Shear Wave Elastography", [6058, 12224]) }, "_3DSpeckleTracking": {"130680": ("3D Speckle Tracking", [6058, 12224])}, "_3HeliumNucleus": {"130141": ("^3^Helium nucleus", [9526])}, "_3ModerateStenosis": {"130726": ("3 - Moderate stenosis", [3020])}, "_3rdWeek": {"111394": ("3rd week", [6163])}, "_40X": {"112718": ("40X", [8132])}, "_43Scandium": {"126605": ("^43^Scandium", [4020])}, "_44Scandium": {"126600": ("^44^Scandium", [4020])}, "_4ASevereStenosis": {"130728": ("4A - Severe stenosis", [3021])}, "_4BSevereStenosis": {"130729": ("4B - Severe stenosis", [3021])}, "_4DRadiationTreatmentNote": {"130027": ("4D Radiation Treatment Note", [])}, "_4HeliumNucleus": {"130142": ("^4^Helium nucleus", [9526])}, "_4MonthsTo1YearAgo": {"111397": ("4 months to 1 year ago", [6164])}, "_4Point2cmAboveBreastSupportSurface": { "113865": ("4.2cm above Breast Support Surface", [10025]) }, "_4PointSegmentFindingScale": { "125223": ("4 Point Segment Finding Scale", [12238]) }, "_4SevereStenosis": {"130727": ("4 - Severe stenosis", [3020])}, "_51Manganese": {"126601": ("^51^Manganese", [4020])}, "_52mManganese": {"126607": ("^52m^Manganese", [4020])}, "_5PointSegmentFindingScale": { "125224": ("5 Point Segment Finding Scale", [12238]) }, "_5PointSegmentFindingScaleWithGradedHypokinesis": { "125225": ("5 Point Segment Finding Scale With Graded Hypokinesis", [12238]) }, "_5TotalCoronaryOcclusion": {"130730": ("5 - Total coronary occlusion", [3020])}, "_5X": {"112715": ("5X", [8132])}, "_70Arsenic": {"126602": ("^70^Arsenic", [4020])}, "_70PercentOfThermalCO": {"109015": ("70% of thermal CO", [])}, "_70PercentOfThermalDyeDilutionCO": { "109015": ("70% of thermal/dye dilution CO", [3337]) }, "_7D1289Zr": {"126751": ("7D12 ^89^Zr", [4021])}, "_7E1189Zr": {"126750": ("7E11 ^89^Zr", [4021])}, "_90Niobium": {"126603": ("^90^Niobium", [4020])}, } concepts["SCT"] = { "ACEInhibitor": {"41549009": ("ACE inhibitor", [3760])}, "AConstant": {"397263007": ("A-Constant", [4237])}, "AConstantOfIntraocularLens": { "397263007": ("A-constant of intraocular lens (observable entity)", []) }, "ASCOBCockerSpanielDogBreed": { "30565000": ("A.S.C.O.B. cocker spaniel dog breed", [7480]) }, "ATSMCu64": {"422855001": ("ATSM Cu^64^", [4021])}, "AVFistula": {"128617001": ("AV Fistula", [3413, 3754])}, "AVGrooveContinuationOfCircumflexArtery": { "75902001": ( "AV groove continuation of Circumflex Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "AVSequentialPacing": {"371910005": ("A-V sequential pacing", [3555])}, "Abdomen": { "818981001": ( "Abdomen", [ 4, 4009, 4030, 4031, 4042, 7151, 7154, 7192, 7482, 7483, 8134, 9514, 12020, ], ) }, "AbdomenAndOrPelvisStructure": { "416949008": ("Abdomen and/or pelvis structure (body structure)", []) }, "AbdomenAndPelvis": { "818982008": ( "Abdomen and Pelvis", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "AbdominalAorta": { "7832008": ( "Abdominal aorta", [ 4, 3010, 3604, 3606, 3630, 3827, 4030, 4042, 7151, 7154, 7192, 8134, 9514, 12103, 12112, 12125, 12291, ], ) }, "AbdominalAortaStructure": { "7832008": ("Abdominal aorta structure (body structure)", []) }, "AbdominalAorticAneurysmStenting": { "771453009": ("Abdominal aortic aneurysm stenting", [3721]) }, "AbdominalApproach": {"66739002": ("Abdominal approach (qualifier value)", [])}, "AbdominalCavityStructure": { "52731004": ("Abdominal cavity structure (body structure)", []) }, "AbdominalLymphNode": {"818991007": ("abdominal lymph node", [7600, 8134])}, "AbdominalLymphNodeStructure": { "8568009": ("Abdominal lymph node structure (body structure)", []) }, "AbdominalStructure": {"113345001": ("Abdominal structure (body structure)", [])}, "AbdominalWallMuscle": { "1142228004": ("Abdominal wall muscle", [7151, 7154, 7192, 8134, 9514]) }, "AbdominopelvicCavity": {"818987002": ("Abdominopelvic cavity", [7154, 8134])}, "AbducensNerve": {"80622005": ("abducens nerve", [7706, 7710, 8134])}, "AbducensNerveStructure": { "80622005": ("Abducens nerve structure (body structure)", []) }, "Abduction": {"60074003": ("Abduction", [92])}, "AbductionFunction": {"60074003": ("Abduction, function (observable entity)", [])}, "AberdeenAngusCattleBreed": { "84923006": ("Aberdeen Angus cattle breed (organism)", []) }, "AberdeenAngusCowBreed": {"84923006": ("Aberdeen Angus cow breed", [7480])}, "AbigarCattleBreed": {"131540009": ("Abigar cattle breed", [7480])}, "AblationFrequency": {"386132006": ("Ablation frequency", [3425])}, "AblationOperationForArrhythmia": { "233159005": ("Ablation operation for arrhythmia", [3721]) }, "AblationPower": {"386131004": ("Ablation power", [3425])}, "Abnormal": {"263654008": ("Abnormal", [222, 242, 3120])}, "AbnormalECG": {"102594003": ("Abnormal ECG", [3201, 3221, 3677, 12246])}, "AbnormalExerciseToleranceTest": { "165084003": ("Abnormal exercise tolerance test", [3201]) }, "AbnormalExtracardiacTracerUptake": { "429576000": ("Abnormal extracardiac tracer uptake (finding)", []) }, "AbnormalExtracardiacUptake": { "429576000": ("Abnormal extracardiac uptake", [3116]) }, "AbnormalGait": {"22325002": ("Abnormal gait (finding)", [])}, "AbnormalRenalFunction": {"39539005": ("Abnormal Renal Function", [64, 10045])}, "AbnormalRespiratoryRhythm": {"248584002": ("abnormal respiratory rhythm", [3416])}, "AbnormallyHigh": {"371879000": ("Abnormally High", [222])}, "AbnormallyLow": {"371880002": ("Abnormally Low", [222])}, "AbnormallySmallCardiacChamber": { "373125003": ("Abnormally small cardiac chamber", [3705]) }, "AbondanceCattleBreed": {"133551002": ("Abondance cattle breed", [7480])}, "Abscess": {"44132006": ("Abscess", [6030, 6031, 7151, 7159, 7194])}, "AbsenceFindings": {"272519000": ("Absence findings (qualifier value)", [])}, "Absent": {"272519000": ("Absent", [240, 241])}, "AbtenauerHorseBreed": {"133068005": ("Abtenauer horse breed", [7480])}, "AbyssinianCat": {"36074003": ("Abyssinian cat", [7480])}, "AbyssinianHighlandZebuCattleBreed": { "133653008": ("Abyssinian Highland Zebu cattle breed", [7480]) }, "AbyssinianHorseBreed": {"133122005": ("Abyssinian horse breed", [7480])}, "AbyssinianShorthornedZebuCattleBreed": { "133654002": ("Abyssinian Shorthorned Zebu cattle breed", [7480]) }, "Acanthioparietal": {"399242004": ("acanthioparietal", [501, 4010])}, "AcanthioparietalProjection": { "399242004": ("Acanthioparietal projection (qualifier value)", []) }, "Accentuated": {"428691001": ("accentuated", [3210])}, "AccessoryAtrioventricularBundle": { "8225009": ("Accessory atrioventricular bundle", [3011, 8134]) }, "AccessoryNerve": {"15119000": ("accessory nerve", [7706, 7710, 8134])}, "AccessoryNerveStructure": { "15119000": ("Accessory nerve structure (body structure)", []) }, "AccessoryRenalArtery": { "85383006": ( "Accessory Renal Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12115, 12125], ) }, "AccidentAndEmergency": {"225728007": ("Accident and Emergency", [7030])}, "AccidentAndEmergencyDepartment": { "225728007": ("Accident and Emergency department (environment)", []) }, "AcehCattleBreed": {"133655001": ("Aceh cattle breed", [7480])}, "Acepromazine": {"96218000": ("Acepromazine", [623, 626])}, "Acetabulum": {"37783008": ("Acetabulum", [1000, 1001, 1005, 8134])}, "AcetateC11": {"129513004": ("Acetate C^11^", [4021])}, "AceticAcid": {"2869004": ("Acetic acid", [4412, 8114])}, "AchhamCattleBreed": {"133656000": ("Achham cattle breed", [7480])}, "AchillesTendon": {"61352006": ("Achilles Tendon", [12321])}, "AcidFastStain": {"406976001": ("Acid fast stain (substance)", [])}, "AcidFastStainMethod": {"67122001": ("Acid fast stain method", [8130])}, "AcidPhosphataseStain": {"255792001": ("acid phosphatase stain", [8112])}, "AcousticRadiationsStructure": { "410726006": ("Acoustic radiations structure (body structure)", []) }, "AcquiredIncompleteStentApposition": { "408710003": ("Acquired Incomplete stent apposition", [3494]) }, "AcridineOrangeStain": {"29252006": ("acridine orange stain", [4412, 8112])}, "AcriflavineStain": {"17693003": ("acriflavine stain", [8112])}, "AcromioclavicularJoint": { "85856004": ( "Acromioclavicular joint", [4, 1000, 1001, 1004, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "AcromioclavicularJointStructure": { "85856004": ("Acromioclavicular joint structure (body structure)", []) }, "AcromionProcessOfScapula": { "31934006": ("Acromion process of scapula", [6115, 8134]) }, "AcrylicPolymer": {"261712009": ("Acrylic polymer (substance)", [])}, "AcrylicResin": {"261712009": ("Acrylic resin", [8115])}, "ActinicKeratosis": {"201101007": ("Actinic keratosis", [4405])}, "ActiveIngredient": {"127489000": ("Active Ingredient", [4050])}, "ActiveProblem": {"394774009": ("Active problem", [3770])}, "AcuteFebrileMucocutaneousLymphNodeSyndrome": { "75053002": ("Acute febrile mucocutaneous lymph node syndrome", [12248, 12249]) }, "AcuteHepatitis": {"37871000": ("Acute Hepatitis", [12323])}, "AcuteMitralRegurgitation": {"373116009": ("Acute mitral regurgitation", [3700])}, "AcuteMitralRegurgitationFromChordalDysfunction": { "371814000": ("Acute mitral regurgitation from chordal dysfunction", [3728]) }, "AcuteMitralRegurgitationFromChordalRupture": { "371813006": ("Acute mitral regurgitation from chordal rupture", [3728]) }, "AcuteMitralRegurgitationFromPapillaryMuscleDysfunction": { "371815004": ( "Acute mitral regurgitation from papillary muscle dysfunction", [3728], ) }, "AcuteMitralRegurgitationFromPapillaryMuscleRupture": { "371816003": ( "Acute mitral regurgitation from papillary muscle rupture", [3728], ) }, "AcuteMyocardialInfarction": {"57054005": ("Acute myocardial infarction", [3700])}, "AcuteNonSTSegmentElevationMyocardialInfarction": { "401314000": ( "Acute non-ST segment elevation myocardial infarction (disorder)", [], ) }, "AcuteOnset": {"373933003": ("Acute onset (qualifier value)", [])}, "AcuteSTSegmentElevationMyocardialInfarction": { "401303003": ("Acute ST segment elevation myocardial infarction (disorder)", []) }, "AcuteVentricularSeptalRupture": { "371817007": ("Acute ventricular septal rupture", [3700, 3728]) }, "AdaevHorseBreed": {"133069002": ("Adaev horse breed", [7480])}, "AdamawaCattleBreed": {"133667004": ("Adamawa cattle breed", [7480])}, "Adduction": {"11554009": ("Adduction", [92])}, "AdductionFunction": {"11554009": ("Adduction, function (observable entity)", [])}, "AdenZebuCattleBreed": {"133668009": ("Aden Zebu cattle breed", [7480])}, "AdenoAssociatedVirusGroup": { "112381006": ("Adeno-associated virus group", [638, 641]) }, "Adenocarcinoma": {"1187332001": ("Adenocarcinoma", [638, 639])}, "AdenocarcinomaNoSubtype": { "35917007": ("Adenocarcinoma, no subtype (morphologic abnormality)", []) }, "AdenocarcinomaOfLargeIntestine": { "408645001": ("Adenocarcinoma of large intestine", [638, 639]) }, "AdenocarcinomaOfLung": {"254626006": ("Adenocarcinoma of lung", [638, 639])}, "AdenocarcinomaOfPancreas": { "700423003": ("Adenocarcinoma of pancreas", [638, 639]) }, "AdenocarcinomaOfRectum": {"254582000": ("Adenocarcinoma of rectum", [638, 639])}, "AdenocarcinomaWithApocrineMetaplasia": { "22694002": ( "Adenocarcinoma with apocrine metaplasia (morphologic abnormality)", [], ) }, "Adenohypophysis": { "62818001": ("Adenohypophysis", [7151, 7153, 7192, 8134, 9514]) }, "AdenohypophysisStructure": { "62818001": ("Adenohypophysis structure (body structure)", []) }, "AdenoidCysticCarcinoma": {"11671000": ("Adenoid cystic carcinoma", [6030, 6033])}, "AdenoidalStructure": {"55940004": ("Adenoidal structure (body structure)", [])}, "Adenolipoma": {"22024005": ("Adenolipoma", [6030, 6031])}, "Adenoma": {"1187375007": ("Adenoma", [6030, 6031])}, "AdenomaNoSubtype": { "32048006": ("Adenoma, no subtype (morphologic abnormality)", []) }, "Adenomyoepithelioma": {"128765009": ("Adenomyoepithelioma", [6030, 6031])}, "Adenosine": {"108502004": ("Adenosine", [3204])}, "AdenosineA2ReceptorAgonist": { "432062000": ("Adenosine A2 receptor agonist", [3204]) }, "AdenosinePreparation": {"108502004": ("Adenosine preparation (product)", [])}, "AdenosineStressProtocol": { "424444005": ("Adenosine Stress protocol", [3261, 12001]) }, "Adenosis": {"57597008": ("Adenosis", [6030, 6031])}, "AdiposeTissue": {"55603005": ("Fat", [7151, 7166, 7191])}, "AdjunctIntent": {"421974008": ("Adjunct intent", [3629])}, "AdjuvantIntent": {"373846009": ("Adjuvant intent", [3629])}, "AdministeredAfterLabVisit": { "371899006": ("Administered after lab visit", [3741]) }, "AdministeredAfterPercutaneousCoronaryIntervention": { "371902009": ( "Administered After Percutaneous Coronary Intervention", [3742, 3743], ) }, "AdministeredBeforeLabVisit": { "371898003": ("Administered before lab visit", [3741]) }, "AdministeredBetween3And6HoursBeforePCI": { "371897008": ("Administered between 3 and 6 hours before PCI", [3740]) }, "AdministeredBetween6HoursAnd7DaysBeforePCI": { "371906007": ("Administered between 6 hours and 7 days before PCI", [3740]) }, "AdministeredDuringLabVisit": { "371905006": ("Administered during lab visit", [3741]) }, "AdministeredDuringPercutaneousCoronaryIntervention": { "371903004": ("Administered During Percutaneous Coronary Intervention", [3742]) }, "AdministeredLessThan3HoursBeforePCI": { "371896004": ("Administered less than 3 hours before PCI", [3740]) }, "AdministeredLessThan72HoursBeforePCI": { "371901002": ("Administered Less than 72 Hours before PCI", [3743]) }, "AdministeredPriorToPercutaneousCoronaryIntervention": { "371904005": ( "Administered Prior to Percutaneous Coronary Intervention", [3742], ) }, "AdministrationOfAnesthesia": { "399097000": ("Administration of anesthesia (procedure)", []) }, "AdministrationOfMedicationNotDoneDueToContraindication": { "373147003": ( "Administration of medication not done due to contraindication (situation)", [], ) }, "AdministrationOfRadiopharmaceutical": { "440252007": ("Administration of radiopharmaceutical (procedure)", []) }, "AdministrationOfSedative": { "72641008": ("Administration of sedative (procedure)", []) }, "AdrenalGland": { "23451007": ( "Adrenal gland", [ 4, 1000, 1001, 1005, 4030, 6202, 6204, 7151, 7154, 7192, 8134, 9514, 10044, 10060, ], ) }, "AdrenalStructure": {"23451007": ("Adrenal structure (body structure)", [])}, "AdrenergicAgent": {"86308005": ("Adrenergic agent", [621, 622])}, "Adventitia": {"30180000": ("Adventitia", [7151, 7156, 7192, 8134, 9514])}, "AdventitialDegeneration": {"47631006": ("adventitial degeneration", [3817])}, "Affenpinscher": {"52946002": ("Affenpinscher", [7480])}, "Afferent": {"49530007": ("Afferent", [2])}, "AfghanCattleBreed": {"133669001": ("Afghan cattle breed", [7480])}, "AfghanHound": {"77213006": ("Afghan hound", [7480])}, "AfricanRace": {"413464008": ("African race", [6099])}, "AfricanaSheepBreed": {"131768005": ("Africana sheep breed", [7480])}, "AfricanderCattleBreed": {"131426006": ("Africander cattle breed", [7480])}, "AfricangnusCattleBreed": {"131541008": ("Africangnus cattle breed", [7480])}, "AfricangusCattleBreed": {"131541008": ("Africangus cattle breed (organism)", [])}, "After": {"288563008": ("After", [3600])}, "AfterMenopause": {"307429007": ("After menopause", [6086])}, "AfterProcedure": {"303110006": ("After Procedure", [631, 3815, 12002, 12102])}, "AfterValues": {"288563008": ("After values (qualifier value)", [])}, "Agar": {"10249006": ("Agar", [8115])}, "AgeroleseCattleBreed": {"131542001": ("Agerolese cattle breed", [7480])}, "AggressiveFibromatosis": { "47284001": ("Aggressive fibromatosis (morphologic abnormality)", []) }, "AidiDogBreed": {"132406005": ("Aidi dog breed", [7480])}, "AinuDogBreed": {"132516004": ("Ainu dog breed", [7480])}, "Air": {"15158005": ("Air", [12, 13, 3850, 6211, 6350, 11002])}, "AirHeatingPad": {"468192005": ("Air heating pad", [635])}, "AirHeatingPadSystem": { "468192005": ("Air heating pad system (physical object)", []) }, "AirTrapping": {"76171001": ("Air-trapping", [6102, 6105, 6108])}, "AiredaleTerrier": {"3921008": ("Airedale terrier", [7480])}, "AirwayManagement": {"386509000": ("Airway management (procedure)", [])}, "AirwayStructure": { "89187006": ("Airway structure", [6102, 6109, 6111, 7151, 7192, 9514]) }, "AkbashDogBreed": {"132531008": ("Akbash dog breed", [7480])}, "AkhaPigBreed": {"133172007": ("Akha pig breed", [7480])}, "AkhalTekeHorseBreed": {"133121003": ("Akhal-Teke horse breed", [7480])}, "Akinesis": {"195675009": ("Akinesis", [3703, 3706])}, "AkitaDog": {"84514002": ("Akita dog", [7480])}, "AksaîBlackPiedPigBreed": {"132118009": ("Aksaî Black Pied pig breed", [7480])}, "AlaTauCattleBreed": {"133552009": ("Ala-Tau cattle breed", [7480])}, "AlambadiCattleBreed": {"133670000": ("Alambadi cattle breed", [7480])}, "AlanineAminotransferaseSerumGlutamicPyruvicTransaminaseLevelRaised": { "409673008": ( "Alanine aminotransferase (serum glutamic-pyruvic transaminase) level raised (finding)", [], ) }, "AlanoEspañolDogBreed": {"132540007": ("Alano Español dog breed", [7480])}, "AlapahaBluebloodBulldogBreed": { "132532001": ("Alapaha blueblood bullDog breed", [7480]) }, "AlaskanKleeKaiDogBreed": {"406725008": ("Alaskan Klee Kai dog breed", [7480])}, "AlaskanMalamute": {"53228008": ("Alaskan malamute", [7480])}, "AlbanianDwarfCattleBreed": {"133554005": ("Albanian Dwarf cattle breed", [7480])}, "AlbanianHorseBreed": {"133070001": ("Albanian horse breed", [7480])}, "AlbanianIllyrianCattleBreed": { "133553004": ("Albanian Illyrian cattle breed", [7480]) }, "AlbanianNativePigBreed": {"133209008": ("Albanian Native pig breed", [7480])}, "AlbersSchonberg": {"399142007": ("Albers-Schonberg", [4012])}, "AlbersSchönbergProjection": { "399142007": ("Albers-Schönberg projection (qualifier value)", []) }, "AlbertStain": {"255793006": ("Albert's stain", [8112])}, "AlbeseCattleBreed": {"131543006": ("Albese cattle breed", [7480])}, "AlbèresCattleBreed": {"131555000": ("Albères cattle breed (organism)", [])}, "AlbèresCattlebreed": {"131555000": ("Albères cattlebreed", [7480])}, "AlcianBlue8GXStain": {"4656000": ("alcian blue 8GX stain", [8112])}, "AlcoholConsumption": {"897148007": ("Alcohol consumption", [3774])}, "AlcoholIntake": {"160573003": ("Alcohol intake (observable entity)", [])}, "AlcoholSolubleNigrosineStain": { "47995002": ("alcohol soluble nigrosine stain", [8112]) }, "AlcoholicLiverDamage": {"41309000": ("Alcoholic liver damage (disorder)", [])}, "AlcoholicLiverDisease": {"41309000": ("Alcoholic liver disease", [12325])}, "AldehydeFuchsinStain": {"406981005": ("aldehyde fuchsin stain", [8112])}, "AlentejanaCattleBreed": {"131556004": ("Alentejana cattle breed (organism)", [])}, "AlentejanaCattlebreed": {"131556004": ("Alentejana cattlebreed", [7480])}, "AlentejanaPigBreed": {"132086001": ("Alentejana pig breed", [7480])}, "AlentejoHerderDogBreed": {"132393007": ("Alentejo herder dog breed", [7480])}, "AleppoCattleBreed": {"133575002": ("Aleppo cattle breed", [7480])}, "Alexander": {"399237007": ("Alexander", [4012])}, "AlexanderProjection": { "399237007": ("Alexander projection (qualifier value)", []) }, "Alfentanil": {"387560008": ("Alfentanil", [65, 66])}, "AlgarviaGoatBreed": {"131677009": ("Algarvia goat breed", [7480])}, "AliabDinkaCattleBreed": {"131441006": ("Aliab Dinka cattle breed", [7480])}, "AlistanaSanabresaCattleBreed": { "133290002": ("Alistana-Sanabresa cattle breed", [7480]) }, "Alive": {"438949009": ("Alive", [3772])}, "AliveAndWell": {"81323004": ("Alive and well", [3772])}, "AlizarinBlueSStain": {"54432009": ("alizarin blue S stain", [8112])}, "AlizarinCyanineGreenStain": {"21951008": ("alizarin cyanine green stain", [8112])}, "AlizarinRedSStain": {"65580004": ("alizarin red S stain", [8112])}, "AlizarinYellowGGStain": {"27016007": ("alizarin yellow GG stain", [8112])}, "AlizarinYellowRStain": {"28622002": ("alizarin yellow R stain", [8112])}, "AlkaliBlue5B4BStain": {"76925007": ("alkali blue 5B (4B) stain", [8112])}, "AlkaliBlue6BStain": {"63929007": ("alkali blue 6B stain", [8112])}, "AlkalinePhosphataseStain": {"406971006": ("alkaline phosphatase stain", [8112])}, "AllLegs": {"42694008": ("All legs", [7482, 7483, 8134])}, "AllergyAndImmunology": {"309913004": ("Allergy and Immunology", [7030])}, "AllergyToContrastMedia": { "293637006": ("Allergy to contrast media (disorder)", []) }, "AllergyToXRayContrastMedia": { "293638001": ("Allergy to X-Ray contrast media (disorder)", []) }, "AlmanzorenaCattleBreed": {"133591004": ("Almanzorena cattle breed", [7480])}, "AlmostEntirelyFat": {"129716005": ("Almost entirely fat", [6000, 6001])}, "AlmostEntirelyFatBreastComposition": { "129716005": ("Almost entirely fat breast composition (finding)", []) }, "AlongEdge": {"57183005": ("Along edge (qualifier value)", [])}, "AlphaAdrenergicBlockingAgent": { "67440007": ("Alpha-adrenergic blocking agent", [10]) }, "Alphachloralose": {"277016007": ("Alphachloralose", [623, 625])}, "Alphadolone": {"125707004": ("Alphadolone", [623, 625])}, "AlphadoloneAcetate": {"125707004": ("Alphadolone acetate (substance)", [])}, "AlpineChamoiseeGoatBreed": {"131674002": ("Alpine Chamoisee goat breed", [7480])}, "AlpineDachsbrackeDogBreed": { "132542004": ("Alpine dachsbracke dog breed", [7480]) }, "AlpineGoat": {"70431006": ("Alpine goat (organism)", [])}, "AlpineGoatBreed": {"70431006": ("Alpine goat breed", [7480])}, "AltaiHorseBreed": {"133120002": ("Altai horse breed", [7480])}, "AltaiMountainGoatBreed": {"131618005": ("Altai Mountain goat breed", [7480])}, "AltaySheepBreed": {"132845007": ("Altay sheep breed", [7480])}, "AlterRealHorseBreed": {"133071002": ("Alter Real horse breed", [7480])}, "Aluminum": {"12503006": ("Aluminum", [10006, 10067])}, "AluminumANDORAluminumCompound": { "105830007": ("Aluminum AND/OR aluminum compound (substance)", []) }, "AluminumChloride": {"387372003": ("aluminum chloride", [4412])}, "AluminumHydroxide": {"273944007": ("Aluminum hydroxide", [4410])}, "AluminumOxide": {"83881004": ("Aluminum Oxide", [300])}, "AlurCattleBreed": {"131442004": ("Alur cattle breed", [7480])}, "AlveolarProcessOfMandible": { "38754007": ("alveolar process of mandible", [7601, 8134]) }, "AlveolarSoftPartSarcoma": {"88195001": ("Alveolar soft part sarcoma", [638, 639])}, "AmbuBag": {"371785003": ("Ambu Bag", [3554])}, "AmbulatoryEEG": {"252735006": ("Ambulatory EEG", [3049])}, "AmelanoticMelanoma": {"70594002": ("Amelanotic melanoma", [638, 639])}, "AmericanAlbinoHorse": {"45790002": ("American Albino horse (organism)", [])}, "AmericanAlbinoHorseBreed": {"45790002": ("American Albino horse breed", [7480])}, "AmericanBashkirCurlyHorseBreed": { "133072009": ("American Bashkir Curly horse breed", [7480]) }, "AmericanBerkshirePigBreed": { "132046009": ("American Berkshire pig breed", [7480]) }, "AmericanBisonXCattleBreed": { "133703008": ("American bison X cattle breed", [7480]) }, "AmericanBlueGasconHoundDogBreed": { "132400004": ("American Blue Gascon Hound dog breed", [7480]) }, "AmericanBobtailCatBreed": {"413488005": ("American bobtail cat breed", [7480])}, "AmericanBobtailLonghairCatBreed": { "132658005": ("American Bobtail Longhair cat breed", [7480]) }, "AmericanBobtailShorthairCatBreed": { "132657000": ("American Bobtail Shorthair cat breed", [7480]) }, "AmericanBuckskinHorse": {"90050009": ("American Buckskin horse (organism)", [])}, "AmericanBuckskinHorseBreed": { "90050009": ("American Buckskin horse breed", [7480]) }, "AmericanBulldogBreed": {"132534000": ("American Bulldog breed", [7480])}, "AmericanCashmereGoatBreed": { "131617000": ("American Cashmere goat breed", [7480]) }, "AmericanCockerSpaniel": {"22697009": ("American cocker spaniel (organism)", [])}, "AmericanCockerSpanielDogBreed": { "22697009": ("American cocker spaniel dog breed", [7480]) }, "AmericanCoonhound": {"63269002": ("American coonhound (organism)", [])}, "AmericanCoonhoundDogBreed": {"63269002": ("American coonhound dog breed", [7480])}, "AmericanCreamDraftHorseBreed": { "133119008": ("American Cream Draft horse breed", [7480]) }, "AmericanCreamHorse": {"26837006": ("American cream horse (organism)", [])}, "AmericanCreamHorseBreed": {"26837006": ("American cream horse breed", [7480])}, "AmericanCurlCatBreed": {"132659002": ("American Curl cat breed", [7480])}, "AmericanDraftPonyBreed": { "425118005": ("American draft pony breed (organism)", []) }, "AmericanDraftPonyHorseBreed": { "425118005": ("American draft pony horse breed", [7480]) }, "AmericanEskimoDog": {"31392000": ("American eskimo dog (organism)", [])}, "AmericanEskimoDogBreed": {"31392000": ("American eskimo dog breed", [7480])}, "AmericanEskimoMiniatureDogBreed": { "132410008": ("American Eskimo, Miniature dog breed", [7480]) }, "AmericanEskimoStandardDogBreed": { "132409003": ("American Eskimo, standard dog breed", [7480]) }, "AmericanEskimoToyDogBreed": { "132411007": ("American Eskimo, Toy dog breed", [7480]) }, "AmericanEssexPigBreed": {"132030001": ("American Essex pig breed", [7480])}, "AmericanFoxhound": {"88779009": ("American foxhound", [7480])}, "AmericanHairlessTerrierDogBreed": { "132528007": ("American Hairless Terrier dog breed", [7480]) }, "AmericanIndianDogBreed": {"132407001": ("American Indian Dog breed", [7480])}, "AmericanIndianHorseHorseBreed": { "132951001": ("American Indian Horse horse breed", [7480]) }, "AmericanIndianOrAlaskaNative": { "413490006": ("American Indian or Alaska native", [6099]) }, "AmericanLamaleseDogBreed": {"132627009": ("American lamalese dog breed", [7480])}, "AmericanLandracePigBreed": {"132231009": ("American Landrace pig breed", [7480])}, "AmericanMerinoSheep": {"73191001": ("American merino sheep (organism)", [])}, "AmericanMerinoSheepBreed": {"73191001": ("American merino sheep breed", [7480])}, "AmericanMiniatureHorse": {"54699009": ("American miniature horse (organism)", [])}, "AmericanMiniatureHorseBreed": { "54699009": ("American miniature horse breed", [7480]) }, "AmericanMustangHorseBreed": { "132952008": ("American Mustang horse breed", [7480]) }, "AmericanPaintHorse": {"7623008": ("American paint horse (organism)", [])}, "AmericanPaintHorseBreed": {"7623008": ("American paint horse breed", [7480])}, "AmericanPitBullTerrier": { "12390000": ("American pit bull terrier (organism)", []) }, "AmericanPitBullTerrierDogBreed": { "12390000": ("American pit bull terrier dog breed", [7480]) }, "AmericanPony": {"46408008": ("American pony (organism)", [])}, "AmericanPonyHorseBreed": {"46408008": ("American pony horse breed", [7480])}, "AmericanQuarterHorseHorseBreed": { "132953003": ("American Quarter Horse horse breed", [7480]) }, "AmericanSaddlebredHorse": { "42724005": ("American saddlebred horse (organism)", []) }, "AmericanSaddlebredHorseBreed": { "42724005": ("American saddlebred horse breed", [7480]) }, "AmericanShetlandPonyHorseBreed": { "132954009": ("American Shetland pony horse breed", [7480]) }, "AmericanShorthairCat": {"69855002": ("American shorthair cat", [7480])}, "AmericanTrotterHorse": {"26973000": ("American trotter horse (organism)", [])}, "AmericanTrotterHorseBreed": {"26973000": ("American trotter horse breed", [7480])}, "AmericanTunisHorse": {"72394007": ("American tunis horse (organism)", [])}, "AmericanTunisHorseBreed": {"72394007": ("American tunis horse breed", [7480])}, "AmericanTunisSheepBreed": {"132812007": ("American Tunis sheep breed", [7480])}, "AmericanWalkingPonyHorseBreed": { "133117005": ("American Walking Pony horse breed", [7480]) }, "AmericanWaterSpaniel": {"31971008": ("American water spaniel (organism)", [])}, "AmericanWaterSpanielDogBreed": { "31971008": ("American water spaniel dog breed", [7480]) }, "AmericanWhiteParkCattleBreed": { "131557008": ("American White Park cattle breed", [7480]) }, "AmericanWirehairedCat": {"21726001": ("American wirehaired cat", [7480])}, "AmericanYorkshirePigBreed": { "132045008": ("American Yorkshire pig breed", [7480]) }, "AmerifaxcattleBreed": {"131558003": ("Amerifaxcattle breed", [7480])}, "AminoglycosideAntibiotic": {"14443002": ("Aminoglycoside antibiotic", [621, 622])}, "AminoglycosideClassOfAntibiotic": { "14443002": ("Aminoglycoside -class of antibiotic- (substance)", []) }, "AmmoniaN13": {"129508003": ("Ammonia N^13^", [4021])}, "Amniocentesis": {"34536000": ("Amniocentesis", [9])}, "AmnioinfusionInjectionOfAmnion": { "15415002": ("Amnioinfusion [injection of amnion]", [9]) }, "AmnioticFluid": {"77012006": ("Amniotic fluid (substance)", [])}, "AmorphousCalcification": {"129760005": ("Amorphous calcification", [6010, 6011])}, "Amphetamine": {"703842006": ("Amphetamine", [6089])}, "AmritMahalZebuCattleBreed": { "133594007": ("Amrit Mahal zebu cattle breed", [7480]) }, "AmritmahalCattleBreed": {"133594007": ("Amritmahal cattle breed (organism)", [])}, "Amygdala": {"4958002": ("Amygdala", [7140, 7151, 7153, 7192, 8134, 9514])}, "AmygdaloidStructure": {"4958002": ("Amygdaloid structure (body structure)", [])}, "Amyloid": {"37279009": ("Amyloid (tumor)", [6030, 6031])}, "AmyloidTumor": {"37279009": ("Amyloid tumor (morphologic abnormality)", [])}, "AnadoluHorseBreed": {"132955005": ("Anadolu horse breed", [7480])}, "AnalStructure": {"53505006": ("Anal structure (body structure)", [])}, "Analgesic": {"373265006": ("Analgesic", [621, 622])}, "AnastomosisOfPulmonarySubclavianArteryByBlalockTaussigOperation": { "13662000": ( "Anastomosis of pulmonary-subclavian artery by Blalock-Taussig operation (procedure)", [], ) }, "Anastrozole": {"386910003": ("Anastrozole", [6080])}, "AnatolianBlackCattleBreed": { "131559006": ("Anatolian Black cattle breed", [7480]) }, "AnatolianShepherdDogBreed": { "409926004": ("Anatolian shepherd dog breed", [7480]) }, "AnatomicStructurePotentiallyInvolvedInEvolutionOfDisease": { "413530006": ( "Anatomic structure potentially involved in evolution of disease (observable entity)", [], ) }, "Anatomical": {"51845000": ("anatomical", [20])}, "AnatomicalPoint": {"711101009": ("Anatomical point", [7110])}, "AnatomicalPosition": {"51845000": ("Anatomical position (finding)", [])}, "AnatomicalReferencePlane": {"243898001": ("Lumbo-Sacral Spine", [7304, 8134])}, "AnatomicalStructure": { "91723000": ("Anatomical Structure", [7150, 9501, 9502, 9580]) }, "Anchoring": {"129380009": ("Anchoring", [7310])}, "AnchoringAction": {"129380009": ("Anchoring - action (qualifier value)", [])}, "AndalusianBlackCattleBreed": { "131560001": ("Andalusian Black cattle breed", [7480]) }, "AndalusianBlondCattleBreed": { "133291003": ("Andalusian Blond cattle breed", [7480]) }, "AndalusianGrayCattleBreed": { "131561002": ("Andalusian Gray cattle breed", [7480]) }, "AndalusianHorse": {"80777007": ("Andalusian horse (organism)", [])}, "AndalusianHorseBreed": {"80777007": ("Andalusian horse breed", [7480])}, "AndeanHorseBreed": {"132956006": ("Andean horse breed", [7480])}, "AndrogenDeprivationTherapy": { "707266006": ("Androgen Deprivation Therapy", [6323]) }, "AnesthesiaFinishTime": { "398164008": ("Anesthesia finish time (observable entity)", []) }, "AnesthesiaInduction": {"241687005": ("Anesthesia induction", [634])}, "AnesthesiaStartTime": { "398325003": ("Anesthesia start time (observable entity)", []) }, "Anesthesiology": {"309901009": ("Anesthesiology", [7030])}, "AnestheticDepartment": {"309901009": ("Anesthetic department (environment)", [])}, "AnestheticFaceMask": {"297120004": ("Anesthetic face mask", [617, 618])}, "Aneurysm": {"85659009": ("aneurysm", [3810])}, "AneurysmOfAorticRoot": {"373134008": ("Aneurysm of Aortic Root", [3709])}, "Aneurysmal": {"255378009": ("Aneurysmal", [3712])}, "AngelnCattleBreed": {"131562009": ("Angeln cattle breed", [7480])}, "AngelnSaddlebackPigBreed": {"132252001": ("Angeln Saddleback pig breed", [7480])}, "Angina": {"194828000": ("Angina (disorder)", [])}, "AnginaClassI": {"61490001": ("Angina Class I", [3719])}, "AnginaClassII": {"41334000": ("Angina Class II", [3719])}, "AnginaClassIII": {"85284003": ("Angina Class III", [3719])}, "AnginaClassIV": {"89323001": ("Angina Class IV", [3719])}, "AnginaPectoris": {"194828000": ("Angina pectoris", [64, 3201, 12246])}, "Angiography": {"77343006": ("Angiography", [100, 3405, 3428])}, "Angiolipoma": {"73219006": ("Angiolipoma", [6030, 6031])}, "Angioma": {"400210000": ("angioma", [3810])}, "Angiomatosis": {"14350002": ("Angiomatosis", [6030, 6031])}, "AngioplastyInflationDuration": { "371852004": ("Angioplasty Inflation duration", [3425]) }, "AngioplastyInflationPressure": { "371851006": ("Angioplasty Inflation pressure", [3425]) }, "Angiosarcoma": {"39000009": ("Angiosarcoma", [6030, 6033])}, "AngiotensinConvertingEnzymeInhibitorAgent": { "41549009": ("Angiotensin-converting enzyme inhibitor agent (product)", []) }, "AngiotensinIIReceptorAntagonist": { "96308008": ("Angiotensin II receptor antagonist", [3760]) }, "Angle": {"1483009": ("Angle", [12304])}, "AngleOfRib": {"14510004": ("Angle of rib", [6115, 8134])}, "AngloArabHorseBreed": {"133044002": ("Anglo-Arab horse breed", [7480])}, "AngloFrancaisDeMoyenVenerieDogBreed": { "132536003": ("Anglo-Francais de moyen venerie dog breed", [7480]) }, "AngloFrancaisDePetitVenerieDogBreed": { "132537007": ("Anglo-Francais de petit venerie dog breed", [7480]) }, "AngloKabardaHorseBreed": {"132957002": ("Anglo-Kabarda horse breed", [7480])}, "AngloNubianGoat": {"16015002": ("Anglo nubian goat (organism)", [])}, "AngloNubianGoatBreed": {"16015002": ("Anglo nubian goat breed", [7480])}, "AngoraGoat": {"64158000": ("Angora goat (organism)", [])}, "AngoraGoatBreed": {"64158000": ("Angora goat breed", [7480])}, "Angular": {"1483009": ("Angular (qualifier value)", [])}, "AnilineBlueStain": {"406990003": ("aniline blue stain", [8112])}, "AnimalFeed": {"82566005": ("Animal feed (substance)", [])}, "AnionExchangeResin": {"346322006": ("Anion exchange resin", [3761])}, "AnkinaCattleBreed": {"131443009": ("Ankina cattle breed", [7480])}, "AnkleJoint": { "70258002": ( "Ankle joint", [4, 1000, 1001, 1006, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "AnkleJointStructure": {"70258002": ("Ankle joint structure (body structure)", [])}, "AnkoleCattleBreed": {"131427002": ("Ankole cattle breed", [7480])}, "AnkoleWatusiCattleBreed": {"131428007": ("Ankole-Watusi cattle breed", [7480])}, "AnnularAbscessOfAorticRoot": { "373135009": ("Annular Abscess of Aortic Root", [3709]) }, "AnomalousPulmonaryVein": { "128585006": ( "Anomalous pulmonary vein", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "AntecubitalVein": { "128553008": ( "Antecubital vein", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "AntegradeDirection": {"263677008": ("Antegrade Direction", [12306])}, "AntegradeFlow": {"263677008": ("Antegrade Flow", [12221])}, "Anterior": { "255549009": ("Anterior", [2, 5, 211, 212, 3019, 4005, 6024, 6025, 12281]) }, "AnteriorAuricularLymphNode": { "25247006": ("anterior auricular lymph node", [7600, 8134]) }, "AnteriorCardiacVein": { "194996006": ( "Anterior cardiac vein", [4, 3010, 3827, 3839, 4042, 7151, 7192, 8134, 9514], ) }, "AnteriorCerebralArtery": { "60176003": ( "Anterior Cerebral Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "AnteriorCervicalLymphNode": { "5727003": ("anterior cervical lymph node", [7600, 8134]) }, "AnteriorChamber": {"31636006": ("Anterior Chamber", [4233])}, "AnteriorChamberOfEye": { "31636006": ("Anterior chamber of eye", [4209, 4211, 8134]) }, "AnteriorChamberOfEyeStructure": { "31636006": ("Anterior chamber of eye structure (body structure)", []) }, "AnteriorCommissure": { "62872008": ("Anterior Commissure", [7101, 7111, 7705, 7710, 8134]) }, "AnteriorCommunicatingArtery": { "8012006": ( "Anterior communicating artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12105, ], ) }, "AnteriorCompression": {"441752004": ("Anterior compression", [4015])}, "AnteriorCompressionOfBreast": { "441752004": ("Anterior compression of breast (procedure)", []) }, "AnteriorDescendingBranchOfLeftCoronaryArtery": { "59438005": ("Anterior Descending Branch of Left Coronary Artery", [12292]) }, "AnteriorEmissiveProjection": { "399321004": ("Anterior emissive projection (qualifier value)", []) }, "AnteriorFibromuscularStromaOfProstate": { "717025007": ("Anterior fibromuscular stroma of prostate", [6300]) }, "AnteriorHornLateralVentricle": { "30399003": ("Anterior Horn Lateral Ventricle", [8134, 12022]) }, "AnteriorMediastinalLymphNode": { "5296000": ("anterior mediastinal lymph node", [7600, 8134]) }, "AnteriorMiddleCerebralArteryBifurcation": { "397418009": ( "Anterior-Middle Cerebral Artery Bifurcation", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "AnteriorPosteriorCerebralArteryBifurcation": { "397419001": ( "Anterior-Posterior Cerebral Artery Bifurcation", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "AnteriorProjection": {"399321004": ("Anterior projection", [26, 501])}, "AnteriorSegmentOfLeftUpperLobe": { "22270008": ("Anterior segment of left upper lobe", [6124, 6127]) }, "AnteriorSegmentOfRightUpperLobe": { "39743006": ("Anterior segment of right upper lobe", [6124, 6127]) }, "AnteriorSpinalArtery": { "17388009": ( "Anterior spinal artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "AnteriorTibialArtery": { "68053000": ( "Anterior tibial artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "AnteriorTibialLymphNode": { "303713004": ("anterior tibial lymph node", [7600, 8134]) }, "AnteriorTibialVein": { "26703007": ( "Anterior Tibial Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "AnteriorTriangleOfNeck": { "182329002": ("Anterior triangle of neck", [4029, 8134]) }, "AnteriorWall": {"263943000": ("Anterior Wall", [12280])}, "AnteroPosterior": {"399348003": ("antero-posterior", [501, 3466, 4010, 7302])}, "AnteroPosteriorOblique": {"399312000": ("antero-posterior oblique", [501, 4010])}, "AnteroPosteriorObliqueProjection": { "399312000": ("Antero-posterior oblique projection (qualifier value)", []) }, "AnteroPosteriorProjection": { "399348003": ("Antero-posterior projection (qualifier value)", []) }, "Anterolateral": {"37197008": ("Anterolateral", [2])}, "AntiHeparinAgent": {"3361000": ("Anti-heparin agent", [10, 621, 622])}, "Antiarrhythmic": {"372813008": ("Antiarrhythmic", [621, 622])}, "AntiarrhythmicAgent": {"372813008": ("Antiarrhythmic agent (substance)", [])}, "AntiarrhythmicDrug": {"67507000": ("Antiarrhythmic drug", [10])}, "Antibiotic": {"255631004": ("Antibiotic", [621, 622, 4410])}, "Anticholinergic": {"373246003": ("Anticholinergic", [621, 622])}, "AnticholinergicAgent": {"373246003": ("Anticholinergic agent (substance)", [])}, "Anticoagulant": {"372862008": ("Anticoagulant", [621, 622])}, "AnticoagulantAgent": {"81839001": ("Anticoagulant", [10])}, "Anticonvulsant": {"255632006": ("Anticonvulsant", [621, 622])}, "AntidiureticHormone": {"77671006": ("Antidiuretic hormone", [621, 622])}, "Antiemetic": {"52017007": ("Antiemetic", [76, 621, 622])}, "Antifungal": {"373219008": ("Antifungal", [621, 622, 4410])}, "AntihemophilicFactorPreparation": { "59057006": ("Antihemophilic factor preparation", [10]) }, "Antihistamine": {"6425004": ("Antihistamine", [10])}, "Antihypertensive": {"1182007": ("Antihypertensive", [621, 622])}, "Anus": { "53505006": ("Anus", [4, 645, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "AnusRectumAndSigmoidColon": { "110612005": ( "Anus, rectum and sigmoid colon", [4, 4040, 7151, 7192, 8134, 9514], ) }, "AnusRectumAndSigmoidColonCombinedSite": { "110612005": ( "Anus, rectum and sigmoid colon (combined site) (body structure)", [], ) }, "Anxiety": {"48694002": ("Anxiety", [60, 64, 9300])}, "Aorta": { "15825003": ( "Aorta", [ 4, 3010, 3604, 3606, 3630, 4042, 6129, 6202, 6204, 7151, 7152, 7192, 8134, 9514, 12141, 12223, 12236, ], ) }, "AortaToPulmonaryArteryConnection": { "443096004": ("Aorta to Pulmonary Artery Connection", [12290, 12293]) }, "AorticAneurysm": {"67362008": ("Aortic aneurysm", [3700])}, "AorticArch": { "57034009": ( "Aortic arch", [ 4, 1000, 1001, 1004, 3010, 3604, 3606, 3630, 4030, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12291, ], ) }, "AorticArchStructure": {"57034009": ("Aortic arch structure (body structure)", [])}, "AorticBifurcation": {"73166001": ("Aortic Bifurcation", [3837, 7111])}, "AorticDissection": {"308546005": ("Aortic dissection", [3700])}, "AorticFistula": { "128551005": ( "Aortic fistula", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "AorticIncompetenceNonRheumatic": { "194983005": ("Aortic incompetence, non-rheumatic (disorder)", []) }, "AorticInsufficiency": {"194983005": ("Aortic insufficiency", [3700, 3728])}, "AorticIsthmus": { "88593004": ( "Aortic isthmus", [6102, 6109, 6117, 7151, 7192, 8134, 9514, 12291], ) }, "AorticLymphNode": {"35783009": ("aortic lymph node", [7600, 8134])}, "AorticPressureWaveform": {"128444004": ("Aortic pressure waveform", [3003])}, "AorticPressureWaveformFunction": { "128444004": ("Aortic pressure waveform, function (observable entity)", []) }, "AorticRegurgitation": {"60234000": ("Aortic regurgitation", [12248, 12249])}, "AorticRoot": {"8128003": ("Aortic Root", [12305])}, "AorticRootFeature": {"364091008": ("Aortic root feature (observable entity)", [])}, "AorticSinotubularJunction": { "443167003": ("Aortic Sinotubular Junction", [12291, 12305]) }, "AorticStenosis": {"60573004": ("Aortic stenosis", [64, 3700, 3728, 12248, 12249])}, "AorticStructure": {"15825003": ("Aortic structure (body structure)", [])}, "AorticSystolicEjectionPeriod": { "371850007": ("Aortic systolic ejection period (observable entity)", []) }, "AorticSystolicEjectionPeriodSepa": { "371850007": ("Aortic Systolic Ejection Period (SEPa)", [3616]) }, "AorticValve": { "34202007": ("Aortic Valve", [3610, 3630, 3701, 12288, 12289, 12305]) }, "AorticValveArea": {"251011009": ("Aortic Valve Area", [3614, 3615])}, "AorticValveDisease": {"8722008": ("Aortic valve disease", [3700])}, "AorticValveDisorder": {"8722008": ("Aortic valve disorder (disorder)", [])}, "AorticValveFlow": {"371845001": ("Aortic Valve Flow", [3617])}, "AorticValvePullbackPressureWaveform": { "128453006": ("Aortic valve pullback pressure waveform", [3003]) }, "AorticValvePullbackPressureWaveformFunction": { "128453006": ( "Aortic valve pullback pressure waveform, function (observable entity)", [], ) }, "AorticValveRegurgitation": { "60234000": ("Aortic valve regurgitation (disorder)", []) }, "AorticValveRing": {"77583004": ("Aortic Valve Ring", [12236, 12242, 12305])}, "AorticValveStenosis": {"60573004": ("Aortic valve stenosis (disorder)", [])}, "AorticValveStructure": { "34202007": ("Aortic valve structure (body structure)", []) }, "Aortography": {"54640009": ("Aortography", [3405, 3428])}, "AortopulmonaryReconstructionWithRightVentricleToPulmonaryArterialValvelessConduit": { "429616001": ( "Aortopulmonary reconstruction with right ventricle to pulmonary arterial valveless conduit " "(procedure)", [], ) }, "AostaBlackPiedCattleBreed": { "133292005": ("Aosta Black Pied cattle breed", [7480]) }, "AostaChestnutCattleBreed": {"133293000": ("Aosta Chestnut cattle breed", [7480])}, "AostaRedPiedCattleBreed": {"133294006": ("Aosta Red Pied cattle breed", [7480])}, "ApennineSheepBreed": {"132811000": ("Apennine sheep breed", [7480])}, "ApexOfHeart": {"13383001": ("Apex of heart", [1000, 1001, 1004, 8134])}, "ApexOfLeftVentricle": { "128564006": ( "Apex of left ventricle", [4, 3010, 3011, 3717, 4042, 7151, 7192, 8134, 9514, 12305], ) }, "ApexOfLung": { "86598002": ( "Apex of Lung", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "ApexOfRightVentricle": { "128565007": ( "Apex of right ventricle", [4, 3010, 3011, 4042, 7151, 7192, 8134, 9514, 12305], ) }, "Aphakia": {"24010005": ("Aphakia (disorder)", [])}, "Aphakic": {"24010005": ("Aphakic", [4231])}, "Apical": {"43674008": ("Apical", [2, 5, 6124, 6125])}, "ApicalAnteriorFibromuscularStromaOfProstate": { "716925003": ("Apical anterior fibromuscular stroma of prostate", [6300, 6303]) }, "ApicalAxillaryLymphNode": { "16051009": ("apical axillary lymph node", [7600, 8134]) }, "ApicalFourChamber": {"399214001": ("Apical four chamber", [12226])}, "ApicalFourChamberView": { "399214001": ("Apical four chamber view (qualifier value)", []) }, "ApicalLongAxis": {"399339008": ("Apical long axis", [501, 12226])}, "ApicalTwoChamber": {"399232001": ("Apical two chamber", [12226])}, "ApicalTwoChamberView": { "399232001": ("Apical two chamber view (qualifier value)", []) }, "ApocrineAdenocarcinoma": {"57141000": ("Apocrine adenocarcinoma", [6030, 6033])}, "ApocrineMetaplasia": {"81274009": ("Apocrine Metaplasia", [6030, 6031])}, "AppaloosaHorse": {"55167009": ("Appaloosa horse (organism)", [])}, "AppaloosaHorseBreed": {"55167009": ("Appaloosa horse breed", [7480])}, "AppendicealStump": {"441850003": ("Appendiceal stump", [6202, 6204, 8134])}, "AppendicularLymphNode": {"46157003": ("appendicular lymph node", [7600, 8134])}, "Appendix": {"66754008": ("Appendix", [6202, 6204, 8134])}, "AppendixStructure": {"66754008": ("Appendix structure (body structure)", [])}, "AppenzellGoatBreed": {"131616009": ("Appenzell goat breed", [7480])}, "AppenzellerDogBreed": {"132538002": ("Appenzeller dog breed", [7480])}, "Apple": {"422670003": ("Apple", [4012])}, "AppleProjection": {"422670003": ("Apple projection (qualifier value)", [])}, "ApproachViaTracheostomy": { "180640008": ("Approach via tracheostomy (qualifier value)", []) }, "ApulianPigBreed": {"132097001": ("Apulian pig breed", [7480])}, "ApulianPodolianCattleBreed": { "131444003": ("Apulian Podolian cattle breed", [7480]) }, "AraappaloosaHorseBreed": {"131862004": ("AraAppaloosa horse breed", [7480])}, "ArabiSheepBreed": {"132810004": ("Arabi sheep breed", [7480])}, "ArabianHorse": {"54098002": ("Arabian horse (organism)", [])}, "ArabianHorseBreed": {"54098002": ("Arabian horse breed", [7480])}, "AracenaCattleBreed": {"133295007": ("Aracena cattle breed", [7480])}, "Arachnoid": {"75042008": ("Arachnoid", [7151, 7153, 7192, 8134, 9514])}, "ArachnoidStructure": {"75042008": ("Arachnoid structure (body structure)", [])}, "AradoCattleBreed": {"131445002": ("Arado cattle breed", [7480])}, "ArapawaIslandGoatBreed": {"131609008": ("Arapawa Island goat breed", [7480])}, "ArapawaIslandPigBreed": {"132221002": ("Arapawa Island pig breed", [7480])}, "ArapawaIslandSheepBreed": {"132809009": ("Arapawa Island sheep breed", [7480])}, "Arcelin": {"399218003": ("Arcelin", [4012])}, "ArcelinProjection": {"399218003": ("Arcelin projection (qualifier value)", [])}, "ArchOfVertebra": {"40265002": ("Arch of vertebra", [6115, 8134])}, "ArchitecturalDistortionOfBreast": { "129792006": ( "Architectural distortion of breast", [6014, 6015, 6016, 6054, 6056], ) }, "ArcuateArteryOfTheKidney": { "274231001": ( "Arcuate Artery of the Kidney", [3827, 7151, 7192, 8134, 9514, 12103, 12115], ) }, "ArdennesHorseBreed": {"133116001": ("Ardennes horse breed", [7480])}, "Area": { "42798000": ( "Area", [ 218, 7469, 7471, 8136, 12253, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12274, 12304, ], ) }, "AreaOfDefinedRegion": { "131184002": ("Area of defined region", [218, 7469, 7471, 12308]) }, "AreaOfInternalAuditoryCanal": { "361078006": ("Area of internal auditory canal (body structure)", []) }, "ArgentineCriolloHorseBreed": { "131863009": ("Argentine Criollo horse breed", [7480]) }, "ArgentineDogoDogBreed": {"132392002": ("Argentine Dogo dog breed", [7480])}, "ArgentineFriesianCattleBreed": { "133296008": ("Argentine Friesian cattle breed", [7480]) }, "ArgentinePoloPonyHorseBreed": { "131864003": ("Argentine Polo Pony horse breed", [7480]) }, "AriégeoisDogBreed": {"132539005": ("Ariégeois dog breed", [7480])}, "AriégeoisPonyBreed": {"396488006": ("Ariégeois pony breed (organism)", [])}, "AriégeoisPonyHorseBreed": {"396488006": ("Ariégeois pony horse breed", [7480])}, "ArmErgometer": {"429560009": ("Arm ergometer", [3203])}, "ArmErgometerDevice": { "429560009": ("Arm ergometer, device (physical object)", []) }, "ArmantDogBreed": {"132467004": ("Armant dog breed", [7480])}, "ArmoricanCattleBreed": {"133297004": ("Armorican cattle breed", [7480])}, "Armrest": {"468115008": ("Backrest", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "ArouquesaCattleBreed": {"133298009": ("Arouquesa cattle breed", [7480])}, "Arrhythmia": {"698247007": ("Arrhythmia", [3700])}, "ArsiCattleBreed": {"133631006": ("Arsi cattle breed", [7480])}, "ArterialAneurysm": {"233981004": ("Arterial aneurysm (disorder)", [])}, "ArterialBloodStasis": {"408707005": ("Arterial Blood Stasis", [3494])}, "ArterialDissection": {"710864009": ("Arterial dissection", [3413, 3754, 3810])}, "ArterialGraftToCitedSegment": { "128950003": ("Arterial graft to cited segment (substance)", []) }, "ArterialPressureWaveform": {"128446002": ("Arterial pressure waveform", [3003])}, "ArterialStasis": {"408707005": ("Arterial stasis (finding)", [])}, "ArterialStructure": {"51114001": ("Arterial structure (body structure)", [])}, "ArterialSwitchOperation": {"174826008": ("Arterial switch operation", [12247])}, "ArterialTrueAneurysm": {"233981004": ("Arterial (True) Aneurysm", [3491])}, "ArterialVelocity": {"252064005": ("Arterial velocity (observable entity)", [])}, "Arteriolosclerosis": {"17941002": ("arteriolosclerosis", [3817])}, "ArteriolosclerosisWithFibrinoidNecrosis": { "32651000": ( "Arteriolosclerosis with fibrinoid necrosis (morphologic abnormality)", [], ) }, "Arteriosclerosis": {"28960008": ("arteriosclerosis", [3817])}, "ArteriosclerosisWithFibrinoidNecrosis": { "32651000": ("arteriosclerosis with fibrinoid necrosis", [3817]) }, "ArterioscleroticVascularDisease": { "72092001": ("arteriosclerotic vascular disease", [3805]) }, "ArteriovenousFistula": {"128617001": ("arteriovenous fistula", [3810])}, "ArteriovenousFistulaDisorder": {"439470001": ("Arteriovenous Fistula", [12293])}, "ArteriovenousFistulaOfPulmonaryVessels": { "111289009": ("Arteriovenous fistula of pulmonary vessels (disorder)", []) }, "Artery": { "51114001": ( "Artery", [3010, 3604, 3606, 3630, 4042, 7151, 7166, 7191, 7192, 8134, 9514], ) }, "ArtificialLensPresent": {"309523001": ("Pseudophakia", [4231])}, "ArtificialMenopauseState": {"31351009": ("Artificial menopause state", [6086])}, "ArtificialRespiration": {"40617009": ("Artificial Respiration", [617, 618])}, "AsRequired": {"225761000": ("As required", [6091])}, "Ascending": {"79458005": ("Ascending", [5])}, "AscendingAorta": { "54247002": ( "Ascending aorta", [ 4, 3010, 3604, 3606, 3630, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12291, 12305, ], ) }, "AscendingAortaStructure": { "54247002": ("Ascending aorta structure (body structure)", []) }, "AscendingColon": {"9040008": ("Ascending colon", [6210, 8134])}, "AscendingColonStructure": { "9040008": ("Ascending colon structure (body structure)", []) }, "AsciticFluid": {"409615008": ("Ascitic fluid", [645, 8134])}, "AscorbicAcid": {"43706004": ("Ascorbic acid", [4410])}, "AshantiDwarfPigBreed": {"133178006": ("Ashanti Dwarf pig breed", [7480])}, "AsianOrPacificIslander": { "413581001": ("Asian or Pacific islander (racial group)", []) }, "AsianOrPacificIslanderRace": { "413581001": ("Asian or Pacific Islander race", [6099]) }, "AsianRace": {"413582008": ("Asian race", [6099])}, "Asleep": {"248220008": ("Asleep", [3050])}, "Aspirate": {"119295008": ("Aspirate", [8103])}, "Aspiration": {"14766002": ("Aspiration", [8109])}, "AssessmentScales": {"273249006": ("Assessment scales (assessment scale)", [])}, "AssociatedFinding": {"246090004": ("Associated finding (attribute)", [])}, "AssociatedMorphology": {"116676008": ("Associated morphology (attribute)", [])}, "AssociatedProcedure": {"363589002": ("Associated procedure (attribute)", [])}, "AssociatedWith": {"47429007": ("Associated with (attribute)", [])}, "Asthenia": {"13791008": ("Asthenia (debility)", [3205])}, "Asthma": {"195967001": ("Asthma", [64])}, "AstringentDrug": {"60533005": ("Astringent drug", [10])}, "Astrocytoma": {"254938000": ("Astrocytoma", [638, 639])}, "AstrocytomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "38713004": ( "Astrocytoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "AstrocytomaOfBrain": {"254938000": ("Astrocytoma of brain (disorder)", [])}, "AsturianMountainCattleBreed": { "131563004": ("Asturian Mountain cattle breed", [7480]) }, "AsturianTarpanHorseXDomesticHorseBreed": { "132992005": ("Asturian tarpan horse X domestic horse breed", [7480]) }, "AsturianValleyCattleBreed": { "131564005": ("Asturian Valley cattle breed", [7480]) }, "AsymmetricBreastTissue": { "129790003": ("Asymmetric breast tissue", [6016, 6017, 6054]) }, "AsymmetricBreastTissueAnalysis": { "133889002": ("Asymmetric breast tissue analysis", [6043]) }, "AsymmetricBreastTissueFinding": { "129790003": ("Asymmetric breast tissue finding (finding)", []) }, "AsynchronousInvolutionOfBreast": { "130963002": ("Asynchronous involution of breast", [6030, 6031]) }, "Ataxia": {"20262006": ("Ataxia (finding)", [])}, "AtaxiaOrIncoordination": {"20262006": ("Ataxia or incoordination", [3205])}, "AtebrinFSStain": {"84656005": ("atebrin FS stain", [8112])}, "Atherectomy": {"6832004": ("Atherectomy", [9, 3405])}, "AtherectomyByLaser": {"76611008": ("Atherectomy by laser", [9, 3405])}, "AtherectomyByRotaryCutter": { "65659003": ("Atherectomy by rotary cutter", [9, 3405]) }, "AtherectomyDevice": {"102312002": ("Atherectomy device", [8, 4051, 7151, 7193])}, "Atheroma": {"48434008": ("atheroma", [3817])}, "AtheroscleroticFibrousPlaque": { "20717008": ("atherosclerotic fibrous plaque", [3817]) }, "AtlantalAxialJoint": {"62555009": ("Atlantal-axial joint", [7482, 7483, 8134])}, "AtlantoOccipitalJoint": { "20292002": ("Atlanto-occipital joint", [7482, 7483, 8134]) }, "AtlantooccipitalJointStructure": { "20292002": ("Atlantooccipital joint structure (body structure)", []) }, "AtopicDermatitis": {"24079001": ("Atopic dermatitis", [4405])}, "AtpadiMahalCattleBreed": {"133632004": ("Atpadi Mahal cattle breed", [7480])}, "AtrialArrhythmia": {"17366009": ("atrial arrhythmia", [3826])}, "AtrialEffectiveRefractoryPeriod": { "129087001": ("Atrial effective refractory period (observable entity)", []) }, "AtrialEffectiveRefractoryPeriodEvaluationOf": { "129087001": ("Atrial Effective Refractory Period, evaluation of", [3254]) }, "AtrialFibrillation": {"49436004": ("Atrial Fibrillation", [3230, 3700])}, "AtrialInversionOperationUsingAtrialWall": { "174822005": ("Atrial inversion operation using atrial wall", [12247]) }, "AtrialPacing": {"69158002": ("atrial pacing", [3555])}, "AtrialPrematureContraction": { "284470004": ("Atrial premature contraction", [3230]) }, "AtrialSeptalDefect": { "70142008": ( "Atrial Septal defect", [ 3610, 3630, 3700, 3728, 6102, 6109, 6113, 6148, 7151, 7192, 9514, 12236, 12244, 12248, 12249, 12284, ], ) }, "AtrialSeptalDefectRepair": {"112811009": ("Atrial septal defect repair", [12247])}, "AtrialSeptalDefectWithEndocardialCushionDefectPartial": { "60732002": ( "Atrial septal defect with endocardial cushion defect, partial", [12248, 12249], ) }, "AtrialSeptalDefectWithEndocardialCushionDefectPartialType": { "60732002": ( "Atrial septal defect with endocardial cushion defect, partial type (disorder)", [], ) }, "AtrialStructure": {"59652004": ("Atrial structure (body structure)", [])}, "AtrialSystole": {"59972007": ("Atrial Systole", [12233])}, "AtrialSystoleAWave": {"59972007": ("Atrial Systole (A-wave)", [12307])}, "AtrialSystoleFunction": { "59972007": ("Atrial systole, function (observable entity)", []) }, "AtrialVein": {"195164009": ("Atrial Vein", [3827, 3839, 7151, 7192, 9514])}, "AtrioventricularBundle": {"345000": ("Atrioventricular bundle", [3011, 8134])}, "AtrioventricularBundleStructure": { "345000": ("Atrioventricular bundle structure (body structure)", []) }, "AtrioventricularNode": {"25943004": ("Atrioventricular node", [3011, 8134])}, "AtrioventricularSequentialPacing": { "371910005": ("Atrioventricular sequential pacing (procedure)", []) }, "AtrioventricularVein": { "195496005": ("Atrioventricular Vein", [3827, 3839, 7151, 7192, 9514]) }, "Atrium": {"59652004": ("Atrium", [4, 7151, 7192, 8134, 9514])}, "Atrophy": {"13331008": ("Atrophy", [6335, 6336, 6337, 6338])}, "Atropine": {"73949004": ("Atropine", [10, 3204])}, "AtropineInOcularDoseForm": {"771928002": ("Atropine", [4208])}, "Attending": {"405279007": ("Attending", [7450, 7452])}, "AttendingPhysician": {"405279007": ("Attending physician (occupation)", [])}, "AtypicalAngina": {"371807002": ("Atypical Angina", [3202, 3220])}, "AtypicalAnginaVariantAngina": { "87343002": ("Atypical Angina, Variant Angina", [3700]) }, "AtypicalChestPain": {"102589003": ("Atypical chest pain", [3700])}, "AtypicalIntraductalHyperplasia": { "6660000": ("Atypical intraductal hyperplasia", [6030, 6032]) }, "AtypicalLobularHyperplasia": { "33889003": ("Atypical lobular hyperplasia", [6030, 6032]) }, "AtypicalMoleSyndrome": {"254819008": ("Atypical mole syndrome", [4405])}, "AubracCattleBreed": {"131565006": ("Aubrac cattle breed", [7480])}, "Audiology": {"309914005": ("Audiology", [7030])}, "AudiologyDepartment": {"309914005": ("Audiology department (environment)", [])}, "AuditoryRadiation": {"410726006": ("auditory radiation", [7702, 7710, 8134])}, "AugmentationMammoplasty": {"22890008": ("Augmentation mammoplasty", [6051])}, "AulieAtaCattleBreed": {"131566007": ("Aulie-Ata cattle breed", [7480])}, "Aunt": {"25211005": ("Aunt", [7450, 7451])}, "AuramineGStain": {"73251007": ("auramine G stain", [8112])}, "AuramineOStain": {"81397005": ("auramine O stain", [8112])}, "AuramineStain": {"255794000": ("auramine stain", [8112])}, "AureEtSaintGironsCattleBreed": { "133299001": ("Aure et Saint-Girons cattle breed", [7480]) }, "AustralianAborigine": {"413600007": ("Australian aborigine (racial group)", [])}, "AustralianAborigineRace": {"413600007": ("Australian aborigine race", [6099])}, "AustralianBrafordCattleBreed": { "133704002": ("Australian Braford cattle breed (organism)", []) }, "AustralianBrafordXZebuCattleBreed": { "133704002": ("Australian Braford X zebu cattle breed", [7480]) }, "AustralianBrumbyHorseBreed": { "133131005": ("Australian Brumby horse breed", [7480]) }, "AustralianCattleDog": {"11746005": ("Australian cattle dog", [7480])}, "AustralianFriesianSahiwalCattleBreed": { "133715007": ("Australian Friesian Sahiwal cattle breed (organism)", []) }, "AustralianFriesianSahiwalXZebuCattleBreed": { "133715007": ("Australian Friesian Sahiwal X zebu cattle breed", [7480]) }, "AustralianGoatBreed": {"131608000": ("Australian goat breed", [7480])}, "AustralianGreyhoundDogBreed": { "132468009": ("Australian Greyhound dog breed", [7480]) }, "AustralianKelpieDogBreed": {"132541006": ("Australian Kelpie dog breed", [7480])}, "AustralianLowlineCattleBreed": { "131567003": ("Australian Lowline cattle breed", [7480]) }, "AustralianMilkingZebuCattleBreed": { "133748007": ("Australian Milking Zebu cattle breed (organism)", []) }, "AustralianMilkingZebuXZebuCattleBreed": { "133748007": ("Australian Milking Zebu X zebu cattle breed", [7480]) }, "AustralianMistCatBreed": {"132660007": ("Australian Mist cat breed", [7480])}, "AustralianPonyHorseBreed": {"131865002": ("Australian Pony horse breed", [7480])}, "AustralianShepherdDogBreed": { "132521001": ("Australian Shepherd dog breed", [7480]) }, "AustralianShorthornCattleBreed": { "133472001": ("Australian Shorthorn cattle breed", [7480]) }, "AustralianStockHorseHorseBreed": { "133132003": ("Australian Stock Horse horse breed", [7480]) }, "AustralianTerrier": {"112491001": ("Australian terrier", [7480])}, "AustralianTerrierRoughCoatedDogBreed": { "132469001": ("Australian Terrier, rough-coated dog breed", [7480]) }, "AustralianTerrierSilkyDogBreed": { "132470000": ("Australian Terrier, silky dog breed", [7480]) }, "AustralianWhiteCattleBreed": { "133300009": ("Australian White cattle breed", [7480]) }, "AustrianHoundDogBreed": {"132471001": ("Austrian Hound dog breed", [7480])}, "AustrianPinscherDogBreed": {"132408006": ("Austrian Pinscher dog breed", [7480])}, "AustrianSimmentalCattleBreed": { "133301008": ("Austrian Simmental cattle breed", [7480]) }, "AustrianSmoothHairedBrackeDogBreed": { "132472008": ("Austrian Smooth-Haired Bracke dog breed", [7480]) }, "AustrianYellowCattleBreed": { "133302001": ("Austrian Yellow cattle breed", [7480]) }, "Automated": {"8359006": ("Automated", [7230])}, "AutomaticImplantableCardiacDefibrillatorInSitu": { "443325000": ( "Automatic implantable cardiac defibrillator in situ (finding)", [], ) }, "AutonomicNerve": {"53520000": ("Autonomic nerve", [7151, 7167, 7192, 8134, 9514])}, "AutonomicNerveStructure": { "53520000": ("Autonomic nerve structure (body structure)", []) }, "AutonomousBreathing": {"45804006": ("autonomous breathing", [3823, 9272])}, "AutonomousBreathingFunction": { "45804006": ("Autonomous breathing, function (observable entity)", []) }, "AuxoisHorseBreed": {"131866001": ("Auxois horse breed", [7480])}, "AveligneseHorseBreed": {"131867005": ("Avelignese horse breed", [7480])}, "AverageDiastolicBloodPressure": { "314453003": ("Average diastolic blood pressure", [3337, 3611]) }, "AverageSystolicBloodPressure": { "314440001": ("Average systolic blood pressure", [3337, 3611]) }, "Averaged": {"373098007": ("Averaged", [3676])}, "AveragedHemodynamicMeasurementMethod": { "128580001": ("Averaged hemodynamic measurement method", [3241]) }, "AveragedHemodynamicMeasurementMethodRegimeTherapy": { "128580001": ("Averaged hemodynamic measurement method (regime/therapy)", []) }, "AvetonouCattleBreed": {"133303006": ("Avetonou cattle breed", [7480])}, "AvilenaBlackIberianCattleBreed": { "133305004": ("Avilena-Black Iberian cattle breed", [7480]) }, "AvilenaCattleBreed": {"133304000": ("Avilena cattle breed", [7480])}, "Awake": {"248218005": ("Awake", [3050])}, "AwassiSheepBreed": {"132808001": ("Awassi sheep breed", [7480])}, "AweilDinkaCattleBreed": {"131446001": ("Aweil Dinka cattle breed", [7480])}, "Axial": {"24422004": ("Axial", [2, 26, 501, 6312])}, "AxialProjection": {"399061009": ("axial", [501, 4010])}, "Axilla": {"91470000": ("Axilla", [4, 7151, 7192, 8134, 9514])}, "AxillaPositionOnMammogram": { "129791004": ("Axilla position on mammogram (finding)", []) }, "AxillaRegion": {"129791004": ("Axilla region", [6018, 6019])}, "AxillaryAdenopathy": { "127189005": ("Axillary adenopathy", [6014, 6015, 6016, 6054, 6056]) }, "AxillaryArtery": { "67937003": ( "Axillary Artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12107, ], ) }, "AxillaryFascia": { "368536000": ( "Axillary Fascia", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "AxillaryLymphNode": { "68171009": ("Axillary lymph node", [6014, 6015, 6016, 6054, 6056, 7600, 8134]) }, "AxillaryLymphNodeStructure": { "68171009": ("Axillary lymph node structure (body structure)", []) }, "AxillaryLymphadenopathy": { "127189005": ("Axillary lymphadenopathy (disorder)", []) }, "AxillaryRegionStructure": { "91470000": ("Axillary region structure (body structure)", []) }, "AxillaryTail": {"399011000": ("Axillary Tail", [4015])}, "AxillaryTailMammographyView": { "399011000": ("Axillary tail mammography view (qualifier value)", []) }, "AxillaryTailPositionOnMammogram": { "129785001": ("Axillary tail position on mammogram (finding)", []) }, "AxillaryTailRegion": {"129785001": ("Axillary tail region", [6018, 6019])}, "AxillaryTissue": {"442580003": ("Axillary tissue", [4015])}, "AxillaryTissueMammographyView": { "442580003": ("Axillary tissue mammography view (qualifier value)", []) }, "AxillaryVein": { "68705008": ( "Axillary vein", [ 4, 3010, 3607, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12108, ], ) }, "AxillaryVeinLymphNode": {"421624008": ("axillary vein lymph node", [7600, 8134])}, "AxisOfCylinder": {"251799001": ("Axis of cylinder (observable entity)", [])}, "AyrshireCattleBreed": {"8989009": ("Ayrshire cattle breed (organism)", [])}, "AyrshireCowBreed": {"8989009": ("Ayrshire cow breed", [7480])}, "AzaouakCattleBreed": {"133633009": ("Azaouak cattle breed", [7480])}, "Azaperone": {"96229001": ("Azaperone", [623, 625])}, "AzawakhDogBreed": {"132520000": ("Azawakh dog breed", [7480])}, "AzerbaijanHorseBreed": {"131868000": ("Azerbaijan horse breed", [7480])}, "AzerbaijanZebuCattleBreed": { "133634003": ("Azerbaijan Zebu cattle breed", [7480]) }, "AzoBlackStain": {"85066006": ("azo black stain", [8112])}, "AzocarmineGGXStain": {"76048000": ("azocarmine G (GX) stain", [8112])}, "AzophloxinStain": {"35609001": ("azophloxin stain", [8112])}, "AzoresHorseBreed": {"131869008": ("Azores horse breed", [7480])}, "AzorubinSStain": {"2159007": ("azorubin S stain", [8112])}, "AztecaHorseBreed": {"133118000": ("Azteca horse breed", [7480])}, "AzureAStain": {"16836001": ("azure A stain", [8112])}, "AzureBStain": {"8926000": ("azure B stain", [8112])}, "AzureCStain": {"11069001": ("azure C stain", [8112])}, "AzygosVein": { "72107004": ( "Azygos vein", [ 4, 3010, 3607, 3630, 3827, 3839, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, ], ) }, "BBShotDevice": {"102378009": ("BB shot, device (qualifier value)", [])}, "BBShotLeadPellet": { "102378009": ("BB shot (Lead Pellet)", [6040, 6401, 7111, 7112, 7151, 7193]) }, "BKB1PigBreed": {"132277000": ("BKB-1 pig breed", [7480])}, "BMode": {"399009009": ("B mode", [6058, 12224])}, "BModeUltrasound": {"399009009": ("B mode ultrasound (qualifier value)", [])}, "BSIPigBreed": {"132342003": ("BSI pig breed", [7480])}, "BaXuyenPigBreed": {"132220001": ("Ba Xuyen pig breed", [7480])}, "BachaurCattleBreed": {"133595008": ("Bachaur cattle breed", [7480])}, "Back": {"77568009": ("Back", [4, 7151, 7192, 8134, 9514])}, "BackStructureExcludingNeck": { "77568009": ("Back structure, excluding neck (body structure)", []) }, "Backrest": {"20406008": ("Backrest", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "BadenWurttemburgHorseBreed": { "132731005": ("Baden Wurttemburg horse breed", [7480]) }, "Baffle": { "128981007": ( "Baffle", [4, 3010, 3604, 3606, 3608, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "BaffleDevice": {"128981007": ("Baffle, device (physical object)", [])}, "BaggaraCattleBreed": {"133635002": ("Baggara cattle breed", [7480])}, "BagotGoatBreed": {"131620008": ("Bagot goat breed", [7480])}, "BahiaPigBreed": {"132162000": ("Bahia pig breed", [7480])}, "BahimaCattleBreed": {"131447005": ("Bahima cattle breed", [7480])}, "BakosiCattleBreed": {"133306003": ("Bakosi cattle breed", [7480])}, "BakosiPigBreed": {"133187002": ("Bakosi pig breed", [7480])}, "BakwiriCattleBreed": {"133307007": ("Bakwiri cattle breed", [7480])}, "BaladiCattleBreed": {"131429004": ("Baladi cattle breed (organism)", [])}, "BaladicattleCattleBreed": {"131429004": ("Baladicattle cattle breed", [7480])}, "BalancedCoronaryDominance": {"253730009": ("Balanced Coronary Dominance", [3710])}, "BalancedCoronarySystem": { "253730009": ("Balanced coronary system (disorder)", []) }, "BaldingerSpottedPigBreed": {"132356001": ("Baldinger Spotted pig breed", [7480])}, "BalearicHorseBreed": {"133140009": ("Balearic horse breed", [7480])}, "BaliHorseBreed": {"131870009": ("Bali horse breed", [7480])}, "BalikunHorseBreed": {"131871008": ("Balikun horse breed", [7480])}, "BalineseCat": {"3653002": ("Balinese cat", [7480])}, "BalinesePigBreed": {"133175009": ("Balinese pig breed", [7480])}, "BalkanHoundDogBreed": {"132473003": ("Balkan Hound dog breed", [7480])}, "BalkeProtocol": {"129097005": ("Balke protocol", [3261, 12001])}, "BalkhiSheepBreed": {"132804004": ("Balkhi sheep breed", [7480])}, "BaltaretPigBreed": {"132198008": ("Baltaret pig breed", [7480])}, "BalticBlackPiedCattleBreed": { "133308002": ("Baltic Black Pied cattle breed", [7480]) }, "BaluchiHorseBreed": {"133139007": ("Baluchi horse breed", [7480])}, "BaluchiSheepBreed": {"132861009": ("Baluchi sheep breed", [7480])}, "BalwenWelshMountainSheepBreed": { "132813002": ("Balwen Welsh Mountain sheep breed", [7480]) }, "BamaxiangPigBreed": {"132315004": ("Bamaxiang pig breed", [7480])}, "BambaraCattleBreed": {"133752007": ("Bambara cattle breed (organism)", [])}, "BambaraXZebuCattleBreed": {"133752007": ("Bambara X zebu cattle breed", [7480])}, "BambawaCattleBreed": {"133636001": ("Bambawa cattle breed", [7480])}, "BambeyCattleBreed": {"133763005": ("Bambey cattle breed (organism)", [])}, "BambeyXZebuCattleBreed": {"133763005": ("Bambey X zebu cattle breed", [7480])}, "BameiPigBreed": {"132132006": ("Bamei pig breed", [7480])}, "BamiCattleBreed": {"133637005": ("Bami cattle breed", [7480])}, "BanEiHorseBreed": {"133137009": ("Ban-ei horse breed", [7480])}, "BanatWhitePigBreed": {"133197006": ("Banat White pig breed", [7480])}, "BanjaraGreyhoundDogBreed": {"132474009": ("Banjara greyhound dog breed", [7480])}, "BankerHorseHorseBreed": {"131873006": ("Banker Horse horse breed", [7480])}, "BantuPigBreed": {"132227003": ("Bantu pig breed", [7480])}, "BanyoCattleBreed": {"133638000": ("Banyo cattle breed", [7480])}, "BaouleCattleBreed": {"133309005": ("Baoule cattle breed", [7480])}, "BapediCattleBreed": {"131448000": ("Bapedi cattle breed", [7480])}, "BarbHorseBreed": {"133136000": ("Barb horse breed", [7480])}, "BarbadoSheepBreed": {"132860005": ("Barbado sheep breed", [7480])}, "BarbadosBlackbellySheepBreed": { "132806002": ("Barbados Blackbelly sheep breed", [7480]) }, "BarbadosSheep": {"25660007": ("Barbados sheep (organism)", [])}, "BarbadosSheepBreed": {"25660007": ("Barbados sheep breed", [7480])}, "BarbariGoatBreed": {"131645006": ("Barbari goat breed", [7480])}, "BarbetDogBreed": {"132533006": ("Barbet dog breed", [7480])}, "Barbiturate": {"372798009": ("Barbiturate", [621, 622])}, "BardigianoHorseBreed": {"131874000": ("Bardigiano horse breed", [7480])}, "BargurCattleBreed": {"133639008": ("Bargur cattle breed", [7480])}, "BariCattleBreed": {"133640005": ("Bari cattle breed", [7480])}, "BariaVietnamMadagascarCattleBreed": { "131449008": ("Baria (Vietnam/Madagascar) cattle breed", [7480]) }, "Barium": {"39290007": ("Barium", [13, 300])}, "BariumSulfate": {"25419009": ("Barium Sulfate", [12, 3850])}, "BarkaCattleBreed": {"133596009": ("Barka cattle breed (organism)", [])}, "BarkaZebuCattleBreed": {"133596009": ("Barka zebu cattle breed", [7480])}, "BarotseCattleBreed": {"131450008": ("Barotse cattle breed", [7480])}, "BarraDoCuanzoCattleBreed": {"131451007": ("Barra do Cuanzo cattle breed", [7480])}, "BarrosaCattleBreed": {"133310000": ("Barrosa cattle breed", [7480])}, "BarrosoCattleBreed": {"133311001": ("Barroso cattle breed", [7480])}, "BarzonaCattleBreed": {"131568008": ("Barzona cattle breed", [7480])}, "Basal": {"57195005": ("Basal", [2, 6124, 6125])}, "BasalAnteriorFibromuscularStromaOfProstate": { "716891004": ("Basal anterior fibromuscular stroma of prostate", [6300, 6303]) }, "BaseOfTongue": {"47975008": ("base of tongue", [7601, 8134])}, "BaselineState": {"128974000": ("Baseline state", [3262, 3602])}, "Basenji": {"47659007": ("Basenji", [7480])}, "BashiCattleBreed": {"131452000": ("Bashi cattle breed", [7480])}, "BashkirCurlyHorseBreed": {"133134002": ("Bashkir Curly horse breed", [7480])}, "BashkirHorseBreed": {"133135001": ("Bashkir horse breed", [7480])}, "BasilarArtery": { "59011009": ( "Basilar artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12106, ], ) }, "BasilicVein": { "19715009": ( "Basilic vein", [3607, 3630, 3827, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "BasqueBlackPiedPigBreed": {"132122004": ("Basque Black Pied pig breed", [7480])}, "BassetArtésianNormandDogBreed": { "132517008": ("Basset Artésian Normand dog breed", [7480]) }, "BassetBleuDeGascogneDogBreed": { "132414004": ("Basset Bleu de Gascogne dog breed", [7480]) }, "BassetFauveDeBretagneDogBreed": { "132397008": ("Basset Fauve de Bretagne dog breed", [7480]) }, "BassetGriffonVendéenDogBreed": { "132412000": ("Basset Griffon Vendéen dog breed", [7480]) }, "BassetHound": {"41320000": ("Basset hound", [7480])}, "BasutoCattleBreed": {"131453005": ("Basuto cattle breed", [7480])}, "BasutoPonyHorseBreed": {"133133008": ("Basuto Pony horse breed", [7480])}, "BatakHorseBreed": {"131875004": ("Batak horse breed", [7480])}, "BatanesBlackCattleBreed": { "133764004": ("Batanes Black cattle breed (organism)", []) }, "BatanesBlackXZebuCattleBreed": { "133764004": ("Batanes Black X zebu cattle breed", [7480]) }, "BatangasCattleBreed": {"131454004": ("Batangas cattle breed", [7480])}, "BatardDogBreed": {"132413005": ("Batard dog breed", [7480])}, "BauerChromicAcidLeucofuchsinStain": { "406982003": ("bauer's chromic acid leucofuchsin stain", [8112]) }, "BavarianForestSheepBreed": {"132805003": ("Bavarian Forest sheep breed", [7480])}, "BavarianMountainHoundDogBreed": { "132518003": ("Bavarian Mountain Hound dog breed", [7480]) }, "BavarianWarmbloodHorseBreed": { "131876003": ("Bavarian Warmblood horse breed", [7480]) }, "BavendaCattleBreed": {"131455003": ("Bavenda cattle breed", [7480])}, "BazadaisCattleBreed": {"131569000": ("Bazadais cattle breed", [7480])}, "BaznaPigBreed": {"133198001": ("Bazna pig breed", [7480])}, "Beagle": {"44696006": ("Beagle", [7480])}, "BeagleElizabethanDogBreed": { "132529004": ("Beagle, Elizabethan dog breed", [7480]) }, "BeagleHarrierDogBreed": {"132401000": ("Beagle Harrier dog breed", [7480])}, "BeagleRoughDogBreed": {"132381003": ("Beagle, Rough dog breed", [7480])}, "BeagleSmoothDogBreed": {"132380002": ("Beagle, Smooth dog breed", [7480])}, "BeagleStandardDogBreed": {"132475005": ("Beagle, Standard dog breed", [7480])}, "BeardedCollie": {"75911001": ("Bearded collie (organism)", [])}, "BeardedCollieDogBreed": {"75911001": ("Bearded collie dog breed", [7480])}, "BearnaisCattleBreed": {"133312008": ("Bearnais cattle breed", [7480])}, "BeauceronDogBreed": {"132519006": ("Beauceron dog breed", [7480])}, "Beclere": {"399263002": ("Beclere", [4012])}, "BeclereProjection": {"399263002": ("Beclere projection (qualifier value)", [])}, "BedlingtonTerrier": {"1514007": ("Bedlington terrier", [7480])}, "BeefShorthornCattleBreed": {"133313003": ("Beef shorthorn cattle breed", [7480])}, "BeefSyntheticCattleBreed": {"133314009": ("Beef synthetic cattle breed", [7480])}, "BeefmakerCattleBreed": {"131570004": ("Beefmaker cattle breed", [7480])}, "BeetalGoatBreed": {"131659004": ("Beetal goat breed", [7480])}, "Before": {"272113006": ("Before", [3600])}, "BeforeMenopause": {"309606002": ("Before menopause", [6086])}, "BeforeProcedure": {"307153007": ("Before Procedure", [631, 12002, 12102])}, "BeforeValues": {"272113006": ("Before values (qualifier value)", [])}, "BeijingBlackPiedCattleBreed": { "133315005": ("Beijing Black Pied cattle breed", [7480]) }, "BeijingBlackPigBreed": {"132143003": ("Beijing Black pig breed", [7480])}, "BeiroaCattleBreed": {"133316006": ("Beiroa cattle breed", [7480])}, "BejaCattleBreed": {"131456002": ("Beja cattle breed", [7480])}, "BelarusRedCattleBreed": {"131571000": ("Belarus Red cattle breed", [7480])}, "BelgianArdennaisHorseBreed": { "131877007": ("Belgian Ardennais horse breed", [7480]) }, "BelgianBlackPiedHolsteinCattleBreed": { "133317002": ("Belgian Black Pied Holstein cattle breed", [7480]) }, "BelgianBlackPiedHolsteincattleBreed": { "133317002": ("Belgian Black Pied Holsteincattle breed (organism)", []) }, "BelgianBlueCattleBreed": {"131572007": ("Belgian Blue cattle breed", [7480])}, "BelgianGriffonDogBreed": {"132527002": ("Belgian Griffon dog breed", [7480])}, "BelgianGriffonRoughDogBreed": { "132382005": ("Belgian Griffon, Rough dog breed", [7480]) }, "BelgianGriffonSmoothDogBreed": { "132383000": ("Belgian Griffon, Smooth dog breed", [7480]) }, "BelgianGroenendaelDog": {"74536009": ("Belgian groenendael dog", [7480])}, "BelgianHalfbloodHorseBreed": { "131878002": ("Belgian Halfblood horse breed", [7480]) }, "BelgianHorse": {"22720009": ("Belgian horse (organism)", [])}, "BelgianHorseBreed": {"22720009": ("Belgian horse breed", [7480])}, "BelgianLaekenDog": {"76554006": ("Belgian laeken dog", [7480])}, "BelgianLandraceBNPigBreed": { "132087005": ("Belgian Landrace, BN pig breed", [7480]) }, "BelgianMalinoisDog": {"37116003": ("Belgian malinois dog", [7480])}, "BelgianRedCattleBreed": {"131573002": ("Belgian Red cattle breed", [7480])}, "BelgianRedPiedCattleBreed": { "133318007": ("Belgian Red Pied cattle breed", [7480]) }, "BelgianSheepdog": {"85144002": ("Belgian sheepdog", [7480])}, "BelgianStreetDogBreed": {"132385007": ("Belgian Street Dog breed", [7480])}, "BelgianTervurenDog": {"27444002": ("Belgian tervuren dog", [7480])}, "BelgianWarmbloodHorseBreed": { "131879005": ("Belgian Warmblood horse breed", [7480]) }, "BelgianWhiteAndRedCattleBreed": { "133319004": ("Belgian White and Red cattle breed", [7480]) }, "BelgianWolfhoundDogBreed": {"132522008": ("Belgian Wolfhound dog breed", [7480])}, "BelgiumLandracePig": {"10261003": ("Belgium landrace pig (organism)", [])}, "BelgiumLandracePigBreed": {"10261003": ("Belgium landrace pig breed", [7480])}, "BelmontAdaptaurCattleBreed": { "131574008": ("Belmont Adaptaur cattle breed", [7480]) }, "BelmontRedCattleBreed": {"131430009": ("Belmont Red cattle breed", [7480])}, "BelorusBlackPiedPigBreed": {"132278005": ("Belorus Black Pied pig breed", [7480])}, "BeltedGallowayCattleBreed": { "13544004": ("Belted Galloway cattle breed (organism)", []) }, "BeltedGallowayCowBreed": {"13544004": ("Belted Galloway cow breed", [7480])}, "BeltedWelshCattleBreed": {"133320005": ("Belted Welsh cattle breed", [7480])}, "BeltsvillePig": {"48394005": ("Beltsville pig (organism)", [])}, "BeltsvillePigBreed": {"48394005": ("Beltsville pig breed", [7480])}, "BenadirGoatBreed": {"131657002": ("Benadir goat breed", [7480])}, "BengalCatBreed": {"132661006": ("Bengal cat breed", [7480])}, "BengaliCattleBreed": {"133597000": ("Bengali cattle breed", [7480])}, "Benign": {"30807003": ("Benign", [6063])}, "BenignLocalizedHyperplasiaOfProstate": { "444808002": ("Benign localized hyperplasia of prostate (disorder)", []) }, "BenignNeoplasmOfNippleOfFemaleBreast": { "92248004": ("Benign neoplasm of nipple of female breast (disorder)", []) }, "BenignNeoplasmOfNippleOfFemaleBreastNippleAdenoma": { "92248004": ( "Benign neoplasm of nipple of female breast (Nipple adenoma)", [6030, 6031], ) }, "BenignProstateHyperplasia": { "444808002": ("Benign Prostate Hyperplasia", [6313, 6335, 6336, 6337, 6338]) }, "BentheimBlackPiedPigBreed": { "132355002": ("Bentheim Black Pied pig breed", [7480]) }, "BentheimerLandschafSheepBreed": { "132859000": ("Bentheimer Landschaf sheep breed", [7480]) }, "BenzoFastScarletStain": {"27844007": ("benzo fast scarlet stain", [8112])}, "Benzodiazepine": {"372664007": ("Benzodiazepine", [621, 622])}, "BenzodiazepineAntagonist": { "372906009": ("Benzodiazepine antagonist", [621, 622]) }, "BergamascaSheepBreed": {"132681007": ("Bergamasca sheep breed", [7480])}, "BergamascoDogBreed": {"132523003": ("Bergamasco dog breed", [7480])}, "BergerDePicardDogBreed": {"132524009": ("Berger de Picard dog breed", [7480])}, "BergerDePyreneesDogBreed": {"132525005": ("Berger de Pyrenees dog breed", [7480])}, "BergerDuLanguedocDogBreed": { "132453008": ("Berger du Languedoc dog breed", [7480]) }, "BergerShetlandDogBreed": {"132640004": ("Berger Shetland dog breed", [7480])}, "BerkshirePig": {"112489009": ("Berkshire pig (organism)", [])}, "BerkshirePigBreed": {"112489009": ("Berkshire pig breed", [7480])}, "BerneseHoundDogBreed": {"132386008": ("Bernese Hound dog breed", [7480])}, "BerneseMountainDog": {"33458006": ("Bernese mountain dog", [7480])}, "BerrendasCattleBreed": {"131575009": ("Berrendas cattle breed", [7480])}, "Bertel": {"399362005": ("Bertel", [4012])}, "BertelProjection": {"399362005": ("Bertel projection (qualifier value)", [])}, "Beryllium": {"88014003": ("Beryllium", [10067])}, "BestCorrectedVisualAcuity": { "419775003": ("Best Corrected Visual Acuity", [4216]) }, "BestValue": {"371912002": ("Best value", [3627])}, "BestValueNumericEstimationTechnique": { "371912002": ("Best value - numeric estimation technique (qualifier value)", []) }, "BestuzhevCattleBreed": {"133321009": ("Bestuzhev cattle breed", [7480])}, "BetaBlocker": {"373254001": ("Beta-blocker", [621, 622])}, "BetaBlockerContainingProduct": { "33252009": ("beta-Adrenergic blocking agent", [10, 3760]) }, "BetaBlockingAgent": {"373254001": ("beta-Blocking agent (substance)", [])}, "BetaGlucuronidaseStain": {"255795004": ("beta-glucuronidase stain", [8112])}, "BetaLactamAntibiotic": {"373297006": ("Beta-Lactam antibiotic", [621, 622])}, "BetizuakCattleBreed": {"133322002": ("Betizuak cattle breed", [7480])}, "BeulahSpeckledFaceSheepBreed": { "131716003": ("Beulah Speckled-Face sheep breed", [7480]) }, "BhagnariCattleBreed": {"133598005": ("Bhagnari cattle breed", [7480])}, "BhirumPonyHorseBreed": {"133123000": ("Bhirum Pony horse breed", [7480])}, "BhujGoatBreed": {"131655005": ("Bhuj goat breed", [7480])}, "BhutiaHorseBreed": {"131880008": ("Bhutia horse breed", [7480])}, "BibrikSheepBreed": {"131704009": ("Bibrik sheep breed", [7480])}, "BichonTeneriffeDogBreed": {"132371002": ("Bichon Teneriffe dog breed", [7480])}, "BichonsFriseDog": {"41538003": ("Bichons frise dog", [7480])}, "BicycleErgometer": {"739006": ("Bicycle ergometer", [3203])}, "BicycleErgometerDevice": { "739006": ("Bicycle ergometer, device (physical object)", []) }, "BidirectionalGlennShuntProcedureOfLeftSuperiorVenaCava": { "443989003": ( "Bidirectional Glenn shunt procedure of left superior vena cava (procedure)", [], ) }, "BidirectionalGlennShuntProcedureOfRightSuperiorVenaCava": { "444034006": ( "Bidirectional Glenn shunt procedure of right superior vena cava (procedure)", [], ) }, "BiebrichScarletStain": {"76605005": ("biebrich scarlet stain", [8112])}, "BielleseSheepBreed": {"131788009": ("Biellese sheep breed", [7480])}, "BifascicularBlock": {"74021003": ("Bifascicular Block", [3230])}, "Bifurcation": {"371894001": ("Bifurcation", [3712])}, "BifurcationLesionOfCoronaryArtery": { "371894001": ("Bifurcation lesion of coronary artery (disorder)", []) }, "Bilateral": {"51440002": ("Bilateral", [2, 211, 244, 245])}, "Bile": {"70150004": ("Bile", [7151, 7197])}, "BileAcidSequestrant": {"372872006": ("Bile acid sequestrant", [3761])}, "BileAcidSequestrantAntilipemicAgent": { "372872006": ("Bile acid sequestrant antilipemic agent (substance)", []) }, "BileDuct": { "28273000": ( "Bile duct", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7154, 7192, 8134, 9514], ) }, "BileDuctStructure": {"28273000": ("Bile duct structure (body structure)", [])}, "BiliaryTract": { "34707002": ( "Biliary tract", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7154, 7192, 8134, 9514], ) }, "BiliaryTractStructure": { "34707002": ("Biliary tract structure (body structure)", []) }, "BillyDogBreed": {"132526006": ("Billy dog breed", [7480])}, "BimalCattleBreed": {"133641009": ("Bimal cattle breed", [7480])}, "BiohazardousMaterial": {"409595003": ("Biohazardous material", [602])}, "Biopsy": {"86273004": ("Biopsy", [9, 8109])}, "BiopsyOfSkin": {"240977001": ("Biopsy of skin", [4409])}, "BiosafetyLevel1": {"409600007": ("Biosafety level 1", [601])}, "BiosafetyLevel2": {"409603009": ("Biosafety level 2", [601])}, "BiosafetyLevel3": {"409604003": ("Biosafety level 3", [601])}, "BiosafetyLevel4": {"409605002": ("Biosafety level 4", [601])}, "BirmanCat": {"43219001": ("Birman cat", [7480])}, "BisaroPigBreed": {"132174001": ("Bisaro pig breed", [7480])}, "BismarkBrownRStain": {"44488008": ("bismark brown R stain", [8112])}, "BismarkBrownYStain": {"85190005": ("bismark brown Y stain", [8112])}, "Bismuth": {"23172004": ("Bismuth", [300])}, "BisonBisonXBosTaurusHybrid": { "425181009": ("Bison bison X Bos taurus hybrid (organism)", []) }, "BisonBisonXSimmentalHybrid": { "424705003": ("Bison bison X Simmental hybrid", [7480]) }, "BisonBisonXSimmentalHybridCattleBreed": { "424705003": ("Bison bison X Simmental hybrid cattle breed (organism)", []) }, "BiteBlock": { "228745001": ("Bite block", [7151, 7157, 7193, 9505, 9513, 9520, 9573]) }, "BizanianHoundDogBreed": {"132372009": ("Bizanian Hound dog breed", [7480])}, "Black": {"371252007": ("Black", [4411])}, "BlackAndTanCoonhound": {"45561005": ("Black and tan coonhound (organism)", [])}, "BlackAndTanCoonhoundDogBreed": { "45561005": ("Black and tan coonhound dog breed", [7480]) }, "BlackAngusCattleBreed": {"409905004": ("Black Angus cattle breed (organism)", [])}, "BlackAngusCowBreed": {"409905004": ("Black Angus cow breed", [7480])}, "BlackBaldyCattleBreed": {"133323007": ("Black Baldy cattle breed", [7480])}, "BlackCockerSpaniel": {"82206008": ("Black cocker spaniel (organism)", [])}, "BlackCockerSpanielDogBreed": { "82206008": ("Black cocker spaniel dog breed", [7480]) }, "BlackColor": {"371252007": ("Black color", [6067])}, "BlackFacedHighlandSheep": { "65187008": ("Black faced Highland sheep (organism)", []) }, "BlackFacedHighlandSheepBreed": { "65187008": ("Black faced Highland sheep breed", [7480]) }, "BlackForestCattleBreed": { "133324001": ("Black Forest cattle breed (organism)", []) }, "BlackForestHoundDogBreed": {"132550008": ("Black Forest Hound dog breed", [7480])}, "BlackForrestCattleBreed": {"133324001": ("Black Forrest cattle breed", [7480])}, "BlackGrisonneGoatBreed": {"131684001": ("Black Grisonne goat breed", [7480])}, "BlackHairlessPigBreed": {"132175000": ("Black Hairless pig breed", [7480])}, "BlackHampshirePigBreed": {"132043001": ("Black Hampshire pig breed", [7480])}, "BlackIberianCattleBreed": {"133325000": ("Black Iberian cattle breed", [7480])}, "BlackMangalitsaPigBreed": {"132176004": ("Black Mangalitsa pig breed", [7480])}, "BlackMouthCurDogBreed": {"132568006": ("Black Mouth Cur dog breed", [7480])}, "BlackRussianTerrierDogBreed": { "132535004": ("Black Russian Terrier dog breed", [7480]) }, "BlackSeaHorseHorseBreed": {"131881007": ("Black Sea Horse horse breed", [7480])}, "BlackSlavonianPigBreed": {"133204003": ("Black Slavonian pig breed", [7480])}, "BlackWelshCattleBreed": {"28744004": ("Black Welsh cattle breed (organism)", [])}, "BlackWelshCowBreed": {"28744004": ("Black Welsh cow breed", [7480])}, "BlackWelshMountainSheepBreed": { "131706006": ("Black Welsh Mountain Sheep breed", [7480]) }, "BlackettHealy": {"399246001": ("Blackett-Healy", [4012])}, "BlackettHealyProjection": { "399246001": ("Blackett-Healy projection (qualifier value)", []) }, "BlackheadPersianSheepBreed": { "131707002": ("Blackhead Persian sheep breed", [7480]) }, "BlacksidedTrondheimAndNorlandCattleBreed": { "131576005": ("Blacksided Trondheim and Norland cattle breed", [7480]) }, "Bladder": { "89837001": ( "Bladder", [ 4, 645, 4009, 4030, 4031, 4040, 4042, 6202, 6204, 7151, 7160, 7192, 7482, 7483, 8134, 9514, 10044, 10060, ], ) }, "BladderAndUrethra": { "110837003": ("Bladder and urethra", [4, 4040, 7151, 7192, 8134, 9514]) }, "BladderCancer": {"399326009": ("Bladder cancer", [638, 639])}, "BlalockTaussigShuntPulmonarySubclavianArteryAnastomosis": { "13662000": ( "Blalock-Taussig shunt, pulmonary-subclavian artery anastomosis", [12247], ) }, "BlancDeBouscatRabbitBreed": { "132888004": ("Blanc de Bouscat rabbit breed", [7480]) }, "BlancaAndaluzaGoatBreed": {"131681009": ("Blanca Andaluza goat breed", [7480])}, "BlancaCeltibericaGoatBreed": { "131682002": ("Blanca Celtiberica goat breed", [7480]) }, "BlancoOrejinegroCattleBreed": { "131577001": ("Blanco Orejinegro cattle breed", [7480]) }, "Bleeding": {"50960005": ("Bleeding", [3413, 3754])}, "BleedingSkin": {"297968009": ("Bleeding skin", [4406, 4408])}, "BleuDuMaineSheepBreed": {"131708007": ("Bleu du Maine sheep breed", [7480])}, "BlockSectioning": {"434472006": ("Block sectioning", [8110])}, "BlockStepSectioning": {"434475008": ("Block step sectioning", [8110])}, "BlockSurfaceRecut": {"434474007": ("Block surface recut", [8110])}, "BlondeDAquitaine": {"62153005": ("Blonde d'Aquitaine (organism)", [])}, "BlondeDAquitaineCowBreed": {"62153005": ("Blonde d'Aquitaine cow breed", [7480])}, "BlondeDuCapBonCattleBreed": { "131458001": ("Blonde-du Cap Bon cattle breed", [7480]) }, "Blood": {"87612001": ("Blood", [7151, 7166, 7191])}, "BloodClot": {"75753009": ("Blood clot", [7151, 7159, 7194])}, "BloodCoagulationDisorder": { "64779008": ("Blood coagulation disorder (disorder)", []) }, "BloodCoagulationDisorders": {"64779008": ("Blood Coagulation Disorders", [1201])}, "BloodPressure": { "75367002": ( "Blood Pressure", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, 12304, ], ) }, "BloodPressureCuffMethod": {"371911009": ("Blood pressure cuff method", [3560])}, "BloodProduct": {"410652009": ("Blood product", [621, 622])}, "BloodSamplingFromExtracorporealBloodCircuit": { "243776001": ("blood sampling from extracorporeal blood circuit", [3515]) }, "BloodVessel": { "59820001": ( "Blood Vessel", [6202, 6204, 7151, 7155, 7166, 7191, 7192, 8134, 9514], ) }, "BloodVesselStructure": { "59820001": ("Blood vessel structure (body structure)", []) }, "Bloodhound": {"81529001": ("Bloodhound", [7480])}, "BloodhoundSouthernHoundDogBreed": { "132374005": ("Bloodhound, Southern Hound dog breed", [7480]) }, "BloodhoundStHubertDogBreed": { "132373004": ("Bloodhound, St. Hubert dog breed", [7480]) }, "BloodyNippleDischarge": {"290113009": ("Bloody nipple discharge", [6055])}, "Blue": {"405738005": ("Blue", [4206, 4255, 4411, 8122])}, "BlueColor": {"405738005": ("Blue color (qualifier value)", [])}, "BlueGreenColor": {"405739002": ("Blue green color (qualifier value)", [])}, "BlueGreenOpticalFilter": {"422915004": ("Blue-green optical filter", [4204])}, "BlueOpticalFilter": {"445084008": ("Blue optical filter", [4204, 8124])}, "BlueOpticalFilterOfOpticalMicroscope": { "445084008": ("Blue optical filter of optical microscope (physical object)", []) }, "BlueShadeEosinStain": {"1346008": ("blue shade eosin stain", [8112])}, "BlueTickCoonhound": {"55959002": ("Blue tick coonhound (organism)", [])}, "BlueTickCoonhoundDogBreed": { "55959002": ("Blue tick coonhound dog breed", [7480]) }, "BluefacedLeicesterSheepBreed": { "131709004": ("Bluefaced Leicester sheep breed", [7480]) }, "Blunted": {"428247006": ("blunted", [3210, 3211])}, "BoXuPigBreed": {"133164005": ("Bo Xu pig breed", [7480])}, "BoarPowerPig": {"74899005": ("Boar power pig (organism)", [])}, "BoarPowerPig141": {"68512002": ("Boar power pig 141 (organism)", [])}, "BoarPowerPig141PigBreed": {"68512002": ("Boar power pig 141 pig breed", [7480])}, "BoarPowerPig161": {"74970001": ("Boar power pig 161 (organism)", [])}, "BoarPowerPig161PigBreed": {"74970001": ("Boar power pig 161 pig breed", [7480])}, "BoarPowerPig27": {"76364003": ("Boar power pig 27 (organism)", [])}, "BoarPowerPig27PigBreed": {"76364003": ("Boar power pig 27 pig breed", [7480])}, "BoarPowerPig282": {"87061000": ("Boar power pig 282 (organism)", [])}, "BoarPowerPig282PigBreed": {"87061000": ("Boar power pig 282 pig breed", [7480])}, "BoarPowerPig292": {"56084008": ("Boar power pig 292 (organism)", [])}, "BoarPowerPig292PigBreed": {"56084008": ("Boar power pig 292 pig breed", [7480])}, "BoarPowerPig414": {"24319000": ("Boar power pig 414 (organism)", [])}, "BoarPowerPig414PigBreed": {"24319000": ("Boar power pig 414 pig breed", [7480])}, "BoarPowerPig454": {"43500007": ("Boar power pig 454 (organism)", [])}, "BoarPowerPig454PigBreed": {"43500007": ("Boar power pig 454 pig breed", [7480])}, "BoarPowerPig474": {"84315000": ("Boar power pig 474 (organism)", [])}, "BoarPowerPig474PigBreed": {"84315000": ("Boar power pig 474 pig breed", [7480])}, "BoarPowerPig48": {"32297006": ("Boar power pig 48 (organism)", [])}, "BoarPowerPig48PigBreed": {"32297006": ("Boar power pig 48 pig breed", [7480])}, "BoarPowerPig545": {"61036003": ("Boar power pig 545 (organism)", [])}, "BoarPowerPig545PigBreed": {"61036003": ("Boar power pig 545 pig breed", [7480])}, "BoarPowerPig565": {"29223008": ("Boar power pig 565 (organism)", [])}, "BoarPowerPig565PigBreed": {"29223008": ("Boar power pig 565 pig breed", [7480])}, "BoarPowerPig59": {"53431006": ("Boar power pig 59 (organism)", [])}, "BoarPowerPig59PigBreed": {"53431006": ("Boar power pig 59 pig breed", [7480])}, "BoarPowerPig616": {"33212007": ("Boar power pig 616 (organism)", [])}, "BoarPowerPig616PigBreed": {"33212007": ("Boar power pig 616 pig breed", [7480])}, "BoarPowerPig656": {"48470006": ("Boar power pig 656 (organism)", [])}, "BoarPowerPig656PigBreed": {"48470006": ("Boar power pig 656 pig breed", [7480])}, "BoarPowerPig72": {"18212001": ("Boar power pig 72 (organism)", [])}, "BoarPowerPig72PigBreed": {"18212001": ("Boar power pig 72 pig breed", [7480])}, "BoarPowerPig747": {"84081007": ("Boar power pig 747 (organism)", [])}, "BoarPowerPig747PigBreed": {"84081007": ("Boar power pig 747 pig breed", [7480])}, "BoarPowerPig828": {"34595003": ("Boar power pig 828 (organism)", [])}, "BoarPowerPig828PigBreed": {"34595003": ("Boar power pig 828 pig breed", [7480])}, "BoarPowerPig84": {"30720007": ("Boar power pig 84 (organism)", [])}, "BoarPowerPig84PigBreed": {"30720007": ("Boar power pig 84 pig breed", [7480])}, "BoarPowerPig929": {"25856007": ("Boar power pig 929 (organism)", [])}, "BoarPowerPig929PigBreed": {"25856007": ("Boar power pig 929 pig breed", [7480])}, "BoarPowerPigBreed": {"74899005": ("Boar power pig breed", [7480])}, "Bodmin950PigBreed": {"132217009": ("Bodmin 950 pig breed", [7480])}, "BodyCavity": {"91806002": ("Body cavity", [7151, 7192, 9514])}, "BodyCavityStructure": {"91806002": ("Body cavity structure (body structure)", [])}, "BodyConduit": { "91830000": ("Body conduit", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "BodyFatObservable": {"248300009": ("Body fat observable (observable entity)", [])}, "BodyFluid": {"32457005": ("Body fluid", [7151, 7197])}, "BodyFluidSample": {"309051001": ("Body fluid sample", [8103])}, "BodyMassIndex": {"60621009": ("Body mass index (observable entity)", [])}, "BodyOfSternum": {"52509009": ("Body of sternum", [6115, 8134])}, "BodyOrganStructure": {"113343008": ("Body organ structure (body structure)", [])}, "BodyPartStructure": {"38866009": ("Body part structure (body structure)", [])}, "BodyReferencePointMarker": {"706484002": ("Body reference point marker", [7110])}, "BodyStructure": {"123037004": ("Body structure (body structure)", [])}, "BodySubstance": {"91720002": ("Body Substance", [7150, 9502, 9580])}, "BodySubstanceSample": {"309050000": ("Body substance sample", [8103])}, "BodySurfacePoint": {"183973000": ("Body surface point", [7110])}, "BodyTissueStructure": {"85756007": ("Body tissue structure (body structure)", [])}, "BoerGoatBreed": {"131656006": ("Boer goat breed", [7480])}, "BoerboelDogBreed": {"416840006": ("Boerboel dog breed", [7480])}, "BolivianPigBreed": {"132168001": ("Bolivian pig breed", [7480])}, "BologneseDogBreed": {"132560004": ("Bolognese dog breed", [7480])}, "BombayCat": {"16528000": ("Bombay cat", [7480])}, "BondSheepBreed": {"131710009": ("Bond sheep breed", [7480])}, "Bone": {"272673000": ("Bone", [6202, 6204, 8134])}, "BoneFormationFunction": { "83323007": ("Bone formation, function (observable entity)", []) }, "BoneMarrow": {"14016003": ("Bone Marrow", [644, 8134, 10044, 10060])}, "BoneMarrowStructure": {"14016003": ("Bone marrow structure (body structure)", [])}, "BoneMarrowTransplant": {"23719005": ("Bone marrow transplant", [6083, 6085])}, "BoneMatrix": {"45001002": ("Bone matrix", [6211])}, "BoneNail": {"63289001": ("Bone Nail", [7307, 7309])}, "BoneOfLowerLimb": { "72001000": ( "Bone of lower limb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "BoneOfThorax": {"272710004": ("Bone of thorax", [7151, 7155, 7192, 8134, 9514])}, "BoneOfUpperLimb": { "371195002": ( "Bone of upper limb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "BonePin": {"77444004": ("Bone Pin", [7151, 7157, 7193])}, "BonePinDevice": {"77444004": ("Bone pin, device (physical object)", [])}, "BonePlate": {"271003": ("Bone Plate", [7307, 7309])}, "BonePlateDevice": {"271003": ("Bone plate, device (physical object)", [])}, "BoneScrew": {"68183006": ("Bone Screw", [7151, 7157, 7193])}, "BoneScrewDevice": {"68183006": ("Bone screw, device (physical object)", [])}, "BoneStructure": {"272673000": ("Bone structure (body structure)", [])}, "BoneStructureOfAcetabulum": { "37783008": ("Bone structure of acetabulum (body structure)", []) }, "BoneStructureOfAtlas": { "14806007": ("Bone structure of atlas (body structure)", []) }, "BoneStructureOfAxis": { "39976000": ("Bone structure of axis (body structure)", []) }, "BoneStructureOfC3": {"113205007": ("Bone structure of C3 (body structure)", [])}, "BoneStructureOfC4": {"5329002": ("Bone structure of C4 (body structure)", [])}, "BoneStructureOfC5": {"36978003": ("Bone structure of C5 (body structure)", [])}, "BoneStructureOfC6": {"36054005": ("Bone structure of C6 (body structure)", [])}, "BoneStructureOfC7": {"87391001": ("Bone structure of C7 (body structure)", [])}, "BoneStructureOfCalcaneum": { "80144004": ("Bone structure of calcaneum (body structure)", []) }, "BoneStructureOfClavicle": { "51299004": ("Bone structure of clavicle (body structure)", []) }, "BoneStructureOfCoccyx": { "64688005": ("Bone structure of coccyx (body structure)", []) }, "BoneStructureOfCranium": { "89546000": ("Bone structure of cranium (body structure)", []) }, "BoneStructureOfDistalFemur": { "310652005": ("Bone structure of distal femur (body structure)", []) }, "BoneStructureOfDistalHumerus": { "118495001": ("Bone structure of distal humerus (body structure)", []) }, "BoneStructureOfDistalRadius": { "75129005": ("Bone structure of distal radius (body structure)", []) }, "BoneStructureOfDistalTibia": { "64605006": ("Bone structure of distal tibia (body structure)", []) }, "BoneStructureOfDistalUlna": { "91238003": ("Bone structure of distal ulna (body structure)", []) }, "BoneStructureOfFace": { "91397008": ("Bone structure of face (body structure)", []) }, "BoneStructureOfFemur": { "71341001": ("Bone structure of femur (body structure)", []) }, "BoneStructureOfFibula": { "87342007": ("Bone structure of fibula (body structure)", []) }, "BoneStructureOfHand": { "24097009": ("Bone structure of hand (body structure)", []) }, "BoneStructureOfHeadAndOrNeck": { "312779009": ( "Bone structure of head and/or neck", [4028, 7151, 7192, 8134, 9514], ) }, "BoneStructureOfHumerus": { "85050009": ("Bone structure of humerus (body structure)", []) }, "BoneStructureOfIlium": { "22356005": ("Bone structure of ilium (body structure)", []) }, "BoneStructureOfIschium": { "85710004": ("Bone structure of ischium (body structure)", []) }, "BoneStructureOfL1": {"66794005": ("Bone structure of L1 (body structure)", [])}, "BoneStructureOfL2": {"14293000": ("Bone structure of L2 (body structure)", [])}, "BoneStructureOfL3": {"36470004": ("Bone structure of L3 (body structure)", [])}, "BoneStructureOfL4": {"11994002": ("Bone structure of L4 (body structure)", [])}, "BoneStructureOfL5": {"49668003": ("Bone structure of L5 (body structure)", [])}, "BoneStructureOfLowerLimb": { "72001000": ("Bone structure of lower limb (body structure)", []) }, "BoneStructureOfMandible": { "91609006": ("Bone structure of mandible (body structure)", []) }, "BoneStructureOfManubrium": { "37285002": ("Bone structure of manubrium (body structure)", []) }, "BoneStructureOfMaxilla": { "70925003": ("Bone structure of maxilla (body structure)", []) }, "BoneStructureOfMetacarpal": { "36455000": ("Bone structure of metacarpal (body structure)", []) }, "BoneStructureOfNavicular": { "75772009": ("Bone structure of navicular (body structure)", []) }, "BoneStructureOfPatella": { "64234005": ("Bone structure of patella (body structure)", []) }, "BoneStructureOfPelvis": {"118645006": ("Pelvis", [7304, 8134])}, "BoneStructureOfProximalFemur": { "310651003": ("Bone structure of proximal femur (body structure)", []) }, "BoneStructureOfProximalHumerus": { "119524001": ("Bone structure of proximal humerus (body structure)", []) }, "BoneStructureOfProximalRadius": { "12881000": ("Bone structure of proximal radius (body structure)", []) }, "BoneStructureOfProximalUlna": { "34318004": ("Bone structure of proximal ulna (body structure)", []) }, "BoneStructureOfRib": {"113197003": ("Bone structure of rib (body structure)", [])}, "BoneStructureOfSacrum": { "54735007": ("Bone structure of sacrum (body structure)", []) }, "BoneStructureOfScaphoid": { "30518006": ("Bone structure of scaphoid (body structure)", []) }, "BoneStructureOfScapula": { "79601000": ("Bone structure of scapula (body structure)", []) }, "BoneStructureOfShaftOfFemur": { "41111004": ("Bone structure of shaft of femur (body structure)", []) }, "BoneStructureOfShaftOfHumerus": { "20760004": ("Bone structure of shaft of humerus (body structure)", []) }, "BoneStructureOfShaftOfRadius": { "47728000": ("Bone structure of shaft of radius (body structure)", []) }, "BoneStructureOfShaftOfTibia": { "52687003": ("Bone structure of shaft of tibia (body structure)", []) }, "BoneStructureOfShaftOfUlna": { "21133008": ("Bone structure of shaft of ulna (body structure)", []) }, "BoneStructureOfSpine": { "51282000": ("Bone structure of spine (body structure)", []) }, "BoneStructureOfSternum": { "56873002": ("Bone structure of sternum (body structure)", []) }, "BoneStructureOfT1": {"64864005": ("Bone structure of T1 (body structure)", [])}, "BoneStructureOfT10": {"7610001": ("Bone structure of T10 (body structure)", [])}, "BoneStructureOfT11": {"12989004": ("Bone structure of T11 (body structure)", [])}, "BoneStructureOfT12": {"23215003": ("Bone structure of T12 (body structure)", [])}, "BoneStructureOfT2": {"53733008": ("Bone structure of T2 (body structure)", [])}, "BoneStructureOfT3": {"1626008": ("Bone structure of T3 (body structure)", [])}, "BoneStructureOfT4": {"73071006": ("Bone structure of T4 (body structure)", [])}, "BoneStructureOfT5": {"56401006": ("Bone structure of T5 (body structure)", [])}, "BoneStructureOfT6": {"45296009": ("Bone structure of T6 (body structure)", [])}, "BoneStructureOfT7": {"62487009": ("Bone structure of T7 (body structure)", [])}, "BoneStructureOfT8": {"11068009": ("Bone structure of T8 (body structure)", [])}, "BoneStructureOfT9": {"82687006": ("Bone structure of T9 (body structure)", [])}, "BoneStructureOfTalus": { "67453005": ("Bone structure of talus (body structure)", []) }, "BoneStructureOfTarsus": { "108371006": ("Bone structure of tarsus (body structure)", []) }, "BoneStructureOfThorax": { "272710004": ("Bone structure of thorax (body structure)", []) }, "BoneStructureOfTibia": { "12611008": ("Bone structure of tibia (body structure)", []) }, "BoneStructureOfUlna": { "23416004": ("Bone structure of ulna (body structure)", []) }, "BoneStructureOfUpperLimb": { "371195002": ("Bone structure of upper limb (body structure)", []) }, "BoneSurface": {"425647002": ("Bone Surface", [10044, 10060])}, "BoneTissue": {"3138006": ("Bone", [645, 7151, 7166, 7191, 8134])}, "BonsmaraCattleBreed": {"131431008": ("Bonsmara cattle breed", [7480])}, "BonyMetastasis": {"94222008": ("Bony metastasis", [6347])}, "BooroolaMerinoSheepBreed": {"132735001": ("Booroola Merino sheep breed", [7480])}, "BootedGoatBreed": {"131648008": ("Booted goat breed", [7480])}, "BoranCattleBreed": {"133599002": ("Boran cattle breed", [7480])}, "BordeauxDogBreed": {"132389001": ("Bordeaux Dog breed", [7480])}, "BorderCollieDogBreed": {"132561000": ("Border Collie dog breed", [7480])}, "BorderLeicesterSheepBreed": { "131711008": ("Border Leicester sheep breed", [7480]) }, "BorderTerrier": {"69529009": ("Border terrier", [7480])}, "BorderlineNormalECG": {"251135002": ("Borderline Normal ECG", [3677])}, "BorderlineNormalElectrocardiogram": { "251135002": ("Borderline normal electrocardiogram (finding)", []) }, "BoreraySheepBreed": {"131712001": ("Boreray sheep breed", [7480])}, "BorghigianaPigBreed": {"132178003": ("Borghigiana pig breed", [7480])}, "BorgouCattleBreed": {"133765003": ("Borgou cattle breed (organism)", [])}, "BorgouXZebuCattleBreed": {"133765003": ("Borgou X zebu cattle breed", [7480])}, "BorneoZebuCattleBreed": {"133642002": ("Borneo Zebu cattle breed", [7480])}, "BorzoiDog": {"112492008": ("Borzoi dog", [7480])}, "Bos": {"388168008": ("Bos", [7454])}, "BosTaurus": {"34618005": ("Bos taurus", [7454])}, "BosTaurusIndicus": {"125091004": ("Bos taurus indicus (organism)", [])}, "BosTaurusIndicusCowBreed": {"125091004": ("Bos taurus indicus cow breed", [7480])}, "BosTaurusTaurusSubspeciesDomesticEuropeanCattle": { "385474004": ( "Bos taurus taurus subspecies domestic European cattle (organism)", [], ) }, "BosTaurusTaurusSubspeciesDomesticEuropeanCowBreed": { "385474004": ( "Bos taurus taurus subspecies domestic European cow breed", [7480], ) }, "BosTaurusXBisonBisonHybridCowBreed": { "425181009": ("Bos taurus X Bison bison hybrid cow breed", [7480]) }, "BosnianHorseBreed": {"131882000": ("Bosnian horse breed", [7480])}, "BosnianHoundDogBreed": {"132573000": ("Bosnian Hound dog breed", [7480])}, "BostonTerrier": {"79295007": ("Boston terrier", [7480])}, "BothBreasts": {"63762007": ("Both breasts", [6022, 6023])}, "BothEyes": {"40638003": ("Both eyes", [4209, 8134])}, "Bottle": {"68276009": ("Bottle", [68, 69])}, "BottleDevice": {"68276009": ("Bottle, device (physical object)", [])}, "BouinFluid": {"433474002": ("Bouin's fluid", [8114])}, "BoulonnaisHorseBreed": {"131883005": ("Boulonnais horse breed", [7480])}, "BoundedBy": {"75958009": ("Bounded by", [219])}, "BouvierDesFlandres": {"66712005": ("Bouvier des Flandres", [7480])}, "Bovinae": {"107007004": ("Bovinae", [7454])}, "BovineSpecies": {"79058000": ("Bovine species (organism)", [])}, "BovskaSheepBreed": {"131713006": ("Bovska sheep breed", [7480])}, "BoxerDog": {"42250008": ("Boxer dog", [7480])}, "BoydPerforatingVein": { "128548003": ( "Boyd's perforating vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "BoykinSpanielDogBreed": {"132580003": ("Boykin Spaniel dog breed", [7480])}, "BraMaineCattleBreed": {"133768001": ("Bra-Maine cattle breed (organism)", [])}, "BraMaineXZebuCattleBreed": { "133768001": ("Bra-Maine X zebu cattle breed", [7480]) }, "BraSwissCattleBreed": {"133779006": ("Bra-Swiss cattle breed (organism)", [])}, "BraSwissXZebuCattleBreed": { "133779006": ("Bra-Swiss X zebu cattle breed", [7480]) }, "BrabantHorse": {"406711007": ("Brabant horse (organism)", [])}, "BrabantHorseBreed": {"406711007": ("Brabant horse breed", [7480])}, "BraccoItalianoDogBreed": {"132562007": ("Bracco Italiano dog breed", [7480])}, "BrachialArtery": { "17137000": ( "Brachial artery", [ 4, 3010, 3440, 3604, 3606, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12107, ], ) }, "BrachialPlexus": {"36582005": ("Brachial plexus", [8134])}, "BrachialPlexusStructure": { "36582005": ("Brachial plexus structure (body structure)", []) }, "BrachialVein": { "20115005": ( "Brachial vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "BrachiocephalicTrunk": { "12691009": ("brachiocephalic trunk", [3604, 3606, 3630, 6102, 6109, 6117]) }, "BrachiocephalicVein": {"8887007": ("Brachiocephalic vein", [6102, 6109, 6117])}, "Brachytherapy": {"384692006": ("Brachytherapy", [6051, 6327])}, "BrachytherapyDevice": {"228748004": ("Brachytherapy Device", [3411, 3429])}, "BrachytherapyImplant": { "228748004": ("Brachytherapy implant (physical object)", []) }, "BrafordCattleBreed": {"133716008": ("Braford cattle breed (organism)", [])}, "BrafordXZebuCattleBreed": {"133716008": ("Braford X zebu cattle breed", [7480])}, "BragadoDoSorraiaCattleBreed": { "133327008": ("Bragado do Sorraia cattle breed", [7480]) }, "BragancaCattleBreed": {"133328003": ("Braganca cattle breed", [7480])}, "BrahmaCattleBreed": {"30384003": ("Brahma cattle breed (organism)", [])}, "BrahmaCowBreed": {"30384003": ("Brahma cow breed", [7480])}, "BrahmousinCattleBreed": {"133717004": ("Brahmousin cattle breed (organism)", [])}, "BrahmousinXZebuCattleBreed": { "133717004": ("Brahmousin X zebu cattle breed", [7480]) }, "BrahornCattleBreed": {"133766002": ("Brahorn cattle breed (organism)", [])}, "BrahornXZebuCattleBreed": {"133766002": ("Brahorn X zebu cattle breed", [7480])}, "Brain": { "12738006": ( "Brain", [4, 644, 645, 4030, 7151, 7153, 7192, 8134, 9514, 10044, 10060], ) }, "BrainCerebrospinalFluidPathway": { "280371009": ( "Brain cerebrospinal fluid pathway", [7151, 7153, 7192, 8134, 9514], ) }, "BrainStem": {"119238007": ("Brain Stem", [7140, 7151, 7153, 7192, 8134, 9514])}, "BrainStemPart": {"119238007": ("Brain stem part (body structure)", [])}, "BrainStructure": {"12738006": ("Brain structure (body structure)", [])}, "BrainVentricle": {"35764002": ("Brain ventricle", [7151, 7153, 7192, 8134, 9514])}, "BrainVentricleStructure": { "35764002": ("Brain ventricle structure (body structure)", []) }, "BralersCattleBreed": {"133767006": ("Bralers cattle breed (organism)", [])}, "BralersXZebuCattleBreed": {"133767006": ("Bralers X zebu cattle breed", [7480])}, "BrandenburgHorseBreed": {"131884004": ("Brandenburg horse breed", [7480])}, "BrandlbrackeDogBreed": {"132376007": ("Brandlbracke dog breed", [7480])}, "BrandroodLjsselveeCattleBreed": { "133329006": ("Brandrood ljsselvee cattle breed", [7480]) }, "BraqueBelgeDogBreed": {"132384006": ("Braque Belge dog breed", [7480])}, "BraqueDAriégeDogBreed": {"132377003": ("Braque d'Ariége dog breed", [7480])}, "BraqueDAuvergneDogBreed": {"132569003": ("Braque d'Auvergne dog breed", [7480])}, "BraqueDuBourbonnaisDogBreed": { "132564008": ("Braque du Bourbonnais dog breed", [7480]) }, "BraqueDupuyDogBreed": {"132415003": ("Braque Dupuy dog breed", [7480])}, "BraqueFrancaisDeGrandTailleDogBreed": { "132559009": ("Braque Francais de Grand Taille dog breed (organism)", []) }, "BraqueFrancaisDePetiteTailleDogBreed": { "132565009": ("Braque Francais de Petite Taille dog breed", [7480]) }, "BraqueFrançaisDeGrandTailleDogBreed": { "132559009": ("Braque Français de Grand Taille dog breed", [7480]) }, "BraqueSaintGermainDogBreed": { "132566005": ("Braque Saint-Germain dog breed", [7480]) }, "BraunesBergschafSheepBreed": { "131714000": ("Braunes Bergschaf sheep breed", [7480]) }, "BraunviehCattleBreed": {"131578006": ("Braunvieh cattle breed", [7480])}, "BraviaGoatBreed": {"131683007": ("Bravia goat breed", [7480])}, "BravonCattleBreed": {"133780009": ("Bravon cattle breed (organism)", [])}, "BravonXZebuCattleBreed": {"133780009": ("Bravon X zebu cattle breed", [7480])}, "BrazilianDairyHybridCattle": { "133781008": ("Brazilian Dairy hybrid cattle (organism)", []) }, "BrazilianDairyHybridXZebuCattleBreed": { "133781008": ("Brazilian Dairy Hybrid X zebu cattle breed", [7480]) }, "BrazilianPolledCattleBreed": { "133330001": ("Brazilian Polled cattle breed", [7480]) }, "BrazilianShorthairCatBreed": { "132662004": ("Brazilian Shorthair cat breed", [7480]) }, "BrazilianSomaliSheepBreed": { "131715004": ("Brazilian Somali sheep breed", [7480]) }, "BrazilianSportHorseHorseBreed": { "131885003": ("Brazilian Sport Horse horse breed", [7480]) }, "BrazilinStain": {"41750006": ("brazilin stain", [8112])}, "Breast": { "76752008": ( "Breast", [ 4, 645, 4009, 4013, 4030, 4031, 4042, 7151, 7192, 8134, 9514, 10044, 10060, 12321, ], ) }, "BreastComposition": { "129715009": ("Breast composition", [6014, 6015, 6016, 6052, 6053, 6054, 6056]) }, "BreastCompositionAnalysis": {"133890006": ("Breast composition analysis", [6043])}, "BreastDuctSample": {"309548003": ("breast duct sample", [8103, 8104])}, "BreastHematoma": {"302924003": ("Breast hematoma", [6056])}, "BreastImplantTypeNotSpecified": { "2282003": ("Breast implant, type not specified", [6058, 6059]) }, "BreastImplantation": {"119853006": ("Breast implantation (procedure)", [])}, "BreastLobularHyperplasia": { "6703006": ("Breast lobular hyperplasia", [6030, 6031]) }, "BreastLobuleHyperplasia": { "6703006": ("Breast lobule hyperplasia (disorder)", []) }, "BreastLump": {"89164003": ("Breast lump", [6055])}, "BreastNormal": {"290084006": ("Breast normal", [6054])}, "BreastPain": {"53430007": ("Breast pain", [6055])}, "BreastProsthesisDevice": { "2282003": ("Breast prosthesis, device (physical object)", []) }, "BreastProsthesisInsertion": { "302343007": ("Breast prosthesis insertion", [6083, 6084]) }, "BreastReconstruction": {"33496007": ("Breast reconstruction", [6083, 6084])}, "BreastSize": {"248808008": ("Breast size (observable entity)", [])}, "BreastStructure": {"76752008": ("Breast structure (body structure)", [])}, "BreastSurgery": {"309968000": ("Breast Surgery", [7030])}, "BreastSurgeryDepartment": { "309968000": ("Breast surgery department (environment)", []) }, "BreastSurgicalBiopsy": {"274331003": ("Breast - surgical biopsy", [6050, 6083])}, "BreastTruCutBiopsySample": { "309058007": ("breast tru-cut biopsy sample", [8103, 8104]) }, "BrecknockHillCheviotSheepBreed": { "131702008": ("Brecknock Hill Cheviot sheep breed", [7480]) }, "BreechVersionObstetricalVersion": { "65240009": ("Breech Version [Obstetrical Version]", [9]) }, "BreitovPigBreed": {"132108004": ("Breitov pig breed", [7480])}, "BretonBlackPiedCattleBreed": { "133331002": ("Breton Black Pied cattle breed", [7480]) }, "BretonHorseBreed": {"133142001": ("Breton horse breed", [7480])}, "BrewertonProjection": {"260492003": ("Brewerton projection", [4012])}, "BriardDog": {"10369004": ("Briard dog", [7480])}, "BrightnessAcuityTestingVisualAcuity": { "425141002": ("Brightness Acuity Testing Visual Acuity", [4216]) }, "BrillenschafSheepBreed": {"131701001": ("Brillenschaf sheep breed", [7480])}, "BrilliantCresylBlueStain": {"8342001": ("brilliant cresyl blue stain", [8112])}, "BrilliantCroceinStain": {"86541009": ("brilliant crocein stain", [8112])}, "BrilliantOrangeStain": {"8429000": ("brilliant orange stain", [8112])}, "BrilliantYellowStain": {"57753006": ("brilliant yellow stain", [8112])}, "BriquetBassetGriffonVendeenDogBreed": { "132567001": ("Briquet Basset Griffon Vendeen dog breed", [7480]) }, "BriquetBassetGriffonVendéenDogBreed": { "132567001": ("Briquet Basset Griffon Vendéen dog breed (organism)", []) }, "BritishAlpineGoatBreed": {"131654009": ("British Alpine goat breed", [7480])}, "BritishAppaloosaHorseBreed": { "131886002": ("British Appaloosa horse breed", [7480]) }, "BritishBlueCatBreed": {"132656009": ("British Blue cat breed", [7480])}, "BritishLandracePig": {"78994007": ("British landrace pig (organism)", [])}, "BritishLandracePigBreed": {"78994007": ("British landrace pig breed", [7480])}, "BritishLopPig": {"22506004": ("British lop pig (organism)", [])}, "BritishLopPigBreed": {"22506004": ("British lop pig breed", [7480])}, "BritishMilkSheepBreed": {"131700000": ("British Milk Sheep breed", [7480])}, "BritishRidingPonyHorseBreed": { "131887006": ("British Riding Pony horse breed", [7480]) }, "BritishSaanenGoatBreed": {"131678004": ("British Saanen goat breed", [7480])}, "BritishSaddlebackPig": {"15961007": ("British saddleback pig (organism)", [])}, "BritishSaddlebackPigBreed": {"15961007": ("British saddleback pig breed", [7480])}, "BritishShorthairedCat": {"70653001": ("British shorthaired cat", [7480])}, "BritishSpottedPonyHorseBreed": { "131888001": ("British Spotted Pony horse breed", [7480]) }, "BritishToggenburgGoatBreed": { "131679007": ("British Toggenburg goat breed", [7480]) }, "BritishWarmbloodHorseBreed": { "132732003": ("British Warmblood horse breed", [7480]) }, "BritishWhiteCattleBreed": {"131579003": ("British White cattle breed", [7480])}, "BrittanySpaniel": {"12091005": ("Brittany spaniel (organism)", [])}, "BrittanySpanielDogBreed": {"12091005": ("Brittany spaniel dog breed", [7480])}, "BroadLigament": {"34411009": ("Broad ligament", [4, 7151, 7192, 8134, 9514])}, "BroadLigamentStructure": { "34411009": ("Broad ligament structure (body structure)", []) }, "BroadTangentialDirectIllumination": { "410463003": ("Broad tangential direct illumination", [4203]) }, "BroadTangentialDirectIlluminationAction": { "410463003": ( "Broad tangential direct illumination - action (qualifier value)", [], ) }, "Broden": {"399344001": ("Broden", [4012])}, "BrodenProjection": {"399344001": ("Broden projection (qualifier value)", [])}, "Bronchial": {"955009": ("Bronchial", [6129, 8134])}, "BronchialArtery": { "64468002": ("Bronchial artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514]) }, "BronchialStructure": {"955009": ("Bronchial structure (body structure)", [])}, "Bronchial_Inactive": {"261061003": ("Bronchial (qualifier value)", [])}, "Bronchodilator": {"372580007": ("Bronchodilator", [621, 622])}, "BronchopulmonarySegmentStructure": { "72674008": ("Bronchopulmonary segment structure (body structure)", []) }, "Bronchospasm": {"4386001": ("Bronchospasm", [60, 9300])}, "Bronchus": { "955009": ( "Bronchus", [4, 4009, 4030, 4031, 4040, 4042, 6102, 6109, 6111, 7151, 7155, 7192, 9514], ) }, "BroselowLutenBlueZone1923kg": { "444474005": ("Broselow Luten Blue Zone (19-23 kg)", [7039, 7040]) }, "BroselowLutenGreenZone3036kg": { "444503000": ("Broselow Luten Green Zone (30-36 kg)", [7039, 7040]) }, "BroselowLutenOrangeZone2429kg": { "444496004": ("Broselow Luten Orange Zone (24-29 kg)", [7039, 7040]) }, "BroselowLutenPediatricWeightEstimationBlueZone": { "444474005": ( "Broselow Luten pediatric weight estimation blue zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationGreenZone": { "444503000": ( "Broselow Luten pediatric weight estimation green zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationOrangeZone": { "444496004": ( "Broselow Luten pediatric weight estimation orange zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationPinkZone": { "444488009": ( "Broselow Luten pediatric weight estimation pink zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationPurpleZone": { "444489001": ( "Broselow Luten pediatric weight estimation purple zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationRedZone": { "444471002": ( "Broselow Luten pediatric weight estimation red zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationWhiteZone": { "444504006": ( "Broselow Luten pediatric weight estimation white zone (finding)", [], ) }, "BroselowLutenPediatricWeightEstimationYellowZone": { "444505007": ( "Broselow Luten pediatric weight estimation yellow zone (finding)", [], ) }, "BroselowLutenPinkZone67kg": { "444488009": ("Broselow Luten Pink Zone (6-7 kg)", [7039, 7040]) }, "BroselowLutenPurpleZone1011kg": { "444489001": ("Broselow Luten Purple Zone (10-11 kg)", [7039, 7040]) }, "BroselowLutenRedZone89kg": { "444471002": ("Broselow Luten Red Zone (8-9 kg)", [7039, 7040]) }, "BroselowLutenWhiteZone1518kg": { "444504006": ("Broselow Luten White Zone (15-18 kg)", [7039, 7040]) }, "BroselowLutenYellowZone1214kg": { "444505007": ("Broselow Luten Yellow Zone (12-14 kg)", [7039, 7040]) }, "Brown": {"371254008": ("Brown", [4411])}, "BrownAtlasCattleBreed": {"133332009": ("Brown Atlas cattle breed", [7480])}, "BrownColor": {"371254008": ("Brown color", [6067])}, "BrownSwissCattleBreed": {"44230005": ("Brown Swiss cattle breed (organism)", [])}, "BrownSwissCowBreed": {"44230005": ("Brown Swiss cow breed", [7480])}, "BrownWelshCattleBreed": {"944009": ("Brown Welsh cattle breed (organism)", [])}, "BrownWelshCowBreed": {"944009": ("Brown Welsh cow breed", [7480])}, "BruceProtocol": {"129095002": ("Bruce protocol", [3261, 12001])}, "BrunoDeJuraDogBreed": {"132416002": ("Bruno de Jura dog breed", [7480])}, "BuccalMucosa": {"16811007": ("buccal mucosa", [7601, 8134])}, "BuccinatorLymphNode": {"143925009": ("buccinator lymph node", [7600, 8134])}, "BudyonnyHorseBreed": {"133130006": ("Budyonny horse breed", [7480])}, "BulboventricularForamen": {"443329006": ("Bulboventricular Foramen", [12286])}, "BulgarianBrownCattleBreed": { "133333004": ("Bulgarian Brown cattle breed", [7480]) }, "BulgarianLandracePigBreed": { "133192000": ("Bulgarian Landrace pig breed", [7480]) }, "BulgarianNativePigBreed": {"132365008": ("Bulgarian Native pig breed", [7480])}, "BulgarianRedCattleBreed": {"133334005": ("Bulgarian Red cattle breed", [7480])}, "BulgarianWhitePigBreed": {"133191007": ("Bulgarian White pig breed", [7480])}, "BullTerrier": {"23995009": ("Bull terrier", [7480])}, "Bulldog": {"38184008": ("Bulldog", [7480])}, "Bullet": { "86122002": ("Bullet", [6040, 6102, 6138, 6202, 6203, 6401, 6404, 7151, 7193]) }, "BulletDevice": {"86122002": ("Bullet, device (physical object)", [])}, "Bullmastiff": {"71175006": ("Bullmastiff", [7480])}, "Bunamiodyl": {"90745007": ("Bunamiodyl", [12, 3850])}, "BuohaiHorseBreed": {"131889009": ("Buohai horse breed", [7480])}, "Bupivacaine": {"387150008": ("Bupivacaine", [623, 630])}, "BurlinaCattleBreed": {"133335006": ("Burlina cattle breed", [7480])}, "Burman": {"422861003": ("Burman", [4012])}, "BurmanProjection": {"422861003": ("Burman projection (qualifier value)", [])}, "BurmeseCat": {"89065000": ("Burmese cat", [7480])}, "BurmeseCattleBreed": {"133782001": ("Burmese cattle breed (organism)", [])}, "BurmesePigBreed": {"133166007": ("Burmese pig breed", [7480])}, "BurmeseXZebuCattleBreed": {"133782001": ("Burmese X zebu cattle breed", [7480])}, "BurnsIntensiveCare": {"426439001": ("Burns Intensive Care", [7030])}, "BurnsIntensiveCareUnit": { "426439001": ("Burns intensive care unit (environment)", []) }, "BurwashCattleBreed": {"133336007": ("Burwash cattle breed", [7480])}, "BuryatHorseBreed": {"131890000": ("Buryat horse breed", [7480])}, "BusaCattleBreed": {"133577005": ("Busa cattle breed", [7480])}, "BushuevCattleBreed": {"133783006": ("Bushuev cattle breed (organism)", [])}, "BushuevXZebuCattleBreed": {"133783006": ("Bushuev X zebu cattle breed", [7480])}, "Butabarbital": {"372901004": ("Butabarbital", [623, 625])}, "ButanaCattleBreed": {"133643007": ("Butana cattle breed", [7480])}, "ButanolO15": {"422540000": ("Butanol O^15^", [4021])}, "Buttock": {"46862004": ("Buttock", [4, 7151, 7192, 8134, 9514])}, "ButtockStructure": {"46862004": ("Buttock structure (body structure)", [])}, "ButyrateEsteraseStain": {"406955006": ("butyrate esterase stain", [8112])}, "ByInhalation": {"446406008": ("By inhalation", [11, 613, 614])}, "ByelorussianHarnessHorseBreed": { "133129001": ("Byelorussian Harness horse breed", [7480]) }, "ByelorussianRedCattleBreed": { "133337003": ("Byelorussian Red cattle breed", [7480]) }, "ByelorussianSyntheticCattleBreed": { "133338008": ("Byelorussian Synthetic cattle breed", [7480]) }, "BypassGraftAngiography": {"252427007": ("Bypass graft angiography", [3405, 3428])}, "BündnerGoatBreed": {"131680005": ("Bündner goat breed", [7480])}, "BündnerOberlandSheepBreed": { "131699001": ("Bündner Oberland sheep breed", [7480]) }, "C1Vertebra": { "14806007": ( "C1 vertebra", [1000, 1001, 1003, 7151, 7192, 7602, 7603, 8134, 9514], ) }, "C2C3Disc": {"1078209008": ("C2/C3 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "C2Vertebra": {"39976000": ("C2 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "C3C4Disc": {"58820006": ("C3/C4 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "C3Vertebra": {"113205007": ("C3 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "C4C5Disc": {"49400002": ("C4/C5 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "C4Vertebra": {"5329002": ("C4 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "C5C6Disc": {"73959003": ("C5/C6 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "C5Vertebra": {"36978003": ("C5 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "C6C7Disc": {"75095006": ("C6/C7 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "C6Vertebra": {"36054005": ("C6 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "C7T1Disc": {"37414007": ("C7/T1 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "C7Vertebra": {"87391001": ("C7 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "COOPELSO93CattleBreed": {"133359001": ("COOPELSO 93 cattle breed", [7480])}, "CPFPig": {"24840008": ("CPF pig (organism)", [])}, "CPFPigBreed": {"24840008": ("CPF pig breed", [7480])}, "CTAngiographyOfCoronaryArteries": { "419545005": ("CT angiography of coronary arteries", [3757]) }, "CTArteriographyOfAbdominalAortaWithContrast": { "444968003": ("CT arteriography of abdominal aorta with contrast", [3820]) }, "CTOfAbdominalAorta": {"241553009": ("CT of abdominal aorta", [3820])}, "CTOfAbdominalAortaWithoutContrast": { "1187246003": ("CT of abdominal aorta without contrast", [3820]) }, "CTOfBreast": {"241539009": ("CT of breast", [6050, 6083])}, "CTV": {"228792002": ("CTV", [9534])}, "CTWithoutContrast": {"399331006": ("CT without contrast", [10014])}, "CabanninaCattleBreed": {"133339000": ("Cabannina cattle breed", [7480])}, "CachenaCattleBreed": {"131580000": ("Cachena cattle breed", [7480])}, "Cachexia": {"238108007": ("Cachexia", [3205])}, "Caffeine": {"255641001": ("Caffeine", [6089])}, "Cahoon": {"399278009": ("Cahoon", [4012])}, "CahoonProjection": {"399278009": ("Cahoon projection (qualifier value)", [])}, "CairnTerrier": {"87111007": ("Cairn terrier", [7480])}, "CaiuaCattleBreed": {"133784000": ("Caiua cattle breed (organism)", [])}, "CaiuaXZebuCattleBreed": {"133784000": ("Caiua X zebu cattle breed", [7480])}, "CalabrianCattleBreed": {"131457006": ("Calabrian cattle breed", [7480])}, "CalabrianHorseBreed": {"131891001": ("Calabrian horse breed", [7480])}, "CalabrianPigBreed": {"132096005": ("Calabrian pig breed", [7480])}, "CalascibettaPigBreed": {"132099003": ("Calascibetta pig breed", [7480])}, "CalasparrenaCattleBreed": {"133593001": ("Calasparrena cattle breed", [7480])}, "CalcanealTubercle": {"82474009": ("Calcaneal tubercle", [7482, 7483, 8134])}, "CalcanealTubercleStructure": { "82474009": ("Calcaneal tubercle structure (body structure)", []) }, "Calcaneus": { "80144004": ( "Calcaneus", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "CalcificationCluster": { "129769006": ("Calcification Cluster", [6014, 6015, 6016, 6054, 6056]) }, "CalcificationOfBreast": {"309587003": ("Calcification of breast", [6054])}, "Calcified": {"237897009": ("Calcified", [3712])}, "CalcifiedAneurysm": {"125273000": ("calcified aneurysm", [3808])}, "CalcifiedAtheromatousPlaque": { "29483008": ("calcified atheromatous plaque", [3817]) }, "CalcifiedHeartValve": {"373136005": ("Calcified Heart Valve", [3711])}, "CalcifiedSkinOfBreast": {"129757003": ("Calcified skin of breast", [6010, 6011])}, "CalcifiedSutureMaterial": { "129758008": ("Calcified suture material", [6010, 6011]) }, "Calcium": {"5540006": ("Calcium", [300, 621, 622])}, "CalciumChannelBlocker": {"373304005": ("Calcium channel blocker", [621, 622])}, "CalciumChannelBlockerContainingProduct": { "48698004": ("Calcium channel blocker", [3760]) }, "CalciumHydroxyapatite": {"256579008": ("Calcium Hydroxyapatite", [300])}, "Calculated": {"258090004": ("Calculated", [3627, 3745, 10009])}, "CaldeanoCattleBreed": {"133340003": ("Caldeano cattle breed", [7480])}, "CaldelanaCattleBreed": {"133341004": ("Caldelana cattle breed", [7480])}, "Caldwell": {"399358004": ("Caldwell", [4012])}, "CaldwellProjection": {"399358004": ("Caldwell projection (qualifier value)", [])}, "CaliforniaRedSheepBreed": {"131795000": ("California Red sheep breed", [7480])}, "CaliforniaSpangledCatBreed": { "132663009": ("California Spangled cat breed", [7480]) }, "CaliforniaVariegatedMutantSheepBreed": { "131794001": ("California Variegated Mutant sheep breed", [7480]) }, "CallithrixJacchus": {"406733009": ("Callithrix jacchus", [7454])}, "CaloricAgent": {"373530005": ("Caloric agent", [621, 622])}, "CalvanaCattleBreed": {"133342006": ("Calvana cattle breed", [7480])}, "Calyx": {"2334006": ("Calyx", [4, 7151, 7192, 8134, 9514])}, "CamargueCattleBreed": {"133343001": ("Camargue cattle breed", [7480])}, "CamargueHorseBreed": {"131892008": ("Camargue horse breed", [7480])}, "CamarronGoat": {"9230001": ("Camarron goat (organism)", [])}, "CamarronGoatBreed": {"9230001": ("Camarron goat breed", [7480])}, "CambodianCattleBreed": {"133344007": ("Cambodian cattle breed", [7480])}, "Camborough12PigBreed": {"132048005": ("Camborough 12 pig breed", [7480])}, "Camborough15PigBreed": {"132211005": ("Camborough 15 pig breed", [7480])}, "Camborough22PigBreed": {"132210006": ("Camborough 22 pig breed", [7480])}, "CamboroughBluePigBreed": {"132047000": ("Camborough Blue pig breed", [7480])}, "CambridgeSheepBreed": {"131802002": ("Cambridge sheep breed", [7480])}, "CampCoventry": {"399212002": ("Camp-Coventry", [4012])}, "CampCoventryProjection": { "399212002": ("Camp-Coventry projection (qualifier value)", []) }, "CampanianBarbarySheepBreed": { "131793007": ("Campanian Barbary sheep breed", [7480]) }, "CampolinaHorseBreed": {"133128009": ("Campolina horse breed", [7480])}, "CanaanDogBreed": {"132552000": ("Canaan dog breed", [7480])}, "CanadianArcottSheepBreed": {"132689009": ("Canadian Arcott sheep breed", [7480])}, "CanadianCattleBreed": {"21921002": ("Canadian cattle breed (organism)", [])}, "CanadianCowBreed": {"21921002": ("Canadian cow breed", [7480])}, "CanadianCuttingHorseHorseBreed": { "131893003": ("Canadian Cutting Horse horse breed", [7480]) }, "CanadianDurocPigBreed": {"132218004": ("Canadian Duroc pig breed", [7480])}, "CanadianEskimoDog": {"91553005": ("Canadian eskimo dog (organism)", [])}, "CanadianEskimoDogBreed": {"91553005": ("Canadian eskimo dog breed", [7480])}, "CanadianHampshirePigBreed": { "132219007": ("Canadian Hampshire pig breed", [7480]) }, "CanadianHorse": {"47842004": ("Canadian horse (organism)", [])}, "CanadianHorseBreed": {"47842004": ("Canadian horse breed", [7480])}, "CanadianLandracePigBreed": {"132034005": ("Canadian Landrace pig breed", [7480])}, "CanadianRoyalBluePigBreed": { "132215001": ("Canadian Royal Blue pig breed", [7480]) }, "CanadianRusticPonyHorseBreed": { "131894009": ("Canadian Rustic Pony horse breed", [7480]) }, "CanadianSportHorseHorseBreed": { "131895005": ("Canadian Sport Horse horse breed", [7480]) }, "CanadianYorkshirePigBreed": { "132035006": ("Canadian Yorkshire pig breed", [7480]) }, "CanaryIslandCattleBreed": {"131581001": ("Canary Island cattle breed", [7480])}, "CanaryIslandGoatBreed": {"131652008": ("Canary Island goat breed", [7480])}, "CanastraPigBreed": {"132054006": ("Canastra pig breed", [7480])}, "CanastrinhoPigBreed": {"132065001": ("Canastrinho pig breed", [7480])}, "CanastrãoCabanoPigBreed": {"132062003": ("Canastrão, Cabano pig breed", [7480])}, "CanastrãoCapitãoChicoPigBreed": { "132060006": ("Canastrão, Capitão Chico pig breed", [7480]) }, "CanastrãoJunqueiraPigBreed": { "132059001": ("Canastrão, Junqueira pig breed", [7480]) }, "CanastrãoPigBreed": {"132058009": ("Canastrão pig breed", [7480])}, "CanastrãoVermelhoPigBreed": { "132063008": ("Canastrão, Vermelho pig breed", [7480]) }, "CanastrãoZabumbaPigBreed": {"132061005": ("Canastrão, Zabumba pig breed", [7480])}, "CancerOfCervix": {"363354003": ("Cancer of cervix", [638, 639])}, "CancerOfColon": {"363406005": ("Cancer of colon", [638, 639])}, "CancerOfSalivaryGland": {"255072001": ("Cancer of salivary gland", [638, 639])}, "CanchimCattleBreed": {"133718009": ("Canchim cattle breed (organism)", [])}, "CanchimXZebuCattleBreed": {"133718009": ("Canchim X zebu cattle breed", [7480])}, "CaneCorsoDogBreed": {"132563002": ("Cane Corso dog breed", [7480])}, "CanikHorseBreed": {"131896006": ("Canik horse breed", [7480])}, "CanindéGoatBreed": {"131651001": ("Canindé goat breed", [7480])}, "CanineRegion": {"699510004": ("Canine region", [4017])}, "CanineRegionOfOralCavity": { "699510004": ("Canine region of oral cavity (body structure)", []) }, "CanineSpecies": {"69986009": ("Canine species (organism)", [])}, "Canis": {"388490000": ("Canis", [7454])}, "CanisLupus": {"36855005": ("Canis lupus", [7454])}, "CanisLupusDingo": {"709853007": ("Canis lupus dingo (organism)", [])}, "CanisLupusFamiliaris": {"448771007": ("Canis lupus familiaris", [7454])}, "CanisLupusSubspeciesFamiliaris": { "448771007": ("Canis lupus subspecies familiaris (organism)", []) }, "Cannabis": {"398705004": ("Cannabis (substance)", [])}, "CannotReachTargetHeartRate": { "429733000": ("Cannot reach target heart rate", [3205]) }, "CantonesePigBreed": {"132292004": ("Cantonese pig breed", [7480])}, "CapeHorseHorseBreed": {"131897002": ("Cape Horse horse breed", [7480])}, "Capillary": {"20982000": ("Capillary", [7151, 7166, 7191])}, "Capra": {"388249000": ("Capra", [7454])}, "CapraHircus": {"125097000": ("Capra hircus", [7454])}, "CaprineSpecies": {"68552000": ("Caprine species (organism)", [])}, "Capsular": {"11070000": ("Capsular", [2, 5])}, "CaptainCookerPigBreed": {"133184009": ("Captain Cooker pig breed", [7480])}, "CaracuCattleBreed": {"133345008": ("Caracu cattle breed", [7480])}, "CarazebuCattleBreed": {"133795006": ("Carazebu cattle breed (organism)", [])}, "CarazebuXZebuCattleBreed": {"133795006": ("Carazebu X zebu cattle breed", [7480])}, "Carbapenem": {"396345004": ("Carbapenem (substance)", [])}, "CarbapenemAntibiotic": {"396345004": ("Carbapenem antibiotic", [621, 622])}, "CarbolFuchsinStain": {"764166003": ("carbol fuchsin stain", [8112])}, "Carbon14DXylose": {"2942001": ("Carbon^14^ D-xylose", [25])}, "Carbon14Triolein": {"42417005": ("Carbon^14^ triolein", [25])}, "CarbonDioxide": {"31811003": ("Carbon dioxide", [12, 13, 623, 624, 3850])}, "CarbonDioxideO15": {"129507008": ("Carbon dioxide O^15^", [4021])}, "CarbonFiber": {"256501007": ("Carbon Fiber", [7300, 9579, 10067])}, "CarbonMonoxideC11": {"129515006": ("Carbon monoxide C^11^", [4021])}, "CarbonMonoxideO15": {"129506004": ("Carbon monoxide O^15^", [4021])}, "Carcinogen": {"88376000": ("Carcinogen", [602])}, "Carcinoma": {"1187425009": ("Carcinoma", [638, 639])}, "CarcinomaInSituOfMaleBreast": { "92652009": ("Carcinoma in situ of male breast", [6030, 6033]) }, "CarcinomaNoSubtype": { "68453008": ("Carcinoma, no subtype (morphologic abnormality)", []) }, "CarcinomaOfProstate": {"254900004": ("Carcinoma of prostate (disorder)", [])}, "CarcinomaWithMetaplasia": { "22694002": ("Carcinoma with metaplasia", [6030, 6033]) }, "Carcinosarcoma": {"63264007": ("Carcinosarcoma", [638, 639, 6030, 6033])}, "CarcinosarcomaOfUterus": {"702369008": ("Carcinosarcoma of uterus", [638, 639])}, "CardiacAdrenergicBlockingAgent": { "373263004": ("Cardiac adrenergic blocking agent", [10]) }, "CardiacAkinesia": {"195675009": ("Cardiac akinesia (finding)", [])}, "CardiacArrest": {"410429000": ("Cardiac arrest", [3413, 3755])}, "CardiacArrhythmia": {"698247007": ("Cardiac Arrhythmia", [60, 1201, 9300])}, "CardiacBloodPoolImaging": { "35621002": ("Cardiac blood pool imaging (nuclear)", [3206, 3757]) }, "CardiacCT": {"241547009": ("Cardiac CT", [3757])}, "CardiacCTForCalciumScoring": { "426005005": ("Cardiac CT for calcium scoring", [3757]) }, "CardiacCathCoronaryAngiogramAndLeftVentriculogram": { "418903008": ("Cardiac cath coronary angiogram and left ventriculogram", [3757]) }, "CardiacCatheterization": {"41976001": ("Cardiac catheterization", [3757])}, "CardiacCatheterizationBailoutPhase": { "128961006": ("Cardiac catheterization bailout phase", [3250, 3405]) }, "CardiacCatheterizationBaselinePhase": { "128955008": ("Cardiac catheterization baseline phase", [3250, 3405, 3651]) }, "CardiacCatheterizationCoronaryAngiogram": { "419416005": ("Cardiac catheterization coronary angiogram", [3757]) }, "CardiacCatheterizationGradientAssessmentPhase": { "371874005": ("Cardiac catheterization gradient assessment phase", [3651]) }, "CardiacCatheterizationImageAcquisitionPhase": { "128956009": ("Cardiac catheterization image acquisition phase", [3250, 3405]) }, "CardiacCatheterizationInterventionPhase": { "128957000": ("Cardiac catheterization intervention phase", [3250, 3405]) }, "CardiacCatheterizationLeftHeartTransseptal": { "67338003": ("Cardiac catheterization, left heart, transseptal (procedure)", []) }, "CardiacCatheterizationPostContrastPhase": { "129083002": ("Cardiac catheterization post contrast phase", [3250, 3405, 3651]) }, "CardiacCatheterizationPostInterventionPhase": { "128960007": ( "Cardiac catheterization post-intervention phase", [3250, 3405, 3480, 3651], ) }, "CardiacCatheterizationPreInterventionPhase": { "128958005": ( "Cardiac catheterization pre-intervention phase", [3250, 3405, 3480], ) }, "CardiacCatheterizationProcedurePhase": { "129085009": ("Cardiac catheterization procedure phase (qualifier value)", []) }, "CardiacCatheterizationTestChallengePhase": { "373105002": ( "Cardiac catheterization test/challenge phase", [3250, 3405, 3651], ) }, "CardiacCatheterizationTherapyPhase": { "128959002": ("Cardiac catheterization therapy phase", [3250, 3405]) }, "CardiacComputedTomographyForCalciumScoring": { "426005005": ("Cardiac computed tomography for calcium scoring (procedure)", []) }, "CardiacCyclePhase": {"246092007": ("Cardiac cycle phase (attribute)", [])}, "CardiacDyskinesia": {"25437005": ("Cardiac dyskinesia (finding)", [])}, "CardiacEjectionFraction": { "70822001": ( "Cardiac ejection fraction", [ 12252, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, 12304, ], ) }, "CardiacEjectionFractionFunction": { "70822001": ("Cardiac ejection fraction, function (observable entity)", []) }, "CardiacFunctionTestAbnormal": { "165076002": ("cardiac function test abnormal", [3727]) }, "CardiacIndex": { "54993008": ( "Cardiac Index", [ 12200, 12207, 12239, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "CardiacIntensiveCare": {"309907008": ("Cardiac Intensive Care", [7030])}, "CardiacIntensiveCareUnit": { "309907008": ("Cardiac intensive care unit (environment)", []) }, "CardiacMRI": {"241620005": ("Cardiac MRI", [3206, 3757, 3820])}, "CardiacMRIStress": {"431609005": ("Cardiac MRI stress", [3757])}, "CardiacMuscle": {"122448007": ("Cardiac muscle", [7710, 8134])}, "CardiacMuscleTissue": { "122448007": ("Cardiac muscle (tissue) (body structure)", []) }, "CardiacOutput": { "82799009": ( "Cardiac Output", [ 12200, 12207, 12239, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "CardiacOutputMeasurementByThermalBathMethod": { "371838001": ( "Cardiac output measurement by thermal bath method (procedure)", [], ) }, "CardiacOutputMeasurementByThermalDyeDilutionMethod": { "373104003": ( "Cardiac output measurement by thermal dye dilution method (procedure)", [], ) }, "CardiacOutputMeasurementByThermalInlineMethod": { "371843008": ( "Cardiac output measurement by thermal inline method (procedure)", [], ) }, "CardiacPacemaker": { "14106009": ( "Cardiac pacemaker", [1000, 3777, 6102, 6138, 6404, 7151, 7157, 7193], ) }, "CardiacPacemakerDevice": { "14106009": ("Cardiac pacemaker, device (physical object)", []) }, "CardiacPacemakerInSitu": { "441509002": ("Cardiac pacemaker in situ (finding)", []) }, "CardiacPacemakerLead": { "360129009": ("Cardiac pacemaker lead", [6102, 6138, 6404, 7151, 7193]) }, "CardiacPacing": {"18590009": ("Cardiac pacing", [12002])}, "CardiacSeptumProsthesis": { "118375008": ("Vascular graft", [4, 7151, 7192, 8134, 9514]) }, "CardiacShuntStudy": {"241213007": ("Cardiac shunt study (procedure)", [])}, "CardiacStressRecoveryState": { "432554001": ("Cardiac stress recovery state", [3207, 12002]) }, "CardiacStressState": {"432655005": ("Cardiac Stress State", [3101, 3207, 12002])}, "CardiacSurgery": {"309971008": ("Cardiac Surgery", [7030])}, "CardiacSurgeryDepartment": { "309971008": ("Cardiac surgery department (environment)", []) }, "CardiacTamponade": {"35304003": ("Cardiac tamponade", [3413, 3755])}, "CardiacValveAnnulus": {"305437000": ("Cardiac valve annulus", [12280])}, "CardiacValveLeaflet": {"6530003": ("Cardiac Valve Leaflet", [12280])}, "CardiacValveProsthesisDevice": { "25510005": ("Cardiac valve prosthesis, device (physical object)", []) }, "CardiacVentricularStructure": { "21814001": ("Cardiac ventricular structure (body structure)", []) }, "CardiacVentriculography": { "252426003": ("Cardiac ventriculography", [3405, 3428, 3744]) }, "CardiacWallMotionFunction": { "60797005": ("Cardiac wall motion, function (observable entity)", []) }, "CardiacWallStructure": { "272657006": ("Cardiac wall structure (body structure)", []) }, "CardiganWelshCorgi": {"60517007": ("Cardigan Welsh corgi (organism)", [])}, "CardiganWelshCorgiDogBreed": { "60517007": ("Cardigan Welsh corgi dog breed", [7480]) }, "CardiogenicShock": { "89138009": ("Cardiogenic shock", [3413, 3700, 3726, 3727, 3755]) }, "Cardiology": {"309915006": ("Cardiology", [7030])}, "CardiologyDepartment": {"309915006": ("Cardiology department (environment)", [])}, "Cardiomegaly": {"287272002": ("Cardiomegaly", [12248, 12249])}, "Cardiomyopathy": {"85898001": ("Cardiomyopathy", [64, 3727])}, "CardiophrenicAngleLymphNode": { "371013005": ("cardiophrenic angle lymph node", [7600, 8134]) }, "CardiopulmonaryBypass": {"63697000": ("Cardiopulmonary bypass", [3553])}, "CardiopulmonaryBypassOperation": { "63697000": ("Cardiopulmonary bypass operation (procedure)", []) }, "CardiorespiratoryArrest": {"410430005": ("Cardiorespiratory arrest", [60, 9300])}, "CardiothoracicSurgery": {"309969008": ("Cardiothoracic Surgery", [7030])}, "CardiothoracicSurgeryDepartment": { "309969008": ("Cardiothoracic surgery department (environment)", []) }, "CardiovascularCT": {"303680000": ("cardiovascular CT", [3820])}, "CardiovascularCyclePoint": { "272518008": ("Cardiovascular cycle point (qualifier value)", []) }, "CardiovascularEventRisk": { "395112001": ("Cardiovascular event risk (finding)", []) }, "CardiovascularOrificeArea": { "399367004": ( "Cardiovascular Orifice Area", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "CardiovascularOrificeDiameter": { "399027007": ( "Cardiovascular Orifice Diameter", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "CardiovascularPressureGradient": { "251081004": ("Cardiovascular pressure gradient (observable entity)", []) }, "CardiovascularStressTestUsingBicycleErgometer": { "26046004": ( "Cardiovascular stress test using bicycle ergometer (procedure)", [], ) }, "CardiovascularStressTestUsingPharmacologicStressAgent": { "424064009": ( "Cardiovascular stress test using pharmacologic stress agent (procedure)", [], ) }, "CardiovascularStressTestUsingTheAdenosineStressTestProtocol": { "424444005": ( "Cardiovascular stress test using the adenosine stress test protocol (procedure)", [], ) }, "CardiovascularStressTestUsingTheDipyridamoleStressTestProtocol": { "422685009": ( "Cardiovascular stress test using the dipyridamole stress test protocol (procedure)", [], ) }, "CardiovascularStressTestUsingTheDobutamineStressTestProtocol": { "424225000": ( "Cardiovascular stress test using the dobutamine stress test protocol (procedure)", [], ) }, "CardiovascularSystem": { "113257007": ("Cardiovascular system", [7151, 7156, 7192, 8134, 9514]) }, "CareOfTheElderlyDepartment": { "309933000": ("Care of the elderly department (environment)", []) }, "CarfentanilC11": {"129511002": ("Carfentanil C^11^", [4021])}, "Carina": { "28700002": ( "Carina", [1000, 1001, 1004, 6102, 6109, 6111, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "CarinthianBlondCattleBreed": { "131582008": ("Carinthian Blond cattle breed", [7480]) }, "CarmineStain": {"73892005": ("carmine stain", [8112])}, "CarminicAcidStain": {"432003": ("carminic acid stain", [8112])}, "CarmoisineAStain": {"37575004": ("carmoisine A stain", [8112])}, "CarnoyFixative": {"433338005": ("Carnoy fixative (substance)", [])}, "CarnoyFluid": {"433338005": ("Carnoy's fluid", [8114])}, "CarolinaDogBreed": {"132544003": ("Carolina Dog breed", [7480])}, "CarotidArtery": { "69105007": ( "Carotid Artery", [ 4, 1000, 1001, 1002, 3010, 3440, 3604, 3606, 3630, 4030, 4042, 7151, 7192, 8134, 9514, ], ) }, "CarotidArteryStructure": { "69105007": ("Carotid artery structure (body structure)", []) }, "CarotidBifurcation": { "80272002": ( "Carotid Bifurcation", [3827, 7151, 7192, 8134, 9514, 12103, 12104], ) }, "CarotidBody": { "51345006": ("Carotid Body", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514]) }, "CarotidBodyStructure": { "51345006": ("Carotid body structure (body structure)", []) }, "CarotidBulb": { "21479005": ("Carotid Bulb", [3827, 7151, 7192, 8134, 9514, 12103, 12104]) }, "CarotidSinusMassageProcedurePhase": { "129090007": ("Carotid Sinus Massage procedure phase", [3254]) }, "CarotidSiphon": { "54409005": ("Carotid Siphon", [3827, 7151, 7192, 8134, 9514, 12103, 12105]) }, "CarpatheGoatBreed": {"131687008": ("Carpathe goat breed", [7480])}, "CarpathianBrownCattleBreed": { "133346009": ("Carpathian Brown cattle breed", [7480]) }, "CarpathianPonyHorseBreed": {"133138004": ("Carpathian Pony horse breed", [7480])}, "Carpus": {"8205005": ("Carpus", [7482, 7483, 8134])}, "CarthusianHorseBreed": {"133127004": ("Carthusian horse breed", [7480])}, "Cartilage": {"309312004": ("Cartilage", [7151, 7166, 7191])}, "CartilageTissue": {"309312004": ("Cartilage tissue (body structure)", [])}, "Cartridge": {"706440002": ("Cartridge", [68])}, "CarunchinhoPigBreed": {"132164004": ("Carunchinho pig breed", [7480])}, "CasanarenoCattleBreed": {"133347000": ("Casanareno cattle breed", [7480])}, "CasertanaPigBreed": {"132255004": ("Casertana pig breed", [7480])}, "CaspianHorseBreed": {"133126008": ("Caspian horse breed", [7480])}, "CastlemilkMooritSheepBreed": { "131792002": ("Castlemilk Moorit sheep breed", [7480]) }, "CatahoulaLeopardDogBreed": {"132545002": ("Catahoula Leopard dog breed", [7480])}, "CatalanSheepdogBreed": {"132420003": ("Catalan Sheepdog breed", [7480])}, "CatalanaChickenBreed": {"131998006": ("Catalana chicken breed", [7480])}, "CatalinaIslandPigBreed": {"132038008": ("Catalina Island pig breed", [7480])}, "Cataract": {"193570009": ("Cataract (disorder)", [])}, "CatchingBreath": {"248584002": ("Catching breath (finding)", [])}, "Catheter": { "19923001": ( "Catheter", [ 8, 69, 3451, 4051, 6040, 6102, 6138, 6202, 6203, 6401, 6404, 7111, 7112, 7151, 7193, ], ) }, "CatheterDevice": {"19923001": ("Catheter, device (physical object)", [])}, "CatheterManipulation": {"103712006": ("Catheter manipulation", [9])}, "CatheterReplacement": {"103713001": ("Catheter replacement", [9])}, "Catheterization": {"45211000": ("Catheterization", [9])}, "CatheterizationOfBothLeftAndRightHeartWithGraft": { "128952006": ( "Catheterization of both left and right heart with graft", [3250, 3405, 3739], ) }, "CatheterizationOfBothLeftAndRightHeartWithoutGraft": { "128953001": ( "Catheterization of both left and right heart without graft", [3250, 3405, 3739], ) }, "CatheterizationOfLeftHeart": { "67629009": ("Catheterization of left heart", [3250, 3405, 3739]) }, "CatheterizationOfRightHeart": { "40403005": ("Catheterization of right heart", [3250, 3405, 3739]) }, "Caucasian": {"413773004": ("Caucasian (racial group)", [])}, "CaucasianCattleBreed": {"131583003": ("Caucasian cattle breed", [7480])}, "CaucasianMountainDogBreed": { "132546001": ("Caucasian Mountain Dog breed", [7480]) }, "CaucasianRace": {"413773004": ("Caucasian race", [6099])}, "CaucasianShepherdDogBreed": { "132421004": ("Caucasian Shepherd Dog breed", [7480]) }, "Caudad": {"399162004": ("caudad", [502, 4011])}, "Caudal": {"3583002": ("Caudal", [2, 5, 23, 502])}, "CaudalLAO": {"408724004": ("Caudal LAO", [3466])}, "CaudalLeftAnteriorObliqueProjection": { "408724004": ("Caudal left anterior oblique projection (qualifier value)", []) }, "CaudalRAO": {"408726002": ("Caudal RAO", [3466])}, "CaudalRightAnteriorObliqueProjection": { "408726002": ("Caudal right anterior oblique projection (qualifier value)", []) }, "CaudateNucleus": { "11000004": ("Caudate Nucleus", [7140, 7151, 7153, 7192, 8134, 9514]) }, "CaudateNucleusStructure": { "11000004": ("Caudate nucleus structure (body structure)", []) }, "CaudoCranial": {"399196006": ("caudo-cranial", [501, 4010, 4014])}, "CaudoCranialProjection": { "399196006": ("Caudo-cranial projection (qualifier value)", []) }, "Caudocranial": {"399196006": ("Caudocranial", [7484])}, "CaudodistalCranioproximalOblique": { "442604001": ("Caudodistal-cranioproximal oblique", [7484]) }, "CaudodistalCranioproximalObliqueProjection": { "442604001": ( "Caudodistal-cranioproximal oblique projection (qualifier value)", [], ) }, "Causton": {"399065000": ("Causton", [4012])}, "CaustonProjection": {"399065000": ("Causton projection (qualifier value)", [])}, "CavalierKingCharlesSpaniel": { "66495005": ("Cavalier King Charles spaniel", [7480]) }, "CavallinoPigBreed": {"132095009": ("Cavallino pig breed", [7480])}, "CaviaPorcellus": {"125076001": ("Cavia porcellus", [7454])}, "CavumOfSeptumPellucidum": {"74968005": ("Cavum of septum pellucidum", [7140])}, "CayuseHorseBreed": {"133125007": ("Cayuse horse breed", [7480])}, "Cecum": {"32713005": ("Cecum", [6210, 8134])}, "CecumStructure": {"32713005": ("Cecum structure (body structure)", [])}, "CelestineBlueBStain": {"38707008": ("celestine blue B stain", [8112])}, "CeliacAxis": {"57850000": ("Celiac Axis", [3827, 12103, 12112, 12125])}, "CeliacLymphNode": {"47985009": ("celiac lymph node", [7600, 8134])}, "Cell": {"4421005": ("Cell", [8135])}, "CellStructure": {"4421005": ("Cell structure (cell structure)", [])}, "CementedComponentFixation": {"257771002": ("Cemented component fixation", [7310])}, "Central": {"26216008": ("Central", [2, 5, 211, 212, 3019, 4005, 6124, 6125])}, "CentralAortopulmonaryShuntOperation": { "233224003": ("Central aortopulmonary shunt operation", [12247]) }, "CentralAsianZebuCattleBreed": { "133796007": ("Central Asian Zebu cattle breed (organism)", []) }, "CentralAsianZebuXZebuCattleBreed": { "133796007": ("Central Asian Zebu X zebu cattle breed", [7480]) }, "CentralAxillaryLymphNode": { "283001": ("central axillary lymph node", [7600, 8134]) }, "CentralIncisorRegion": {"699453001": ("Central incisor region", [4017])}, "CentralIncisorRegionOfOralCavity": { "699453001": ("Central incisor region of oral cavity (body structure)", []) }, "CentralNervousSystem": { "21483005": ("Central nervous system", [645, 7151, 7153, 7192, 8134, 9514]) }, "CentralPortionOfBreastPositionOnMammogram": { "129786000": ("Central portion of breast position on mammogram (finding)", []) }, "CentralRegionOfBreast": {"129786000": ("Central region of breast", [6018, 6019])}, "CentralRetinalArtery": { "76117006": ( "Central Retinal Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "CentralRetinalVein": { "62869001": ( "Central Retinal Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "CentralRussianBlackPiedCattleBreed": { "133348005": ("Central Russian Black Pied cattle breed", [7480]) }, "CentralRussianPigBreed": {"132072000": ("Central Russian pig breed", [7480])}, "CentralVenousCatheter": {"52124006": ("Central venous catheter", [74])}, "CentralVenousCatheterDevice": { "52124006": ("Central venous catheter, device (physical object)", []) }, "CentralVenousPressureWaveform": { "128445003": ("Central venous pressure waveform", [3003]) }, "CentralVenousPressureWaveformFunction": { "128445003": ( "Central venous pressure waveform, function (observable entity)", [], ) }, "CentralVenousSystem": {"34340008": ("Central venous system", [3607, 3630])}, "CentralZoneOfLeftHalfProstate": { "716901006": ( "Central zone of left half prostate", [6300, 6301, 6302, 6303, 6304], ) }, "CentralZoneOfRightHalfProstate": { "716900007": ( "Central zone of right half prostate", [6300, 6301, 6302, 6303, 6304], ) }, "CentrallyActingHypotensiveAgent": { "4382004": ("Centrally acting hypotensive agent", [10]) }, "Cephalad": {"399196006": ("cephalad", [502, 4011])}, "Cephalic": {"66787007": ("Cephalic", [2, 23, 502])}, "CephalicVein": { "20699002": ( "Cephalic vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "CephalosporinAntibiotic": {"764147003": ("Cephalosporin antibiotic", [621, 622])}, "CephalosporinClassOfAntibiotic": { "373262009": ("Cephalosporin -class of antibiotic- (substance)", []) }, "CerbatHorseBreed": {"131898007": ("Cerbat horse breed", [7480])}, "CerebellarCortex": {"25991003": ("Cerebellar Cortex", [7140])}, "CerebellarCortexStructure": { "25991003": ("Cerebellar cortex structure (body structure)", []) }, "CerebellarStructure": {"113305005": ("Cerebellar structure (body structure)", [])}, "CerebellarSubarachnoidSpace": { "263972004": ("Cerebellar Subarachnoid Space", [7140]) }, "CerebellarWhiteMatter": { "33060004": ( "Cerebellar White Matter", [7140, 7151, 7153, 7192, 7710, 8134, 9514], ) }, "CerebellarWhiteMatterStructure": { "33060004": ("Cerebellar white matter structure (body structure)", []) }, "Cerebellum": { "113305005": ( "Cerebellum", [4, 4030, 7140, 7151, 7153, 7192, 8134, 9514, 12020, 12022], ) }, "CerebralAqueduct": { "80447000": ("Cerebral aqueduct", [7151, 7153, 7192, 8134, 9514]) }, "CerebralArtery": { "88556005": ( "Cerebral artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "CerebralCortex": {"40146001": ("Cerebral cortex", [7151, 7153, 7192, 8134, 9514])}, "CerebralFornix": {"87463005": ("Cerebral fornix", [7151, 7153, 7192, 8134, 9514])}, "CerebralFornixStructure": { "87463005": ("Cerebral fornix structure (body structure)", []) }, "CerebralGrayMatter": {"40146001": ("Cerebral Gray Matter", [7140])}, "CerebralHemisphere": { "372073000": ("Cerebral hemisphere", [7151, 7153, 7192, 8134, 9514, 12022]) }, "CerebralHemisphereStructure": { "372073000": ("Cerebral hemisphere structure (body structure)", []) }, "CerebralWhiteMatter": { "68523003": ( "Cerebral White Matter", [7140, 7151, 7153, 7192, 7710, 8134, 9514], ) }, "CerebralWhiteMatterStructure": { "68523003": ("Cerebral white matter structure (body structure)", []) }, "CerebrospinalFluid": { "65216001": ("Cerebrospinal Fluid", [7151, 7153, 7192, 8134, 9514]) }, "CerebrovascularAccident": { "230690007": ("Cerebrovascular accident (disorder)", []) }, "CerebrovascularAccidentOrStroke": { "230690007": ("Cerebrovascular Accident or Stroke", [3413, 3755]) }, "CervicalCollar": {"63562005": ("Cervical collar", [6102, 6138, 6404, 7151, 7193])}, "CervicalCollarDevice": { "63562005": ("Cervical collar, device (physical object)", []) }, "CervicalLymphNode": {"81105003": ("cervical lymph node", [7600, 8134])}, "CervicalLymphNodeStructure": { "81105003": ("Cervical lymph node structure (body structure)", []) }, "CervicalSpine": { "122494005": ( "Cervical spine", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514], ) }, "CervicoThoracicSpine": { "1217257000": ( "Cervico-thoracic spine", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514], ) }, "CervicothoracicRegionOfSpineStructure": { "297171002": ("Cervicothoracic region of spine structure (body structure)", []) }, "Cervix": { "71252005": ( "Cervix", [4, 645, 4040, 6202, 6204, 7151, 7160, 7192, 8134, 9514, 12023], ) }, "CervixUteriStructure": { "71252005": ("Cervix uteri structure (body structure)", []) }, "CeskyFousekDogBreed": {"132547005": ("Cesky Fousek dog breed", [7480])}, "CeskyTerrierDogBreed": {"132548000": ("Cesky Terrier dog breed", [7480])}, "CestrumParqui": {"13653002": ("Cestrum parqui", [7480])}, "Chair": {"706699008": ("Chair", [7151, 7157, 7193, 9505, 9515, 9520, 9573])}, "ChakouyiHorseBreed": {"131899004": ("Chakouyi horse breed", [7480])}, "ChamDocCattleBreed": {"131459009": ("Cham-Doc cattle breed", [7480])}, "Chamberlain": {"399148006": ("Chamberlain", [4012])}, "ChamberlainProjection": { "399148006": ("Chamberlain projection (qualifier value)", []) }, "ChamoisOfTheAlpsGoatBreed": { "131685000": ("Chamois of the Alps goat breed", [7480]) }, "ChamoiseeGoat": {"89708009": ("Chamoisee goat (organism)", [])}, "ChamoiseeGoatBreed": {"89708009": ("Chamoisee goat breed", [7480])}, "ChanDocCattleBreed": {"131459009": ("Chan-Doc cattle breed (organism)", [])}, "ChanniCattleBreed": {"133600004": ("Channi cattle breed", [7480])}, "ChantillyTiffanyCatBreed": {"132664003": ("Chantilly/Tiffany cat breed", [7480])}, "ChaouiaCattleBreed": {"133349002": ("Chaouia cattle breed", [7480])}, "ChaparGoatBreed": {"131650000": ("Chapar goat breed", [7480])}, "CharSwissCattleBreed": {"133351003": ("Char-swiss cattle breed", [7480])}, "CharaHorseHorseBreed": {"131900009": ("Chara Horse horse breed", [7480])}, "CharbrayCattleBreed": {"133719001": ("Charbray cattle breed (organism)", [])}, "CharbrayXZebuCattleBreed": {"133719001": ("Charbray X zebu cattle breed", [7480])}, "CharfordCattleBreed": {"133797003": ("Charford cattle breed (organism)", [])}, "CharfordXZebuCattleBreed": {"133797003": ("Charford X zebu cattle breed", [7480])}, "CharnequeriaGoatBreed": {"131686004": ("Charnequeria goat breed", [7480])}, "CharolaisCattleBreed": {"131584009": ("Charolais cattle breed", [7480])}, "CharollaisSheepBreed": {"131791009": ("Charollais sheep breed", [7480])}, "CharollandaisCattleBreed": {"133350002": ("Charollandais cattle breed", [7480])}, "ChartPolskiDogBreed": {"132549008": ("Chart Polski dog breed", [7480])}, "ChartreuxCat": {"43529009": ("Chartreux cat", [7480])}, "ChassardLapinProjection": { "399013002": ("Chassard-Lapin projection (qualifier value)", []) }, "ChassardLapine": {"399013002": ("Chassard-Lapine", [4012])}, "Chausse": {"399355001": ("Chausse", [4012])}, "ChausseProjection": {"399355001": ("Chausse projection (qualifier value)", [])}, "Cheek": {"60819002": ("Cheek", [4, 7151, 7192, 8134, 9514])}, "CheekStructure": {"60819002": ("Cheek structure (body structure)", [])}, "ChejuHorseBreed": {"133124006": ("Cheju horse breed", [7480])}, "Chemotherapy": {"367336001": ("Chemotherapy", [6083, 6085])}, "ChenghuaPigBreed": {"132144009": ("Chenghua pig breed", [7480])}, "ChernigovCattleBreed": {"131460004": ("Chernigov cattle breed", [7480])}, "ChesapeakeBayRetriever": {"13248002": ("Chesapeake Bay retriever (organism)", [])}, "ChesapeakeBayRetrieverDogBreed": { "13248002": ("Chesapeake Bay retriever dog breed", [7480]) }, "ChesiCattleBreed": {"133353000": ("Chesi cattle breed", [7480])}, "Chest": { "816094009": ( "Chest", [4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514], ) }, "ChestAbdomenAndPelvis": { "416775004": ( "Chest, Abdomen and Pelvis", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "ChestAndAbdomen": { "416550000": ( "Chest and Abdomen", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514], ) }, "ChestAndOrAbdomenAndOrPelvisStructure": { "416775004": ( "Chest and/or abdomen and/or pelvis structure (body structure)", [], ) }, "ChestAndOrAbdomenStructure": { "416550000": ("Chest and/or abdomen structure (body structure)", []) }, "ChestCavity": {"43799004": ("Chest cavity", [7155, 8134])}, "ChestCircumference": { "248366000": ("Chest circumference (observable entity)", []) }, "ChestDiscomfort": {"279084009": ("Chest discomfort", [3220])}, "ChestImaging": {"413815006": ("Chest imaging (procedure)", [])}, "ChestPain": {"29857009": ("Chest Pain", [3201, 3220, 3221, 12246])}, "ChestPainNotPresent": { "161971004": ("Chest pain not present", [3202, 3220, 3719]) }, "ChestWall": {"78904004": ("Chest wall", [6018, 6129, 8134])}, "ChestWallMuscle": { "372074006": ("Chest wall muscle", [7151, 7155, 7192, 8134, 9514]) }, "ChestWallStructure": {"78904004": ("Chest wall structure (body structure)", [])}, "ChesterWhitePig": {"69461005": ("Chester white pig (organism)", [])}, "ChesterWhitePigBreed": {"69461005": ("Chester white pig breed", [7480])}, "CheurfaCattleBreed": {"133354006": ("Cheurfa cattle breed", [7480])}, "CheviotSheep": {"50717006": ("Cheviot sheep (organism)", [])}, "CheviotSheepBreed": {"50717006": ("Cheviot sheep breed", [7480])}, "ChewingTobacco": {"81911001": ("Chewing tobacco", [6089])}, "ChiTerrierDogBreed": {"132623008": ("Chi Terrier dog breed", [7480])}, "ChiangusCattleBreed": {"133578000": ("Chiangus cattle breed", [7480])}, "ChianinaCattleBreed": {"35229007": ("Chianina cattle breed (organism)", [])}, "ChianinaCowBreed": {"35229007": ("Chianina cow breed", [7480])}, "ChianinaPigBreed": {"132179006": ("Chianina pig breed", [7480])}, "ChickasawHorseBreed": {"131901008": ("Chickasaw horse breed", [7480])}, "ChienDArtoisDogBreed": {"132551007": ("Chien d'Artois dog breed", [7480])}, "ChienFrançaisBlancEtNoirDogBreed": { "132543009": ("Chien Français Blanc et Noir dog breed", [7480]) }, "ChienFrançaisBlancEtOrangeDogBreed": { "132558001": ("Chien Français Blanc et Orange dog breed", [7480]) }, "ChienFrançaisTricoloreDogBreed": { "132553005": ("Chien Français Tricolore dog breed", [7480]) }, "ChifordCattleBreed": {"133355007": ("Chiford cattle breed", [7480])}, "ChihuahuaSuperbreed": {"9761009": ("Chihuahua superbreed (organism)", [])}, "ChihuahuaSuperbreedDogBreed": { "9761009": ("Chihuahua superbreed dog breed", [7480]) }, "ChildAndAdolescentPsychiatry": { "309959002": ("Child and Adolescent Psychiatry", [7030]) }, "ChildAndAdolescentPsychiatryDepartment": { "309959002": ("Child and adolescent psychiatry department (environment)", []) }, "ChileanCorraleroHorseBreed": { "133141008": ("Chilean Corralero horse breed", [7480]) }, "ChillsAndFever": {"274640006": ("Chills and fever", [60, 9300])}, "ChiloteHorseBreed": {"131902001": ("Chilote horse breed", [7480])}, "ChimaineCattleBreed": {"133356008": ("Chimaine cattle breed", [7480])}, "ChinPigBreed": {"133167003": ("Chin pig breed", [7480])}, "ChinampoCattleBreed": {"133357004": ("Chinampo cattle breed", [7480])}, "ChincoteaguePonyHorseBreed": { "133101004": ("Chincoteague Pony horse breed", [7480]) }, "ChineseBlackAndWhiteCattleBreed": { "131585005": ("Chinese Black-and-White cattle breed", [7480]) }, "ChineseCrestedDogBreed": {"132554004": ("Chinese Crested dog breed", [7480])}, "ChineseFooDogBreed": {"132555003": ("Chinese Foo Dog breed", [7480])}, "ChineseImperialChInDogBreed": { "132556002": ("Chinese Imperial ch'in dog breed", [7480]) }, "ChineseKazakhHorseBreed": {"131903006": ("Chinese Kazakh horse breed", [7480])}, "ChineseMongolianHorseBreed": { "131904000": ("Chinese Mongolian horse breed", [7480]) }, "ChinoSantandereanoCattleBreed": { "131461000": ("Chino Santandereano cattle breed", [7480]) }, "ChinookDogBreed": {"132557006": ("Chinook dog breed", [7480])}, "ChiosSheepBreed": {"131789001": ("Chios sheep breed", [7480])}, "ChittagongRedCattleBreed": {"133644001": ("Chittagong Red cattle breed", [7480])}, "ChloralHydrate": {"273948005": ("Chloral hydrate", [623, 625])}, "ChloriodizedOil": {"62442005": ("Chloriodized oil", [12, 3850])}, "ChloroacetateEsteraseStain": { "255796003": ("chloroacetate esterase stain", [8112]) }, "Chloroform": {"259153006": ("Chloroform", [623, 624, 8114])}, "Chlorpromazine": {"387258005": ("Chlorpromazine", [623, 626])}, "Choline": {"65123005": ("Choline", [218, 4032, 4033, 7180, 7186, 7469])}, "CholinergicAgent": {"421148003": ("Cholinergic agent", [621, 622])}, "CholinergicReceptorStimulatingAgent": { "421148003": ("Cholinergic receptor stimulating agent (substance)", []) }, "CholistaniCattleBreed": {"133601000": ("Cholistani cattle breed", [7480])}, "CholistaniSheepBreed": {"131703003": ("Cholistani sheep breed", [7480])}, "Chondroma": {"31186001": ("Chondroma", [6030, 6031])}, "Chondrosarcoma": {"1163016002": ("Chondrosarcoma", [6030, 6033])}, "ChondrosarcomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "14990007": ( "Chondrosarcoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "ChordaeTendineaeCordis": { "102298001": ( "Chordae tendineae cordis", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "ChoroidOfEye": {"68703001": ("Choroid of eye", [4209, 4211, 8134])}, "ChoroidalStructure": {"68703001": ("Choroidal structure (body structure)", [])}, "ChowChow": {"28751008": ("Chow Chow", [7480])}, "ChromeAzurolSStain": {"34128002": ("chrome azurol S stain", [8112])}, "ChromicAcidStain": {"406986000": ("chromic acid stain", [8112])}, "ChromicPhosphateP32": {"17069007": ("Chromic phosphate P^32^", [25])}, "Chromium51Albumin": {"4693006": ("Chromium^51^ albumin", [25])}, "Chromium51Chloride": {"6973004": ("Chromium^51^ chloride", [25])}, "ChromiumTrioxide": {"430821002": ("Chromium trioxide", [8114])}, "Chromotrope2RStain": {"85981002": ("chromotrope 2R stain", [8112])}, "Chronic": {"90734009": ("Chronic", [3770, 6130])}, "ChronicSick": {"161901003": ("Chronic sick (finding)", [])}, "ChronicallyIll": {"27624003": ("Chronically ill", [3772])}, "ChronotropicIncompetence": {"427989008": ("Chronotropic incompetence", [3213])}, "ChryakPICPigBreed": {"132214002": ("Chryak PIC pig breed", [7480])}, "ChrysoidineRStain": {"10247008": ("chrysoidine R stain", [8112])}, "ChrysoidineYStain": {"16943008": ("chrysoidine Y stain", [8112])}, "ChumbivilcasHorseBreed": {"131905004": ("Chumbivilcas horse breed", [7480])}, "ChumyshHorseBreed": {"131906003": ("Chumysh horse breed", [7480])}, "CigaretteSmokingTobacco": {"66562002": ("Cigarette smoking tobacco", [6089])}, "CildirCattleBreed": {"133358009": ("Cildir cattle breed", [7480])}, "CiliaryBody": {"29534007": ("Ciliary body", [4209, 4211, 8134])}, "CiliaryBodyStructure": { "29534007": ("Ciliary body structure (body structure)", []) }, "Cingulum": {"37035000": ("Cingulum", [7151, 7153, 7192, 7704, 7710, 8134, 9514])}, "CinisaraCattleBreed": {"131462007": ("Cinisara cattle breed", [7480])}, "CircleOfWillis": { "11279006": ("Circle of Willis", [4, 4030, 7151, 7192, 8134, 9514]) }, "CirculatingNurse": {"413854007": ("Circulating Nurse", [7453])}, "Circumference": { "74551000": ( "Circumference", [ 218, 6165, 7469, 7470, 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, ], ) }, "Circumferential": {"255593009": ("Circumferential", [6209])}, "CircumflexCoronaryArtery": { "57396003": ( "Circumflex Coronary Artery", [3015, 3016, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12292], ) }, "Circumscribed": {"263706005": ("Circumscribed", [6120])}, "CircumscribedLesion": { "129738007": ("Circumscribed lesion", [6006, 6007, 6335, 6341, 6342]) }, "CiritHorseBreed": {"131907007": ("Cirit horse breed", [7480])}, "CirnecoDellEtnaDogBreed": {"132422006": ("Cirneco dell'Etna dog breed", [7480])}, "CirrhosisOfLiver": {"19943007": ("Cirrhosis of liver", [12325])}, "CirsoidAneurysm": {"233982006": ("cirsoid aneurysm", [3808])}, "CisternaMagna": {"54165005": ("Cisterna Magna", [8134, 12020, 12022])}, "Citrate": {"59351004": ("Citrate", [218, 4032, 4033, 7180, 7186, 7469])}, "CitricAcid": {"75399008": ("citric acid", [4412])}, "ClassIAntiarrhythmicAgent": { "373260001": ("class I antiarrhythmic agent", [3762]) }, "ClassIIAntiarrhythmicAgent": { "373278006": ("class II antiarrhythmic agent", [3762]) }, "ClassIIIAntiarrhythmicAgent": { "372855004": ("class III antiarrhythmic agent", [3762]) }, "ClassIVAntiarrhythmicAgent": { "372693007": ("class IV antiarrhythmic agent", [3762]) }, "Classification": {"278201002": ("Classification (attribute)", [])}, "Claudication": {"16973004": ("Claudication", [3220, 3221])}, "Clavicle": { "51299004": ( "Clavicle", [ 4, 4009, 4030, 4031, 4042, 6102, 6109, 6114, 7151, 7155, 7192, 7304, 8134, 9514, 12021, ], ) }, "ClavicularNotchOfSternum": { "75319007": ("Clavicular notch of sternum", [6115, 8134]) }, "ClawnPigBreed": {"133181001": ("Clawn pig breed", [7480])}, "Clear": {"263707001": ("Clear", [6067])}, "ClearingOfTissueSpecimen": { "433452008": ("Clearing of tissue specimen (procedure)", []) }, "Cleavage": {"399161006": ("Cleavage", [4015])}, "CleavageMammographyView": { "399161006": ("Cleavage mammography view (qualifier value)", []) }, "Cleaves": {"399245002": ("Cleaves", [4012])}, "CleavesProjection": {"399245002": ("Cleaves projection (qualifier value)", [])}, "Clements": {"399028002": ("Clements", [4012])}, "ClementsNakayama": {"399320003": ("Clements-Nakayama", [4012])}, "ClementsNakayamaProjection": { "399320003": ("Clements-Nakayama projection (qualifier value)", []) }, "ClementsProjection": {"399028002": ("Clements projection (qualifier value)", [])}, "ClevelandBayHorse": {"41092008": ("Cleveland bay horse (organism)", [])}, "ClevelandBayHorseBreed": {"41092008": ("Cleveland bay horse breed", [7480])}, "ClinicalAllergyDepartment": { "309913004": ("Clinical allergy department (environment)", []) }, "ClinicalBiochemistry": {"310076001": ("Clinical Biochemistry", [7030])}, "ClinicalBiochemistryService": { "310076001": ("Clinical biochemistry service (qualifier value)", []) }, "ClinicalFinding": {"404684003": ("Clinical finding (finding)", [])}, "ClinicalOncology": {"309902002": ("Clinical Oncology", [7030])}, "ClinicalOncologyDepartment": { "309902002": ("Clinical oncology department (environment)", []) }, "ClinicalReport": {"371524004": ("Clinical report (record artifact)", [])}, "ClinicalTargetVolume": { "228792002": ("Clinical target volume (observable entity)", []) }, "Clip": {"77720000": ("Clip", [6040, 6401, 7111, 7112, 7151, 7193])}, "ClipDevice": {"77720000": ("Clip, device (physical object)", [])}, "ClosureOfAtrialSeptalDefect": { "112811009": ("Closure of atrial septal defect (procedure)", []) }, "ClosureOfDuctusArteriosusWithClip": { "233199008": ("Closure of ductus arteriosus with clip", [12247]) }, "Clothing": {"272180002": ("Clothing", [7151, 7158, 7193])}, "ClumberSpaniel": {"67977006": ("Clumber spaniel (organism)", [])}, "ClumberSpanielDogBreed": {"67977006": ("Clumber spaniel dog breed", [7480])}, "ClunForestSheep": {"48697009": ("Clun Forest sheep (organism)", [])}, "ClunForestSheepBreed": {"48697009": ("Clun Forest sheep breed", [7480])}, "ClydesdaleHorse": {"1247002": ("Clydesdale horse (organism)", [])}, "ClydesdaleHorseBreed": {"1247002": ("Clydesdale horse breed", [7480])}, "Cm0": {"1229901006": ("cM0", [6162])}, "CoPigBreed": {"132350007": ("Co pig breed", [7480])}, "Coagulant": {"373746004": ("Coagulant", [10])}, "CoarctationAngioplasty": { "308696000": ("Coarctation angioplasty (procedure)", []) }, "CoarctationOfAorta": {"7305005": ("Coarctation of aorta", [3610, 3630, 12291])}, "CoarctationOfTheAorta": {"7305005": ("Coarctation of the Aorta", [12248, 12249])}, "CoarctationOfTheAortaAngioplastyWithImplantOfStent": { "443829004": ( "Coarctation of the Aorta Angioplasty with Implant of Stent", [12247], ) }, "CoarctationOfTheAortaBalloonAngioplasty": { "308696000": ("Coarctation of the Aorta Balloon Angioplasty", [12247]) }, "CoarsePopcornLikeCalcification": { "129749001": ("Coarse (popcorn-like) calcification", [6010, 6011, 6132]) }, "CoarsePopcornLikeRadiographicCalcification": { "129749001": ("Coarse (popcorn-like) radiographic calcification (finding)", []) }, "CobaltChromiumAlloy": {"256526003": ("Cobalt-chromium alloy", [300])}, "CobbAngle": {"285285000": ("Cobb angle", [218, 7550])}, "CoburgerFuchsschafSheepBreed": { "131736002": ("Coburger Fuchsschaf sheep breed", [7480]) }, "Cocaine": {"387085005": ("Cocaine", [6089])}, "CocaineAbuse": {"78267003": ("Cocaine abuse (disorder)", [])}, "CoccygealVertebraStructure": { "18149002": ("Coccygeal vertebra structure (body structure)", []) }, "CoccygealVertrebrae": {"18149002": ("Coccygeal vertrebrae", [7482, 7483, 8134])}, "Coccyx": { "64688005": ("Coccyx", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "CochinealStain": {"91606004": ("Cochineal stain (substance)", [])}, "CockerSpanielAnySolidColorOtherThanBlack": { "30565000": ("Cocker spaniel, any solid color other than black (organism)", []) }, "CockettPerforatingVein": { "128549006": ( "Cockett's perforating vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "CoiledPosition": {"34108001": ("Coiled position (finding)", [])}, "CoinLesion": {"308689002": ("Coin lesion", [6102, 6104])}, "CoinLesionOfLung": {"308689002": ("Coin lesion of lung (finding)", [])}, "ColNoirDuValaisGoatBreed": { "131688003": ("Col Noir du Valais goat breed", [7480]) }, "ColcherSussman": {"423091003": ("Colcher-Sussman", [4012])}, "ColcherSussmanProjection": { "423091003": ("Colcher-Sussman projection (qualifier value)", []) }, "ColicLymphNode": {"8356004": ("colic lymph node", [7600, 8134])}, "CollateralBranchOfVessel": { "397406000": ("Collateral Branch of vessel", [3496, 7111, 12117]) }, "CollectionOfBloodSpecimenForLaboratory": { "82078001": ("collection of blood specimen for laboratory", [3515]) }, "Collie": {"19078005": ("Collie", [7480])}, "Collimator": {"228761004": ("Collimator", [6040, 6401, 7151, 7193])}, "ColloidalIronStain": {"406952009": ("colloidal iron stain", [8112])}, "ColombianCriolloHorseBreed": { "131804001": ("Colombian Criollo horse breed", [7480]) }, "Colon": { "71854001": ( "Colon", [ 4, 645, 4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514, 10044, 10060, ], ) }, "ColonStructure": {"71854001": ("Colon structure (body structure)", [])}, "ColonicHaustra": {"6533001": ("Colonic haustra", [6201])}, "ColonicIntraluminalFluid": { "442170005": ("Colonic intraluminal fluid (substance)", []) }, "ColorOfFluid": {"250431005": ("Color of fluid (observable entity)", [])}, "ColoradoRangerHorseBreed": {"133098003": ("Colorado Ranger horse breed", [7480])}, "ColorectalSurgery": {"309983005": ("Colorectal Surgery", [7030])}, "ColorectalSurgeryDepartment": { "309983005": ("Colorectal surgery department (environment)", []) }, "ColoredBullTerrier": {"86593006": ("Colored bull terrier (organism)", [])}, "ColoredBullTerrierDogBreed": { "86593006": ("Colored bull terrier dog breed", [7480]) }, "ColorpointShorthairedCat": { "61753003": ("Colorpoint shorthaired cat (organism)", []) }, "ColostomyBag": {"339648008": ("Colostomy bag", [6202, 6203])}, "ColostomySet": {"341036005": ("Colostomy set (physical object)", [])}, "ColourpointShorthairedCat": {"61753003": ("Colourpoint shorthaired cat", [7480])}, "ColumbiaSheepBreed": {"131705005": ("Columbia sheep breed", [7480])}, "CombinedDiagnosticAndTherapeutic": { "371931008": ("Combined diagnostic and therapeutic (procedure)", []) }, "CombinedDiagnosticAndTherapeuticIntent": { "1279505009": ("Combined Diagnostic and Therapeutic Intent", [3629]) }, "CombinedSmallCellCarcinoma": { "21326004": ("Combined small cell carcinoma (morphologic abnormality)", []) }, "ComebackSheepBreed": {"131766009": ("Comeback sheep breed", [7480])}, "Comedocarcinoma": {"78197004": ("Comedocarcinoma (intraductal)", [6030, 6033])}, "ComedocarcinomaNoninfiltrating": { "78197004": ("Comedocarcinoma, noninfiltrating (morphologic abnormality)", []) }, "ComisanaSheepBreed": {"131765008": ("Comisana sheep breed", [7480])}, "CommonAtrioventricularCanal": { "360481003": ("Common atrioventricular canal", [12248, 12249]) }, "CommonAtrium": { "253276007": ( "Common atrium", [4, 3010, 3608, 3630, 4042, 7151, 7192, 8134, 9514, 12284], ) }, "CommonBileDuct": { "79741001": ( "Common bile duct", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 8134, 9514], ) }, "CommonBileDuctStructure": { "79741001": ("Common bile duct structure (body structure)", []) }, "CommonCarotidArtery": { "32062004": ( "Common carotid artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12104, ], ) }, "CommonCarotidArteryStructure": { "32062004": ("Common carotid artery structure (body structure)", []) }, "CommonDuctLymphNode": {"280639005": ("common duct lymph node", [7600, 8134])}, "CommonFemoralArtery": { "181347005": ( "Common Femoral Artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109, ], ) }, "CommonFemoralVein": { "397363009": ( "Common Femoral Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "CommonFemoralVeinStructure": { "397363009": ("Common femoral vein structure (body structure)", []) }, "CommonHepaticArtery": { "66559000": ( "Common Hepatic Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "CommonIliacArtery": { "73634005": ( "Common iliac artery", [ 4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109, 12111, 12125, 12140, ], ) }, "CommonIliacArteryBifurcation": { "413896006": ( "Common iliac artery bifurcation", [1000, 1001, 1005, 3827, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "CommonIliacArteryStructure": { "73634005": ("Common iliac artery structure (body structure)", []) }, "CommonIliacBifurcation": {"413896006": ("Common Iliac Bifurcation", [3837, 7111])}, "CommonIliacVein": { "46027005": ( "Common iliac vein", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110, 12113, 12125], ) }, "CommonNonMitralNonTricuspidAtrioventricularValveStructure": { "312522004": ( "Common non-mitral non-tricuspid Atrioventricular Valve Structure", [12285], ) }, "CommonTruncusArteriosus": { "61959006": ("Common truncus arteriosus (disorder)", []) }, "CommonVentricle": { "45503006": ( "Common ventricle", [4, 3010, 3011, 3609, 3630, 4042, 7151, 7192, 8134, 9514, 12287], ) }, "Complaint": {"1269496002": ("Complaint", [3769])}, "Complaint_Inactive": {"409586006": ("Complaint (finding)", [])}, "Complete": {"255594003": ("Complete", [67])}, "CompleteAtrioventricularBlock": { "27885002": ("Complete atrioventricular block (disorder)", []) }, "CompleteTranspositionOfGreatVessels": { "26146002": ("Complete transposition of great vessels", [12248, 12249]) }, "ComplicatedAtheromatousPlaque": { "74937006": ("complicated atheromatous plaque", [3817]) }, "ComplicationOfProcedure": {"116224001": ("Complication of Procedure", [7002])}, "ComponentOfOpticalMicroscope": { "445316008": ("Component of optical microscope (physical object)", []) }, "CompositeHemodynamicMeasurementMethod": { "128577002": ("Composite hemodynamic measurement method", [3241]) }, "CompositeHemodynamicMeasurementMethodRegimeTherapy": { "128577002": ("Composite hemodynamic measurement method (regime/therapy)", []) }, "Compression": {"71173004": ("compression", [3805])}, "CompressionAction": {"263720003": ("Compression - action", [94])}, "CompressionPaddle": { "129460009": ("Compression paddle", [6040, 6401, 7151, 7193]) }, "CompressionPaddleDevice": { "129460009": ("Compression paddle, device (physical object)", []) }, "ComputedHemodynamicMeasurementMethod": { "128576006": ("Computed hemodynamic measurement method", [3241]) }, "ComputedHemodynamicMeasurementMethodRegimeTherapy": { "128576006": ("Computed hemodynamic measurement method (regime/therapy)", []) }, "ComputedTomography": {"77477000": ("Computed tomography", [10005])}, "ComputedTomographyAngiographyOfCoronaryArteries": { "419545005": ( "Computed tomography angiography of coronary arteries (procedure)", [], ) }, "ComputedTomographyGuidedBiopsy": { "277591006": ("Computed tomography guided biopsy", [6058, 6060]) }, "ComputedTomographyOfAbdominalAorta": { "241553009": ("Computed tomography of abdominal aorta (procedure)", []) }, "ComputedTomographyOfAbdominalAortaWithContrast": { "444968003": ( "Computed tomography of abdominal aorta with contrast (procedure)", [], ) }, "ComputedTomographyOfBreast": { "241539009": ("Computed tomography of breast (procedure)", []) }, "ComputedTomographyOfCardiovascularSystem": { "303680000": ("Computed tomography of cardiovascular system (procedure)", []) }, "ComputedTomographyOfHead": { "303653007": ("Computed tomography of head (procedure)", []) }, "ComputedTomographyOfHeart": { "241547009": ("Computed tomography of heart (procedure)", []) }, "ComputedTomographyWithoutContrast": { "399331006": ("Computed tomography without contrast (procedure)", []) }, "ComputerAssistedImageAnalysisForAsymmetricBreastTissue": { "133889002": ( "Computer assisted image analysis for asymmetric breast tissue (procedure)", [], ) }, "ComputerAssistedImageAnalysisForBreastCompositionAnalysis": { "133890006": ( "Computer assisted image analysis for breast composition analysis (procedure)", [], ) }, "ComputerAssistedImageAnalysisForFocalAsymmetricDensity": { "133888005": ( "Computer assisted image analysis for focal asymmetric density (procedure)", [], ) }, "ComputerAssistedImageAnalysisForImageQuality": { "133887000": ( "Computer assisted image analysis for image quality (procedure)", [], ) }, "ComputerAssistedImageAnalysisForSpatialCollocation": { "133884007": ( "Computer assisted image analysis for spatial collocation (procedure)", [], ) }, "ComputerAssistedImageAnalysisForSpatialProximity": { "133885008": ( "Computer assisted image analysis for spatial proximity (procedure)", [], ) }, "ComputerAssistedImageAnalysisForTemporalCorrelation": { "133886009": ( "Computer assisted image analysis for temporal correlation (procedure)", [], ) }, "ComputerizedAxialTomography": { "77477000": ("Computerized axial tomography (procedure)", []) }, "ComputerizedTomographyService": { "310128004": ("Computerized Tomography Service", [7030]) }, "ComtoisHorseBreed": {"131805000": ("Comtois horse breed", [7480])}, "ConcaveContactFundusLens": {"409783000": ("Concave contact fundus lens", [4205])}, "ConcaveNoncontactFundusLens": { "410688004": ("Concave noncontact fundus lens", [4205]) }, "Concentric": {"255465008": ("Concentric", [3491, 3806])}, "CondenserAnnulus": {"445634000": ("Condenser annulus", [8124])}, "CondenserAnnulusOfOpticalMicroscope": { "445634000": ("Condenser annulus of optical microscope (physical object)", []) }, "Condition": {"260905004": ("Condition (attribute)", [])}, "ConductanceCatheterMethod": {"133910006": ("Conductance catheter method", [3241])}, "ConductionDisorderOfTheHeart": { "44808001": ("Arrhythmia", [3201, 3221, 3413, 3727, 3755, 3756, 12246]) }, "ConeBeamAcquisition": {"702569007": ("Cone Beam Acquisition", [10013])}, "ConeBeamComputedTomography": { "717193008": ("Cone beam computed tomography", [10005]) }, "ConeBeamComputedTomographyImagingAction": { "702569007": ( "Cone beam computed tomography imaging - action (qualifier value)", [], ) }, "ConfocalScanningLaserOphthalmoscope": { "392004000": ("Confocal Scanning Laser Ophthalmoscope", [4210]) }, "CongenitalAnomalyOfCardiovascularSystem": { "9904008": ("Congenital anomaly of cardiovascular system (disorder)", []) }, "CongenitalCoronaryArteryFistulaToLeftAtrium": { "128555001": ( "Congenital coronary artery fistula to left atrium", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "CongenitalCoronaryArteryFistulaToLeftVentricle": { "128556000": ( "Congenital coronary artery fistula to left ventricle", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "CongenitalCoronaryArteryFistulaToRightAtrium": { "128557009": ( "Congenital coronary artery fistula to right atrium", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "CongenitalCoronaryArteryFistulaToRightVentricle": { "128558004": ( "Congenital coronary artery fistula to right ventricle", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "CongenitalHeartDisease": {"13213009": ("Congenital heart disease", [12246])}, "CongenitalPulmonaryArteryConduit": { "128584005": ("Congenital pulmonary artery conduit (disorder)", []) }, "CongenitalPulmonaryVeinConfluence": { "128566008": ("Congenital pulmonary vein confluence (disorder)", []) }, "CongenitalPulmonaryVenousAtrium": { "128567004": ("Congenital pulmonary venous atrium (disorder)", []) }, "CongenitalStenosisOfAorticValve": { "18546004": ("Congenital stenosis of aortic valve", [12248, 12249]) }, "CongenitalSystemicVenousAtrium": { "128568009": ("Congenital systemic venous atrium (disorder)", []) }, "CongestiveCardiomyopathy": { "399020009": ("Congestive cardiomyopathy", [3700, 3728]) }, "CongestiveHeartFailure": { "42343007": ("Congestive heart failure", [3413, 3700, 3755]) }, "CongoRedStain": {"45106005": ("Congo red stain", [8112])}, "Conjunctiva": {"29445007": ("Conjunctiva", [4209, 4211, 8134])}, "ConjunctivalStructure": { "29445007": ("Conjunctival structure (body structure)", []) }, "ConnectiveTissue": { "21793004": ("Connective tissue", [645, 7151, 7166, 7191, 8134]) }, "ConnectiveTissueStructure": { "21793004": ("Connective tissue structure (body structure)", []) }, "ConnemaraPonyHorseBreed": {"133097008": ("Connemara Pony horse breed", [7480])}, "ConnorPrairiePig": {"29881002": ("Connor prairie pig (organism)", [])}, "ConnorPrairiePigBreed": {"29881002": ("Connor prairie pig breed", [7480])}, "ConstrictedPupil": {"301939004": ("Constricted Pupil", [4222])}, "ConstrictivePericarditis": { "85598007": ("Constrictive pericarditis", [3700, 3728]) }, "ConstructionOfConduitRightAtriumToPulmonaryTrunk": { "233022006": ( "Construction of conduit - right atrium to pulmonary trunk (procedure)", [], ) }, "ConstructionOfLVToAortaTunnelWRVToPAValvedConduit": { "429620002": ( "Construction of LV to aorta tunnel w RV to PA valved conduit", [12247], ) }, "ConstructionOfLeftVentricleToAortaTunnelWithRightVentricleToPulmonaryArteryValvedConduit": { "429620002": ( "Construction of left ventricle to aorta tunnel with right ventricle to pulmonary artery " "valved conduit (procedure)", [], ) }, "Consultant": {"309390008": ("Consultant", [7450, 7452])}, "ContactFundusLens": {"410686000": ("Contact fundus lens", [4205])}, "ContactWith": {"11723008": ("Contact with", [5])}, "ContactWithContextualQualifier": { "11723008": ("Contact with (contextual qualifier) (qualifier value)", []) }, "Continuous": {"255238004": ("Continuous", [6091])}, "ContinuousElectrocardiogramMonitoring": { "266706003": ("Continuous electrocardiogram monitoring (procedure)", []) }, "ContinuousFlowApneicVentilation": { "1260411001": ("Continuous flow apneic ventilation", [619, 620]) }, "ContinuousFlowVentilation": { "243156001": ("Continuous flow ventilation (procedure)", []) }, "Contraceptives": {"108899006": ("Contraceptives", [6080])}, "Contraindicated": {"373147003": ("Contraindicated", [3741, 3742, 3743])}, "Contralateral": {"255209002": ("Contralateral", [246])}, "ContrastAgent": {"7140000": ("Contrast agent", [12, 3850, 6040, 6402, 7198])}, "ContrastEchocardiography": {"433231002": ("Contrast echocardiography", [12001])}, "ContrastMedia": {"385420005": ("Contrast media", [6201, 7111, 7112])}, "ContrastMediaAdverseReaction": { "292095005": ("Contrast media adverse reaction", [3413, 3755]) }, "ContrastMediaAllergy": {"293637006": ("Contrast Media Allergy", [1200, 1201])}, "ContrastMediaSeenInPlaque": { "413912008": ("Contrast media seen in plaque (finding)", []) }, "ContrastMediumInjectionSystemManifoldKit": { "467354001": ( "Contrast medium injection system manifold kit (physical object)", [], ) }, "ControlledVentilation": {"243147009": ("Controlled Ventilation", [617, 618])}, "ConvergentGaze": {"408745006": ("Convergent gaze", [4201])}, "ConvexContactFundusLens": {"410689007": ("Convex contact fundus lens", [4205])}, "ConvexNoncontactFundusLens": { "410687009": ("Convex noncontact fundus lens", [4205]) }, "Coonhound": {"73319009": ("Coonhound", [7480])}, "CoopworthSheepBreed": {"131764007": ("Coopworth sheep breed", [7480])}, "Copper": {"66925006": ("Copper", [10006, 10067])}, "Copper62LabeledPyruvaldehydeBisN4MethylThiosemicarbazone": { "422789008": ( "Copper^62^ labeled pyruvaldehyde-bis N-(4)-methyl-thiosemicarbazone (product)", [], ) }, "Copper64Acetate": {"78686003": ("Copper^64^ acetate", [25])}, "Copper64LabeledDiacetylBisN4Methylthiosemicarbazone": { "422855001": ( "Copper^64^ labeled diacetyl-bis N-(4)-methylthiosemicarbazone (product)", [], ) }, "Copper64Versenate": {"88166005": ("Copper^64^ versenate", [25])}, "Copper67Ceruloplasmin": {"29460005": ("Copper^67^ ceruloplasmin", [25])}, "CorTriatriatumOrifice": {"443445009": ("Cor Triatriatum Orifice", [12283])}, "CorTriloculareBiventriculare": { "253276007": ("Cor triloculare biventriculare (disorder)", []) }, "CoracoidProcessOfScapula": { "8931003": ("Coracoid process of scapula", [6115, 8134]) }, "CoreBodyTemperatureMeasuredInRectum": { "307047009": ( "Core body temperature measured in rectum (observable entity)", [], ) }, "CoreNeedleBiopsyOfBreast": { "44578009": ("Core needle biopsy of breast", [6050, 6083]) }, "CoreSampleOfTissueBlock": {"430970004": ("Core sample of tissue block", [8103])}, "CoreSampling": {"434479002": ("Core sampling", [8110])}, "CoreSamplingOfTissueBlock": { "434479002": ("Core sampling of tissue block (procedure)", []) }, "CoriphosphineStain": {"49687009": ("coriphosphine stain", [8112])}, "CormoSheepBreed": {"131753009": ("Cormo sheep breed", [7480])}, "Cornea": { "28726007": ( "Cornea", [4, 4029, 4209, 4211, 4233, 4266, 7151, 7192, 8134, 9514], ) }, "CornealEndothelium": {"65431007": ("Corneal endothelium", [4211, 8134])}, "CornealEpithelium": {"15775008": ("Corneal epithelium", [4211, 8134])}, "CornealOpacity": {"64634000": ("Corneal Opacity", [4222])}, "CornealStructure": {"28726007": ("Corneal structure (body structure)", [])}, "CornishRexCatBreed": {"56917006": ("Cornish rex cat breed", [7480])}, "Coronal": {"81654009": ("Coronal", [2, 6, 26, 501, 502, 6312])}, "CoronaryAngiography": {"33367005": ("Coronary angiography (procedure)", [])}, "CoronaryArteriography": {"33367005": ("Coronary Arteriography", [3405, 3428])}, "CoronaryArteriosclerosis": { "53741008": ("Coronary arteriosclerosis (disorder)", []) }, "CoronaryArtery": { "41801008": ( "Coronary artery", [4, 3010, 3604, 3606, 3630, 4030, 4042, 7151, 7192, 8134, 9514], ) }, "CoronaryArteryBypassGraft": { "232717009": ("Coronary artery bypass graft", [3721, 3764]) }, "CoronaryArteryBypassGrafting": { "232717009": ("Coronary artery bypass grafting (procedure)", []) }, "CoronaryArteryCalciumScore": { "450360000": ("Coronary artery calcium score", [6142]) }, "CoronaryArteryDisease": { "53741008": ("Coronary Artery Disease", [3201, 3700, 12246]) }, "CoronaryArteryFeature": { "364092001": ("Coronary artery feature (observable entity)", []) }, "CoronaryArteryFistulaToRightAtrium": { "373095005": ("Coronary artery fistula to right atrium (disorder)", []) }, "CoronaryArteryGraft": { "264293000": ( "Coronary artery graft", [ 1000, 1001, 1004, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, ], ) }, "CoronaryArteryStructure": { "41801008": ("Coronary artery structure (body structure)", []) }, "CoronaryBypassGraftAngiography": { "252427007": ("Coronary bypass graft angiography (procedure)", []) }, "CoronarySinus": { "90219004": ( "Coronary sinus", [4, 3010, 3011, 3608, 3630, 3827, 3839, 4042, 7151, 7192, 8134, 9514], ) }, "CoronarySinusStructure": { "90219004": ("Coronary sinus structure (body structure)", []) }, "CorpusCallosum": { "88442005": ("Corpus callosum", [7151, 7153, 7192, 7705, 7710, 8134, 9514]) }, "CorpusCallosumStructure": { "88442005": ("Corpus callosum structure (body structure)", []) }, "CorpusStriatum": {"31428008": ("Corpus striatum", [7151, 7153, 7192, 8134, 9514])}, "CorpusStriatumStructure": { "31428008": ("Corpus striatum structure (body structure)", []) }, "CorrectedTranspositionOfGreatVessels": { "83799000": ("Corrected transposition of great vessels", [12248, 12249]) }, "CorrectionOfCongenitalCardiovascularDeformity": { "428613004": ("Correction of congenital cardiovascular deformity", [3721]) }, "CorrectionOfVentricularSeptalDefect": { "76025005": ("Correction of ventricular septal defect", [12247]) }, "CorriedaleSheep": {"67515002": ("Corriedale sheep (organism)", [])}, "CorriedaleSheepBreed": {"67515002": ("Corriedale sheep breed", [7480])}, "CorrienteCattleBreed": {"131586006": ("Corriente cattle breed", [7480])}, "CorsicanCattleBreed": {"133361005": ("Corsican cattle breed", [7480])}, "CorsicanGoatBreed": {"131649000": ("Corsican goat breed", [7480])}, "CorsicanHorseBreed": {"131806004": ("Corsican horse breed", [7480])}, "CorsicanPigBreed": {"132123009": ("Corsican pig breed", [7480])}, "CorticospinalTractInBrainstem": { "360568007": ("corticospinal tract in brainstem", [7701, 7710, 8134]) }, "CosentinaPigBreed": {"132180009": ("Cosentina pig breed", [7480])}, "CostaRicanSaddleHorseHorseBreed": { "131807008": ("Costa Rican Saddle Horse horse breed", [7480]) }, "CostalCartilage": { "50016007": ( "Costal Cartilage", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "CostalGroove": {"17399006": ("Costal groove", [6115, 8134])}, "CostenoHorseBreed": {"131808003": ("Costeno horse breed", [7480])}, "CosteñoConCuernosCattleBreed": { "131587002": ("Costeño con Cuernos cattle breed", [7480]) }, "CostocervicalTrunk": { "3159004": ("Costocervical trunk", [6102, 6109, 6117, 7151, 7192, 8134, 9514]) }, "CotonDeTuléarDogBreed": {"132489000": ("Coton de Tuléar dog breed", [7480])}, "Cotswold16PigBreed": {"132016006": ("Cotswold 16 pig breed", [7480])}, "Cotswold29PigBreed": {"132017002": ("Cotswold 29 pig breed", [7480])}, "Cotswold90PigBreed": {"132018007": ("Cotswold 90 pig breed", [7480])}, "CotswoldGoldPigBreed": {"132014009": ("Cotswold Gold pig breed", [7480])}, "CotswoldPlatinumPigBreed": {"132015005": ("Cotswold Platinum pig breed", [7480])}, "CotswoldSheep": {"67414001": ("Cotswold sheep (organism)", [])}, "CotswoldSheepBreed": {"67414001": ("Cotswold sheep breed", [7480])}, "Cough": {"49727002": ("Cough", [60, 9300])}, "CouinaudHepaticSegmentI": { "71133005": ( "Couinaud hepatic segment I", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentII": { "277956007": ( "Couinaud hepatic segment II", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentIII": { "277957003": ( "Couinaud hepatic segment III", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentIV": { "277958008": ( "Couinaud hepatic segment IV", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentV": { "277959000": ( "Couinaud hepatic segment V", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentVI": { "277960005": ( "Couinaud hepatic segment VI", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentVII": { "277961009": ( "Couinaud hepatic segment VII", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "CouinaudHepaticSegmentVIII": { "277962002": ( "Couinaud hepatic segment VIII", [7151, 7154, 7170, 7171, 7192, 8134, 9514, 12322], ) }, "Cranial": {"66787007": ("Cranial", [5])}, "CranialCavity": {"1101003": ("Cranial Cavity", [7140])}, "CranialCavityStructure": { "1101003": ("Cranial cavity structure (body structure)", []) }, "CranialLAO": {"408723005": ("Cranial LAO", [3466])}, "CranialLeftAnteriorObliqueProjection": { "408723005": ("Cranial left anterior oblique projection (qualifier value)", []) }, "CranialNerve": {"25238003": ("Cranial nerve", [7151, 7167, 7192, 8134, 9514])}, "CranialNerveStructure": { "25238003": ("Cranial nerve structure (body structure)", []) }, "CranialRAO": {"408725003": ("Cranial RAO", [3466])}, "CranialRightAnteriorObliqueProjection": { "408725003": ("Cranial right anterior oblique projection (qualifier value)", []) }, "CranialSubarachnoidSpace": {"33930006": ("Cranial Subarachnoid Space", [7140])}, "CranialVenousSystem": { "128320002": ("Cranial venous system", [4, 4030, 7151, 7192, 8134, 9514]) }, "CranioCaudal": {"399162004": ("cranio-caudal", [501, 4010, 4014])}, "CranioCaudalExaggeratedLaterally": { "399192008": ("cranio-caudal exaggerated laterally", [4014]) }, "CranioCaudalExaggeratedMedially": { "399101009": ("cranio-caudal exaggerated medially", [4014]) }, "CranioCaudalProjection": { "399162004": ("Cranio-caudal projection (qualifier value)", []) }, "CranioCaudalProjectionExaggeratedLaterally": { "399192008": ( "Cranio-caudal projection exaggerated laterally (qualifier value)", [], ) }, "CranioCaudalProjectionExaggeratedMedially": { "399101009": ( "Cranio-caudal projection exaggerated medially (qualifier value)", [], ) }, "Creatine": {"14804005": ("Creatine", [218, 4032, 4033, 7180, 7186, 7469])}, "CreationOfConduitBetweenRightVentricleAndPulmonaryArtery": { "44777001": ( "Creation of conduit between right ventricle and pulmonary artery (procedure)", [], ) }, "CreationOfConduitRightAtriumToPulmonaryTrunk": { "233022006": ("Creation of conduit right atrium to pulmonary trunk", [12247]) }, "CreoleAntillesGoatBreed": {"131658007": ("Creole Antilles goat breed", [7480])}, "CresylEchtVioletStain": {"406960005": ("cresyl echt violet stain", [8112])}, "CresylVioletStain": {"406959000": ("cresyl violet stain", [8112])}, "CretanLowlandCattleBreed": {"133362003": ("Cretan Lowland cattle breed", [7480])}, "CretanMountainCattleBreed": { "133363008": ("Cretan Mountain cattle breed", [7480]) }, "CribriformCarcinoma": { "30156004": ("Cribriform carcinoma (morphologic abnormality)", []) }, "CriolloCattleBreed": {"83996001": ("Criollo cattle breed (organism)", [])}, "CriolloCowBreed": {"83996001": ("Criollo cow breed", [7480])}, "CriolloHorseBreed": {"133095000": ("Criollo horse breed", [7480])}, "CriolloSheepBreed": {"131752004": ("Criollo sheep breed", [7480])}, "CriouloHorseBreed": {"133028006": ("Crioulo horse breed", [7480])}, "CroatianRedCattleBreed": {"133364002": ("Croatian Red cattle breed", [7480])}, "CryotherapyToSkinLesion": {"302396003": ("Cryotherapy to skin lesion", [4409])}, "CrystalPonceauStain": {"68459007": ("crystal ponceau stain", [8112])}, "CrystallineLens": {"247049005": ("Crystalline lens", [4231])}, "CrystallineLensFinding": {"247049005": ("Crystalline lens finding (finding)", [])}, "CréoleAntillesGoatBreed": { "131658007": ("Créole Antilles goat breed (organism)", []) }, "CréolePigBreed": {"132124003": ("Créole pig breed", [7480])}, "CubanCriolloCattleBreed": { "133798008": ("Cuban Criollo cattle breed (organism)", []) }, "CubanCriolloXZebuCattleBreed": { "133798008": ("Cuban Criollo X zebu cattle breed", [7480]) }, "CubanPasoHorseBreed": {"131809006": ("Cuban Paso horse breed", [7480])}, "CubanPintoHorseBreed": {"133105008": ("Cuban Pinto horse breed", [7480])}, "CubanTrotterHorseBreed": {"131910000": ("Cuban Trotter horse breed", [7480])}, "CubanZebuCattleBreed": {"133799000": ("Cuban Zebu cattle breed (organism)", [])}, "CubanZebuXZebuCattleBreed": { "133799000": ("Cuban Zebu X zebu cattle breed", [7480]) }, "CubitalLymphNode": {"34775006": ("cubital lymph node", [7600, 8134])}, "CuinoPigBreed": {"132181008": ("Cuino pig breed", [7480])}, "CukurovaCattleBreed": {"133365001": ("Cukurova cattle breed", [7480])}, "CukurovaHorseBreed": {"132736000": ("Cukurova horse breed", [7480])}, "Culprit": {"371895000": ("Culprit", [3712])}, "CulpritLesion": {"371895000": ("Culprit Lesion", [3487])}, "CulpritLesionOfCoronaryArtery": { "371895000": ("Culprit lesion of coronary artery (finding)", []) }, "CupremHybridCattleBreed": {"131463002": ("Cuprem Hybrid cattle breed", [7480])}, "CurativeIntent": {"373808002": ("Curative intent", [3629])}, "CurativeProcedureIntent": { "373808002": ("Curative - procedure intent (qualifier value)", []) }, "CurcuminStain": {"89028002": ("curcumin stain", [8112])}, "CurledUp": {"34108001": ("curled-up", [20])}, "CurlyCoatedRetriever": {"38449002": ("Curly-coated retriever (organism)", [])}, "CurlyCoatedRetrieverDogBreed": { "38449002": ("Curly-coated retriever dog breed", [7480]) }, "CurraleiroCattleBreed": {"133366000": ("Curraleiro cattle breed", [7480])}, "CurrentSmoker": {"77176002": ("Current Smoker", [3724])}, "CutchiCattleBreed": {"133645000": ("Cutchi cattle breed", [7480])}, "CuttingBalloonAngioplastyCBADevice": { "371794009": ("Cutting Balloon Angioplasty (CBA) Device", [3411, 3429]) }, "CuttingBalloonAngioplastyDevice": { "371794009": ("Cutting balloon angioplasty device (physical object)", []) }, "CyanocobalaminCo57": {"187006": ("Cyanocobalamin Co^57^", [25])}, "CyanocobalaminCo58": {"5692007": ("Cyanocobalamin Co^58^", [25])}, "CyanocobalaminCo60": {"72159005": ("Cyanocobalamin Co^60^", [25])}, "Cyanosis": {"3415004": ("Cyanosis", [12248, 12249])}, "Cyclopentolate": {"8348002": ("Cyclopentolate", [4208])}, "CylindroidAneurysm": {"52856002": ("cylindroid aneurysm", [3808])}, "CyprusCattleBreed": {"133367009": ("Cyprus cattle breed", [7480])}, "Cyst": {"367643001": ("Cyst", [6335, 6336, 6337, 6338, 7151, 7159, 7194])}, "CystOfBreast": {"399294002": ("Cyst of breast", [6030, 6031, 6054, 6064])}, "Cystadenocarcinoma": {"21008007": ("Cystadenocarcinoma", [638, 639])}, "CysticAdventitialDisease": {"234021009": ("cystic adventitial disease", [3805])}, "CysticLymphNode": {"280556009": ("cystic lymph node", [7600, 8134])}, "CysticMedialNecrosis": { "42182000": ("Cystic medial necrosis (morphologic abnormality)", []) }, "CysticMedicalNecrosis": {"42182000": ("cystic medical necrosis", [3817])}, "Cytokine": {"75777003": ("Cytokine", [637])}, "Cytology": {"310200001": ("Cytology", [7030])}, "CytologyService": {"310200001": ("Cytology service (qualifier value)", [])}, "CytotoxicAgent": {"373526007": ("Cytotoxic agent", [4410])}, "CzechColdbloodHorseBreed": {"132737009": ("Czech Coldblood horse breed", [7480])}, "CzechImprovedWhitePigBreed": { "133215008": ("Czech Improved White pig breed", [7480]) }, "CzechMeatPigBreed": {"133222000": ("Czech Meat pig breed", [7480])}, "CzechMiniaturePigBreed": {"133223005": ("Czech Miniature pig breed", [7480])}, "CzechPiedCattleBreed": {"133368004": ("Czech Pied cattle breed", [7480])}, "CzechWarmbloodHorseBreed": {"131915005": ("Czech Warmblood horse breed", [7480])}, "CzechoslovakianSmallRidingHorseHorseBreed": { "132738004": ("Czechoslovakian Small Riding Horse horse breed", [7480]) }, "CãoDaSerraDeAiresDogBreed": { "132417006": ("Cão da Serra de Aires dog breed", [7480]) }, "CãoDeCastroLaboreiroDogBreed": { "132418001": ("Cão de Castro Laboreiro dog breed", [7480]) }, "CãoDeFilaMiguelDogBreed": {"132419009": ("Cão de Fila Miguel dog breed", [7480])}, "DBIPigBreed": {"132328006": ("DBI pig breed", [7480])}, "DHSPlate": {"257327003": ("DHS Plate", [7307, 7309])}, "DKPig30PigBreed": {"41561001": ("DK pig 30 pig breed", [7480])}, "DKPig31PigBreed": {"36570001": ("DK pig 31 pig breed", [7480])}, "DKPig33PigBreed": {"6053007": ("DK pig 33 pig breed", [7480])}, "DKPig51PigBreed": {"8516002": ("DK pig 51 pig breed", [7480])}, "DKPig61PigBreed": {"61973002": ("DK pig 61 pig breed", [7480])}, "DKPig63PigBreed": {"112490000": ("DK pig 63 pig breed", [7480])}, "DKPig77PigBreed": {"11161001": ("DK pig 77 pig breed", [7480])}, "DKPigBreed": {"74921000": ("DK pig breed", [7480])}, "DLSSheepBreed": {"132855006": ("DLS sheep breed", [7480])}, "DRUTMTerminalsPigBreed": { "132209001": ("DRU (TM) Terminals pig breed (organism)", []) }, "DRUTerminalsPigBreed": {"132209001": ("DRU™ Terminals pig breed", [7480])}, "DabieshanCattleBreed": {"131464008": ("Dabieshan cattle breed", [7480])}, "DachshundMiniatureBreed": { "132369002": ("Dachshund, Miniature breed (organism)", []) }, "DachshundMiniatureDogBreed": { "132369002": ("Dachshund, Miniature dog breed", [7480]) }, "DachshundSuperbreedOfDog": {"2062007": ("Dachshund superbreed of dog", [7480])}, "DaeraDinPanahGoatBreed": {"131653003": ("Daera Din Panah goat breed", [7480])}, "DagestanMountainCattleBreed": { "133369007": ("Dagestan Mountain cattle breed", [7480]) }, "DahePigBreed": {"132152007": ("Dahe pig breed", [7480])}, "DairyShorthornCattleBreed": { "133370008": ("Dairy Shorthorn cattle breed", [7480]) }, "DairySyntheticCattleBreed": { "133371007": ("Dairy Synthetic cattle breed", [7480]) }, "DairyZebuOfUberabaCattleBreed": { "133646004": ("Dairy Zebu of Uberaba cattle breed", [7480]) }, "DajalCattleBreed": {"133602007": ("Dajal cattle breed", [7480])}, "DalaSheepBreed": {"131751006": ("Dala sheep breed", [7480])}, "DalesPonyHorseBreed": {"133099006": ("Dales Pony horse breed", [7480])}, "DalesbredSheepBreed": {"131750007": ("Dalesbred sheep breed", [7480])}, "Dalland020PigBreed": {"132206008": ("Dalland 020 pig breed", [7480])}, "Dalland030PigBreed": {"132050002": ("Dalland 030 pig breed", [7480])}, "Dalland080PigBreed": {"132171009": ("Dalland 080 pig breed", [7480])}, "DalmatianDog": {"5916008": ("Dalmatian dog", [7480])}, "DamaniGoatBreed": {"131689006": ("Damani goat breed", [7480])}, "DamaniSheepBreed": {"131749007": ("Damani sheep breed", [7480])}, "DamaraCattleBreed": {"131465009": ("Damara cattle breed", [7480])}, "DamaraSheepBreed": {"131748004": ("Damara sheep breed", [7480])}, "DamascusCattleBreed": {"131588007": ("Damascus cattle breed", [7480])}, "DamiettaCattleBreed": {"131432001": ("Damietta cattle breed", [7480])}, "DamusStanselKayeOperation": { "233134001": ("Damus-Stansel-Kaye operation", [12247]) }, "DanakilCattleBreed": {"131466005": ("Danakil cattle breed", [7480])}, "DandieDinmontTerrier": {"3347005": ("Dandie dinmont terrier", [7480])}, "DaneliusMiller": {"424811006": ("Danelius-Miller", [4012])}, "DaneliusMillerProjection": { "424811006": ("Danelius-Miller projection (qualifier value)", []) }, "DangiCattleBreed": {"133603002": ("Dangi cattle breed", [7480])}, "DanishBroholmerDogBreed": {"132491008": ("Danish Broholmer dog breed", [7480])}, "DanishDurocPigBreed": {"132265005": ("Danish Duroc pig breed", [7480])}, "DanishHampshirePigBreed": {"132266006": ("Danish Hampshire pig breed", [7480])}, "DanishJerseyCattleBreed": {"133580006": ("Danish Jersey cattle breed", [7480])}, "DanishLandraceGoatBreed": {"131661008": ("Danish Landrace goat breed", [7480])}, "DanishLandracePig": {"84528008": ("Danish landrace pig (organism)", [])}, "DanishLandracePigBreed": {"84528008": ("Danish landrace pig breed", [7480])}, "DanishLandraceSheepBreed": {"131737006": ("Danish Landrace sheep breed", [7480])}, "DanishLargeWhitePigBreed": {"132264009": ("Danish Large White pig breed", [7480])}, "DanishOldenborgHorseBreed": { "132779003": ("Danish Oldenborg horse breed", [7480]) }, "DanishRedCattleBreed": {"131589004": ("Danish Red cattle breed", [7480])}, "DanishRedPiedCattleBreed": {"133372000": ("Danish Red Pied cattle breed", [7480])}, "DanishSportPonyHorseBreed": { "132757008": ("Danish Sport Pony horse breed", [7480]) }, "DanishWarmbloodHorseBreed": { "131819000": ("Danish Warmblood horse breed", [7480]) }, "DanubeWhitePigBreed": {"133193005": ("Danube White pig breed", [7480])}, "DanubianHorseBreed": {"131919004": ("Danubian horse breed", [7480])}, "DarkfieldStop": {"445624009": ("Darkfield stop", [8124])}, "DarkfieldStopOfOpticalMicroscope": { "445624009": ("Darkfield stop of optical microscope (physical object)", []) }, "DartmoorPonyHorseBreed": {"133027001": ("Dartmoor Pony horse breed", [7480])}, "DartmoorSheepBreed": {"131717007": ("Dartmoor sheep breed", [7480])}, "DashtiariCattleBreed": {"133647008": ("Dashtiari cattle breed", [7480])}, "DatongHorseBreed": {"131935006": ("Datong horse breed", [7480])}, "DaweiziPigBreed": {"132295002": ("Daweizi pig breed", [7480])}, "DeSénarmontCompensator": {"445663002": ("de Sénarmont compensator", [8124])}, "DeSénarmontCompensatorOfOpticalMicroscope": { "445663002": ( "de Sénarmont compensator of optical microscope (physical object)", [], ) }, "Dead": {"419099009": ("Dead (finding)", [])}, "DebouilletSheep": {"44835005": ("Debouillet sheep (organism)", [])}, "DebouilletSheepBreed": {"44835005": ("Debouillet sheep breed", [7480])}, "Deceased": {"419099009": ("Deceased", [3772])}, "DeciduousMandibularLeftCanineTooth": { "43281008": ("Deciduous mandibular left canine tooth", [4019, 4026]) }, "DeciduousMandibularLeftCentralIncisorTooth": { "89552004": ("Deciduous mandibular left central incisor tooth", [4019, 4026]) }, "DeciduousMandibularLeftFirstMolarTooth": { "38896004": ("Deciduous mandibular left first molar tooth", [4019, 4026]) }, "DeciduousMandibularLeftLateralIncisorTooth": { "14770005": ("Deciduous mandibular left lateral incisor tooth", [4019, 4026]) }, "DeciduousMandibularLeftSecondMolarTooth": { "49330006": ("Deciduous mandibular left second molar tooth", [4019, 4026]) }, "DeciduousMandibularRightCanineTooth": { "6062009": ("Deciduous mandibular right canine tooth", [4019, 4026]) }, "DeciduousMandibularRightCentralIncisorTooth": { "67834006": ("Deciduous mandibular right central incisor tooth", [4019, 4026]) }, "DeciduousMandibularRightFirstMolarTooth": { "58646007": ("Deciduous mandibular right first molar tooth", [4019, 4026]) }, "DeciduousMandibularRightLateralIncisorTooth": { "22445006": ("Deciduous mandibular right lateral incisor tooth", [4019, 4026]) }, "DeciduousMandibularRightSecondMolarTooth": { "61868007": ("Deciduous mandibular right second molar tooth", [4019, 4026]) }, "DeciduousMaxillaryLeftCanineTooth": { "73937000": ("Deciduous maxillary left canine tooth", [4019, 4026]) }, "DeciduousMaxillaryLeftCentralIncisorTooth": { "51678005": ("Deciduous maxillary left central incisor tooth", [4019, 4026]) }, "DeciduousMaxillaryLeftFirstMolarTooth": { "45234009": ("Deciduous maxillary left first molar tooth", [4019, 4026]) }, "DeciduousMaxillaryLeftLateralIncisorTooth": { "43622005": ("Deciduous maxillary left lateral incisor tooth", [4019, 4026]) }, "DeciduousMaxillaryLeftSecondMolarTooth": { "51943008": ("Deciduous maxillary left second molar tooth", [4019, 4026]) }, "DeciduousMaxillaryRightCanineTooth": { "30618001": ("Deciduous maxillary right canine tooth", [4019, 4026]) }, "DeciduousMaxillaryRightCentralIncisorTooth": { "88824007": ("Deciduous maxillary right central incisor tooth", [4019, 4026]) }, "DeciduousMaxillaryRightFirstMolarTooth": { "17505006": ("Deciduous maxillary right first molar tooth", [4019, 4026]) }, "DeciduousMaxillaryRightLateralIncisorTooth": { "65624003": ("Deciduous maxillary right lateral incisor tooth", [4019, 4026]) }, "DeciduousMaxillaryRightSecondMolarTooth": { "27855007": ("Deciduous maxillary right second molar tooth", [4019, 4026]) }, "Decongestant": {"96328007": ("Decongestant", [621, 622])}, "DecongestantPreparation": {"96328007": ("Decongestant preparation (product)", [])}, "DecreaseInNumberOfCalcifications": { "129727007": ("Decrease in number of calcifications", [6002, 6003]) }, "DecreaseInNumberOfCalcificationsSincePreviousMammogram": { "129727007": ( "Decrease in number of calcifications since previous mammogram (finding)", [], ) }, "DecreaseInSize": {"19776001": ("Decrease in size", [6002, 6003, 6134])}, "Decreased": {"1250004": ("Decreased", [3642])}, "DecreasedMyocardialIschemiaComparedToPriorStudy": { "429232006": ( "Decreased myocardial ischemia compared to prior study (finding)", [], ) }, "DecreasedSize": {"19776001": ("Decreased size (finding)", [])}, "DecreasedTolerance": {"102460003": ("Decreased tolerance", [3236])}, "Deep": {"795002": ("Deep", [2, 3489])}, "DeepAnteriorCervicalLymphNode": { "168360002": ("deep anterior cervical lymph node", [7600, 8134]) }, "DeepCervicalLymphNode": {"279145002": ("deep cervical lymph node", [7600, 8134])}, "DeepInguinalLymphNode": {"65266007": ("deep inguinal lymph node", [7600, 8134])}, "DeepIntraparotidLymphNode": { "75040000": ("deep intraparotid lymph node", [7600, 8134]) }, "DeepLateralCervicalLymphNode": { "167864002": ("deep lateral cervical lymph node", [7600, 8134]) }, "DeepLymphNode": {"60996007": ("deep lymph node", [7600, 8134])}, "DeepPalmarArchOfRadialArtery": { "10119003": ( "Deep Palmar Arch of Radial Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12107], ) }, "DeepPalmarVenousArch": { "368481004": ( "Deep Palmar Venous Arch", [3827, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "DeepParotidLymphNode": {"279142004": ("deep parotid lymph node", [7600, 8134])}, "DeepPoplitealLymphNode": {"35721009": ("deep popliteal lymph node", [7600, 8134])}, "Defibrillator": {"72506001": ("Defibrillator", [7151, 7157, 7193])}, "DefiniteThrombus": {"373142009": ("Definite Thrombus", [3714])}, "DegreeOfBloodVesselLumenCrossSectionalAreaReduction": { "408714007": ( "Degree of blood vessel lumen cross sectional area reduction (observable entity)", [], ) }, "DegreeOfBloodVesselLumenDiameterReduction": { "408715008": ( "Degree of blood vessel lumen diameter reduction (observable entity)", [], ) }, "DehydrationOfTissueSpecimen": { "433470006": ("Dehydration of tissue specimen (procedure)", []) }, "DekalbHybridPigLine": {"74921000": ("Dekalb hybrid pig line (organism)", [])}, "DekalbHybridPigLine30": {"41561001": ("Dekalb hybrid pig line 30 (organism)", [])}, "DekalbHybridPigLine31": {"36570001": ("Dekalb hybrid pig line 31 (organism)", [])}, "DekalbHybridPigLine33": {"6053007": ("Dekalb hybrid pig line 33 (organism)", [])}, "DekalbHybridPigLine51": {"8516002": ("Dekalb hybrid pig line 51 (organism)", [])}, "DekalbHybridPigLine61": {"61973002": ("Dekalb hybrid pig line 61 (organism)", [])}, "DekalbHybridPigLine63": { "112490000": ("Dekalb hybrid pig line 63 (organism)", []) }, "DekalbHybridPigLine77": {"11161001": ("Dekalb hybrid pig line 77 (organism)", [])}, "DelaineMerinoSheep": {"46392004": ("Delaine merino sheep (organism)", [])}, "DelaineMerinoSheepBreed": {"46392004": ("Delaine merino sheep breed", [7480])}, "DelibozHorseBreed": {"133026005": ("Deliboz horse breed", [7480])}, "DeliveredRadiationDose": {"371892002": ("Delivered Radiation Dose", [3425])}, "DelphianLymphNode": {"167664004": ("delphian lymph node", [7600, 8134])}, "DeltoidMuscle": { "35259002": ("Deltoid muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "DengchuanCattleBreed": {"133373005": ("Dengchuan cattle breed", [7480])}, "DentalProsthesis": {"27606000": ("Dental Prosthesis", [7151, 7157, 7193])}, "DentalProsthesisDevice": { "27606000": ("Dental prosthesis, device (physical object)", []) }, "DentalRadiography": {"1290849002": ("Dental radiography", [10005])}, "DentalSurgery": {"309972001": ("Dental Surgery", [7030])}, "DentalSurgeryDepartment": { "309972001": ("Dental surgery department (environment)", []) }, "DeogirCattleBreed": {"133701005": ("Deogir cattle breed", [7480])}, "DeoniCattleBreed": {"133604008": ("Deoni cattle breed", [7480])}, "DependenceOnEnablingMachineOrDevice": { "105501005": ("Dependence on enabling machine or device", [3205]) }, "DepolarizingAgent": {"373250005": ("Depolarizing agent (substance)", [])}, "DepressionOfLeftVentricularSystolicFunction": { "371862006": ("Depression of left ventricular systolic function", [3728]) }, "Depth": {"131197000": ("Depth", [218, 6165, 7469, 7470])}, "DepthOfVesselFromSurface": { "413975003": ("Depth of vessel from surface (observable entity)", []) }, "DerbyshireGritstoneSheepBreed": { "131735003": ("Derbyshire Gritstone sheep breed", [7480]) }, "DerivedFlowNonValve": {"371839009": ("Derived Flow, Non-Valve", [3617])}, "DerivedPeriodNonValve": {"371853009": ("Derived Period, Non-Valve", [3616])}, "DermantsiPiedPigBreed": {"133194004": ("Dermantsi Pied pig breed", [7480])}, "Dermatology": {"309923008": ("Dermatology", [7030])}, "DermatologyDepartment": { "309923008": ("Dermatology department (environment)", []) }, "DermoscopicPhotography": { "446078004": ("Dermoscopic photography (procedure)", []) }, "DesFossesCommunesDeLOuestGoatBreed": { "131690002": ("Des Fosses (Communes de l'Ouest) goat breed", [7480]) }, "Descending": {"75294000": ("Descending", [5])}, "DescendingAorta": { "281130003": ( "Descending aorta", [6102, 6109, 6117, 7151, 7192, 8134, 9514, 12141], ) }, "DescendingAortaStructure": { "281130003": ("Descending aorta structure (body structure)", []) }, "DescendingColon": {"32622004": ("Descending colon", [6210, 8134])}, "DescendingColonStructure": { "32622004": ("Descending colon structure (body structure)", []) }, "Desflurane": {"386841003": ("Desflurane", [623, 624])}, "DetachableBalloon": {"102320000": ("Detachable balloon", [8, 4051, 7151, 7193])}, "DetachableBalloonDevice": { "102320000": ("Detachable balloon, device (physical object)", []) }, "DeuteriumOxide": {"12977001": ("Deuterium oxide", [11002])}, "DeutscheBrackeDogBreed": {"132498002": ("Deutsche bracke dog breed", [7480])}, "DeutschesBlaukoepfigesFleischschafSheepBreed": { "131734004": ("Deutsches Blaukoepfiges Fleischschaf sheep breed", [7480]) }, "DeviceAppliedToPatient": {"373061006": ("Device applied to patient", [3422])}, "DeviceAtSiteOfInterest": {"371876007": ("Device at site of interest", [3422])}, "DeviceCrossedSeptum": {"386125002": ("Device crossed septum", [3422])}, "DeviceInsertedIntoSheath": {"371877003": ("Device inserted into sheath", [3422])}, "DeviceUsed": {"373062004": ("Device used", [3422])}, "DeviceWithdrawnAndOrRemoved": { "371875006": ("Device withdrawn and / or removed (finding)", []) }, "DeviceWithdrawnRemoved": {"371875006": ("Device withdrawn / removed", [3422])}, "DevonCattleBreed": {"131590008": ("Devon cattle breed", [7480])}, "DevonClosewoolSheepBreed": {"131733005": ("Devon Closewool sheep breed", [7480])}, "DevonRexCatBreed": {"51692004": ("Devon rex cat breed", [7480])}, "DexamethasoneSodiumPhosphate": { "396017000": ("Dexamethasone sodium phosphate (substance)", []) }, "DexamethasoneSodiumPhosphate_Inactive": { "49992008": ("Dexamethasone sodium sulfate", [65]) }, "DexterCattleBreed": {"53031002": ("Dexter cattle breed (organism)", [])}, "DexterCowBreed": {"53031002": ("Dexter cow breed", [7480])}, "DexterKerryCattleBreed": {"133374004": ("Dexter-Kerry cattle breed", [7480])}, "Dextran": {"13132007": ("Dextran", [10, 70, 3850])}, "Dextrocardia": {"27637000": ("Dextrocardia", [12248, 12249])}, "DhanniCattleBreed": {"133605009": ("Dhanni cattle breed", [7480])}, "DiabeticOnDietOnly": {"170745003": ("Diabetic on diet only (finding)", [])}, "DiabeticOnDietaryTreatment": { "170745003": ("Diabetic on Dietary Treatment", [3722]) }, "DiabeticOnInsulin": {"170747006": ("Diabetic on Insulin", [3722])}, "DiabeticOnOralTreatment": {"170746002": ("Diabetic on Oral Treatment", [3722])}, "DiabeticRetinopathyStudyField1": { "408734008": ("Diabetic Retinopathy Study field 1", [4207]) }, "DiabeticRetinopathyStudyField2": { "410434001": ("Diabetic Retinopathy Study field 2", [4207]) }, "DiabeticRetinopathyStudyField3": { "410435000": ("Diabetic Retinopathy Study field 3", [4207]) }, "DiabeticRetinopathyStudyField4": { "410436004": ("Diabetic Retinopathy Study field 4", [4207]) }, "DiabeticRetinopathyStudyField5": { "410437008": ("Diabetic Retinopathy Study field 5", [4207]) }, "DiabeticRetinopathyStudyField6": { "410438003": ("Diabetic Retinopathy Study field 6", [4207]) }, "DiabeticRetinopathyStudyField7": { "410439006": ("Diabetic Retinopathy Study field 7", [4207]) }, "Diagnostic": {"261004008": ("Diagnostic", [4256, 6051, 6058, 6061])}, "DiagnosticAspirationOfBreastCyst": { "287572003": ("Diagnostic aspiration of breast cyst", [6050, 6083]) }, "DiagnosticImaging": {"441662001": ("Diagnostic Imaging", [7030])}, "DiagnosticImagingDepartment": { "441662001": ("Diagnostic imaging department (environment)", []) }, "DiagnosticIntent": {"261004008": ("Diagnostic Intent", [3629, 6319, 7064])}, "DiagnosticProcedure": {"103693007": ("Diagnostic procedure (procedure)", [])}, "DiagnosticProcedureOnBloodVessel": { "83422003": ("Diagnostic procedure on blood vessel (procedure)", []) }, "DiagnosticRadiographyStereotacticLocalization": { "64318009": ("Diagnostic radiography, stereotactic localization", [6058, 6060]) }, "DiagnosticRadiographyWithContrastMedia": { "27483000": ("Diagnostic radiography with contrast media", [10014]) }, "DiagnosticRadioisotope": {"17600005": ("Diagnostic radioisotope", [25])}, "DiagnosticUltrasonography": { "16310003": ("Diagnostic ultrasonography", [6028, 6029]) }, "DialiCattleBreed": {"133648003": ("Diali cattle breed", [7480])}, "Diameter": { "81827009": ( "Diameter", [ 218, 3423, 6165, 7469, 7470, 12008, 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, 12304, ], ) }, "DiameterOfCircumscribedCircle": { "131192006": ("Diameter of circumscribed circle", [218, 6165, 7469, 7470]) }, "DiamondBlackStain": {"72572003": ("diamond black stain", [8112])}, "DianiPigBreed": {"133176005": ("Diani pig breed", [7480])}, "Diaphragm": { "5798000": ( "Diaphragm", [1000, 1001, 1004, 6102, 6109, 6116, 7151, 7155, 7192, 8134, 9514], ) }, "DiaphragmStructure": {"5798000": ("Diaphragm structure (body structure)", [])}, "DiaphragmaticLymphNode": {"196751009": ("diaphragmatic lymph node", [7600, 8134])}, "Diastasis": {"444469002": ("Diastasis", [12233, 12307])}, "DiastasisOfCardiacCycle": { "444469002": ("Diastasis of cardiac cycle (qualifier value)", []) }, "Diastole": {"90892000": ("Diastole", [12233, 12307])}, "DiastoleFunction": {"90892000": ("Diastole, function (observable entity)", [])}, "Diastolic": {"90892000": ("Diastolic", [3472])}, "DiastolicBloodPressure": { "271650006": ("Diastolic blood pressure (observable entity)", []) }, "DiastolicPressure": {"271650006": ("Diastolic Pressure", [3641])}, "DiastolicPressureEqualization": { "413985002": ("Diastolic pressure equalization (finding)", []) }, "DiastolicRapidInflow": {"444392003": ("Diastolic Rapid Inflow", [12233])}, "DiastolicRapidInflowEWave": { "444392003": ("Diastolic Rapid Inflow (E-wave)", [12307]) }, "Diatrizoate": {"12335007": ("Diatrizoate", [12, 3850])}, "Diazepam": {"387264003": ("Diazepam", [623, 625])}, "DibromofluoresceinStain": {"17172002": ("dibromofluorescein stain", [8112])}, "DichroicBeamsplitter": {"445316008": ("Dichroic beamsplitter", [8124])}, "DidingaCattleBreed": {"133649006": ("Didinga cattle breed", [7480])}, "Diencephalon": {"87563008": ("Diencephalon", [7151, 7153, 7192, 8134, 9514])}, "DiethylEther": {"259170003": ("Diethyl ether", [623, 624])}, "DifferenceInAttenuation": {"442707000": ("Difference in attenuation", [6207])}, "DifferenceInBorderDefinition": { "442688001": ("Difference in border definition", [6134]) }, "DifferenceInBorderShape": {"442755000": ("Difference in border shape", [6134])}, "DifferenceInDistribution": {"442704007": ("Difference in distribution", [6134])}, "DifferenceInLocation": {"129808005": ("Difference in location", [6037])}, "DifferenceInMargin": {"129812004": ("Difference in margin", [6038])}, "DifferenceInNumberOfCalcifications": { "129810007": ("Difference in number of calcifications", [6037]) }, "DifferenceInOpacity": {"129807000": ("Difference in opacity", [6037])}, "DifferenceInShape": {"129811006": ("Difference in shape", [6038])}, "DifferenceInSiteInvolvement": { "442711006": ("Difference in site involvement", [6134]) }, "DifferenceInSize": {"129806009": ("Difference in size", [6037])}, "DifferenceInSpatialProximity": { "129809002": ("Difference in spatial proximity", [6037]) }, "DifferenceInSubstance": {"442691001": ("Difference in substance", [6134])}, "DifferenceInSymmetry": {"129813009": ("Difference in symmetry", [6038])}, "DifferenceInTexture": {"442700003": ("Difference in Texture", [6134])}, "Diffuse": {"19648000": ("Diffuse", [6128, 6335, 6336, 6337])}, "DiffuseCalcificationDistribution": { "129764001": ("Diffuse calcification distribution", [6012, 6013]) }, "DiffuseDisease": {"371915000": ("Diffuse Disease", [3712])}, "DiffuseDiseaseOfCoronaryArtery": { "371915000": ("Diffuse disease of coronary artery (finding)", []) }, "DiffuseFibroelastosis": {"125358004": ("diffuse fibroelastosis", [3817])}, "DiffuseInflammatoryErythema": { "402603005": ("Diffuse inflammatory erythema", [60, 9300]) }, "Digit": {"82680008": ("Digit", [7482, 7483, 8134])}, "DigitStructure": {"82680008": ("Digit structure (body structure)", [])}, "DigitalArteryOfHand": { "40254007": ( "Digital artery of hand", [3827, 7151, 7192, 8134, 9514, 12103, 12107], ) }, "DigitalExaminationOfRectum": { "410006001": ("Digital Examination of Rectum", [6321]) }, "DigitalImager": {"468440006": ("Digital imager", [7026, 7027, 7151, 7193])}, "DigitalImagerRadiationTherapy": { "468440006": ("Digital imager, radiation therapy", [9268, 9271]) }, "DigitalImagingScannerComputedRadiography": { "468886001": ("Digital imaging scanner, computed radiography", [9268]) }, "Digoxin": {"796001": ("Digoxin", [10])}, "Dilatation": {"25322007": ("dilatation", [3810])}, "DilatedPortionOfSegment": {"413996005": ("Dilated portion of segment", [12116])}, "DilationAndCurettage": {"13091001": ("Dilation and curettage", [6082])}, "DingPigBreed": {"132134007": ("Ding pig breed", [7480])}, "DingoDogBreed": {"709853007": ("Dingo dog breed", [7480])}, "Diphenhydramine": {"372682005": ("Diphenhydramine", [65])}, "Dipyridamole": {"66859009": ("Dipyridamole", [3204])}, "DipyridamoleStressProtocol": { "422685009": ("Dipyridamole Stress protocol", [3261, 12001]) }, "DirectOphthalmoscope": {"409900009": ("Direct Ophthalmoscope", [4202])}, "DirectionOfFlow": {"260674002": ("Direction of flow (attribute)", [])}, "DirectionalCoronaryAtherectomyDCADevice": { "371796006": ("Directional Coronary Atherectomy (DCA) Device", [3411, 3429]) }, "DirectionalCoronaryAtherectomyDevice": { "371796006": ("Directional coronary atherectomy device (physical object)", []) }, "Disability": {"21134002": ("Disability (finding)", [])}, "DisabilitySevere": {"161045001": ("Disability - severe (finding)", [])}, "Disabled": {"21134002": ("Disabled", [3772])}, "Discoid": {"255282008": ("Discoid", [6128])}, "DiscoidAtelectasis": {"40779009": ("Discoid atelectasis (disorder)", [])}, "DiscolorationOfSkinOfBreast": { "290069002": ("Discoloration of skin of breast", [6055]) }, "Disease": {"64572001": ("Disease", [3769])}, "DiseaseConditionDeterminationWellControlled": { "1194003": ("Disease condition determination, well controlled (finding)", []) }, "DishtyCattleBreed": {"133800001": ("Dishty cattle breed (organism)", [])}, "DishtyXZebuCattleBreed": {"133800001": ("Dishty X zebu cattle breed", [7480])}, "DisorderOfBreastImplant": {"271989003": ("Disorder of breast implant", [6055])}, "DisorderOfEyelid": {"60113004": ("Disorder of eyelid (disorder)", [])}, "DisorderOfLung": {"19829001": ("Disorder of lung (disorder)", [])}, "DisorderOfPericardium": {"55855009": ("Disorder of pericardium (disorder)", [])}, "DisorderOfRefraction": {"39021009": ("Disorder of refraction (disorder)", [])}, "DisplacementOfBreastImplant": { "399209000": ("Displacement of breast implant (procedure)", []) }, "DissectingAneurysm": {"710864009": ("dissecting aneurysm", [3808])}, "Dissection": {"122459003": ("Dissection", [8110])}, "DissectionOfAorta": {"308546005": ("Dissection of aorta (disorder)", [])}, "DissectionOfArtery": {"710864009": ("Dissection of artery (disorder)", [])}, "DissectionProcedure": {"122459003": ("Dissection procedure (procedure)", [])}, "Disseminated": {"65709003": ("Disseminated", [6128])}, "DisseminatedMalignancyOfUnknownPrimary": { "285645000": ("Disseminated malignancy of unknown primary (disorder)", []) }, "Distal": {"46053002": ("Distal", [2, 5, 211, 212, 3019, 12116, 12281])}, "DistalCircumflexCoronaryArtery": { "6511003": ( "Distal Circumflex Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12292], ) }, "DistalFemur": {"310652005": ("Distal Femur", [7304, 8134])}, "DistalHumerus": {"118495001": ("Distal Humerus", [7304, 8134])}, "DistalLeftAnteriorDescendingCoronaryArtery": { "36672000": ( "Distal Left Anterior Descending Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "DistalRadius": {"75129005": ("Distal Radius", [7304, 8134])}, "DistalRightCoronaryArtery": { "41879009": ( "Distal Right Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "DistalTibia": {"64605006": ("Distal Tibia", [7304, 8134])}, "DistalUlna": {"91238003": ("Distal Ulna", [7304, 8134])}, "DistilledWater": {"444883009": ("Distilled water", [610])}, "Diuretic": {"372695000": ("Diuretic", [621, 622])}, "DiureticAgent": {"30492008": ("Diuretic", [10, 3760])}, "Diverticulum": {"31113003": ("diverticulum", [3810, 6201])}, "Dizziness": {"404640003": ("Dizziness", [3220])}, "DizzinessDueToDrug": {"473188002": ("Dizziness due to drug (disorder)", [])}, "DjakoreCattleBreed": {"133801002": ("Djakore cattle breed (organism)", [])}, "DjakoreXZebuCattleBreed": {"133801002": ("Djakore X zebu cattle breed", [7480])}, "DjermaHorseBreed": {"133025009": ("Djerma horse breed", [7480])}, "DnepropetrovskPigBreed": {"132075003": ("Dnepropetrovsk pig breed", [7480])}, "DnieperCattleBreed": {"131467001": ("Dnieper cattle breed", [7480])}, "DnieperPigBreed": {"132078001": ("Dnieper pig breed", [7480])}, "DoayoCattleBreed": {"131468006": ("Doayo cattle breed", [7480])}, "DobermanPinscher": {"47075006": ("Doberman pinscher", [7480])}, "DobrogeaBlackPigBreed": {"133199009": ("Dobrogea Black pig breed", [7480])}, "Dobutamine": {"26523005": ("Dobutamine", [3204])}, "DobutamineStressProtocol": { "424225000": ("Dobutamine Stress protocol", [3261, 12001]) }, "DoddPerforatingVein": { "128554002": ( "Dodd's perforating vein", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "DogueDeBordeauxDogBreed": { "132389001": ("Dogue de Bordeaux dog breed (organism)", []) }, "DomesticLeopardCat": {"73271003": ("Domestic leopard cat", [7480])}, "DomesticLonghairedCat": {"8419007": ("Domestic longhaired cat", [7480])}, "DomesticMediumHairedCat": {"409914009": ("Domestic medium-haired cat", [7480])}, "DomesticShorthairedCat": {"15020009": ("Domestic shorthaired cat", [7480])}, "DonGoatBreed": {"131669005": ("Don goat breed", [7480])}, "DonHorseBreed": {"132761002": ("Don horse breed", [7480])}, "DonPigBreed": {"132103008": ("Don pig breed", [7480])}, "DongolaCattleBreed": {"133650006": ("Dongola cattle breed", [7480])}, "DongolaHorseBreed": {"133023002": ("Dongola horse breed", [7480])}, "Doppler": {"420717009": ("Doppler", [3442])}, "DopplerCatheterMethod": {"133911005": ("Doppler catheter method", [3241])}, "DopplerColorFlow": {"261197005": ("Doppler Color Flow", [6058, 12224])}, "DopplerContinuousWave": {"261198000": ("Doppler Continuous Wave", [6058, 12224])}, "DopplerPulsed": {"261199008": ("Doppler Pulsed", [6058, 12224])}, "DopplerUltrasonographyOfHeartTissue": { "439858009": ("Doppler ultrasonography of heart tissue (procedure)", []) }, "DoranCattleBreed": {"133375003": ("Doran cattle breed", [7480])}, "DornaCattleBreed": {"133376002": ("Dorna cattle breed", [7480])}, "DorperSheepBreed": {"131732000": ("Dorper sheep breed", [7480])}, "Dorsal20DegreeRostralVentrocaudalOblique": { "442745004": ("Dorsal 20 degree rostral-ventrocaudal oblique", [7484]) }, "Dorsal20DegreeRostralVentrocaudalObliqueProjection": { "442745004": ( "Dorsal 20 degree rostral-ventrocaudal oblique projection (qualifier value)", [], ) }, "Dorsal35DegreeLateralPalmaromedialOblique": { "442746003": ("Dorsal 35 degree lateral-palmaromedial oblique", [7484]) }, "Dorsal35DegreeLateralPalmaromedialObliqueProjection": { "442746003": ( "Dorsal 35 degree lateral-palmaromedial oblique projection (qualifier value)", [], ) }, "Dorsal35DegreeLateralPlantaromedialOblique": { "442606004": ("Dorsal 35 degree lateral-plantaromedial oblique", [7484]) }, "Dorsal35DegreeLateralPlantaromedialObliqueProjection": { "442606004": ( "Dorsal 35 degree lateral-plantaromedial oblique projection (qualifier value)", [], ) }, "Dorsal35DegreeMedialPalmarolateralOblique": { "442583001": ("Dorsal 35 degree medial-palmarolateral oblique", [7484]) }, "Dorsal35DegreeMedialPalmarolateralObliqueProjection": { "442583001": ( "Dorsal 35 degree medial-palmarolateral oblique projection (qualifier value)", [], ) }, "Dorsal35DegreeMedialPlantarolateralOblique": { "442608003": ("Dorsal 35 degree medial-plantarolateral oblique", [7484]) }, "Dorsal35DegreeMedialPlantarolateralObliqueProjection": { "442608003": ( "Dorsal 35 degree medial-plantarolateral oblique projection (qualifier value)", [], ) }, "Dorsal40DegreeLateralPlantaromedialOblique": { "442585008": ("Dorsal 40 degree lateral-plantaromedial oblique", [7484]) }, "Dorsal40DegreeLateralPlantaromedialObliqueProjection": { "442585008": ( "Dorsal 40 degree lateral-plantaromedial oblique projection (qualifier value)", [], ) }, "Dorsal40DegreeMedialPalmarolateralOblique": { "442621005": ("Dorsal 40 degree medial-palmarolateral oblique", [7484]) }, "Dorsal40DegreeMedialPalmarolateralObliqueProjection": { "442621005": ( "Dorsal 40 degree medial-palmarolateral oblique projection (qualifier value)", [], ) }, "Dorsal40DegreeMedialPlantarolateralOblique": { "442622003": ("Dorsal 40 degree medial-plantarolateral oblique", [7484]) }, "Dorsal40DegreeMedialPlantarolateralObliqueProjection": { "442622003": ( "Dorsal 40 degree medial-plantarolateral oblique projection (qualifier value)", [], ) }, "Dorsal45DegreeLateralPalmaromedialOblique": { "442597009": ("Dorsal 45 degree lateral-palmaromedial oblique", [7484]) }, "Dorsal45DegreeLateralPalmaromedialObliqueProjection": { "442597009": ( "Dorsal 45 degree lateral-palmaromedial oblique projection (qualifier value)", [], ) }, "Dorsal45DegreeLateralPlantaromedialOblique": { "442643002": ("Dorsal 45 degree lateral-plantaromedial oblique", [7484]) }, "Dorsal45DegreeLateralPlantaromedialObliqueProjection": { "442643002": ( "Dorsal 45 degree lateral-plantaromedial oblique projection (qualifier value)", [], ) }, "Dorsal45DegreeMedialPalmarolateral": { "442623008": ("Dorsal 45 degree medial-palmarolateral", [7484]) }, "Dorsal45DegreeMedialPalmarolateralProjection": { "442623008": ( "Dorsal 45 degree medial-palmarolateral projection (qualifier value)", [], ) }, "Dorsal45DegreeMedialPlantarolateralOblique": { "442600005": ("Dorsal 45 degree medial-plantarolateral oblique", [7484]) }, "Dorsal45DegreeMedialPlantarolateralObliqueProjection": { "442600005": ( "Dorsal 45 degree medial-plantarolateral oblique projection (qualifier value)", [], ) }, "Dorsal60DegreeLateralPalmaromedialOblique": { "442639001": ("Dorsal 60 degree lateral-palmaromedial oblique", [7484]) }, "Dorsal60DegreeLateralPalmaromedialObliqueProjection": { "442639001": ( "Dorsal 60 degree lateral-palmaromedial oblique projection (qualifier value)", [], ) }, "Dorsal60DegreeLateralPlantaromedialOblique": { "442601009": ("Dorsal 60 degree lateral-plantaromedial oblique", [7484]) }, "Dorsal60DegreeLateralPlantaromedialObliqueProjection": { "442601009": ( "Dorsal 60 degree lateral-plantaromedial oblique projection (qualifier value)", [], ) }, "Dorsal60DegreeMedialPalmarolateralOblique": { "442602002": ("Dorsal 60 degree medial-palmarolateral oblique", [7484]) }, "Dorsal60DegreeMedialPalmarolateralObliqueProjection": { "442602002": ( "Dorsal 60 degree medial-palmarolateral oblique projection (qualifier value)", [], ) }, "Dorsal60DegreeMedialPlantarolateralOblique": { "442641000": ("Dorsal 60 degree medial-plantarolateral oblique", [7484]) }, "Dorsal60DegreeMedialPlantarolateralObliqueProjection": { "442641000": ( "Dorsal 60 degree medial-plantarolateral oblique projection (qualifier value)", [], ) }, "Dorsal65DegreeProximalPalmarodistalOblique": { "442609006": ("Dorsal 65 degree proximal-palmarodistal oblique", [7484]) }, "Dorsal65DegreeProximalPalmarodistalObliqueProjection": { "442609006": ( "Dorsal 65 degree proximal-palmarodistal oblique projection (qualifier value)", [], ) }, "Dorsal65DegreeProximalPlantarodistalOblique": { "442624002": ("Dorsal 65 degree proximal-plantarodistal oblique", [7484]) }, "Dorsal65DegreeProximalPlantarodistalObliqueProjection": { "442624002": ( "Dorsal 65 degree proximal-plantarodistal oblique projection (qualifier value)", [], ) }, "DorsalAspectOfScapula": {"51698000": ("Dorsal aspect of scapula", [6115, 8134])}, "DorsalFuniculus": {"59752008": ("dorsal funiculus", [7707, 7710, 8134])}, "DorsalFuniculusStructure": { "59752008": ("Dorsal funiculus structure (body structure)", []) }, "DorsalScapularArtery": { "91732003": ( "Dorsal scapular artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "DorsalisPedisArtery": { "86547008": ( "Dorsalis Pedis Artery", [3440, 3827, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "DorsetDownSheepBreed": {"131722007": ("Dorset Down sheep breed", [7480])}, "DorsetSheepSuperbreed": {"25327001": ("Dorset sheep superbreed", [7480])}, "DorsoVentral": {"441672003": ("Dorso-ventral", [7484])}, "DorsoVentralProjection": { "441672003": ("Dorso-ventral projection (qualifier value)", []) }, "DorsolateralPalmaromedialOblique": { "442657000": ("Dorsolateral-palmaromedial oblique", [7484]) }, "DorsolateralPalmaromedialObliqueProjection": { "442657000": ( "Dorsolateral-palmaromedial oblique projection (qualifier value)", [], ) }, "DorsolateralPlantaromedialOblique": { "442610001": ("Dorsolateral-plantaromedial oblique", [7484]) }, "DorsolateralPlantaromedialObliqueProjection": { "442610001": ( "Dorsolateral-plantaromedial oblique projection (qualifier value)", [], ) }, "DorsomedialPalmarolateral": {"442729001": ("Dorsomedial-palmarolateral", [7484])}, "DorsomedialPalmarolateralProjection": { "442729001": ("Dorsomedial-palmarolateral projection (qualifier value)", []) }, "DorsomedialPlantarolateralOblique": { "442611002": ("Dorsomedial-plantarolateral oblique", [7484]) }, "DorsomedialPlantarolateralObliqueProjection": { "442611002": ( "Dorsomedial-plantarolateral oblique projection (qualifier value)", [], ) }, "Dorsopalmar": {"441505008": ("Dorsopalmar", [7484])}, "DorsopalmarProjection": { "441505008": ("Dorsopalmar projection (qualifier value)", []) }, "Dorsoplantar": {"399335002": ("dorsoplantar", [501, 4010, 7484])}, "DorsoplantarProjection": { "399335002": ("Dorsoplantar projection (qualifier value)", []) }, "DorsoproximalPalmarodistalOblique": { "442744000": ("Dorsoproximal-palmarodistal oblique", [7484]) }, "DorsoproximalPalmarodistalObliqueProjection": { "442744000": ( "Dorsoproximal-palmarodistal oblique projection (qualifier value)", [], ) }, "DorsoproximalPlantarodistalOblique": { "442592003": ("Dorsoproximal-plantarodistal oblique", [7484]) }, "DorsoproximalPlantarodistalObliqueProjection": { "442592003": ( "Dorsoproximal-plantarodistal oblique projection (qualifier value)", [], ) }, "DorsorostralVentrocaudalOblique": { "442659002": ("Dorsorostral-ventrocaudal oblique", [7484]) }, "DorsorostralVentrocaudalObliqueProjection": { "442659002": ( "Dorsorostral-ventrocaudal oblique projection (qualifier value)", [], ) }, "DortyolCattleBreed": {"133377006": ("Dortyol cattle breed", [7480])}, "Dosage": {"260911001": ("Dosage", [6092])}, "Dosimeter": {"15869005": ("Dosimeter", [10010, 10020])}, "DosimeterDevice": {"15869005": ("Dosimeter, device (physical object)", [])}, "DotatateGa68": {"724025002": ("Dotatate Ga^68^", [4021])}, "DoubleCoronaryVesselDisease": { "194843003": ("Double coronary vessel disease (disorder)", []) }, "DoubleVesselCoronaryArteryDisease": { "194843003": ("Double vessel coronary artery disease.", [3728]) }, "Down": {"255518004": ("Down", [4215])}, "Downgaze": {"255521002": ("Downgaze", [4201])}, "DownwardGaze": {"255521002": ("Downward gaze (qualifier value)", [])}, "DraftPonySuperbreed": {"425253007": ("Draft pony superbreed (organism)", [])}, "DraftPonySuperbreedHorseBreed": { "425253007": ("Draft pony superbreed horse breed", [7480]) }, "DrakensbergerCattleBreed": {"131551009": ("Drakensberger cattle breed", [7480])}, "DrentsHeideschaapSheepBreed": { "132685003": ("Drents Heideschaap sheep breed", [7480]) }, "DrentsePatrijshondDogBreed": { "132493006": ("Drentse Patrijshond dog breed", [7480]) }, "DreverDog": {"56984005": ("Drever dog", [7480])}, "DropShaped": {"1312007": ("Drop-shaped", [6335, 6339, 6340])}, "Droperidol": {"387146001": ("Droperidol", [623, 625])}, "DroughtmasterCattleBreed": { "133720007": ("Droughtmaster cattle breed (organism)", []) }, "DroughtmasterXZebuCattleBreed": { "133720007": ("Droughtmaster X zebu cattle breed", [7480]) }, "Drowsy": {"271782001": ("Drowsy", [3035, 3050])}, "DrugDiluent": {"74626007": ("Drug diluent", [621, 622])}, "DrugInducedDizziness": {"473188002": ("Drug Induced Dizziness", [60, 9300])}, "DrugInducedFlushing": {"403618004": ("Drug induced Flushing", [60, 9300])}, "DrugInducedHypotension": {"234171009": ("Drug-induced hypotension", [60, 9300])}, "DrugInfusion": {"133882006": ("Drug infusion", [91, 3271])}, "DrugInfusionChallenge": { "133882006": ("Drug Infusion Challenge", [3250, 3405, 3651]) }, "DrugMisuseBehavior": {"228366006": ("Drug misuse behavior", [3774])}, "DrugRash": {"28926001": ("Drug Rash", [60, 9300])}, "DryEyes": {"162290004": ("Dry eyes (finding)", [])}, "DryEyesProblem": {"162290004": ("Dry Eyes Problem", [4222])}, "DrysdaleSheepBreed": {"131721000": ("Drysdale sheep breed", [7480])}, "DualCatheterMethod": {"128573003": ("Dual catheter method", [3241])}, "DualDiffuseDirectIllumination": { "410461001": ("Dual diffuse direct illumination", [4203]) }, "DualDiffuseDirectIlluminationAction": { "410461001": ("Dual diffuse direct illumination - action (qualifier value)", []) }, "DualEnergyXRayAbsorptiometry": { "241686001": ("Dual energy X-Ray absorptiometry", [10005]) }, "DualEnergyXRayPhotonAbsorptiometry": { "241686001": ("Dual energy X-ray photon absorptiometry (procedure)", []) }, "DuctalHyperplasiaUsual": {"67617000": ("Ductal hyperplasia, Usual", [6030, 6031])}, "DukeCoronaryArteryDiseaseScore": { "304915008": ("Duke's coronary artery disease score (assessment scale)", []) }, "DukeTreadmillScore": {"304915008": ("Duke treadmill score", [3238])}, "DulmenPonyHorseBreed": {"131937003": ("Dulmen Pony horse breed", [7480])}, "DunkerDogBreed": {"132494000": ("Dunker dog breed", [7480])}, "Dunlap": {"399303002": ("Dunlap", [4012])}, "DunlapProjection": {"399303002": ("Dunlap projection (qualifier value)", [])}, "DuodenalStructure": {"38848004": ("Duodenal structure (body structure)", [])}, "Duodenum": { "38848004": ("Duodenum", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "DuraMater": {"18545000": ("Dura mater", [5, 7151, 7153, 7192, 8134, 9514])}, "DuraMaterStructure": {"18545000": ("Dura mater structure (body structure)", [])}, "Duration": {"103335007": ("Duration (attribute)", [])}, "DurazolRedStain": {"11780008": ("durazol red stain", [8112])}, "During": {"272114000": ("During", [3600])}, "DuringMenopause": {"303111005": ("During menopause", [6086])}, "DuringProcedure": {"307154001": ("During Procedure", [631, 12002, 12102])}, "DuringValues": {"272114000": ("During values (qualifier value)", [])}, "DurocPig": {"3260001": ("Duroc pig (organism)", [])}, "DurocPigBreed": {"3260001": ("Duroc pig breed", [7480])}, "DutchBeltedCattleBreed": {"131592000": ("Dutch Belted cattle breed", [7480])}, "DutchDraftHorseBreed": {"133016003": ("Dutch Draft horse breed", [7480])}, "DutchFriesianCattleBreed": {"131593005": ("Dutch Friesian cattle breed", [7480])}, "DutchKooikerDogBreed": {"132495004": ("Dutch Kooiker Dog breed", [7480])}, "DutchLandracePig": {"58311005": ("Dutch landrace pig (organism)", [])}, "DutchLandracePigBreed": {"58311005": ("Dutch landrace pig breed", [7480])}, "DutchShepherdDogBreed": {"132496003": ("Dutch Shepherd dog breed", [7480])}, "DutchTuigpaardHorseBreed": {"131947000": ("Dutch Tuigpaard horse breed", [7480])}, "DutchWarmbloodHorseBreed": {"133022007": ("Dutch Warmblood horse breed", [7480])}, "DutchYorkshirePigBreed": {"132270003": ("Dutch Yorkshire pig breed", [7480])}, "DyeDilution": {"373104003": ("Dye Dilution", [3628])}, "DyeDilutionCardiacOutputWaveform": { "128455004": ("Dye dilution cardiac output waveform", [3003]) }, "DyeDilutionCardiacOutputWaveformFunction": { "128455004": ( "Dye dilution cardiac output waveform, function (observable entity)", [], ) }, "DynamicHipScrewPlate": { "257327003": ("Dynamic hip screw plate (physical object)", []) }, "DynamicMagneticResonanceImagingOfKnee": { "433139009": ("Dynamic magnetic resonance imaging of knee", [100]) }, "DynamicMagneticResonanceImagingOfPelvis": { "446315002": ("Dynamic magnetic resonance imaging of pelvis", [100]) }, "Dyskinesis": {"25437005": ("Dyskinesis", [3703])}, "Dyspnea": {"267036007": ("Dyspnea", [60, 3201, 3220, 3221, 9300, 12246])}, "DystrophicCalcification": { "129750001": ("Dystrophic calcification", [6010, 6011]) }, "DystrophicRadiographicCalcification": { "129750001": ("Dystrophic radiographic calcification (finding)", []) }, "DzumaliaPigBreed": {"133207005": ("Dzumalia pig breed", [7480])}, "DølafeCattleBreed": {"131591007": ("Dølafe cattle breed", [7480])}, "DøleHorseBreed": {"133024008": ("Døle horse breed", [7480])}, "ECGAnalysis": {"258181008": ("ECG analysis", [3215])}, "ECGEquivocal": {"370359005": ("ECG Equivocal", [3677])}, "ECGNormal": {"164854000": ("Normal", [3230, 3677])}, "EDTAGa68": {"423498000": ("EDTA Ga^68^", [4021])}, "EEG": {"54550000": ("EEG", [3049])}, "ELMExternalLimitingMembrane": { "76710003": ("ELM - External limiting membrane", [4273, 7151, 7192, 9514]) }, "Ear": {"117590005": ("Ear", [4, 7151, 7192, 8134, 9514])}, "EarNoseAndThroatDepartment": { "309978002": ("Ear, nose and throat department (environment)", []) }, "EarStructure": {"117590005": ("Ear structure (body structure)", [])}, "EarlyDiastole": {"444389002": ("Early Diastole", [12233])}, "EarlyDiastoleOfCardiacCycle": { "444389002": ("Early diastole of cardiac cycle (qualifier value)", []) }, "EarlyRepolarization": {"428417006": ("Early repolarization", [3230])}, "EastAnatolianRedCattleBreed": { "133378001": ("East Anatolian Red cattle breed", [7480]) }, "EastAndSoutheastAnadoluHorseBreed": { "131948005": ("East and Southeast Anadolu horse breed", [7480]) }, "EastBalkanPigBreed": {"132366009": ("East Balkan pig breed", [7480])}, "EastBulgarianHorseBreed": {"132765006": ("East Bulgarian horse breed", [7480])}, "EastFinnishCattleBreed": {"133379009": ("East Finnish cattle breed", [7480])}, "EastFriesianOldTypeHorseBreed": { "132766007": ("East Friesian (Old Type) horse breed", [7480]) }, "EastFriesianSheepBreed": {"132853004": ("East Friesian sheep breed", [7480])}, "EastFriesianWarmbloodModernTypeHorseBreed": { "132767003": ("East Friesian Warmblood (Modern Type) horse breed", [7480]) }, "EastMacedonianCattleBreed": { "133380007": ("East Macedonian cattle breed", [7480]) }, "EastSiberianLaikaDogBreed": { "132497007": ("East Siberian Laika dog breed", [7480]) }, "EasternNuerCattleBreed": {"131469003": ("Eastern Nuer cattle breed", [7480])}, "Eccentric": {"255380003": ("Eccentric", [3491, 3806])}, "EccentricFixation": {"251786004": ("Eccentric Fixation", [4221, 4222])}, "Echocardiography": {"40701008": ("Echocardiography", [3206, 3744, 3757, 12001])}, "EchocardiographyForDeterminingVentricularContraction": { "35757004": ( "Echocardiography for determining ventricular contraction (procedure)", [], ) }, "Ectatic": {"386140000": ("Ectatic", [3712])}, "EctaticCoronaryArtery": {"386140000": ("Ectatic coronary artery (finding)", [])}, "EctopicAccessoryBreastTissue": { "1896004": ("Ectopic (accessory) breast tissue", [6030, 6031]) }, "EctopicBreastTissue": {"1896004": ("Ectopic breast tissue (disorder)", [])}, "Eczema": {"43116000": ("Eczema", [4405])}, "EdelschweinPigBreed": {"132353009": ("Edelschwein pig breed", [7480])}, "Edema": { "79654002": ( "Edema", [6014, 6015, 6016, 6030, 6031, 6054, 6056, 7151, 7159, 7168, 7169, 7194], ) }, "EdemaOfFetalChestWall": {"443115002": ("Edema of fetal chest wall", [12249])}, "EdemaOfFetalScalp": {"443168008": ("Edema of fetal scalp", [12249])}, "EdemaOfLarynx": {"51599000": ("Edema of larynx (disorder)", [])}, "Edge": {"57183005": ("Edge", [2])}, "Efferent": {"33843005": ("Efferent", [2])}, "Effusion": {"41699000": ("Effusion", [12280])}, "EggshellCalcification": { "129751002": ("Eggshell calcification", [6010, 6011, 6132]) }, "EggshellRadiographicCalcification": { "129751002": ("Eggshell radiographic calcification (finding)", []) }, "EgyptianCattleBreed": {"131470002": ("Egyptian cattle breed", [7480])}, "EgyptianHorseBreed": {"133017007": ("Egyptian horse breed", [7480])}, "EgyptianMauCat": {"21637005": ("Egyptian mau cat", [7480])}, "EighthIntercostalSpace": {"117140004": ("Eighth Intercostal Space", [5])}, "ElasticVascularSclerosis": {"19952003": ("elastic vascular sclerosis", [3817])}, "ElbowJoint": { "16953009": ( "Elbow joint", [ 4, 1000, 1001, 1006, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514, ], ) }, "ElbowJointStructure": {"16953009": ("Elbow joint structure (body structure)", [])}, "Elective": {"103390000": ("Elective (qualifier value)", [])}, "ElectiveProcedure": {"103390000": ("Elective Procedure", [3414])}, "ElectricBlanket": {"79811009": ("Electric blanket", [635])}, "ElectricBlanketDevice": { "79811009": ("Electric blanket, device (physical object)", []) }, "ElectricHeatingPad": {"27812008": ("Electric heating pad", [635])}, "ElectricHeatingPadDevice": { "27812008": ("Electric heating pad, device (physical object)", []) }, "ElectrocardiogramAbnormal": { "102594003": ("Electrocardiogram abnormal (finding)", []) }, "ElectrocardiogramAnalysis": { "258181008": ("Electrocardiogram analysis (qualifier value)", []) }, "ElectrocardiogramEquivocal": { "370359005": ("Electrocardiogram equivocal (finding)", []) }, "ElectrocardiogramFinding": { "271921002": ("Electrocardiogram finding (observable entity)", []) }, "ElectrocardiogramSTIntervalNormal": { "164929001": ("Electrocardiogram: ST interval normal (finding)", []) }, "ElectrocardiogramWithExerciseTest": { "46136006": ("Electrocardiogram with exercise test (procedure)", []) }, "Electron": {"46602004": ("Electron", [9525])}, "ElectronMicroscopyGrid": {"434533009": ("Electron microscopy grid", [8101, 8102])}, "ElectrophysiologyMappingPhase": { "129092004": ("Electrophysiology Mapping phase", [3254]) }, "ElectrophysiologyProcedureBaselinePhase": { "129082007": ("Electrophysiology procedure baseline phase", [3254]) }, "ElegantWarmbloodHorseBreed": { "131961005": ("Elegant Warmblood horse breed", [7480]) }, "EleiaHorseBreed": {"132742001": ("Eleia horse breed", [7480])}, "Elevated": {"75540009": ("Elevated", [3642])}, "EleventhIntercostalSpace": {"117143002": ("Eleventh Intercostal Space", [5])}, "EllestadProtocol": {"129098000": ("Ellestad protocol", [3261, 12001])}, "ElliottdaleSheepBreed": {"131720004": ("Elliottdale sheep breed", [7480])}, "Embolism": {"55584005": ("embolism", [3805, 3810, 3815])}, "EmbolizationBall": {"102315000": ("Embolization ball", [8, 4051, 7151, 7193])}, "EmbolizationBallDevice": { "102315000": ("Embolization ball, device (physical object)", []) }, "EmbolizationCoil": {"102314001": ("Embolization coil", [8, 4051, 7151, 7193])}, "EmbolizationCoilDevice": { "102314001": ("Embolization coil, device (physical object)", []) }, "EmbolizationParticulate": { "102316004": ("Embolization particulate", [8, 4051, 7151, 7193]) }, "EmbolizationParticulateDevice": { "102316004": ("Embolization particulate, device (physical object)", []) }, "Embolus": {"55584005": ("Embolus", [7151, 7159, 7194])}, "EmbryonicVascularStructure": { "51852003": ("Embryonic vascular structure (body structure)", []) }, "Emergency": {"25876001": ("Emergency (qualifier value)", [])}, "EmergencyCoronaryArteryBypass": { "414088005": ("Emergency Coronary Artery Bypass", [3413, 3755]) }, "EmergencyCoronaryArteryBypassGraft": { "414088005": ("Emergency coronary artery bypass graft (procedure)", []) }, "EmergencyDepartment": {"50849002": ("Emergency Department", [3729])}, "EmergencyDepartmentPatientVisit": { "4525004": ("Emergency Department patient visit", [3671]) }, "EmergencyPercutaneousCoronaryIntervention": { "414089002": ("Emergency Percutaneous Coronary Intervention", [3413, 3755]) }, "EmergencyProcedure": {"373110003": ("Emergency procedure", [3671])}, "EmergencyRoomAdmission": { "50849002": ("Emergency room admission (procedure)", []) }, "EmergentProcedure": {"25876001": ("Emergent Procedure", [3414])}, "EmptyRectum": {"249599008": ("Empty Rectum", [9272])}, "EmptyVitreous": {"232077005": ("Empty vitreous (disorder)", [])}, "Encapsulated": {"59135002": ("Encapsulated", [6335, 6341, 6342])}, "EndDiastole": {"416190007": ("End diastole", [3337, 12233, 12307])}, "EndOfProtocol": {"255253007": ("End of Protocol", [3221])}, "EndSystole": {"416430001": ("End Systole", [12233, 12307])}, "Ended": {"385656004": ("Ended", [3773])}, "EnderbyIslandCattleBreed": {"133581005": ("Enderby Island cattle breed", [7480])}, "EndoArterial": {"51114001": ("Endo-arterial", [4])}, "EndoCardiac": {"80891009": ("Endo-cardiac", [4])}, "EndoEsophageal": {"32849002": ("Endo-esophageal", [4])}, "EndoNasal": {"53342003": ("Endo-nasal", [4, 7151, 7192, 9514])}, "EndoNasopharyngeal": { "18962004": ("Endo-nasopharyngeal", [4, 7151, 7192, 8134, 9514]) }, "EndoRectal": {"34402009": ("Endo-rectal", [4])}, "EndoRenal": {"64033007": ("Endo-renal", [4])}, "EndoUreteric": {"87953007": ("Endo-ureteric", [4, 8134])}, "EndoUrethral": {"13648007": ("Endo-urethral", [4])}, "EndoVaginal": {"76784001": ("Endo-vaginal", [4])}, "EndoVascular": {"59820001": ("Endo-vascular", [4])}, "EndoVenous": {"29092000": ("Endo-venous", [4])}, "EndoVesical": {"48367006": ("Endo-vesical", [4, 7151, 7192, 8134, 9514])}, "Endocardial": {"304059001": ("endocardial", [3843])}, "EndocrineSurgery": {"309979005": ("Endocrine Surgery", [7030])}, "EndocrineSurgeryDepartment": { "309979005": ("Endocrine surgery department (environment)", []) }, "Endocrinology": {"309925001": ("Endocrinology", [7030])}, "EndocrinologyDepartment": { "309925001": ("Endocrinology department (environment)", []) }, "EndometrialBiopsy": {"386802000": ("Endometrial biopsy", [6082])}, "EndometrialStructure": {"2739003": ("Endometrial structure (body structure)", [])}, "Endometrium": {"2739003": ("Endometrium", [8134, 12023])}, "Endoscopy": {"310030000": ("Endoscopy", [7030])}, "EndoscopyService": {"310030000": ("Endoscopy service (qualifier value)", [])}, "EndotrachealTube": { "26412008": ("Endotracheal tube", [6102, 6138, 6404, 7151, 7193]) }, "EndotrachealTubeDevice": { "26412008": ("Endotracheal tube, device (physical object)", []) }, "EnemaTubeDevice": {"67966000": ("Enema tube, device (physical object)", [])}, "Enflurane": {"387176008": ("Enflurane", [623, 624])}, "EnglishBulldogBreed": {"132388009": ("English Bulldog breed", [7480])}, "EnglishCobHorseBreed": {"132743006": ("English Cob horse breed", [7480])}, "EnglishCockerSpaniel": {"21418008": ("English cocker spaniel (organism)", [])}, "EnglishCockerSpanielDogBreed": { "21418008": ("English cocker spaniel dog breed", [7480]) }, "EnglishCoonhound": {"31281003": ("English coonhound (organism)", [])}, "EnglishCoonhoundDogBreed": {"31281003": ("English coonhound dog breed", [7480])}, "EnglishFoxhound": {"59975009": ("English foxhound", [7480])}, "EnglishGoatBreed": {"131691003": ("English goat breed", [7480])}, "EnglishGuernseyGoatBreed": {"131692005": ("English Guernsey goat breed", [7480])}, "EnglishHackHorseBreed": {"131964002": ("English Hack horse breed", [7480])}, "EnglishHunterHorseBreed": {"132746003": ("English Hunter horse breed", [7480])}, "EnglishLonghornCattleBreed": { "131594004": ("English Longhorn cattle breed", [7480]) }, "EnglishSetter": {"84367001": ("English setter (organism)", [])}, "EnglishSetterDogBreed": {"84367001": ("English setter dog breed", [7480])}, "EnglishShepherdDogBreed": {"132492001": ("English Shepherd dog breed", [7480])}, "EnglishSpringerSpaniel": {"62228004": ("English Springer spaniel (organism)", [])}, "EnglishSpringerSpanielDogBreed": { "62228004": ("English Springer spaniel dog breed", [7480]) }, "EnglishToySpaniel": {"67088002": ("English toy spaniel", [7480])}, "EnglishToyTerrierDogBreed": { "132423001": ("English Toy Terrier dog breed", [7480]) }, "Enlarged": {"260376009": ("Enlarged", [6107, 6118])}, "EnlargedAorticRoot": {"373133002": ("Enlarged Aortic Root", [3709])}, "EnlargedSeptalForamenOfHeart": { "287272002": ("Enlarged septal foramen of heart (disorder)", []) }, "Entire": {"255503000": ("Entire", [6347])}, "EntireAnulusFibrosusOfMitralOrifice": { "279174006": ("Entire anulus fibrosus of mitral orifice (body structure)", []) }, "EntireAnulusFibrosusOfTricuspidOrifice": { "279170002": ( "Entire anulus fibrosus of tricuspid orifice (body structure)", [], ) }, "EntireBloodVessel": {"361097006": ("Entire blood vessel (body structure)", [])}, "EntireBody": { "38266002": ( "Entire body", [ 4, 4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8103, 8134, 9514, 10060, ], ) }, "EntireBodyAsAWhole": {"38266002": ("Entire body as a whole (body structure)", [])}, "EntireBreast": {"181131000": ("Entire breast (body structure)", [])}, "EntireDeciduousMandibularLeftCanineTooth": { "245639007": ( "Entire deciduous mandibular left canine tooth (body structure)", [], ) }, "EntireDeciduousMandibularRightFirstMolarTooth": { "245631005": ( "Entire deciduous mandibular right first molar tooth (body structure)", [], ) }, "EntireDeciduousMaxillaryRightCentralIncisorTooth": { "245620002": ( "Entire deciduous maxillary right central incisor tooth (body structure)", [], ) }, "EntireDeciduousMaxillaryRightFirstMolarTooth": { "245616001": ( "Entire deciduous maxillary right first molar tooth (body structure)", [], ) }, "EntireDeciduousMaxillaryRightLateralIncisorTooth": { "245619008": ( "Entire deciduous maxillary right lateral incisor tooth (body structure)", [], ) }, "EntireGastrocnemiusVein": { "264481007": ("Entire gastrocnemius vein (body structure)", []) }, "EntirePulmonaryVeinGreatVessel": { "53603007": ("Entire pulmonary vein (great vessel) (body structure)", []) }, "EntireSkin": {"181469002": ("Entire skin (body structure)", [])}, "EntireVessel": {"361097006": ("Entire Vessel", [3019])}, "EntlebucherDogBreed": {"132486007": ("Entlebucher dog breed", [7480])}, "EntorhinalCortex": { "3937002": ("Entorhinal Cortex", [7151, 7153, 7192, 8134, 9514]) }, "Entrapment": {"363563002": ("entrapment", [3805])}, "EpagneulBleuDePicardieDogBreed": { "132478007": ("Epagneul Bleu de Picardie dog breed", [7480]) }, "EpagneulPicardDogBreed": {"132477002": ("Epagneul Picard dog breed", [7480])}, "EpagneulPontAudemerDogBreed": { "132480001": ("Epagneul Pont-Audemer dog breed", [7480]) }, "Ephedrine": {"387358007": ("Ephedrine", [65])}, "Epicardial": {"261073003": ("epicardial", [3843])}, "EpicardialEchocardiography": { "433232009": ("Epicardial echocardiography", [3405, 3428, 12001]) }, "Epicardium": {"6871001": ("Epicardium", [3011, 8134])}, "EpidermalInclusionCyst": {"419670003": ("Epidermal inclusion cyst", [6030, 6031])}, "EpidermoidCyst": {"419670003": ("Epidermoid cyst (morphologic abnormality)", [])}, "Epididymis": {"87644002": ("Epididymis", [8134])}, "EpididymisStructure": {"87644002": ("Epididymis structure (body structure)", [])}, "EpiduralAnesthesia": {"18946005": ("Epidural anesthesia", [611, 612])}, "EpigastricLymphNode": {"60965003": ("epigastric lymph node", [7600, 8134])}, "EpigastricRegion": { "27947004": ("Epigastric region", [4, 7151, 7192, 8134, 9514]) }, "EpigastricRegionStructure": { "27947004": ("Epigastric region structure (body structure)", []) }, "Epilepsy": {"84757009": ("Epilepsy (disorder)", [])}, "EpilepticConvulsions": {"84757009": ("Epileptic convulsions", [60, 9300])}, "Epinephrine": {"387362001": ("Epinephrine", [10])}, "EpirusCattleBreed": {"133381006": ("Epirus cattle breed", [7480])}, "EpitrochlearLymphNode": {"28870006": ("epitrochlear lymph node", [7600, 8134])}, "EpoxyResin": {"65345002": ("Epoxy resin", [8115])}, "Equal": {"9726003": ("Equal", [75])}, "EqualDensityIsodenseLesion": { "129745007": ("Equal density (isodense) lesion", [6008, 6009]) }, "EquipmentTemperature": { "250881009": ("Equipment temperature (observable entity)", []) }, "Equivocal": {"42425007": ("Equivocal", [3120])}, "Equus": {"388445009": ("Equus", [7454])}, "EquusCaballus": {"35354009": ("Equus caballus", [7454])}, "EquusCaballusGmelini": {"125084002": ("Equus caballus gmelini (organism)", [])}, "EquusCaballusGmeliniHorseBreed": { "125084002": ("Equus caballus gmelini horse breed", [7480]) }, "ErasoModification": {"424655003": ("Eraso Modification", [4012])}, "ErasoModificationProjection": { "424655003": ("Eraso Modification projection (qualifier value)", []) }, "ErectorSpinaeMuscle": { "44947003": ( "Erector spinae muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "ErhulianPigBreed": {"132317007": ("Erhulian pig breed", [7480])}, "ErieGarnetStain": {"40076005": ("erie garnet stain", [8112])}, "EriochromeBlueBlackSEStain": { "58631000": ("eriochrome blue black SE stain", [8112]) }, "EriskayPonyHorseBreed": {"132747007": ("Eriskay Pony horse breed", [7480])}, "ErlunchunHorseBreed": {"131976002": ("Erlunchun horse breed", [7480])}, "EruptionCausedByDrug": {"28926001": ("Eruption caused by drug (disorder)", [])}, "EruptionOfSkin": {"271807003": ("Eruption of skin (disorder)", [])}, "Erythema": {"247441003": ("Erythema", [4406, 4408, 6055])}, "ErythrosinBStain": {"7434003": ("erythrosin B stain", [8112])}, "ErythrosinYStain": {"5043000": ("erythrosin Y stain", [8112])}, "ErzgebirgGoatBreed": {"131667007": ("Erzgebirg goat breed", [7480])}, "EskimoDog": {"89450005": ("Eskimo dog", [7480])}, "EsophagealApertureOfDiaphragm": { "280062008": ("Esophageal aperture of diaphragm (body structure)", []) }, "EsophagealArtery": { "206034008": ("Esophageal artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514]) }, "EsophagealHiatus": { "280062008": ( "Esophageal Hiatus", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "EsophagealLymphNode": {"11899006": ("esophageal lymph node", [7600, 8134])}, "EsophagealStructure": {"32849002": ("Esophageal structure (body structure)", [])}, "Esophagus": { "32849002": ( "Esophagus", [ 4009, 4030, 4031, 4042, 6102, 6109, 6113, 6149, 7151, 7155, 7192, 7482, 7483, 8134, 9514, 10044, 10060, ], ) }, "EsophagusStomachAndDuodenum": { "110861005": ( "Esophagus, stomach and duodenum", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 8134, 9514], ) }, "EsophagusStomachAndDuodenumCombinedSite": { "110861005": ( "Esophagus, stomach and duodenum (combined site) (body structure)", [], ) }, "Estimated": {"414135002": ("Estimated", [3627, 3745, 6140, 10009])}, "EstonianBaconPigBreed": {"132274007": ("Estonian Bacon pig breed", [7480])}, "EstonianBlackPiedCattleBreed": { "133382004": ("Estonian Black Pied cattle breed", [7480]) }, "EstonianDraftHorseBreed": {"132749005": ("Estonian Draft horse breed", [7480])}, "EstonianHoundDogBreed": {"132479004": ("Estonian Hound dog breed", [7480])}, "EstonianNativeCattleBreed": { "133389008": ("Estonian Native cattle breed", [7480]) }, "EstonianNativeHorseBreed": {"133018002": ("Estonian Native horse breed", [7480])}, "EstonianRedCattleBreed": {"131595003": ("Estonian Red cattle breed", [7480])}, "EstrelaMountainDogBreed": {"132476006": ("Estrela Mountain Dog breed", [7480])}, "Estrogen": {"41598000": ("Estrogen (substance)", [])}, "EstrogenProduct": {"61946003": ("Estrogen product", [6080])}, "EstrogenReceptorAgonist": {"1052201004": ("Estrogen", [621, 622])}, "EstrogenicPreparation": {"61946003": ("Estrogenic preparation (product)", [])}, "Ethanol": {"419442005": ("Ethanol", [10, 8114])}, "EthmoidBone": {"52374004": ("Ethmoid bone", [4028, 7151, 7192, 8134, 9514])}, "EthmoidBoneStructure": { "52374004": ("Ethmoid bone structure (body structure)", []) }, "EthylAlcohol": {"419442005": ("Ethyl alcohol", [6089])}, "EthylVioletStain": {"65445001": ("ethyl violet stain", [8112])}, "EthylenediamineTetraAcetateGallium68": { "423498000": ("Ethylenediamine tetra-acetate gallium^68^ (product)", []) }, "Etiology": {"134198009": ("Etiology (attribute)", [])}, "Etomidate": {"387218008": ("Etomidate", [623, 625])}, "EurasianDogBreed": {"132481002": ("Eurasian dog breed", [7480])}, "EurasierDogBreed": {"132387004": ("Eurasier dog breed", [7480])}, "EurolinePigBreed": {"132026004": ("Euroline pig breed", [7480])}, "Europium": {"767775001": ("Europium", [10006, 10067])}, "EustachianCanalStructure": { "91207004": ("Eustachian canal structure (body structure)", []) }, "EvaluationOfMurmur": {"373112006": ("Evaluation of murmur", [3671])}, "EvaluationProcedure": {"386053000": ("Evaluation procedure", [6028])}, "EvansBlueStain": {"22931006": ("Evans blue stain", [8112])}, "EvolèneCattleBreed": {"131596002": ("Evolène cattle breed", [7480])}, "EwingSarcoma": {"76909002": ("Ewing's sarcoma", [638, 639])}, "EwingSarcomaPeripheralNeuroectodermalTumor": { "703707001": ("Ewing sarcoma / peripheral neuroectodermal tumor", [638, 639]) }, "ExSmoker": {"8517006": ("Ex-smoker (finding)", [])}, "ExaggeratedCranioCaudalProjection": { "399265009": ("Exaggerated cranio-caudal projection (qualifier value)", []) }, "ExaminationOfBreast": {"46662001": ("Examination of breast", [6050, 6083])}, "Excision": {"65801008": ("Excision", [8109])}, "ExcisionOfSkin": {"440258006": ("Excision of skin", [4409])}, "Exercise": {"256235009": ("Exercise", [3774])}, "ExerciseChallenge": { "128967005": ("Exercise challenge", [91, 3250, 3271, 3405, 3651]) }, "ExerciseECGAbnormal": {"165084003": ("Exercise ECG abnormal", [3208])}, "ExerciseECGEquivocal": {"370367002": ("Exercise ECG equivocal", [3208])}, "ExerciseECGNormal": {"165082004": ("Exercise ECG normal", [3208])}, "ExerciseInducedAngina": {"300995000": ("Exercise-induced angina (disorder)", [])}, "ExerciseState": {"128976003": ("Exercise state", [3262, 3602])}, "ExerciseStressECGTest": {"46136006": ("Exercise stress ECG test", [3261, 12001])}, "ExerciseStressEchocardiography": { "433233004": ("Exercise Stress echocardiography", [3757, 12001]) }, "ExerciseStressTest": {"165079009": ("Exercise stress test", [3200])}, "ExerciseTolerance": {"248243004": ("Exercise tolerance (observable entity)", [])}, "ExerciseToleranceTest": {"165079009": ("Exercise Tolerance Test", [3757])}, "ExerciseToleranceTestAbnormal": { "165084003": ("Exercise tolerance test abnormal (finding)", []) }, "ExerciseToleranceTestEquivocal": { "370367002": ("Exercise tolerance test equivocal (finding)", []) }, "ExerciseToleranceTestNormal": { "165082004": ("Exercise tolerance test normal (finding)", []) }, "ExerciseToleranceTestRefused": { "408551003": ("Exercise tolerance test refused (situation)", []) }, "ExerciserDevice": {"111045004": ("Exerciser, device (physical object)", [])}, "ExertionalHypertension": {"429198000": ("Exertional hypertension", [3213])}, "ExertionalHypotension": {"429561008": ("Exertional hypotension", [3213])}, "ExmoorHornSheepBreed": {"131719005": ("Exmoor Horn sheep breed", [7480])}, "ExmoorPonyHorseBreed": {"133019005": ("Exmoor Pony horse breed", [7480])}, "ExoticShorthairedCat": {"26057009": ("Exotic shorthaired cat", [7480])}, "ExpandingAneurysm": {"125272005": ("expanding aneurysm", [3808])}, "Expiration": {"58322009": ("expiration", [3823, 9272, 12234])}, "Extension": {"24154002": ("Extension", [92])}, "Extent": {"260858005": ("Extent (attribute)", [])}, "ExtentOfCardiacPerfusionDefect": { "427751006": ("Extent of cardiac perfusion defect (observable entity)", []) }, "ExtentOfMyocardialStressIschemia": { "429162008": ("Extent of myocardial stress ischemia (observable entity)", []) }, "Extents": {"255590007": ("Extents (qualifier value)", [])}, "External": {"261074009": ("External", [2, 5, 6139])}, "ExternalAuditoryCanal": { "84301002": ("External auditory canal", [4, 4040, 7151, 7192, 8134, 9514]) }, "ExternalAuditoryCanalStructure": { "84301002": ("External auditory canal structure (body structure)", []) }, "ExternalAuditoryMeatus": { "84301002": ("External Auditory Meatus", [1000, 1001, 1002]) }, "ExternalCamera": {"409903006": ("External Camera", [4202])}, "ExternalCapsule": {"10517005": ("external capsule", [7702, 7710, 8134])}, "ExternalCapsuleOfBrain": { "10517005": ("External capsule of brain (body structure)", []) }, "ExternalCarotidArtery": { "22286001": ( "External carotid artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12104], ) }, "ExternalCarotidArteryStructure": { "22286001": ("External carotid artery structure (body structure)", []) }, "ExternalCounterPulsation": {"371790000": ("External Counter-Pulsation", [3553])}, "ExternalCounterPulsationCirculatorySupportDevice": { "371790000": ( "External counter-pulsation circulatory support device (physical object)", [], ) }, "ExternalEar": {"28347008": ("External ear", [4028, 7151, 7192, 8134, 9514])}, "ExternalEarStructure": { "28347008": ("External ear structure (body structure)", []) }, "ExternalElasticMembrane": {"414165007": ("External Elastic Membrane", [3497])}, "ExternalElasticMembraneOfArtery": { "414165007": ("External elastic membrane of artery (body structure)", []) }, "ExternalIliacArtery": { "113269004": ( "External iliac artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "ExternalIliacLymphNode": {"65349008": ("external iliac lymph node", [7600, 8134])}, "ExternalIliacVein": { "63507001": ( "External iliac vein", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "ExternalIntercostalMuscle": { "53967007": ( "External intercostal muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "ExternalJugularVein": { "71585003": ( "External jugular vein", [6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "ExternalMammaryLymphNode": { "421988007": ("external mammary lymph node", [7600, 8134]) }, "ExternalProsthesisForSonographicProcedureDevice": { "102322008": ( "External prosthesis for sonographic procedure, device (physical object)", [], ) }, "ExternalProsthesisForSonographicProcedureStandOff": { "102322008": ("External prosthesis for sonographic procedure [Stand-off]", [5]) }, "ExternalRotation": {"52019005": ("External rotation", [92])}, "ExternalRotationFunction": { "52019005": ("External rotation, function (observable entity)", []) }, "ExtraAbdominalDesmoid": {"47284001": ("Extra abdominal desmoid", [6030, 6031])}, "ExtraArticular": {"87687004": ("Extra-articular", [2])}, "ExtraCorporealCirculation": {"182744004": ("Extra-corporeal circulation", [3553])}, "ExtracorporealCirculationProcedure": { "182744004": ("Extracorporeal circulation procedure (procedure)", []) }, "ExtrafovealOcularFixation": { "251786004": ("Extrafoveal ocular fixation (finding)", []) }, "ExtrapulmonaryLymphNodeOfLung": { "363537007": ("extrapulmonary lymph node of lung", [7600, 8134]) }, "ExtremelyDense": {"129719003": ("Extremely dense", [6000, 6001])}, "ExtremelyDenseBreastComposition": { "129719003": ("Extremely dense breast composition (finding)", []) }, "Extremity": { "66019005": ("Extremity", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "Eye": { "81745001": ("Eye", [4, 4009, 4030, 4031, 4042, 4209, 7151, 7192, 8134, 9514]) }, "EyeLenses": {"78076003": ("Eye lenses", [10044, 10060])}, "EyeLubricant": {"470091001": ("Eye lubricant (physical object)", [])}, "EyeRadiationShield": {"469266003": ("Eye radiation shield", [9572, 9573])}, "EyeRegion": { "371398005": ( "Eye region", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "EyeRegionStructure": {"371398005": ("Eye region structure (body structure)", [])}, "Eyeball": {"79652003": ("Eyeball", [4028, 7151, 7192, 8134, 9514])}, "Eyelash": {"85803001": ("Eyelash", [4029, 8134])}, "Eyelid": {"80243003": ("Eyelid", [4, 4209, 7151, 7192, 8134, 9514])}, "EyelidDisease": {"60113004": ("Eyelid Disease", [4222])}, "EyelidStructure": {"80243003": ("Eyelid structure (body structure)", [])}, "FHCElitePig1": {"45635003": ("FHC elite pig 1 (organism)", [])}, "FHCElitePig1PigBreed": {"45635003": ("FHC elite pig 1 pig breed", [7480])}, "FHCElitePig2": {"59667000": ("FHC elite pig 2 (organism)", [])}, "FHCElitePig2PigBreed": {"59667000": ("FHC elite pig 2 pig breed", [7480])}, "FHCElitePig3": {"24111007": ("FHC elite pig 3 (organism)", [])}, "FHCElitePig3PigBreed": {"24111007": ("FHC elite pig 3 pig breed", [7480])}, "FHCElitePig4": {"47795006": ("FHC elite pig 4 (organism)", [])}, "FHCElitePig4PigBreed": {"47795006": ("FHC elite pig 4 pig breed", [7480])}, "FHCElitePig5": {"67720004": ("FHC elite pig 5 (organism)", [])}, "FHCElitePig5PigBreed": {"67720004": ("FHC elite pig 5 pig breed", [7480])}, "FHCElitePig6": {"49462008": ("FHC elite pig 6 (organism)", [])}, "FHCElitePig6PigBreed": {"49462008": ("FHC elite pig 6 pig breed", [7480])}, "FHCElitePig7": {"32683006": ("FHC elite pig 7 (organism)", [])}, "FHCElitePig7PigBreed": {"32683006": ("FHC elite pig 7 pig breed", [7480])}, "FHCElitePig8": {"73005003": ("FHC elite pig 8 (organism)", [])}, "FHCElitePig8PigBreed": {"73005003": ("FHC elite pig 8 pig breed", [7480])}, "FHCElitePig9": {"14063001": ("FHC elite pig 9 (organism)", [])}, "FHCElitePig9PigBreed": {"14063001": ("FHC elite pig 9 pig breed", [7480])}, "FHCPig": {"89928000": ("FHC pig (organism)", [])}, "FHCPigBreed": {"89928000": ("FHC pig breed", [7480])}, "FRSCattleBreed": {"133393002": ("FRS cattle breed", [7480])}, "FabrianeseSheepBreed": {"131718002": ("Fabrianese sheep breed", [7480])}, "Face": {"89545001": ("Face", [4, 7151, 7192, 8134, 9514])}, "FaceStructure": {"89545001": ("Face structure (body structure)", [])}, "FacialArtery": { "23074001": ( "Facial artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "FacialBones": { "91397008": ( "Facial bones", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "FacialLymphNode": {"48918001": ("facial lymph node", [7600, 8134])}, "FacialNerve": {"56052001": ("facial nerve", [7706, 7710, 8134])}, "FacialNerveStructure": { "56052001": ("Facial nerve structure (body structure)", []) }, "FacialSwelling": {"278528006": ("Facial Swelling", [60, 9300])}, "FaeroesCattleBreed": {"133390004": ("Faeroes cattle breed", [7480])}, "FaeroesIslandHorseHorseBreed": { "133020004": ("Faeroes Island Horse horse breed", [7480]) }, "FaeroesSheepBreed": {"132846008": ("Faeroes sheep breed", [7480])}, "FailedAttemptedProcedure": {"103709008": ("Failed attempted procedure", [9])}, "FalabellaHorseBreed": {"133021000": ("Falabella horse breed", [7480])}, "FallopianTube": {"31435000": ("Fallopian tube", [7151, 7160, 7192, 8134, 9514])}, "FallopianTubeStructure": { "31435000": ("Fallopian tube structure (body structure)", []) }, "FamilyHistoryCardiovascularDisease": { "266894000": ("Family history: Cardiovascular disease (situation)", []) }, "FamilyHistoryDiabetesMellitus": { "160303001": ("Family history: Diabetes mellitus (situation)", []) }, "FamilyHistoryMyocardialInfarction": { "266897007": ("Family history: Myocardial infarction (situation)", []) }, "FamilyHistoryOfBreastCancer": { "429740004": ("Family history of breast cancer", [6081, 6087]) }, "FamilyHistoryOfCardiovascularDisease": { "266894000": ("Family history of cardiovascular disease", [3758]) }, "FamilyHistoryOfClinicalFinding": { "416471007": ("Family history of clinical finding (situation)", []) }, "FamilyHistoryOfCoronaryArteriosclerosis": { "430091005": ("Family history of coronary arteriosclerosis", [3758]) }, "FamilyHistoryOfDiabetesMellitus": { "160303001": ("Family history of diabetes mellitus", [3758]) }, "FamilyHistoryOfMalignantMelanoma": { "427858005": ("Family history of malignant melanoma (situation)", []) }, "FamilyHistoryOfMalignantNeoplasmOfBreast": { "429740004": ("Family history of malignant neoplasm of breast (situation)", []) }, "FamilyHistoryOfMyocardialInfarction": { "266897007": ("Family history of myocardial infarction", [3758]) }, "FamilyHistoryUnknown": {"407559004": ("Family history unknown", [3758, 6322])}, "FamilyHistoryWithExplicitContext": { "57177007": ("Family history with explicit context (situation)", []) }, "FannongSpottedPigBreed": {"132332000": ("Fannong Spotted pig breed", [7480])}, "FascialLayer": { "120576005": ("Fascial layer", [6102, 6109, 6113, 6148, 7151, 7192, 9514]) }, "FastBlueBBSaltStain": {"91295002": ("fast blue BB salt stain", [8112])}, "FastBlueBSaltStain": {"34700000": ("fast blue B salt stain", [8112])}, "FastBlueRRSaltStain": {"64112001": ("fast blue RR salt stain", [8112])}, "FastGarnetGBCSaltStain": {"89148006": ("fast garnet GBC salt stain", [8112])}, "FastGreenFCFStain": {"24167004": ("fast green FCF stain", [8112])}, "FastRedBSaltStain": {"40718007": ("fast red B salt stain", [8112])}, "FastRedITRStain": {"47486002": ("fast red ITR stain", [8112])}, "FastRedTRSaltStain": {"76633005": ("fast red TR salt stain", [8112])}, "FastSulfonBlackFStain": {"88660000": ("fast sulfon black F stain", [8112])}, "FastVioletBSaltStain": {"72371006": ("fast violet B salt stain", [8112])}, "Fat": {"256674009": ("Fat", [218, 300, 6122, 6211, 7180, 7469])}, "FatContainingRadiolucentLesion": { "129747004": ("Fat containing (radiolucent) lesion", [6008, 6009]) }, "FatNecrosisOfBreast": {"21381006": ("Fat necrosis of breast", [6030, 6031])}, "FatRed7BStain": {"76439002": ("fat red 7B stain", [8112])}, "Fatal": {"399166001": ("Fatal", [3716])}, "Fatigue": {"84229001": ("Fatigue", [3220, 3221])}, "FattyDegeneration": {"29185008": ("fatty degeneration", [3802])}, "FattyStreaks": {"53151000": ("fatty streaks", [3817])}, "FauveDeBretagneDogBreed": {"132426009": ("Fauve de Bretagne dog breed", [7480])}, "Feces": {"39477002": ("Feces", [6201, 7151, 7197])}, "FeedingPatientRegimeTherapy": { "75118006": ("Feeding patient (regime/therapy)", []) }, "FeedingTube": {"25062003": ("Feeding tube", [6102, 6138, 6404, 7151, 7193])}, "FeedingTubeDevice": {"25062003": ("Feeding tube, device (physical object)", [])}, "FeetFirst": {"102541007": ("feet-first", [21])}, "FeetfirstPosition": {"102541007": ("Feetfirst position (finding)", [])}, "FelineSpecies": {"23826000": ("Feline species (organism)", [])}, "Felis": {"388626009": ("Felis", [7454])}, "FelisCatus": {"448169003": ("Felis catus", [7454])}, "FellPonyHorseBreed": {"132996008": ("Fell Pony horse breed", [7480])}, "FellTerrierDogBreed": {"132482009": ("Fell Terrier dog breed", [7480])}, "FellataCattleBreed": {"133651005": ("Fellata cattle breed", [7480])}, "FemaleExternalGenitaliaStructure": { "86969008": ("Female external genitalia structure (body structure)", []) }, "FemaleExternalUrethralOrifice": { "279479008": ("Female external urethral orifice", [4029, 8134]) }, "FemaleFirstCousin": {"270002": ("Female first cousin", [7450, 7451])}, "FemaleGenitalLymphNode": { "314736006": ("female genital lymph node", [7600, 8134]) }, "FemaleInternalGenitalia": { "699886009": ("Female internal genitalia", [7151, 7160, 7192, 8134, 9514]) }, "FemaleInternalGenitaliaStructure": { "87759004": ("Female internal genitalia structure (body structure)", []) }, "FemoralArtery": { "7657000": ( "Femoral artery", [4, 3010, 3440, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "FemoralArteryPressureWaveform": { "128442000": ("Femoral artery pressure waveform", [3003]) }, "FemoralHead": {"2812003": ("Femoral head", [1000, 1001, 1005, 8134])}, "FemoralHeadProsthesis": {"304121006": ("Femoral Head Prosthesis", [7307, 7308])}, "FemoralVein": { "83419000": ( "Femoral vein", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "FemoralVeinStructure": { "83419000": ("Femoral vein structure (body structure)", []) }, "Femur": { "71341001": ( "Femur", [ 4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514, 12020, 12021, ], ) }, "FengjingPigBreed": {"132233007": ("Fengjing pig breed", [7480])}, "Ferguson": {"399372008": ("Ferguson", [4012])}, "FergusonProjection": {"399372008": ("Ferguson projection (qualifier value)", [])}, "FerrandaisCattleBreed": {"133383009": ("Ferrandais cattle breed", [7480])}, "FerricHexacyanoferrateII": { "406452004": ("Ferric hexacyanoferrate-II (substance)", []) }, "FerrousChlorideFe59": {"31192007": ("Ferrous chloride Fe^59^", [25])}, "FerrousCitrateFe59": {"87958003": ("Ferrous citrate Fe^59^", [25])}, "FerrousSulfateFe59": {"125001": ("Ferrous sulfate Fe^59^", [25])}, "FetalEchocardiography": {"433235006": ("Fetal echocardiography", [12001])}, "FetalUmbilicalVein": {"13576009": ("Umbilical Vein", [12140])}, "FetlockOfForelimb": {"13190002": ("Fetlock of forelimb", [7482, 7483, 8134])}, "FetlockOfHindlimb": {"113351006": ("Fetlock of hindlimb", [7482, 7483, 8134])}, "FetlockRegionOfForelimb": { "13190002": ("Fetlock region of forelimb (body structure)", []) }, "FetlockRegionOfHindlimb": { "113351006": ("Fetlock region of hindlimb (body structure)", []) }, "Fetocide": {"133874006": ("Fetocide (selective reduction)", [9])}, "FeulgenReactionStain": {"255797007": ("Feulgen reaction stain", [8112])}, "Fever": {"386661006": ("Fever", [12246])}, "FeverWithChills": {"274640006": ("Fever with chills (finding)", [])}, "FiberopticCatheter": {"371801001": ("Fiberoptic catheter", [3429])}, "FiberopticCatheterMethod": {"133912003": ("Fiberoptic catheter method", [3241])}, "Fibril": {"88921000": ("Fibril", [637])}, "FibrinogenI123": {"71636003": ("Fibrinogen I^123^", [25])}, "Fibrinolysin": {"764170006": ("Fibrinolysin", [10])}, "Fibroadenoma": {"254845004": ("Fibroadenoma", [6030, 6031])}, "FibroadenomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "65877006": ( "Fibroadenoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "FibroadenomaOfBreast": {"254845004": ("Fibroadenoma of breast (disorder)", [])}, "FibrocysticBreastChanges": { "27431007": ("Fibrocystic breast changes (finding)", []) }, "FibrocysticDiseaseOfBreast": { "27431007": ("Fibrocystic disease of breast", [6030, 6031]) }, "Fibroelastosis": {"72166006": ("fibroelastosis", [3817])}, "Fibromatosis": {"19928005": ("Fibromatosis", [6030, 6031])}, "FibromuscularDysplasia": {"31653004": ("fibromuscular dysplasia", [3810])}, "Fibrosarcoma": {"53654007": ("Fibrosarcoma", [638, 639, 6030, 6033])}, "FibrosingAdenosis": { "50916005": ("Fibrosing adenosis (morphologic abnormality)", []) }, "Fibrosis": {"112674009": ("Fibrosis", [6335, 6336, 6337, 6338])}, "Fibrous": {"255423002": ("fibrous", [3802, 3805])}, "FibrousHistiocytomaMalignant": { "34360000": ("Fibrous histiocytoma, malignant (morphologic abnormality)", []) }, "FibrousPlaque": {"40772000": ("Fibrous Plaque", [3491, 3495, 3496, 3497, 7111])}, "Fibula": { "87342007": ( "Fibula", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514, 12021], ) }, "FibularLymphNode": {"31171007": ("fibular lymph node", [7600, 8134])}, "FieldSpaniel": {"27385008": ("Field spaniel (organism)", [])}, "FieldSpanielDogBreed": {"27385008": ("Field spaniel dog breed", [7480])}, "FieldStain": {"255798002": ("field's stain", [8112])}, "FifthIntercostalSpace": {"117137004": ("Fifth Intercostal Space", [5])}, "FifthLumbarArtery": { "397411003": ( "Fifth Lumbar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "FifthPercentile": {"371888009": ("Fifth percentile (qualifier value)", [])}, "FifthVentricle": {"180933005": ("Fifth ventricle (body structure)", [])}, "FightingBullCattleBreed": {"131597006": ("Fighting Bull cattle breed", [7480])}, "FilaBrasileiroDogBreed": {"132483004": ("Fila Brasileiro dog breed", [7480])}, "Finding": {"404684003": ("Finding", [3769])}, "FindingByInspectionSimpleObservation": { "118243007": ("Finding by inspection (simple observation) (finding)", []) }, "FindingByPalpation": {"118242002": ("Finding by palpation (finding)", [])}, "FindingLessWellDefinedSincePreviousMammogram": { "129728002": ( "Finding less well defined since previous mammogram (finding)", [], ) }, "FindingMoreDefinedSincePreviousMammogram": { "129729005": ("Finding more defined since previous mammogram (finding)", []) }, "FindingOfChangeSincePreviousMammogram": { "129720009": ("Finding of change since previous mammogram (finding)", []) }, "FindingOfDifferenceInBorderDefinitionComparedToPreviousRadiologicExamination": { "442688001": ( "Finding of difference in border definition compared to previous radiologic examination (finding)", [], ) }, "FindingOfDifferenceInBorderShapeComparedToPreviousRadiologicExamination": { "442755000": ( "Finding of difference in border shape compared to previous radiologic examination (finding)", [], ) }, "FindingOfDifferenceInDistributionComparedToPreviousRadiologicExamination": { "442704007": ( "Finding of difference in distribution compared to previous radiologic examination (finding)", [], ) }, "FindingOfDifferenceInLocation": { "442726008": ("Difference in location", [6133, 6207]) }, "FindingOfDifferenceInRadiographicAttenuationComparedToPreviousRadiologicExamination": { "442707000": ( "Finding of difference in radiographic attenuation compared to previous radiologic examination " "(finding)", [], ) }, "FindingOfDifferenceInSiteInvolvementComparedToPreviousRadiologicExamination": { "442711006": ( "Finding of difference in site involvement compared to previous radiologic examination (finding)", [], ) }, "FindingOfDifferenceInSize": {"442714003": ("Difference in size", [6133, 6207])}, "FindingOfDifferenceInSubstanceComparedToPreviousRadiologicExamination": { "442691001": ( "Finding of difference in substance compared to previous radiologic examination (finding)", [], ) }, "FindingOfDifferenceInTextureComparedToPreviousRadiologicExamination": { "442700003": ( "Finding of difference in texture compared to previous radiologic examination (finding)", [], ) }, "FindingOfElectrocardiogramSTSegment": { "365416000": ("Finding of electrocardiogram ST segment (finding)", []) }, "FindingOfFunctionalPerformanceAndActivity": { "248536006": ("Finding of functional performance and activity (finding)", []) }, "FindingOfGestationalSac": { "300571009": ("Finding of gestational sac (finding)", []) }, "FindingOfLeftVentricularFunction": { "366188009": ("Finding of left ventricular function (finding)", []) }, "FindingOfLesion": {"300577008": ("Finding of lesion (finding)", [])}, "FindingOfTobaccoSmokingBehavior": { "365981007": ("Finding of tobacco smoking behavior (finding)", []) }, "FindingPartiallyRemoved": { "129722001": ("Finding partially removed", [6002, 6003, 6134]) }, "FindingPartiallyRemovedSincePreviousMammogram": { "129722001": ( "Finding partially removed since previous mammogram (finding)", [], ) }, "FindingRelatingToDrugMisuseBehavior": { "228366006": ("Finding relating to drug misuse behavior (finding)", []) }, "FindingReportedByPatientInformant": { "418799008": ("Finding reported by patient/informant", [3769]) }, "FindingReportedBySubjectOrHistoryProvider": { "418799008": ("Finding reported by subject or history provider (finding)", []) }, "FindingSite": {"363698007": ("Finding Site", [9000])}, "FindingsCategoryType": { "276214006": ("Findings category type (qualifier value)", []) }, "FindingsValues": {"260245000": ("Findings values (qualifier value)", [])}, "FineLinearBranchingCastingCalcification": { "129762002": ("Fine linear, branching (casting) calcification", [6010, 6011]) }, "FineLinearBranchingCastingRadiographicCalcification": { "129762002": ( "Fine, linear, branching (casting) radiographic calcification (finding)", [], ) }, "FineLinearCastingCalcification": { "129761009": ("Fine, linear (casting) calcification", [6010, 6011]) }, "FineLinearCastingRadiographicCalcification": { "129761009": ( "Fine, linear, (casting) radiographic calcification (finding)", [], ) }, "FineMerinoSheepBreed": {"132722005": ("Fine Merino sheep breed", [7480])}, "FineNeedleAspirationOfBreast": { "387736007": ("Fine needle aspiration of breast", [6050, 6083]) }, "FineSlitBeamDirectIllumination": { "410462008": ("Fine slit beam direct illumination", [4203]) }, "FineSlitBeamDirectIlluminationAction": { "410462008": ( "Fine slit beam direct illumination - action (qualifier value)", [], ) }, "Finger": { "7569003": ("Finger", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "FingerJoint": {"125682004": ("Finger Joint", [7304, 8134])}, "FingerJointStructure": { "125682004": ("Finger joint structure (body structure)", []) }, "FingerStructure": {"7569003": ("Finger structure (body structure)", [])}, "FinnhorseDraftHorseBreed": {"131993002": ("Finnhorse Draft horse breed", [7480])}, "FinnhorseHorseBreed": {"133029003": ("Finnhorse horse breed", [7480])}, "FinnishAyrshireCattleBreed": { "133384003": ("Finnish Ayrshire cattle breed", [7480]) }, "FinnishHoundDogBreed": {"132484005": ("Finnish Hound dog breed", [7480])}, "FinnishLandraceGoatBreed": {"131666003": ("Finnish Landrace goat breed", [7480])}, "FinnishLandracePigBreed": {"132234001": ("Finnish Landrace pig breed", [7480])}, "FinnishLandraceSheep": {"72329005": ("Finnish landrace sheep (organism)", [])}, "FinnishLandraceSheepBreed": {"72329005": ("Finnish landrace sheep breed", [7480])}, "FinnishLapphundDogBreed": {"132485006": ("Finnish Lapphund dog breed", [7480])}, "FinnishSpitzDog": {"83504004": ("Finnish spitz dog", [7480])}, "FinnishYorkshirePigBreed": {"132269004": ("Finnish Yorkshire pig breed", [7480])}, "FirstDegreeAtrioventricularBlock": { "270492004": ("First degree Atrioventricular block", [3230]) }, "FirstIntercostalSpace": {"117133000": ("First Intercostal Space", [5])}, "FirstLumbarArtery": { "397407009": ( "First Lumbar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "FirstMolarRegion": {"699507006": ("First molar region", [4017])}, "FirstMolarRegionOfOralCavity": { "699507006": ("First molar region of oral cavity (body structure)", []) }, "FirstPremolarRegion": {"699509009": ("First premolar region", [4017])}, "FirstPremolarRegionOfOralCavity": { "699509009": ("First premolar region of oral cavity (body structure)", []) }, "FishOils": {"346441008": ("Fish oils", [3761])}, "Fisk": {"424962005": ("Fisk", [4012])}, "FiskProjection": {"424962005": ("Fisk projection (qualifier value)", [])}, "FissureOfLung": { "278983006": ("Fissure of lung", [6102, 6109, 6112, 7151, 7192, 9514]) }, "FistulaCoronaryToLeftAtrium": { "128555001": ("Fistula coronary to left atrium", [3604, 3606, 3630]) }, "FistulaCoronaryToLeftVentricle": { "128556000": ("Fistula coronary to left ventricle", [3604, 3606, 3630]) }, "FistulaCoronaryToRightAtrium": { "373095005": ("Fistula coronary to right atrium", [3604, 3606, 3630]) }, "FistulaCoronaryToRightVentricle": { "128558004": ("Fistula coronary to right ventricle", [3604, 3606, 3630]) }, "FitzpatrickClassificationOfSkinType": { "443635002": ("Fitzpatrick classification of skin type (assessment scale)", []) }, "FiveChamber": {"398994001": ("Five chamber", [6, 501, 502])}, "FiveChamberView": {"398994001": ("Five chamber view (qualifier value)", [])}, "FixedMyocardialPerfusionDefect": { "251057006": ("Fixed myocardial perfusion defect", [3113]) }, "FjallCattleBreed": {"131598001": ("Fjall cattle breed", [7480])}, "FjordHorse": {"89648005": ("Fjord horse (organism)", [])}, "FjordHorseBreed": {"89648005": ("Fjord horse breed", [7480])}, "FlagellarStain": {"255799005": ("Flagellar stain", [8112])}, "Flank": {"58602004": ("Flank", [4, 644, 7151, 7192, 8134, 9514])}, "FlankStructure": {"58602004": ("Flank structure (body structure)", [])}, "Flat": {"6041008": ("Flat", [6209])}, "FlatCoatedRetriever": {"9528004": ("Flat-coated retriever (organism)", [])}, "FlatCoatedRetrieverDogBreed": { "9528004": ("Flat-coated retriever dog breed", [7480]) }, "Fleischner": {"399281004": ("Fleischner", [4012])}, "FleischnerProjection": { "399281004": ("Fleischner projection (qualifier value)", []) }, "FlemishCattleBreed": {"133385002": ("Flemish cattle breed", [7480])}, "FleuveHorseBreed": {"133106009": ("Fleuve horse breed", [7480])}, "Flexion": {"9964006": ("Flexion", [92])}, "FlexionFunction": {"9964006": ("Flexion, function (observable entity)", [])}, "Floor": {"709280007": ("Floor", [7151, 7157, 7193, 9505, 9515, 9520, 9573])}, "FloorOfMouth": {"36360002": ("floor of mouth", [7601, 8134])}, "FloorOfMouthStructure": { "36360002": ("Floor of mouth structure (body structure)", []) }, "Florbetaben18F": {"712736002": ("Florbetaben [18F] (substance)", [])}, "FlorbetabenF18": {"712736002": ("Florbetaben F^18^", [4021])}, "FlorbetapirF18": {"456995000": ("Florbetapir F^18^", [4021])}, "FloresHorseBreed": {"131978001": ("Flores horse breed", [7480])}, "FloridaCrackerHorseBreed": {"133114003": ("Florida Cracker horse breed", [7480])}, "FloridaCrackerPineywoodsCattleBreed": { "131599009": ("Florida Cracker/Pineywoods cattle breed", [7480]) }, "FlortaucipirF18": {"879808000": ("Flortaucipir F^18^", [4021])}, "FluciclatideF18": {"456999006": ("Fluciclatide F^18^", [4021])}, "FluciclovineF18": {"457000009": ("Fluciclovine F^18^", [4021])}, "FluidFilledCatheter": {"371798007": ("Fluid filled catheter", [3429])}, "FluidFilledCatheterHemodynamicMeasurementMethodRegimeTherapy": { "128581002": ( "Fluid filled catheter hemodynamic measurement method (regime/therapy)", [], ) }, "FluidFilledCatheterMethod": { "128581002": ("Fluid filled catheter method", [3241]) }, "FlumazenilC11": {"423543007": ("Flumazenil C^11^", [4021])}, "FlumazenilF18": {"422975006": ("Flumazenil F^18^", [4021])}, "Fluorescein": {"350086004": ("Fluorescein", [4200])}, "FluoresceinProduct": {"350086004": ("Fluorescein product (product)", [])}, "FluoresceinSodiumStain": {"25351006": ("Fluorescein sodium stain", [8112])}, "FluoresceinStain": {"85596006": ("fluorescein stain", [4412, 8112])}, "FluorescentStain": {"35352008": ("fluorescent stain", [8112])}, "FluorethyltyrosinF18": {"424708001": ("Fluorethyltyrosin F^18^", [4021])}, "FluorexonStain": {"108880002": ("fluorexon stain", [8112])}, "FluoroLDopaF18": {"5811000122108": ("Fluoro-L-dopa F^18^", [4021])}, "FluorobenzothiazoleF18": {"423546004": ("Fluorobenzothiazole F^18^", [4021])}, "FluorocholineF18": {"456992002": ("Fluorocholine F^18^", [4021])}, "FluorodeoxyglucoseF18": { "35321007": ("Fluorodeoxyglucose F^18^", [25, 3107, 4021]) }, "Fluorodopa18F": {"5811000122108": ("Fluorodopa [18F] (substance)", [])}, "FluoroestradiolF18": {"926372005": ("Fluoroestradiol F^18^", [4021])}, "FluoromethaneF18": {"422763008": ("Fluoromethane F^18^", [4021])}, "FluoromisonidazoleF18": {"422598008": ("Fluoromisonidazole F^18^", [4021])}, "FluoroscopicAngiographyOfCoronaryArteries": { "419416005": ("Fluoroscopic angiography of coronary arteries (procedure)", []) }, "FluoroscopicAngiographyOfLeftVentricleAndCoronaryArteries": { "418903008": ( "Fluoroscopic angiography of left ventricle and coronary arteries (procedure)", [], ) }, "Fluoroscopy": {"44491008": ("Fluoroscopy", [10002, 10005])}, "FluoroscopyAndRadiography": { "169014003": ("Fluoroscopy and radiography", [10005]) }, "FluorouracilF18": {"425236000": ("Fluorouracil F^18^", [4021])}, "Flushing": {"238810007": ("Flushing", [3220])}, "FlutemetamolF18": {"456997008": ("Flutemetamol F^18^", [4021])}, "Focal": {"87017008": ("Focal", [6128, 6335, 6336, 6337])}, "FocalAsymmetricBreastTissue": { "129789007": ("Focal asymmetric breast tissue", [6016, 6017, 6054]) }, "FocalAsymmetricBreastTissueFinding": { "129789007": ("Focal asymmetric breast tissue finding (finding)", []) }, "FocalAsymmetricDensityAnalysis": { "133888005": ("Focal asymmetric density analysis", [6043]) }, "FocalFibroelastosis": {"125357009": ("focal fibroelastosis", [3817])}, "FocalFibrosis": {"45559001": ("Focal fibrosis", [6030, 6031])}, "FogeraCattleBreed": {"131471003": ("Fogera cattle breed", [7480])}, "Folio": {"425157002": ("Folio", [4012])}, "FolioProjection": {"425157002": ("Folio projection (qualifier value)", [])}, "FontanBaffleLeak": {"443461006": ("Fontan Baffle Leak", [12282, 12284])}, "FontanFenestration": {"443724003": ("Fontan Fenestration", [12282, 12284])}, "FontanInferiorVenaCavaPathway": { "443326004": ("Fontan Inferior Vena Cava Pathway", [12282]) }, "FontanPathway": {"443298009": ("Fontan Pathway", [12282])}, "FontanPulmonaryArteryConnection": { "443625008": ("Fontan Pulmonary Artery Connection", [12282]) }, "FontanelOfSkull": {"79361005": ("Fontanel of skull", [4, 7151, 7192, 8134, 9514])}, "FonthillMerinoSheepBreed": {"132718000": ("Fonthill Merino sheep breed", [7480])}, "Foot": { "56459004": ( "Foot", [ 4, 1000, 1001, 1006, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514, 12020, ], ) }, "FootStructure": {"56459004": ("Foot structure (body structure)", [])}, "ForamenMagnum": {"24532009": ("Foramen Magnum", [1000, 1001, 1002, 8134])}, "ForcedAirWarmingBlanket": {"420572009": ("Forced air warming blanket", [635])}, "ForcepsMajor": {"80049006": ("forceps major", [7705, 7710, 8134])}, "ForcepsMinor": {"42932006": ("forceps minor", [7705, 7710, 8134])}, "Forearm": { "14975008": ("Forearm", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "ForearmStructure": {"14975008": ("Forearm structure (body structure)", [])}, "Forefoot": {"419176008": ("Forefoot", [7482, 7483, 8134])}, "ForefootOfQuadruped": { "419176008": ("Forefoot of quadruped (body structure)", []) }, "ForeignBody": {"19227008": ("Foreign body", [6054, 6064, 7151, 7158, 7193])}, "ForeignBodyGiantCellGranuloma": { "37058002": ("Foreign body (reaction)", [6030, 6031]) }, "ForeignMaterialIodizedOilMercuryTalc": { "19227008": ("Foreign material (iodized oil, mercury,talc)", [6122]) }, "ForensicIntent": {"447295008": ("Forensic Intent", [3629])}, "ForestMountainPigBreed": {"132077006": ("Forest Mountain pig breed", [7480])}, "Formaldehyde": {"111095003": ("Formaldehyde", [8114])}, "Formalin": {"431510009": ("Formalin", [8114])}, "FormerSmoker": {"8517006": ("Former Smoker", [3724])}, "FormolSublimate": {"434295000": ("Formol sublimate", [8114])}, "Fornix": {"87463005": ("fornix", [7704, 7710])}, "FortCrossCattleBreed": {"133387005": ("Fort Cross cattle breed", [7480])}, "FouchetStain": {"406980006": ("fouchet stain", [8112])}, "FourChamber": {"399214001": ("Four chamber", [6, 501, 502])}, "FourthIntercostalSpace": {"117136008": ("Fourth Intercostal Space", [5])}, "FourthLumbarArtery": { "397410002": ( "Fourth Lumbar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "FourthVentricle": { "35918002": ("Fourth Ventricle", [7140, 7151, 7153, 7192, 8134, 9514]) }, "FourthVentricleStructure": { "35918002": ("Fourth ventricle structure (body structure)", []) }, "FoutaHorseBreed": {"133113009": ("Fouta horse breed", [7480])}, "FoveaCentralis": {"67046006": ("Fovea centralis", [4209, 4266, 8134])}, "FoxTerrierSuperbreed": {"35802007": ("Fox terrier superbreed (organism)", [])}, "FoxTerrierSuperbreedDogBreed": { "35802007": ("Fox terrier superbreed dog breed", [7480]) }, "Foxhound": {"90101001": ("Foxhound", [7480])}, "FractionalFlowReserve": {"371842003": ("Fractional flow reserve", [3620, 3621])}, "FractionalFlowReserveUsingIntracoronaryBolus": { "371835003": ("Fractional Flow Reserve using intracoronary bolus", [3620, 3621]) }, "FractionalFlowReserveUsingIntravenousInfusion": { "371841005": ( "Fractional Flow Reserve using intravenous infusion", [3620, 3621], ) }, "FractureOfLowerLimb": {"46866001": ("Fracture of lower limb", [3205])}, "FratiCattleBreed": {"133388000": ("Frati cattle breed", [7480])}, "FrederiksborgHorseBreed": {"133112004": ("Frederiksborg horse breed", [7480])}, "FreeOfSymptoms": {"162467007": ("Free of symptoms (situation)", [])}, "FreibergHorseBreed": {"131979009": ("Freiberg horse breed", [7480])}, "FrenchAlpineGoat": {"5438004": ("French alpine goat (organism)", [])}, "FrenchAlpineGoatBreed": {"5438004": ("French alpine goat breed", [7480])}, "FrenchArdennaisHorseBreed": { "132734002": ("French Ardennais horse breed", [7480]) }, "FrenchBrownCattleBreed": {"133391000": ("French Brown cattle breed", [7480])}, "FrenchBulldog": {"59643008": ("French bulldog", [7480])}, "FrenchCobHorseBreed": {"131990004": ("French Cob horse breed", [7480])}, "FrenchGuardDogBreed": {"132487003": ("French Guard Dog breed", [7480])}, "FrenchLandracePig": {"8970009": ("French landrace pig (organism)", [])}, "FrenchLandracePigBreed": {"8970009": ("French landrace pig breed", [7480])}, "FrenchLargeWhitePigBreed": {"132088000": ("French Large White pig breed", [7480])}, "FrenchSaddlePonyHorseBreed": { "131991000": ("French Saddle pony horse breed", [7480]) }, "FrenchSpanielDogBreed": {"132488008": ("French Spaniel dog breed", [7480])}, "FrenchTrotterHorseBreed": {"132774008": ("French Trotter horse breed", [7480])}, "FrenulumOfLabiaMinora": {"279867004": ("Frenulum of labia minora", [4029, 8134])}, "Frequencies": {"272123002": ("Frequencies (qualifier value)", [])}, "Frequent": {"70232002": ("Frequent", [6091])}, "Friedman": {"399103007": ("Friedman", [4012])}, "FriedmanProjection": {"399103007": ("Friedman projection (qualifier value)", [])}, "Friend": {"113163005": ("Friend", [7450])}, "FriesianHorseBreed": {"133111006": ("Friesian horse breed", [7480])}, "FriesianMilkSheepBreed": {"131725009": ("Friesian Milk Sheep breed", [7480])}, "FrijolilloCattleBreed": {"133392007": ("Frijolillo cattle breed", [7480])}, "FriuliBlackPigBreed": {"132182001": ("Friuli Black pig breed", [7480])}, "Frog": {"34296003": ("frog", [20])}, "FrogLikePosture": {"34296003": ("Frog-like posture (finding)", [])}, "Frontal": {"399033003": ("frontal", [501, 4010])}, "FrontalBone": {"74872008": ("Frontal bone", [4028, 7151, 7192, 8134, 9514])}, "FrontalBoneStructure": { "74872008": ("Frontal bone structure (body structure)", []) }, "FrontalLobe": {"83251001": ("Frontal lobe", [7151, 7153, 7192, 8134, 9514])}, "FrontalLobeStructure": { "83251001": ("Frontal lobe structure (body structure)", []) }, "FrontalOblique": {"399160007": ("frontal oblique", [501, 4010])}, "FrontalObliqueAxial": {"399132005": ("frontal-oblique axial", [501, 4010])}, "FrontalObliqueAxialProjection": { "399132005": ("Frontal-oblique axial projection (qualifier value)", []) }, "FrontalObliqueProjection": { "399160007": ("Frontal oblique projection (qualifier value)", []) }, "FrontalProjection": {"399033003": ("Frontal projection (qualifier value)", [])}, "FrontalSinus": { "55060009": ("Frontal sinus", [1000, 1001, 1002, 7482, 7483, 8134]) }, "FrontalSinusStructure": { "55060009": ("Frontal sinus structure (body structure)", []) }, "FroxfieldPygmyPigBreed": {"132263003": ("Froxfield Pygmy pig breed", [7480])}, "FrozenSectionBreastSample": { "309059004": ("frozen section breast sample", [8103, 8104]) }, "FrozenSectionEmbeddingMedium": { "433469005": ("Frozen section embedding medium (substance)", []) }, "FuanSpottedPigBreed": {"132283002": ("Fuan Spotted pig breed", [7480])}, "Fuchs": {"399073009": ("Fuchs", [4012])}, "FuchsProjection": {"399073009": ("Fuchs projection (qualifier value)", [])}, "FuchsinAcidStain": {"60920007": ("fuchsin acid stain", [8112])}, "FuchsinBasicStain": {"50062004": ("fuchsin basic stain", [8112])}, "FujianSmallPigBreed": {"132281000": ("Fujian Small pig breed", [7480])}, "FullRectum": {"249602003": ("Full Rectum", [9272])}, "FullSpectrum": {"414298005": ("Full Spectrum", [4206, 8122])}, "FullSpectrumColor": {"414298005": ("Full spectrum color (qualifier value)", [])}, "FumatiPigBreed": {"132183006": ("Fumati pig breed", [7480])}, "Function": {"246464006": ("Function", [7150, 9502, 9580])}, "FunctionalCapacity": { "429160000": ("Functional capacity (observable entity)", []) }, "FunctionalPerformanceAndActivity": { "248536006": ("Functional performance and activity", [3769]) }, "FunctionalSingleVentricle": { "443379009": ("Functional Single Ventricle", [12248, 12249]) }, "FundusCamera": {"409898007": ("Fundus Camera", [4202])}, "FuriosoHorseBreed": {"132775009": ("Furioso horse breed", [7480])}, "FusiformAneurysm": {"85431000": ("fusiform aneurysm", [3808])}, "Fusion": {"129379006": ("Fusion", [7310])}, "FusionAction": {"129379006": ("Fusion - action (qualifier value)", [])}, "FuzhouBlackPigBreed": {"132285009": ("Fuzhou Black pig breed", [7480])}, "G1Grade": {"54102005": ("G1 grade (finding)", [])}, "G2Grade": {"1663004": ("G2 grade (finding)", [])}, "G3Grade": {"61026006": ("G3 grade (finding)", [])}, "G4Grade": {"258245003": ("G4 grade (finding)", [])}, "GTV": {"228791009": ("GTV", [9534])}, "GackoCattleBreed": {"133394008": ("Gacko cattle breed", [7480])}, "GadoDaTerraCattleBreed": {"133395009": ("Gado da Terra cattle breed", [7480])}, "GadobenateDimeglumine": {"792865009": ("Gadobenate dimeglumine", [12, 3850])}, "Gadobutrol": {"407976008": ("Gadobutrol", [12, 3850])}, "Gadodiamide": {"354088005": ("Gadodiamide", [12, 3850])}, "Gadofosveset": {"770982005": ("Gadofosveset", [12, 3850])}, "Gadolinium": {"58281002": ("Gadolinium", [13, 300])}, "GadoliniumContainingProduct": {"768763008": ("Gadolinium", [12, 3850])}, "GadopentetateDimeglumine": { "109216000": ("Gadopentetate dimeglumine", [12, 3850]) }, "GadopentetateDimeglumine_Inactive": { "404846007": ("Gadopentetate dimeglumine (product)", []) }, "GadoterateMeglumine": {"712714000": ("Gadoterate meglumine", [12, 3850])}, "Gadoteridol": {"353946009": ("Gadoteridol", [12, 3850])}, "Gadoversetamide": {"409477004": ("Gadoversetamide", [12, 3850])}, "GadoxetateDisodium": {"440223009": ("Gadoxetate disodium", [12, 3850])}, "GaitProblem": {"22325002": ("Gait problem", [3205])}, "Galactocele": {"42385006": ("Galactocele", [6030, 6031])}, "GalicenoHorse": {"6220006": ("Galiceno horse (organism)", [])}, "GalicenoHorseBreed": {"6220006": ("Galiceno horse breed", [7480])}, "GalicianBlondCattleBreed": {"131600007": ("Galician Blond cattle breed", [7480])}, "GalicianPigBreed": {"132184000": ("Galician pig breed", [7480])}, "GalicianPonyHorseBreed": {"133110007": ("Galician Pony horse breed", [7480])}, "Gallbladder": { "28231008": ( "Gallbladder", [ 4, 4009, 4030, 4031, 4040, 4042, 7151, 7154, 7192, 8134, 9514, 10044, 10060, ], ) }, "GallbladderStructure": { "28231008": ("Gallbladder structure (body structure)", []) }, "Gallium67Citrate": {"73065000": ("Gallium^67^ citrate", [25])}, "GallocyanineStain": {"8836009": ("gallocyanine stain", [8112])}, "GallowayCattleBreed": {"66911005": ("Galloway cattle breed (organism)", [])}, "GallowayCowBreed": {"66911005": ("Galloway cow breed", [7480])}, "GalwaySheepBreed": {"406660008": ("Galway sheep breed", [7480])}, "GambianNDamaCattleBreed": { "133802009": ("Gambian N'Dama cattle breed (organism)", []) }, "GambianNDamaXZebuCattleBreed": { "133802009": ("Gambian N'Dama X zebu cattle breed", [7480]) }, "GansuAlpineFineWoolSheepBreed": { "131726005": ("Gansu Alpine Fine-wool sheep breed", [7480]) }, "GanzhongnanSpottedPigBreed": { "132300000": ("Ganzhongnan Spotted pig breed", [7480]) }, "GanzhouWhitePigBreed": {"132336002": ("Ganzhou White pig breed", [7480])}, "GaolaoCattleBreed": {"133606005": ("Gaolao cattle breed", [7480])}, "GarfagninaCattleBreed": {"131472005": ("Garfagnina cattle breed", [7480])}, "GarganicaGoatBreed": {"131695007": ("Garganica goat breed", [7480])}, "Garment": {"272180002": ("Garment (physical object)", [])}, "GarranoTarpanHorseXDomesticHorseBreed": { "132990002": ("Garrano tarpan horse X domestic horse breed", [7480]) }, "GarreCattleBreed": {"133657009": ("Garre cattle breed", [7480])}, "Garth": {"425188003": ("Garth", [4012])}, "GarthProjection": {"425188003": ("Garth projection (qualifier value)", [])}, "Gas": {"74947009": ("Gas", [7151, 7197])}, "GasInVitreousCavity": {"247094004": ("Gas in vitreous cavity", [4232])}, "GasaraCattleBreed": {"133658004": ("Gasara cattle breed", [7480])}, "GasconCattleBreed": {"131601006": ("Gascon cattle breed", [7480])}, "GasconyPigBreed": {"132125002": ("Gascony pig breed", [7480])}, "GaseousSubstance": {"74947009": ("Gaseous substance (substance)", [])}, "GaspingForBreath": {"23141003": ("Gasping for breath (finding)", [])}, "GaspingRespiration": {"23141003": ("gasping respiration", [3416])}, "GastricArtery": { "23771002": ( "Gastric Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "GastricVein": { "110568007": ( "Gastric vein", [ 4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12113, 12125, ], ) }, "GastroOmentalLymphNode": {"83380007": ("gastro-omental lymph node", [7600, 8134])}, "GastrocnemiusVein": { "264481007": ( "Gastrocnemius vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "GastroduodenalArtery": { "37274004": ( "Gastroduodenal Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "GastrointestinalProkinetic": { "372607002": ("Gastrointestinal prokinetic", [621, 622]) }, "GastrointestinalSurgery": {"309980008": ("Gastrointestinal Surgery", [7030])}, "GastrointestinalSurgeryDepartment": { "309980008": ("Gastrointestinal surgery department (environment)", []) }, "GaunlingCattleBreed": {"131474006": ("Gaunling cattle breed", [7480])}, "Gavage": {"61420007": ("Gavage", [609])}, "GayalCattleBreed": {"133702003": ("Gayal cattle breed", [7480])}, "GaynorHart": {"399082003": ("Gaynor-Hart", [4012])}, "GaynorHartProjection": { "399082003": ("Gaynor-Hart projection (qualifier value)", []) }, "GazeDownAndLeft": {"255523004": ("Gaze down and left (qualifier value)", [])}, "GazeDownAndRight": {"255524005": ("Gaze down and right (qualifier value)", [])}, "GazeUpAndLeft": {"255525006": ("Gaze up and left (qualifier value)", [])}, "GazeUpAndRight": {"255526007": ("Gaze up and right (qualifier value)", [])}, "GelProsthesisForImagingProcedure": { "102325005": ("Gel prosthesis for imaging procedure", [5]) }, "GelProsthesisForImagingProcedureDevice": { "102325005": ( "Gel prosthesis for imaging procedure, device (physical object)", [], ) }, "GelbrayCattleBreed": {"133731004": ("Gelbray cattle breed (organism)", [])}, "GelbrayXZebuCattleBreed": {"133731004": ("Gelbray X zebu cattle breed", [7480])}, "GelbveihCattleBreed": {"76497003": ("Gelbveih cattle breed (organism)", [])}, "GelbveihCowBreed": {"76497003": ("Gelbveih cow breed", [7480])}, "GelderlandHorseBreed": {"133109002": ("Gelderland horse breed", [7480])}, "GeneralAnesthesia": {"50697003": ("General anesthesia", [611, 612])}, "GeneralAnesthetic": {"373288007": ("General anesthetic", [621, 622])}, "GeneralMedicalDepartment": { "309927009": ("General medical department (environment)", []) }, "GeneralMedicine": {"309927009": ("General Medicine", [7030])}, "GeneralSurgery": {"309984004": ("General Surgery", [7030])}, "GeneralSurgicalDepartment": { "309984004": ("General surgical department (environment)", []) }, "Generalized": {"60132005": ("Generalized", [6128])}, "GeneticSample": {"258562007": ("Genetic sample", [8103])}, "GenicularArtery": { "128559007": ("Genicular artery", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "GeniculateArtery": {"128559007": ("geniculate artery", [3604, 3606, 3630])}, "GentianViolet": {"387239001": ("Gentian violet (substance)", [])}, "GentileDiPugliaSheepBreed": { "131740006": ("Gentile di Puglia sheep breed", [7480]) }, "GenuOfCorpusCallosum": { "70215001": ("genu of corpus callosum", [7705, 7710, 8134]) }, "GenusBos": {"388168008": ("Genus Bos (organism)", [])}, "GenusCanis": {"388490000": ("Genus Canis (organism)", [])}, "GenusCapra": {"388249000": ("Genus Capra (organism)", [])}, "GenusDependovirus": {"112381006": ("Genus Dependovirus (organism)", [])}, "GenusEquus": {"388445009": ("Genus Equus (organism)", [])}, "GenusFelis": {"388626009": ("Genus Felis (organism)", [])}, "GenusMus": {"447482001": ("Genus Mus (organism)", [])}, "GenusOvis": {"388254009": ("Genus Ovis (organism)", [])}, "GenusRattus": {"371564000": ("Genus Rattus (organism)", [])}, "GenusSus": {"388393002": ("Genus Sus (organism)", [])}, "GeorgianMountainCattleBreed": { "133396005": ("Georgian Mountain cattle breed", [7480]) }, "GeriatricMedicine": {"309933000": ("Geriatric Medicine", [7030])}, "GermanAngusCattleBreed": {"133582003": ("German Angus cattle breed", [7480])}, "GermanBerkshirePigBreed": {"132185004": ("German Berkshire pig breed", [7480])}, "GermanBlackPiedCattleBreed": { "133397001": ("German Black Pied cattle breed", [7480]) }, "GermanBlackPiedDairyCattleBreed": { "133398006": ("German Black Pied Dairy cattle breed", [7480]) }, "GermanBlackheadedMuttonSheepBreed": { "131723002": ("German Blackheaded Mutton sheep breed", [7480]) }, "GermanBrownCattleBreed": {"133405000": ("German Brown cattle breed", [7480])}, "GermanColoredGoatBreed": {"131693000": ("German colored goat breed", [7480])}, "GermanCornwallPigBreed": {"132358000": ("German Cornwall pig breed", [7480])}, "GermanFleckViehCattleBreed": { "67448000": ("German Fleck-Vieh cattle breed (organism)", []) }, "GermanFleckViehCowBreed": {"67448000": ("German Fleck-Vieh cow breed", [7480])}, "GermanKoolieDogBreed": {"132464006": ("German Koolie dog breed", [7480])}, "GermanLandraceBPigBreed": {"132352004": ("German Landrace B pig breed", [7480])}, "GermanLandracePig": {"8763002": ("German landrace pig (organism)", [])}, "GermanLandracePigBreed": {"8763002": ("German landrace pig breed", [7480])}, "GermanLonghairedPointer": { "1420005": ("German longhaired pointer (organism)", []) }, "GermanLonghairedPointerDogBreed": { "1420005": ("German longhaired pointer dog breed", [7480]) }, "GermanMountainSheepBreed": {"131741005": ("German Mountain sheep breed", [7480])}, "GermanMuttonMerinoSheepBreed": { "132716001": ("German Mutton Merino sheep breed", [7480]) }, "GermanPasturePigBreed": {"132159003": ("German Pasture pig breed", [7480])}, "GermanPinscherDogBreed": {"132510005": ("German Pinscher dog breed", [7480])}, "GermanRedPiedCattleBreed": {"131602004": ("German Red Pied cattle breed", [7480])}, "GermanRedPiedPigBreed": {"132357005": ("German Red Pied pig breed", [7480])}, "GermanRexCatBreed": {"132666001": ("German Rex cat breed", [7480])}, "GermanRidingPonyHorseBreed": { "131972000": ("German Riding Pony horse breed", [7480]) }, "GermanShepherdDog": {"42252000": ("German shepherd dog", [7480])}, "GermanShorthairedPointer": { "86767001": ("German shorthaired pointer (organism)", []) }, "GermanShorthairedPointerDogBreed": { "86767001": ("German shorthaired pointer dog breed", [7480]) }, "GermanShorthornCattleBreed": { "133406004": ("German Shorthorn cattle breed", [7480]) }, "GermanSpanielDogBreed": {"132505006": ("German Spaniel dog breed", [7480])}, "GermanSpitzDogBreed": {"132424007": ("German Spitz dog breed", [7480])}, "GermanWhiteheadedMuttonSheepBreed": { "131727001": ("German Whiteheaded Mutton sheep breed", [7480]) }, "GermanWirehairedPointer": { "25264009": ("German wirehaired pointer (organism)", []) }, "GermanWirehairedPointerDogBreed": { "25264009": ("German wirehaired pointer dog breed", [7480]) }, "GermaniumGe68": {"53315004": ("Germanium Ge^68^", [4021])}, "GhanaSangaCattleBreed": {"133803004": ("Ghana Sanga cattle breed (organism)", [])}, "GhanaSangaXZebuCattleBreed": { "133803004": ("Ghana Sanga X zebu cattle breed", [7480]) }, "GhanaShorthornCattleBreed": { "133407008": ("Ghana Shorthorn cattle breed", [7480]) }, "GhoriPigBreed": {"132186003": ("Ghori pig breed", [7480])}, "GiacominiVein": { "397437000": ("Giacomini vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110]) }, "GiantFibroadenoma": {"34882000": ("Giant fibroadenoma", [6030, 6031])}, "GiantSchnauzer": {"57947002": ("Giant schnauzer (organism)", [])}, "GiantSchnauzerDogBreed": {"57947002": ("Giant schnauzer dog breed", [7480])}, "GidranHorseBreed": {"133108005": ("Gidran horse breed", [7480])}, "GiemsaStain": {"373646006": ("giemsa stain", [8112])}, "GirCattleBreed": {"32938007": ("Gir cattle breed (organism)", [])}, "GirCowBreed": {"32938007": ("Gir cow breed", [7480])}, "GirgentanaGoatBreed": {"131696008": ("Girgentana goat breed", [7480])}, "GirolandoCattleBreed": {"133804005": ("Girolando cattle breed (organism)", [])}, "GirolandoXZebuCattleBreed": { "133804005": ("Girolando X zebu cattle breed", [7480]) }, "GlanCattleBreed": {"131603009": ("Glan cattle breed", [7480])}, "GlanDonnersbergCattleBreed": { "133408003": ("Glan-Donnersberg cattle breed", [7480]) }, "GlenOfImaalTerrierDogBreed": { "132644008": ("Glen of Imaal Terrier dog breed", [7480]) }, "GlennPathway": {"443789005": ("Glenn Pathway", [12282])}, "GlenoidCavityOfScapula": {"46385009": ("Glenoid cavity of scapula", [6115, 8134])}, "GlenoidStructure": {"46385009": ("Glenoid structure (body structure)", [])}, "Glioblastoma": {"1163375002": ("Glioblastoma", [638, 639])}, "GlioblastomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "63634009": ( "Glioblastoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "GlobusPallidus": { "14738005": ("Globus Pallidus", [7140, 7151, 7153, 7192, 8134, 9514]) }, "GlobusPallidusStructure": { "14738005": ("Globus pallidus structure (body structure)", []) }, "GlomerularFiltrationRate": { "80274001": ("Glomerular filtration rate (observable entity)", []) }, "GlossopharyngealNerve": { "21161002": ("glossopharyngeal nerve", [7706, 7710, 8134]) }, "GlossopharyngealNerveStructure": { "21161002": ("Glossopharyngeal nerve structure (body structure)", []) }, "Glottis": {"1307006": ("glottis", [7601, 8134])}, "GlottisStructure": {"1307006": ("Glottis structure (body structure)", [])}, "GloucesterCattleBreed": {"131604003": ("Gloucester cattle breed", [7480])}, "GloucesterOldSpotPig": {"90885005": ("Gloucester old spot pig (organism)", [])}, "GloucesterOldSpotPigBreed": { "90885005": ("Gloucester old spot pig breed", [7480]) }, "GlucagonPreparation": {"10712001": ("Glucagon preparation", [10])}, "GlucagonProduct": {"10712001": ("Glucagon product (product)", [])}, "Glue": {"57126000": ("Glue", [8, 4051, 7151, 7193])}, "Gluing": {"360038009": ("Gluing", [7310])}, "GluingAction": {"360038009": ("Gluing - action (qualifier value)", [])}, "GlutamateN13": {"129509006": ("Glutamate N^13^", [4021])}, "Glutamine": {"25761002": ("Glutamine", [218, 4032, 4033, 7180, 7186, 7469])}, "GlutealLymphNode": {"80867000": ("gluteal lymph node", [7600, 8134])}, "GlycogenRichCarcinoma": {"74280008": ("Glycogen-rich carcinoma", [6030, 6033])}, "GobraCattleBreed": {"133659007": ("Gobra cattle breed", [7480])}, "Gold": {"2309006": ("Gold", [300])}, "GoldAlloy": {"256496006": ("Gold Alloy", [7300, 9579])}, "GoldenAmericanSaddlebredHorseBreed": { "133107000": ("Golden American Saddlebred horse breed", [7480]) }, "GoldenGuernseyGoatBreed": {"131660009": ("Golden Guernsey goat breed", [7480])}, "GoldenRetriever": {"58108001": ("Golden retriever (organism)", [])}, "GoldenRetrieverDogBreed": {"58108001": ("Golden retriever dog breed", [7480])}, "GoleCattleBreed": {"133409006": ("Gole cattle breed", [7480])}, "GolpayeganiCattleBreed": {"133410001": ("Golpayegani cattle breed", [7480])}, "GonadRadiationShield": {"470204007": ("Gonad radiation shield", [9572, 9573])}, "Goniolens": {"389156006": ("Goniolens", [4205])}, "GoomsurCattleBreed": {"133660002": ("Goomsur cattle breed", [7480])}, "GorbatovRedCattleBreed": {"133411002": ("Gorbatov Red cattle breed", [7480])}, "GordonSetter": {"57849000": ("Gordon setter (organism)", [])}, "GordonSetterDogBreed": {"57849000": ("Gordon setter dog breed", [7480])}, "GorlinSyndrome": {"69408002": ("Gorlin syndrome", [4405])}, "GorynCattleBreed": {"133412009": ("Goryn cattle breed", [7480])}, "GotlandHorseBreed": {"133100003": ("Gotland horse breed", [7480])}, "Grade1WellDifferentiated": {"54102005": ("Grade 1: well differentiated", [6070])}, "Grade2ModeratelyDifferentiated": { "1663004": ("Grade 2: moderately differentiated", [6070]) }, "Grade3PoorlyDifferentiated": { "61026006": ("Grade 3: poorly differentiated", [6070]) }, "Grade4Undifferentiated": {"258245003": ("Grade 4: undifferentiated", [6070])}, "GraftMaterial": {"246345001": ("Graft material", [637])}, "GraftToCitedBodySegment": { "128947001": ("Graft to cited body segment (substance)", []) }, "GraftToDistalAnastomosis": {"128948006": ("Graft to distal anastomosis", [3019])}, "GraftToProximalAnastomosis": { "128949003": ("Graft to proximal anastomosis", [3019]) }, "GramStain": {"385484003": ("gram stain", [8112])}, "GrandAngloFrançaisDogBreed": { "132506007": ("Grand Anglo-Français dog breed", [7480]) }, "GrandBassettGriffonVendeenDogBreed": { "132507003": ("Grand Bassett Griffon Vendeen dog breed", [7480]) }, "GrandBassettGriffonVendéenDogBreed": { "132507003": ("Grand Bassett Griffon Vendéen dog breed (organism)", []) }, "GrandBleuDeGascogneDogBreed": { "132508008": ("Grand Bleu de Gascogne dog breed", [7480]) }, "GrandGasconSaintongeoisDogBreed": { "132509000": ("Grand Gascon-Saintongeois dog breed", [7480]) }, "GrandGriffonVendeenDogBreed": { "132515000": ("Grand Griffon Vendeen dog breed", [7480]) }, "GrandGriffonVendéenDogBreed": { "132515000": ("Grand Griffon Vendéen dog breed (organism)", []) }, "Grandy": {"399311007": ("Grandy", [4012])}, "GrandyProjection": {"399311007": ("Grandy projection (qualifier value)", [])}, "GranularCellTumor": {"12169001": ("Granular cell tumor", [6030, 6031])}, "Grashey": {"399146005": ("Grashey", [4012])}, "GrasheyProjection": {"399146005": ("Grashey projection (qualifier value)", [])}, "GratiCattleBreed": {"131473000": ("Grati cattle breed", [7480])}, "GraueGehoernteHeidschnuckeSheepBreed": { "131728006": ("Graue Gehoernte Heidschnucke sheep breed", [7480]) }, "Gray": {"371253002": ("Gray", [4411])}, "GrayAlpineCattleBreed": {"133422003": ("Gray Alpine cattle breed", [7480])}, "GrayColor": {"371253002": ("Gray color", [6067])}, "GrayMatter": {"389081007": ("Gray Matter", [7151, 7153, 7192, 8134, 9514])}, "GrayMatterStructureOfCentralNervousSystem": { "389081007": ( "Gray matter structure of central nervous system (body structure)", [], ) }, "GreatCardiacVein": { "5928000": ( "Great cardiac vein", [4, 3010, 3011, 3827, 3839, 4042, 7151, 7192, 8134, 9514], ) }, "GreatCardiacVeinStructure": { "5928000": ("Great cardiac vein structure (body structure)", []) }, "GreatDaneDog": {"27615007": ("Great dane dog", [7480])}, "GreatMünsterländerDogBreed": { "132379000": ("Great Münsterländer dog breed", [7480]) }, "GreatPyreneeDog": {"32670005": ("Great Pyrenee dog", [7480])}, "GreatSaphenousVein": { "60734001": ( "Great saphenous vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "GreatSaphenousVeinOfCalf": { "414368000": ( "Great Saphenous Vein of Calf", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "GreatSaphenousVeinOfThigh": { "414369008": ( "Great Saphenous Vein of Thigh", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "GreatSaphenousVeinStructure": { "60734001": ("Great saphenous vein structure (body structure)", []) }, "GreaterCaucasusCattleBreed": { "133413004": ("Greater Caucasus cattle breed", [7480]) }, "GreaterSwissMountainDogBreed": { "132511009": ("Greater Swiss Mountain Dog breed", [7480]) }, "GreaterSwissMountainHoundDogBreed": { "132649003": ("Greater Swiss Mountain Hound dog breed", [7480]) }, "GreekLocalPigBreed": {"132253006": ("Greek Local pig breed", [7480])}, "GreekShorthornCattleBreed": { "133420006": ("Greek Shorthorn cattle breed", [7480]) }, "GreekSteppeCattleBreed": {"133421005": ("Greek Steppe cattle breed", [7480])}, "Green": {"371246006": ("Green", [4206, 4255, 8122])}, "GreenColor": {"371246006": ("Green color", [6067])}, "GreenOpticalFilter": {"445465004": ("Green optical filter", [4204, 8124])}, "GreenOpticalFilterOfOpticalMircroscope": { "445465004": ( "Green optical filter of optical mircroscope (physical object)", [], ) }, "GreenlandDogBreed": {"132512002": ("Greenland Dog breed", [7480])}, "Greyhound": {"112494009": ("Greyhound", [7480])}, "GriffonDog": {"55058007": ("Griffon dog", [7480])}, "GriffonFauveDeBretegneDogBreed": { "132513007": ("Griffon Fauve de Bretegne dog breed", [7480]) }, "GriffonNivernaisDogBreed": {"132514001": ("Griffon Nivernais dog breed", [7480])}, "GrisonsStripedGoatBreed": {"131664000": ("Grisons Striped goat breed", [7480])}, "GroinSkinCrease": {"280387007": ("Groin skin crease", [4029, 8134])}, "GromarkSheepBreed": {"131730008": ("Gromark sheep breed", [7480])}, "GroningenHorseBreed": {"133104007": ("Groningen horse breed", [7480])}, "GroningenWhiteheadedCattleBreed": { "131605002": ("Groningen Whiteheaded cattle breed", [7480]) }, "GrossPathologyRequest": {"168456004": ("Gross pathology request", [8131])}, "GrossSpecimen": {"430861001": ("Gross specimen", [8103])}, "GrossTumorVolume": {"228791009": ("Gross tumor volume (observable entity)", [])}, "GroupedCalcificationDistribution": { "129766004": ("Grouped calcification distribution", [6012, 6013]) }, "GuadarramaGoatBreed": {"131694006": ("Guadarrama goat breed", [7480])}, "GuadeloupeCreolePigBreed": {"132032009": ("Guadeloupe Creole pig breed", [7480])}, "GuadeloupeCréolePigBreed": { "132032009": ("Guadeloupe Créole pig breed (organism)", []) }, "GuadianaSpottedCattleBreed": { "133423008": ("Guadiana Spotted cattle breed", [7480]) }, "GuangxiHorseBreed": {"133115002": ("Guangxi horse breed", [7480])}, "GuangxiWhitePigBreed": {"132337006": ("Guangxi White pig breed", [7480])}, "GuanlingPigBreed": {"132148007": ("Guanling pig breed", [7480])}, "GuanzhongHorseBreed": {"131973005": ("Guanzhong horse breed", [7480])}, "GuelmaCattleBreed": {"133424002": ("Guelma cattle breed", [7480])}, "GuernseyCattleBreed": {"84839000": ("Guernsey cattle breed (organism)", [])}, "GuernseyCowBreed": {"84839000": ("Guernsey cow breed", [7480])}, "GuidanceIntent": {"363675004": ("Guidance Intent", [3629])}, "GuideWire": {"272224001": ("Guide Wire", [3411, 3429])}, "GuidingCatheter": { "102317008": ("Guiding catheter", [8, 3411, 3429, 4051, 7151, 7193]) }, "GuidingCatheterDevice": { "102317008": ("Guiding catheter, device (physical object)", []) }, "GuineaHogPigBreed": {"132235000": ("Guinea Hog pig breed", [7480])}, "GuizhouHorseBreed": {"131974004": ("Guizhou horse breed", [7480])}, "GujamavuCattleBreed": {"133661003": ("Gujamavu cattle breed", [7480])}, "GujaratiCattleBreed": {"112485003": ("Gujarati cattle breed (organism)", [])}, "GujaratiCowBreed": {"112485003": ("Gujarati cow breed", [7480])}, "GulfCoastNativeSheepBreed": { "131731007": ("Gulf Coast Native sheep breed", [7480]) }, "GuoxiaHorseBreed": {"131975003": ("Guoxia horse breed", [7480])}, "GurktalPigBreed": {"133203009": ("Gurktal pig breed", [7480])}, "GuteSheepBreed": {"131738001": ("Gute sheep breed", [7480])}, "Guttate": {"1312007": ("Guttate (qualifier value)", [])}, "Gutter": {"68493006": ("Gutter", [2])}, "GuzerandoCattleBreed": {"133805006": ("Guzerando cattle breed (organism)", [])}, "GuzerandoXZebuCattleBreed": { "133805006": ("Guzerando X zebu cattle breed", [7480]) }, "GuzeratCattleBreed": {"133699005": ("Guzerat cattle breed", [7480])}, "GynecologicalHistory": { "267011001": ("Gynecological history (observable entity)", []) }, "Gynecology": {"309943002": ("Gynecology", [7030])}, "GynecologyDepartment": {"309943002": ("Gynecology department (environment)", [])}, "Gynecomastia": {"4754008": ("Gynecomastia", [6030, 6031])}, "GypsyVannerHorse": {"406714004": ("Gypsy Vanner horse (organism)", [])}, "GypsyVannerHorseBreed": {"406714004": ("Gypsy Vanner horse breed", [7480])}, "GöttingenMiniaturePigBreed": { "132359008": ("Göttingen Miniature pig breed", [7480]) }, "GüssingForestPigPigBreed": {"132100006": ("Güssing Forest Pig pig breed", [7480])}, "H1Antihistamine": {"373228009": ("H-1 Antihistamine", [65])}, "HIVPositive": {"165816005": ("HIV Positive", [3756])}, "HaBacPigBreed": {"132348004": ("Ha Bac pig breed", [7480])}, "Haas": {"399341009": ("Haas", [4012])}, "HaasProjection": {"399341009": ("Haas projection (qualifier value)", [])}, "HabenularCommissure": {"6866008": ("habenular commissure", [7705, 7710, 8134])}, "HackneyHorse": {"112488001": ("Hackney horse (organism)", [])}, "HackneyHorseBreed": {"112488001": ("Hackney horse breed", [7480])}, "HackneyPonyHorseBreed": {"132748002": ("Hackney Pony horse breed", [7480])}, "HaemostaticAgent": {"372681003": ("Hemostatic agent", [621, 622, 4410])}, "HaflingerHorse": {"54447000": ("Haflinger horse (organism)", [])}, "HaflingerHorseBreed": {"54447000": ("Haflinger horse breed", [7480])}, "Hafnium": {"50672002": ("Hafnium", [300])}, "HailumPigBreed": {"133169000": ("Hailum pig breed", [7480])}, "HainanLingaoPigBreed": {"132155009": ("Hainan, Lingao pig breed", [7480])}, "HainanPigBreed": {"133162009": ("Hainan pig breed", [7480])}, "HainanTunchangPigBreed": {"132156005": ("Hainan, Tunchang pig breed", [7480])}, "HainanWenchangPigBreed": {"132157001": ("Hainan, Wenchang pig breed", [7480])}, "Hair": {"386045008": ("Hair", [4029, 8134])}, "HairStructure": {"386045008": ("Hair structure (body structure)", [])}, "HaitiCreolePigBreed": {"132009005": ("Haiti Creole pig breed", [7480])}, "HaitiCréolePigBreed": {"132009005": ("Haiti Créole pig breed (organism)", [])}, "HalfBrother": {"45929001": ("Half-brother", [7450, 7451])}, "HalfLifeOfRadiopharmaceutical": { "304283002": ("Half-life of radiopharmaceutical (qualifier value)", []) }, "HalfSaddlebredHorseBreed": {"131977006": ("Half Saddlebred horse breed", [7480])}, "HalfSister": {"2272004": ("Half-sister", [7450, 7451])}, "HalhinGolCattleBreed": {"131475007": ("Halhin Gol cattle breed", [7480])}, "HallCatheter": {"371799004": ("Hall catheter (physical object)", [])}, "HallCatheterMethod": {"133913008": ("Hall catheter method (procedure)", [])}, "HallikarCattleBreed": {"133607001": ("Hallikar cattle breed", [7480])}, "HallingdalCattleBreed": {"133579008": ("Hallingdal cattle breed", [7480])}, "Halothane": {"387351001": ("Halothane", [623, 624])}, "Hamartoma": {"51398009": ("Hamartoma", [6030, 6031])}, "HamiltonstövareDogBreed": {"132490009": ("Hamiltonstövare dog breed", [7480])}, "HamlinePigBreed": {"132011001": ("Hamline pig breed", [7480])}, "HampenPigBreed": {"132019004": ("Hampen pig breed", [7480])}, "HamplinePigBreed": {"132025000": ("Hampline pig breed", [7480])}, "HampshireDownSheep": {"82440005": ("Hampshire Down sheep (organism)", [])}, "HampshireDownSheepBreed": {"82440005": ("Hampshire Down sheep breed", [7480])}, "HampshirePig": {"20280002": ("Hampshire pig (organism)", [])}, "HampshirePigBreed": {"20280002": ("Hampshire pig breed", [7480])}, "HampshireSheepBreed": {"131739009": ("Hampshire sheep breed", [7480])}, "HamrocPigBreed": {"132208009": ("Hamroc pig breed", [7480])}, "HanSheepBreed": {"131729003": ("Han sheep breed", [7480])}, "Hand": {"85562004": ("Hand", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514])}, "HandBone": {"24097009": ("Hand bone", [7304, 8134])}, "HandGrip": {"128965002": ("Hand grip", [12002])}, "HandGripPhysiologicChallenge": { "128965002": ("Hand grip physiologic challenge (procedure)", []) }, "HandStructure": {"85562004": ("Hand structure (body structure)", [])}, "HandSurgery": {"309985003": ("Hand Surgery", [7030])}, "HandSurgeryDepartment": { "309985003": ("Hand surgery department (environment)", []) }, "Handgrip": {"128965002": ("Handgrip", [91, 3271])}, "HanfordMiniaturePigBreed": {"132042006": ("Hanford Miniature pig breed", [7480])}, "HangPigBreed": {"132301001": ("Hang pig breed", [7480])}, "HanjiangBlackPigBreed": {"132133001": ("Hanjiang Black pig breed", [7480])}, "HanoverianHorse": {"66168008": ("Hanoverian horse (organism)", [])}, "HanoverianHorseBreed": {"66168008": ("Hanoverian horse breed", [7480])}, "HanoverianHoundDogBreed": {"132499005": ("Hanoverian Hound dog breed", [7480])}, "HanselStain": {"406983008": ("hansel stain", [8112])}, "HanzhongWhitePigBreed": {"132338001": ("Hanzhong White pig breed", [7480])}, "HarbinWhitePigBreed": {"132127005": ("Harbin White pig breed", [7480])}, "HarianaCattleBreed": {"133608006": ("Hariana cattle breed", [7480])}, "HarlequinCatBreed": {"132650003": ("Harlequin cat breed", [7480])}, "HarnaiSheepBreed": {"131775006": ("Harnai sheep breed", [7480])}, "HarrierDog": {"76724004": ("Harrier dog", [7480])}, "HarrisBeathAxialProjection": { "260493008": ("Harris Beath axial projection", [4012]) }, "HartónCattleBreed": {"131606001": ("Hartón cattle breed", [7480])}, "HarvestingOfDonorMaterial": { "53958007": ("Harvesting of donor material (procedure)", []) }, "HarvestingOfTissue": {"53958007": ("Harvesting of tissue", [8109])}, "HarzRedCattleBreed": {"133425001": ("Harz Red cattle breed", [7480])}, "HasActiveIngredient": {"127489000": ("Has active ingredient (attribute)", [])}, "HasIntent": {"363703001": ("Has intent (attribute)", [])}, "HasInterpretation": {"363713009": ("Has interpretation (attribute)", [])}, "HashtNagriSheepBreed": {"131762006": ("Hasht Nagri sheep breed", [7480])}, "HattonCattleBreed": {"133806007": ("Hatton cattle breed (organism)", [])}, "HattonXZebuCattleBreed": {"133806007": ("Hatton X zebu cattle breed", [7480])}, "HavanaBrownCat": {"3354004": ("Havana brown cat", [7480])}, "HavaneseDogBreed": {"132626000": ("Havanese dog breed", [7480])}, "HawaiianWildCattleBreed": {"133426000": ("Hawaiian wild cattle breed", [7480])}, "HaysConverterCattleBreed": { "23629009": ("Hays converter cattle breed (organism)", []) }, "HaysConverterCowBreed": {"23629009": ("Hays converter cow breed", [7480])}, "HazaragieSheepBreed": {"131763001": ("Hazaragie sheep breed", [7480])}, "Head": { "69536005": ("Head", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "HeadAndNeck": { "774007": ( "Head and Neck", [4, 645, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "HeadAndNeckStructure": { "774007": ("Head and neck structure (body structure)", []) }, "HeadOfFemur": {"2812003": ("Head of Femur", [7304])}, "HeadOfRib": {"12872006": ("Head of rib", [6115, 8134])}, "HeadOfRibStructure": {"12872006": ("Head of rib structure (body structure)", [])}, "HeadStructure": {"69536005": ("Head structure (body structure)", [])}, "HeadUp": {"128963009": ("Head up", [91, 3271])}, "HeadUpPhysiologicChallenge": { "128963009": ("Head up physiologic challenge (procedure)", []) }, "Headache": {"25064002": ("Headache", [60, 9300])}, "Headfirst": {"102540008": ("headfirst", [21])}, "HeadfirstPosition": {"102540008": ("Headfirst position (finding)", [])}, "Headrest": {"706683002": ("Headrest", [7151, 7157, 7193, 9505, 9513, 9520, 9573])}, "HealthcareAssociatedInfection": { "408678008": ("Healthcare associated infection", [6062]) }, "HealthcareAssociatedInfectiousDisease": { "408678008": ("Healthcare associated infectious disease (disorder)", []) }, "HealthcareProfessional": {"223366009": ("Healthcare professional", [7450])}, "Heart": { "80891009": ( "Heart", [ 1000, 1001, 1004, 4009, 4030, 4031, 4042, 6100, 6102, 6109, 6113, 6149, 7151, 7152, 7192, 8134, 9514, 10044, 10060, ], ) }, "HeartDisease": {"56265001": ("heart disease", [3727])}, "HeartDiseaseCongenital": { "13213009": ("heart disease, congenital", [3700, 3727, 3728]) }, "HeartDiseaseRiskFactors": { "171224000": ("Heart disease risk factors", [3201, 12246]) }, "HeartFailure": {"84114007": ("Heart failure", [3201])}, "HeartRateRecoveryTime": { "429157007": ("Heart rate recovery time (observable entity)", []) }, "HeartRateResponse": {"428531008": ("Heart rate response (observable entity)", [])}, "HeartStructure": {"80891009": ("Heart structure (body structure)", [])}, "HeartTransplant": {"32413006": ("Heart transplant", [3721, 3727])}, "HeartValveCalcification": { "373136005": ("Heart valve calcification (finding)", []) }, "HeartValveDisorder": {"368009": ("Heart valve disorder (disorder)", [])}, "HeartValveProsthesis": { "25510005": ("Heart valve prosthesis", [6102, 6138, 6404, 7151, 7193]) }, "HeartValveReplacementProsthesis": { "275035006": ("Heart valve replacement - prosthesis (procedure)", []) }, "HeartValveStenosis": {"44241007": ("Stenosis", [3711])}, "HebrideanSheepBreed": {"131770001": ("Hebridean sheep breed", [7480])}, "HeidschnuckeSheepBreed": {"131771002": ("Heidschnucke sheep breed", [7480])}, "HeiheHorseBreed": {"132750005": ("Heihe horse breed", [7480])}, "HeilongjiangSpottedPigBreed": { "132128000": ("Heilongjiang Spotted pig breed", [7480]) }, "HeilongkaingHorseBreed": {"132751009": ("Heilongkaing horse breed", [7480])}, "HeldInspiration": {"128969008": ("Held inspiration", [91, 3271])}, "HeldInspirationPhysiologicChallenge": { "128969008": ("Held inspiration physiologic challenge (procedure)", []) }, "HeldVentilation": {"128970009": ("Held ventilation", [91, 3271])}, "HeldVentilationPhysiologicChallenge": { "128970009": ("Held ventilation physiologic challenge (procedure)", []) }, "HellenicHoundDogBreed": {"132427000": ("Hellenic Hound dog breed", [7480])}, "HellyFixative": {"433471005": ("Helly fixative (substance)", [])}, "HellyFluid": {"433471005": ("Helly's fluid", [8114])}, "Hemangioma": {"400210000": ("Hemangioma", [6030, 6031])}, "HemangiomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "2099007": ( "Hemangioma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "HemangiomaOfSubcutaneousTissue": { "93473009": ("Hemangioma of subcutaneous tissue", [6030, 6031]) }, "HemangiomaVenous": {"56468002": ("Hemangioma - venous", [6030, 6031])}, "Hemangiopericytoma": {"128736003": ("Hemangiopericytoma", [6030, 6033])}, "HemangiopericytomaMorphologic": { "36060005": ("Hemangiopericytoma (morphologic abnormality)", []) }, "Hemangiosarcoma": {"39000009": ("Hemangiosarcoma (morphologic abnormality)", [])}, "HemateinStain": {"75956008": ("hematein stain", [8112])}, "Hematology": {"309954007": ("Hematology", [7030])}, "HematologyDepartment": {"309954007": ("Hematology department (environment)", [])}, "Hematoma": {"35566002": ("Hematoma", [6030, 6031])}, "HematomaPostoperative": {"213262007": ("Hematoma - postoperative", [6062])}, "HematoxylinAndEosinStainMethod": { "104210008": ("Hematoxylin and eosin stain method", [8130]) }, "HematoxylinStain": {"12710003": ("hematoxylin stain", [8112])}, "HemiFontanOperation": {"233230003": ("Hemi-Fontan operation", [12247])}, "HemiFontanPathway": {"443327008": ("Hemi-Fontan Pathway", [12282])}, "HemodynamicFlowWaveform": {"128434001": ("Hemodynamic flow waveform", [3003])}, "HemodynamicFlowWaveformFunction": { "128434001": ("Hemodynamic flow waveform, function (observable entity)", []) }, "HemodynamicImpedanceWaveform": { "128552003": ("Hemodynamic impedance waveform", [3003]) }, "HemodynamicImpedanceWaveformFunction": { "128552003": ( "Hemodynamic impedance waveform, function (observable entity)", [], ) }, "HemodynamicMeasurementViaDualCatheterMethodRegimeTherapy": { "128573003": ( "Hemodynamic measurement via dual catheter method (regime/therapy)", [], ) }, "HemodynamicMeasurementViaPullbackMethodRegimeTherapy": { "128575005": ( "Hemodynamic measurement via pullback method (regime/therapy)", [], ) }, "HemodynamicMeasurementViaWedgeMethodRegimeTherapy": { "128579004": ("Hemodynamic measurement via wedge method (regime/therapy)", []) }, "HemodynamicMeasurements": {"44324008": ("Hemodynamic Measurements", [12302])}, "HemodynamicOxygenSaturationWaveform": { "128435000": ("Hemodynamic oxygen saturation waveform", [3003]) }, "HemodynamicOxygenSaturationWaveformFunction": { "128435000": ( "Hemodynamic oxygen saturation waveform, function (observable entity)", [], ) }, "HemodynamicPressureWaveform": { "128433007": ("Hemodynamic pressure waveform", [3003]) }, "HemodynamicPressureWaveformFunction": { "128433007": ("Hemodynamic pressure waveform, function (observable entity)", []) }, "HemodynamicWaveform": {"128432002": ("Hemodynamic waveform", [3003])}, "HemodynamicWaveformFunction": { "128432002": ("Hemodynamic waveform, function (observable entity)", []) }, "Hemoglobin": {"38082009": ("Hemoglobin", [11006])}, "HemolymphNode": {"18457007": ("hemolymph node", [7600, 8134])}, "Hemoptysis": {"66857006": ("Hemoptysis", [12246])}, "Hemorrhage": { "50960005": ("Hemorrhage", [6335, 6336, 6337, 6338, 7151, 7159, 7194]) }, "HemorrhagePostprocedure": {"110265006": ("Hemorrhage postprocedure", [6062])}, "HemostaticAgent": {"26370007": ("Hemostatic agent", [10])}, "Henschen": {"399199004": ("Henschen", [4012])}, "HenschenProjection": {"399199004": ("Henschen projection (qualifier value)", [])}, "Heparin": {"84812008": ("Heparin", [10])}, "HepaticArtery": { "76015000": ( "Hepatic artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "HepaticCongestion": {"76281005": ("Hepatic Congestion", [12323])}, "HepaticFlexureOfColon": {"48338005": ("Hepatic flexure of colon", [6210, 8134])}, "HepaticLymphNode": {"61492009": ("hepatic lymph node", [7600, 8134])}, "HepaticVein": { "8993003": ( "Hepatic vein", [ 4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12114, 12125, 12282, ], ) }, "Hepatitis": {"128241005": ("Hepatitis", [12325])}, "HepatitisB": {"66071002": ("Hepatitis B", [12325])}, "HepatitisC": {"50711007": ("Hepatitis C", [12325])}, "HepatobiliarySurgery": {"310158005": ("Hepatobiliary Surgery", [7030])}, "HepatobiliarySurgicalService": { "310158005": ("Hepatobiliary surgical service (qualifier value)", []) }, "Hepatomegaly": {"80515008": ("Hepatomegaly", [12325])}, "HequHorseBreed": {"133096004": ("Hequ horse breed", [7480])}, "HerdwickSheepBreed": {"131772009": ("Herdwick sheep breed", [7480])}, "HerefordCattleSuperbreed": {"125074003": ("Hereford cattle superbreed", [7480])}, "HerefordPig": {"19770007": ("Hereford pig (organism)", [])}, "HerefordPigBreed": {"19770007": ("Hereford pig breed", [7480])}, "HerelandCattleBreed": {"133427009": ("Hereland cattle breed", [7480])}, "HerensCattleBreed": {"133231000": ("Herens cattle breed", [7480])}, "Heroin": {"387341002": ("Heroin", [6089])}, "HessenHorseBreed": {"131980007": ("Hessen horse breed", [7480])}, "HetaoLopEarPigBreed": {"132139002": ("Hetao Lop-Ear pig breed", [7480])}, "HeterogeneousCalcification": { "129763007": ("Heterogeneous calcification", [6010, 6011]) }, "HeterogeneousRadiographicCalcification": { "129763007": ("Heterogeneous radiographic calcification (finding)", []) }, "HeterogeneouslyDense": {"129718006": ("Heterogeneously dense", [6000, 6001])}, "HeterogeneouslyDenseBreastComposition": { "129718006": ("Heterogeneously dense breast composition (finding)", []) }, "HezuoPigBreed": {"132236004": ("Hezuo pig breed", [7480])}, "Hickey": {"399277004": ("Hickey", [4012])}, "HickeyProjection": {"399277004": ("Hickey projection (qualifier value)", [])}, "High": {"75540009": ("High", [75])}, "HighConformationWhitePigBreed": { "132021009": ("High Conformation White pig breed", [7480]) }, "HighDensityLesion": {"129744006": ("High density lesion", [6008, 6009])}, "HighFrequencyJetVentilation": { "243154003": ("High frequency jet ventilation (procedure)", []) }, "HighFrequencyVentilation": { "243154003": ("High frequency ventilation", [619, 620]) }, "HighPowerNonImmersionLens": { "445621001": ("High power non-immersion lens", [8121]) }, "HighPowerNonimmersionLensOfOpticalMicroscope": { "445621001": ( "High power nonimmersion lens of optical microscope (physical object)", [], ) }, "HighRightAtrium": {"128591008": ("High right atrium", [3011, 8134])}, "HighRisk": {"15508007": ("High risk", [3118])}, "HighRiskOfContextualQualifier": { "15508007": ("High risk of (contextual qualifier) (qualifier value)", []) }, "HighRiskTumor": {"258270003": ("High risk tumor", [6063])}, "HighestMediastinalLymphNode": { "127926002": ("highest mediastinal lymph node", [7600, 8134]) }, "HighlandPonyHorseBreed": {"133103001": ("Highland Pony horse breed", [7480])}, "HighlySignificant": {"371926006": ("Highly significant", [220])}, "Hilar": {"32381004": ("Hilar", [2])}, "HilarArtery": { "397405001": ("Hilar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12115]) }, "HilarLymphNode": {"53074004": ("hilar lymph node", [7600, 8134])}, "HilarRenalArtery": {"397405001": ("Hilar renal artery (body structure)", [])}, "HillRadnorSheepBreed": {"131773004": ("Hill Radnor sheep breed", [7480])}, "HilumOfLung": { "46750007": ("Hilum of lung", [6102, 6109, 6111, 6129, 7151, 7192, 8134, 9514]) }, "Hindfoot": {"416804009": ("Hindfoot", [7482, 7483, 8134])}, "HindfootOfQuadruped": { "416804009": ("Hindfoot of quadruped (body structure)", []) }, "HinisHorseBreed": {"131981006": ("Hinis horse breed", [7480])}, "HinterwaldCattleBreed": {"133232007": ("Hinterwald cattle breed", [7480])}, "Hip": {"29836001": ("Hip", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514])}, "HipJoint": { "24136001": ( "Hip joint", [ 4, 1000, 1001, 1005, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514, ], ) }, "HipJointReconstruction": {"119614000": ("Hip joint reconstruction", [7301])}, "HipJointStructure": {"24136001": ("Hip joint structure (body structure)", [])}, "HipRegionStructure": {"29836001": ("Hip region structure (body structure)", [])}, "HippocampalStructure": {"5366008": ("Hippocampal structure (body structure)", [])}, "Hippocampus": {"5366008": ("Hippocampus", [7140, 7151, 7153, 7192, 8134, 9514])}, "HirtzModification": {"424086005": ("Hirtz Modification", [4012])}, "HirtzModificationProjection": { "424086005": ("Hirtz Modification projection (qualifier value)", []) }, "HirzaiHorseBreed": {"131982004": ("Hirzai horse breed", [7480])}, "Hispanic": {"414408004": ("Hispanic", [6099])}, "HissarCattleBreed": {"133663000": ("Hissar cattle breed", [7480])}, "HistologicGrade": {"371469007": ("Histologic grade (observable entity)", [])}, "HistologicTest": {"714797009": ("Histologic test (procedure)", [])}, "HistologicalGradeFinding": { "373372005": ("Histological grade finding (finding)", []) }, "Histology": {"714797009": ("Histology", [8131])}, "HistomineReceptorAntagonist": {"372806008": ("Antihistamine", [621, 622])}, "Histopathology": {"252416005": ("Histopathology", [8131])}, "HistopathologyDepartment": {"441950002": ("Histopathology", [7030])}, "HistopathologyTest": {"252416005": ("Histopathology test (procedure)", [])}, "HistoryOfBetaAdrenergicReceptorBlockingAgentTherapy": { "440935004": ( "History of beta adrenergic receptor blocking agent therapy (situation)", [], ) }, "HistoryOfBetaBlockingAgentsTherapy": { "440935004": ("History of Beta-blocking agents therapy", [64]) }, "HistoryOfCABG": {"399261000": ("History of CABG", [3201])}, "HistoryOfCardiovascularDisease": { "266995000": ("History of - cardiovascular disease", [6087, 6088]) }, "HistoryOfCerebrovascularDisease": { "308064009": ("History of cerebrovascular disease", [3756]) }, "HistoryOfChronicLungDisease": { "414415007": ("History of chronic lung disease", [3756]) }, "HistoryOfCongestiveHeartFailure": { "161505003": ("History of congestive heart failure", [64, 3756]) }, "HistoryOfCoronaryArteryBypassGrafting": { "399261000": ("History of coronary artery bypass grafting (situation)", []) }, "HistoryOfDiabetes": {"161445009": ("History of Diabetes", [3756])}, "HistoryOfDiabetesMellitus": { "161445009": ("History of diabetes mellitus", [64, 6087, 6088]) }, "HistoryOfEclampsia": {"161806007": ("History of - eclampsia", [6087, 6088])}, "HistoryOfEctopicPregnancy": { "161763005": ("History of - ectopic pregnancy", [6087, 6088]) }, "HistoryOfFemaleInfertility": { "161798008": ("History of female infertility (situation)", []) }, "HistoryOfHeartFailure": { "161505003": ("History of heart failure (situation)", []) }, "HistoryOfHypercholesterolemia": { "414416008": ("History of hypercholesterolemia", [3756]) }, "HistoryOfHypertension": { "161501007": ("History of Hypertension", [64, 3756, 6087, 6088]) }, "HistoryOfInfertility": {"161798008": ("History of infertility", [6087, 6088])}, "HistoryOfKidneyDisease": { "275552000": ("History of kidney disease (situation)", []) }, "HistoryOfLowerLimbAmputation": { "161622006": ("History of lower limb amputation (situation)", []) }, "HistoryOfMalignantBasalCellNeoplasmOfSkin": { "428053000": ("History of malignant basal cell neoplasm of skin", [4404]) }, "HistoryOfMalignantMelanoma": { "161432005": ("History of malignant melanoma", [4402]) }, "HistoryOfMalignantMelanomaOfTheSkin": { "321000119108": ("History of malignant melanoma of the skin", [4402]) }, "HistoryOfMalignantNeoplasmOfSkinExcludingMelanoma": { "443895001": ( "History of malignant neoplasm of skin excluding melanoma", [4404], ) }, "HistoryOfMelanomaInSituOfSkin": { "1251000119106": ("History of melanoma in situ of skin (situation)", []) }, "HistoryOfMelanomaInSituOfTheSkin": { "1251000119106": ("History of melanoma in situ of the skin", [4403]) }, "HistoryOfMyocardialInfarction": { "399211009": ("History of Myocardial Infarction", [3201, 3756]) }, "HistoryOfObesity": {"161453001": ("History of - obesity", [6087, 6088])}, "HistoryOfPrematureDelivery": { "161765003": ("History of - premature delivery", [6087, 6088]) }, "HistoryOfRadiationTherapy": { "429479009": ("History of radiation therapy", [6051]) }, "HistoryOfRegularMedication": { "161656000": ("History of - regular medication", [6087, 6088]) }, "HistoryOfRenalFailure": {"414417004": ("History of renal failure", [64, 3756])}, "HistoryOfSeverePreEclampsia": { "161807003": ("History of - severe pre-eclampsia", [6087, 6088]) }, "HistoryOfSquamousCellCarcinomaOfSkin": { "429024007": ("History of squamous cell carcinoma of skin", [4404]) }, "HistoryOfSubstanceAbuse": { "371422002": ("History of substance abuse", [6087, 6088]) }, "HodgkinLymphoma": {"1163005009": ("Hodgkin's lymphoma", [6030, 6033])}, "HodgkinLymphomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "14537002": ( "Hodgkin lymphoma, no International Classification of Diseases for Oncology subtype (morphologic " "abnormality)", [], ) }, "HoffmanModulator": {"445635004": ("Hoffman modulator", [8124])}, "HoffmanModulatorOfOpticalMicroscope": { "445635004": ("Hoffman modulator of optical microscope (physical object)", []) }, "HogIslandSheepBreed": {"131787004": ("Hog Island Sheep breed", [7480])}, "HokkaidoHorseBreed": {"133102006": ("Hokkaido horse breed", [7480])}, "HolgusCattleBreed": {"133428004": ("Holgus cattle breed", [7480])}, "HollandShepherdDogBreed": {"132428005": ("Holland Shepherd dog breed", [7480])}, "Holly": {"399129007": ("Holly", [4012])}, "HollyProjection": {"399129007": ("Holly projection (qualifier value)", [])}, "Holmblad": {"399285008": ("Holmblad", [4012])}, "HolmbladProjection": {"399285008": ("Holmblad projection (qualifier value)", [])}, "HolmongerCattleBreed": {"131476008": ("Holmonger cattle breed", [7480])}, "HolsteinFriesianCattleBreed": { "26105007": ("Holstein-Friesian cattle breed (organism)", []) }, "HolsteinFriesianCowBreed": {"26105007": ("Holstein-Friesian cow breed", [7480])}, "HolsteinerHorse": {"25813002": ("Holsteiner horse (organism)", [])}, "HolsteinerHorseBreed": {"25813002": ("Holsteiner horse breed", [7480])}, "Homatropine": {"82264009": ("Homatropine", [4208])}, "HomoSapiens": {"337915000": ("Homo sapiens", [7454])}, "HomoSapiensLivingOrganism": { "30996001": ("Homo sapiens (living organism) (organism)", []) }, "HondurasSwitchTailPigBreed": { "132066000": ("Honduras Switch-Tail pig breed", [7480]) }, "Horizontal": {"24020000": ("Horizontal", [2, 6121])}, "HorizontalLongAxis": {"131186000": ("Horizontal Long Axis", [26, 27, 501])}, "HormelMiniaturePig": {"86694007": ("Hormel miniature pig (organism)", [])}, "HormelMiniaturePigBreed": {"86694007": ("Hormel miniature pig breed", [7480])}, "HormoneTherapy": {"169413002": ("Hormone therapy", [6083, 6085])}, "HornDorsetSheepBreed": {"86920006": ("Horn dorset sheep breed", [7480])}, "HornedDorsetSheepBreed": { "86920006": ("Horned dorset sheep breed (organism)", []) }, "HornedHereford": {"7843000": ("Horned Hereford (organism)", [])}, "HornedHerefordCowBreed": {"7843000": ("Horned Hereford cow breed", [7480])}, "HorroCattleBreed": {"131433006": ("Horro cattle breed", [7480])}, "HospitalAdmissionElective": {"8715000": ("Elective", [3729])}, "HospitalAdmissionTransferFromOtherHospitalOrHealthCareFacility": { "4563007": ( "Hospital admission, transfer from other hospital or health care facility (procedure)", [], ) }, "HospitalConsultant": {"309390008": ("Hospital consultant (occupation)", [])}, "HospitalIsolationRoom": { "409688003": ("Hospital isolation room (environment)", []) }, "HospitalRegistrar": {"158971006": ("Hospital registrar (occupation)", [])}, "Hough": {"399168000": ("Hough", [4012])}, "HoughProjection": {"399168000": ("Hough projection (qualifier value)", [])}, "Hound": {"25097001": ("Hound", [7480])}, "HovawartDogBreed": {"132500001": ("Hovawart dog breed", [7480])}, "HrbineckyCattleBreed": {"133429007": ("Hrbinecky cattle breed", [7480])}, "Hsieh": {"399083008": ("Hsieh", [4012])}, "HsiehProjection": {"399083008": ("Hsieh projection (qualifier value)", [])}, "HuaiPigBreed": {"132135008": ("Huai pig breed", [7480])}, "HuangHuaiHaiBlackPigBreed": { "132131004": ("Huang-Huai-Hai Black pig breed", [7480]) }, "HuangHuaiHaiBlackShenxianPigBreed": { "132130003": ("Huang-Huai-Hai Black, Shenxian pig breed", [7480]) }, "HuazhongTwoEndBlackJianliPigBreed": { "132297005": ("Huazhong Two-End Black, Jianli pig breed", [7480]) }, "HuazhongTwoEndBlackPigBreed": { "132296001": ("Huazhong Two-End Black pig breed", [7480]) }, "HuazhongTwoEndBlackSatzelingPigBreed": { "132299008": ("Huazhong Two-End Black, Satzeling pig breed", [7480]) }, "HuazhongTwoEndBlackTongchengPigBreed": { "132298000": ("Huazhong Two-End Black, Tongcheng pig breed", [7480]) }, "HubeiWhitePigBreed": {"132323002": ("Hubei White pig breed", [7480])}, "HuchuanMountainPigBreed": {"132149004": ("Huchuan Mountain pig breed", [7480])}, "HuculHorseBreed": {"131861006": ("Hucul horse breed", [7480])}, "HuertanaCattleBreed": {"133436008": ("Huertana cattle breed", [7480])}, "Hughston": {"399003005": ("Hughston", [4012])}, "HughstonProjection": {"399003005": ("Hughston projection (qualifier value)", [])}, "HumanFibrinogen": {"418326009": ("Human fibrinogen", [10])}, "HumanImmunodeficiencyVirusPositive": { "165816005": ("Human immunodeficiency virus positive (finding)", []) }, "Humerus": { "85050009": ( "Humerus", [ 4, 4009, 4030, 4031, 4042, 6102, 6109, 6114, 7151, 7192, 7304, 7482, 7483, 8134, 9514, ], ) }, "HungahybPigBreed": {"132364007": ("Hungahyb pig breed", [7480])}, "HungairanColdbloodHorseBreed": { "131983009": ("Hungairan Coldblood horse breed", [7480]) }, "HungarianColdbloodHorseBreed": { "131983009": ("Hungarian Coldblood horse breed (organism)", []) }, "HungarianDunHorseBreed": {"131984003": ("Hungarian Dun horse breed", [7480])}, "HungarianGrayCattleBreed": {"133233002": ("Hungarian Gray cattle breed", [7480])}, "HungarianPiedCattleBreed": {"133437004": ("Hungarian Pied cattle breed", [7480])}, "HungarianSportHorseHorseBreed": { "131985002": ("Hungarian Sport Horse horse breed", [7480]) }, "HungarianWhitePigBreed": {"132363001": ("Hungarian White pig breed", [7480])}, "HungarofriesCattleBreed": {"133438009": ("Hungarofries cattle breed", [7480])}, "HunterHorse": {"19356005": ("Hunter horse (organism)", [])}, "HunterHorseBreed": {"19356005": ("Hunter horse breed", [7480])}, "HunterianPerforatingVein": { "128560002": ( "Hunterian perforating vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "HydrocortisoneSodiumSuccinate": { "109066000": ("Hydrocortisone sodium succinate", [65]) }, "HydroxymethylglutarylCoenzymeAReductaseInhibitor": { "96302009": ( "Hydroxymethylglutaryl-coenzyme A reductase inhibitor (product)", [], ) }, "HyoidBone": {"21387005": ("Hyoid bone", [4028, 7151, 7192, 8134, 9514])}, "HyoidBoneStructure": {"21387005": ("Hyoid bone structure (body structure)", [])}, "HyperLargeWhitePigBreed": {"132089008": ("Hyper Large White pig breed", [7480])}, "Hyperkinesis": {"371855002": ("Hyperkinesis", [3706])}, "HyperkinesisOfRegionOfCardiacWall": { "373123005": ("Hyperkinesis of region of cardiac wall (finding)", []) }, "HyperkineticRegion": {"373123005": ("Hyperkinetic region", [3703])}, "HyperkineticVentricularWall": { "371855002": ("Hyperkinetic ventricular wall (finding)", []) }, "Hypermetropia": {"38101003": ("Hypermetropia (disorder)", [])}, "Hyperopia": {"38101003": ("Hyperopia", [4238])}, "Hyperplasia": {"76197007": ("hyperplasia", [3802, 3815])}, "HyperplasiaUsual": {"76197007": ("Hyperplasia, usual", [6030, 6031])}, "Hypertension": {"38341003": ("Hypertension", [60, 3201, 9300, 12246])}, "Hypertensive": {"38341003": ("Hypertensive", [3211])}, "HypertensiveDisorderSystemicArterial": { "38341003": ("Hypertensive disorder, systemic arterial (disorder)", []) }, "HypertensiveEpisode": {"443482000": ("Hypertensive episode", [3221])}, "HypertensiveHeartDisease": { "64715009": ("Hypertensive heart disease", [3700, 3728]) }, "HypertensiveUrgency": {"443482000": ("Hypertensive urgency (disorder)", [])}, "HypertrophicCardiomyopathyWithObstruction": { "45227007": ("Hypertrophic cardiomyopathy with obstruction", [3728]) }, "HypertrophicCardiomyopathyWithoutObstruction": { "195020003": ("Hypertrophic cardiomyopathy without obstruction", [3728]) }, "HypertrophicObstructiveCardiomyopathy": { "45227007": ("Hypertrophic obstructive cardiomyopathy", [3700]) }, "Hyperventilation": {"68978004": ("Hyperventilation", [3038, 3207, 12002])}, "HypochondriacRegion": {"19695001": ("Subcostal", [4, 7151, 7192, 8134, 9514])}, "HypogastricLymphNode": {"69255009": ("hypogastric lymph node", [7600, 8134])}, "HypogastricRegion": { "11708003": ("Hypogastric region", [4, 7151, 7192, 8134, 9514]) }, "HypogastricRegionStructure": { "11708003": ("Hypogastric region structure (body structure)", []) }, "HypoglossalNerve": {"37899009": ("hypoglossal nerve", [7706, 7710, 8134])}, "HypoglossalNerveStructure": { "37899009": ("Hypoglossal nerve structure (body structure)", []) }, "Hypoglycemic": {"312064005": ("Hypoglycemic", [621, 622])}, "HypoglycemicAgent": {"312064005": ("Hypoglycemic agent (product)", [])}, "Hypokinesis": {"37706002": ("Hypokinesis", [3703, 3706])}, "HypokinesisOfCardiacWall": { "37706002": ("Hypokinesis of cardiac wall (finding)", []) }, "HypopharyngealStructure": { "81502006": ("Hypopharyngeal structure (body structure)", []) }, "Hypopharynx": {"81502006": ("Hypopharynx", [4, 7151, 7192, 7601, 8134, 9514])}, "Hypoplasia": {"55199003": ("hypoplasia", [3813])}, "HypoplasticLeftHeartSyndrome": { "62067003": ("Hypoplastic left heart syndrome", [12248, 12249]) }, "Hypotension": {"45007003": ("Hypotension", [60, 9300])}, "Hypotensive": {"45007003": ("Hypotensive", [3211])}, "HypotensiveAgent": {"1182007": ("Hypotensive agent", [10])}, "HypotensiveEpisode": {"67763001": ("Hypotensive episode", [3221])}, "Hysterectomy": {"236886002": ("Hysterectomy", [6082])}, "IDPlate": {"129467007": ("ID Plate", [6040, 6401, 7151, 7193])}, "ILMInternalLimitingMembrane": { "280677004": ("ILM - Internal limiting membrane", [4273, 7151, 7192, 9514]) }, "INRA95CattleBreed": {"133440004": ("INRA 95 cattle breed", [7480])}, "IbageCattleBreed": {"133807003": ("Ibage cattle breed (organism)", [])}, "IbageXZebuCattleBreed": {"133807003": ("Ibage X zebu cattle breed", [7480])}, "IbanPigBreed": {"132844006": ("Iban pig breed", [7480])}, "IberianBlackIberianPigBreed": { "132082004": ("Iberian, Black Iberian pig breed", [7480]) }, "IberianExtremaduraRedPigBreed": { "132080007": ("Iberian, Extremadura Red pig breed", [7480]) }, "IberianJabugoSpottedPigBreed": { "132081006": ("Iberian, Jabugo Spotted pig breed", [7480]) }, "IberianPigBreed": {"132079009": ("Iberian pig breed", [7480])}, "IbizanHound": {"10842007": ("Ibizan hound", [7480])}, "IcelandicCattleBreed": {"133234008": ("Icelandic cattle breed", [7480])}, "IcelandicHorse": {"70457009": ("Icelandic horse (organism)", [])}, "IcelandicHorseBreed": {"70457009": ("Icelandic horse breed", [7480])}, "IcelandicPigBreed": {"132254000": ("Icelandic pig breed", [7480])}, "IcelandicSheepBreed": {"131774005": ("Icelandic sheep breed", [7480])}, "IcelandicSheepdogBreed": {"132501002": ("Icelandic Sheepdog breed", [7480])}, "IdentificationPlateDevice": { "129467007": ("Identification plate, device (physical object)", []) }, "IdiopathicHypertrophicSubaorticStenosis": { "360465008": ("Idiopathic hypertrophic subaortic stenosis (disorder)", []) }, "IleDeFranceSheepBreed": {"131761004": ("Ile-de-France sheep breed", [7480])}, "IlealStructure": {"34516001": ("Ileal structure (body structure)", [])}, "IlealVein": { "397439002": ("Ileal vein", [3827, 7151, 7192, 8134, 9514, 12103, 12113, 12125]) }, "IlealVeinStructure": {"397439002": ("Ileal vein structure (body structure)", [])}, "IleocecalValve": {"23153004": ("Ileocecal valve", [6201])}, "IleocecalValveStructure": { "23153004": ("Ileocecal valve structure (body structure)", []) }, "IleocolicLymphNode": {"281676003": ("ileocolic lymph node", [7600, 8134])}, "IleostomyBag": {"417136005": ("Ileostomy bag", [6202, 6203])}, "IleostomySet": {"342706005": ("Ileostomy set (physical object)", [])}, "Ileum": { "34516001": ("Ileum", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "IliacAndOrFemoralArtery": { "299716001": ("Iliac and/or femoral artery", [4, 4030, 7151, 7192, 8134, 9514]) }, "IliacAndOrFemoralArteryStructures": { "299716001": ("Iliac and/or femoral artery structures (body structure)", []) }, "IliacArtery": { "10293006": ( "Iliac artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "IliacCrest": {"29850006": ("Iliac Crest", [1000, 1001, 1005, 8134])}, "IliacCrestStructure": {"29850006": ("Iliac crest structure (body structure)", [])}, "IliacLymphNode": {"84219008": ("iliac lymph node", [7600, 8134])}, "IliacVein": {"244411005": ("Iliac vein", [4, 3010, 4042, 7151, 7192, 8134, 9514])}, "IliacVeinStructure": {"244411005": ("Iliac vein structure (body structure)", [])}, "IliocostalisMuscle": { "57651003": ("Iliocostalis muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "Ilium": { "22356005": ("Ilium", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "IllawarraCattleBreed": {"133235009": ("Illawarra cattle breed", [7480])}, "IlocosCattleBreed": {"131477004": ("Ilocos cattle breed", [7480])}, "IloiloCattleBreed": {"131478009": ("Iloilo cattle breed", [7480])}, "ImageAnalysis": {"24587005": ("Image analysis", [3215])}, "ImageMode": {"399264008": ("Image mode (observable entity)", [])}, "ImageQualityAnalysis": {"133887000": ("Image quality analysis", [6043, 6137])}, "Imaging": {"363679005": ("Imaging (procedure)", [])}, "ImagingFinding": {"365853002": ("Imaging finding (finding)", [])}, "ImagingGuidance": {"413815006": ("Imaging guidance", [12246])}, "ImagingProcedure": {"363679005": ("Imaging procedure", [100, 634])}, "ImagingResultAbnormal": {"408574004": ("Imaging result abnormal", [3209])}, "ImagingResultEquivocal": {"408379005": ("Imaging result equivocal", [3209])}, "ImagingResultNormal": {"408573005": ("Imaging result normal", [3209])}, "ImmobileHeartValve": {"373137001": ("Immobile Heart Valve", [3711])}, "ImmunofluorescentStain": {"255800009": ("immunofluorescent stain", [4412, 8112])}, "Immunohistochemistry": {"117617002": ("Immunohistochemistry", [8131])}, "ImmunohistochemistryProcedure": { "117617002": ("Immunohistochemistry procedure (procedure)", []) }, "Immunomodulator": {"372558009": ("Immunomodulator", [4410])}, "ImpairedLeftVentricularFunction": { "275514001": ("Impaired left ventricular function", [3119]) }, "ImpairedRenalFunction": {"236423003": ("Impaired Renal Function", [1200, 1201])}, "Implant": {"40388003": ("Implant", [6040, 6054, 6401, 7151, 7193])}, "ImplantDevice": {"40388003": ("Implant, device", [1000])}, "ImplantDisplaced": {"399209000": ("Implant Displaced", [4015])}, "ImplantRevisedSincePreviousMammogram": { "129731001": ("Implant revised since previous mammogram", [6002, 6003]) }, "ImplantableDefibrillator": {"72506001": ("Implantable defibrillator", [3777])}, "ImplantableDefibrillatorDevice": { "72506001": ("Implantable defibrillator, device (physical object)", []) }, "ImplantableVenousAccessPort": { "398013009": ("Implantable venous access port", [74]) }, "ImplantationOfAutomaticCardiacDefibrillator": { "233170003": ("Implantation of automatic cardiac defibrillator", [3721]) }, "ImplantationOfBaffleAtrialOrInteratrial": { "245544005": ("Implantation of baffle, atrial or interatrial (procedure)", []) }, "ImplantationOfCardiacPacemaker": { "307280005": ("Implantation of cardiac pacemaker", [3721]) }, "ImplantationOfHeartValveProsthesisOrSyntheticDevice": { "47432005": ( "Implantation of heart valve prosthesis or synthetic device", [12247], ) }, "ImplantationOfHeartValveWithTissueGraft": { "37153009": ("Implantation of heart valve with tissue graft", [12247]) }, "ImplantationOfRadioactiveSeedIntoProstate": { "425767004": ("Implantation of radioactive seed into prostate", [6323]) }, "ImprovedRodopiCattleBreed": { "133439001": ("Improved Rodopi cattle breed", [7480]) }, "ImprovementOfLeftVentricularWallMotionComparedToPriorStudy": { "428825004": ( "Improvement of left ventricular wall motion compared to prior study (finding)", [], ) }, "ImprovementOfWallMotion": {"428825004": ("Improvement of wall motion", [3237])}, "InProgress": {"385651009": ("In progress", [3773])}, "InRemission": {"765205004": ("In remission", [3772])}, "InactiveProblem": {"394775005": ("Inactive problem", [3770])}, "IncaHairlessDogBreed": {"132502009": ("Inca Hairless Dog breed", [7480])}, "IncisionOfTrachea": {"48387007": ("Incision of trachea (procedure)", [])}, "IncompetenceOfAnyValvularStructure": { "10337008": ("Incompetence of any valvular structure (finding)", []) }, "IncompleteArterialStentAppositionAtTimeOfPlacement": { "408709008": ( "Incomplete arterial stent apposition at time of placement (finding)", [], ) }, "IncompleteArterialStentAppositionSubsequentToPlacement": { "408710003": ( "Incomplete arterial stent apposition subsequent to placement (finding)", [], ) }, "IncompleteLeftBundleBranchBlock": { "251120003": ("Incomplete Left bundle branch block", [3230]) }, "IncompleteRightBundleBranchBlock": { "251124007": ("Incomplete Right bundle branch block", [3230]) }, "IncompleteStentApposition": {"408709008": ("Incomplete Stent apposition", [3494])}, "IncreaseInNumberOfCalcifications": { "129726003": ("Increase in number of calcifications", [6002, 6003]) }, "IncreaseInNumberOfCalcificationsSincePreviousMammogram": { "129726003": ( "Increase in number of calcifications since previous mammogram (finding)", [], ) }, "IncreaseInSize": {"15454001": ("Increase in size", [6002, 6003, 6134])}, "IncreasedLungTracerUptake": { "428920008": ("Increased lung tracer uptake (finding)", []) }, "IncreasedLungUptake": {"428920008": ("Increased lung uptake", [3116])}, "IncreasedMyocardialIschemiaComparedToPriorStudy": { "429477006": ( "Increased myocardial ischemia compared to prior study (finding)", [], ) }, "IncreasedSize": {"15454001": ("Increased size (finding)", [])}, "IncreasedTolerance": {"102459008": ("Increased tolerance", [3236])}, "Indeterminate": {"82334004": ("Indeterminate", [4220])}, "IndeterminateResult": {"280416009": ("Indeterminate result", [6063])}, "IndiaInkStain": {"406972004": ("India ink stain", [8112])}, "Indian": {"414481008": ("Indian (racial group)", [])}, "IndianRace": {"414481008": ("Indian race", [6099])}, "IndicationForProcedure": { "432678004": ("Indication for procedure (observable entity)", []) }, "IndigoCarmine": {"412548006": ("indigo carmine", [8112])}, "IndigoCarmineStain": {"45475000": ("Indigo carmine stain (substance)", [])}, "IndigotindisulfonateSodium": { "412548006": ("Indigotindisulfonate sodium (substance)", []) }, "IndirectIrisTransillumination": { "410467002": ("Indirect iris transillumination", [4203]) }, "IndirectIrisTransilluminationAction": { "410467002": ("Indirect iris transillumination - action (qualifier value)", []) }, "IndirectOphthalmoscope": {"409901008": ("Indirect Ophthalmoscope", [4202])}, "IndirectOphthalmoscopyLens": { "409897002": ("Indirect ophthalmoscopy lens", [4205]) }, "IndirectRetroilluminationFromTheIris": { "410465005": ("Indirect retroillumination from the iris", [4203]) }, "IndirectRetroilluminationFromTheIrisAction": { "410465005": ( "Indirect retroillumination from the iris - action (qualifier value)", [], ) }, "IndirectRetroilluminationFromTheRetina": { "410466006": ("Indirect retroillumination from the retina", [4203]) }, "IndirectRetroilluminationFromTheRetinaAction": { "410466006": ( "Indirect retroillumination from the retina - action (qualifier value)", [], ) }, "IndirectScleroticScatterIllumination": { "410464009": ("Indirect sclerotic scatter illumination", [4203]) }, "IndirectScleroticScatterIlluminationAction": { "410464009": ( "Indirect sclerotic scatter illumination - action (qualifier value)", [], ) }, "IndistinctLesion": { "129741003": ("Indistinct lesion", [6006, 6007, 6335, 6341, 6342]) }, "Indium111CapromabPendetide": { "446871009": ("Indium^111 Capromab Pendetide", [25]) }, "Indium111Chloride": {"395742005": ("Indium^111 Chloride", [25])}, "Indium111FeOHGreaterThan3LesserThan": { "6516008": ("Indium^111^-Fe(OH) >3<", [25]) }, "Indium111Oxyquinoline": {"424570009": ("Indium^111^oxyquinoline", [25])}, "Indium111Pentetate": {"29218008": ("Indium^111^ pentetate", [25])}, "Indium111Pentetreotide": {"446800006": ("Indium^111 Pentetreotide", [25])}, "Indium111RedCellLabel": {"81621007": ("Indium^111^ red cell label", [25])}, "Indium111Transferrin": {"78570003": ("Indium^111^ transferrin", [25])}, "Indium111inOxyquinoline": { "424570009": ("Indium[111In]oxyquinoline (product)", []) }, "Indium113Bleomycin": {"90617008": ("Indium^113^ bleomycin (substance)", [])}, "Indium113Pentetate": {"42728008": ("Indium^113^ pentetate (substance)", [])}, "Indium113mBleomycin": {"90617008": ("Indium^113m^ bleomycin", [25])}, "Indium113mChloride": {"767418009": ("Indium^113m^ chloride", [25])}, "Indium113mPentetate": {"42728008": ("Indium^113m^ pentetate", [25])}, "IndiumChloride111in": {"395742005": ("Indium chloride[111In] (substance)", [])}, "IndividualCalcification": { "129770007": ("Individual Calcification", [6014, 6015, 6016, 6054, 6056]) }, "IndoBrazilianCattleBreed": {"133609003": ("Indo-Brazilian cattle breed", [7480])}, "IndocyanineGreen": {"7292004": ("Indocyanine green", [4200])}, "IndophenolFromNaphtholStain": { "11727009": ("indophenol from naphthol stain", [8112]) }, "InductionOfGeneralAnesthesia": { "241687005": ("Induction of general anesthesia (procedure)", []) }, "InductionRoom": {"414485004": ("Induction room", [603])}, "InfarctionOfBreast": {"77296004": ("Infarction of breast", [6030, 6031])}, "InfectiousDisease": {"309934006": ("Infectious Disease", [7030])}, "InfectiousDiseasesDepartment": { "309934006": ("Infectious diseases department (environment)", []) }, "Inferior": { "261089000": ("Inferior", [2, 5, 211, 212, 3019, 4005, 6065, 12117, 12281]) }, "InferiorArticularFacetOfAxis": { "181901007": ("Inferior articular facet of axis", [6115, 8134]) }, "InferiorArticularProcessOfVertebra": { "317766009": ("Inferior articular process of vertebra", [6115, 8134]) }, "InferiorAuricularLymphNode": { "155237005": ("inferior auricular lymph node", [7600, 8134]) }, "InferiorCardiacVein": { "195416006": ("Inferior cardiac vein", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "InferiorCerebellarPeduncle": { "67701001": ( "Inferior cerebellar peduncle", [7151, 7153, 7192, 7701, 7710, 8134, 9514], ) }, "InferiorCerebellarPeduncleStructure": { "67701001": ("Inferior cerebellar peduncle structure (body structure)", []) }, "InferiorFrontoOccipitalFasciculus": { "35664009": ("inferior fronto-occipital fasciculus", [7703, 7710, 8134]) }, "InferiorGlutealLymphNode": { "40684008": ("inferior gluteal lymph node", [7600, 8134]) }, "InferiorHornOfLateralVentricle": { "53118009": ("Inferior Horn of Lateral Ventricle", [7140]) }, "InferiorInguinalLymphNode": { "85380009": ("inferior inguinal lymph node", [7600, 8134]) }, "InferiorLeftPulmonaryVein": { "51249003": ( "Inferior left pulmonary vein", [4, 3010, 3011, 3827, 3840, 4042, 7151, 7192, 8134, 9514], ) }, "InferiorLongitudinalFasciculus": { "55233005": ( "Inferior longitudinal fasciculus", [7151, 7153, 7192, 7703, 7710, 8134, 9514], ) }, "InferiorMesentericArtery": { "33795007": ( "Inferior mesenteric artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "InferiorMesentericLymphNode": { "113336002": ("inferior mesenteric lymph node", [7600, 8134]) }, "InferiorMesentericVein": { "32859001": ( "Inferior Mesenteric Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "InferiorPancreaticLymphNode": { "280915003": ("inferior pancreatic lymph node", [7600, 8134]) }, "InferiorPancreaticoduodenalLymphNode": { "281227003": ("inferior pancreaticoduodenal lymph node", [7600, 8134]) }, "InferiorPhrenicArtery": { "29660000": ( "Inferior phrenic artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "InferiorRightHepaticVein": { "397425002": ( "Inferior Right Hepatic Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "InferiorRightHepaticVeinStructure": { "397425002": ("Inferior right hepatic vein structure (body structure)", []) }, "InferiorRightPulmonaryVein": { "113273001": ( "Inferior right pulmonary vein", [4, 3010, 3011, 3827, 3840, 4042, 7151, 7192, 8134, 9514], ) }, "InferiorRollingOfBreast": { "414493004": ("Inferior rolling of breast (procedure)", []) }, "InferiorVenaCava": { "64131007": ( "Inferior vena cava", [ 4, 3010, 3607, 3630, 3827, 4042, 6102, 6109, 6117, 6202, 6204, 7151, 7154, 7192, 8134, 9514, 12103, 12114, 12125, 12282, 12305, ], ) }, "InferiorVenaCavaStructure": { "64131007": ("Inferior vena cava structure (body structure)", []) }, "InferomedialToSuperolateralOblique": { "441555000": ("inferomedial to superolateral oblique", [4014]) }, "InferomedialToSuperolateralObliqueView": { "441555000": ( "Inferomedial to superolateral oblique view (qualifier value)", [], ) }, "InfiltratingDuctCarcinoma": { "82711006": ("Infiltrating duct carcinoma", [6030, 6033]) }, "InfiltratingDuctCarcinomaOfBreast": { "408643008": ("Infiltrating duct carcinoma of breast (disorder)", []) }, "InfiltratingDuctalCarcinomaOfBreast": { "408643008": ("Infiltrating ductal carcinoma of breast", [638, 639]) }, "Inflammation": {"409774005": ("Inflammation", [6030, 6031, 7151, 7159, 7194])}, "InflammationMorphologic": { "23583003": ("Inflammation (morphologic abnormality)", []) }, "InflammatoryAbdominalAorticAneurysm": { "314186008": ("inflammatory abdominal aortic aneurysm", [3808]) }, "InflammatoryCarcinoma": {"32968003": ("Inflammatory carcinoma", [6030, 6033])}, "InflammatoryDiseaseOfLiver": { "128241005": ("Inflammatory disease of liver (disorder)", []) }, "InflammatoryMorphology": { "409774005": ("Inflammatory morphology (morphologic abnormality)", []) }, "InfraMammaryFold": {"442593008": ("Infra-mammary fold", [4015])}, "InfraMammaryFoldMammographyView": { "442593008": ("Infra-mammary fold mammography view (qualifier value)", []) }, "InfraRedColor": {"414497003": ("Infra-red color (qualifier value)", [])}, "InfraRenalAorta": { "28205006": ( "Infra-renal Aorta", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125, 12291], ) }, "InfraclavicularLymphNode": { "9659009": ("infraclavicular lymph node", [7600, 8134]) }, "Infrared": {"414497003": ("Infrared", [4206, 8122])}, "InfraredOpticalFilter": {"445169002": ("Infrared optical filter", [4204, 8124])}, "InfraredOpticalFilterOfOpticalMicroscope": { "445169002": ( "Infrared optical filter of optical microscope (physical object)", [], ) }, "InfraspinatusMuscle": { "72573008": ("Infraspinatus muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "InfraspinatusMuscleStructure": { "72573008": ("Infraspinatus muscle structure (body structure)", []) }, "Infrequent": {"27789000": ("Infrequent", [6091])}, "IngessanaCattleBreed": {"133664006": ("Ingessana cattle breed", [7480])}, "InguinalLymphNode": {"8928004": ("inguinal lymph node", [7600, 8134])}, "InguinalLymphNodeStructure": { "8928004": ("Inguinal lymph node structure (body structure)", []) }, "InguinalRegion": { "26893007": ("Inguinal region", [4, 4040, 7151, 7192, 8134, 9514]) }, "InguinalRegionStructure": { "26893007": ("Inguinal region structure (body structure)", []) }, "InhalationAnesthesiaMachineSystemClosedNoRebreathingOfPrimaryAgent": { "44812007": ( "Inhalation anesthesia, machine system, closed, no rebreathing of primary agent (procedure)", [], ) }, "InhalationAnesthesiaMachineSystemClosedRebreathingOfPrimaryAgent": { "112987001": ( "Inhalation anesthesia, machine system, closed, rebreathing of primary agent (procedure)", [], ) }, "InhalationAnesthesiaSystemClosedNoRebreathingPrimaryAgent": { "44812007": ( "Inhalation anesthesia system closed no rebreathing primary agent", [615, 616], ) }, "InhalationAnesthesiaSystemClosedRebreathingPrimaryAgent": { "112987001": ( "Inhalation anesthesia system closed rebreathing primary agent", [615, 616], ) }, "InhalationTechnique": { "446406008": ("Inhalation technique (qualifier value)", []) }, "InjectionOfAmnion": {"15415002": ("Injection of amnion (procedure)", [])}, "InjectionOfProstaglandin": { "133875007": ("Injection of prostaglandin (procedure)", []) }, "InjectionSiteAbscess": {"95382004": ("Injection site abscess", [60, 9300, 10043])}, "InjectionSiteAnesthesia": { "95398006": ("Injection site anesthesia", [60, 9300, 10043]) }, "InjectionSiteAtrophy": {"95404001": ("Injection site atrophy", [60, 9300, 10043])}, "InjectionSiteBruising": { "95401009": ("Injection site bruising", [60, 9300, 10043]) }, "InjectionSiteBurning": {"95389008": ("Injection site burning", [60, 9300, 10043])}, "InjectionSiteCyst": {"95396005": ("Injection site cyst", [60, 9300, 10043])}, "InjectionSiteDermatitis": { "95393002": ("Injection site dermatitis", [60, 9300, 10043]) }, "InjectionSiteDisorder": { "95376002": ("Injection site disorder", [60, 9300, 10043]) }, "InjectionSiteEdema": {"95392007": ("Injection site edema", [60, 9300, 10043])}, "InjectionSiteExtravasation": { "95384003": ("Injection Site Extravasation", [60, 9300, 9301]) }, "InjectionSiteFibrosis": { "95403007": ("Injection site fibrosis", [60, 9300, 10043]) }, "InjectionSiteGranuloma": { "24389009": ("Injection site granuloma", [60, 9300, 10043]) }, "InjectionSiteHemorrhage": { "95385002": ("Injection site hemorrhage", [60, 9300, 10043]) }, "InjectionSiteHypersensitivity": { "95378001": ("Injection site hypersensitivity", [60, 9300, 10043]) }, "InjectionSiteInduration": { "95402002": ("Injection site induration", [60, 9300, 10043]) }, "InjectionSiteInfection": { "95381006": ("Injection site infection", [60, 9300, 10043]) }, "InjectionSiteInflammation": { "95391000": ("Injection site inflammation", [60, 9300, 10043]) }, "InjectionSiteIrritation": { "95379009": ("Injection site irritation", [60, 9300, 10043]) }, "InjectionSiteMalabsorption": { "95387005": ("Injection site malabsorption", [60, 9300, 10043]) }, "InjectionSiteMass": {"95395009": ("Injection site mass", [60, 9300, 10043])}, "InjectionSiteNecrosis": { "95397001": ("Injection site necrosis", [60, 9300, 10043]) }, "InjectionSiteNerveDamage": { "95390004": ("Injection site nerve damage", [60, 9300, 10043]) }, "InjectionSitePain": {"95388000": ("Injection site pain", [60, 9300, 10043])}, "InjectionSiteParesthesia": { "95399003": ("Injection site paresthesia", [60, 9300, 10043]) }, "InjectionSitePigmentationChange": { "95380007": ("Injection site pigmentation change", [60, 9300, 10043]) }, "InjectionSiteReaction": {"95377006": ("Injection site reaction (disorder)", [])}, "InjectionSiteScar": {"111017005": ("Injection site scar", [60, 9300, 10043])}, "InjectionSiteSterileAbscess": { "95383009": ("Injection site sterile abscess", [60, 9300, 10043]) }, "InjectionSiteThrombosis": { "95386001": ("Injection site thrombosis", [60, 9300, 10043]) }, "InjectionSiteUlcer": {"95400005": ("Injection site ulcer", [60, 9300, 10043])}, "InjectionSiteUrticaria": { "95394008": ("Injection site urticaria", [60, 9300, 10043]) }, "InkukuCattleBreed": {"131479001": ("Inkuku cattle breed", [7480])}, "InlayDentalRestoration": { "272287005": ("Inlay Dental Restoration", [7151, 7157, 7193]) }, "InnerEar": {"22945000": ("Inner ear", [4028, 7151, 7192, 8134, 9514])}, "InnerEarStructure": {"22945000": ("Inner ear structure (body structure)", [])}, "InnermostIntercostalMuscles": { "24062007": ( "Innermost intercostal muscles", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "InnominateArtery": { "12691009": ( "Innominate artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12107, 12291], ) }, "InnominateLymphNode": {"196821008": ("innominate lymph node", [7600, 8134])}, "InnominateVein": { "8887007": ( "Innominate vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "InobutaInterSpeciesHybridPigBreed": { "133182008": ("Inobuta (inter-species hybrid) pig breed", [7480]) }, "Inositol": {"72164009": ("Inositol", [218, 4032, 4033, 7180, 7186, 7469])}, "InotropicAgent": {"111139005": ("Inotropic agent", [10, 621, 622])}, "InsertionOfAtrialBaffle": {"1179121008": ("Insertion of atrial baffle", [12247])}, "InsertionOfCatheter": {"45211000": ("Insertion of catheter", [6050, 6083])}, "InsertionOfCoronaryArteryStent": { "36969009": ("Insertion of coronary artery stent", [3764]) }, "InsertionOfHipProsthesis": {"398010007": ("Insertion of hip prosthesis", [7301])}, "InsertionOfInteratrialBaffle": { "261537001": ("Insertion of interatrial baffle", [12247]) }, "InsertionOfProsthesisForBreast": { "302343007": ("Insertion of prosthesis for breast (procedure)", []) }, "InsolubleBerlinBlueStain": {"47030008": ("insoluble berlin blue stain", [8112])}, "Inspiration": {"14910006": ("inspiration", [3823, 9272, 12234])}, "InstrumentDevice": {"57134006": ("Instrument, device (physical object)", [])}, "InsufficientSample": {"281268007": ("Insufficient sample", [6063])}, "Insula": {"36169008": ("Insula", [7151, 7153, 7192, 8134, 9514])}, "InsularStructure": {"36169008": ("Insular structure (body structure)", [])}, "InsulinDependentMotherIDM": { "444161008": ("Insulin dependent mother (IDM)", [3756]) }, "InsulinPump": {"69805005": ("Insulin pump", [3777])}, "InsulinPumpDevice": {"69805005": ("Insulin pump, device (physical object)", [])}, "IntegratedRayTraceTriangulationAcquisitionLaserScanningDeviceWithConventionalFundusImaging": { "416567007": ( "Integrated ray-trace triangulation acquisition laser scanning device with conventional " "fundus imaging (physical object)", [], ) }, "IntensiveCare": {"309904001": ("Intensive Care", [7030])}, "IntensiveCareUnit": {"309904001": ("Intensive care unit (environment)", [])}, "IntentsNatureOfProcedureValues": { "363675004": ("Intents (nature of procedure values) (qualifier value)", []) }, "InteratrialSeptum": { "58095006": ("Interatrial septum", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "InteratrialSeptumStructure": { "58095006": ("Interatrial Septum Structure", [12284]) }, "InteratrialTranspositionOfVenousReturn": { "40250003": ("Interatrial transposition of venous return (procedure)", []) }, "Intercostal": {"1197041002": ("Intercostal", [5])}, "IntercostalArtery": { "281134007": ("Intercostal artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514]) }, "IntercostalLymphNode": {"64038003": ("intercostal lymph node", [7600, 8134])}, "InterferonGamma": {"420303002": ("Interferon gamma", [638, 642])}, "InteriliacLymphNode": {"279271008": ("interiliac lymph node", [7600, 8134])}, "InterlobarArteryOfKidney": { "274143007": ( "Interlobar Artery of Kidney", [3827, 7151, 7192, 8134, 9514, 12103, 12115], ) }, "InterlobarLymphNodeOfTheLung": { "127919002": ("interlobar lymph node of the lung", [7600, 8134]) }, "InterlobularArteryOfKidney": { "274329007": ( "Interlobular Artery of Kidney", [3827, 7151, 7192, 8134, 9514, 12103, 12115], ) }, "Intermediate": {"11896004": ("Intermediate", [2])}, "IntermediateArtery": {"244252004": ("Intermediate artery (body structure)", [])}, "IntermediateArteryRamus": { "244252004": ( "Intermediate Artery (Ramus)", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "IntermediateCommonIliacLymphNode": { "64556009": ("intermediate common iliac lymph node", [7600, 8134]) }, "IntermediateExternalIliacLymphNode": { "50193000": ("intermediate external iliac lymph node", [7600, 8134]) }, "Intermittent": {"7087005": ("Intermittent", [3770])}, "Internal": {"260521003": ("Internal", [2, 5, 6139])}, "InternalAuditoryCanal": { "361078006": ( "Internal Auditory Canal", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "InternalAuditoryMeatus": { "61671002": ("Internal Auditory Meatus", [1000, 1001, 1002, 8134]) }, "InternalCapsule": {"85637007": ("internal capsule", [7702, 7710, 8134])}, "InternalCapsuleStructureOfBrain": { "85637007": ("Internal capsule structure of brain (body structure)", []) }, "InternalCarotidArtery": { "86117002": ( "Internal carotid artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12104, 12105, ], ) }, "InternalCarotidArteryC5Segment": { "415637004": ( "Internal Carotid Artery C5 segment", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "InternalCarotidArteryC6Segment": { "698348000": ( "Internal Carotid Artery C6 segment", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "InternalCarotidArteryStructure": { "86117002": ("Internal carotid artery structure (body structure)", []) }, "InternalFixationUsingInternalFixatorSystem": { "257837004": ("Internal fixation using internal fixator system (procedure)", []) }, "InternalFixationUsingPlate": { "257835007": ("Internal fixation using plate", [7310]) }, "InternalFixationUsingScrew": { "257834006": ("Internal fixation using screw", [7310]) }, "InternalFixationUsingStaple": { "257833000": ("Internal fixation using staple", [7310]) }, "InternalIliacArtery": { "90024005": ( "Internal iliac artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "InternalIliacVein": { "40300007": ( "Internal iliac vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "InternalIntercostalMuscle": { "41313007": ( "Internal intercostal muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "InternalJugularVein": { "12123001": ( "Internal jugular vein", [ 4, 3010, 3607, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12108, ], ) }, "InternalJugularVeinStructure": { "12123001": ("Internal jugular vein structure (body structure)", []) }, "InternalLimitingMembraneOfRetina": { "280677004": ("Internal limiting membrane of retina (body structure)", []) }, "InternalMammaryArtery": { "69327007": ( "Internal mammary artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "InternalNose": {"53342003": ("Internal nose", [8134])}, "InternalNoseStructure": { "53342003": ("Internal nose structure (body structure)", []) }, "InternalRotation": {"12852001": ("Internal rotation", [92])}, "InternalRotationFunction": { "12852001": ("Internal rotation, function (observable entity)", []) }, "InternalSkeletalFixation": {"118470002": ("Internal skeletal fixation", [7310])}, "InternalStructureOfEyeball": { "79652003": ("Internal structure of eyeball (body structure)", []) }, "InternalThoracicArtery": { "69327007": ("Internal thoracic artery", [6102, 6109, 6117]) }, "InternationalStripedHorseHorseBreed": { "131986001": ("International Striped Horse horse breed", [7480]) }, "InterpectoralLymphNode": {"420800007": ("interpectoral lymph node", [7600, 8134])}, "InterruptedAorticArch": {"218728005": ("Interrupted Aortic Arch", [12248, 12249])}, "InterstitialTissue": {"85293002": ("Interstitial tissue", [6129, 8134])}, "IntertarsalJointStructure": { "27949001": ("Intertarsal joint structure (body structure)", []) }, "Interval": {"385673002": ("Interval", [12304])}, "InterventionalRadiologyService": { "708174004": ("Interventional Radiology Service", [7030]) }, "InterventricularSeptum": { "589001": ( "Interventricular septum", [6102, 6109, 6116, 7151, 7192, 8134, 9514, 12286, 12305], ) }, "InterventricularSeptumStructure": { "589001": ("Interventricular septum structure (body structure)", []) }, "IntervertebralDiscStructureOfEighthThoracicVertebra": { "9188009": ( "Intervertebral disc structure of eighth thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfEleventhThoracicVertebra": { "1537001": ( "Intervertebral disc structure of eleventh thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFifthCervicalVertebra": { "73959003": ( "Intervertebral disc structure of fifth cervical vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFifthLumbarVertebra": { "75782005": ( "Intervertebral disc structure of fifth lumbar vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFifthThoracicVertebra": { "72692000": ( "Intervertebral disc structure of fifth thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFirstLumbarVertebra": { "80064006": ( "Intervertebral disc structure of first lumbar vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFirstThoracicVertebra": { "40908007": ( "Intervertebral disc structure of first thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFourthCervicalVertebra": { "49400002": ( "Intervertebral disc structure of fourth cervical vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFourthLumbarVertebra": { "84020006": ( "Intervertebral disc structure of fourth lumbar vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfFourthThoracicVertebra": { "82965004": ( "Intervertebral disc structure of fourth thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfNinthThoracicVertebra": { "113209001": ( "Intervertebral disc structure of ninth thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfSecondLumbarVertebra": { "67459009": ( "Intervertebral disc structure of second lumbar vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfSecondThoracicVertebra": { "6004007": ( "Intervertebral disc structure of second thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfSeventhCervicalVertebra": { "37414007": ( "Intervertebral disc structure of seventh cervical vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfSeventhThoracicVertebra": { "28693002": ( "Intervertebral disc structure of seventh thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfSixthCervicalVertebra": { "75095006": ( "Intervertebral disc structure of sixth cervical vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfSixthThoracicVertebra": { "74401007": ( "Intervertebral disc structure of sixth thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfTenthThoracicVertebra": { "34959001": ( "Intervertebral disc structure of tenth thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfThirdCervicalVertebra": { "58820006": ( "Intervertebral disc structure of third cervical vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfThirdLumbarVertebra": { "62551000": ( "Intervertebral disc structure of third lumbar vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfThirdThoracicVertebra": { "2620004": ( "Intervertebral disc structure of third thoracic vertebra (body structure)", [], ) }, "IntervertebralDiscStructureOfTwelfthThoracicVertebra": { "76206002": ( "Intervertebral disc structure of twelfth thoracic vertebra (body structure)", [], ) }, "IntestinalLymphNode": {"36251007": ("intestinal lymph node", [7600, 8134])}, "Intima": {"87483006": ("Intima", [7151, 7156, 7192, 8134, 9514])}, "IntraAbdominopelvic": { "818987002": ("Intra-abdominopelvic", [4, 4040, 7151, 7192, 9514]) }, "IntraAorticBalloonPump": {"129113006": ("Intra-Aortic Balloon Pump", [3553])}, "IntraAorticBalloonPumpDevice": { "129113006": ("Intra-aortic balloon pump, device (physical object)", []) }, "IntraAorticBalloonPumpIABP": { "129113006": ("Intra-Aortic Balloon Pump (IABP)", [3429]) }, "IntraArterialInfusionOfThrombolyticAgent": { "69245005": ("Intra-arterial infusion of thrombolytic agent", [9]) }, "IntraArterialRoute": {"58100008": ("Intra-arterial route", [11])}, "IntraArterialWaveform": { "128446002": ("Intra-arterial waveform (observable entity)", []) }, "IntraArticular": { "131183008": ("Intra-articular", [2, 4, 7151, 7192, 8134, 9514]) }, "IntraArticularRoute": {"12130007": ("Intra-articular route", [11])}, "IntraAtrialPacing": {"69158002": ("Intra-atrial pacing (procedure)", [])}, "IntraPelvic": {"816989007": ("Intra-pelvic", [4, 4040, 7151, 7192, 9514])}, "IntraThoracic": {"43799004": ("Intra-thoracic", [4, 4040, 7151, 7192, 9514])}, "IntracardiacEchocardiography": { "252421008": ("Intracardiac echocardiography", [3405, 3428, 12001]) }, "IntracardiacRoute": {"372460008": ("Intracardiac route", [11])}, "IntracavitaryBrachytherapy": { "384692006": ("Intracavitary brachytherapy (procedure)", []) }, "IntracavitaryEchocardiography": { "252421008": ("Intracavitary echocardiography (procedure)", []) }, "IntracoronaryDopplerGuideWire": { "371788001": ("Intracoronary Doppler guide wire", [3411, 3429]) }, "IntracoronaryPressureGuideWire": { "371789009": ("Intracoronary pressure guide wire", [3411, 3429]) }, "IntracoronaryRoute": {"372463005": ("Intracoronary route", [11])}, "IntracorpusCavernosumRoute": { "1259221004": ("Intracorpus cavernosum route", [11]) }, "IntracorpusCavernosumRoute_Inactive": { "445769006": ("Intracorpus cavernosum route (qualifier value)", []) }, "Intracranial": {"1101003": ("Intracranial", [4, 7151, 7192, 8134, 9514])}, "IntracranialHemorrhage": {"1386000": ("Intracranial hemorrhage (disorder)", [])}, "IntracranialStructure": {"128319008": ("Intracranial structure", [7140])}, "IntracutaneousRoute": {"372464004": ("Intracutaneous route", [11])}, "IntracysticPapillaryAdenoma": { "47488001": ("Intracystic papillary adenoma (morphologic abnormality)", []) }, "IntracysticPapilloma": {"47488001": ("Intracystic papilloma", [6030, 6031])}, "IntradermalRoute": {"372464004": ("Intradermal route (qualifier value)", [])}, "IntraductalCarcinomaMicroPapillary": { "128696009": ("Intraductal carcinoma micro-papillary", [6030, 6033]) }, "IntraductalCarcinomaNoninfiltratingNoInternationalClassificationOfDiseasesForOncologySubtype": { "86616005": ( "Intraductal carcinoma, noninfiltrating, no International Classification of Diseases " "for Oncology subtype (morphologic abnormality)", [], ) }, "IntraductalHyperplasia": { "67617000": ("Intraductal hyperplasia (morphologic abnormality)", []) }, "IntraductalMicropapillaryCarcinoma": { "128696009": ( "Intraductal micropapillary carcinoma (morphologic abnormality)", [], ) }, "IntraductalPapilloma": {"5244003": ("Intraductal papilloma", [6030, 6031])}, "IntraglandularParotidLymphNode": { "143824007": ("intraglandular parotid lymph node", [7600, 8134]) }, "Intraluminal": {"264045001": ("Intraluminal", [5])}, "IntraluminalFluid": {"442170005": ("Intraluminal fluid", [6201])}, "IntraluminalRoute": {"37737002": ("Intraluminal route", [11])}, "IntramammaryLymphNode": { "443808008": ( "Intramammary lymph node", [6014, 6015, 6016, 6030, 6031, 6054, 6056, 7600, 8134], ) }, "IntramedullaryRoute": {"60213007": ("Intramedullary route", [11])}, "IntramuralHematoma": {"54493002": ("Intramural hematoma", [3492])}, "IntramuscularRoute": {"78421000": ("Intramuscular route", [11, 613, 614])}, "Intraoperative": {"277671009": ("Intraoperative", [31, 631, 632])}, "IntraoperativeEchocardiography": { "429884006": ("Intraoperative echocardiography", [12001]) }, "IntraperitonealRoute": {"38239002": ("Intraperitoneal route", [11, 613])}, "IntrapulmonaryArteriovenousFistula": { "253639004": ("Intrapulmonary arteriovenous fistula (disorder)", []) }, "IntrapulmonaryLymphNode": { "196662004": ("intrapulmonary lymph node", [7600, 8134]) }, "IntrathecalRoute": {"72607000": ("Intrathecal route", [11])}, "IntratumorRoute": {"447122006": ("Intratumor route", [11])}, "IntrauterineCordocentesis": {"6708002": ("Intrauterine cordocentesis", [9])}, "IntrauterineTransfusion": {"45460008": ("Intrauterine transfusion", [9])}, "IntravascularEchocardiography": { "252420009": ("Intravascular echocardiography", [12001]) }, "IntravascularOpticalCoherenceTomographyDevice": { "445282004": ("Intravascular Optical Coherence Tomography Device", [3411, 3429]) }, "IntravascularOpticalCoherenceTomographyImagingDevice": { "445282004": ( "Intravascular optical coherence tomography imaging device (physical object)", [], ) }, "IntravascularUltrasound": { "241466007": ("Intravascular ultrasound", [3405, 3428]) }, "IntravascularUltrasoundDevice": { "371795005": ("Intravascular ultrasound device (physical object)", []) }, "IntravascularUltrasoundIVUSDevice": { "371795005": ("Intravascular Ultrasound (IVUS) Device", [3411, 3429]) }, "IntravascularUltrasoundScan": { "241466007": ("Intravascular ultrasound scan (procedure)", []) }, "IntravenousRoute": {"47625008": ("Intravenous route", [11, 613, 614])}, "IntraventricularConductionDefect": { "4554005": ("Intraventricular conduction defect (disorder)", []) }, "IntraventricularConductionDisturbance": { "4554005": ("Intraventricular conduction disturbance", [3230]) }, "IntraventricularPacing": { "344994008": ("Intraventricular pacing (procedure)", []) }, "IntraventricularRouteCardiac": { "420287000": ("Intraventricular route - cardiac", [11]) }, "IntubationOfRespiratoryTract": { "447996002": ("Intubation of respiratory tract", [617, 618]) }, "InvasiveCribriformCarcinoma": { "30156004": ("Invasive cribriform carcinoma", [6030, 6033]) }, "InvasiveLobularCarcinoma": { "89740008": ("Invasive lobular carcinoma", [6030, 6033]) }, "InverseTrendelenburg": {"26527006": ("inverse Trendelenburg", [20])}, "InverseTrendelenburgPosition": { "26527006": ("Inverse Trendelenburg position (finding)", []) }, "InvertedDiverticulum": {"441901008": ("Inverted diverticulum", [6201])}, "Inward": {"255460003": ("Inward", [4214])}, "IodamideMeglumine": {"12801003": ("Iodamide meglumine", [12, 3850])}, "IodinatedI125Albumin": {"72015003": ("Iodinated I^125^ albumin", [25])}, "IodinatedI125HumanSerumAlbumin": { "64488003": ("Iodinated I^125^ human serum albumin", [25]) }, "IodinatedI125Liothyronine": { "33785000": ("Iodinated I^125^ liothyronine (substance)", []) }, "IodinatedI125Povidone": {"69839009": ("Iodinated I^125^ povidone", [25])}, "IodinatedI125SodiumIodine": {"70154008": ("Iodinated I^125^ sodium iodine", [25])}, "IodinatedI131AggregatedAlbumin": { "55814006": ("Iodinated I^131^ aggregated albumin", [25]) }, "IodinatedI131Albumin": {"39200002": ("Iodinated I^131^ albumin", [25])}, "IodinatedI131GammaGlobulin": { "52408003": ("Iodinated I^131^ gamma globulin", [25]) }, "Iodine": {"44588005": ("Iodine", [13, 300])}, "Iodine123154Iodophenyl3RSMethylpentadecanoicAcid": { "447134003": ( "Iodine^123 15-(4-Iodophenyl)-3(R,S)-Methylpentadecanoic Acid", [25], ) }, "Iodine1233IodobenzylguanidineMIBG": { "395787009": ("Iodine^123 3-Iodobenzylguanidine MIBG", [25]) }, "Iodine1313IodobenzylguanidineMIBG": { "395789007": ("Iodine^131 3-Iodobenzylguanidine MIBG", [25]) }, "Iodine131Polyvinylpyrrolidone": { "35884005": ("Iodine^131^ polyvinylpyrrolidone", [25]) }, "Iodipamide": {"73212002": ("Iodipamide", [12, 3850])}, "Iodixanol": {"353962003": ("Iodixanol", [12, 3850])}, "IodizedOil": {"89595000": ("Iodized oil", [12, 3850])}, "IodoalphionicAcid": {"86584005": ("Iodoalphionic acid", [12, 3850])}, "IodocholesterolI131": {"68967007": ("Iodocholesterol I^131^", [25])}, "IodohippurateI123Sodium": {"33785000": ("Iodohippurate I^123^ sodium", [25])}, "IodohippurateI125Sodium": {"36900006": ("Iodohippurate I^125^ sodium", [25])}, "IodohippurateI131Sodium": {"33271006": ("Iodohippurate I^131^ sodium", [25])}, "Iodophthalein": {"74554008": ("Iodophthalein", [12, 3850])}, "Iodopyracet": {"40710000": ("Iodopyracet", [12, 3850])}, "IofetamineI123Hydrochloride": { "78481003": ("Iofetamine I^123^ hydrochloride", [25]) }, "Ioflupane123I": {"429296007": ("Ioflupane[123I] (product)", [])}, "IoflupaneI123": {"429296007": ("Ioflupane I^123^", [25])}, "Iohexol": {"109218004": ("Iohexol", [12, 3850])}, "IomudHorseBreed": {"133047009": ("Iomud horse breed", [7480])}, "Iopamidol": {"109219007": ("Iopamidol", [12, 3850])}, "IopanoicAcid": {"76155001": ("Iopanoic acid", [12, 3850])}, "Iophendylate": {"28121005": ("Iophendylate", [12, 3850])}, "IophenoxicAcid": {"23053002": ("Iophenoxic acid", [12, 3850])}, "Iopromide": {"353903006": ("Iopromide", [12, 3850])}, "Iothalamate": {"353912008": ("Iothalamate", [12, 3850])}, "IothalamateSodiumI125": {"55673009": ("Iothalamate sodium I^125^", [25])}, "Ioversol": {"109222009": ("Ioversol", [12, 3850])}, "Ioxaglate": {"412228003": ("Ioxaglate", [12, 3850])}, "IoxaglateMeglumine": {"412228003": ("Ioxaglate meglumine (substance)", [])}, "Ioxilan": {"409484007": ("Ioxilan", [12, 3850])}, "Ipodate": {"87445005": ("Ipodate", [12, 3850])}, "Ipsilateral": {"255208005": ("Ipsilateral", [246])}, "IranianZebuCattleBreed": {"133686007": ("Iranian Zebu cattle breed", [7480])}, "IraqiCattleBreed": {"133808008": ("Iraqi cattle breed (organism)", [])}, "IraqiXZebuCattleBreed": {"133808008": ("Iraqi X zebu cattle breed", [7480])}, "Iris": {"41296002": ("Iris", [4029, 4209, 4211, 8134])}, "IrisStructure": {"41296002": ("Iris structure (body structure)", [])}, "IrishCobHorseBreed": {"131987005": ("Irish Cob horse breed", [7480])}, "IrishDraftHorseBreed": {"131908002": ("Irish Draft horse breed", [7480])}, "IrishGoatBreed": {"131663006": ("Irish goat breed", [7480])}, "IrishHunterHorseBreed": {"131909005": ("Irish Hunter horse breed", [7480])}, "IrishMoiledCattleBreed": {"133236005": ("Irish Moiled cattle breed", [7480])}, "IrishRedAndWhiteSetterDogBreed": { "132503004": ("Irish Red and White Setter dog breed", [7480]) }, "IrishSetter": {"11477006": ("Irish setter (organism)", [])}, "IrishSetterDogBreed": {"11477006": ("Irish setter dog breed", [7480])}, "IrishTerrier": {"75494002": ("Irish terrier", [7480])}, "IrishWaterSpaniel": {"34870009": ("Irish water spaniel (organism)", [])}, "IrishWaterSpanielDogBreed": { "34870009": ("Irish water spaniel dog breed", [7480]) }, "IrishWolfhound": {"52952001": ("Irish wolfhound", [7480])}, "Iron": {"3829006": ("Iron", [13, 300])}, "IronFe59LabeledDextran": {"60459006": ("Iron Fe^59^ labeled dextran", [25])}, "IrradiatedVolume": {"228790005": ("Irradiated Volume", [9534])}, "Irregular": { "49608001": ( "Irregular", [3715, 6004, 6005, 6119, 6335, 6339, 6340, 6341, 6342], ) }, "IrregularBreathing": {"248585001": ("irregular breathing", [3416])}, "Irrigation": {"67889009": ("Irrigation", [9])}, "IrrigationFollowingInsertionOfCatheter": { "8592001": ("Irrigation following insertion of catheter (procedure)", []) }, "IschemicHeartDisease": {"414545008": ("ischemic heart disease", [3727])}, "IscherwoodProjection": { "399025004": ("Ischerwood projection (qualifier value)", []) }, "Ischium": {"85710004": ("Ischium", [1000, 1001, 1005, 8134])}, "Isherwood": {"399025004": ("Isherwood", [4012])}, "IskarCattleBreed": {"131480003": ("Iskar cattle breed", [7480])}, "Isoflurane": {"387368002": ("Isoflurane", [623, 624])}, "IsolationRoom": {"409688003": ("Isolation room", [603])}, "IsraeliHolsteinCattleBreed": { "133237001": ("Israeli Holstein cattle breed", [7480]) }, "IsraeliHorseBreed": {"132733008": ("Israeli horse breed", [7480])}, "IsraeliRedCattleBreed": {"133583008": ("Israeli Red cattle breed", [7480])}, "IstobenCattleBreed": {"133238006": ("Istoben cattle breed", [7480])}, "IstrianCattleBreed": {"131481004": ("Istrian cattle breed", [7480])}, "IstrianPramenkaSheepBreed": { "131776007": ("Istrian Pramenka sheep breed", [7480]) }, "ItalianBrownCattleBreed": {"133441000": ("Italian Brown cattle breed", [7480])}, "ItalianGreyhound": {"30347000": ("Italian greyhound", [7480])}, "ItalianHeavyDraftHorseBreed": { "131911001": ("Italian Heavy Draft horse breed", [7480]) }, "ItalianLandracePig": {"71923001": ("Italian landrace pig (organism)", [])}, "ItalianLandracePigBreed": {"71923001": ("Italian landrace pig breed", [7480])}, "ItalianRedPiedCattleBreed": { "133442007": ("Italian Red Pied cattle breed", [7480]) }, "Itching": {"418363000": ("Itching", [60, 4406, 9300])}, "ItchingOfSkin": {"418363000": ("Itching of skin (finding)", [])}, "JWire": {"129463006": ("J Wire", [6040, 6401, 7151, 7193])}, "JWireDevice": {"129463006": ("J wire, device (physical object)", [])}, "JabeHorseBreed": {"131912008": ("Jabe horse breed", [7480])}, "JackRusselTerrier": {"6103004": ("Jack Russel terrier", [7480])}, "JackRussellTerrierDogBreed": { "6103004": ("Jack Russell terrier dog breed (organism)", []) }, "JacobSheepBreed": {"131777003": ("Jacob sheep breed", [7480])}, "JagdterrierDogBreed": {"132504005": ("Jagdterrier dog breed", [7480])}, "JamaicaBlackCattleBreed": { "133732006": ("Jamaica Black cattle breed (organism)", []) }, "JamaicaBlackXZebuCattleBreed": { "133732006": ("Jamaica Black X zebu cattle breed", [7480]) }, "JamaicaBrahmanCattleBreed": { "133665007": ("Jamaica Brahman cattle breed", [7480]) }, "JamaicaHopeCattleBreed": { "133733001": ("Jamaica Hope cattle breed (organism)", []) }, "JamaicaHopeXZebuCattleBreed": { "133733001": ("Jamaica Hope X zebu cattle breed", [7480]) }, "JamaicaRedCattleBreed": {"133734007": ("Jamaica Red cattle breed (organism)", [])}, "JamaicaRedXZebuCattleBreed": { "133734007": ("Jamaica Red X zebu cattle breed", [7480]) }, "JanusGreenBStain": {"68263003": ("janus green B stain", [8112])}, "JapaneseBlackCattleBreed": {"133443002": ("Japanese Black cattle breed", [7480])}, "JapaneseBobtailCat": {"26382003": ("Japanese bobtail cat", [7480])}, "JapaneseBrownCattleBreed": {"133444008": ("Japanese Brown cattle breed", [7480])}, "JapaneseChinDog": {"53922000": ("Japanese chin dog", [7480])}, "JapanesePointerDogBreed": {"132530009": ("Japanese Pointer dog breed", [7480])}, "JapanesePollCattleBreed": {"133445009": ("Japanese Poll cattle breed", [7480])}, "JapaneseRetrieverDogBreed": { "132398003": ("Japanese Retriever dog breed", [7480]) }, "JapaneseShorthornCattleBreed": { "133452006": ("Japanese Shorthorn cattle breed", [7480]) }, "JapaneseSpaniel": {"23159000": ("Japanese spaniel", [7480])}, "JapaneseSpitzDogBreed": {"132429002": ("Japanese Spitz dog breed", [7480])}, "JarmelistaCattleBreed": {"133453001": ("Jarmelista cattle breed", [7480])}, "JaulanCattleBreed": {"133239003": ("Jaulan cattle breed", [7480])}, "Jaundice": {"18165001": ("Jaundice", [12325])}, "JavaHorseBreed": {"131913003": ("Java horse breed", [7480])}, "JavaneseCat": {"10701001": ("Javanese cat", [7480])}, "JavaneseOngoleCattleBreed": { "131482006": ("Javanese Ongole cattle breed", [7480]) }, "JavaneseZebuCattleBreed": {"131483001": ("Javanese Zebu cattle breed", [7480])}, "JawRegion": { "661005": ( "Jaw region", [4, 4009, 4016, 4028, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "JawRegionStructure": {"661005": ("Jaw region structure (body structure)", [])}, "JejunalStructure": {"21306003": ("Jejunal structure (body structure)", [])}, "JejunostomyTube": { "126065006": ("Jejunostomy tube", [6102, 6138, 6202, 6203, 6404, 7151, 7193]) }, "JejunostomyTubeDevice": { "126065006": ("Jejunostomy tube, device (physical object)", []) }, "Jejunum": { "21306003": ("Jejunum", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "JellicutCattleBreed": {"133666008": ("Jellicut cattle breed", [7480])}, "JemJemZebuCattleBreed": {"132771000": ("Jem-Jem Zebu cattle breed", [7480])}, "JennerGiemsaStain": {"255801008": ("Jenner-Giemsa stain", [8112])}, "JenubiCattleBreed": {"133674009": ("Jenubi cattle breed", [7480])}, "JerdiCattleBreed": {"133809000": ("Jerdi cattle breed (organism)", [])}, "JerdiXZebuCattleBreed": {"133809000": ("Jerdi X zebu cattle breed", [7480])}, "JerseyCattleBreed": {"51937006": ("Jersey cattle breed (organism)", [])}, "JerseyCowBreed": {"51937006": ("Jersey cow breed", [7480])}, "JersindCattleBreed": {"133810005": ("Jersind cattle breed (organism)", [])}, "JersindXZebuCattleBreed": {"133810005": ("Jersind X zebu cattle breed", [7480])}, "Jewelry": {"80919006": ("Jewelry", [6102, 6138, 6202, 6203, 6404, 7151, 7193])}, "JezerskosolcavskaSheepBreed": { "131778008": ("Jezerskosolcavska sheep breed", [7480]) }, "JianchangHorseBreed": {"132739007": ("Jianchang horse breed", [7480])}, "JianliPigBreed": {"132187007": ("Jianli pig breed", [7480])}, "JiaoxiPigBreed": {"132321000": ("Jiaoxi pig breed", [7480])}, "JiaxingBlackPigBreed": {"132318002": ("Jiaxing Black pig breed", [7480])}, "JidduCattleBreed": {"133675005": ("Jiddu cattle breed", [7480])}, "JielinHorseBreed": {"132740009": ("Jielin horse breed", [7480])}, "JijjigaZebuCattleBreed": {"133676006": ("Jijjiga Zebu cattle breed", [7480])}, "JindoDogBreed": {"132431006": ("Jindo dog breed", [7480])}, "JinhongHorseBreed": {"131916006": ("Jinhong horse breed", [7480])}, "JinhuaDongyangPigBreed": {"132293009": ("Jinhua, Dongyang pig breed", [7480])}, "JinhuaPigBreed": {"132244004": ("Jinhua pig breed", [7480])}, "JinhuaYongkangPigBreed": {"132294003": ("Jinhua, Yongkang pig breed", [7480])}, "JiningGrayGoatBreed": {"131665004": ("Jining Gray goat breed", [7480])}, "JinnanCattleBreed": {"131484007": ("Jinnan cattle breed", [7480])}, "JinzhouHorseBreed": {"131917002": ("Jinzhou horse breed", [7480])}, "Joint": {"39352004": ("Joint", [4, 4040, 7151, 7192, 8134, 9514])}, "JointStructure": {"39352004": ("Joint structure (body structure)", [])}, "JonicaGoatBreed": {"131697004": ("Jonica goat breed", [7480])}, "JotkoCattleBreed": {"133811009": ("Jotko cattle breed (organism)", [])}, "JotkoXZebuCattleBreed": {"133811009": ("Jotko X zebu cattle breed", [7480])}, "Judd": {"399201002": ("Judd", [4012])}, "JuddProjection": {"399201002": ("Judd projection (qualifier value)", [])}, "JudetProjection": {"260496000": ("Judet projection", [4012])}, "JugularLymphNode": {"58130000": ("jugular lymph node", [7600, 8134])}, "JutlandHorseBreed": {"133048004": ("Jutland horse breed", [7480])}, "JuvenileCarcinomaOfTheBreast": { "41919003": ("Juvenile carcinoma of the breast (morphologic abnormality)", []) }, "JuvenileFibroadenoma": {"46212000": ("Juvenile fibroadenoma", [6030, 6031])}, "JuxtaintestinalLymphNode": { "279609001": ("juxtaintestinal lymph node", [7600, 8134]) }, "JuxtaposedAppendage": {"128563000": ("Juxtaposed appendage", [3608, 3630])}, "JuxtaposedAtrialAppendage": { "128563000": ( "Juxtaposed atrial appendage", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "JämthundDogBreed": {"132430007": ("Jämthund dog breed", [7480])}, "KM1PigBreed": {"132117004": ("KM-1 pig breed", [7480])}, "KabardaHorseBreed": {"132758003": ("Kabarda horse breed", [7480])}, "KabotaCattleBreed": {"133677002": ("Kabota cattle breed", [7480])}, "KabyleCattleBreed": {"133454007": ("Kabyle cattle breed", [7480])}, "KachchaSiriCattleBreed": {"133678007": ("Kachcha Siri cattle breed", [7480])}, "KachhiSheepBreed": {"131779000": ("Kachhi sheep breed", [7480])}, "KaghaniGoatBreed": {"131662001": ("Kaghani goat breed", [7480])}, "KaiDogBreed": {"132399006": ("Kai Dog breed", [7480])}, "KaiKenDogBreed": {"132390005": ("Kai Ken dog breed", [7480])}, "KajliSheepBreed": {"131786008": ("Kajli sheep breed", [7480])}, "KakhetianPigBreed": {"132768008": ("Kakhetian pig breed", [7480])}, "KalakheriCattleBreed": {"133679004": ("Kalakheri cattle breed", [7480])}, "KalmykCattleBreed": {"131485008": ("Kalmyk cattle breed", [7480])}, "KalmykHorseBreed": {"132759006": ("Kalmyk horse breed", [7480])}, "KamanPigBreed": {"133177001": ("Kaman pig breed", [7480])}, "KamdhinoCattleBreed": {"133680001": ("Kamdhino cattle breed", [7480])}, "KameroenSheepBreed": {"132686002": ("Kameroen sheep breed", [7480])}, "KamoriGoatBreed": {"131668002": ("Kamori goat breed", [7480])}, "KandahariCattleBreed": {"133681002": ("Kandahari cattle breed", [7480])}, "Kandel": {"399152006": ("Kandel", [4012])}, "KandelProjection": {"399152006": ("Kandel projection (qualifier value)", [])}, "KanemCattleBreed": {"133812002": ("Kanem cattle breed (organism)", [])}, "KanemXZebuCattleBreed": {"133812002": ("Kanem X zebu cattle breed", [7480])}, "KangalDogBreed": {"132402007": ("Kangal Dog breed", [7480])}, "KangarooIslandPigBreed": {"133183003": ("Kangaroo Island pig breed", [7480])}, "KangayamCattleBreed": {"133610008": ("Kangayam cattle breed", [7480])}, "KaninganCattleBreed": {"133682009": ("Kaningan cattle breed", [7480])}, "KankrejCattleBreed": {"133611007": ("Kankrej cattle breed", [7480])}, "KaokoveldCattleBreed": {"131486009": ("Kaokoveld cattle breed", [7480])}, "KappiliyanCattleBreed": {"133689000": ("Kappiliyan cattle breed", [7480])}, "KapsikiCattleBreed": {"133455008": ("Kapsiki cattle breed", [7480])}, "KarabairHorseBreed": {"133049007": ("Karabair horse breed", [7480])}, "KarabakhHorseBreed": {"133050007": ("Karabakh horse breed", [7480])}, "KarachaiHorseBreed": {"131920005": ("Karachai horse breed", [7480])}, "KarakacanHorseBreed": {"131921009": ("Karakacan horse breed", [7480])}, "KarakulSheep": {"64591001": ("Karakul sheep (organism)", [])}, "KarakulSheepBreed": {"64591001": ("Karakul sheep breed", [7480])}, "KaramajongCattleBreed": {"133690009": ("Karamajong cattle breed", [7480])}, "KaranFriesCattleBreed": {"133735008": ("Karan Fries cattle breed (organism)", [])}, "KaranFriesXZebuCattleBreed": { "133735008": ("Karan Fries X zebu cattle breed", [7480]) }, "KaranSwissCattleBreed": {"133736009": ("Karan Swiss cattle breed (organism)", [])}, "KaranSwissXZebuCattleBreed": { "133736009": ("Karan Swiss X zebu cattle breed", [7480]) }, "KarelianBearDog": {"84660008": ("Karelian bear dog", [7480])}, "KareloFinnishLaikaDogBreed": { "132432004": ("Karelo-Finnish Laika dog breed", [7480]) }, "Kasabach": {"399280003": ("Kasabach", [4012])}, "KasabachProjection": {"399280003": ("Kasabach projection (qualifier value)", [])}, "KatahdinSheepBreed": {"131743008": ("Katahdin sheep breed", [7480])}, "KateriniCattleBreed": {"133456009": ("Katerini cattle breed", [7480])}, "KathiawariHorseBreed": {"131922002": ("Kathiawari horse breed", [7480])}, "KazakhCattleBreed": {"133240001": ("Kazakh cattle breed", [7480])}, "KazakhHorseBreed": {"133051006": ("Kazakh horse breed", [7480])}, "KazakhWhiteheadCattleBreed": { "131487000": ("Kazakh Whitehead cattle breed", [7480]) }, "KeErQinHorseBreed": {"131923007": ("Ke-Er-Qin horse breed", [7480])}, "KedahKelantanCattleBreed": {"131488005": ("Kedah-Kelantan cattle breed", [7480])}, "Keeshond": {"81607005": ("Keeshond", [7480])}, "KelePigBreed": {"132238003": ("Kele pig breed", [7480])}, "KemerovoPigBreed": {"132116008": ("Kemerovo pig breed", [7480])}, "KempHarper": {"399227002": ("Kemp Harper", [4012])}, "KempHarperProjection": { "399227002": ("Kemp Harper projection (qualifier value)", []) }, "KenacidBlueRStain": {"29342009": ("kenacid blue R stain", [8112])}, "KenanaCattleBreed": {"133691008": ("Kenana cattle breed", [7480])}, "KenkathaCattleBreed": {"133612000": ("Kenkatha cattle breed", [7480])}, "KenranCattleBreed": {"133457000": ("Kenran cattle breed", [7480])}, "KentuckyRedBerkshirePig": { "33551003": ("Kentucky red berkshire pig (organism)", []) }, "KentuckyRedBerkshirePigBreed": { "33551003": ("Kentucky red berkshire pig breed", [7480]) }, "KenyaBoranCattleBreed": {"133692001": ("Kenya Boran cattle breed", [7480])}, "KenyaZebuCattleBreed": {"133693006": ("Kenya Zebu cattle breed", [7480])}, "Keratolytic": {"280906005": ("Keratolytic (product)", [])}, "KeratolyticAgent": {"280906005": ("Keratolytic agent", [4410])}, "Keratoscope": {"397522002": ("Keratoscope", [4202])}, "KerryBlueTerrier": {"32591006": ("Kerry blue terrier", [7480])}, "KerryCattleBreed": {"133241002": ("Kerry cattle breed", [7480])}, "KerryHillSheep": {"11967001": ("Kerry Hill sheep (organism)", [])}, "KerryHillSheepBreed": {"11967001": ("Kerry Hill sheep breed", [7480])}, "Ketamine": {"373464007": ("Ketamine", [623, 625])}, "KetekuCattleBreed": {"133813007": ("Keteku cattle breed (organism)", [])}, "KetekuXZebuCattleBreed": {"133813007": ("Keteku X zebu cattle breed", [7480])}, "KhamalaCattleBreed": {"133694000": ("Khamala cattle breed", [7480])}, "KharkovPigBreed": {"132074004": ("Kharkov pig breed", [7480])}, "KherigarhCattleBreed": {"133613005": ("Kherigarh cattle breed", [7480])}, "KhevsurianCattleBreed": {"133458005": ("Khevsurian cattle breed", [7480])}, "KhillariCattleBreed": {"133614004": ("Khillari cattle breed", [7480])}, "KholmogoryCattleBreed": {"133242009": ("Kholmogory cattle breed", [7480])}, "KhorsanCattleBreed": {"133687003": ("Khorsan cattle breed", [7480])}, "KhurasaniZebuCattleBreed": {"133695004": ("Khurasani zebu cattle breed", [7480])}, "Kidney": { "64033007": ( "Kidney", [ 645, 1000, 1001, 1005, 4030, 4040, 6202, 6204, 7151, 7154, 7192, 8134, 9514, 10044, 10060, 12020, 12321, ], ) }, "KidneyStructure": {"64033007": ("Kidney structure (body structure)", [])}, "KigerMustangHorseBreed": {"133062006": ("Kiger Mustang horse breed", [7480])}, "KigeziCattleBreed": {"131489002": ("Kigezi cattle breed", [7480])}, "KikoGoatBreed": {"131670006": ("Kiko goat breed", [7480])}, "KilaraCattleBreed": {"133696003": ("Kilara cattle breed", [7480])}, "KilisCattleBreed": {"133459002": ("Kilis cattle breed", [7480])}, "KinderGoatBreed": {"131671005": ("Kinder goat breed", [7480])}, "KingShepherdDogBreed": {"132433009": ("King Shepherd dog breed", [7480])}, "KinniyaCattleBreed": {"133697007": ("Kinniya cattle breed", [7480])}, "KirdiPonyHorseBreed": {"133053009": ("Kirdi Pony horse breed", [7480])}, "KirgizHorseBreed": {"131924001": ("Kirgiz horse breed", [7480])}, "KirhizDogBreed": {"132435002": ("Kirhiz dog breed", [7480])}, "KisantuCattleBreed": {"131490006": ("Kisantu cattle breed", [7480])}, "KisberFelverHorseBreed": {"133043008": ("Kisber Felver horse breed", [7480])}, "KishuDogBreed": {"132434003": ("Kishu dog breed", [7480])}, "KisoHorseBreed": {"133054003": ("Kiso horse breed", [7480])}, "Kite": {"425030002": ("Kite", [4012])}, "KiteProjection": {"425030002": ("Kite projection (qualifier value)", [])}, "KladrubyHorseBreed": {"133055002": ("Kladruby horse breed", [7480])}, "KleenLeenBlackPig": {"36111002": ("Kleen leen black pig (organism)", [])}, "KleenLeenBlackPigBreed": {"36111002": ("Kleen leen black pig breed", [7480])}, "KleenLeenPig": {"69602006": ("Kleen leen pig (organism)", [])}, "KleenLeenPigBreed": {"69602006": ("Kleen leen pig breed", [7480])}, "KleenLeenRedPig": {"84232003": ("Kleen leen red pig (organism)", [])}, "KleenLeenRedPigBreed": {"84232003": ("Kleen leen red pig breed", [7480])}, "KleenLeenWhitePig": {"57613003": ("Kleen leen white pig (organism)", [])}, "KleenLeenWhitePigBreed": {"57613003": ("Kleen leen white pig breed", [7480])}, "KnabstrupHorseBreed": {"133056001": ("Knabstrup horse breed", [7480])}, "Knee": { "72696002": ( "Knee", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "KneeChest": {"23242002": ("knee-chest", [20])}, "KneeChestPosition": {"23242002": ("Knee-chest position (finding)", [])}, "KneeJoint": {"49076000": ("Knee joint", [1000, 1001, 1006, 8134])}, "KneeJointStructure": {"49076000": ("Knee joint structure (body structure)", [])}, "KneeRegionStructure": {"72696002": ("Knee region structure (body structure)", [])}, "Kneeling": {"55864004": ("kneeling", [20])}, "KnownAbsent": {"410516002": ("Known absent", [3770])}, "KochiCattleBreed": {"133460007": ("Kochi cattle breed", [7480])}, "KolbroekPigBreed": {"133189004": ("Kolbroek pig breed", [7480])}, "KolubaraCattleBreed": {"131491005": ("Kolubara cattle breed", [7480])}, "KomondorDog": {"46239008": ("Komondor dog", [7480])}, "KonariCattleBreed": {"133698002": ("Konari cattle breed", [7480])}, "KoninkTarpanHorseXDomesticHorseBreed": { "132991003": ("Konink tarpan horse X domestic horse breed", [7480]) }, "KooikerhondjeDogBreed": {"132495004": ("Kooikerhondje dog breed (organism)", [])}, "KookaSheepBreed": {"131724008": ("Kooka sheep breed", [7480])}, "KoratCat": {"27125003": ("Korat cat", [7480])}, "KoreanBlackCattleBreed": {"133352005": ("Korean Black cattle breed", [7480])}, "KoreanImprovedPigBreed": {"132141001": ("Korean Improved pig breed", [7480])}, "KoreanNativeCattleBreed": {"133461006": ("Korean Native cattle breed", [7480])}, "KoreanNativePigBreed": {"132140000": ("Korean Native pig breed", [7480])}, "KoronadalPigBreed": {"133179003": ("Koronadal pig breed", [7480])}, "KostromaCattleBreed": {"133468000": ("Kostroma cattle breed", [7480])}, "Kovacs": {"399318001": ("Kovacs", [4012])}, "KovacsProjection": {"399318001": ("Kovacs projection (qualifier value)", [])}, "KraskyOvcarDogBreed": {"132624002": ("Krasky Ovcar dog breed", [7480])}, "KravarskyCattleBreed": {"133469008": ("Kravarsky cattle breed", [7480])}, "KrishnaValleyCattleBreed": {"133615003": ("Krishna Valley cattle breed", [7480])}, "KrishnagariCattleBreed": {"133705001": ("Krishnagari cattle breed", [7480])}, "KrolevetsPigBreed": {"133228001": ("Krolevets pig breed", [7480])}, "KromfohrländerDogBreed": {"132625001": ("Kromfohrländer dog breed", [7480])}, "KrskopoljePigBreed": {"132239006": ("Krskopolje pig breed", [7480])}, "Krypton81m": {"61716009": ("Krypton^81m", [25])}, "Kuchendorf": {"399080006": ("Kuchendorf", [4012])}, "KuchendorfProjection": { "399080006": ("Kuchendorf projection (qualifier value)", []) }, "KuchinoshimaCattleBreed": {"133470009": ("Kuchinoshima cattle breed", [7480])}, "KuiMlkDogBreed": {"132391009": ("Kui Mlk dog breed", [7480])}, "KulaPigBreed": {"132367000": ("Kula pig breed", [7480])}, "KumamotoCattleBreed": {"133473006": ("Kumamoto cattle breed", [7480])}, "KumauniCattleBreed": {"133706000": ("Kumauni cattle breed", [7480])}, "KunekunePigBreed": {"132240008": ("Kunekune pig breed", [7480])}, "KurdiCattleBreed": {"133252008": ("Kurdi cattle breed", [7480])}, "KurganCattleBreed": {"131492003": ("Kurgan cattle breed", [7480])}, "KuriCattleBreed": {"131434000": ("Kuri cattle breed", [7480])}, "Kurzbauer": {"399332004": ("Kurzbauer", [4012])}, "KurzbauerProjection": { "399332004": ("Kurzbauer projection (qualifier value)", []) }, "KushumHorseBreed": {"133057005": ("Kushum horse breed", [7480])}, "KustanaiHorseBreed": {"133058000": ("Kustanai horse breed", [7480])}, "KuvaszDog": {"84548001": ("Kuvasz dog", [7480])}, "KuznetHorseBreed": {"131925000": ("Kuznet horse breed", [7480])}, "KwaiPigBreed": {"133170004": ("Kwai pig breed", [7480])}, "KyiApsoDogBreed": {"132631003": ("Kyi Apso dog breed", [7480])}, "KyiLeoDogBreed": {"132612009": ("Kyi-Leo dog breed", [7480])}, "KyogaCattleBreed": {"131493008": ("Kyoga cattle breed", [7480])}, "L1L2Disc": {"80064006": ("L1/L2 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "L1Vertebra": {"66794005": ("L1 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "L2L3Disc": {"67459009": ("L2/L3 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "L2Vertebra": {"14293000": ("L2 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "L3L4Disc": {"62551000": ("L3/L4 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "L3Vertebra": {"36470004": ("L3 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "L4L5Disc": {"84020006": ("L4/L5 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "L4Vertebra": {"11994002": ("L4 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "L5S1Disc": {"715056000": ("L5/S1 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "L5Vertebra": {"49668003": ("L5 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "LASEK": {"414582004": ("LASEK", [4234])}, "LASIK": {"312965008": ("LASIK", [4234])}, "LVPeakDiastolicTissueVelocityDuringAtrialSystole": { "399007006": ( "LV Peak Diastolic Tissue Velocity During Atrial Systole", [12200, 12203], ) }, "LaManchaGoat": {"55530007": ("La Mancha goat (organism)", [])}, "LaManchaGoatBreed": {"55530007": ("La Mancha goat breed", [7480])}, "LaVelasquezCattleBreed": {"133477007": ("La Velasquez cattle breed", [7480])}, "LaboratoryBiosafetyLevel": { "409599009": ("Laboratory biosafety level (observable entity)", []) }, "LabradorRetriever": {"62137007": ("Labrador retriever (organism)", [])}, "LabradorRetrieverDogBreed": {"62137007": ("Labrador retriever dog breed", [7480])}, "LacmoidStain": {"35724001": ("lacmoid stain", [8112])}, "LacombePig": {"30448006": ("Lacombe pig (organism)", [])}, "LacombePigBreed": {"30448006": ("Lacombe pig breed", [7480])}, "LaconiePigBreed": {"132093002": ("Laconie pig breed", [7480])}, "LacrimalArtery": { "59749000": ( "Lacrimal artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "LacrimalArteryOfRightEye": { "128979005": ( "Lacrimal artery of right eye", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "LacrimalArteryRight": { "128979005": ("Lacrimal artery, right (body structure)", []) }, "LacrimalBone": {"6229007": ("Lacrimal bone", [4028, 7151, 7192, 8134, 9514])}, "LacrimalBoneStructure": { "6229007": ("Lacrimal bone structure (body structure)", []) }, "LacrimalCaruncle": {"43045000": ("Lacrimal caruncle", [4209, 8134])}, "LacrimalCaruncleStructure": { "43045000": ("Lacrimal caruncle structure (body structure)", []) }, "LacrimalGland": {"13561001": ("Lacrimal gland", [4209, 8134])}, "LacrimalGlandStructure": { "13561001": ("Lacrimal gland structure (body structure)", []) }, "LacrimalSac": {"3954005": ("Lacrimal sac", [4209, 8134])}, "LacrimalSacStructure": { "3954005": ("Lacrimal sac structure (body structure)", []) }, "Lactate": {"83036002": ("Lactate", [218, 4032, 4033, 7180, 7186, 7469])}, "LactatedRingerSolution": { "347379006": ("Lactated Ringer's solution (product)", []) }, "LactatingAdenoma": {"128651002": ("Lactating adenoma", [6030, 6031])}, "Lactocele": {"42385006": ("Lactocele (disorder)", [])}, "LacunarLymphNode": {"360993001": ("lacunar lymph node", [7600, 8134])}, "LadakhiCattleBreed": {"133707009": ("Ladakhi cattle breed", [7480])}, "LaguneCattleBreed": {"133474000": ("Lagune cattle breed", [7480])}, "LakelandTerrier": {"78214003": ("Lakeland terrier", [7480])}, "LakenvelderCattleBreed": {"133475004": ("Lakenvelder cattle breed", [7480])}, "LaminaOfVertebra": {"89340005": ("Lamina of vertebra", [6115, 8134])}, "Laminar": {"88446008": ("Laminar (qualifier value)", [])}, "Laminated": {"88446008": ("Laminated", [6132])}, "LanYuPigBreed": {"132306006": ("Lan-Yu pig breed", [7480])}, "LandaisHorseBreed": {"131926004": ("Landais horse breed", [7480])}, "LandracePig": {"80131009": ("Landrace pig (organism)", [])}, "LandracePigBreed": {"80131009": ("Landrace pig breed", [7480])}, "LangHongPigBreed": {"132344002": ("Lang Hong pig breed", [7480])}, "LangheSheepBreed": {"131756001": ("Langhe sheep breed", [7480])}, "LantangPigBreed": {"132287001": ("Lantang pig breed", [7480])}, "LaoshanPigBreed": {"132333005": ("Laoshan pig breed", [7480])}, "LapermLonghairCatBreed": {"132668000": ("LaPerm Longhair cat breed", [7480])}, "LapermShorthairCatBreed": {"132667005": ("LaPerm Shorthair cat breed", [7480])}, "LaquerrierePierquin": {"399156009": ("Laquerriere-Pierquin", [4012])}, "LaquerrierePierquinProjection": { "399156009": ("Laquerriere-Pierquin projection (qualifier value)", []) }, "Large": {"255509001": ("Large", [252, 6118])}, "LargeBlackPig": {"21021000": ("Large black pig (organism)", [])}, "LargeBlackPigBreed": {"21021000": ("Large black pig breed", [7480])}, "LargeBlackWhitePigBreed": {"132241007": ("Large Black-White pig breed", [7480])}, "LargeCellCarcinoma": {"22687000": ("Large cell carcinoma", [638, 639])}, "LargeIntestinalStructure": { "14742008": ("Large intestinal structure (body structure)", []) }, "LargeIntestine": { "14742008": ( "Large intestine", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 8134, 9514], ) }, "LargeLiver": {"80515008": ("Large liver (disorder)", [])}, "LargePolishLongEaredPigBreed": { "133230004": ("Large Polish Long-Eared pig breed", [7480]) }, "LargeRodLikeCalcification": { "129752009": ("Large rod-like calcification", [6010, 6011]) }, "LargeRodLikeRadiographicCalcification": { "129752009": ("Large rod-like radiographic calcification (finding)", []) }, "LargeSpanishHoundDogBreed": { "132613004": ("Large Spanish Hound dog breed", [7480]) }, "LargeVWave": {"414576002": ("Large v-wave (finding)", [])}, "LargeWhitePig": {"77236002": ("Large white pig (organism)", [])}, "LargeWhitePigBreed": {"77236002": ("Large white pig breed", [7480])}, "LaryngealEdema": {"51599000": ("Laryngeal edema", [60, 9300])}, "LaryngealMaskAirwayInsertion": { "424979004": ("Laryngeal mask airway insertion (procedure)", []) }, "LaryngealMaskAirwayLMA": { "424979004": ("Laryngeal Mask Airway (LMA)", [617, 618]) }, "LaryngealStructure": {"4596009": ("Laryngeal structure (body structure)", [])}, "LaryngealVoiceFunction": { "43914001": ("Laryngeal voice function (observable entity)", []) }, "Larynx": { "4596009": ( "Larynx", [4, 645, 4009, 4028, 4030, 4031, 4040, 4042, 7151, 7192, 7601, 8134, 9514], ) }, "Laser": {"38586004": ("Laser", [8, 3411, 3429, 4051, 7151, 7193])}, "LaserAssistedInSituKeratomileusis": { "312965008": ("Laser assisted in situ keratomileusis (procedure)", []) }, "LaserAssistedSubepithelialKeratomileusis": { "414582004": ("Laser assisted subepithelial keratomileusis (procedure)", []) }, "LaserDevice": {"122456005": ("Laser", [8125])}, "LaserGeneratedElectromagneticRadiation": { "38586004": ("Laser-generated electromagnetic radiation (physical force)", []) }, "LaserMicrodissection": {"433454009": ("Laser microdissection", [8110])}, "LaserProcedureOnSkin": {"445907001": ("Laser procedure on skin", [4409])}, "Lateral": { "49370004": ( "Lateral", [2, 5, 26, 211, 212, 501, 3019, 4005, 6065, 12117, 12281], ) }, "Lateral45DegDorsal50DegProximalMediopalmarodistalOblique": { "442582006": ( "Lateral 45 deg dorsal 50 deg proximal-mediopalmarodistal oblique", [7484], ) }, "Lateral45DegDorsal50DegProximalMedioplantarodistalObliq": { "442661006": ( "Lateral 45 deg dorsal 50 deg proximal-medioplantarodistal obliq", [7484], ) }, "Lateral45DegreeDorsal50DegreeProximalMediopalmarodistalObliqueProjection": { "442582006": ( "Lateral 45 degree dorsal 50 degree proximal-mediopalmarodistal oblique projection (qualifier value)", [], ) }, "Lateral45DegreeDorsal50DegreeProximalMedioplantarodistalObliqueProjection": { "442661006": ( "Lateral 45 degree dorsal 50 degree proximal-medioplantarodistal oblique projection (qualifier value)", [], ) }, "LateralAxillaryLymphNode": { "33770006": ("lateral axillary lymph node", [7600, 8134]) }, "LateralCalfPerforator": { "714754004": ( "Lateral calf perforator", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "LateralCanthus": {"61242005": ("Lateral Canthus", [1000, 1001, 1002, 8134])}, "LateralCanthusStructure": { "61242005": ("Lateral canthus structure (body structure)", []) }, "LateralCavalFontanProcedure": { "427886002": ("Lateral-Caval Fontan procedure", [12247]) }, "LateralCervicalLymphNode": { "68915008": ("lateral cervical lymph node", [7600, 8134]) }, "LateralCommonIliacLymphNode": { "41145006": ("lateral common iliac lymph node", [7600, 8134]) }, "LateralCorticospinalTract": { "461002": ("Lateral corticospinal tract", [7151, 7153, 7192, 8134, 9514]) }, "LateralDecubitus": {"32185000": ("lateral decubitus", [20])}, "LateralDecubitusPosition": { "32185000": ("Lateral decubitus position (finding)", []) }, "LateralExternalIliacLymphNode": { "40242007": ("lateral external iliac lymph node", [7600, 8134]) }, "LateralFuniculus": {"14892003": ("lateral funiculus", [7707, 7710, 8134])}, "LateralFuniculusStructure": { "14892003": ("Lateral funiculus structure (body structure)", []) }, "LateralHighRightAtrium": { "128592001": ("Lateral high right atrium", [3011, 8134]) }, "LateralIncisorRegion": {"699511000": ("Lateral incisor region", [4017])}, "LateralIncisorRegionOfOralCavity": { "699511000": ("Lateral incisor region of oral cavity (body structure)", []) }, "LateralJugularLymphNode": { "168159002": ("lateral jugular lymph node", [7600, 8134]) }, "LateralLemniscus": {"86136007": ("lateral lemniscus", [7701, 7710, 8134])}, "LateralLemniscusStructure": { "86136007": ("Lateral lemniscus structure (body structure)", []) }, "LateralMedial": {"399352003": ("lateral-medial", [501, 4010, 7302])}, "LateralMedialEmissiveProjection": {"399300004": ("Lateral-medial", [26, 501])}, "LateralMedialProjection": { "399352003": ("Lateral-medial projection (qualifier value)", []) }, "LateralMitralAnnulus": { "399086000": ("Lateral Mitral Annulus", [12235, 12236, 12305]) }, "LateralMitralAnnulusStructure": { "399086000": ("Lateral mitral annulus structure (body structure)", []) }, "LateralOblique": {"260427002": ("lateral oblique", [501, 4010])}, "LateralPericardialLymphNode": { "196587000": ("lateral pericardial lymph node", [7600, 8134]) }, "LateralPlantarArtery": { "44830000": ("lateral plantar artery", [3604, 3606, 3630]) }, "LateralProjection": {"399067008": ("lateral", [501, 4010])}, "LateralRetropharyngealLymphNode": { "167464007": ("lateral retropharyngeal lymph node", [7600, 8134]) }, "LateralRollingOfBreast": { "399197002": ("Lateral rolling of breast (procedure)", []) }, "LateralVentricle": { "66720007": ("Lateral Ventricle", [7140, 7151, 7153, 7192, 8134, 9514, 12022]) }, "LateralVentricleStructure": { "66720007": ("Lateral ventricle structure (body structure)", []) }, "LateralVesicularLymphNode": { "278672000": ("lateral vesicular lymph node", [7600, 8134]) }, "Laterality": {"272741003": ("Laterality", [210])}, "LateroMedial": {"399352003": ("latero-medial", [4014])}, "LateroMedialOblique": {"399099002": ("latero-medial oblique", [501, 4010, 4014])}, "LateroMedialObliqueEmissiveProjection": { "399159002": ("Latero-medial oblique", [26, 501]) }, "LateroMedialObliqueProjection": { "399099002": ("Latero-medial oblique projection (qualifier value)", []) }, "LaterodorsoproximalMediopalmarodistalOblique": { "442630002": ("Laterodorsoproximal-mediopalmarodistal oblique", [7484]) }, "LaterodorsoproximalMediopalmarodistalObliqueProjection": { "442630002": ( "Laterodorsoproximal-mediopalmarodistal oblique projection (qualifier value)", [], ) }, "LaterodorsoproximalMedioplantarodistalOblique": { "442631003": ("Laterodorsoproximal-medioplantarodistal oblique", [7484]) }, "LaterodorsoproximalMedioplantarodistalObliqueProjection": { "442631003": ( "Laterodorsoproximal-medioplantarodistal oblique projection (qualifier value)", [], ) }, "Lateromedial": {"399352003": ("Lateromedial", [7484])}, "LatiSheepBreed": {"131754003": ("Lati sheep breed", [7480])}, "LatissimusDorsiMuscle": { "15665001": ( "Latissimus dorsi muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "LatukaCattleBreed": {"133708004": ("Latuka cattle breed", [7480])}, "LatvianBlueRoanCattleBreed": { "133476003": ("Latvian Blue Roan cattle breed", [7480]) }, "LatvianBrownCattleBreed": {"133243004": ("Latvian Brown cattle breed", [7480])}, "LatvianHorseBreed": {"133059008": ("Latvian horse breed", [7480])}, "LatvianWhitePigBreed": {"132275008": ("Latvian White pig breed", [7480])}, "Lauenstein": {"399169008": ("Lauenstein", [4012])}, "LauensteinProjection": { "399169008": ("Lauenstein projection (qualifier value)", []) }, "LaviniaCattleBreed": {"133814001": ("Lavinia cattle breed (organism)", [])}, "LaviniaXZebuCattleBreed": {"133814001": ("Lavinia X zebu cattle breed", [7480])}, "Law": {"399206007": ("Law", [4012])}, "LawProjection": {"399206007": ("Law projection (qualifier value)", [])}, "Lawrence": {"399179005": ("Lawrence", [4012])}, "LawrenceProjection": {"399179005": ("Lawrence projection (qualifier value)", [])}, "Lead": {"88488004": ("Lead", [10006, 10067])}, "LeakageOfConduitFromRightAtriumToPulmonaryArtery": { "443461006": ( "Leakage of conduit from right atrium to pulmonary artery (disorder)", [], ) }, "LebaneseCattleBreed": {"133484004": ("Lebanese cattle breed", [7480])}, "LebedinCattleBreed": {"133485003": ("Lebedin cattle breed", [7480])}, "LeeSungPigBreed": {"132305005": ("Lee-Sung pig breed", [7480])}, "Left": {"7771000": ("Left", [2, 5, 211, 244, 245, 247, 3019, 12117])}, "Left20DegreeDorsalRightVentralOblique": { "442748002": ("Left 20 degree dorsal-right ventral oblique", [7484]) }, "Left20DegreeDorsalRightVentralObliqueProjection": { "442748002": ( "Left 20 degree dorsal-right ventral oblique projection (qualifier value)", [], ) }, "Left20DegreeRostralRightCaudalOblique": { "442632005": ("Left 20 degree rostral-right caudal oblique", [7484]) }, "Left20DegreeRostralRightCaudalObliqueProjection": { "442632005": ( "Left 20 degree rostral-right caudal oblique projection (qualifier value)", [], ) }, "Left20DegreeVentralRightDorsalOblique": { "442636008": ("Left 20 degree ventral-right dorsal oblique", [7484]) }, "Left20DegreeVentralRightDorsalObliqueProjection": { "442636008": ( "Left 20 degree ventral-right dorsal oblique projection (qualifier value)", [], ) }, "Left30DegreeCaudalRightRostralOblique": { "442596000": ("Left 30 degree caudal-right rostral oblique", [7484]) }, "Left30DegreeCaudalRightRostralObliqueProjection": { "442596000": ( "Left 30 degree caudal-right rostral oblique projection (qualifier value)", [], ) }, "Left45DegreeDorsalRightVentralOblique": { "442598004": ("Left 45 degree dorsal-right ventral oblique", [7484]) }, "Left45DegreeDorsalRightVentralObliqueProjection": { "442598004": ( "Left 45 degree dorsal-right ventral oblique projection (qualifier value)", [], ) }, "Left45DegreeVentralRightDorsalOblique": { "442599007": ("Left 45 degree ventral-right dorsal oblique", [7484]) }, "Left45DegreeVentralRightDorsalObliqueProjection": { "442599007": ( "Left 45 degree ventral-right dorsal oblique projection (qualifier value)", [], ) }, "LeftAnteriorApicalPeripheralZoneOfProstate": { "716937001": ( "Left anterior apical peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftAnteriorApicalTransitionZoneOfProstate": { "716931000": ( "Left anterior apical transition zone of prostate", [6300, 6301, 6304], ) }, "LeftAnteriorBasalPeripheralZoneOfProstate": { "716905002": ( "Left anterior basal peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftAnteriorBasalTransitionZoneOfProstate": { "716897000": ( "Left anterior basal transition zone of prostate", [6300, 6301, 6304], ) }, "LeftAnteriorDescendingCoronaryArtery": { "59438005": ( "Left Anterior Descending Coronary Artery", [3015, 3016, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "LeftAnteriorDivisionOfLeftBranchAtrioventricularBundle": { "84654008": ( "Left anterior division of left branch atrioventricular bundle", [3011, 8134], ) }, "LeftAnteriorFascicularBlock": { "37760005": ("Left anterior fascicular block", [3230]) }, "LeftAnteriorMiddlePeripheralZoneOfProstate": { "716920008": ( "Left anterior middle peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftAnteriorMiddleTransitionZoneOfProstate": { "716914007": ( "Left anterior middle transition zone of prostate", [6300, 6301, 6304], ) }, "LeftAnteriorOblique": {"399135007": ("left anterior oblique", [501, 3466, 4010])}, "LeftAnteriorObliqueEmissiveProjection": { "399074003": ("Left anterior oblique", [26, 501]) }, "LeftAnteriorObliqueProjection": { "399135007": ("Left anterior oblique projection (qualifier value)", []) }, "LeftApicalAnteriorFibromuscularStromaOfProstate": { "716927006": ( "Left apical anterior fibromuscular stroma of prostate", [6300, 6301, 6304], ) }, "LeftApicalPeripheralZoneOfProstate": { "716935009": ("Left apical peripheral zone of prostate", [6300, 6302]) }, "LeftApicalTransitionZoneOfProstate": { "716929009": ("Left apical transition zone of prostate", [6300, 6302, 6303]) }, "LeftAtrialStructure": {"82471001": ("Left atrial structure (body structure)", [])}, "LeftAtrium": { "82471001": ( "Left atrium", [ 4, 3010, 3011, 3462, 3608, 3630, 4042, 7151, 7192, 8134, 9514, 12284, 12305, ], ) }, "LeftAtriumPressureWaveform": { "128441007": ("Left atrium pressure waveform", [3003]) }, "LeftAtriumPressureWaveformFunction": { "128441007": ("Left atrium pressure waveform, function (observable entity)", []) }, "LeftAtriumSystolicVolume": {"399235004": ("Left Atrium Systolic Volume", [12205])}, "LeftAuricularAppendage": { "33626005": ( "Left auricular appendage", [4, 3010, 3011, 4042, 7151, 7192, 8134, 9514, 12284], ) }, "LeftBasalAnteriorFibromuscularStromaOfProstate": { "716893001": ( "Left basal anterior fibromuscular stroma of prostate", [6300, 6301, 6304], ) }, "LeftBasalPartTransitionZoneOfProstate": { "716895008": ("Left basal part transition zone of prostate", [6300, 6302, 6303]) }, "LeftBasalPeripheralZoneOfProstate": { "716903009": ("Left basal peripheral zone of prostate", [6300, 6302]) }, "LeftBranchOfAtrioventricularBundle": { "74031005": ("Left branch of atrioventricular bundle", [3011, 8134]) }, "LeftBranchOfHepaticArtery": { "21807003": ( "Left Branch of Hepatic Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "LeftBreast": {"80248007": ("Left breast", [6022, 6023])}, "LeftBreastStructure": {"80248007": ("Left breast structure (body structure)", [])}, "LeftBundleBranchBlock": { "63467002": ("Left bundle branch block", [3201, 3205, 3230, 12246]) }, "LeftBundleBranchStructure": { "74031005": ("Left bundle branch structure (body structure)", []) }, "LeftCaudalRightRostralOblique": { "442638009": ("Left caudal-right rostral oblique", [7484]) }, "LeftCaudalRightRostralObliqueProjection": { "442638009": ( "Left caudal-right rostral oblique projection (qualifier value)", [], ) }, "LeftCommonCarotidArtery": {"113263003": ("Left Common Carotid Artery", [12291])}, "LeftCommonCarotidArteryStructure": { "113263003": ("Left common carotid artery structure (body structure)", []) }, "LeftCoronaryArtery": { "50018008": ( "Left Coronary Artery", [3015, 3016, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "LeftCoronaryArteryMainStem": { "3227004": ("Left coronary artery main stem (body structure)", []) }, "LeftCoronaryArteryStructure": { "50018008": ("Left coronary artery structure (body structure)", []) }, "LeftCoronaryDominance": {"253729004": ("Left Coronary Dominance", [3710])}, "LeftDominantCoronarySystem": { "253729004": ("Left dominant coronary system (disorder)", []) }, "LeftDorsalRightVentralOblique": { "442644008": ("Left dorsal-right ventral oblique", [7484]) }, "LeftDorsalRightVentralObliqueProjection": { "442644008": ( "Left dorsal-right ventral oblique projection (qualifier value)", [], ) }, "LeftDowngaze": {"255523004": ("Left downgaze", [4201])}, "LeftFemoralArtery": { "113270003": ( "Left femoral artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "LeftGaze": {"255530005": ("Left gaze", [4201])}, "LeftGlennShuntProcedure": {"444178004": ("Left Glenn shunt procedure", [12247])}, "LeftHepaticVein": { "273202007": ( "Left Hepatic Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "LeftHypochondriacRegion": { "133945003": ("Left hypochondriac region", [4, 7151, 7192, 8134, 9514]) }, "LeftHypochondriacRegionStructure": { "133945003": ("Left hypochondriac region structure (body structure)", []) }, "LeftInferiorPulmonaryVein": { "51249003": ("Left Inferior Pulmonary Vein", [12280]) }, "LeftInguinalRegion": { "85119005": ("Left inguinal region", [4, 7151, 7192, 8134, 9514]) }, "LeftInguinalRegionStructure": { "85119005": ("Left inguinal region structure (body structure)", []) }, "LeftLateral": {"399173006": ("left lateral", [501, 3466, 4010])}, "LeftLateralDecubitus": {"102536004": ("left lateral decubitus", [20, 6206])}, "LeftLateralDecubitusPosition": { "102536004": ("Left lateral decubitus position (finding)", []) }, "LeftLateralEmissiveProjection": { "399118008": ("Left lateral projection", [26, 501]) }, "LeftLateralMiddlePeripheralZoneOfProstate": { "716918005": ("Left lateral middle peripheral zone of prostate", [6300, 6302]) }, "LeftLateralProjection": { "399173006": ("Left lateral projection (qualifier value)", []) }, "LeftLobeOfThyroid": {"79163004": ("Left lobe of thyroid", [12131])}, "LeftLowerQuadrantOfAbdomen": { "68505006": ("Left lower quadrant of abdomen", [4, 7151, 7192, 8134, 9514]) }, "LeftLowerSegment": {"264068005": ("Left Lower Segment", [12219, 12237])}, "LeftLumbarRegion": { "1017210004": ("Left lumbar region", [4, 7151, 7192, 8134, 9514]) }, "LeftLumbarRegion_Inactive": { "133943005": ("Left lumbar region (body structure)", []) }, "LeftMainBranchOfPortalVein": { "70253006": ( "Left Main Branch of Portal Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "LeftMainBronchus": { "75245000": ( "Left main bronchus", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "LeftMainBronchusStructure": { "75245000": ("Left main bronchus structure (body structure)", []) }, "LeftMainCoronaryArtery": { "3227004": ( "Left Main Coronary Artery", [ 3014, 3015, 3016, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12292, ], ) }, "LeftMainCoronaryArteryDisease": { "371804009": ("Left main coronary artery disease", [3728]) }, "LeftMainCoronaryArteryOstium": { "1256091001": ( "Left Main Coronary Artery Ostium", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "LeftMiddleAnteriorFibromuscularStromaOfProstate": { "716910003": ( "Left middle anterior fibromuscular stroma of prostate", [6300, 6301, 6304], ) }, "LeftMiddleTransitionZoneOfProstate": { "716912006": ("Left middle transition zone of prostate", [6300, 6302, 6303]) }, "LeftOblique": {"399184004": ("left oblique", [501, 4010])}, "LeftObliqueProjection": { "399184004": ("Left oblique projection (qualifier value)", []) }, "LeftPleura": {"53727004": ("Left Pleura", [12294])}, "LeftPleuraStructure": {"53727004": ("Left pleura structure (body structure)", [])}, "LeftPosteriorApicalTransitionZoneOfProstate": { "716933002": ( "Left posterior apical transition zone of prostate", [6300, 6301, 6304], ) }, "LeftPosteriorBasalTransitionZoneOfProstate": { "716899002": ( "Left posterior basal transition zone of prostate", [6300, 6301, 6304], ) }, "LeftPosteriorDescendingCircumflexCoronaryArtery": { "91760001": ( "Left Posterior Descending Circumflex Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "LeftPosteriorDivisionOfLeftBranchAtrioventricularBundle": { "91085002": ( "Left posterior division of left branch atrioventricular bundle", [3011, 8134], ) }, "LeftPosteriorFascicularBlock": { "62026008": ("Left posterior fascicular block", [3230]) }, "LeftPosteriorMiddleTransitionZoneOfProstate": { "716916009": ( "Left posterior middle transition zone of prostate", [6300, 6301, 6304], ) }, "LeftPosteriorOblique": {"399006002": ("left posterior oblique", [501, 4010])}, "LeftPosteriorObliqueEmissiveProjection": { "399136008": ("Left posterior oblique", [26, 501]) }, "LeftPosteriorObliqueProjection": { "399006002": ("Left posterior oblique projection (qualifier value)", []) }, "LeftPosterolateralApicalPeripheralZoneOfProstate": { "716939003": ( "Left posterolateral apical peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftPosterolateralBasalPeripheralZoneOfProstate": { "716907005": ( "Left posterolateral basal peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftPosterolateralCircumflexCoronaryArtery": { "57823005": ( "Left Posterolateral Circumflex Coronary Artery", [3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "LeftPosterolateralMiddlePeripheralZoneOfProstate": { "716922000": ( "Left posterolateral middle peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftPosteromedialApicalPeripheralZoneOfProstate": { "716941002": ( "Left posteromedial apical peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "LeftPosteromedialBasalPeripheralZoneOfProstate": { "836427009": ( "Left posteromedial basal peripheral zone of prostate", [6300, 6304], ) }, "LeftPosteromedialMiddlePeripheralZoneOfProstate": { "716924004": ( "Left posteromedial middle peripheral zone of prostate", [6300, 6301, 6302, 6303, 6304], ) }, "LeftPulmonaryArtery": { "50408007": ( "Left pulmonary artery", [ 4, 3010, 3604, 3606, 3630, 3829, 4042, 7151, 7192, 8134, 9514, 12280, 12305, ], ) }, "LeftPulmonaryVein": { "27706005": ("Left Pulmonary Vein", [3827, 3840, 7151, 7192, 9514]) }, "LeftRightLateral": {"399198007": ("Left-right lateral", [7484])}, "LeftRostralRightCaudalOblique": { "442645009": ("Left rostral-right caudal oblique", [7484]) }, "LeftRostralRightCaudalObliqueProjection": { "442645009": ( "Left rostral-right caudal oblique projection (qualifier value)", [], ) }, "LeftSeminalVesicle": { "42320003": ("Left seminal vesicle", [6300, 6301, 6302, 6303, 6304]) }, "LeftSidedBidirectionalGlennShuntProcedure": { "443989003": ("Left-sided bidirectional Glenn shunt procedure", [12247]) }, "LeftSinusOfValsalva": {"36371001": ("Left Sinus of Valsalva", [12291])}, "LeftSubclavianArtery": {"85235006": ("Left Subclavian Artery", [12291])}, "LeftSuperiorPulmonaryVein": { "43863001": ("Left Superior Pulmonary Vein", [12280]) }, "LeftSuperiorVenaCava": {"9642004": ("Left Superior Vena Cava", [12282])}, "LeftToRightCardiovascularShunt": { "66130006": ("Left to right cardiovascular shunt", [12221]) }, "LeftUpgaze": {"255525006": ("Left upgaze", [4201])}, "LeftUpperQuadrantOfAbdomen": { "86367003": ("Left upper quadrant of abdomen", [4, 7151, 7192, 8134, 9514]) }, "LeftUpperSegment": {"255482005": ("Left Upper Segment", [12219, 12237])}, "LeftVentralRightDorsalOblique": { "442739007": ("Left ventral-right dorsal oblique", [7484]) }, "LeftVentralRightDorsalObliqueProjection": { "442739007": ( "Left ventral-right dorsal oblique projection (qualifier value)", [], ) }, "LeftVentricle": { "87878005": ( "Left ventricle", [ 4, 3010, 3011, 3462, 3463, 3609, 3630, 4042, 7151, 7152, 7192, 8134, 9514, 12223, 12236, 12287, 12288, 12305, ], ) }, "LeftVentricleAnteriorSegment": { "284355001": ("Left ventricle anterior segment", [3232]) }, "LeftVentricleApex": {"128564006": ("Left ventricle apex", [3609, 3630])}, "LeftVentricleApicalAnteriorSegment": { "264844003": ( "left ventricle apical anterior segment", [3717, 3781, 3784, 3785, 12305], ) }, "LeftVentricleApicalInferiorSegment": { "264849008": ( "left ventricle apical inferior segment", [3717, 3781, 3784, 3785, 12305], ) }, "LeftVentricleApicalLateralSegment": { "264853005": ("left ventricle apical lateral segment", [3717, 3784, 12305]) }, "LeftVentricleApicalSegment": { "128564006": ("Left ventricle apical segment", [3232]) }, "LeftVentricleApicalSeptalSegment": { "264845002": ("left ventricle apical septal segment", [3717, 3718, 3784, 12305]) }, "LeftVentricleBasalAnteriorSegment": { "264850008": ( "left ventricle basal anterior segment", [3717, 3718, 3781, 3782, 12305], ) }, "LeftVentricleBasalAnterolateralSegment": { "396654005": ( "left ventricle basal anterolateral segment", [3717, 3781, 3782, 12305], ) }, "LeftVentricleBasalAnteroseptalSegment": { "396482007": ( "left ventricle basal anteroseptal segment", [3717, 3781, 3782, 12305], ) }, "LeftVentricleBasalInferiorSegment": { "264846001": ( "left ventricle basal inferior segment", [3717, 3718, 3781, 3782, 12305], ) }, "LeftVentricleBasalInferolateralSegment": { "396652009": ( "left ventricle basal inferolateral segment", [3717, 3781, 3782, 12305], ) }, "LeftVentricleBasalInferoseptalSegment": { "396646008": ( "left ventricle basal inferoseptal segment", [3717, 3781, 3782, 12305], ) }, "LeftVentricleBasalLateralSegment": { "277631004": ("Left ventricle basal lateral segment (body structure)", []) }, "LeftVentricleEpicardialDiastolicAreaPsaxPapView": { "399293008": ( "Left Ventricle Epicardial Diastolic Area, psax pap view", [12200, 12240], ) }, "LeftVentricleInferiorSegment": { "284357009": ("Left ventricle inferior segment", [3232]) }, "LeftVentricleInflow": { "70238003": ( "Left ventricle inflow", [4, 3010, 3011, 3609, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "LeftVentricleLateralSegment": { "284358004": ("Left ventricle lateral segment", [3232]) }, "LeftVentricleMidAnteriorSegment": { "264848000": ("left ventricle mid anterior segment", [3717, 3781, 3783, 12305]) }, "LeftVentricleMidAnterolateralSegment": { "396656007": ( "left ventricle mid anterolateral segment", [3717, 3781, 3783, 12305], ) }, "LeftVentricleMidAnteroseptalSegment": { "396647004": ( "left ventricle mid anteroseptal segment", [3717, 3781, 3783, 12305], ) }, "LeftVentricleMidInferiorSegment": { "264847005": ("left ventricle mid inferior segment", [3717, 3781, 3783, 12305]) }, "LeftVentricleMidInferolateralSegment": { "396655006": ( "left ventricle mid inferolateral segment", [3717, 3781, 3783, 12305], ) }, "LeftVentricleMidInferoseptalSegment": { "396649001": ( "left ventricle mid inferoseptal segment", [3717, 3781, 3783, 12305], ) }, "LeftVentricleMyocardium": {"49848007": ("Left Ventricle Myocardium", [12305])}, "LeftVentricleOutflowTract": { "13418002": ( "Left ventricle outflow tract", [ 4, 3010, 3011, 3609, 3610, 3630, 3701, 4042, 7151, 7192, 8134, 9514, 12223, 12236, 12243, 12280, 12305, ], ) }, "LeftVentriclePressureWaveform": { "128438003": ("Left ventricle pressure waveform", [3003]) }, "LeftVentriclePressureWaveformFunction": { "128438003": ( "Left ventricle pressure waveform, function (observable entity)", [], ) }, "LeftVentricleSemiMajorAxisDiastolicDimension": { "399063007": ( "Left Ventricle Semi-major Axis Diastolic Dimension", [12200, 12201], ) }, "LeftVentricleSeptalSegment": { "284356000": ("Left ventricle septal segment", [3232]) }, "LeftVentricleToPulmonaryArteryConduitAnastomosis": { "443696003": ("Left Ventricle to Pulmonary Artery Conduit Anastomosis", [12288]) }, "LeftVentricleTruncatedSemiMajorAxisDiastolicDimension": { "399309003": ( "Left Ventricle Truncated Semi-major Axis Diastolic Dimension", [12200, 12201], ) }, "LeftVentricularAreaFractionalChange": { "399287000": ("Left ventricular area fractional change (observable entity)", []) }, "LeftVentricularAssistDevice": { "360066001": ("Left Ventricular Assist Device", [3553, 3777, 7151, 7157, 7193]) }, "LeftVentricularBasalSeptalSegment": { "277630003": ("Left ventricular basal septal segment (body structure)", []) }, "LeftVentricularCavitySize": { "250929008": ("Left ventricular cavity size (observable entity)", []) }, "LeftVentricularDiastolicArea": { "399109006": ("Left Ventricular Diastolic Area", [12200, 12240]) }, "LeftVentricularEndDiastolicPressure": { "276781007": ("Left Ventricular End-Diastolic Pressure", [3641]) }, "LeftVentricularEpicardialDiastolicAreaPsaxPapView": { "399293008": ( "Left ventricular epicardial diastolic area, psax pap view (observable entity)", [], ) }, "LeftVentricularFractionalAreaChange": { "399287000": ("Left Ventricular Fractional Area Change", [12200, 12240]) }, "LeftVentricularFunction": { "250907009": ("Left ventricular function (observable entity)", []) }, "LeftVentricularIndexOfMyocardialPerformance": { "399266005": ( "Left Ventricular Index of Myocardial Performance", [12200, 12203], ) }, "LeftVentricularIndexOfMyocardiumPerformance": { "399266005": ( "Left ventricular index of myocardium performance (observable entity)", [], ) }, "LeftVentricularIsovolumicContractionTime": { "399051002": ("Left Ventricular Isovolumic Contraction Time", [12200, 12203]) }, "LeftVentricularPeakDiastolicTissueVelocityDuringAtrialSystole": { "399007006": ( "Left ventricular peak diastolic tissue velocity during atrial systole (observable entity)", [], ) }, "LeftVentricularPeakEarlyDiastolicTissueVelocity": { "399133000": ( "Left Ventricular Peak Early Diastolic Tissue Velocity", [12200, 12203], ) }, "LeftVentricularPeakSystolicTissueVelocity": { "399167005": ("Left Ventricular Peak Systolic Tissue Velocity", [12200, 12203]) }, "LeftVentricularPosterobasalSegment": { "408720008": ("Left ventricular posterobasal segment (body structure)", []) }, "LeftVentricularSemiMajorAxisDiastolicDimension": { "399063007": ( "Left ventricular semi-major axis diastolic dimension (observable entity)", [], ) }, "LeftVentricularSize": { "250924003": ("Left ventricular size (observable entity)", []) }, "LeftVentricularStructure": { "87878005": ("Left ventricular structure (body structure)", []) }, "LeftVentricularSystolicArea": { "399030000": ("Left Ventricular Systolic Area", [12200, 12240]) }, "LeftVentricularSystolicPressure": { "276780008": ("Left Ventricular Systolic Pressure", [3641]) }, "LeftVentricularTruncatedSemiMajorAxisDiastolicDimension": { "399309003": ( "Left ventricular truncated semi-major axis diastolic dimension (observable entity)", [], ) }, "LeftVentricularWallMotion": { "250909007": ("Left ventricular wall motion (observable entity)", []) }, "LeftVentriculogram": {"265484009": ("Left ventriculogram (procedure)", [])}, "LeftVentriculography": {"265484009": ("Left Ventriculography", [3405, 3428])}, "LegUp": {"128964003": ("Leg up", [91, 3271])}, "LegUpPhysiologicChallenge": { "128964003": ("Leg up physiologic challenge (procedure)", []) }, "LeicesterSheep": {"6431001": ("Leicester sheep (organism)", [])}, "LeicesterSheepBreed": {"6431001": ("Leicester sheep breed", [7480])}, "LeicomaPigBreed": {"132361004": ("Leicoma pig breed", [7480])}, "LeineschafSheepBreed": {"131744002": ("Leineschaf sheep breed", [7480])}, "Leiomyoma": {"1162890002": ("Leiomyoma", [6030, 6031])}, "LeiomyomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "44598004": ( "Leiomyoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "Leiomyosarcoma": {"1163022006": ("Leiomyosarcoma", [6030, 6033])}, "LeiomyosarcomaNoSubtype": { "51549004": ("Leiomyosarcoma, no subtype (morphologic abnormality)", []) }, "LeiqiongCattleBreed": {"133662005": ("Leiqiong cattle breed", [7480])}, "LeishmanStain": {"255802001": ("Leishman stain", [8112])}, "Length": { "410668003": ( "Length", [ 218, 3423, 6165, 7469, 7470, 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, 12304, ], ) }, "LengthOfSegment": {"414599003": ("Length of Segment", [12119, 12122])}, "LengthOfVesselSegment": { "414599003": ("Length of vessel segment (observable entity)", []) }, "LengthProperty": {"410668003": ("Length property (qualifier value)", [])}, "Lens": {"78076003": ("Lens", [4209, 4211, 8134])}, "LensOpacity": {"193570009": ("Lens Opacity", [4222])}, "LeonardGeorge": {"398996004": ("Leonard-George", [4012])}, "LeonardGeorgeProjection": { "398996004": ("Leonard-George projection (qualifier value)", []) }, "LeonbergerDogBreed": {"132622003": ("Leonberger dog breed (organism)", [])}, "LeopardCurDogBreed": {"132403002": ("Leopard Cur dog breed", [7480])}, "LepingPigBreed": {"132302008": ("Leping pig breed", [7480])}, "Lesion": { "52988006": ("Lesion", [3487, 4266, 6335, 6336, 6337, 7151, 7159, 7194]) }, "LesionOfBrain": {"301766008": ("Lesion of Brain", [7151, 7194, 7199])}, "LesionWithCircumscribedMargin": { "129738007": ("Lesion with circumscribed margin (finding)", []) }, "LesionWithEqualIsodenseRadiographicDensity": { "129745007": ("Lesion with equal (isodense) radiographic density (finding)", []) }, "LesionWithFatContainingRadiolucentDensity": { "129747004": ("Lesion with fat containing (radiolucent) density (finding)", []) }, "LesionWithHighRadiographicDensity": { "129744006": ("Lesion with high radiographic density (finding)", []) }, "LesionWithIndistinctMargin": { "129741003": ("Lesion with indistinct margin (finding)", []) }, "LesionWithLowRadiographicDensityNotContainingFat": { "129746008": ( "Lesion with low radiographic density (not containing fat) (finding)", [], ) }, "LesionWithMicrolobulatedMargin": { "129739004": ("Lesion with microlobulated margin (finding)", []) }, "LesionWithObscuredMargin": { "129740002": ("Lesion with obscured margin (finding)", []) }, "LesionWithSpiculatedMargin": { "129742005": ("Lesion with spiculated margin (finding)", []) }, "LessDefined": {"129728002": ("Less defined", [6002, 6003, 6134])}, "LessIschemia": {"429232006": ("Less ischemia", [3235])}, "LesserCaucasusCattleBreed": { "133486002": ("Lesser Caucasus cattle breed", [7480]) }, "LesserSaphenousVein": { "26805005": ( "Lesser Saphenous Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "LesserTrochanter": {"55499008": ("Lesser trochanter", [1000, 1001, 1005, 8134])}, "Leukemia": {"93143009": ("Leukemia", [638, 639])}, "LeukemiaDisease": {"93143009": ("Leukemia, disease (disorder)", [])}, "LevatoresCostarumMuscles": { "73930003": ( "Levatores costarum muscles", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "LevelOfC2C3IntervertebralDisc": { "243902007": ("Level of C2/C3 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfC3C4IntervertebralDisc": { "243903002": ("Level of C3/C4 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfC4C5IntervertebralDisc": { "243904008": ("Level of C4/C5 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfC5C6IntervertebralDisc": { "243905009": ("Level of C5/C6 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfC6C7IntervertebralDisc": { "243906005": ("Level of C6/C7 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfC7T1IntervertebralDisc": { "243925008": ("Level of C7/T1 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfL1L2IntervertebralDisc": { "243920003": ("Level of L1/L2 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfL2L3IntervertebralDisc": { "243921004": ("Level of L2/L3 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfL3L4IntervertebralDisc": { "243922006": ("Level of L3/L4 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfL4L5IntervertebralDisc": { "243923001": ("Level of L4/L5 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfL5S1IntervertebralDisc": { "243927000": ("Level of L5/S1 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT10T11IntervertebralDisc": { "243917006": ("Level of T10/T11 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT11T12IntervertebralDisc": { "243918001": ("Level of T11/T12 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT12L1IntervertebralDisc": { "243926009": ("Level of T12/L1 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT1T2IntervertebralDisc": { "243908006": ("Level of T1/T2 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT2T3IntervertebralDisc": { "243909003": ("Level of T2/T3 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT3T4IntervertebralDisc": { "243910008": ("Level of T3/T4 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT4T5IntervertebralDisc": { "243911007": ("Level of T4/T5 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT5T6IntervertebralDisc": { "243912000": ("Level of T5/T6 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT6T7IntervertebralDisc": { "243913005": ("Level of T6/T7 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT7T8IntervertebralDisc": { "243914004": ("Level of T7/T8 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT8T9IntervertebralDisc": { "243915003": ("Level of T8/T9 intervertebral disc", [1000, 1001, 1003]) }, "LevelOfT9T10IntervertebralDisc": { "243916002": ("Level of T9/T10 intervertebral disc", [1000, 1001, 1003]) }, "Lewis": {"399037002": ("Lewis", [4012])}, "LewisProjection": {"399037002": ("Lewis projection (qualifier value)", [])}, "LewitzerHorseBreed": {"131927008": ("Lewitzer horse breed", [7480])}, "LhasaApso": {"36438004": ("Lhasa apso", [7480])}, "LiangGuangSmallSpottedGuangdongSmallEarPigBreed": { "132288006": ( "Liang Guang Small Spotted, Guangdong Small Ear pig breed", [7480], ) }, "LiangGuangSmallSpottedLuchuanPigBreed": { "132280004": ("Liang Guang Small Spotted, Luchuan pig breed", [7480]) }, "LiangGuangSmallSpottedPigBreed": { "132158006": ("Liang Guang Small Spotted pig breed", [7480]) }, "LiaoningBlackPigBreed": {"132129008": ("Liaoning Black pig breed", [7480])}, "LiberianDwarfCattleBreed": {"133487006": ("Liberian Dwarf cattle breed", [7480])}, "LibyanCattleBreed": {"133488001": ("Libyan cattle breed", [7480])}, "LichuanHorseBreed": {"131928003": ("Lichuan horse breed", [7480])}, "Lidocaine": {"387480006": ("Lidocaine", [623, 630])}, "LidocaineContainingProduct": {"82573000": ("Lidocaine", [10])}, "LidocaineHydrochloride": {"61773008": ("Lidocaine hydrochloride", [10])}, "LidocainePrilocaine": {"346553009": ("Lidocaine + Prilocaine", [623, 630])}, "Ligament": {"52082005": ("Ligament", [7151, 7166, 7191])}, "LigamentumArteriosum": { "2160002": ( "Ligamentum arteriosum", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "LightEmittingDiode": {"445683001": ("Light emitting diode", [8125])}, "LightEmittingDiodeLampMicroscopeIlluminator": { "445683001": ( "Light emitting diode lamp microscope illuminator (physical object)", [], ) }, "LightGreenSFStain": {"89139001": ("light green SF stain", [8112])}, "LightMicroscopy": {"104157003": ("Light microscopy", [8131])}, "LijiangHorseBreed": {"131929006": ("Lijiang horse breed", [7480])}, "Lilienfeld": {"399342002": ("Lilienfeld", [4012])}, "LilienfeldProjection": { "399342002": ("Lilienfeld projection (qualifier value)", []) }, "LimCattleBreed": {"133489009": ("Lim cattle breed", [7480])}, "LimbStructure": {"66019005": ("Limb structure (body structure)", [])}, "LimbicLobe": {"279215006": ("Limbic lobe", [7151, 7153, 7192, 8134, 9514])}, "LimbusOfFossaOvalis": {"84712000": ("Limbus of Fossa Ovalis", [12284])}, "LimianaCattleBreed": {"133490000": ("Limiana cattle breed", [7480])}, "LimousinCattleBreed": {"48702000": ("Limousin cattle breed (organism)", [])}, "LimousinCowBreed": {"48702000": ("Limousin cow breed", [7480])}, "LimousinPigBreed": {"132126001": ("Limousin pig breed", [7480])}, "Limping": {"16973004": ("Limping (finding)", [])}, "LimpurgerCattleBreed": {"133491001": ("Limpurger cattle breed", [7480])}, "LincolnLongwoolSheepBreed": { "131745001": ("Lincoln Longwool sheep breed", [7480]) }, "LincolnRedCattleBreed": {"3216001": ("Lincoln red cattle breed (organism)", [])}, "LincolnRedCowBreed": {"3216001": ("Lincoln red cow breed", [7480])}, "LincolnRedShorthornCattleBreed": { "133244005": ("Lincoln Red Shorthorn cattle breed", [7480]) }, "LincolnSheep": {"65492002": ("Lincoln sheep (organism)", [])}, "LincolnSheepBreed": {"65492002": ("Lincoln sheep breed", [7480])}, "Lincomycin": {"372677003": ("Lincomycin (substance)", [])}, "LincomycinAntibiotic": {"372677003": ("Lincomycin antibiotic", [621, 622])}, "Lindblom": {"399308006": ("Lindblom", [4012])}, "LindblomProjection": {"399308006": ("Lindblom projection (qualifier value)", [])}, "Line21PigBreed": {"132023007": ("Line 21 pig breed", [7480])}, "Line32PigBreed": {"132022002": ("Line 32 pig breed", [7480])}, "Line500DurocPigBreed": {"132216000": ("Line 500 Duroc pig breed", [7480])}, "LinearCalcificationDistribution": { "129765000": ("Linear calcification distribution", [6012, 6013]) }, "LinebackCattleBreed": {"133584002": ("Lineback cattle breed", [7480])}, "Linezolid": {"387056004": ("Linezolid (substance)", [])}, "LinezolidAntibiotic": {"387056004": ("Linezolid antibiotic", [621, 622])}, "LingualArtery": { "113264009": ( "Lingual artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "LingualTonsil": {"2048000": ("lingual tonsil", [7601, 8134])}, "LingualTonsilStructure": { "2048000": ("Lingual tonsil structure (body structure)", []) }, "Lip": {"48477009": ("Lip", [4028, 7151, 7192, 7601, 8134, 9514])}, "LipStructure": {"48477009": ("Lip structure (body structure)", [])}, "LipetskPigBreed": {"132070008": ("Lipetsk pig breed", [7480])}, "Lipid": {"70106000": ("Lipid", [218, 4032, 4033, 7180, 7186, 7469, 11006])}, "LipidRichCarcinoma": { "3839000": ("Lipid-rich carcinoma (morphologic abnormality)", []) }, "LipidRichLipidSecretingCarcinoma": { "3839000": ("Lipid-rich (lipid-secreting) carcinoma", [6030, 6033]) }, "LipizzanerHorse": {"41754002": ("Lipizzaner horse (organism)", [])}, "LipizzanerHorseBreed": {"41754002": ("Lipizzaner horse breed", [7480])}, "Lipoadenoma": {"22024005": ("Lipoadenoma (morphologic abnormality)", [])}, "Lipoma": {"134328007": ("Lipoma", [6030, 6031, 6201])}, "LipomaMorphology": { "134328007": ("Lipoma morphology (morphologic abnormality)", []) }, "LipomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "46720004": ( "Lipoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "Lipopolysaccharide": {"3325005": ("Lipopolysaccharide", [638, 643])}, "Liposarcoma": {"1162815008": ("Liposarcoma", [6030, 6033])}, "LiposarcomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "49430005": ( "Liposarcoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "LiquidBasedCytologicMaterial": { "430346005": ("Liquid based cytologic material", [8103]) }, "LissamineFastRedBStain": {"6701008": ("lissamine fast red B stain", [8112])}, "LissamineFastYellowStain": {"25079009": ("lissamine fast yellow stain", [8112])}, "LissamineGreenBStain": {"38543004": ("lissamine green B stain", [8112])}, "LissamineRhodamineStain": {"111102009": ("lissamine rhodamine stain", [8112])}, "Lithotomy": {"14205002": ("lithotomy", [20])}, "LithotomyPosition": {"14205002": ("Lithotomy position (finding)", [])}, "LithuanianHeavyDraftHorseBreed": { "133060003": ("Lithuanian Heavy Draft horse breed", [7480]) }, "LithuanianNativePigBreed": {"132242000": ("Lithuanian Native pig breed", [7480])}, "LithuanianRedCattleBreed": {"133245006": ("Lithuanian Red cattle breed", [7480])}, "LithuanianWhitePigBreed": {"132276009": ("Lithuanian White pig breed", [7480])}, "Liver": { "10200004": ( "Liver", [ 4, 644, 1000, 1001, 1005, 4030, 6202, 6204, 7151, 7154, 7192, 8134, 9514, 10044, 10060, 12321, ], ) }, "LiverAndBiliaryStructure": { "303270005": ( "Liver and biliary structure", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "LiverAndOrBiliaryStructure": { "303270005": ("Liver and/or biliary structure (body structure)", []) }, "LiverStructure": {"10200004": ("Liver structure (body structure)", [])}, "LivnyPigBreed": {"132109007": ("Livny pig breed", [7480])}, "LlaneroHorseBreed": {"131930001": ("Llanero horse breed", [7480])}, "LlanwenogSheepBreed": {"131746000": ("Llanwenog sheep breed", [7480])}, "LleynSheepBreed": {"131747009": ("Lleyn sheep breed", [7480])}, "LoashanGoatBreed": {"131635009": ("Loashan goat breed", [7480])}, "LobarArtery": { "274060004": ("Lobar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12115]) }, "LobarLymphNodeOfTheLung": { "127920008": ("lobar lymph node of the lung", [7600, 8134]) }, "LobeOfLung": {"31094006": ("Lobe of lung", [6102, 6109, 6110, 7151, 7192, 9514])}, "LobeOfThyroid": {"119281005": ("Lobe of thyroid", [12130])}, "LobiCattleBreed": {"133492008": ("Lobi cattle breed", [7480])}, "Lobular": {"40266001": ("Lobular", [6004, 6005])}, "LobularCarcinoma": { "89740008": ("Lobular carcinoma (morphologic abnormality)", []) }, "LobularCarcinomaInSituOfBreast": { "109888004": ("Lobular carcinoma in situ of breast", [6030, 6032]) }, "LocalAnesthesia": {"386761002": ("Local anesthesia", [611, 612])}, "LocalAnesthetic": {"373477003": ("Local anesthetic", [621, 622])}, "LocalAnestheticIntrathecalBlock": { "231249005": ("Local anesthetic intrathecal block (procedure)", []) }, "LocalIndianDairyCattleBreed": { "133815000": ("Local Indian Dairy cattle breed (organism)", []) }, "LocalIndianDairyXZebuCattleBreed": { "133815000": ("Local Indian Dairy X zebu cattle breed", [7480]) }, "LoenbergerDogBreed": {"132622003": ("Loenberger dog breed", [7480])}, "LohaniCattleBreed": {"133616002": ("Lohani cattle breed", [7480])}, "LohiSheepBreed": {"131760003": ("Lohi sheep breed", [7480])}, "LokaiHorseBreed": {"133061004": ("Lokai horse breed", [7480])}, "LombokHorseBreed": {"131931002": ("Lombok horse breed", [7480])}, "Long": {"255511005": ("long", [3831])}, "LongAndShortCoatChihuahua": { "57349006": ("Long and short coat chihuahua (organism)", []) }, "LongAndShortCoatChihuahuaDogBreed": { "57349006": ("Long and short coat chihuahua dog breed", [7480]) }, "LongAxis": { "103339001": ("Long axis", [6, 218, 501, 502, 6165, 6166, 7469, 7470]) }, "LongCoatChihuahua": {"36611001": ("Long coat chihuahua (organism)", [])}, "LongCoatChihuahuaDogBreed": { "36611001": ("Long coat chihuahua dog breed", [7480]) }, "LonghairedManx": {"40547002": ("Longhaired manx", [7480])}, "LonghairedMiniatureDachshund": { "57429001": ("Longhaired miniature dachshund (organism)", []) }, "LonghairedMiniatureDachshundDogBreed": { "57429001": ("Longhaired miniature dachshund dog breed", [7480]) }, "LonghairedStandardDachshund": { "59492009": ("Longhaired standard dachshund (organism)", []) }, "LonghairedStandardDachshundDogBreed": { "59492009": ("Longhaired standard dachshund dog breed", [7480]) }, "LonghornCattleBreed": {"66314009": ("Longhorn cattle breed (organism)", [])}, "LonghornCowBreed": {"66314009": ("Longhorn cow breed", [7480])}, "LongissimusMuscle": { "88340001": ("Longissimus muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "Longitudinal": {"38717003": ("Longitudinal", [2, 6, 501, 502, 12118])}, "LonglinPigBreed": {"132289003": ("Longlin pig breed", [7480])}, "LongyouBlackPigBreed": {"132303003": ("Longyou Black pig breed", [7480])}, "LonkSheepBreed": {"131755002": ("Lonk sheep breed", [7480])}, "Lordotic": {"260450008": ("lordotic", [20])}, "LordoticProjection": {"260450008": ("Lordotic projection (qualifier value)", [])}, "Lorenz": {"399251007": ("Lorenz", [4012])}, "LorenzProjection": {"399251007": ("Lorenz projection (qualifier value)", [])}, "LorquinaCattleBreed": {"133592006": ("Lorquina cattle breed", [7480])}, "LossOfDistalPulse": {"414617007": ("Loss of distal pulse", [3413, 3754])}, "LostToFollowUp": {"399307001": ("Lost to follow-up", [3772])}, "LourdaisCattleBreed": {"133493003": ("Lourdais cattle breed", [7480])}, "Low": {"62482003": ("Low", [75])}, "LowBeer": {"399327000": ("Low-Beer", [4012])}, "LowBeerProjection": {"399327000": ("Low-Beer projection (qualifier value)", [])}, "LowBloodPressure": {"45007003": ("Low blood pressure (disorder)", [])}, "LowDensityNotContainingFatLesion": { "129746008": ("Low density (not containing fat) lesion", [6008, 6009]) }, "LowMolecularWeightHeparin": { "373294004": ("Low Molecular Weight Heparin", [621, 622]) }, "LowPowerScanningLensOfOpticalMicroscope": { "445601002": ( "Low power scanning lens of optical microscope (physical object)", [], ) }, "LowRightAtrium": {"128594000": ("Low right atrium", [3011, 8134])}, "LowRisk": {"75976002": ("Low risk", [3118])}, "LowToModerateRisk": {"429551001": ("Low to moderate risk", [3118])}, "LowerAlveolarRidgeStructure": { "288546009": ("Lower alveolar ridge structure (body structure)", []) }, "LowerDeepCervicalLymphNode": { "285429007": ("lower deep cervical lymph node", [7600, 8134]) }, "LowerDentalArchStructure": { "88176008": ("Lower dental arch structure (body structure)", []) }, "LowerEyelid": {"62736007": ("Lower Eyelid", [4209, 8134])}, "LowerEyelidStructure": { "62736007": ("Lower eyelid structure (body structure)", []) }, "LowerInnerQuadrantOfBreast": { "19100000": ( "Lower inner quadrant of breast", [4, 6020, 6021, 7151, 7192, 8134, 9514], ) }, "LowerJugularLymphNode": {"245323006": ("lower jugular lymph node", [7600, 8134])}, "LowerLeg": { "30021000": ("Lower leg", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "LowerLegStructure": {"30021000": ("Lower leg structure (body structure)", [])}, "LowerLimb": { "61685007": ("Lower limb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "LowerLimbAmputation": {"161622006": ("Lower limb amputation", [3205])}, "LowerLimbLymphNode": {"4942000": ("lower limb lymph node", [7600, 8134])}, "LowerLimbLymphNodeStructure": { "4942000": ("Lower limb lymph node structure (body structure)", []) }, "LowerLimbStructure": {"61685007": ("Lower limb structure (body structure)", [])}, "LowerLimitOfReferenceRange": { "385524004": ("Lower limit of reference range (qualifier value)", []) }, "LowerLobeOfLung": { "90572001": ( "Lower lobe of lung", [6124, 6126, 6170, 7151, 7155, 7192, 8134, 9514], ) }, "LowerOuterQuadrantOfBreast": { "33564002": ( "Lower outer quadrant of breast", [4, 6020, 6021, 7151, 7192, 8134, 9514], ) }, "LowerParatrachealIncludingAzygousLymphNode": { "127932007": ("lower paratracheal (including azygous) lymph node", [7600, 8134]) }, "LowerZoneOfLung": {"281394001": ("Lower zone of lung", [6124, 6126, 6171])}, "LucanianCattleBreed": {"131494002": ("Lucanian cattle breed", [7480])}, "LucanianPigBreed": {"132188002": ("Lucanian pig breed", [7480])}, "LucentCenteredCalcification": { "129754005": ("Lucent-centered calcification", [6010, 6011]) }, "LucentCenteredRadiographicCalcification": { "129754005": ("Lucent-centered radiographic calcification (finding)", []) }, "LucernaCattleBreed": {"133500008": ("Lucerna cattle breed", [7480])}, "LuciePig": {"80084005": ("Lucie pig (organism)", [])}, "LuciePigBreed": {"80084005": ("Lucie pig breed", [7480])}, "LugwareCattleBreed": {"133709007": ("Lugware cattle breed", [7480])}, "LuingCattleBreed": {"21553004": ("Luing cattle breed (organism)", [])}, "LuingCowBreed": {"21553004": ("Luing cow breed", [7480])}, "LumbarArtery": { "34635009": ( "Lumbar artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12111, 12125, ], ) }, "LumbarLymphNode": {"8334002": ("lumbar lymph node", [7600, 8134])}, "LumbarRegion": {"52612000": ("Lumbar region", [4, 7151, 7192, 8134, 9514])}, "LumbarRegionBackStructure": { "52612000": ("Lumbar region back structure (body structure)", []) }, "LumbarSpine": { "122496007": ( "Lumbar spine", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514], ) }, "LumbarSpineStructure": { "122496007": ("Lumbar spine structure (body structure)", []) }, "LumboSacralSpine": { "1217253001": ( "Lumbo-sacral spine", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514], ) }, "LumbosacralRegionOfSpineStructure": { "297173004": ("Lumbosacral region of spine structure (body structure)", []) }, "Lumen": {"113342003": ("Lumen", [5])}, "LumenAreaStenosis": {"408714007": ("Lumen Area Stenosis", [12119, 12121])}, "LumenDiameterStenosis": {"408715008": ("Lumen Diameter Stenosis", [12119, 12121])}, "LumenOfArtery": {"67170007": ("Lumen of artery", [3497])}, "LumenOfBloodVessel": { "91747007": ("Lumen of blood vessel", [4, 4040, 7151, 7156, 7192, 8134, 9514]) }, "LuminalIrregularities": {"371873004": ("Luminal Irregularities", [3712])}, "LuminalIrregularitiesOfCoronaryArtery": { "371873004": ("Luminal irregularities of coronary artery (finding)", []) }, "Lumpectomy": {"392021009": ("Lumpectomy", [6058, 6060])}, "LumpectomyBreastSample": {"309546004": ("lumpectomy breast sample", [8103, 8104])}, "LumpectomyOfBreast": {"392021009": ("Lumpectomy of breast (procedure)", [])}, "LundehundDogBreed": {"132614005": ("Lundehund dog breed", [7480])}, "LundyPonyHorseBreed": {"131932009": ("Lundy Pony horse breed", [7480])}, "Lung": { "39607008": ( "Lung", [ 4, 645, 1000, 1001, 1004, 6100, 6129, 6202, 6204, 7151, 7155, 7192, 8134, 9514, 10044, 10060, ], ) }, "LungAndTracheobronchialLymphNodes": { "110550009": ("lung and tracheobronchial lymph nodes", [7600, 8134]) }, "LungAndTracheobronchialLymphNodesCombinedSite": { "110550009": ( "Lung and tracheobronchial lymph nodes (combined site) (body structure)", [], ) }, "LungCancer": {"93880001": ("Lung cancer", [638, 639])}, "LungStructure": {"39607008": ("Lung structure (body structure)", [])}, "LupusErythematosus": {"200936003": ("Lupus erythematosus", [4405])}, "LurcherHoundDogBreed": {"132615006": ("Lurcher Hound dog breed", [7480])}, "LusitanoHorseBreed": {"133035003": ("Lusitano horse breed", [7480])}, "LutaiWhitePigBreed": {"132339009": ("Lutai White pig breed", [7480])}, "Lutetium177DOTATATE": {"781259000": ("Lutetium^177^ DOTATATE", [25])}, "LuxiCattleBreed": {"133501007": ("Luxi cattle breed", [7480])}, "LuxolFastBlueStain": {"406958008": ("luxol fast blue stain", [8112])}, "LuzeinSheepBreed": {"131742003": ("Luzein sheep breed", [7480])}, "Lymph": {"38000004": ("Lymph", [645, 8134])}, "LymphNode": { "59441001": ( "Lymph Node", [ 645, 6030, 6031, 6054, 6064, 6102, 6109, 6113, 6149, 6348, 7151, 7166, 7191, 7192, 7600, 8134, 9514, 10044, 10060, ], ) }, "LymphNodeOfAorticArch": {"127937001": ("lymph node of aortic arch", [7600, 8134])}, "LymphNodeOfAortopulmonaryWindow": { "127938006": ("lymph node of aortopulmonary window", [7600, 8134]) }, "LymphNodeOfEpiploicForamen": { "68878000": ("lymph node of epiploic foramen", [7600, 8134]) }, "LymphNodeOfGreaterCurvatureOfStomach": { "76878005": ("lymph node of greater curvature of stomach", [7600, 8134]) }, "LymphNodeOfHead": {"13482005": ("lymph node of head", [7600, 8134])}, "LymphNodeOfHeadAndNeck": { "312501005": ("lymph node of head and neck", [7600, 8134]) }, "LymphNodeOfLesserCurvatureOfStomach": { "279784003": ("lymph node of lesser curvature of stomach", [7600, 8134]) }, "LymphNodeOfLimb": {"312503008": ("lymph node of limb", [7600, 8134])}, "LymphNodeOfMesentery": {"279795009": ("lymph node of mesentery", [7600, 8134])}, "LymphNodeOfStomach": {"314730000": ("lymph node of stomach", [7600, 8134])}, "LymphNodeOfThePulmonaryLigament": { "127941002": ("lymph node of the pulmonary ligament", [7600, 8134]) }, "LymphNodeOfThorax": {"47109002": ("lymph node of thorax", [7600, 8134])}, "LymphNodeOfTrunk": {"312502003": ("lymph node of trunk", [7600, 8134])}, "LymphNodeRingOfCardiaOfStomach": { "279866008": ("lymph node ring of cardia of stomach", [7600, 8134]) }, "LymphNodeStructureOfLimb": { "312503008": ("Lymph node structure of limb (body structure)", []) }, "LymphNodeStructureOfTrunk": { "312502003": ("Lymph node structure of trunk (body structure)", []) }, "Lymphadenopathy": {"30746006": ("Lymphadenopathy", [6347])}, "LymphaticSystem": {"89890002": ("Lymphatic system", [7151, 7166, 7191])}, "LymphaticTissue": {"181768009": ("Lymphatic tissue (body structure)", [])}, "LymphaticVessel": {"83555006": ("Lymphatic vessel", [7151, 7166, 7191])}, "LymphocyticTissueStructure": { "6969002": ("Lymphocytic tissue structure (body structure)", []) }, "LymphoidTissue": {"6969002": ("Lymphoid tissue", [645, 7151, 7166, 7191, 8134])}, "Lymphoma": {"1163043007": ("Lymphoma", [6030, 6033])}, "LysergicAcidDiethlyamide": {"15698006": ("Lysergic acid diethlyamide", [6089])}, "LysergicAcidDiethylamide": { "15698006": ("Lysergic acid diethylamide (substance)", []) }, "Lysholm": {"399370000": ("Lysholm", [4012])}, "LysholmProjection": {"399370000": ("Lysholm projection (qualifier value)", [])}, "Lysolecithin": {"54446009": ("Lysolecithin (substance)", [])}, "Lysophosphatidylcholine": {"54446009": ("Lysophosphatidylcholine", [638, 643])}, "LöwchenDogBreed": {"132607008": ("Löwchen dog breed", [7480])}, "MBayarHorseBreed": {"133034004": ("M'Bayar horse breed", [7480])}, "MMode": {"399155008": ("M mode", [6058, 12224])}, "MModeUltrasound": {"399155008": ("M-mode ultrasound (qualifier value)", [])}, "MOSFETRadiationTherapyDosimetrySystemDosimeter": { "701933006": ( "MOSFET radiation therapy dosimetry system dosimeter", [7026, 7027, 7151, 7193], ) }, "MRIOfBreast": {"241615005": ("MRI of breast", [6028, 6029, 6050, 6083])}, "MX": {"399593007": ("MX", [6162])}, "MXCategory": {"27167007": ("MX category (finding)", [])}, "MacauPigBreed": {"132052005": ("Macau pig breed", [7480])}, "MacedonianBusaCattleBreed": { "133502000": ("Macedonian Busa cattle breed", [7480]) }, "MacedonianPigBreed": {"133208000": ("Macedonian pig breed", [7480])}, "MacrolideAntibiotic": {"372480009": ("Macrolide antibiotic", [621, 622])}, "MacrolideClassOfAntibioticSubstance": { "372480009": ("Macrolide (class of antibiotic, substance) (substance)", []) }, "MacroscopicTissueSpecimen": { "430861001": ("Macroscopic tissue specimen (specimen)", []) }, "MadagascarZebuCattleBreed": { "133710002": ("Madagascar Zebu cattle breed", [7480]) }, "MadaripurCattleBreed": {"133711003": ("Madaripur cattle breed", [7480])}, "MadonieSicilianPigBreed": {"132256003": ("Madonie-Sicilian pig breed", [7480])}, "MaduraCattleBreed": {"133842004": ("Madura cattle breed (organism)", [])}, "MaduraWildJavanXZebuCattleBreed": { "133842004": ("Madura wild javan X zebu cattle breed", [7480]) }, "MagalCattleBreed": {"133712005": ("Magal cattle breed", [7480])}, "Magnesium": {"72717003": ("Magnesium", [621, 622])}, "MagnetInducedPacing": {"371909000": ("Magnet induced pacing (procedure)", [])}, "MagneticResonanceAngiography": { "241663008": ("Magnetic resonance angiography", [3757]) }, "MagneticResonanceImagingGuidance": { "258177008": ("Magnetic resonance imaging guidance", [100]) }, "MagneticResonanceImagingGuidedBiopsy": { "277592004": ("Magnetic resonance imaging guided biopsy", [6058, 6060]) }, "MagneticResonanceImagingOfBreast": { "241615005": ("Magnetic resonance imaging of breast (procedure)", []) }, "MagneticResonanceImagingOfHeart": { "241620005": ("Magnetic resonance imaging of heart (procedure)", []) }, "MagneticResonanceImagingOfVessels": { "241663008": ("Magnetic resonance imaging of vessels (procedure)", []) }, "MagneticResonanceImagingOfWholeBody": { "426252008": ("Magnetic resonance imaging of whole body (procedure)", []) }, "MagneticResonanceImagingService": { "310127009": ("Magnetic Resonance Imaging Service", [7030]) }, "MagneticResonanceImagingStressStudyOfCardiacFunction": { "431609005": ( "Magnetic resonance imaging stress study of cardiac function (procedure)", [], ) }, "MagneticResonanceImagingUnit": { "90003000": ("Magnetic resonance imaging unit", [9268]) }, "Magnification": {"399163009": ("Magnification", [4015])}, "MagnificationViews": {"399163009": ("Magnification views", [6028, 6029])}, "MagnifiedProjection": { "399163009": ("Magnified projection (qualifier value)", []) }, "MagyarAgårDogBreed": {"132436001": ("Magyar Agår dog breed", [7480])}, "Main": {"63161005": ("Main", [12117])}, "MainPulmonaryArteryPeakVelocity": { "399048009": ("Main Pulmonary Artery Peak Velocity", [12210]) }, "MaineAnjouCattleBreed": {"45284002": ("Maine Anjou cattle breed (organism)", [])}, "MaineAnjouCowBreed": {"45284002": ("Maine Anjou cow breed", [7480])}, "MaineCoonCat": {"81866001": ("Maine coon cat", [7480])}, "MaintenanceOfGeneralAnesthesia": { "241695009": ("Maintenance of general anesthesia (procedure)", []) }, "MaintenanceTherapy": {"314122007": ("Maintenance therapy", [6146])}, "Major": {"255603008": ("Major", [251])}, "MajorAxis": { "131187009": ( "Major Axis", [ 218, 6165, 7469, 7470, 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, ], ) }, "MakaweliCattleBreed": {"133503005": ("Makaweli cattle breed", [7480])}, "MalachiteGreenStain": {"27120008": ("malachite green stain", [8112])}, "MalagueñaGoatBreed": {"131676000": ("Malagueña goat breed", [7480])}, "MalakanHorseBreed": {"131933004": ("Malakan horse breed", [7480])}, "MalawiZebuCattleBreed": {"133713000": ("Malawi Zebu cattle breed", [7480])}, "MaleExternalGenitalia": { "90418005": ("Male external genitalia", [7151, 7160, 7192, 8134, 9514]) }, "MaleExternalGenitaliaStructure": { "90418005": ("Male external genitalia structure (body structure)", []) }, "MaleExternalUrethralOrifice": { "279478000": ("Male external urethral orifice", [4029, 8134]) }, "MaleExternalUrethralSphincter": { "717027004": ( "Male external urethral sphincter", [6300, 6301, 6302, 6303, 6304, 6348], ) }, "MaleFirstCousin": {"11993008": ("Male first cousin", [7450, 7451])}, "MaleInternalGenitalia": { "38242008": ("Male internal genitalia", [7151, 7160, 7192, 8134, 9514]) }, "MaleInternalGenitaliaStructure": { "38242008": ("Male internal genitalia structure (body structure)", []) }, "Malignant": {"21594007": ("Malignant", [6063])}, "MalignantEpithelialNeoplasmOfThyroid": { "448216007": ("Malignant epithelial neoplasm of thyroid", [64]) }, "MalignantFibrousHistiocytoma": { "34360000": ("Malignant fibrous histiocytoma", [6030, 6033]) }, "MalignantLymphomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "21964009": ( "Malignant lymphoma, no International Classification of Diseases for Oncology subtype (morphologic " "abnormality)", [], ) }, "MalignantMelanoma": {"1162635006": ("Malignant melanoma", [638, 639])}, "MalignantMelanomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "2092003": ( "Malignant melanoma, no International Classification of Diseases for Oncology subtype (morphologic " "abnormality)", [], ) }, "MalignantMesothelioma": {"62064005": ("Malignant mesothelioma", [638, 639])}, "MalignantNeoplasmPrimary": { "86049000": ("Malignant neoplasm, primary (morphologic abnormality)", []) }, "MalignantPeripheralNerveSheathTumor": { "19897006": ("Malignant peripheral nerve sheath tumor", [638, 639]) }, "MalignantTumorOfCervix": { "363354003": ("Malignant tumor of cervix (disorder)", []) }, "MalignantTumorOfColon": {"363406005": ("Malignant tumor of colon (disorder)", [])}, "MalignantTumorOfOvary": {"363443007": ("Malignant tumor of ovary (disorder)", [])}, "MalignantTumorOfSalivaryGland": { "255072001": ("Malignant tumor of salivary gland (disorder)", []) }, "MalignantTumorOfUrinaryBladder": { "399326009": ("Malignant tumor of urinary bladder (disorder)", []) }, "MalignantTumourOfUnknownOrigin": { "255052006": ("Disseminated malignancy of unknown primary", [6055]) }, "MalleolarStructureOfTibia": { "314796009": ("Malleolar structure of tibia", [1000, 1001, 1006, 8134]) }, "MalloryBleachStain": {"406953004": ("Mallory bleach stain", [8112])}, "MalnadGiddaCattleBreed": {"133714006": ("Malnad Gidda cattle breed", [7480])}, "MalopolskiHorseBreed": {"131934005": ("Malopolski horse breed", [7480])}, "MalteseCatBreed": {"132652006": ("Maltese cat breed", [7480])}, "MalteseDog": {"39348004": ("Maltese dog", [7480])}, "MalteseGoatBreed": {"131610003": ("Maltese goat breed", [7480])}, "MalviCattleBreed": {"133617006": ("Malvi cattle breed", [7480])}, "MammaryDuctEctasia": { "22049009": ("Mammary duct ectasia", [6030, 6031, 6054, 6057, 6064]) }, "MammaryDuctogram": {"18102001": ("Mammary ductogram", [6028, 6029, 6050, 6083])}, "MammographicArchitecturalDistortionOfBreast": { "129792006": ("Mammographic architectural distortion of breast (finding)", []) }, "MammographicBreastCompositionFinding": { "129715009": ("Mammographic breast composition finding (finding)", []) }, "MammographicBreastCompositionShowingScatteredFibroglandularDensities": { "129717001": ( "Mammographic breast composition showing scattered fibroglandular densities (finding)", [], ) }, "MammographicBreastDensity": { "129793001": ("Mammographic breast density (finding)", []) }, "MammographicBreastMass": { "129788004": ("Mammographic breast mass", [6016, 6017, 6054]) }, "MammographicBreastMassFinding": { "129788004": ("Mammographic breast mass finding (finding)", []) }, "MammographicDifferenceInLocation": { "129808005": ("Mammographic difference in location (finding)", []) }, "MammographicDifferenceInMargin": { "129812004": ("Mammographic difference in margin (finding)", []) }, "MammographicDifferenceInNumberOfCalcifications": { "129810007": ( "Mammographic difference in number of calcifications (finding)", [], ) }, "MammographicDifferenceInOpacity": { "129807000": ("Mammographic difference in opacity (finding)", []) }, "MammographicDifferenceInShape": { "129811006": ("Mammographic difference in shape (finding)", []) }, "MammographicDifferenceInSize": { "129806009": ("Mammographic difference in size (finding)", []) }, "MammographicDifferenceInSpatialProximity": { "129809002": ("Mammographic difference in spatial proximity (finding)", []) }, "MammographicDifferenceInSymmetry": { "129813009": ("Mammographic difference in symmetry (finding)", []) }, "MammographicSkinRetractionOfBreast": { "129796009": ("Mammographic skin retraction of breast (finding)", []) }, "MammographicSkinThickeningOfBreast": { "129797000": ("Mammographic skin thickening of breast (finding)", []) }, "MammographicTrabecularThickeningOfBreast": { "129795008": ("Mammographic trabecular thickening of breast (finding)", []) }, "Mammography": {"71651007": ("Mammography", [6058, 6060, 10005])}, "MammographyAssessmentCategory0NeedAdditionalImagingEvaluation": { "397138000": ( "Mammography assessment (Category 0) - Need additional imaging evaluation (finding)", [], ) }, "MammographyAssessmentCategory1Negative": { "397140005": ("Mammography assessment (Category 1) - Negative (finding)", []) }, "MammographyAssessmentCategory2BenignFinding": { "397141009": ( "Mammography assessment (Category 2) - Benign finding (finding)", [], ) }, "MammographyAssessmentCategory3ProbablyBenignFindingShortIntervalFollowUp": { "397143007": ( "Mammography assessment (Category 3) - Probably benign finding, short interval follow-up (finding)", [], ) }, "MammographyAssessmentCategory4SuspiciousAbnormalityBiopsyShouldBeConsidered": { "397144001": ( "Mammography assessment (Category 4) - Suspicious abnormality, biopsy should be considered (finding)", [], ) }, "MammographyAssessmentCategory5HighlySuggestiveOfMalignancy": { "397145000": ( "Mammography assessment (Category 5) - Highly suggestive of malignancy (finding)", [], ) }, "MammographyBreastDensity": { "129793001": ("Mammography breast density", [6014, 6015, 6016, 6054, 6056]) }, "MampatiCattleBreed": {"133721006": ("Mampati cattle breed", [7480])}, "ManagraPigBreed": {"132033004": ("Managra pig breed", [7480])}, "ManapariCattleBreed": {"133722004": ("Manapari cattle breed", [7480])}, "ManchesterTerrierSuperbreed": { "5306005": ("Manchester terrier superbreed (organism)", []) }, "ManchesterTerrierSuperbreedDogBreed": { "5306005": ("Manchester terrier superbreed dog breed", [7480]) }, "MandalongCattleBreed": {"133747002": ("Mandalong cattle breed (organism)", [])}, "MandalongXZebuCattleBreed": { "133747002": ("Mandalong X zebu cattle breed", [7480]) }, "MandiPigBreed": {"132165003": ("Mandi pig breed", [7480])}, "Mandible": { "91609006": ( "Mandible", [ 4, 1000, 1001, 1002, 4009, 4016, 4028, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514, ], ) }, "MandibularDentalArch": { "88176008": ("Mandibular dental arch", [7482, 7483, 8134]) }, "MandibularIncisorTeeth": { "442274007": ("Mandibular incisor teeth", [7482, 7483, 8134]) }, "MandibularLeftCanineTooth": { "860782001": ("Mandibular left canine tooth", [4018, 4026]) }, "MandibularLeftCentralIncisorTooth": { "425106001": ("Mandibular left central incisor tooth", [4018, 4026]) }, "MandibularLeftFirstMolarTooth": { "866006002": ("Mandibular left first molar tooth", [4018, 4026]) }, "MandibularLeftFirstPremolarTooth": { "2400006": ("Mandibular left first premolar tooth", [4018, 4026]) }, "MandibularLeftLateralTooth": { "423331005": ("Mandibular left lateral tooth", [4018, 4026]) }, "MandibularLeftSecondMolarTooth": { "863898000": ("Mandibular left second molar tooth", [4018, 4026]) }, "MandibularLeftSecondPremolarTooth": { "24573005": ("Mandibular left second premolar tooth", [4018, 4026]) }, "MandibularLeftThirdMolarTooth": { "74344005": ("Mandibular left third molar tooth", [4018, 4026]) }, "MandibularLymphNode": {"155338003": ("mandibular lymph node", [7600, 8134])}, "MandibularRightCanineTooth": { "860785004": ("Mandibular right canine tooth", [4018, 4026]) }, "MandibularRightCentralIncisorTooth": { "424575004": ("Mandibular right central incisor tooth", [4018, 4026]) }, "MandibularRightFirstMolarTooth": { "866005003": ("Mandibular right first molar tooth", [4018, 4026]) }, "MandibularRightFirstPremolarTooth": { "80140008": ("Mandibular right first premolar tooth", [4018, 4026]) }, "MandibularRightLateralIncisorTooth": { "423937004": ("Mandibular right lateral incisor tooth", [4018, 4026]) }, "MandibularRightSecondMolarTooth": { "863899008": ("Mandibular right second molar tooth", [4018, 4026]) }, "MandibularRightSecondPremolarTooth": { "8873007": ("Mandibular right second premolar tooth", [4018, 4026]) }, "MandibularRightThirdMolarTooth": { "38994002": ("Mandibular right third molar tooth", [4018, 4026]) }, "MangalargaHorseBreed": {"133052004": ("Mangalarga horse breed", [7480])}, "MangalargaMarchadorHorseBreed": { "132760001": ("Mangalarga Marchador horse breed", [7480]) }, "MangalargaPaulistaHorseBreed": { "131936007": ("Mangalarga Paulista horse breed", [7480]) }, "MangalistaPigBreed": {"132085002": ("Mangalista pig breed", [7480])}, "MangaliztaPigBreed": {"132085002": ("Mangalizta pig breed (organism)", [])}, "ManipulationOfCatheter": { "103712006": ("Manipulation of catheter (procedure)", []) }, "ManipulationOfJoint": {"118745001": ("Manipulation of joint", [93])}, "ManipuriHorseBreed": {"132762009": ("Manipuri horse breed", [7480])}, "ManorHybridPigBreed": {"132010000": ("Manor Hybrid pig breed", [7480])}, "ManorMeishanPigBreed": {"132013003": ("Manor Meishan pig breed", [7480])}, "ManorRangerPigBreed": {"132012008": ("Manor Ranger pig breed", [7480])}, "MantiqueiraCattleBreed": { "133816004": ("Mantiqueira cattle breed (organism)", []) }, "MantiqueiraXZebuCattleBreed": { "133816004": ("Mantiqueira X zebu cattle breed", [7480]) }, "Manual": {"87982008": ("Manual", [7230])}, "ManubriumOfSternum": {"37285002": ("Manubrium of sternum", [6115, 8134])}, "Manx": {"3995008": ("Manx", [7480])}, "ManxLoaghtanSheepBreed": {"131757005": ("Manx Loaghtan sheep breed", [7480])}, "ManxameseCatBreed": {"132651004": ("Manxamese cat breed", [7480])}, "MarchigianaCattleBreed": {"65344003": ("Marchigiana cattle breed (organism)", [])}, "MarchigianaCowBreed": {"65344003": ("Marchigiana cow breed", [7480])}, "MaremmaSheepdogsDogBreed": {"132616007": ("Maremma Sheepdogs dog breed", [7480])}, "MaremmanaCattleBreed": {"131495001": ("Maremmana cattle breed", [7480])}, "MaremmanaHorseBreed": {"131938008": ("Maremmana horse breed", [7480])}, "MaremmanaPigBreed": {"132189005": ("Maremmana pig breed", [7480])}, "MarfanSyndrome": {"19346006": ("Marfan's Syndrome", [3809])}, "Marginal": {"112233002": ("Marginal", [2])}, "MarginalCoronaryArtery": { "22765000": ( "Marginal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "MarianasCattleBreed": {"131496000": ("Marianas cattle breed", [7480])}, "Marijuana": {"398705004": ("Marijuana", [6089])}, "MarinhoaCattleBreed": {"133504004": ("Marinhoa cattle breed", [7480])}, "MarkedlyEnlargedCardiacChamber": { "373128001": ("Markedly enlarged cardiac chamber", [3122, 3705]) }, "MaronesaCattleBreed": {"133505003": ("Maronesa cattle breed", [7480])}, "MartiusYellowStain": {"46139004": ("martius yellow stain", [8112])}, "MarwariHorseBreed": {"131939000": ("Marwari horse breed", [7480])}, "MarylandPig": {"60958006": ("Maryland pig (organism)", [])}, "MarylandPigBreed": {"60958006": ("Maryland pig breed", [7480])}, "MaryutiCattleBreed": {"131497009": ("Maryuti cattle breed", [7480])}, "MasaiCattleBreed": {"409908002": ("Masai cattle breed (organism)", [])}, "MasaiCowBreed": {"409908002": ("Masai cow breed", [7480])}, "MasaiSheepBreed": {"131758000": ("Masai sheep breed", [7480])}, "MashenPigBreed": {"132137000": ("Mashen pig breed", [7480])}, "MashonaCattleBreed": {"133246007": ("Mashona cattle breed", [7480])}, "Mass": {"4147007": ("Mass", [6102, 6104, 6335, 6336, 6337, 7151, 7159, 7194])}, "MassQuantity": {"118538004": ("Mass", [12304])}, "MassifCentralGoatBreed": {"131675001": ("Massif Central goat breed", [7480])}, "Mastectomy": {"5884001": ("Mastectomy (procedure)", [])}, "MastergiltPigBreed": {"132067009": ("Mastergilt pig breed", [7480])}, "MastiffDog": {"48524002": ("Mastiff dog", [7480])}, "MastoidBone": { "59066005": ( "Mastoid bone", [4, 1000, 1001, 1002, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "MastoidCellsAndAntra": { "91716001": ("Mastoid cells and antra", [1000, 1001, 1002, 8134]) }, "MastoidCellsAndAntraStructure": { "91716001": ("Mastoid cells and antra structure (body structure)", []) }, "MastoidLymphNode": {"279143009": ("mastoid lymph node", [7600, 8134])}, "MastoidStructure": {"59066005": ("Mastoid structure (body structure)", [])}, "MaternalHistoryOfInsulinDependence": { "444161008": ("Maternal history of insulin dependence (situation)", []) }, "MaureCattleBreed": {"133723009": ("Maure cattle breed", [7480])}, "MauritiusCreoleCattleBreed": { "131498004": ("Mauritius Creole cattle breed", [7480]) }, "MauritiusCréoleCattleBreed": { "131498004": ("Mauritius Créole cattle breed (organism)", []) }, "Maxilla": { "70925003": ( "Maxilla", [4, 4009, 4016, 4028, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "MaxillaryDentalArch": {"39481002": ("Maxillary dental arch", [7482, 7483, 8134])}, "MaxillaryIncisorTeeth": { "442100006": ("Maxillary incisor teeth", [7482, 7483, 8134]) }, "MaxillarySinus": {"15924003": ("Maxillary sinus", [1000, 1001, 1002, 7601, 8134])}, "MaxillarySinusStructure": { "15924003": ("Maxillary sinus structure (body structure)", []) }, "Maximal": {"56851009": ("Maximal (qualifier value)", [])}, "Maximum": {"56851009": ("Maximum", [3488, 3838, 7464, 10072, 12301])}, "MaximumDiastolicBloodPressure": { "314452008": ("Maximum diastolic blood pressure (observable entity)", []) }, "MaximumHeartRateAchievedDuringCourseOfProcedure": { "428630002": ( "Maximum heart rate achieved during course of procedure (observable entity)", [], ) }, "MaximumSystolicBloodPressure": { "314439003": ("Maximum systolic blood pressure", [3337, 3611]) }, "May": {"399024000": ("May", [4012])}, "MayGrunwaldGiemsaStain": {"255803006": ("may-Grunwald giemsa stain", [8112])}, "MayProjection": {"399024000": ("May projection (qualifier value)", [])}, "Mayer": {"399000008": ("Mayer", [4012])}, "MayerProjection": {"399000008": ("Mayer projection (qualifier value)", [])}, "MazandaraniCattleBreed": {"133724003": ("Mazandarani cattle breed", [7480])}, "MazuryCattleBreed": {"133506002": ("Mazury cattle breed", [7480])}, "McnabDogBreed": {"132617003": ("McNab dog breed", [7480])}, "Mean": {"373098007": ("Mean", [3488, 3627, 3838, 7464, 10072])}, "MeanBloodPressure": {"6797001": ("Mean blood pressure", [3337, 3611, 12304])}, "MeanNumericEstimationTechnique": { "373098007": ("Mean - numeric estimation technique (qualifier value)", []) }, "MeanValueOfPopulation": { "373098007": ("Mean Value of population", [221, 226, 7465]) }, "Measured": {"258104002": ("Measured", [3627, 10009])}, "MeasurementMethod": {"370129005": ("Measurement Method", [9000])}, "MeasurementOfBloodPressureUsingCuffMethod": { "371911009": ("Measurement of blood pressure using cuff method (procedure)", []) }, "MeasurementOfCardiacOutput": { "117610000": ("Measurement of cardiac output (procedure)", []) }, "MeasurementOfSystemicArterialPressureRegimeTherapy": { "73002000": ("Measurement of systemic arterial pressure (regime/therapy)", []) }, "MeasurementOfVenousPressure": { "31724009": ("Measurement of venous pressure (procedure)", []) }, "MeasuringRuler": {"102304005": ("Measuring ruler", [8, 3451, 4051, 7151, 7193])}, "MeasuringRulerDevice": { "102304005": ("Measuring ruler, device (physical object)", []) }, "MeatlinePigBreed": {"132024001": ("Meatline pig breed", [7480])}, "MecklenburgHorseBreed": {"131994008": ("Mecklenburg horse breed", [7480])}, "Media": {"61695000": ("Media", [7151, 7156, 7192, 8134, 9514])}, "Medial": {"255561001": ("Medial", [2, 5, 4005, 6065, 12117, 12281])}, "MedialCommonIliacLymphNode": { "34625003": ("medial common iliac lymph node", [7600, 8134]) }, "MedialExternalIliacLymphNode": { "42472007": ("medial external iliac lymph node", [7600, 8134]) }, "MedialLacunarLymphNode": {"23198005": ("medial lacunar lymph node", [7600, 8134])}, "MedialLateralEmissiveProjection": {"399012007": ("Medial-lateral", [26, 501])}, "MedialLemniscus": { "30114003": ("Medial Lemniscus", [7151, 7153, 7192, 7701, 7710, 8134, 9514]) }, "MedialLemniscusStructure": { "30114003": ("Medial lemniscus structure (body structure)", []) }, "MedialLongitudinalFasciculus": { "28390009": ("medial longitudinal fasciculus", [7701, 7710, 8134]) }, "MedialLongitudinalFasciculusStructure": { "28390009": ("Medial longitudinal fasciculus structure (body structure)", []) }, "MedialMitralAnnulus": { "399093001": ("Medial Mitral Annulus", [12235, 12236, 12305]) }, "MedialMitralAnnulusStructure": { "399093001": ("Medial mitral annulus structure (body structure)", []) }, "MedialOblique": {"260426006": ("medial oblique", [501, 4010])}, "MedialPlantarArtery": {"74156002": ("medial plantar artery", [3604, 3606, 3630])}, "MedialRollingOfBreast": { "399226006": ("Medial rolling of breast (procedure)", []) }, "Median": {"373099004": ("Median", [3627, 3676, 7464, 10072])}, "MedianCubitalVein": { "49852007": ( "Median Cubital vein", [3827, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "MedianNumericEstimationTechnique": { "373099004": ("Median - numeric estimation technique (qualifier value)", []) }, "MedianRetropharyngealLymphNode": { "167364008": ("median retropharyngeal lymph node", [7600, 8134]) }, "MedianValueOfPopulation": { "373099004": ("Median Value of population", [221, 226, 7465]) }, "MediastinalEmphysema": {"16838000": ("Mediastinal emphysema (disorder)", [])}, "MediastinalLymphNode": {"62683002": ("mediastinal lymph node", [7600, 8134])}, "MediastinalLymphNodeStructure": { "62683002": ("Mediastinal lymph node structure (body structure)", []) }, "MediastinalStructure": { "72410000": ("Mediastinal structure (body structure)", []) }, "Mediastinum": { "72410000": ( "Mediastinum", [4, 4009, 4030, 4031, 4040, 4042, 6100, 6129, 7151, 7155, 7192, 8134, 9514], ) }, "MedicalAir": {"417696007": ("Medical air", [623, 629])}, "MedicalIntensiveCare": {"441994008": ("Medical Intensive Care", [7030])}, "MedicalIntensiveCareUnit": { "441994008": ("Medical intensive care unit (environment)", []) }, "MedicalMicrobiology": {"309956009": ("Medical Microbiology", [7030])}, "MedicalMicrobiologyDepartment": { "309956009": ("Medical microbiology department (environment)", []) }, "MedicalOphthalmologyDepartment": { "309935007": ("Medical ophthalmology department (environment)", []) }, "MedicalPractitioner": { "158965000": ("Medical Practitioner", [7450, 7452, 9536, 9555, 9562]) }, "MedicalRadiographer": {"159016003": ("Medical radiographer (occupation)", [])}, "MedicalXRayFilm": {"706247001": ("Medical X-Ray film", [7026])}, "MedicationAdministeredAfterLabVisit": { "371899006": ("Medication administered after lab visit (situation)", []) }, "MedicationAdministeredAfterPercutaneousCoronaryIntervention": { "371902009": ( "Medication administered after percutaneous coronary intervention (situation)", [], ) }, "MedicationAdministeredBeforeLabVisit": { "371898003": ("Medication administered before lab visit (situation)", []) }, "MedicationAdministeredDuringLabVisit": { "371905006": ("Medication administered during lab visit (situation)", []) }, "MedicationAdministeredDuringPercutaneousCoronaryIntervention": { "371903004": ( "Medication administered during percutaneous coronary intervention (situation)", [], ) }, "MedicationAdministeredLessThan72HoursBeforePercutaneousCoronaryIntervention": { "371901002": ( "Medication administered less than 72 hours before percutaneous coronary intervention (situation)", [], ) }, "MedicationAdministeredPriorToPercutaneousCoronaryIntervention": { "371904005": ( "Medication administered prior to percutaneous coronary intervention (situation)", [], ) }, "MedicationGiven": {"182833002": ("Medication given (situation)", [])}, "MedicationNotAdministered": { "371900001": ("Medication not administered (situation)", []) }, "MedioLateralObliqueEmissiveProjection": { "399268006": ("Medio-lateral oblique", [26, 501]) }, "MedioLateralObliqueProjection": { "399368009": ("medio-lateral oblique", [501, 4010, 4014, 7302]) }, "MedioLateralProjection": { "399260004": ("medial-lateral", [501, 4010, 4014, 7484]) }, "Mediolateral": {"261129000": ("Mediolateral (qualifier value)", [])}, "Medium": {"255508009": ("Medium", [252, 6118])}, "MediumWoolMerinoSheepBreed": { "132717005": ("Medium-Wool Merino sheep breed", [7480]) }, "MedullaryCarcinoma": {"32913002": ("Medullary carcinoma", [6030, 6033])}, "MegezhHorseBreed": {"131940003": ("Megezh horse breed", [7480])}, "MeglumineDiatrizoate": {"47192000": ("Meglumine diatrizoate", [12, 3850])}, "MeglumineIodipamide": {"69783005": ("Meglumine iodipamide", [12, 3850])}, "MegrelHorseBreed": {"131941004": ("Megrel horse breed", [7480])}, "MeishanPigBreed": {"132243005": ("Meishan pig breed", [7480])}, "MeixinPigBreed": {"132330008": ("Meixin pig breed", [7480])}, "Melanin": {"59094002": ("Melanin", [11006])}, "MeldolaBlueStain": {"24516006": ("meldola blue stain", [8112])}, "Membranous": {"94150003": ("Membranous", [3707])}, "MembranousVentricularSeptumDefect": { "94150003": ("Membranous ventricular septum defect (disorder)", []) }, "MengguCattleBreed": {"131554001": ("Menggu cattle breed", [7480])}, "Meninges": {"1231004": ("Meninges", [7151, 7153, 7192, 8134, 9514])}, "MeningesStructure": {"1231004": ("Meninges structure (body structure)", [])}, "Meniscus": {"74135004": ("Meniscus", [7151, 7166, 7191])}, "MeniscusStructureOfJoint": { "74135004": ("Meniscus structure of joint (body structure)", []) }, "MenstrualBleedingPresent": { "289894009": ("Menstrual bleeding present (finding)", []) }, "MenstruationPresent": {"289894009": ("Menstruation present", [6163])}, "MentalState": {"363871006": ("Mental state (observable entity)", [])}, "MenufiCattleBreed": {"131499007": ("Menufi cattle breed", [7480])}, "MeoPigBreed": {"132346000": ("Meo pig breed", [7480])}, "MeraukeCattleBreed": {"133725002": ("Merauke cattle breed", [7480])}, "Merchant": {"399284007": ("Merchant", [4012])}, "MerchantProjection": {"399284007": ("Merchant projection (qualifier value)", [])}, "MercuricChloride": {"11496005": ("Mercuric chloride", [8114])}, "MercuryArcLamp": {"445685008": ("Mercury arc lamp", [8125])}, "MercuryArcLampMicroscopeIlluminator": { "445685008": ("Mercury arc lamp microscope illuminator (physical object)", []) }, "MerensHorseBreed": {"131942006": ("Merens horse breed", [7480])}, "MergellandSheepBreed": {"132687006": ("Mergelland sheep breed", [7480])}, "MerinoSheepSuperbreed": {"125101009": ("Merino sheep superbreed", [7480])}, "MerinolandschafSheepBreed": {"131759008": ("Merinolandschaf sheep breed", [7480])}, "MerkelCellCarcinoma": {"253001006": ("Merkel cell carcinoma", [638, 639])}, "MertolengaCattleBreed": {"133585001": ("Mertolenga cattle breed", [7480])}, "Mescaline": {"373780001": ("Mescaline", [6089])}, "MesentericArtery": { "86570000": ( "Mesenteric artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "MesentericArteryLymphNode": { "299993000": ("mesenteric artery lymph node", [7600, 8134]) }, "MesentericVein": { "128583004": ( "Mesenteric vein", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "Mesocardia": {"16567006": ("Mesocardia", [12248, 12249])}, "MesotheliomaMalignant": { "62064005": ("Mesothelioma, malignant (morphologic abnormality)", []) }, "Mesothelium": {"71400007": ("Mesothelium", [645, 8134])}, "MesotheliumStructure": { "71400007": ("Mesothelium structure (body structure)", []) }, "MespiperoneC11": {"424789007": ("Mespiperone C^11^", [4021])}, "MessaoriaCattleBreed": {"133507006": ("Messaoria cattle breed", [7480])}, "MessaraHorseBreed": {"131943001": ("Messara horse breed", [7480])}, "Metacarpal": {"36455000": ("Metacarpal", [1000, 1001, 1006])}, "Metacarpus": {"36455000": ("Metacarpus", [7482, 7483, 8134])}, "Metaiodobenzylguanidine123I": { "395787009": ("Metaiodobenzylguanidine[123I] (substance)", []) }, "Metaiodobenzylguanidine131I": { "395789007": ("Metaiodobenzylguanidine[131I] (substance)", []) }, "MetalOxideSemiconductorFieldEffectTransistorRadiationTherapyDosimetrySystemRadiationTherapyDosimetrySystemDosimeter": { "701933006": ( "Metal-oxide semiconductor field-effect transistor radiation " "therapy dosimetry system radiation therapy dosimetry system " "dosimeter (physical object)", [], ) }, "MetalStent": {"257363003": ("metal stent", [3814])}, "MetanilYellowStain": {"54791001": ("metanil yellow stain", [8112])}, "Metastasis": {"128462008": ("Metastasis", [645, 8134])}, "MetastasisCategoryFinding": { "385380006": ("Metastasis category finding (finding)", []) }, "Metatarsus": {"280711000": ("Metatarsus", [7482, 7483, 8134])}, "Methadone": {"387286002": ("Methadone", [6089])}, "Methanol": {"259221006": ("Methanol", [8114])}, "MethionineC11": {"129510001": ("Methionine C^11^", [4021])}, "Methlyphenidate": {"373337007": ("Methlyphenidate", [6089])}, "Methohexital": {"373488009": ("Methohexital", [623, 625])}, "Methoxyflurane": {"11136004": ("Methoxyflurane", [623, 624])}, "MethylBlueStain": {"9010006": ("methyl blue stain", [4412, 8112])}, "MethylGreenPyroninStain": {"255804000": ("methyl green pyronin stain", [8112])}, "MethylGreenStain": {"22021002": ("methyl green stain", [8112])}, "MethylOrangeStain": {"42248000": ("methyl orange stain", [8112])}, "MethylRedStain": {"13744001": ("methyl red stain", [8112])}, "MethylViolet2BStain": {"15896008": ("methyl violet 2B stain", [8112])}, "MethylViolet6BStain": {"14544006": ("methyl violet 6B stain", [8112])}, "MethylVioletStain": {"387239001": ("methyl violet stain", [8112])}, "MethyleneBlue": {"6725000": ("Methylene blue", [10])}, "MethyleneBlueStain": {"6725000": ("methylene blue stain", [8112])}, "MethyleneVioletStain": {"406961009": ("methylene violet stain", [8112])}, "MethyleneVioletStainBernthsen": { "31260003": ("methylene violet stain (Bernthsen)", [8112]) }, "Methylphenidate": {"373337007": ("Methylphenidate (substance)", [])}, "Methylprednisolone": {"116593003": ("Methylprednisolone", [65])}, "MethylprednisoloneSodiumPhosphate": { "412248005": ("Methylprednisolone sodium phosphate", [65]) }, "MethylprednisoloneSodiumSuccinate": { "412248005": ("Methylprednisolone sodium succinate (substance)", []) }, "MethylthioniniumChlorideContainingProduct": { "354064008": ("Methylene blue", [4200]) }, "MetohijaRedCattleBreed": {"133508001": ("Metohija Red cattle breed", [7480])}, "Metrizamide": {"90733003": ("Metrizamide", [12, 3850])}, "Metrizoate": {"354094002": ("Metrizoate", [12, 3850])}, "Metronidazole": {"372602008": ("Metronidazole (substance)", [])}, "MetronidazoleAntibiotic": {"372602008": ("Metronidazole antibiotic", [621, 622])}, "MeusseRhineIjsselCattleBreed": { "6112002": ("Meusse-Rhine-Ijssel cattle breed (organism)", []) }, "MeusseRhineIjsselCowBreed": {"6112002": ("Meusse-Rhine-Ijssel cow breed", [7480])}, "MewatiCattleBreed": {"133618001": ("Mewati cattle breed", [7480])}, "MexicanHairlessDog": {"78246003": ("Mexican hairless dog", [7480])}, "MexicanWattledPigBreed": {"132170005": ("Mexican Wattled pig breed", [7480])}, "MezenHorseBreed": {"131988000": ("Mezen horse breed", [7480])}, "MezohegyesSportHorseHorseBreed": { "131989008": ("Mezohegyes Sport Horse horse breed", [7480]) }, "MezzalinaCattleBreed": {"131500003": ("Mezzalina cattle breed", [7480])}, "MhaswadCattleBreed": {"133727005": ("Mhaswad cattle breed", [7480])}, "MiKiDogBreed": {"132438000": ("Mi-Ki dog breed", [7480])}, "MiPigBreed": {"132319005": ("Mi pig breed", [7480])}, "MiamiPigBreed": {"132190001": ("Miami pig breed", [7480])}, "MichelMedium": {"430028007": ("Michel's medium", [8114])}, "MichelTransportMedium": {"430028007": ("Michel transport medium (substance)", [])}, "MicrocalcificationsOfTheBreast": { "44771000": ("Microcalcifications of the breast", [6010, 6011]) }, "MicrodissectionOfTissueSpecimenUsingLaser": { "433454009": ("Microdissection of tissue specimen using laser (procedure)", []) }, "MicrolobulatedLesion": {"129739004": ("Microlobulated lesion", [6006, 6007])}, "MicroscopeSlide": {"433466003": ("Microscope slide", [8101, 8102])}, "MicroscopeSlideCoverSlip": {"433472003": ("Microscope slide cover slip", [8102])}, "MicroscopeSlideCoverslip": { "433472003": ("Microscope slide coverslip (physical object)", []) }, "MicroscopeSlideMountingMedia": { "430862008": ("Microscope slide mounting media", [8102]) }, "MicroscopeSlideMountingMedium": { "430862008": ("Microscope slide mounting medium (substance)", []) }, "Microscopy": {"117259009": ("Microscopy", [8131])}, "MicrowaveHeatingOfTissueSpecimen": { "433455005": ("Microwave heating of tissue specimen (procedure)", []) }, "MidCircumflexCoronaryArtery": { "91753007": ( "Mid Circumflex Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12292], ) }, "MidFrequency": {"255218000": ("Mid-frequency", [6091])}, "MidLeftAnteriorDescendingCoronaryArtery": { "91748002": ( "Mid Left Anterior Descending Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "MidLongitudinal": {"103342007": ("Mid-longitudinal", [5, 211, 212, 3019])}, "MidRightAtrium": {"128593006": ("Mid right atrium", [3011, 8134])}, "MidRightCoronaryArtery": { "450960006": ( "Mid Right Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "Midazolam": {"373476007": ("Midazolam", [65, 66, 623, 625])}, "Midbrain": {"61962009": ("Midbrain", [7151, 7153, 7192, 8134, 9514])}, "MidbrainStructure": {"61962009": ("Midbrain structure (body structure)", [])}, "MidcolicLymphNode": {"282031000": ("midcolic lymph node", [7600, 8134])}, "MiddleAnteriorFibromuscularStromaOfProstate": { "716908000": ("Middle anterior fibromuscular stroma of prostate", [6300, 6303]) }, "MiddleAsianOvtcharkaDogBreed": { "132437005": ("Middle Asian Ovtcharka dog breed", [7480]) }, "MiddleCardiacVein": { "73580002": ("Middle cardiac vein", [3011, 3827, 3839, 7151, 7192, 8134, 9514]) }, "MiddleCerebellarPeduncle": { "33723005": ( "Middle cerebellar peduncle", [7151, 7153, 7192, 7701, 7710, 8134, 9514], ) }, "MiddleCerebralArtery": { "17232002": ( "Middle Cerebral Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12105, 12141], ) }, "MiddleCerebralArteryM1Segment": { "414722000": ( "Middle Cerebral Artery M1 Segment", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "MiddleCerebralArteryM2Segment": { "414723005": ( "Middle Cerebral Artery M2 Segment", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "MiddleDeepCervicalLymphNode": { "285427009": ("middle deep cervical lymph node", [7600, 8134]) }, "MiddleEar": {"25342003": ("Middle ear", [4028, 7151, 7192, 8134, 9514])}, "MiddleEarStructure": {"25342003": ("Middle ear structure (body structure)", [])}, "MiddleHepaticVein": { "273099000": ( "Middle Hepatic Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "MiddleJugularLymphNode": { "245322001": ("middle jugular lymph node", [7600, 8134]) }, "MiddleLobeOfRightLung": { "72481006": ( "Middle lobe of right lung", [6124, 6126, 6170, 7151, 7155, 7192, 8134, 9514], ) }, "MiddleWhitePig": {"82909008": ("Middle white pig (organism)", [])}, "MiddleWhitePigBreed": {"82909008": ("Middle white pig breed", [7480])}, "MiddleZoneOfLung": {"281393007": ("Middle zone of lung", [6124, 6126, 6171])}, "Midline": {"261129000": ("Midline", [5])}, "MigrationOfImplantOrInternalDevice": { "370512004": ("migration of implant or internal device", [3813]) }, "Mild": {"255604002": ("Mild", [3716, 3832, 6130])}, "MildHypokinesis": {"371868005": ("Mild Hypokinesis", [3703])}, "MildHypokinesisOfCardiacWall": { "371868005": ("Mild hypokinesis of cardiac wall (finding)", []) }, "MildIntimalCoronaryIrregularitiesNoSignificantStenoses": { "371861004": ( "Mild intimal coronary irregularities, no significant stenoses", [3728], ) }, "MildIntimalCoronaryIrregularitiesWithoutSignificantStenoses": { "371861004": ( "Mild intimal coronary irregularities without significant stenoses (finding)", [], ) }, "MildRiskOfContextualQualifier": { "75976002": ("Mild risk of (contextual qualifier) (qualifier value)", []) }, "MildToModerate": {"371923003": ("Mild to Moderate", [3716])}, "MildToModerateRiskOfContextualQualifier": { "429551001": ( "Mild to moderate risk of (contextual qualifier) (qualifier value)", [], ) }, "MildlyEnlargedCardiacChamber": { "373126002": ("Mildly enlarged cardiac chamber", [3122, 3705]) }, "MiliaryAneurysm": {"43299000": ("miliary aneurysm", [3808])}, "MilkOfCalciumCalcification": { "129753004": ("Milk of calcium calcification", [6010, 6011]) }, "MilkOfCalciumRadiographicCalcification": { "129753004": ("Milk of calcium radiographic calcification (finding)", []) }, "MilkingDevonCattleBreed": {"133247003": ("Milking Devon cattle breed", [7480])}, "MilkingShorthornCattleBreed": { "78541007": ("Milking Shorthorn cattle breed (organism)", []) }, "MilkingShorthornCowBreed": {"78541007": ("Milking Shorthorn cow breed", [7480])}, "Miller": {"399005003": ("Miller", [4012])}, "MillerProjection": {"399005003": ("Miller projection (qualifier value)", [])}, "MinPeiDogBreed": {"132440005": ("Min-pei dog breed", [7480])}, "MinPigBreed": {"132120007": ("Min pig breed", [7480])}, "MinbeiSpottedPigBreed": {"132286005": ("Minbei Spotted pig breed", [7480])}, "MingrelianRedCattleBreed": {"133509009": ("Mingrelian Red cattle breed", [7480])}, "MinhotaCattleBreed": {"133516005": ("Minhota cattle breed", [7480])}, "MiniatureAustralianShepherdDogBreed": { "132439008": ("Miniature Australian Shepherd dog breed", [7480]) }, "MiniatureBullTerrierDogBreed": { "132618008": ("Miniature Bull Terrier dog breed", [7480]) }, "MiniatureHerefordCattleBreed": { "132770004": ("Miniature Hereford cattle breed", [7480]) }, "MiniaturePinscherDog": {"12131006": ("Miniature pinscher dog", [7480])}, "MiniaturePoodle": {"40121001": ("Miniature poodle (organism)", [])}, "MiniaturePoodleDogBreed": {"40121001": ("Miniature poodle dog breed", [7480])}, "MiniatureSchnauzer": {"300004": ("Miniature schnauzer (organism)", [])}, "MiniatureSchnauzerDogBreed": {"300004": ("Miniature schnauzer dog breed", [7480])}, "MiniatureZebuCattleBreed": {"133728000": ("Miniature Zebu cattle breed", [7480])}, "Minimal": {"255605001": ("Minimal (qualifier value)", [])}, "Minimum": {"255605001": ("Minimum", [3488, 3838, 7464, 10072, 12301])}, "MinimumDiastolicBloodPressure": { "314451001": ("Minimum diastolic blood pressure", [3337, 3611]) }, "MinisibPigBreed": {"132112005": ("Minisib pig breed", [7480])}, "MinnesotaPig": {"61083001": ("Minnesota pig (organism)", [])}, "MinnesotaPigBreed": {"61083001": ("Minnesota pig breed", [7480])}, "Minor": {"255606000": ("Minor", [251])}, "MinorAxis": { "131188004": ( "Minor Axis", [ 218, 6165, 7469, 7470, 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, 12304, ], ) }, "MinorcanCattleBreed": {"133517001": ("Minorcan cattle breed", [7480])}, "MinusinHorseBreed": {"132772007": ("Minusin horse breed", [7480])}, "MinzhuPigBreed": {"132248001": ("Minzhu pig breed", [7480])}, "MirandesaCattleBreed": {"133248008": ("Mirandesa cattle breed", [7480])}, "MirgorodPigBreed": {"132279002": ("Mirgorod pig breed", [7480])}, "MisakiHorseBreed": {"133012001": ("Misaki horse breed", [7480])}, "MishimaCattleBreed": {"133518006": ("Mishima cattle breed", [7480])}, "MissouriFoxTrottingHorse": { "12360007": ("Missouri fox trotting horse (organism)", []) }, "MissouriFoxTrottingHorseBreed": { "12360007": ("Missouri fox trotting horse breed", [7480]) }, "MitralAnnulus": {"65197004": ("Mitral Annulus", [12235, 12236, 12305])}, "MitralDiastolicFillingPeriod": { "371849007": ("Mitral diastolic filling period (observable entity)", []) }, "MitralDiastolicFillingPeriodDfpm": { "371849007": ("Mitral Diastolic Filling Period (DFPm)", [3616]) }, "MitralRegurgitation": { "48724000": ("Mitral regurgitation", [3700, 3728, 12248, 12249]) }, "MitralRing": {"65197004": ("Mitral ring", [3011, 8134])}, "MitralStenosis": {"79619009": ("Mitral stenosis", [3700, 3728, 12248, 12249])}, "MitralValve": { "91134007": ( "Mitral Valve", [ 3610, 3630, 3701, 6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514, 12223, 12236, 12285, 12305, ], ) }, "MitralValveATDTRatio": {"399062002": ("Mitral Valve AT/DT Ratio", [12207])}, "MitralValveAWaveDuration": { "399229004": ("Mitral Valve A-Wave Duration", [12207]) }, "MitralValveArea": {"251012002": ("Mitral Valve Area", [3615])}, "MitralValveClosureToOpeningTime": { "399104001": ("Mitral Valve Closure to Opening Time", [12207]) }, "MitralValveDisease": {"11851006": ("Mitral valve disease", [3700])}, "MitralValveDisorder": {"11851006": ("Mitral valve disorder (disorder)", [])}, "MitralValveEWaveDecelerationTime": { "399354002": ("Mitral Valve E-Wave Deceleration Time", [12207]) }, "MitralValveFlow": {"371837006": ("Mitral Valve Flow", [3617])}, "MitralValveProlapse": { "409712001": ("Mitral valve prolapse", [3700, 3728, 12248, 12249]) }, "MitralValvePullbackPressureFunction": { "128450009": ( "Mitral valve pullback pressure, function (observable entity)", [], ) }, "MitralValvePullbackPressureWaveform": { "128450009": ("Mitral valve pullback pressure waveform", [3003]) }, "MitralValveRegurgitation": { "48724000": ("Mitral valve regurgitation (disorder)", []) }, "MitralValveStenosis": {"79619009": ("Mitral valve stenosis (disorder)", [])}, "MitralValveStructure": { "91134007": ("Mitral valve structure (body structure)", []) }, "Mixed": {"26242008": ("mixed", [3802])}, "MixedAneurysm": {"85726003": ("mixed aneurysm", [3808])}, "MixedBreedCat": {"132653001": ("Mixed breed cat", [7480, 7486])}, "MixedBreedCattle": {"409906003": ("Mixed breed cattle", [7480, 7486])}, "MixedBreedChicken": {"406723001": ("Mixed breed chicken", [7480, 7486])}, "MixedBreedDog": {"132619000": ("Mixed breed dog", [7480, 7486])}, "MixedBreedGoat": {"131607005": ("Mixed breed goat", [7480, 7486])}, "MixedBreedHorse": {"406721004": ("Mixed breed horse", [7480, 7486])}, "MixedBreedPig": {"417012009": ("Mixed breed pig", [7480, 7486])}, "MixedBreedSheep": {"406722006": ("Mixed breed sheep", [7480, 7486])}, "MixedDairyCattleBreed": {"133249000": ("Mixed dairy cattle breed", [7480])}, "MixedIschemiaAndInfarction": { "428196007": ("Mixed Ischemia and Infarction", [3121]) }, "MixedMyocardialIschemiaAndInfarction": { "428196007": ("Mixed myocardial ischemia and infarction (disorder)", []) }, "MixedPerijaneroCattleBreed": { "133821001": ("Mixed Perijanero cattle breed (organism)", []) }, "MixedPerijaneroXZebuCattleBreed": { "133821001": ("Mixed Perijanero X zebu cattle breed", [7480]) }, "MixedRacialGroup": {"414752008": ("Mixed racial group", [6099])}, "MixedSmallCellCarcinoma": {"21326004": ("Mixed small cell carcinoma", [638, 639])}, "MixedVenousBlood": {"116176007": ("Mixed Venous Blood", [3520])}, "Mixture": {"272163001": ("Mixture (qualifier value)", [])}, "MiyakoHorseBreed": {"133013006": ("Miyako horse breed", [7480])}, "Mode": {"373100007": ("Mode", [3627, 7464, 10072])}, "ModeNumericEstimationTechnique": { "373100007": ("Mode - numeric estimation technique (qualifier value)", []) }, "ModeneseCattleBreed": {"133519003": ("Modenese cattle breed", [7480])}, "Moderate": {"6736007": ("Moderate", [3716, 3832, 6130])}, "ModerateHypokinesis": {"371869002": ("Moderate Hypokinesis", [3703])}, "ModerateHypokinesisOfCardiacWall": { "371869002": ("Moderate hypokinesis of cardiac wall (finding)", []) }, "ModerateRisk": {"25594002": ("Moderate risk", [3118])}, "ModerateRiskOfContextualQualifier": { "25594002": ("Moderate risk of (contextual qualifier) (qualifier value)", []) }, "ModerateSeverityModifier": { "6736007": ("Moderate (severity modifier) (qualifier value)", []) }, "ModerateToHighRisk": {"429557002": ("Moderate to high risk", [3118])}, "ModerateToHighRiskOfContextualQualifier": { "429557002": ( "Moderate to high risk of (contextual qualifier) (qualifier value)", [], ) }, "ModerateToSevere": {"371924009": ("Moderate to Severe", [3716])}, "ModeratelyEnlargedCardiacChamber": { "373127006": ("Moderately enlarged cardiac chamber", [3122, 3705]) }, "ModicanaCattleBreed": {"131501004": ("Modicana cattle breed", [7480])}, "ModicanaLowlandCattleBreed": { "131552002": ("Modicana lowland cattle breed", [7480]) }, "ModifiedBruceProtocol": {"129096001": ("Modified Bruce protocol", [3261, 12001])}, "ModifiedNaughtonProtocol": { "129102008": ("Modified Naughton protocol", [3261, 12001]) }, "ModifiedTrichromeStain": {"406991004": ("modified trichrome stain", [8112])}, "MoghaniSheepBreed": {"132788007": ("Moghani sheep breed", [7480])}, "MoiCattleBreed": {"131502006": ("Moi cattle breed", [7480])}, "MolesPerUnitVolume": { "282258000": ("moles per unit volume (qualifier value)", []) }, "Molybdenum": {"71128006": ("Molybdenum", [10006, 10016, 10067])}, "MonarchPigBreed": {"132173007": ("Monarch pig breed", [7480])}, "MonchinaCattleBreed": {"133520009": ("Monchina cattle breed", [7480])}, "MongCaiPigBreed": {"132343008": ("Mong Cai pig breed", [7480])}, "MongallaCattleBreed": {"133729008": ("Mongalla cattle breed", [7480])}, "MongolianCattleBreed": {"133250000": ("Mongolian cattle breed", [7480])}, "MongolianHorseBreed": {"133014000": ("Mongolian horse breed", [7480])}, "MonitoredAnesthesiaCareMAC": { "398239001": ("Monitored Anesthesia Care (MAC)", [611, 612]) }, "MonitoredAnesthesiaCareSedation": { "398239001": ("Monitored anesthesia care sedation (procedure)", []) }, "MonitoringOfBloodPressureTemperaturePulseRateAndRespiratoryRateRegimeTherapy": { "304495004": ( "Monitoring of blood pressure, temperature, pulse rate and respiratory rate (regime/therapy)", [], ) }, "MonitoringOfElectrocardiogramAtSurgery": { "91096005": ("Monitoring of electrocardiogram at surgery (procedure)", []) }, "MonitoringOfRespirationRegimeTherapy": { "53617003": ("Monitoring of respiration (regime/therapy)", []) }, "MonoclonalAntibodyI124": {"423249007": ("Monoclonal antibody I^124^", [4021])}, "MonoclonalGammopathyOfUndeterminedSignificance": { "35601003": ( "Monoclonal gammopathy of undetermined significance (morphologic abnormality)", [], ) }, "MontafonCattleBreed": {"133521008": ("Montafon cattle breed", [7480])}, "MontanaPig": {"74517004": ("Montana pig (organism)", [])}, "MontanaPigBreed": {"74517004": ("Montana pig breed", [7480])}, "MontanaraCattleBreed": {"133590003": ("Montanara cattle breed", [7480])}, "MontbeliardCattleBreed": {"133522001": ("Montbeliard cattle breed", [7480])}, "MontdaleSheep": {"5164003": ("Montdale sheep (organism)", [])}, "MontdaleSheepBreed": {"5164003": ("Montdale sheep breed", [7480])}, "MontmorillonPigBreed": {"132191002": ("Montmorillon pig breed", [7480])}, "Moore": {"422568001": ("Moore", [4012])}, "MooreProjection": {"422568001": ("Moore projection (qualifier value)", [])}, "MoraRomagnolaPigBreed": {"132246002": ("Mora Romagnola pig breed", [7480])}, "MorabHorseBreed": {"133031007": ("Morab horse breed", [7480])}, "MoradaNovaSheepBreed": {"132803005": ("Morada Nova sheep breed", [7480])}, "MorangCattleBreed": {"133730003": ("Morang cattle breed", [7480])}, "MoravaPigBreed": {"133206001": ("Morava pig breed", [7480])}, "MoravianLargeYorkshirePigBreed": { "133216009": ("Moravian Large Yorkshire pig breed", [7480]) }, "MoreDefined": {"129729005": ("More defined", [6002, 6003, 6134])}, "MoreIschemia": {"429477006": ("More ischemia", [3235])}, "MorenasDelNoroesteCattleBreed": { "133523006": ("Morenas del Noroeste cattle breed", [7480]) }, "MorganHorse": {"21295007": ("Morgan horse (organism)", [])}, "MorganHorseBreed": {"21295007": ("Morgan horse breed", [7480])}, "Moribund": {"271593001": ("Moribund (finding)", [])}, "MorochucoHorseBreed": {"132773002": ("Morochuco horse breed", [7480])}, "Morphine": {"373529000": ("Morphine", [6089])}, "MorphologicallyAbnormalStructure": { "49755003": ( "Morphologically Abnormal Structure", [1000, 3487, 4266, 7150, 9502, 9580], ) }, "MorphologyWithinNormalLimits": { "125112009": ("Morphology within normal limits (finding)", []) }, "MorticeProjection": {"260497009": ("Mortice projection", [4012])}, "MoruchaCattleBreed": {"133251001": ("Morucha cattle breed", [7480])}, "MoscowLonghairedToyTerrierDogBreed": { "132442002": ("Moscow Longhaired Toy Terrier dog breed", [7480]) }, "MostSignificant": {"371925005": ("Most significant", [220])}, "MotilityStimulant": {"372607002": ("Motility stimulant (substance)", [])}, "MouflonSheep": {"45690005": ("Mouflon sheep (organism)", [])}, "MouflonSheepBreed": {"45690005": ("Mouflon sheep breed", [7480])}, "MountainCurDogBreed": {"132441009": ("Mountain Cur dog breed", [7480])}, "MouraPigBreed": {"132053000": ("Moura pig breed", [7480])}, "Mouth": {"123851003": ("Mouth", [4, 645, 7151, 7192, 8134, 9514])}, "MouthClosed": {"286866000": ("Mouth closed", [502, 4011])}, "MouthRegionStructure": { "123851003": ("Mouth region structure (body structure)", []) }, "MoxotóGoatBreed": {"131622000": ("Moxotó goat breed", [7480])}, "MoyleHorseBreed": {"133032000": ("Moyle horse breed", [7480])}, "MozambiqueAngoniCattleBreed": { "133737000": ("Mozambique Angoni cattle breed", [7480]) }, "MpwapwaCattleBreed": {"133738005": ("Mpwapwa cattle breed", [7480])}, "MubanPigBreed": {"132843000": ("Muban pig breed", [7480])}, "MucicarmineStain": {"406964001": ("mucicarmine stain", [8112])}, "MucinousAdenocarcinoma": { "72495009": ("Mucinous adenocarcinoma (morphologic abnormality)", []) }, "MucinousAdenocarcinomaColloidCarcinoma": { "72495009": ("Mucinous adenocarcinoma (Colloid carcinoma)", [6030, 6033]) }, "MucosaOfFloorOfMouth": {"36152006": ("Mucosa of floor of mouth", [4029, 8134])}, "MucosaOfLowerLip": {"46353006": ("Mucosa of lower lip", [4029, 8134])}, "MucosaOfMandibularGingiva": { "245823002": ("Mucosa of mandibular gingiva", [4029, 8134]) }, "MucosaOfMaxillaryGingiva": { "245814000": ("Mucosa of maxillary gingiva", [4029, 8134]) }, "MucosaOfTipOfTongue": {"245831007": ("Mucosa of tip of tongue", [4029, 8134])}, "MucosaOfTongue": {"8001006": ("Mucosa of tongue", [4029, 8134])}, "MucosaOfUpperLip": {"18444004": ("Mucosa of upper lip", [4029, 8134])}, "MudiDogBreed": {"132620006": ("Mudi dog breed", [7480])}, "MukotaPigBreed": {"132247006": ("Mukota pig breed", [7480])}, "MulefootPigBreed": {"132250009": ("Mulefoot pig breed", [7480])}, "MultiVesselCoronaryArteryDisease": { "371803003": ("Multi vessel coronary artery disease.", [3728]) }, "Multifocal": {"524008": ("Multifocal", [6128, 6335, 6336, 6337])}, "MultifocalPrematureVentricularComplexes": { "10626002": ("Multifocal premature ventricular complexes (disorder)", []) }, "MultifocalPvcs": {"10626002": ("Multifocal PVCs", [3234])}, "MultiparametricMRIOfProstate": { "719178004": ("Multiparametric MRI of prostate", [100]) }, "MultiparametricMagneticResonanceImagingOfProstate": { "719178004": ( "Multiparametric magnetic resonance imaging of prostate (procedure)", [], ) }, "MultipleAneurysm": {"125274006": ("multiple aneurysm", [3808])}, "MultipleAneurysms": { "125274006": ("Multiple aneurysms (morphologic abnormality)", []) }, "MultipleIrregularities": {"371922008": ("Multiple Irregularities", [3715])}, "MultipleMyeloma": {"1162576007": ("Multiple myeloma", [64])}, "MultipleMyelomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "55921005": ( "Multiple myeloma, no International Classification of Diseases for Oncology subtype (morphologic " "abnormality)", [], ) }, "MultiplePregnancy": {"16356006": ("Multiple pregnancy", [6087, 6088])}, "MunchkinLonghairCatBreed": {"132670009": ("Munchkin Longhair cat breed", [7480])}, "MunchkinShorthairCatBreed": { "132669008": ("Munchkin Shorthair cat breed", [7480]) }, "MunichMiniaturePigBreed": {"132360003": ("Munich Miniature pig breed", [7480])}, "MunsterLanderPointerDogBreed": { "132621005": ("Munster Lander Pointer dog breed", [7480]) }, "MuongKhuongPigBreed": {"132345001": ("Muong Khuong pig breed", [7480])}, "MurakozHorseBreed": {"131992007": ("Murakoz horse breed", [7480])}, "MurbodenCattleBreed": {"133268002": ("Murboden cattle breed", [7480])}, "MurcianCattleBreed": {"133524000": ("Murcian cattle breed", [7480])}, "MurcianPigBreed": {"132094008": ("Murcian pig breed", [7480])}, "MurcianaGranadinaGoatBreed": { "131698009": ("Murciana-Granadina goat breed", [7480]) }, "MurgeseHorse": {"406715003": ("Murgese horse (organism)", [])}, "MurgeseHorseBreed": {"406715003": ("Murgese horse breed", [7480])}, "MurgheseHorseBreed": {"132776005": ("Murghese horse breed", [7480])}, "MurinePoliovirus": {"42024000": ("Murine poliovirus (organism)", [])}, "MurleCattleBreed": {"133739002": ("Murle cattle breed", [7480])}, "Murmur": {"373112006": ("Murmur", [12246])}, "MurnauWerdenfelsCattleBreed": { "133525004": ("Murnau-Werdenfels cattle breed", [7480]) }, "MurrayGrayCattleBreed": {"133471008": ("Murray Gray cattle breed", [7480])}, "MusGenus": {"447482001": ("Mus genus", [7454])}, "MusMusculus": {"447612001": ("Mus musculus", [7454])}, "Muscle": {"71616004": ("Muscle", [6202, 6204, 8134, 10044, 10060])}, "MuscleBridge": {"424045003": ("Muscle Bridge", [3712])}, "MuscleOfHead": {"22688005": ("Muscle of head", [4028, 7151, 7192, 8134, 9514])}, "MuscleOfLowerLimb": { "102292000": ( "Muscle of lower limb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "MuscleOfNeck": {"81727001": ("Muscle of neck", [4028, 7151, 7192, 8134, 9514])}, "MuscleOfUpperLimb": { "30608006": ( "Muscle of upper limb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "MuscleTissue": {"91727004": ("Muscle", [7151, 7166, 7191])}, "Muscular": {"71616004": ("Muscular", [6100])}, "Muscular_Inactive": {"263816006": ("Muscular (qualifier value)", [])}, "MusculoskeletalExtensionFunction": { "24154002": ("Musculoskeletal extension, function (observable entity)", []) }, "MusculoskeletalTorsion": { "51795009": ("Musculoskeletal torsion (observable entity)", []) }, "MustangHorseBreed": {"133033005": ("Mustang horse breed", [7480])}, "MustardOperation": {"40250003": ("Mustard operation", [12247])}, "MustardOrSenningCommonSystemicVenousPathway": { "443809000": ("Mustard or Senning Common Systemic Venous Pathway", [12282]) }, "MustardOrSenningInferiorVenaCavaPathway": { "444329004": ("Mustard or Senning Inferior Vena Cava Pathway", [12282]) }, "MustardOrSenningPulmonaryVenousPathway": { "443907004": ("Mustard or Senning Pulmonary Venous Pathway", [12283]) }, "MustardOrSenningSuperiorVenaCavaPathway": { "444177009": ("Mustard or Senning Superior Vena Cava Pathway", [12282]) }, "MustelaPutoriusFuro": {"449310008": ("Mustela putorius furo", [7454])}, "MustelaPutoriusSubspeciesFuro": { "449310008": ("Mustela putorius subspecies furo (organism)", []) }, "MycoticAneurysm": {"51668007": ("mycotic aneurysm", [3808])}, "MyeloperoxidaseStain": {"255805004": ("myeloperoxidase stain", [8112])}, "MyocardialBridgeOfCoronaryArtery": { "424045003": ("Myocardial bridge of coronary artery (disorder)", []) }, "MyocardialInfarction": {"22298006": ("Myocardial Infarction", [3121])}, "MyocardialIschemia": {"414795007": ("Myocardial ischemia", [3121])}, "MyocardialIschemiaManifestOnStressTestStatusPostMyocardialInfarction": { "371824008": ( "Myocardial ischemia manifest on stress test status post myocardial infarction (finding)", [], ) }, "MyocardialPerfusion": { "251053005": ("Myocardial perfusion (observable entity)", []) }, "MyocardialPerfusionNormal": {"301121007": ("Myocardial perfusion normal", [3120])}, "MyocardialPerfusionStressImagingUsingThallium201": { "431511008": ( "Myocardial perfusion stress imaging using Thallium 201 (procedure)", [], ) }, "Myocarditis": {"50920009": ("Myocarditis", [3700])}, "MyocardiumOfAnterolateralRegion": { "73050001": ("myocardium of anterolateral region", [3718]) }, "MyocardiumOfApexOfHeart": {"47962008": ("myocardium of apex of heart", [3718])}, "MyocardiumOfDiaphragmaticRegion": { "72542009": ("myocardium of diaphragmatic region", [3718]) }, "MyocardiumOfInferolateralRegion": { "16239001": ("myocardium of inferolateral region", [3718]) }, "MyocardiumOfPosterolateralRegion": { "33272004": ("myocardium of posterolateral region", [3718]) }, "Myofibroblastoma": {"128738002": ("Myofibroblastoma", [6030, 6031])}, "Myopia": {"57190000": ("Myopia", [4238])}, "MyotonicGoatBreed": {"131623005": ("Myotonic goat breed", [7480])}, "MytileneHorseBreed": {"132777001": ("Mytilene horse breed", [7480])}, "N3MetastasisToIpsilateralInternalMammaryLymphNodes": { "369991007": ( "N3: Metastasis to ipsilateral internal mammary lymph node(s) (finding)", [], ) }, "NAcetylLAspartate": {"115391007": ("N-acetyl-L-aspartate (substance)", [])}, "NAcetylaspartate": { "115391007": ("N-acetylaspartate", [218, 4032, 4033, 7180, 7186, 7469]) }, "NDamaCattleBreed": {"133253003": ("N'dama cattle breed", [7480])}, "NDamaSangaCattleBreed": {"131505008": ("N'Dama Sanga cattle breed", [7480])}, "NGabouCattleBreed": {"133534009": ("N'Gabou cattle breed", [7480])}, "NGaoundereCattleBreed": {"133742008": ("N'Gaoundere cattle breed", [7480])}, "NSAID": {"372665008": ("NSAID", [621, 622])}, "NYHAClassI": {"420300004": ("NYHA Class I", [3736])}, "NYHAClassII": {"421704003": ("NYHA Class II", [3736])}, "NYHAClassIII": {"420913000": ("NYHA Class III", [3736])}, "NYHAClassIV": {"422293003": ("NYHA Class IV", [3736])}, "NachiGoatBreed": {"131624004": ("Nachi goat breed", [7480])}, "NadbuzanskaPigBreed": {"133226002": ("Nadbuzanska pig breed", [7480])}, "NagoriCattleBreed": {"133619009": ("Nagori cattle breed", [7480])}, "NailUnitOfFifthToe": {"770820003": ("Nail unit of fifth toe", [4029, 8134])}, "NailUnitOfFinger": {"770809003": ("Nail unit of finger", [4029, 8134])}, "NailUnitOfFourthToe": {"770821004": ("Nail unit of fourth toe", [4029, 8134])}, "NailUnitOfGreatToe": {"770822006": ("Nail unit of great toe", [4029, 8134])}, "NailUnitOfIndexFinger": {"770815003": ("Nail unit of index finger", [4029, 8134])}, "NailUnitOfLittleFinger": { "770818001": ("Nail unit of little finger", [4029, 8134]) }, "NailUnitOfMiddleFinger": { "770816002": ("Nail unit of middle finger", [4029, 8134]) }, "NailUnitOfRingFinger": {"770817006": ("Nail unit of ring finger", [4029, 8134])}, "NailUnitOfSecondToe": {"770823001": ("Nail unit of second toe", [4029, 8134])}, "NailUnitOfThirdToe": {"770825008": ("Nail unit of third toe", [4029, 8134])}, "NailUnitOfThumb": {"770810008": ("Nail unit of thumb", [4029, 8134])}, "NailUnitOfToe": {"770805009": ("Nail unit of toe", [4029, 8134])}, "NakaliCattleBreed": {"133740000": ("Nakali cattle breed", [7480])}, "NamaCattleBreed": {"131503001": ("Nama cattle breed", [7480])}, "NamibDesertHorseHorseBreed": { "132778006": ("Namib Desert Horse horse breed", [7480]) }, "NanjingBlackPigBreed": {"132334004": ("Nanjing Black pig breed", [7480])}, "NantaisCattleBreed": {"133532008": ("Nantais cattle breed", [7480])}, "NanyangCattleBreed": {"131504007": ("Nanyang cattle breed", [7480])}, "NaphthaleneBlack12BStain": {"16788000": ("naphthalene black 12B stain", [8112])}, "NaphtholASDChloracetateEsteraseStain": { "406973009": ("naphthol-AS-D-chloracetate esterase stain", [8112]) }, "NaphtholGreenBStain": {"14958002": ("naphthol green B stain", [8112])}, "NaphtholYellowSStain": {"111101002": ("naphthol yellow S stain", [8112])}, "NarcoticOpiateAntagonist": { "372656001": ("Narcotic (opiate) antagonist", [621, 622]) }, "Narrow": {"134223000": ("Narrow", [6107])}, "NarymHorseBreed": {"132960009": ("Narym horse breed", [7480])}, "NasalBone": { "74386004": ( "Nasal bone", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "NasalBoneStructure": {"74386004": ("Nasal bone structure (body structure)", [])}, "NasalCavity": {"279549004": ("nasal cavity", [7601, 8134])}, "NasalCavityStructure": { "279549004": ("Nasal cavity structure (body structure)", []) }, "NasalCongestion": {"68235000": ("Nasal Congestion", [60, 9300])}, "NasalRoute": {"46713006": ("Nasal route", [11])}, "NasalSinus": {"2095001": ("Nasal sinus", [7482, 7483, 8134])}, "NasalSinusStructure": {"2095001": ("Nasal sinus structure (body structure)", [])}, "NasalStructure": {"45206002": ("Nasal structure (body structure)", [])}, "NasolabialLymphNode": {"144026003": ("nasolabial lymph node", [7600, 8134])}, "Nasopharyngeal": {"71836000": ("nasopharynx", [7601, 8134])}, "Nasopharynx": {"360955006": ("Nasopharynx", [4, 4040, 7151, 7192, 8134, 9514])}, "NationalShowHorseHorseBreed": { "132997004": ("National Show Horse horse breed", [7480]) }, "NationalSpottedSaddleHorseHorseBreed": { "132961008": ("National Spotted Saddle Horse horse breed", [7480]) }, "NaturalBrother": {"60614009": ("Natural brother", [7450, 7451])}, "NaturalDaughter": {"83420006": ("Natural daughter", [7450, 7451])}, "NaturalFather": {"9947008": ("Natural father", [7450, 7451])}, "NaturalGrandFather": {"62296006": ("Natural grand-father", [7450, 7451])}, "NaturalGrandMother": {"17945006": ("Natural grand-mother", [7450, 7451])}, "NaturalGrandfather": {"62296006": ("Natural grandfather (person)", [])}, "NaturalGrandmother": {"17945006": ("Natural grandmother (person)", [])}, "NaturalMother": {"65656005": ("Natural mother", [7450, 7451])}, "NaturalSister": {"73678001": ("Natural sister", [7450, 7451])}, "NaturalSon": {"113160008": ("Natural son", [7450, 7451])}, "NaughtonProtocol": {"129101001": ("Naughton protocol", [3261, 12001])}, "Nausea": {"422587007": ("Nausea", [3220])}, "NauseaAndVomiting": {"16932000": ("Nausea and vomiting", [60, 9300])}, "NavajoChurroSheepBreed": {"131838009": ("Navajo-Churro sheep breed", [7480])}, "NavajoSheep": {"59210004": ("Navajo sheep (organism)", [])}, "NavajoSheepBreed": {"59210004": ("Navajo sheep breed", [7480])}, "NavicularOfForefoot": {"30518006": ("Navicular of forefoot", [7482, 7483, 8134])}, "NavicularOfHindfoot": {"75772009": ("Navicular of hindfoot", [7482, 7483, 8134])}, "NdaguCattleBreed": {"133817008": ("Ndagu cattle breed (organism)", [])}, "NdaguXZebuCattleBreed": {"133817008": ("Ndagu X zebu cattle breed", [7480])}, "NebelungCatBreed": {"132671008": ("Nebelung cat breed", [7480])}, "Neck": { "45048000": ("Neck", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "NeckAndChest": { "417437006": ( "Neck and Chest", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "NeckAndOrChestAndOrAbdomenAndOrPelvis": { "416319003": ( "Neck and/or chest and/or abdomen and/or pelvis (body structure)", [], ) }, "NeckAndOrChestAndOrAbdomenStructure": { "416152001": ("Neck and/or chest and/or abdomen structure (body structure)", []) }, "NeckAndOrChestStructure": { "417437006": ("Neck and/or chest structure (body structure)", []) }, "NeckChestAbdomenAndPelvis": { "416319003": ( "Neck, Chest, Abdomen and Pelvis", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "NeckChestAndAbdomen": { "416152001": ( "Neck, Chest and Abdomen", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "NeckOfRib": {"72184008": ("Neck of rib", [6115, 8134])}, "NeckStructure": {"45048000": ("Neck structure (body structure)", [])}, "Necrosis": {"6574001": ("Necrosis", [7151, 7159, 7168, 7194])}, "Needle": { "79068005": ("Needle", [69, 6102, 6138, 6202, 6203, 6404, 7151, 7157, 7193]) }, "NeedleDevice": {"79068005": ("Needle, device (physical object)", [])}, "Neer": {"422795009": ("Neer", [4012])}, "NeerProjection": {"422795009": ("Neer projection (qualifier value)", [])}, "Negative": {"260385009": ("Negative", [250])}, "NegativeLowerBodyPressure": { "128966001": ("Negative lower body pressure", [91, 3271]) }, "NegativeLowerBodyPressurePhysiologicChallenge": { "128966001": ( "Negative lower body pressure physiologic challenge (procedure)", [], ) }, "NegraSerranaGoatBreed": {"131612006": ("Negra Serrana goat breed", [7480])}, "NeijiangPigBreed": {"132249009": ("Neijiang pig breed", [7480])}, "NejdiCattleBreed": {"133533003": ("Nejdi cattle breed", [7480])}, "NelloreCattleBreed": {"76604009": ("Nellore cattle breed (organism)", [])}, "NelloreCowBreed": {"76604009": ("Nellore cow breed", [7480])}, "NeloreCattleBreed": {"133620003": ("Nelore cattle breed", [7480])}, "NeoAdjuvantIntent": {"373847000": ("Neo-adjuvant intent", [3629])}, "NeoAorta": {"14944004": ("Neo-aorta (primitive aorta)", [3604, 3606, 3630])}, "NeoaorticRoot": {"443726001": ("Neoaortic Root", [12289])}, "NeoaorticValve": {"443283007": ("Neoaortic Valve", [12289])}, "NeonatalIntensiveCare": {"405269005": ("Neonatal Intensive Care", [7030])}, "NeonatalIntensiveCareUnit": { "405269005": ("Neonatal intensive care unit (environment)", []) }, "NeonatalPulmonaryArteryPrimitivePA": { "91707000": ("Neonatal pulmonary artery (primitive PA)", [3604, 3606, 3630]) }, "Neoplasm": {"108369006": ("Neoplasm", [7151, 7159, 7194])}, "NeoplasmMetastatic": { "14799000": ("Neoplasm, metastatic (morphologic abnormality)", []) }, "NeoplasmOfColon": {"126838000": ("Neoplasm of colon (disorder)", [])}, "NeoplasmOfSkinOfBreast": { "126510002": ("Neoplasm of skin of breast (disorder)", []) }, "NeoplasmOfTheMammarySkin": { "126510002": ("Neoplasm of the mammary skin", [6030, 6033]) }, "NeoplasmPrimary": {"372087000": ("Neoplasm, Primary", [7151, 7159, 7194])}, "NeoplasmSecondary": {"14799000": ("Neoplasm, Secondary", [7151, 7159, 7194])}, "NeopolitanMastiffDogBreed": { "132599007": ("Neopolitan Mastiff dog breed", [7480]) }, "NepaleseHillZebuCattleBreed": { "133741001": ("Nepalese Hill Zebu cattle breed", [7480]) }, "Nephrology": {"309936008": ("Nephrology", [7030])}, "NephrologyDepartment": {"309936008": ("Nephrology department (environment)", [])}, "Nerve": {"91728009": ("Nerve", [7151, 7166, 7191])}, "NervePart": {"119410002": ("Nerve part (body structure)", [])}, "NeuroendocrineTumor": {"255046005": ("Neuroendocrine tumor", [638, 639])}, "Neurofibroma": {"404029005": ("Neurofibroma", [6030, 6031])}, "NeurofibromaNoInternationalClassificationOfDiseasesForOncologySubtype": { "89084002": ( "Neurofibroma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "Neurofibromatosis": {"81669005": ("Neurofibromatosis", [6030, 6031])}, "Neurohypophysis": { "37512009": ("Neurohypophysis", [7151, 7153, 7192, 8134, 9514]) }, "NeurohypophysisStructure": { "37512009": ("Neurohypophysis structure (body structure)", []) }, "Neurology": {"309937004": ("Neurology", [7030])}, "NeurologyDepartment": {"309937004": ("Neurology department (environment)", [])}, "NeuromuscularBlockingNMBDepolarizing": { "373250005": ("NeuroMuscular Blocking (NMB) - depolarizing", [621, 622]) }, "NeuromuscularBlockingNMBNonDepolarizing": { "372790002": ("NeuroMuscular Blocking (NMB) - non depolarizing", [621, 622]) }, "Neurosurgery": {"310159002": ("Neurosurgery", [7030])}, "NeurosurgicalService": { "310159002": ("Neurosurgical service (qualifier value)", []) }, "NeutralBufferedFormalin": {"434162003": ("Neutral Buffered Formalin", [8114])}, "NeutralRedStain": {"67956008": ("neutral red stain", [8112])}, "NeutrophilAlkalinePhosphataseStain": { "255806003": ("neutrophil alkaline phosphatase stain", [8112]) }, "NeverSmokedTobacco": {"266919005": ("Never smoked tobacco (finding)", [])}, "NewFinding": {"129721008": ("New finding", [6002, 6003])}, "NewFindingSincePreviousMammogram": { "129721008": ("New finding since previous mammogram (finding)", []) }, "NewForestPony": {"26699009": ("New Forest pony (organism)", [])}, "NewForestPonyHorseBreed": {"26699009": ("New Forest pony horse breed", [7480])}, "NewFuchsinStain": {"31714001": ("new fuchsin stain", [8112])}, "NewHuaiPigBreed": {"132136009": ("New Huai pig breed", [7480])}, "NewInfarction": {"429391004": ("New infarction", [3235])}, "NewIschemia": {"428927006": ("New ischemia", [3235])}, "NewKirgizHorseBreed": {"133010009": ("New Kirgiz horse breed", [7480])}, "NewLeftVentricularWallMotionAbnormalityComparedToPriorStudy": { "429058004": ( "New left ventricular wall motion abnormality compared to prior study (finding)", [], ) }, "NewMyocardialInfarctionComparedToPriorStudy": { "429391004": ("New myocardial infarction compared to prior study (finding)", []) }, "NewMyocardialIschemiaComparedToPriorStudy": { "428927006": ("New myocardial ischemia compared to prior study (finding)", []) }, "NewWallMotionAbnormality": {"429058004": ("New wall motion abnormality", [3237])}, "NewYorkHeartAssociationClassificationClassI": { "420300004": ( "New York Heart Association Classification - Class I (finding)", [], ) }, "NewYorkHeartAssociationClassificationClassII": { "421704003": ( "New York Heart Association Classification - Class II (finding)", [], ) }, "NewYorkHeartAssociationClassificationClassIII": { "420913000": ( "New York Heart Association Classification - Class III (finding)", [], ) }, "NewYorkHeartAssociationClassificationClassIV": { "422293003": ( "New York Heart Association Classification - Class IV (finding)", [], ) }, "NewYorkRedPigBreed": {"132268007": ("New York Red pig breed", [7480])}, "NewZealandHeadingDogBreed": { "132463000": ("New Zealand Heading Dog breed", [7480]) }, "NewZealandRabbitBreed": {"132901006": ("New Zealand rabbit breed", [7480])}, "NewfoundlandDog": {"52253003": ("Newfoundland dog", [7480])}, "NewfoundlandPonyHorseBreed": { "133036002": ("Newfoundland Pony horse breed", [7480]) }, "NewfoundlandSheepBreed": {"132701004": ("Newfoundland sheep breed", [7480])}, "NgandaCattleBreed": {"131506009": ("Nganda cattle breed", [7480])}, "NghiaBinhPigBreed": {"132368005": ("Nghia Binh pig breed", [7480])}, "NguniCattleBreed": {"131435004": ("Nguni cattle breed", [7480])}, "NickelCobaltChromium": {"261249004": ("Nickel cobalt chromium", [300])}, "NickelTitanium": {"261250004": ("Nickel Titanium", [7300, 9579])}, "Nifedipine": {"85272000": ("Nifedipine", [10])}, "NigerianDwarfGoatBreed": {"131625003": ("Nigerian Dwarf goat breed", [7480])}, "NigerianHorseBreed": {"132962001": ("Nigerian horse breed", [7480])}, "NigerianPigBreed": {"133186006": ("Nigerian pig breed", [7480])}, "NightBlueStain": {"406965000": ("night blue stain", [8112])}, "NileBlueStain": {"77073008": ("nile blue stain", [4412, 8112])}, "NiloCanastraPigBreed": {"132057004": ("Nilo-Canastra pig breed", [7480])}, "NiloPigBreed": {"132161007": ("Nilo pig breed", [7480])}, "NiloticSangaCattleBreed": {"131507000": ("Nilotic Sanga cattle breed", [7480])}, "NimariCattleBreed": {"133621004": ("Nimari cattle breed", [7480])}, "NinetiethPercentile": { "371887004": ("Ninetieth percentile (qualifier value)", []) }, "NinetyFifthPercentile": { "371889001": ("Ninety-fifth percentile (qualifier value)", []) }, "NingxiangPigBreed": {"132245003": ("Ningxiang pig breed", [7480])}, "NinthIntercostalSpace": {"117141000": ("Ninth Intercostal Space", [5])}, "Niobium": {"767776000": ("Niobium", [10006, 10067])}, "Nipple": {"24142002": ("Nipple", [6014, 6016, 6054])}, "NippleDischargeSymptom": {"162164007": ("Nipple discharge symptom", [6055])}, "NippleInProfile": {"442581004": ("Nipple in profile", [4015])}, "NippleInProfileMammographyView": { "442581004": ("Nipple in profile mammography view (qualifier value)", []) }, "NippleProblem": {"290119008": ("Nipple problem", [6055])}, "NippleRetraction": {"271955004": ("Nipple retraction", [6039, 6056])}, "NippleStructure": {"24142002": ("Nipple structure (body structure)", [])}, "NitraHybridPigBreed": {"133219002": ("Nitra Hybrid pig breed", [7480])}, "NitrateBasedVasodilatingAgent": { "372700007": ("Nitrate-based vasodilating agent (substance)", []) }, "NitrateVasodilator": {"372700007": ("Nitrate vasodilator", [3760])}, "NitrazineYellowStain": {"86750008": ("nitrazine yellow stain", [8112])}, "Nitroglycerin": {"71759000": ("Nitroglycerin", [10])}, "NitrousOxide": {"111132001": ("Nitrous oxide", [623, 624])}, "NkediCattleBreed": {"133743003": ("Nkedi cattle breed", [7480])}, "NkoneCattleBreed": {"131508005": ("Nkone cattle breed", [7480])}, "No": {"373067005": ("No", [230, 231])}, "NoChange": {"260388006": ("No change", [3235, 3236, 3237])}, "NoFamilyHistoryBreastCarcinoma": { "313376005": ("No family history: breast carcinoma (situation)", []) }, "NoFamilyHistoryCardiovascularDisease": { "160270001": ("No family history: Cardiovascular disease (situation)", []) }, "NoFamilyHistoryDiabetes": { "160274005": ("No family history diabetes (situation)", []) }, "NoFamilyHistoryOfBreastCarcinoma": { "313376005": ("No family history of breast carcinoma", [6081, 6087]) }, "NoFamilyHistoryOfCardiovascularDisease": { "160270001": ("No family history of cardiovascular disease", [3758]) }, "NoFamilyHistoryOfDiabetes": { "160274005": ("No family history of diabetes", [3758]) }, "NoHistoryOfSmoking": {"266919005": ("No History of Smoking", [3724])}, "NoMotorResponseToCommand": { "298336006": ("No motor response to command", [60, 9300]) }, "NoSignificantChangeSincePreviousMammogram": { "129723006": ("No significant change since previous mammogram (finding)", []) }, "NoSignificantChangesInTheFinding": { "129723006": ("No significant changes in the finding", [6002, 6003, 6134]) }, "NoStatusChange": {"260388006": ("No status change (qualifier value)", [])}, "NoTailSheep": {"112486002": ("No-tail sheep (organism)", [])}, "NoTailSheepBreed": {"112486002": ("No-tail sheep breed", [7480])}, "NoThrombus": {"373140001": ("No Thrombus", [3714])}, "NodeCategoryFinding": {"385382003": ("Node category finding (finding)", [])}, "Nodular": {"255288007": ("Nodular", [6132])}, "Nodule": { "27925004": ("Nodule", [6102, 6104, 6335, 6336, 6337, 7151, 7159, 7194]) }, "Nolke": {"399002000": ("Nolke", [4012])}, "NolkeProjection": {"399002000": ("Nolke projection (qualifier value)", [])}, "NomaHorseBreed": {"133037006": ("Noma horse breed", [7480])}, "NomarskiPrism": {"445633006": ("Nomarski prism", [8124])}, "NomarskiPrismOfOpticalMicroscope": { "445633006": ("Nomarski prism of optical microscope (physical object)", []) }, "Nominal": {"117362005": ("Nominal", [10072])}, "NominalValue": {"117362005": ("Nominal value (qualifier value)", [])}, "NonAlcoholicFattyLiver": { "197315008": ("Non-alcoholic fatty liver (disorder)", []) }, "NonCalcified": {"17589002": ("non-calcified", [3802])}, "NonCardiacChestPain": {"274668005": ("Non-cardiac chest pain (finding)", [])}, "NonCoronarySinus": {"24865005": ("Non-coronary Sinus", [12291])}, "NonElectricHeatingPad": {"39790008": ("Non-electric heating pad", [635])}, "NonElectricHeatingPadDevice": { "39790008": ("Non-electric heating pad, device (physical object)", []) }, "NonHodgkinLymphoma": {"1172592001": ("Non-Hodgkin's lymphoma", [6030, 6033])}, "NonHodgkinLymphomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "1929004": ( "Non-Hodgkin lymphoma, no International Classification of Diseases for Oncology subtype (morphologic " "abnormality)", [], ) }, "NonInfiltratingIntraductalCarcinoma": { "1162814007": ("Non-infiltrating intraductal carcinoma", [6159]) }, "NonRadiopaqueMedium": {"43538006": ("Non radiopaque medium", [12, 3850])}, "NonRestrictive": {"373131000": ("Non-restrictive", [3707])}, "NonRestrictiveVentricularSeptalDefect": { "373131000": ("Non-restrictive ventricular septal defect (disorder)", []) }, "NonSTElevationMyocardialInfarction": { "401314000": ("Non ST Elevation Myocardial Infarction", [3723]) }, "NonSmallCellCarcinoma": {"128632008": ("Non-small cell carcinoma", [638, 639])}, "NonSmallCellLungCancer": {"254637007": ("Non-small cell lung cancer", [638, 639])}, "NonSteroidalAntiInflammatoryAgent": { "372665008": ("Non-steroidal anti-inflammatory agent (substance)", []) }, "NonSustainedVentricularTachycardia": { "66657009": ("Non-sustained ventricular tachycardia", [3230]) }, "NonalcoholicFattyLiverDiseaseNAFLD": { "1231824009": ("Nonalcoholic fatty liver disease (NAFLD)", [12325]) }, "NonalcoholicFattyLiverNAFL": { "197315008": ("Nonalcoholic fatty liver (NAFL)", [12325]) }, "NonalcoholicSteatohepatitis": { "442685003": ("Nonalcoholic steatohepatitis (disorder)", []) }, "NonalcoholicSteatohepatitisNASH": { "442685003": ("Nonalcoholic steatohepatitis (NASH)", [12325]) }, "NoncardiacChestPain": {"274668005": ("Noncardiac Chest Pain", [3202, 3220])}, "NoncontactFundusLens": {"410685001": ("Noncontact fundus lens", [4205])}, "NondepolarizingAgent": {"372790002": ("Nondepolarizing agent (substance)", [])}, "None_": {"260413007": ("None", [606, 3707, 3716, 4253])}, "NonionicIodinatedContrastMedia": { "96388005": ("Nonionic iodinated contrast media (product)", []) }, "NoniusHorseBreed": {"133045001": ("Nonius horse breed", [7480])}, "NonspecificEsteraseStain": {"255807007": ("nonspecific esterase stain", [8112])}, "NonspecificSTTAbnormality": { "428750005": ("Nonspecific ST-T abnormality", [3230]) }, "NonspecificSTTAbnormalityOnElectrocardiogram": { "428750005": ("Nonspecific ST-T abnormality on electrocardiogram (finding)", []) }, "NooitgedachtHorseBreed": {"133046000": ("Nooitgedacht horse breed", [7480])}, "NooitgedachtPonyHorseBreed": { "133038001": ("Nooitgedacht Pony horse breed", [7480]) }, "NoordhollanderSheepBreed": {"132690000": ("Noordhollander sheep breed", [7480])}, "NorbottenspetsDogBreed": {"132592003": ("Norbottenspets dog breed", [7480])}, "NordlandHorseBreed": {"133039009": ("Nordland horse breed", [7480])}, "NorfolkHornSheepBreed": {"131837004": ("Norfolk Horn sheep breed", [7480])}, "NorfolkTerrier": {"62790004": ("Norfolk terrier", [7480])}, "Norgaard": {"399157000": ("Norgaard", [4012])}, "NorgaardProjection": { "399157000": ("Norgaard's projection (qualifier value)", []) }, "NoricHorseBreed": {"133040006": ("Noric horse breed", [7480])}, "NorlinePigBreed": {"132027008": ("Norline pig breed", [7480])}, "Normal": { "17621005": ( "Normal", [222, 242, 3119, 3210, 3211, 7151, 7159, 7165, 7168, 7169, 7194, 7196], ) }, "NormalAorticRoot": {"373132007": ("Normal Aortic Root", [3709])}, "NormalCoronaryArteries": {"371860003": ("Normal coronary arteries", [3728])}, "NormalExtracardiacTracerUptake": { "428552000": ("Normal extracardiac tracer uptake (finding)", []) }, "NormalExtracardiacUptake": {"428552000": ("Normal extracardiac uptake", [3116])}, "NormalGeneralBodyFunction": { "81323004": ("Normal general body function (finding)", []) }, "NormalLeftAndRightHeartHemodynamics": { "371858000": ("Normal left and right heart hemodynamics", [3728]) }, "NormalLeftHeartHemodynamics": { "371856001": ("Normal left heart hemodynamics", [3728]) }, "NormalLeftVentricularSystolicFunctionAndWallMotion": { "371857005": ( "Normal left ventricular systolic function and wall motion", [3728], ) }, "NormalOverallCardiacContractility": { "373129009": ("Normal overall cardiac contractility (finding)", []) }, "NormalRange": {"260395002": ("Normal Range", [3642])}, "NormalRangeLowerLimit": {"385524004": ("Normal Range Lower Limit", [223])}, "NormalRangeUpperLimit": {"371933006": ("Normal Range Upper Limit", [223])}, "NormalRespiratoryRhythm": {"5467003": ("normal respiratory rhythm", [3416])}, "NormalRightHeartHemodynamics": { "371859008": ("Normal right heart hemodynamics", [3728]) }, "NormalRisk": {"427986001": ("Normal risk", [3118])}, "NormalRiskOfContextualQualifier": { "427986001": ("Normal risk of (contextual qualifier) (qualifier value)", []) }, "NormalSaline": {"262003004": ("Normal saline (product)", [])}, "NormalShape": {"31842008": ("Normal shape", [6039])}, "NormalSinusRhythm": {"64730000": ("normal sinus rhythm", [3826])}, "NormalSizeCardiacChamber": { "373124004": ("Normal size cardiac chamber", [3122, 3705]) }, "NormalVentricularWallMotion": { "373122000": ("Normal ventricular wall motion (finding)", []) }, "NormalWallContractility": {"373129009": ("Normal wall contractility", [3706])}, "NormalWallMotion": {"373122000": ("Normal wall motion", [3703])}, "NormalityUndetermined": {"371934000": ("Normality Undetermined", [222, 242])}, "NormanCoachHorse": {"39532001": ("Norman coach horse (organism)", [])}, "NormanCoachHorseBreed": {"39532001": ("Norman coach horse breed", [7480])}, "NormandPigBreed": {"132251008": ("Normand pig breed", [7480])}, "NormandeCattleBreed": {"81267004": ("Normande cattle breed (organism)", [])}, "NormandieCowBreed": {"81267004": ("Normandie cow breed", [7480])}, "NormanzuCattleBreed": {"133818003": ("Normanzu cattle breed (organism)", [])}, "NormanzuXZebuCattleBreed": {"133818003": ("Normanzu X zebu cattle breed", [7480])}, "NorthAmericanShepherdDogBreed": { "132630002": ("North American Shepherd dog breed", [7480]) }, "NorthBangladeshGrayCattleBreed": { "133744009": ("North Bangladesh Gray cattle breed", [7480]) }, "NorthCaucasusPigBreed": {"132102003": ("North Caucasus pig breed", [7480])}, "NorthCountyCheviotSheep": { "87962009": ("North County cheviot sheep (organism)", []) }, "NorthCountyCheviotSheepBreed": { "87962009": ("North County cheviot sheep breed", [7480]) }, "NorthEastChinaSpottedPigBreed": { "132331007": ("North East China Spotted pig breed", [7480]) }, "NorthFinncattleCattleBreed": { "133535005": ("North Finncattle cattle breed", [7480]) }, "NorthFujianBlackAndWhitePigBreed": { "132282007": ("North Fujian Black-and-White pig breed", [7480]) }, "NorthMalawiAngoniCattleBreed": { "131509002": ("North Malawi Angoni cattle breed", [7480]) }, "NorthSiberianPigBreed": {"132114006": ("North Siberian pig breed", [7480])}, "NorthSomaliZebuCattleBreed": { "133745005": ("North Somali Zebu cattle breed", [7480]) }, "NorthSwedishHorseHorseBreed": { "133041005": ("North Swedish Horse horse breed", [7480]) }, "NorthSwedishTrotterHorseBreed": { "132963006": ("North Swedish Trotter horse breed", [7480]) }, "NortheasternHorseBreed": {"133042003": ("Northeastern horse breed", [7480])}, "NorthernArdennaisHorseBreed": { "133067000": ("Northern Ardennais horse breed", [7480]) }, "NorthernBlueCattleBreed": {"133326004": ("Northern Blue cattle breed", [7480])}, "NorwegianDunkerhoundDogBreed": { "132593008": ("Norwegian Dunkerhound dog breed", [7480]) }, "NorwegianElkhound": {"76994004": ("Norwegian elkhound", [7480])}, "NorwegianForestCatBreed": {"132672001": ("Norwegian Forest cat breed", [7480])}, "NorwegianFurSheepBreed": {"131836008": ("Norwegian Fur sheep breed", [7480])}, "NorwegianGoatBreed": {"131631000": ("Norwegian goat breed", [7480])}, "NorwegianLandracePig": {"42948007": ("Norwegian landrace pig (organism)", [])}, "NorwegianLandracePigBreed": {"42948007": ("Norwegian landrace pig breed", [7480])}, "NorwegianLundehundDogBreed": { "132629007": ("Norwegian Lundehund dog breed", [7480]) }, "NorwegianRedCattleBreed": {"133254009": ("Norwegian Red cattle breed", [7480])}, "NorwichTerrier": {"26332008": ("Norwich terrier", [7480])}, "NorwoodTypeOperation": {"233139006": ("Norwood type operation", [12247])}, "Nose": {"45206002": ("Nose", [4, 7151, 7192, 8134, 9514])}, "NotAdministered": {"371900001": ("Not Administered", [3742, 3743])}, "NotEvaluated": {"373121007": ("Not Evaluated", [3703])}, "NotFasting": {"440565004": ("Not Fasting", [12323])}, "NotPerformed": {"262008008": ("Not performed", [3208, 3209])}, "NotPregnant": {"60001007": ("not pregnant", [6096])}, "NotSignificant": {"371928007": ("Not significant", [220])}, "NotSteady": {"103361006": ("Not Steady", [4220])}, "NottinghamCombinedGrade": {"372276001": ("Nottingham Combined Grade", [6071])}, "NottinghamCombinedGradeCannotBeDetermined": { "384668003": ("Nottingham Combined Grade cannot be determined", [6069]) }, "NottinghamCombinedGradeI3To5Points": { "369790002": ("Nottingham Combined Grade I: 3-5 points", [6069]) }, "NottinghamCombinedGradeII6To7Points": { "369791003": ("Nottingham Combined Grade II: 6-7 points", [6069]) }, "NottinghamCombinedGradeIII8To9Points": { "369792005": ("Nottingham Combined Grade III: 8-9 points", [6069]) }, "NovaScotiaDuckTollingRetriever": { "26229008": ("Nova Scotia duck tolling retriever (organism)", []) }, "NovaScotiaDuckTollingRetrieverDogBreed": { "26229008": ("Nova Scotia duck tolling retriever dog breed", [7480]) }, "NubaMountainCattleBreed": { "133819006": ("Nuba Mountain cattle breed (organism)", []) }, "NubaMountainXZebuCattleBreed": { "133819006": ("Nuba Mountain X zebu cattle breed", [7480]) }, "NuclearFastRedStain": {"78869007": ("nuclear fast red stain", [8112])}, "NuclearMedicine": {"309938009": ("Nuclear Medicine", [7030])}, "NuclearMedicineCardiovascularStudy": { "108294005": ("Nuclear medicine cardiovascular study", [3108, 3206, 3757]) }, "NuclearMedicineDepartment": { "309938009": ("Nuclear medicine department (environment)", []) }, "NuclearMedicineDiagnosticProcedureOnCardiovascularSystem": { "108294005": ( "Nuclear medicine diagnostic procedure on cardiovascular system (procedure)", [], ) }, "NuclearMedicineDiagnosticProcedureOnNervousSystem": { "108300008": ( "Nuclear medicine diagnostic procedure on nervous system (procedure)", [], ) }, "NuclearMedicineProcedure": {"371572003": ("Nuclear medicine procedure", [6028])}, "Nucleus": {"84640000": ("Nucleus", [8135])}, "NucleusAccumbens": { "427667007": ("Nucleus Accumbens", [7140, 7151, 7153, 7192, 8134, 9514]) }, "NuerCattleBreed": {"131510007": ("Nuer cattle breed", [7480])}, "Nulliparous": {"102877006": ("Nulliparous", [6081, 6087])}, "NumberOfLesions": {"246206008": ("Number of lesions (observable entity)", [])}, "NumberOfOccurrences": { "246432004": ("Number of occurrences (qualifier value)", []) }, "NumberOfUmbilicalArteries": { "249192005": ("Number of umbilical arteries", [12279]) }, "NurasCattleBreed": {"131511006": ("Nuras cattle breed", [7480])}, "Nurse": {"106292003": ("Nurse", [7450, 7452])}, "Nutrition": {"364393001": ("Nutrition", [3774])}, "NutritionalObservable": { "364393001": ("Nutritional observable (observable entity)", []) }, "NyoroCattleBreed": {"131512004": ("Nyoro cattle breed", [7480])}, "OEAxillaryLymphadenopathy": { "164150006": ("O/E - axillary lymphadenopathy", [6055]) }, "OEBreastLumpPalpated": {"268951004": ("O/E - Breast lump palpated", [6055])}, "OELymphadenopathy": {"274303007": ("O/E - lymphadenopathy", [6055])}, "OICPig": {"9135003": ("OIC pig (organism)", [])}, "OICPigBreed": {"9135003": ("OIC pig breed", [7480])}, "OberhasliGoatBreed": {"131632007": ("Oberhasli goat breed", [7480])}, "Oblique": {"21114003": ("Oblique", [6, 501, 502, 6121, 6312])}, "ObliqueAxial": {"399004004": ("oblique axial", [501, 4010])}, "ObliqueAxialEmissiveProjection": {"399089007": ("Oblique axial", [26, 501])}, "ObliqueAxialProjection": { "399004004": ("Oblique axial projection (qualifier value)", []) }, "ObliqueBodyPosition": {"399366008": ("oblique", [21])}, "ObliqueCaudoCranial": {"399225005": ("oblique caudo-cranial", [501, 4010])}, "ObliqueCaudoCranialProjection": { "399225005": ("Oblique caudo-cranial projection (qualifier value)", []) }, "ObliqueCranioCaudal": {"399288005": ("oblique cranio-caudal", [501, 4010])}, "ObliqueCranioCaudalProjection": { "399288005": ("Oblique cranio-caudal projection (qualifier value)", []) }, "ObliqueLateral": {"260427002": ("Oblique lateral (qualifier value)", [])}, "ObliqueProjection": {"399182000": ("oblique", [501, 4010])}, "ObscuredLesion": { "129740002": ("Obscured lesion", [6006, 6007, 6335, 6341, 6342]) }, "ObstetricHistory": {"248983002": ("Obstetric history (observable entity)", [])}, "ObstetricUSScan": {"268445003": ("Obstetric US scan", [12024])}, "ObstetricalVersion": {"65240009": ("Obstetrical version (procedure)", [])}, "Obstetrics": {"309944008": ("Obstetrics", [7030])}, "ObstetricsAndGynecology": {"309942007": ("Obstetrics and Gynecology", [7030])}, "ObstetricsAndGynecologyDepartment": { "309942007": ("Obstetrics and gynecology department (environment)", []) }, "ObstetricsDepartment": {"309944008": ("Obstetrics department (environment)", [])}, "Obstruction": {"26036001": ("Obstruction (morphologic abnormality)", [])}, "ObturatorLymphNode": {"36086000": ("obturator lymph node", [7600, 8134])}, "OccipitalArtery": { "31145008": ( "Occipital artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "OccipitalBone": {"31640002": ("Occipital bone", [4028, 7151, 7192, 8134, 9514])}, "OccipitalBoneStructure": { "31640002": ("Occipital bone structure (body structure)", []) }, "OccipitalLobe": {"31065004": ("Occipital lobe", [7151, 7153, 7192, 8134, 9514])}, "OccipitalLobeStructure": { "31065004": ("Occipital lobe structure (body structure)", []) }, "OccipitalLymphNode": {"3916005": ("occipital lymph node", [7600, 8134])}, "OccipitalRegionOfScalp": { "700032006": ("Occipital region of scalp", [8134, 12022]) }, "OccipitalVein": { "32114007": ("Occipital vein", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "OcclusalProjection": {"260499007": ("Occlusal projection", [501, 4010])}, "Occlusion": {"26036001": ("occlusion", [3810])}, "OcclusionOfArtery": {"1386000": ("Occlusion of artery", [3413, 3754])}, "OcclusionOfCatheter": {"103714007": ("Occlusion of catheter", [9])}, "OcclusionOfPatentDuctusArteriosusUsingEmbolizationCoil": { "441676000": ( "Occlusion of patent ductus arteriosus using embolization coil (procedure)", [], ) }, "OccupationalRequirement": {"429060002": ("Occupational requirement", [3201])}, "Ocicat": {"63972001": ("Ocicat", [7480])}, "OcularLubricant": {"470091001": ("Ocular Lubricant", [621, 622])}, "OculomotorNerve": {"56193007": ("oculomotor nerve", [7706, 7710, 8134])}, "OculomotorNerveStructure": { "56193007": ("Oculomotor nerve structure (body structure)", []) }, "OffAxis": {"103341000": ("Off axis", [6, 501, 502])}, "OhminiPigBreed": {"133180000": ("Ohmini pig breed", [7480])}, "OilImmersionLens": {"445622008": ("Oil immersion lens", [8121])}, "OilImmersionLensOfOpticalMicroscope": { "445622008": ("Oil immersion lens of optical microscope (physical object)", []) }, "OilInVitreousCavity": {"247095003": ("Oil in vitreous cavity (finding)", [])}, "OilRedOStain": {"40808006": ("oil red O stain", [8112])}, "OldDanishBirdDogBreed": {"132594002": ("Old Danish Bird Dog breed", [7480])}, "OldEnglishSheepdog": {"87029004": ("Old English sheepdog", [7480])}, "OldFarmCollieDogBreed": {"132461003": ("Old Farm Collie dog breed", [7480])}, "OldFormatDachsundDogBreed": { "132595001": ("Old Format Dachsund dog breed", [7480]) }, "OldFormatManchesterTerrierDogBreed": { "132596000": ("Old Format Manchester Terrier dog breed", [7480]) }, "OldFormatMinToyPoodleDogBreed": { "132597009": ("Old Format Min/Toy Poodle dog breed", [7480]) }, "OldFormatSheepBreed": {"131835007": ("Old Format Sheep breed", [7480])}, "OldFormatWelshCorgiDogBreed": { "132598004": ("Old Format Welsh Corgi dog breed", [7480]) }, "OldGermanShepherdDogBreed": { "132462005": ("Old German Shepherd dog breed", [7480]) }, "OldNorwegianSheepBreed": {"131834006": ("Old Norwegian sheep breed", [7480])}, "OldSwedishSpottedPigBreed": { "132192009": ("Old Swedish Spotted pig breed", [7480]) }, "OldeEnglishBulldoggeDogBreed": { "132606004": ("Olde English Bulldogge dog breed", [7480]) }, "OldenburgHorseBreed": {"133011008": ("Oldenburg horse breed", [7480])}, "OleicAcidI125": {"22979004": ("Oleic acid I^125^", [25])}, "OlfactoryTract": {"3960005": ("olfactory tract", [7706, 7710, 8134])}, "OlfactoryTractStructure": { "3960005": ("Olfactory tract structure (body structure)", []) }, "OliventinaPigBreed": {"132193004": ("Oliventina pig breed", [7480])}, "OmentalBursa": {"113346000": ("Omental bursa", [4, 7151, 7192, 8134, 9514])}, "OmentalBursaStructure": { "113346000": ("Omental bursa structure (body structure)", []) }, "Omentum": {"27398004": ("Omentum", [4, 7151, 7154, 7192, 8134, 9514])}, "OmentumStructure": {"27398004": ("Omentum structure (body structure)", [])}, "OnAdmission": {"278307001": ("On admission", [31])}, "OnExaminationAxillaryLymphadenopathy": { "164150006": ("On examination - axillary lymphadenopathy (disorder)", []) }, "OnExaminationBreastLumpPalpated": { "268951004": ("On examination - breast lump palpated (finding)", []) }, "OnExaminationLens": {"309649001": ("On examination - lens (finding)", [])}, "OnExaminationLymphNodes": { "274303007": ("On examination - lymph nodes (finding)", []) }, "OnExaminationPoorVisualFixation": { "314348007": ("On examination - poor visual fixation (finding)", []) }, "OneStandardDeviationAboveMean": { "371917008": ("One standard deviation above mean (qualifier value)", []) }, "OneStandardDeviationBelowMean": { "371919006": ("One standard deviation below mean (qualifier value)", []) }, "OpaqueMarker": {"262301009": ("Opaque Marker", [6040, 6401, 7151, 7193])}, "OpenWoundOfLowerLimb": {"26947005": ("Open wound of lower limb", [3205])}, "OperatingMicroscope": {"102321001": ("Operating Microscope", [4202])}, "OperatingMicroscopeDevice": { "102321001": ("Operating microscope, device (physical object)", []) }, "OperationOnHeartValve": {"73544002": ("Operation on heart valve", [3721])}, "OperationOnPelvicRegionOfTrunk": { "609638001": ("Operation on pelvic region of trunk", [6320]) }, "OperativeProcedureOnPelvis": { "12745006": ("Operative procedure on pelvis (procedure)", []) }, "OperativeSite": {"43526002": ("Operative Site", [6201])}, "OphthalmicArtery": { "53549008": ( "Ophthalmic artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 4209, 7151, 7192, 8134, 9514, 12103, 12105, ], ) }, "OphthalmicEndoscope": {"409902001": ("Ophthalmic Endoscope", [4202])}, "OphthalmicPhenylephrine": { "386693003": ("Ophthalmic phenylephrine (product)", []) }, "Ophthalmology": {"309935007": ("Ophthalmology", [7030])}, "OpiateAntagonist": {"372656001": ("Opiate antagonist (substance)", [])}, "OpticCanal": { "55024004": ( "Optic canal", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "OpticCanalStructure": {"55024004": ("Optic canal structure (body structure)", [])}, "OpticChiasm": {"244453006": ("Optic chiasm", [7151, 7153, 7192, 8134, 9514])}, "OpticChiasma": {"244453006": ("Optic chiasma (body structure)", [])}, "OpticDiscStructure": {"81016008": ("Optic disc structure (body structure)", [])}, "OpticForamenProjection": { "272466003": ("Optic foramen projection (qualifier value)", []) }, "OpticNerve": {"18234004": ("optic nerve", [7706, 7710, 8134])}, "OpticNerveHead": {"81016008": ("Optic nerve head", [4209, 4211, 4266, 8134])}, "OpticNerveStructure": {"18234004": ("Optic nerve structure (body structure)", [])}, "OpticRadiation": { "70105001": ("Optic radiation", [7151, 7153, 7192, 7702, 7710, 8134, 9514]) }, "OpticTract": {"53238003": ("Optic tract", [7151, 7153, 7192, 8134, 9514])}, "OpticTractStructure": {"53238003": ("Optic tract structure (body structure)", [])}, "OpticalCoherenceTomographyScanner": { "392012008": ("Optical Coherence Tomography Scanner", [4210]) }, "Optometry": {"310105000": ("Optometry", [7030])}, "OptometryService": {"310105000": ("Optometry service (qualifier value)", [])}, "OralCavity": {"74262004": ("oral cavity", [7601, 8134])}, "OralCavityStructure": {"74262004": ("Oral cavity structure (body structure)", [])}, "OralMucosa": {"113277000": ("Oral mucosa", [4029, 8134, 10044, 10060])}, "OralMucousMembraneStructure": { "113277000": ("Oral mucous membrane structure (body structure)", []) }, "OralRoute": {"26643006": ("Oral route", [11])}, "OralSurgery": {"309974000": ("Oral Surgery", [7030])}, "OralSurgeryDepartment": { "309974000": ("Oral surgery department (environment)", []) }, "Orange": {"371242008": ("Orange", [4411])}, "OrangeColor": {"371242008": ("Orange color (qualifier value)", [])}, "OrangeGStain": {"54221006": ("orange G stain", [8112])}, "OrangeIIStain": {"25941002": ("orange II stain", [8112])}, "Orbit": {"363654007": ("Orbit", [12022])}, "OrbitalStructure": { "363654007": ( "Orbital structure", [ 4, 1000, 1001, 1002, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514, ], ) }, "OrbitoParietalProjection": { "399351005": ("Orbito-parietal projection (qualifier value)", []) }, "Orbitoparietal": {"399351005": ("orbitoparietal", [501, 4010])}, "OrceinStain": {"406966004": ("orcein stain", [8112])}, "OregonRexCatBreed": {"396505009": ("Oregon rex cat breed", [7480])}, "OrehlaDeColherPigBreed": {"132166002": ("Orehla de Colher pig breed", [7480])}, "Organ": {"91772007": ("Organ", [7151, 7166, 7191])}, "OrganParenchyma": {"91772007": ("Organ parenchyma (body structure)", [])}, "OrientalHorseHorseBreed": {"132964000": ("Oriental Horse horse breed", [7480])}, "OrientalLonghairCatBreed": {"132673006": ("Oriental Longhair cat breed", [7480])}, "OrientalShorthairedCat": {"24967003": ("Oriental shorthaired cat", [7480])}, "OriginOfVessel": {"397421006": ("Origin of vessel", [12116])}, "OrkneySheepBreed": {"131833000": ("Orkney sheep breed", [7480])}, "OrlovTrotterHorseBreed": {"133066009": ("Orlov Trotter horse breed", [7480])}, "OrobicaGoatBreed": {"131613001": ("Orobica goat breed", [7480])}, "OropaCattleBreed": {"133536006": ("Oropa cattle breed", [7480])}, "OropharyngealStructure": { "31389004": ("Oropharyngeal structure (body structure)", []) }, "OropharyngealTonsil": {"17861009": ("oropharyngeal tonsil", [7601, 8134])}, "Oropharynx": {"31389004": ("oropharynx", [7601, 8134])}, "OrthopedicDepartment": {"309989009": ("Orthopedic department (environment)", [])}, "OrthopedicDevice": {"16349000": ("Orthopedic device", [1000])}, "OrthopedicSurgery": {"309989009": ("Orthopedic Surgery", [7030])}, "OrthostaticBodyPosition": { "10904000": ("Orthostatic body position (finding)", []) }, "OryctolagusCuniculus": {"36571002": ("Oryctolagus cuniculus", [7454])}, "OsmiumTetroxide": {"13931001": ("Osmium tetroxide", [8114])}, "Osmolality": {"56953008": ("Osmolality (observable entity)", [])}, "OssabawIslandPigBreed": {"132237008": ("Ossabaw Island pig breed", [7480])}, "Ossification": {"83323007": ("Ossification", [6132])}, "OssimiSheepBreed": {"132858008": ("Ossimi sheep breed", [7480])}, "Osteosarcoma": {"1163405004": ("Osteosarcoma", [638, 639, 6030, 6033])}, "OsteosarcomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "21708004": ( "Osteosarcoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "Ostium": {"264114003": ("Ostium", [3019, 3837, 7111])}, "OstiumOfCoronarySinus": {"71271007": ("Ostium of coronary sinus", [3011, 8134])}, "Otorhinolaryngology": {"309978002": ("Otorhinolaryngology", [7030])}, "OtterHound": {"58116005": ("Otter hound", [7480])}, "Ottonello": {"399171008": ("Ottonello", [4012])}, "OttonelloProjection": { "399171008": ("Ottonello projection (qualifier value)", []) }, "OuessantSheepBreed": {"132688001": ("Ouessant sheep breed", [7480])}, "OulmesBlondCattleBreed": {"133537002": ("Oulmes Blond cattle breed", [7480])}, "OutaouaisArcottSheepBreed": { "132857003": ("Outaouais Arcott sheep breed", [7480]) }, "OutpatientProcedure": {"371883000": ("Outpatient procedure", [3671])}, "Outward": {"255543005": ("Outward", [4214])}, "OvalShapedLesion": {"129734009": ("Oval shaped lesion (finding)", [])}, "OvamboCattleBreed": {"131513009": ("Ovambo cattle breed", [7480])}, "OvarianArtery": { "12052000": ( "Ovarian Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125, 12140], ) }, "OvarianCancer": {"363443007": ("Ovarian cancer", [638, 639])}, "OvarianFollicleStructure": { "24162005": ("Ovarian follicle structure (body structure)", []) }, "OvarianStructure": {"15497006": ("Ovarian structure (body structure)", [])}, "OvarianVein": { "976004": ( "Ovarian vein", [3827, 7151, 7192, 8134, 9514, 12103, 12113, 12125, 12140], ) }, "Ovary": { "15497006": ( "Ovary", [4, 645, 6202, 6204, 7151, 7160, 7192, 8134, 9514, 10044, 10060], ) }, "OverbedTrapezeDevice": { "422915004": ("Overbed trapeze device (physical object)", []) }, "OvineSpecies": {"36295001": ("Ovine species (organism)", [])}, "Ovis": {"388254009": ("Ovis", [7454])}, "OvisAries": {"125099002": ("Ovis aries", [7454])}, "OvoidShape": {"84360004": ("Ovoid shape", [6335, 6339, 6340])}, "OvoidShapeOval": {"84360004": ("Ovoid shape (Oval)", [6004, 6005])}, "OwczarekPodhalandskiDogBreed": { "132591005": ("Owczarek Podhalandski dog breed", [7480]) }, "OxfordDownSheep": {"53360003": ("Oxford Down sheep (organism)", [])}, "OxfordDownSheepBreed": {"53360003": ("Oxford Down sheep breed", [7480])}, "OxfordSandyBlockPig": {"5227002": ("Oxford sandy block pig (organism)", [])}, "OxfordSandyBlockPigBreed": {"5227002": ("Oxford sandy block pig breed", [7480])}, "Oxygen": {"24099007": ("Oxygen", [12, 13, 3850])}, "OxygenAdministrationByMask": { "371908008": ("Oxygen Administration by mask", [3531]) }, "OxygenAdministrationByNasalCannula": { "371907003": ("Oxygen Administration by nasal cannula", [3531]) }, "OxygenGas": {"320917000": ("Oxygen gas", [623, 629])}, "OxygenO14": {"424875009": ("Oxygen O^14^ (substance)", [])}, "OxygenO15": {"129504001": ("Oxygen O^15^", [4021])}, "OxygenTherapy": {"57485005": ("Oxygen Therapy", [617, 618])}, "OxygenWaterO15": {"129505000": ("Oxygen-water O^15^", [4021])}, "Oxytocic": {"410937004": ("Oxytocic", [621, 622])}, "OxytocicAgent": {"410937004": ("Oxytocic agent (substance)", [])}, "PETBrainStudy": {"764666002": ("PET brain study", [3108])}, "PETBreastStudy": {"416323006": ("PET breast study", [3108])}, "PETCTFDGImagingOfWholeBody": { "443271005": ("PET/CT FDG imaging of whole body", [100]) }, "PETCTMETImagingOfWholeBody": { "764704008": ("PET/CT MET imaging of whole body", [100]) }, "PETHeartStudy": {"241439007": ("PET heart study", [3108, 3206, 3757])}, "PETStudyForLocalizationOfTumor": { "241443006": ("PET study for localization of tumor", [3108]) }, "PR1050PigBreed": {"132212003": ("PR 1050 pig breed", [7480])}, "PR1075PigBreed": {"132213008": ("PR 1075 pig breed", [7480])}, "PRK": {"397516006": ("PRK", [4234])}, "PTENHamartomaTumorSyndrome": { "722859001": ("PTEN hamartoma tumor syndrome", [4405]) }, "PTSMCu62": {"422789008": ("PTSM Cu^62^", [4021])}, "PTV": {"228793007": ("PTV", [9534])}, "PabnaCattleBreed": {"133820000": ("Pabna cattle breed (organism)", [])}, "PabnaXZebuCattleBreed": {"133820000": ("Pabna X zebu cattle breed", [7480])}, "PacedStressTest": {"428685003": ("Paced stress test", [3200])}, "PacemakerPulseGenerator": { "118378005": ("Cardiac Pacemaker", [6040, 6401, 7151, 7193]) }, "Pacing": {"18590009": ("Pacing", [91, 3271, 3555])}, "PacingWithMagnet": {"371909000": ("pacing with magnet", [3555])}, "PageBlue83Stain": {"5442001": ("page blue 83 stain", [8112])}, "PageBlueG90Stain": {"2088005": ("page blue G-90 stain", [8112])}, "PagetDiseaseMammary": { "2985005": ("Paget's disease, mammary (of the nipple)", [6030, 6033]) }, "PagliarolaSheepBreed": {"131830002": ("Pagliarola sheep breed", [7480])}, "PainManagement": {"309949003": ("Pain Management", [7030])}, "PainManagementDepartment": { "309949003": ("Pain management department (environment)", []) }, "PainOfBreast": {"53430007": ("Pain of breast (finding)", [])}, "PainScore": {"225908003": ("Pain score (observable entity)", [])}, "PainfulSkin": {"403598008": ("Painful skin", [4406])}, "PajunaCattleBreed": {"133538007": ("Pajuna cattle breed", [7480])}, "PalatineBone": {"51283005": ("Palatine bone", [4028, 7151, 7192, 8134, 9514])}, "PalatineBoneStructure": { "51283005": ("Palatine bone structure (body structure)", []) }, "PalatineTonsil": {"75573002": ("palatine tonsil", [7601, 8134])}, "PaleComplexion": {"398979000": ("Pale complexion (finding)", [])}, "PalliativeCare": {"309939001": ("Palliative Care", [7030])}, "PalliativeCareDepartment": { "309939001": ("Palliative care department (environment)", []) }, "PalliativeIntent": {"363676003": ("Palliative Intent", [3629])}, "PalliativeProcedureIntent": { "363676003": ("Palliative - procedure intent (qualifier value)", []) }, "PallorPaleComplexion": {"398979000": ("Pallor (Pale Complexion)", [60, 9300])}, "Palmar45DegreeMedialDorsolateral": { "442740009": ("Palmar 45 degree medial-dorsolateral", [7484]) }, "Palmar45DegreeMedialDorsolateralProjection": { "442740009": ( "Palmar 45 degree medial-dorsolateral projection (qualifier value)", [], ) }, "Palmar75DegreeProximalDorsodistalOblique": { "442591005": ("Palmar 75 degree proximal-dorsodistal oblique", [7484]) }, "Palmar75DegreeProximalDorsodistalObliqueProjection": { "442591005": ( "Palmar 75 degree proximal-dorsodistal oblique projection (qualifier value)", [], ) }, "PalmaromedialDorsolateral": {"442742001": ("Palmaromedial-dorsolateral", [7484])}, "PalmaromedialDorsolateralProjection": { "442742001": ("Palmaromedial-dorsolateral projection (qualifier value)", []) }, "PalmaroproximalDorsodistalOblique": { "442674000": ("Palmaroproximal-dorsodistal oblique", [7484]) }, "PalmaroproximalDorsodistalObliqueProjection": { "442674000": ( "Palmaroproximal-dorsodistal oblique projection (qualifier value)", [], ) }, "PalmeraCattleBreed": {"133539004": ("Palmera cattle breed", [7480])}, "PalmitateC11": {"129514005": ("Palmitate C^11^", [4021])}, "PalominoHorse": {"41738000": ("Palomino horse (organism)", [])}, "PalominoHorseBreed": {"41738000": ("Palomino horse breed", [7480])}, "PalousePig": {"49240006": ("Palouse pig (organism)", [])}, "PalousePigBreed": {"49240006": ("Palouse pig breed", [7480])}, "Palpation": {"113011001": ("Palpation", [3442])}, "Palpitations": {"80313002": ("Palpitations", [3201, 12246])}, "PanamaSheep": {"13934009": ("Panama sheep (organism)", [])}, "PanamaSheepBreed": {"13934009": ("Panama sheep breed", [7480])}, "Pancreas": { "15776009": ( "Pancreas", [ 4, 645, 1000, 1001, 1005, 4009, 4030, 4031, 4042, 7151, 7154, 7192, 8134, 9514, 10044, 10060, 12321, ], ) }, "PancreaticDuct": { "69930009": ( "Pancreatic duct", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7154, 7192, 8134, 9514], ) }, "PancreaticDuctAndBileDuctSystems": { "110621006": ( "Pancreatic duct and bile duct systems", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7154, 7192, 8134, 9514], ) }, "PancreaticDuctAndBileDuctSystemsCombinedSite": { "110621006": ( "Pancreatic duct and bile duct systems (combined site) (body structure)", [], ) }, "PancreaticDuctStructure": { "69930009": ("Pancreatic duct structure (body structure)", []) }, "PancreaticLymphNode": {"77778009": ("pancreatic lymph node", [7600, 8134])}, "PancreaticStructure": {"15776009": ("Pancreatic structure (body structure)", [])}, "PancreaticoduodenalLymphNode": { "76659008": ("pancreaticoduodenal lymph node", [7600, 8134]) }, "PancreaticosplenicLymphNode": { "16050005": ("pancreaticosplenic lymph node", [7600, 8134]) }, "Pancuronium": {"373738000": ("Pancuronium", [623, 627])}, "PanjeHorseBreed": {"132971005": ("Panje horse breed", [7480])}, "PankotaRedCattleBreed": {"133540002": ("Pankota Red cattle breed", [7480])}, "PantaneiroCattleBreed": {"133673003": ("Pantaneiro cattle breed", [7480])}, "PantaneiroHorseBreed": {"133065008": ("Pantaneiro horse breed", [7480])}, "PantelleriaCattleBreed": {"131514003": ("Pantelleria cattle breed", [7480])}, "Papaverine": {"372784001": ("Papaverine", [10, 65])}, "PaphosCattleBreed": {"133541003": ("Paphos cattle breed", [7480])}, "PapillaryCarcinoma": { "25910003": ("Papillary carcinoma (invasive)", [6030, 6033]) }, "PapillaryCarcinomaInSitu": { "10376009": ("Papillary carcinoma in-situ", [6030, 6033]) }, "PapillaryThyroidCarcinoma": { "255029007": ("Papillary thyroid carcinoma", [638, 639]) }, "Papilloma": {"711329002": ("Papilloma", [6030, 6031])}, "PapillomaNoInternationalClassificationOfDiseasesForOncologySubtypeExceptPapillomaOfBladderM81201": { "23730008": ( "Papilloma, no International Classification of Diseases for Oncology subtype " "(except papilloma of bladder M-81201) (morphologic abnormality)", [], ) }, "PapillonDog": {"41263004": ("Papillon dog", [7480])}, "ParaAorticLymphNodeOfTheAnteriorMediastinum": { "127939003": ( "para-aortic lymph node of the anterior mediastinum", [7600, 8134], ) }, "ParaesophagealLymphNodeBelowCarina": { "127940001": ("paraesophageal lymph node below carina", [7600, 8134]) }, "Paraffin": {"255667006": ("Paraffin (substance)", [])}, "ParaffinWax": {"311731000": ("Paraffin wax", [8115])}, "Paraformaldehyde": {"52836003": ("Paraformaldehyde", [8114])}, "ParalyticSyndrome": {"29426003": ("Paralytic syndrome", [3205])}, "ParamammaryLymphNode": {"368550005": ("paramammary lymph node", [7600, 8134])}, "ParametrialLymphNode": {"3243006": ("parametrial lymph node", [7600, 8134])}, "ParanasalSinus": { "2095001": ( "Paranasal sinus", [4, 4009, 4028, 4030, 4031, 4040, 4042, 7151, 7192, 7601, 9514], ) }, "Paraproteinemia": {"35601003": ("Paraproteinemia", [64])}, "PararectalLymphNode": {"21875007": ("pararectal lymph node", [7600, 8134])}, "Parasagittal": {"103343002": ("Parasagittal", [5, 6, 501, 502])}, "Parasternal": {"91691001": ("Parasternal", [4, 7151, 7192, 8134, 9514])}, "ParasternalLongAxis": {"399139001": ("Parasternal long axis", [501, 12226])}, "ParasternalLongAxisView": { "399139001": ("Parasternal long axis view (qualifier value)", []) }, "ParasternalLongAxisViewOfRightVentricularInflowTract": { "443082005": ( "Parasternal long axis view of right ventricular inflow tract (qualifier value)", [], ) }, "ParasternalLongAxisViewOfRightVentricularOutflowTract": { "443083000": ( "Parasternal long axis view of right ventricular outflow tract (qualifier value)", [], ) }, "ParasternalLongAxisViewOfTheRVInflowTract": { "443082005": ("Parasternal long axis view of the RV inflow tract", [501, 12226]) }, "ParasternalLongAxisViewOfTheRVOutflowTract": { "443083000": ( "Parasternal long axis view of the RV outflow tract", [501, 12226], ) }, "ParasternalLymphNode": {"82365008": ("parasternal lymph node", [7600, 8134])}, "ParasternalShortAxis": {"399306005": ("Parasternal short axis", [501, 12226])}, "ParasternalShortAxisAtTheAorticValveLevel": { "399239005": ("Parasternal short axis at the aortic valve level", [501, 12226]) }, "ParasternalShortAxisAtTheLevelOfTheMitralChords": { "399371001": ( "Parasternal short axis at the level of the mitral chords", [501, 12226], ) }, "ParasternalShortAxisAtTheMitralValveLevel": { "399036006": ("Parasternal short axis at the Mitral Valve level", [501, 12226]) }, "ParasternalShortAxisAtThePapillaryMuscleLevel": { "399271003": ( "Parasternal short axis at the Papillary Muscle level", [501, 12226], ) }, "ParasternalShortAxisView": { "399306005": ("Parasternal short axis view (qualifier value)", []) }, "ParasternalShortAxisViewAtTheAorticValveLevel": { "399239005": ( "Parasternal short axis view at the aortic valve level (qualifier value)", [], ) }, "ParasternalShortAxisViewAtTheLevelOfTheMitralChords": { "399371001": ( "Parasternal short axis view at the level of the mitral chords (qualifier value)", [], ) }, "ParasternalShortAxisViewAtTheMitralValveLevel": { "399036006": ( "Parasternal short axis view at the mitral valve level (qualifier value)", [], ) }, "ParasternalShortAxisViewAtThePapillaryMuscleLevel": { "399271003": ( "Parasternal short axis view at the papillary muscle level (qualifier value)", [], ) }, "Parathyroid": {"111002": ("Parathyroid", [4, 4030, 7151, 7192, 8134, 9514])}, "ParathyroidStructure": {"111002": ("Parathyroid structure (body structure)", [])}, "ParatrachealLymphNode": {"65690001": ("paratracheal lymph node", [7600, 8134])}, "ParavaginalLymphNode": {"16228004": ("paravaginal lymph node", [7600, 8134])}, "ParavesicularLymphNode": {"1439000": ("paravesicular lymph node", [7600, 8134])}, "Parenchyma": {"91772007": ("Parenchyma", [5])}, "ParenteralEnteralSolutionBag": { "464557001": ("Parenteral/enteral solution bag", [68]) }, "ParietalBone": {"24924006": ("Parietal bone", [4028, 7151, 7192, 8134, 9514])}, "ParietalBoneStructure": { "24924006": ("Parietal bone structure (body structure)", []) }, "ParietalLobe": {"16630005": ("Parietal lobe", [7151, 7153, 7192, 8134, 9514])}, "ParietalLobeStructure": { "16630005": ("Parietal lobe structure (body structure)", []) }, "ParietoOrbital": {"399316002": ("parieto-orbital", [501, 4010])}, "ParietoOrbitalProjection": { "399316002": ("Parieto-orbital projection (qualifier value)", []) }, "Parietoacanthial": {"399272005": ("parietoacanthial", [501, 4010])}, "ParietoacanthialProjection": { "399272005": ("Parietoacanthial projection (qualifier value)", []) }, "ParmensePigBreed": {"132194005": ("Parmense pig breed", [7480])}, "ParotidGland": { "45289007": ( "Parotid gland", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "ParotidGlandStructure": { "45289007": ("Parotid gland structure (body structure)", []) }, "ParotidLymphNode": {"10209003": ("parotid lymph node", [7600, 8134])}, "ParoxysmalVentricularTachycardia": { "66657009": ("Paroxysmal ventricular tachycardia (disorder)", []) }, "ParthenaisCattleBreed": {"133255005": ("Parthenais cattle breed", [7480])}, "PartiColorCockerSpaniel": { "58888001": ("Parti-color cocker spaniel (organism)", []) }, "PartiColorCockerSpanielDogBreed": { "58888001": ("Parti-color cocker spaniel dog breed", [7480]) }, "Partial": {"255609007": ("Partial (qualifier value)", [])}, "PartialAnomalousPulmonaryVenousConnection": { "68237008": ("Partial anomalous pulmonary venous connection", [12248, 12249]) }, "PartialAnomalousPulmonaryVenousConnectionOperation": { "174900004": ( "Partial anomalous pulmonary venous connection operation", [12247], ) }, "PartiallyReversibleMyocardialPerfusionDefect": { "251056002": ("Partially Reversible myocardial perfusion defect", [3113]) }, "PasoFinoHorse": {"56086005": ("Paso Fino horse (organism)", [])}, "PasoFinoHorseBreed": {"56086005": ("Paso Fino horse breed", [7480])}, "PassiveMovement": {"21278004": ("Passive movement", [93])}, "PastHistoryOfProcedure": { "416940007": ("Past history of procedure (situation)", []) }, "PasternOfForefoot": {"31329001": ("Pastern of forefoot", [7482, 7483, 8134])}, "PasternOfHindfoot": {"18525008": ("Pastern of hindfoot", [7482, 7483, 8134])}, "PasternRegionOfHindfoot": { "18525008": ("Pastern region of hindfoot (body structure)", []) }, "Patella": { "64234005": ( "Patella", [ 4, 1000, 1001, 1006, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514, ], ) }, "PatellarTendon": {"18033002": ("Patellar Tendon", [12321])}, "PatentBlueVSodiumSaltStain": { "48540004": ("patent blue V sodium salt stain", [4412, 8112]) }, "PatentDuctusArteriosus": { "83330001": ( "Patent ductus arteriosus", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514, 12293], ) }, "PatentDuctusArteriosusCoilOrDeviceClosure": { "441676000": ("Patent ductus arteriosus coil or device closure", [12247]) }, "PatentForamenOvale": {"204317008": ("Patent Foramen Ovale", [12284])}, "Paternal": {"224944003": ("Paternal", [6097])}, "PathologicCalcification": { "18115005": ("pathologic calcification", [3802, 6335, 6336, 6337, 6338]) }, "PathologicCalcificationCalcifiedStructure": { "18115005": ( "Pathologic calcification, calcified structure (morphologic abnormality)", [], ) }, "Pathology": {"309950003": ("Pathology", [7030])}, "PathologyDepartment": {"309950003": ("Pathology department (environment)", [])}, "PatibarcinaHorseBreed": {"132972003": ("Patibarcina horse breed", [7480])}, "PatientCurrentlyPregnant": { "77386006": ("Patient currently pregnant", [1200, 1201, 6096]) }, "PatientHasPacemaker": {"441509002": ("Patient has pacemaker", [3205, 12323])}, "PatientImmunocompromised": {"370388006": ("Patient immunocompromised", [602])}, "PatientMentalStateAssessment": { "363871006": ("Patient mental state assessment", [3441]) }, "PatientRefusedExerciseTest": { "408551003": ("Patient Refused exercise test", [3221]) }, "PatterdaleTerrierDogBreed": { "132404008": ("Patterdale Terrier dog breed", [7480]) }, "Pawlow": {"399181007": ("Pawlow", [4012])}, "PawlowProjection": {"399181007": ("Pawlow projection (qualifier value)", [])}, "PeacockGoatBreed": {"131633002": ("Peacock goat breed", [7480])}, "PeakCardiacStressState": { "434161005": ("Peak cardiac stress state", [3207, 12002]) }, "PeakSystolic": {"255236000": ("Peak Systolic", [12233])}, "PeakSystolicFunction": { "255236000": ("Peak systolic, function (observable entity)", []) }, "PeakToPeak": {"371914001": ("Peak to peak", [3627])}, "PeakToPeakNumericEstimationTechnique": { "371914001": ( "Peak to peak - numeric estimation technique (qualifier value)", [], ) }, "Pearson": {"399365007": ("Pearson", [4012])}, "PearsonProjection": {"399365007": ("Pearson projection (qualifier value)", [])}, "PeauDOrangeSurfaceOfBreast": { "87386002": ("Peau d'orange surface of breast", [6055]) }, "PechoraCattleBreed": {"133399003": ("Pechora cattle breed", [7480])}, "PechoraHorseBreed": {"132973008": ("Pechora horse breed", [7480])}, "PectoralAxillaryLymphNode": { "69691007": ("pectoral axillary lymph node", [7600, 8134]) }, "PectoralGirdle": {"26444007": ("Pectoral girdle", [6115, 8134])}, "PectoralisMajorMuscle": { "60005003": ( "Pectoralis major muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "PectoralisMajorMuscleStructure": { "60005003": ("Pectoralis major muscle structure (body structure)", []) }, "PectoralisMinorMuscle": { "18686000": ( "Pectoralis minor muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "PectoralisMinorMuscleStructure": { "18686000": ("Pectoralis minor muscle structure (body structure)", []) }, "PediatricEchocardiography": {"431852008": ("Pediatric echocardiography", [12001])}, "PediatricIntensiveCare": {"309910001": ("Pediatric Intensive Care", [7030])}, "PediatricIntensiveCareUnit": { "309910001": ("Pediatric intensive care unit (environment)", []) }, "PediatricMedicine": {"420223003": ("Pediatric Medicine", [7030])}, "PediatricMedicineDepartment": { "420223003": ("Pediatric medicine department (environment)", []) }, "PediatricOncology": {"309948006": ("Pediatric Oncology", [7030])}, "PediatricOncologyDepartment": { "309948006": ("Pediatric oncology department (environment)", []) }, "PediatricSurgery": {"309991001": ("Pediatric Surgery", [7030])}, "PediatricSurgicalDepartment": { "309991001": ("Pediatric surgical department (environment)", []) }, "PedicleOfVertebra": {"78972004": ("Pedicle of vertebra", [6115, 8134])}, "Pedunculated": {"25126001": ("Pedunculated", [6209])}, "PeeWeeCattleBreed": {"133400005": ("Pee Wee cattle breed", [7480])}, "Peeling": {"271767006": ("Peeling", [4406])}, "PeelingOfSkin": {"271767006": ("Peeling of skin (finding)", [])}, "PekingeseDog": {"67684001": ("Pekingese dog", [7480])}, "PelibüeySheepBreed": {"132802000": ("Pelibüey sheep breed", [7480])}, "PeloponnesusCattleBreed": {"133401009": ("Peloponnesus cattle breed", [7480])}, "PelvicCavityFalse": { "816990003": ("Pelvic cavity, false", [7151, 7160, 7192, 8134, 9514]) }, "PelvicCavityFalseAndOrTrue": { "816989007": ("Pelvic cavity, false and/or true", [7160, 8134]) }, "PelvicCavityStructure": { "21844003": ("Pelvic cavity structure (body structure)", []) }, "PelvicCavityTrue": { "816991004": ("Pelvic cavity, true", [7151, 7160, 7192, 8134, 9514]) }, "PelvicLymphNode": {"54268001": ("pelvic lymph node", [7600, 8134])}, "PelvicLymphNodeStructure": { "54268001": ("Pelvic lymph node structure (body structure)", []) }, "PelvicStructure": {"12921003": ("Pelvic structure (body structure)", [])}, "PelvicVascularStructure": { "281496003": ("Pelvic vascular structure (body structure)", []) }, "Pelvis": { "816092008": ( "Pelvis", [4, 4009, 4030, 4031, 4042, 7151, 7160, 7192, 7482, 7483, 8134, 9514], ) }, "PelvisAndLowerExtremities": { "1231522001": ( "Pelvis and lower extremities", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "PelvisAndOrLowerExtremityStructure": { "416631005": ("Pelvis and/or lower extremity structure (body structure)", []) }, "PelónPigBreed": {"132169009": ("Pelón pig breed", [7480])}, "PembrokeWelshCorgi": {"46725009": ("Pembroke Welsh corgi (organism)", [])}, "PembrokeWelshCorgiDogBreed": { "46725009": ("Pembroke Welsh corgi dog breed", [7480]) }, "PenArLan77PigBreed": {"132091000": ("Pen ar Lan 77 pig breed", [7480])}, "PenbukPigBreed": {"132142008": ("Penbuk pig breed", [7480])}, "PeneiaHorseBreed": {"132974002": ("Peneia horse breed", [7480])}, "PenicillinAntibiotic": {"373270004": ("Penicillin antibiotic", [621, 622])}, "PenicillinClassOfAntibiotic": { "373270004": ("Penicillin -class of antibiotic- (substance)", []) }, "PenileStructure": {"18911002": ("Penile structure (body structure)", [])}, "Penis": {"18911002": ("Penis", [4, 7151, 7192, 8134, 9514])}, "Penner": {"399138009": ("Penner", [4012])}, "PennerProjection": {"399138009": ("Penner projection (qualifier value)", [])}, "PenshirePigBreed": {"132092007": ("Penshire pig breed", [7480])}, "PentetateCalciumTrisodiumYb169": { "29348008": ("Pentetate calcium trisodium Yb^169^", [25]) }, "Pentobarbital": {"372703009": ("Pentobarbital", [623, 625])}, "PepperProtocol": {"129100000": ("Pepper protocol", [3261, 12001])}, "PerRectum": {"37161004": ("Per rectum", [11, 613, 614])}, "PercheronHorse": {"1006005": ("Percheron horse (organism)", [])}, "PercheronHorseBreed": {"1006005": ("Percheron horse breed", [7480])}, "PercutaneousCoronaryIntervention": { "415070008": ("Percutaneous coronary intervention", [3721, 3764]) }, "PercutaneousInsertionOfIntravascularFilter": { "105373008": ("Percutaneous insertion of intravascular filter", [9, 3405]) }, "PercutaneousProstheticClosureOfAtrialSeptalDefect": { "30123000": ("Percutaneous prosthetic closure of atrial septal defect", [12247]) }, "PercutaneousRemovalOfEndovascularForeignBody": { "240946003": ( "Percutaneous removal of endovascular foreign body (procedure)", [], ) }, "PercutaneousRemovalOfIntravascularForeignBody": { "240946003": ("Percutaneous removal of intravascular foreign body", [9, 3405]) }, "PercutaneousTransluminalAngioplastyBalloon": { "102319006": ( "Percutaneous transluminal angioplasty balloon", [8, 3411, 3429, 4051, 7151, 7193], ) }, "PercutaneousTransluminalAngioplastyBalloonDevice": { "102319006": ( "Percutaneous transluminal angioplasty balloon, device (physical object)", [], ) }, "PercutaneousTransluminalBalloonAngioplasty": { "68457009": ("Percutaneous transluminal balloon angioplasty", [9, 3405]) }, "PercutaneousTransluminalBalloonAngioplastyOfCoarctationOfAortaWithInsertionOfStent": { "443829004": ( "Percutaneous transluminal balloon angioplasty of coarctation of aorta with insertion of stent " "(procedure)", [], ) }, "PerdigueiroPortugueseDogBreed": { "132443007": ("Perdigueiro Portuguese dog breed", [7480]) }, "PerdigueroDeBurgosDogBreed": { "132600005": ("Perdiguero de Burgos dog breed", [7480]) }, "PerdigueroNavarroDogBreed": { "132601009": ("Perdiguero Navarro dog breed", [7480]) }, "PerendaleSheep": {"41706005": ("Perendale sheep (organism)", [])}, "PerendaleSheepBreed": {"41706005": ("Perendale sheep breed", [7480])}, "PerforatingArteryOfKidney": { "15763003": ( "Perforating Artery of Kidney", [3827, 7151, 7192, 8134, 9514, 12103, 12115], ) }, "Perfusion": {"371863001": ("Perfusion", [7151, 7161, 7195])}, "PerfusionFinding": {"371863001": ("Perfusion finding (finding)", [])}, "PerfusionImaging": {"35202002": ("Perfusion imaging (nuclear)", [3757])}, "PerianganHorseBreed": {"132975001": ("Periangan horse breed", [7480])}, "PericardialCavity": { "25489000": ("Pericardial cavity", [7151, 7152, 7192, 8134, 9514]) }, "PericardialCavityStructure": { "25489000": ("Pericardial cavity structure (body structure)", []) }, "PericardialDisease": {"55855009": ("Pericardial disease", [3700])}, "PericardialEffusion": {"373945007": ("Pericardial effusion", [12236])}, "PericardialStructure": { "76848001": ("Pericardial structure (body structure)", []) }, "PericardialTamponade": {"35304003": ("Pericardial tamponade", [3700, 3728])}, "PericardiophrenicArtery": { "3924000": ( "Pericardiophrenic Artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "Pericardium": {"76848001": ("Pericardium", [7151, 7152, 7192, 8134, 9514, 12294])}, "PerigastricLymphNode": {"245344006": ("perigastric lymph node", [7600, 8134])}, "Perimeter": {"131191004": ("Perimeter", [218, 6165, 7469, 7470])}, "PerinealStructure": {"38864007": ("Perineal structure (body structure)", [])}, "Perineum": {"38864007": ("Perineum", [4, 7151, 7192, 8134, 9514])}, "PeriodOfCollection": {"260867005": ("Period of collection (qualifier value)", [])}, "PeriodicAcidSchiffStain": {"255808002": ("periodic acid Schiff stain", [8112])}, "PeripancreaticLymphNode": { "245346008": ("peripancreatic lymph node", [7600, 8134]) }, "Peripheral": {"14414005": ("Peripheral", [2, 5, 6124, 6125])}, "PeripheralAngiography": {"271993009": ("peripheral angiography", [3820])}, "PeripheralIntravenousCatheter": { "82449006": ("Peripheral intravenous catheter", [74]) }, "PeripheralIntravenousCatheterDevice": { "82449006": ("Peripheral intravenous catheter, device (physical object)", []) }, "PeripheralNerve": { "84782009": ("Peripheral nerve", [7151, 7167, 7192, 7710, 8134, 9514]) }, "PeripheralNerveMyelinSheath": { "61005006": ("Peripheral nerve myelin sheath", [645, 8134]) }, "PeripheralNerveStructure": { "84782009": ("Peripheral nerve structure (body structure)", []) }, "PeripheralNervousSystem": { "3058005": ("Peripheral nervous system", [7151, 7167, 7192, 8134, 9514]) }, "PeripheralNervousSystemStructure": { "3058005": ("Peripheral nervous system structure (body structure)", []) }, "PeripheralVascularDisease": { "400047006": ("Peripheral vascular disease", [3205, 3756]) }, "PeripheralVascularUltrasoundReport": { "48526000": ("Peripheral Vascular Ultrasound Report", [7000, 12100]) }, "PeripheralZoneOfTheProstate": { "279706003": ("Peripheral zone of the prostate", [6300]) }, "Peritioneum": {"15425007": ("Peritioneum", [7151, 7154, 7192, 8134, 9514])}, "PeritonealCavity": { "83670000": ("Peritoneal cavity", [7151, 7154, 7192, 8134, 9514]) }, "PeritonealCavityStructure": { "83670000": ("Peritoneal cavity structure (body structure)", []) }, "PeritoneumSerousMembraneStructure": { "15425007": ("Peritoneum (serous membrane) structure (body structure)", []) }, "PermanentMaxillaryLeftCanineTooth": { "860780009": ("Permanent maxillary left canine tooth", [4018, 4026]) }, "PermanentMaxillaryLeftCentralIncisorTooth": { "424399000": ("Permanent maxillary left central incisor tooth", [4018, 4026]) }, "PermanentMaxillaryLeftFirstMolarTooth": { "865988009": ("Permanent maxillary left first molar tooth", [4018, 4026]) }, "PermanentMaxillaryLeftFirstPremolarTooth": { "61897005": ("Permanent maxillary left first premolar tooth", [4018, 4026]) }, "PermanentMaxillaryLeftLateralIncisorTooth": { "423185002": ("Permanent maxillary left lateral incisor tooth", [4018, 4026]) }, "PermanentMaxillaryLeftSecondMolarTooth": { "863901004": ("Permanent maxillary left second molar tooth", [4018, 4026]) }, "PermanentMaxillaryLeftSecondPremolarTooth": { "23226009": ("Permanent maxillary left second premolar tooth", [4018, 4026]) }, "PermanentMaxillaryLeftThirdMolarTooth": { "87704003": ("Permanent maxillary left third molar tooth", [4018, 4026]) }, "PermanentMaxillaryRightCanineTooth": { "860767006": ("Permanent maxillary right canine tooth", [4018, 4026]) }, "PermanentMaxillaryRightCentralIncisorTooth": { "422653006": ("Permanent maxillary right central incisor tooth", [4018, 4026]) }, "PermanentMaxillaryRightFirstMolarTooth": { "865995000": ("Permanent maxillary right first molar tooth", [4018, 4026]) }, "PermanentMaxillaryRightFirstPremolarTooth": { "57826002": ("Permanent maxillary right first premolar tooth", [4018, 4026]) }, "PermanentMaxillaryRightLateralIncisorTooth": { "424877001": ("Permanent maxillary right lateral incisor tooth", [4018, 4026]) }, "PermanentMaxillaryRightSecondMolarTooth": { "863902006": ("Permanent maxillary right second molar tooth", [4018, 4026]) }, "PermanentMaxillaryRightSecondPremolarTooth": { "36492000": ("Permanent maxillary right second premolar tooth", [4018, 4026]) }, "PermanentMaxillaryRightThirdMolarTooth": { "68085002": ("Permanent maxillary right third molar tooth", [4018, 4026]) }, "Permethrin": {"410457007": ("permethrin", [8112])}, "PermethrinStain": {"333111009": ("Permethrin stain (substance)", [])}, "PernaCurtaPigBreed": {"132163005": ("Perna-Curta pig breed", [7480])}, "PeronealArtery": { "8821006": ( "Peroneal artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109, ], ) }, "PeronealVein": { "71758008": ("Peroneal Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110]) }, "PeroxidaseStain": {"406974003": ("peroxidase stain", [8112])}, "PerpendicularAxis": {"131189007": ("Perpendicular Axis", [218, 6165, 7469, 7470])}, "PersianArabHorseBreed": {"132976000": ("Persian Arab horse breed", [7480])}, "PersianCat": {"68086001": ("Persian cat", [7480])}, "PersistentPainFollowingProcedure": { "279047007": ("Persistent pain following procedure", [6062]) }, "PersonalHistoryOfBreastCancer": { "415076002": ("Personal history of breast cancer", [6051]) }, "PersonalHistoryOfPrimaryMalignantNeoplasmOfBreast": { "415076002": ( "Personal history of primary malignant neoplasm of breast (situation)", [], ) }, "PeruvianIncaOrchidDogBreed": { "132602002": ("Peruvian Inca Orchid dog breed", [7480]) }, "PeruvianPasoHorse": {"4960000": ("Peruvian Paso horse (organism)", [])}, "PeruvianPasoHorseBreed": {"4960000": ("Peruvian Paso horse breed", [7480])}, "PesterCattleBreed": {"133402002": ("Pester cattle breed", [7480])}, "PetisoArgentinoHorseBreed": { "132977009": ("Petiso Argentino horse breed", [7480]) }, "PetitBassetGriffonVendeenDog": { "47542005": ("Petit basset griffon vendeen dog", [7480]) }, "PetitBassetGriffonVendéenDog": { "47542005": ("Petit Basset Griffon Vendéen dog (organism)", []) }, "PetitBleuDeGascogneDogBreed": { "132603007": ("Petit Bleu de Gascogne dog breed", [7480]) }, "PetitBrabaçonDogBreed": {"132405009": ("Petit Brabaçon dog breed", [7480])}, "PetitGasconSaintongeoisDogBreed": { "132604001": ("Petit Gascon-Saintongeois dog breed", [7480]) }, "PetitGriffonBleuDeGascogneDogBreed": { "132605000": ("Petit Griffon Bleu de Gascogne dog breed", [7480]) }, "PhakicIOL": {"397559001": ("Phakic IOL", [4231])}, "PhakicIntraocularLensImplant": { "397559001": ("Phakic intraocular lens implant (physical object)", []) }, "Phantom": { "706342009": ( "Phantom", [ 4, 4009, 4030, 4031, 4042, 4051, 4052, 7151, 7192, 7710, 8134, 9514, 10060, ], ) }, "PharaohHound": {"14876008": ("Pharaoh hound", [7480])}, "PharmacologicAndExerciseStressTest": { "428813002": ( "Pharmacologic and exercise stress test", [3200, 3261, 3757, 12001], ) }, "PharmacologicStressProtocol": { "424064009": ("Pharmacologic Stress protocol", [3261, 12001]) }, "PharmacologicStressTest": {"424064009": ("Pharmacologic stress test", [3200])}, "PharmacologicalStressTest": {"424064009": ("Pharmacological stress test", [3757])}, "PharmacologicalStressUsed": { "246489000": ("Pharmacological stress used (attribute)", []) }, "PharyngealRecess": {"1849007": ("pharyngeal recess", [7601, 8134])}, "PharyngealStructure": {"54066008": ("Pharyngeal structure (body structure)", [])}, "PharyngealTonsil": {"55940004": ("pharyngeal tonsil", [7601, 8134])}, "PharyngotympanicTube": {"91207004": ("pharyngotympanic tube", [7601, 8134])}, "Pharynx": {"54066008": ("Pharynx", [4, 4040, 7151, 7192, 8134, 9514])}, "PharynxAndLarynx": { "312535008": ("Pharynx and larynx", [4, 4040, 7151, 7192, 8134, 9514]) }, "PharynxAndOrLarynxStructures": { "312535008": ("Pharynx and/or larynx structures (body structure)", []) }, "PhaseContrastPlate": {"445625005": ("Phase contrast plate", [8124])}, "PhaseContrastPlateOfOpticalMicroscope": { "445625005": ( "Phase contrast plate of optical microscope (physical object)", [], ) }, "Phencyclidine": {"9721008": ("Phencyclidine", [6089])}, "Phentolamine": {"372863003": ("Phentolamine", [10])}, "Phenylephrine": {"386693003": ("Phenylephrine", [4208])}, "PhilippineGoatBreed": {"131634008": ("Philippine goat breed", [7480])}, "PhilippineNativeCattleBreed": { "131436003": ("Philippine Native cattle breed", [7480]) }, "PhilippineNativeIlocosPigBreed": { "132083009": ("Philippine Native, Ilocos pig breed", [7480]) }, "PhilippineNativeJalajalaPigBreed": { "132084003": ("Philippine Native, Jalajala pig breed", [7480]) }, "PhilippineNativePigBreed": {"132223004": ("Philippine Native pig breed", [7480])}, "Phlebosclerosis": {"18016009": ("phlebosclerosis", [3817])}, "PhloxinBStain": {"71957009": ("phloxin B stain", [8112])}, "Phonation": {"43914001": ("Phonation", [91])}, "PhosphotungsticAcidHematoxylinStain": { "406967008": ("phosphotungstic acid-hematoxylin stain", [8112]) }, "PhotodynamicTherapyOfSkin": { "428604001": ("Photodynamic therapy of skin", [4409]) }, "PhotographyMicroscopic": { "60287000": ("Photography, microscopic (procedure)", []) }, "PhotographyOfGrossOrgan": {"52432005": ("Photography of gross organ", [8131])}, "PhotographyOfPatient": {"197157006": ("Photography of patient", [8131])}, "Photomicrography": {"60287000": ("Photomicrography", [8131])}, "Photon": {"290006006": ("Photon", [9525])}, "PhotorefractiveKeratectomy": { "397516006": ("Photorefractive keratectomy (procedure)", []) }, "PhyllodesTumor": {"71232009": ("Phyllodes tumor", [6030, 6032])}, "PhyllodesTumorBorderline": { "71232009": ("Phyllodes tumor, borderline (morphologic abnormality)", []) }, "PhyllodesTumorMalignant": { "87913009": ("Phyllodes tumor, malignant", [6030, 6033]) }, "PhysicalObject": {"260787004": ("Physical object", [7150, 9501, 9502, 9580])}, "Physician": {"309343006": ("Physician", [7450, 7452, 9536, 9555, 9562])}, "PhysiologicalMonitoringRegimeRegimeTherapy": { "281691001": ("Physiological monitoring regime (regime/therapy)", []) }, "Physiotherapy": {"310464005": ("Physiotherapy", [7030])}, "PhysiotherapyDepartment": { "310464005": ("Physiotherapy department (environment)", []) }, "PiaMater": {"23180006": ("Pia mater", [5, 7151, 7153, 7192, 8134, 9514])}, "PiaMaterStructure": {"23180006": ("Pia mater structure (body structure)", [])}, "PiauCarunchoPiauPigBreed": { "132064002": ("Piau, Caruncho Piau pig breed", [7480]) }, "PiauPigBreed": {"132056008": ("Piau pig breed", [7480])}, "PiauSorocabaPigBreed": {"132160008": ("Piau, Sorocaba pig breed", [7480])}, "PicCambourghPig": {"17717005": ("Pic Cambourgh pig (organism)", [])}, "PicCambourghPigBreed": {"17717005": ("Pic Cambourgh pig breed", [7480])}, "PicLinePig24": {"86440008": ("Pic line pig 24 (organism)", [])}, "PicLinePig24PigBreed": {"86440008": ("Pic line pig 24 pig breed", [7480])}, "PicLinePig26": {"29235007": ("Pic line pig 26 (organism)", [])}, "PicLinePig26PigBreed": {"29235007": ("Pic line pig 26 pig breed", [7480])}, "PicPig": {"75709004": ("Pic pig (organism)", [])}, "PicPigBreed": {"75709004": ("Pic pig breed", [7480])}, "PicricAcid": {"24215009": ("Picric acid", [8114])}, "PieRougeDeLEstCattleBreed": { "133403007": ("Pie Rouge de l'Est cattle breed", [7480]) }, "PieRougeDesPlainesCattleBreed": { "133563007": ("Pie Rouge des Plaines cattle breed", [7480]) }, "PietrainPig": {"20044005": ("Pietrain pig (organism)", [])}, "PietrainPigBreed": {"20044005": ("Pietrain pig breed", [7480])}, "PigghamPigBreed": {"132267002": ("Piggham pig breed", [7480])}, "PiggybackIOL": {"370951003": ("Piggyback IOL", [4231])}, "PiggybackIntraocularLens": { "370951003": ("Piggyback intraocular lens (finding)", []) }, "Pin": {"77444004": ("Pin", [6102, 6138, 6202, 6203, 6404])}, "PindosHorseBreed": {"132984001": ("Pindos horse breed", [7480])}, "PindosPonyBreed": {"424111008": ("Pindos pony breed (organism)", [])}, "PindosPonyHorseBreed": {"424111008": ("Pindos pony horse breed", [7480])}, "PinealGland": {"45793000": ("Pineal Gland", [7151, 7153, 7192, 8134, 9514])}, "PinealStructure": {"45793000": ("Pineal structure (body structure)", [])}, "PineywoodsPigBreed": {"132037003": ("Pineywoods pig breed", [7480])}, "PinholeVisualAcuity": {"419475002": ("Pinhole Visual Acuity", [4216])}, "Pink": {"371243003": ("Pink", [4411])}, "PinkColor": {"371243003": ("Pink color (qualifier value)", [])}, "PintabianHorseBreed": {"133064007": ("Pintabian horse breed", [7480])}, "Pinto": {"58264006": ("Pinto (organism)", [])}, "PintoHorseBreed": {"58264006": ("Pinto horse breed", [7480])}, "PinzgauerCattleBreed": {"400003": ("Pinzgauer cattle breed (organism)", [])}, "PinzgauerCowBreed": {"400003": ("Pinzgauer cow breed", [7480])}, "PinzhouCattleBreed": {"131515002": ("Pinzhou cattle breed", [7480])}, "PinziritaSheepBreed": {"132851002": ("Pinzirita sheep breed", [7480])}, "PiquiraPonyHorseBreed": {"132985000": ("Piquira Pony horse breed", [7480])}, "PirapetingaPigBreed": {"132055007": ("Pirapetinga pig breed", [7480])}, "Pirie": {"399022001": ("Pirie", [4012])}, "PirieProjection": {"399022001": ("Pirie projection (qualifier value)", [])}, "PisanaCattleBreed": {"133404001": ("Pisana cattle breed", [7480])}, "PitangueirasCattleBreed": { "133822008": ("Pitangueiras cattle breed (organism)", []) }, "PitangueirasXZebuCattleBreed": { "133822008": ("Pitangueiras X zebu cattle breed", [7480]) }, "PitmanMooreMiniaturePigBreed": { "132040003": ("Pitman-Moore Miniature pig breed", [7480]) }, "PittIslandSheepBreed": {"132849001": ("Pitt Island sheep breed", [7480])}, "Pituitary": {"56329008": ("Pituitary", [7151, 7153, 7192, 8134, 9514])}, "PituitaryFossa": {"42575006": ("Pituitary Fossa", [1000, 1001, 1002])}, "PituitaryStructure": {"56329008": ("Pituitary structure (body structure)", [])}, "PixieBobCatBreed": {"417277001": ("Pixie-bob cat breed", [7480])}, "PlacementOfStent": {"103716009": ("Placement of stent (procedure)", [])}, "PlacementOfStentInCoronaryArtery": { "36969009": ("Placement of stent in coronary artery (procedure)", []) }, "Placenta": {"78067005": ("Placenta", [8134])}, "PlacentalStructure": {"78067005": ("Placental structure (body structure)", [])}, "PlacingRestraint": {"68894007": ("Placing restraint", [9577])}, "PlainRadiography": {"168537006": ("Plain radiography", [10005])}, "PlanningTargetVolume": { "228793007": ("Planning target volume (observable entity)", []) }, "Plantar60DegreeLateralDorsomedialOblique": { "442675004": ("Plantar 60 degree lateral-dorsomedial oblique", [7484]) }, "Plantar60DegreeLateralDorsomedialObliqueProjection": { "442675004": ( "Plantar 60 degree lateral-dorsomedial oblique projection (qualifier value)", [], ) }, "Plantar75DegreeProximalDorsodistalOblique": { "442603007": ("Plantar 75 degree proximal-dorsodistal oblique", [7484]) }, "Plantar75DegreeProximalDorsodistalObliqueProjection": { "442603007": ( "Plantar 75 degree proximal-dorsodistal oblique projection (qualifier value)", [], ) }, "PlantarArterialArch": { "83018002": ( "Plantar Arterial Arch", [3827, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "PlantarArterialArchStructure": { "83018002": ("Plantar arterial arch structure (body structure)", []) }, "PlantarolateralDorsomedialOblique": { "442658005": ("Plantarolateral-dorsomedial oblique", [7484]) }, "PlantarolateralDorsomedialObliqueProjection": { "442658005": ( "Plantarolateral-dorsomedial oblique projection (qualifier value)", [], ) }, "PlantaroproximalDorsodistalOblique": { "442625001": ("Plantaroproximal-dorsodistal oblique", [7484]) }, "PlantaroproximalDorsodistalObliqueProjection": { "442625001": ( "Plantaroproximal-dorsodistal oblique projection (qualifier value)", [], ) }, "Plantodorsal": {"399071006": ("plantodorsal", [501, 4010])}, "PlantodorsalProjection": { "399071006": ("Plantodorsal projection (qualifier value)", []) }, "Plaque": {"1522000": ("plaque", [3810])}, "PlaqueUlceration": {"62189002": ("Plaque Ulceration", [3491])}, "PlasmaExpander": {"372578001": ("Plasma Expander", [621, 622])}, "Plasmacytoma": {"1187107005": ("Plasmacytoma", [6030, 6033])}, "Plastic": {"61088005": ("Plastic", [8115])}, "PlasticStent": {"257362008": ("plastic stent", [3814])}, "PlasticSurgery": {"309992008": ("Plastic Surgery", [7030])}, "PlasticSurgeryDepartment": { "309992008": ("Plastic surgery department (environment)", []) }, "PlateLikeAtelectasis": {"40779009": ("Plate-like atelectasis", [6102, 6103])}, "Platinum": {"84847000": ("Platinum", [300])}, "PleomorphicAdenoma": {"8360001": ("Pleomorphic adenoma", [6030, 6031])}, "Pleura": {"3120008": ("Pleura", [7151, 7155, 7192, 9514, 12294])}, "PleuralEffusion": {"60046008": ("Pleural effusion", [645, 8134])}, "PleuralMembraneStructure": { "3120008": ("Pleural membrane structure (body structure)", []) }, "PleuralStructure": {"3120008": ("Pleural structure", [6100, 6129, 8134])}, "PlevenHorseBreed": {"132986004": ("Pleven horse breed", [7480])}, "PlottHound": {"40400008": ("Plott hound", [7480])}, "Pm0NoDistantMetastasisBreast": { "373169005": ("pM0: No distant metastasis (breast) (finding)", []) }, "Pm1": {"1229916009": ("pM1", [6162])}, "Pm1DistantMetastasisBreast": { "373171005": ("pM1: Distant metastasis (breast) (finding)", []) }, "PmxDistantMetastasisCannotBeAssessedBreast": { "373170006": ( "pMX: Distant metastasis cannot be assessed (breast) (finding)", [], ) }, "Pn0": {"1229947003": ("pN0", [6161])}, "Pn0NoRegionalLymphNodeMetastasisHistologicallyIENoneGreaterThan0Point2mmNoAdditionalExaminationForIsolatedTumorCellsBreast": { "373151001": ( "pN0: No regional lymph node metastasis histologically " "(i.e., none greater than 0.2 mm), no additional " "examination for isolated tumor cells (breast) (finding)", [], ) }, "Pn1": {"1229951001": ("pN1", [6161])}, "Pn1MetastasisIn1To3AxillaryLymphNodesAndOrInInternalMammaryNodesWithMicroscopicDiseaseDetectedBySentinelLymphNodeDissectionButNotClinicallyApparentBreast": { "373156006": ( "pN1: Metastasis in 1 to " "3 axillary lymph nodes, " "and/or in internal " "mammary nodes with " "microscopic disease " "detected by sentinel " "lymph node dissection " "but not clinically " "apparent (breast) " "(finding)", [], ) }, "Pn2": {"1229957002": ("pN2", [6161])}, "Pn2MetastasisIn4To9AxillaryLymphNodesOrInClinicallyApparentInternalMammaryLymphNodesInTheAbsenceOfAxillaryLymphNodeMetastasisBreast": { "373162001": ( "pN2: Metastasis in 4 to 9 axillary lymph " "nodes, or in clinically apparent internal " "mammary lymph nodes in the absence of axillary " "lymph node metastasis (breast) (finding)", [], ) }, "Pn2a": {"1229959004": ("pN2a", [6161])}, "Pn2aMetastasisIn4To9AxillaryLymphNodesAtLeastOneTumorDepositGreaterThan2Point0mmBreast": { "373163006": ( "pN2a: Metastasis in 4 to 9 axillary lymph nodes (at least one tumor deposit greater than " "2.0 mm) (breast) (finding)", [], ) }, "Pn2b": {"1229960009": ("pN2b", [6161])}, "Pn2bMetastasisInClinicallyApparentInternalMammaryLymphNodesInTheAbsenceOfAxillaryLymphNodeMetastasisBreast": { "373164000": ( "pN2b: Metastasis in clinically apparent internal mammary lymph nodes in " "the absence of axillary lymph node metastasis (breast) (finding)", [], ) }, "Pn3": {"1229962001": ("pN3", [6161])}, "Pn3a": {"1229963006": ("pN3a", [6161])}, "Pn3aMetastasisIn10OrMoreAxillaryLymphNodesAtLeastOneTumorDepositGreaterThan2Point0mmOrMetastasisToInfraclavicularLymphNodesBreast": { "373165004": ( "pN3a: Metastasis in 10 or more axillary lymph " "nodes (at least one tumor deposit greater than " "2.0 mm), or metastasis to infraclavicular lymph " "nodes (breast) (finding)", [], ) }, "Pn3b": {"1229964000": ("pN3b", [6161])}, "Pn3bTumorOfBreastWithMetastasisAsPerAmericanJointCommitteeOnCancer6thEditionDefinitionBreast": { "373167007": ( "pN3b: Tumor of breast with metastasis as per American Joint Committee on Cancer 6th " "Edition definition (breast) (finding)", [], ) }, "Pn3c": {"1229965004": ("pN3c", [6161])}, "Pn3cMetastasisInIpsilateralSupraclavicularLymphNodesBreast": { "373166003": ( "pN3c: Metastasis in ipsilateral supraclavicular lymph nodes (breast) (finding)", [], ) }, "Pneumomediastinum": {"16838000": ("Pneumomediastinum", [6102, 6105])}, "Pneumothorax": {"36118008": ("Pneumothorax", [6062, 6102, 6105])}, "Pnx": {"1229945006": ("pNX", [6161])}, "PnxRegionalLymphNodesCannotBeAssessedEGPreviouslyRemovedOrNotRemovedForPathologicStudyBreast": { "373150000": ( "pNX: Regional lymph nodes cannot be assessed (e.g., previously removed, or not " "removed for pathologic study) (breast) (finding)", [], ) }, "PodengoCanarioDogBreed": {"132444001": ("Podengo Canario dog breed", [7480])}, "PodengoPequenoDogBreed": {"132445000": ("Podengo Pequeno dog breed", [7480])}, "PointSourceMeasurement": {"371913007": ("Point source measurement", [3627])}, "PointSourceNumericEstimationTechnique": { "371913007": ( "Point source - numeric estimation technique (qualifier value)", [], ) }, "Pointer": {"73318001": ("Pointer", [7480])}, "PoitevinDogBreed": {"132610001": ("Poitevin dog breed", [7480])}, "PoitouGoatBreed": {"131646007": ("Poitou goat breed", [7480])}, "PoitouMuleProducerHorseBreed": { "133073004": ("Poitou Mule Producer horse breed", [7480]) }, "PolandChinaPig": {"79814001": ("Poland China pig (organism)", [])}, "PolandChinaPigBreed": {"79814001": ("Poland China pig breed", [7480])}, "PolarizingOpticalFilter": { "445391002": ("Polarizing optical filter", [4204, 8124]) }, "PolarizingOpticalFilterOfOpticalMicroscope": { "445391002": ( "Polarizing optical filter of optical microscope (physical object)", [], ) }, "PolesianHorseBreed": {"133074005": ("Polesian horse breed", [7480])}, "PolesianPigBreed": {"133225003": ("Polesian pig breed", [7480])}, "PolishBlackAndWhiteLowlandCattleBreed": { "133414005": ("Polish Black and White Lowland cattle breed", [7480]) }, "PolishDraftHorseBreed": {"132978004": ("Polish Draft horse breed", [7480])}, "PolishHoundDogBreed": {"132609006": ("Polish Hound dog breed", [7480])}, "PolishLandracePigBreed": {"132273001": ("Polish Landrace pig breed", [7480])}, "PolishMarshPigBreed": {"133229009": ("Polish Marsh pig breed", [7480])}, "PolishRedCattleBreed": {"133256006": ("Polish Red cattle breed", [7480])}, "PolishSimmentalCattleBreed": { "133415006": ("Polish Simmental cattle breed", [7480]) }, "PollMerinoSheepBreed": {"132721003": ("Poll Merino sheep breed", [7480])}, "PolledGirCattleBreed": {"133688008": ("Polled Gir cattle breed", [7480])}, "PolledGuzeratCattleBreed": {"133746006": ("Polled Guzerat cattle breed", [7480])}, "PolledHereford": {"9277006": ("Polled Hereford (organism)", [])}, "PolledHerefordCowBreed": {"9277006": ("Polled Hereford cow breed", [7480])}, "PolledJerseyCattleBreed": {"133416007": ("Polled Jersey cattle breed", [7480])}, "PolledLincolnRedCattleBreed": { "133417003": ("Polled Lincoln Red cattle breed", [7480]) }, "PolledNeloreCattleBreed": {"133753002": ("Polled Nelore cattle breed", [7480])}, "PolledShorthornUSCattleBreed": { "133418008": ("Polled Shorthorn (US) cattle breed", [7480]) }, "PolledShorthornUnitedStatesOfAmericaCattleBreed": { "133418008": ( "Polled Shorthorn (United States of America) cattle breed (organism)", [], ) }, "PolledSimmentalCattleBreed": { "133419000": ("Polled Simmental cattle breed", [7480]) }, "PolledSussexCattleBreed": {"133430002": ("Polled Sussex cattle breed", [7480])}, "PolledWelshBlackCattleBreed": { "133431003": ("Polled Welsh Black cattle breed", [7480]) }, "PolskiOwczarekNizinnyDogBreed": { "132608003": ("Polski Owczarek Nizinny dog breed", [7480]) }, "PoltavaPigBreed": {"132069007": ("Poltava pig breed", [7480])}, "PolwarthSheepBreed": {"132705008": ("Polwarth sheep breed", [7480])}, "Polymer": {"412155002": ("Polymer", [7300, 9579])}, "PolypOfColon": {"68496003": ("Polyp of colon", [6201])}, "PolypSizeLargestDimension": { "373197004": ("Polyp size, largest dimension", [6212]) }, "PolypStalkLength": {"395511002": ("Polyp stalk length", [6212])}, "PolypaySheepBreed": {"131823008": ("Polypay sheep breed", [7480])}, "PomeranianCoarsewoolSheepBreed": { "131831003": ("Pomeranian Coarsewool sheep breed", [7480]) }, "PomeranianDog": {"10040000": ("Pomeranian dog", [7480])}, "PomeranianPigBreed": {"132272006": ("Pomeranian pig breed", [7480])}, "Ponceau3RStain": {"65730007": ("ponceau 3R stain", [8112])}, "PonceauSStain": {"89856006": ("ponceau S stain", [8112])}, "PonceauXylidineStain": {"70520000": ("ponceau xylidine stain", [8112])}, "PontamineSkyBlue5BXStain": {"89577003": ("pontamine sky blue 5BX stain", [8112])}, "PontamineSkyBlue6BXStain": {"80305003": ("pontamine sky blue 6BX stain", [8112])}, "PontremoleseCattleBreed": {"133432005": ("Pontremolese cattle breed", [7480])}, "PonwarCattleBreed": {"133622006": ("Ponwar cattle breed", [7480])}, "Pony": {"3997000": ("Pony (organism)", [])}, "PonyHorseBreed": {"3997000": ("Pony horse breed", [7480])}, "PonyOfTheAmericasHorseBreed": { "133063001": ("Pony of the Americas horse breed", [7480]) }, "PoodleSuperbreed": {"15171008": ("Poodle superbreed (organism)", [])}, "PoodleSuperbreedDogBreed": {"15171008": ("Poodle superbreed dog breed", [7480])}, "PoorVisualFixation": {"314348007": ("Poor Visual Fixation", [4222])}, "PoorlyDefined": {"300841009": ("Poorly defined", [6120])}, "PoplitealArtery": { "43899006": ( "Popliteal artery", [ 4, 3010, 3440, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109, ], ) }, "PoplitealFossa": {"32361000": ("Popliteal fossa", [4, 7151, 7192, 8134, 9514])}, "PoplitealFossaStructure": { "32361000": ("Popliteal fossa structure (body structure)", []) }, "PoplitealLymphNode": {"47471008": ("popliteal lymph node", [7600, 8134])}, "PoplitealLymphNodeStructure": { "47471008": ("Popliteal lymph node structure (body structure)", []) }, "PoplitealVein": { "56849005": ("Popliteal Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110]) }, "PorcelaineDogBreed": {"132578009": ("Porcelaine dog breed", [7480])}, "PorcineSpecies": {"42018006": ("Porcine species (organism)", [])}, "Portal": {"32381004": ("Portal (qualifier value)", [])}, "PortalVein": { "32764006": ( "Portal vein", [ 4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12114, 12125, ], ) }, "PortalVeinStructure": {"32764006": ("Portal vein structure (body structure)", [])}, "PortlandSheepBreed": {"132682000": ("Portland sheep breed", [7480])}, "PortoAmboimCattleBreed": {"131516001": ("Porto Amboim cattle breed", [7480])}, "PortugueseGuardDogBreed": {"132378008": ("Portuguese Guard Dog breed", [7480])}, "PortuguesePointerDogBreed": { "132577004": ("Portuguese Pointer dog breed", [7480]) }, "PortugueseWaterDog": {"63390008": ("Portuguese water dog", [7480])}, "PosavinaCattleBreed": {"131517005": ("Posavina cattle breed", [7480])}, "PositionOfJoint": {"276334009": ("Position of joint (finding)", [])}, "Positive": {"10828004": ("Positive", [250, 3231])}, "PositronEmissionTomographyBreastStudy": { "416323006": ("Positron emission tomography breast study (procedure)", []) }, "PositronEmissionTomographyHeartStudy": { "241439007": ("Positron emission tomography heart study (procedure)", []) }, "PositronEmissionTomographyOfWholeBody": { "702767007": ("Positron emission tomography of whole body (procedure)", []) }, "PositronEmissionTomographyStudyForLocalizationOfTumor": { "241443006": ( "Positron emission tomography study for localization of tumor (procedure)", [], ) }, "PositronEmissionTomographyWithComputedTomographyFluorodeoxyglucoseImagingOfWholeBody": { "443271005": ( "Positron emission tomography with computed tomography fluorodeoxyglucose imaging of whole " "body (procedure)", [], ) }, "PossiblePregnancy": {"146799005": ("possible pregnancy", [6096])}, "PossiblePregnancy_Inactive": {"102874004": ("Possible pregnancy (finding)", [])}, "PossibleThrombus": {"373141002": ("Possible Thrombus", [3714])}, "PostAblationPhase": {"129093009": ("Post-ablation phase", [3254])}, "PostChemotherapy": {"262502001": ("Post-chemotherapy", [6146])}, "PostDefibrillationProcedurePhase": { "129091006": ("Post-defibrillation procedure phase", [3254]) }, "PostDose": {"255566006": ("Post-dose", [31])}, "PostExerciseState": {"128977007": ("Post-exercise state", [3262, 3602])}, "PostInfarctAngina": {"314116003": ("Post infarct angina (disorder)", [])}, "PostInfarctionAngina": {"314116003": ("Post-infarction angina", [3700])}, "PostOperative": {"262061000": ("Post-operative", [31, 6146])}, "PostPTCA": {"371822007": ("Post PTCA", [3201])}, "PostPercutaneousTransluminalCoronaryAngioplasty": { "373108000": ( "Post percutaneous transluminal coronary angioplasty (finding)", [], ) }, "PostRadiation": {"264908009": ("Post-radiation", [6146])}, "PostStenoticDilation": {"371872009": ("Post Stenotic Dilation", [3709])}, "PostSurgicalAnatomy": {"245849007": ("Post-surgical anatomy", [9272])}, "PostVitrectomy": {"232077005": ("Post-Vitrectomy", [4232])}, "PostVolumeChallenge": {"128971008": ("Post volume challenge", [91, 3271])}, "PostartificialMenopausalSyndrome": { "31351009": ("Postartificial menopausal syndrome (disorder)", []) }, "PostauricularLymphNode": {"245328002": ("postauricular lymph node", [7600, 8134])}, "Postaxial": {"60583000": ("Postaxial", [2])}, "PostductalRegionOfAorticArch": { "60835009": ("Postductal region of aortic arch", [12280]) }, "Posterior": { "255551008": ("Posterior", [2, 5, 211, 212, 3019, 4005, 6024, 6025, 12281]) }, "PosteriorArchVein": { "397435008": ( "Posterior arch vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "PosteriorAuricularLymphNode": { "30793004": ("posterior auricular lymph node", [7600, 8134]) }, "PosteriorCerebralArtery": { "70382005": ( "Posterior Cerebral Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "PosteriorCerebralArteryP1Segment": { "415144009": ( "Posterior Cerebral Artery P1 Segment", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "PosteriorCerebralArteryP2Segment": { "415145005": ( "Posterior Cerebral Artery P2 Segment", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "PosteriorCerebralCommissure": { "279336005": ("Posterior cerebral commissure", [7151, 7153, 7192, 8134, 9514]) }, "PosteriorCommissure": { "279336005": ("Posterior Commissure", [7101, 7111, 7705, 7710]) }, "PosteriorCommissureOfLabiumMajorum": { "4019005": ("Posterior commissure of labium majorum", [4029, 8134]) }, "PosteriorCommunicatingArtery": { "43119007": ( "posterior communicating artery", [3604, 3606, 3630, 3827, 12103, 12105], ) }, "PosteriorCommunicationArtery": { "43119007": ( "Posterior communication artery", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "PosteriorDescendingCoronaryArtery": { "443113009": ("Posterior Descending Coronary Artery", [12292]) }, "PosteriorDescendingRightCoronaryArtery": { "53655008": ( "Posterior Descending Right Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "PosteriorEmissiveProjection": { "399001007": ("Posterior emissive projection (qualifier value)", []) }, "PosteriorHornLateralVentricle": { "52943005": ("Posterior Horn Lateral Ventricle", [8134, 12022]) }, "PosteriorMedialTributary": { "128569001": ( "Posterior medial tributary", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "PosteriorMedialTributaryOfSuperficialVenousSystemOfLowerExtremity": { "128569001": ( "Posterior medial tributary of superficial venous system of lower extremity (body structure)", [], ) }, "PosteriorMediastinalLymphNode": { "25447008": ("posterior mediastinal lymph node", [7600, 8134]) }, "PosteriorProjection": {"399001007": ("Posterior projection", [26, 501])}, "PosteriorSegmentOfRightUpperLobe": { "3236000": ("Posterior segment of right upper lobe", [6124, 6127]) }, "PosteriorTibialArtery": { "13363002": ( "Posterior tibial artery", [4, 3010, 3440, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109], ) }, "PosteriorTibialLymphNode": { "303623000": ("posterior tibial lymph node", [7600, 8134]) }, "PosteriorTibialVein": { "4258007": ( "Posterior Tibial Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "PosteriorTriangleCervicalLymphNode": { "245324000": ("posterior triangle cervical lymph node", [7600, 8134]) }, "PosteriorWall": {"264159006": ("Posterior Wall", [12280])}, "PosteroAnterior": {"272479007": ("postero-anterior", [501, 4010])}, "PosteroAnteriorOblique": {"399059000": ("postero-anterior oblique", [501, 4010])}, "PosteroAnteriorObliqueProjection": { "399059000": ("Postero-anterior oblique projection (qualifier value)", []) }, "PosteroanteriorProjection": { "272479007": ("Posteroanterior projection (qualifier value)", []) }, "Posterolateral": {"90069004": ("Posterolateral", [2])}, "PosterolateralBranchOfRightCoronaryArtery": { "17269004": ( "Posterolateral branch of right Coronary Artery", [3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "Postoperative": {"262061000": ("Postoperative", [631, 632])}, "PostoperativeAnesthesiaCareUnit": { "398161000": ("Postoperative anesthesia care unit (environment)", []) }, "PostoperativeHematomaFormation": { "213262007": ("Postoperative hematoma formation (disorder)", []) }, "PostoperativeHemorrhage": { "110265006": ("Postoperative hemorrhage (disorder)", []) }, "PostoperativePeriod": { "262061000": ("Postoperative period (qualifier value)", []) }, "Postprandial": {"24863003": ("Postprandial (qualifier value)", [])}, "PostproceduralPeriod": { "303110006": ("Postprocedural period (qualifier value)", []) }, "PostsurgicalMenopause": {"371036001": ("Postsurgical menopause", [6086])}, "PostvesicularLymphNode": {"278571002": ("postvesicular lymph node", [7600, 8134])}, "Potassium": {"88480006": ("Potassium", [621, 622])}, "PotassiumCarbonateK42": {"111161000": ("Potassium carbonate K^42^", [25])}, "PotassiumChlorideK42": {"36641004": ("Potassium chloride K^42^", [25])}, "PotassiumChlorideK43": {"47729008": ("Potassium chloride K^43^", [25])}, "PotassiumDichromate": {"19893005": ("Potassium dichromate", [8114])}, "PotassiumHydroxide": {"34763001": ("Potassium hydroxide (substance)", [])}, "PotassiumHydroxideStain": {"34763001": ("potassium hydroxide stain", [8112])}, "PotentialAcuityMeterVisualAcuity": { "424622008": ("Potential Acuity Meter Visual Acuity", [4216]) }, "PottokTarpanHorseXDomesticHorseBreed": { "132993000": ("Pottok tarpan horse X domestic horse breed", [7480]) }, "PowerDoppler": {"425704008": ("Power Doppler", [218, 6058, 7180, 7469, 12224])}, "PowerDopplerUltrasound": { "425704008": ("Power doppler ultrasound (qualifier value)", []) }, "PowerOfCylinder": {"251797004": ("Power of cylinder (observable entity)", [])}, "PowerOfSphere": {"251795007": ("Power of sphere (observable entity)", [])}, "PreAdmission": {"281379000": ("Pre-admission", [31])}, "PreBiopsyLocalizationOfBreastLesion": { "237380007": ("Pre-biopsy localization of breast lesion", [6050, 6083]) }, "PreDose": {"255235001": ("Pre-dose", [31])}, "PreExerciseState": {"128977007": ("Pre-exercise state (finding)", [])}, "PreOperative": {"262068006": ("Pre-operative", [31, 3201, 6146])}, "PreSurgeryTesting": {"110467000": ("Pre-Surgery testing", [3671])}, "Preaxial": {"32400000": ("Preaxial", [2])}, "PrececalLymphNode": {"281765006": ("prececal lymph node", [7600, 8134])}, "Prednisone": {"116602009": ("Prednisone", [65])}, "PreductalRegionOfAorticArch": { "75397005": ("Preductal region of aortic arch", [12280]) }, "PrefemoralLymphNode": {"48193007": ("prefemoral lymph node", [7600, 8134])}, "PregnancyObservable": { "364320009": ("Pregnancy observable (observable entity)", []) }, "PreinfarctionSyndrome": {"4557003": ("Preinfarction syndrome (disorder)", [])}, "PrelaryngealLymphNode": {"74203007": ("prelaryngeal lymph node", [7600, 8134])}, "PrematureAtrialContraction": { "284470004": ("Premature atrial contraction (disorder)", []) }, "PremierPigBreed": {"132028003": ("Premier pig breed", [7480])}, "Preoperative": {"262068006": ("Preoperative", [631, 632])}, "PrepericardialLymphNode": { "196516004": ("prepericardial lymph node", [7600, 8134]) }, "PresaCanarioDogBreed": {"132576008": ("Presa Canario dog breed", [7480])}, "Present": {"52101004": ("Present", [240, 241])}, "PressaMallorquinDogBreed": {"132446004": ("Pressa Mallorquin dog breed", [7480])}, "PressurePhysicalAgent": { "279046003": ("Pressure - physical agent (physical force)", []) }, "PressureSupportVentilator": {"371786002": ("Pressure Support Ventilator", [3554])}, "PresticePigBreed": {"133213001": ("Prestice pig breed", [7480])}, "PresymphysialLymphNode": {"6413002": ("presymphysial lymph node", [7600, 8134])}, "PretaCattleBreed": {"133433000": ("Preta cattle breed", [7480])}, "PretrachealLymphNode": {"168460001": ("pretracheal lymph node", [7600, 8134])}, "PrevascularRetrotrachealLymphNode": { "127930004": ("prevascular/retrotracheal lymph node", [7600, 8134]) }, "PreventiveIntent": {"129428001": ("Preventive intent", [3629])}, "PreventiveProcedureIntent": { "129428001": ("Preventive - procedure intent (qualifier value)", []) }, "PrevertebralLymphNode": {"196446004": ("prevertebral lymph node", [7600, 8134])}, "PrevesicularLymphNode": {"11740004": ("prevesicular lymph node", [7600, 8134])}, "PrewakwaCattleBreed": {"133754008": ("Prewakwa cattle breed", [7480])}, "PrianganSheepBreed": {"132814008": ("Priangan sheep breed", [7480])}, "PrimaryCareDepartment": {"441480003": ("Primary Care Department", [7030])}, "PrimaryGaze": {"408744005": ("Primary gaze", [4201])}, "PrimaryMalignantNeoplasmOfLung": { "93880001": ("Primary malignant neoplasm of lung (disorder)", []) }, "PrimaryRestrictiveCardiomyopathy": { "90828009": ("Primary restrictive cardiomyopathy (disorder)", []) }, "PrimarySquamousCellCarcinomaOfAnus": { "723265000": ("Primary squamous cell carcinoma of anus (disorder)", []) }, "PrimarySquamousCellCarcinomaOfLaryngealCartilage": { "707357005": ( "Primary squamous cell carcinoma of laryngeal cartilage (disorder)", [], ) }, "PrimitiveAorta": { "14944004": ("Primitive aorta", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "PrimitiveAorticStructure": { "14944004": ("Primitive aortic structure (body structure)", []) }, "PrimitivePulmonaryArtery": { "91707000": ( "Primitive pulmonary artery", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "Principal": {"63161005": ("Principal (qualifier value)", [])}, "PrinzmetalAngina": {"87343002": ("Prinzmetal angina (disorder)", [])}, "PriobHorseBreed": {"132979007": ("Priob horse breed", [7480])}, "Priority": {"260870009": ("Priority (attribute)", [])}, "PrisheksninskPigBreed": {"132107009": ("Prisheksninsk pig breed", [7480])}, "Problem": {"55607006": ("Problem", [3769])}, "ProblemResolved": {"413322009": ("Problem resolved", [3770])}, "Procedure": {"71388002": ("Procedure (procedure)", [])}, "ProcedureContext": {"408730004": ("Procedure context (attribute)", [])}, "ProcedureInCardiacCareUnit": { "373111004": ("Procedure in Cardiac Care Unit", [3671]) }, "ProcedureInCoronaryCareUnit": { "373111004": ("Procedure in coronary care unit (procedure)", []) }, "ProcedureOnJoint": {"118745001": ("Procedure on joint (procedure)", [])}, "ProcedurePhase": {"128954007": ("Procedure phase (qualifier value)", [])}, "ProcedureSite": {"363704007": ("Procedure site (attribute)", [])}, "ProcedureToMeetOccupationalRequirement": { "429060002": ("Procedure to meet occupational requirement (procedure)", []) }, "ProcionBrilliantBlueMRSStain": { "24900003": ("procion brilliant blue MRS stain", [8112]) }, "ProfessionalNurse": {"106292003": ("Professional nurse (occupation)", [])}, "ProfundaFemorisArtery": { "31677005": ( "Profunda Femoris Artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109, ], ) }, "ProfundaFemorisVein": { "23438002": ( "Profunda Femoris Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "ProgesteronePreparation": {"50318003": ("Progesterone preparation (product)", [])}, "ProgesteroneProduct": {"50318003": ("Progesterone product", [6080])}, "ProkineticAgent": {"116532005": ("Prokinetic Agent (product)", [])}, "PromontoryCommonIliacLymphNode": { "279189002": ("promontory common iliac lymph node", [7600, 8134]) }, "Pronation": {"88241000": ("Pronation", [92])}, "PronationFunction": {"88241000": ("Pronation, function (observable entity)", [])}, "Prone": {"1240000": ("prone", [20, 6206])}, "ProneBodyPosition": {"1240000": ("Prone body position (finding)", [])}, "ProperHepaticArtery": { "18112008": ( "Proper Hepatic Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "ProphylacticIntent": {"360271000": ("Prophylactic intent", [3629])}, "ProphylaxisProcedureIntent": { "360271000": ("Prophylaxis - procedure intent (qualifier value)", []) }, "Propofol": {"387423006": ("Propofol", [65, 66, 623, 625])}, "Propranolol": {"55745002": ("Propranolol", [10])}, "Propyliodone": {"111158001": ("Propyliodone", [12, 3850])}, "ProstaglandinE1": {"48988008": ("Prostaglandin E1", [10])}, "ProstaglandinInjection": {"133875007": ("Prostaglandin injection", [9])}, "ProstaglandinPGE1": {"48988008": ("Prostaglandin PGE1 (substance)", [])}, "Prostate": { "41216001": ( "Prostate", [ 4, 645, 4009, 4030, 4031, 4042, 6202, 6204, 6300, 7151, 7160, 7192, 8134, 9514, 10044, 10060, 12321, ], ) }, "ProstateCancer": {"254900004": ("Prostate cancer", [6313])}, "ProstateCancerAntigenMeasurement": { "63476009": ("Prostate Cancer Antigen Measurement", [6321]) }, "ProstateSpecificAntigenMeasurement": { "63476009": ("Prostate specific antigen measurement (procedure)", []) }, "Prostatectomy": {"90470006": ("Prostatectomy", [6320, 6323])}, "ProstaticStructure": {"41216001": ("Prostatic structure (body structure)", [])}, "ProstaticUrethra": {"71553001": ("Prostatic Urethra", [6300])}, "ProstaticUrethraStructure": { "71553001": ("Prostatic urethra structure (body structure)", []) }, "Prostatitis": {"9713002": ("Prostatitis", [6313, 6335, 6336, 6337, 6338])}, "Prosthesis": { "53350007": ("Prosthesis", [6102, 6138, 6202, 6203, 6404, 7151, 7193]) }, "ProsthesisDevice": {"53350007": ("Prosthesis, device (physical object)", [])}, "ProstheticReplacementOfHeartValve": { "307279007": ("Prosthetic replacement of heart valve (procedure)", []) }, "ProtamineSulfate": {"64520006": ("Protamine sulfate", [10])}, "ProtargolSStain": {"406993001": ("protargol S stain", [8112])}, "ProteaseDigestionOfTissueSpecimen": { "433456006": ("Protease digestion of tissue specimen", [8113]) }, "Proton": {"89177007": ("Proton", [9526])}, "ProvençaleGoatBreed": {"131611004": ("Provençale goat breed", [7480])}, "Proximal": {"40415009": ("Proximal", [2, 5, 211, 212, 3019, 12116, 12281])}, "ProximalCircumflexCoronaryArtery": { "52433000": ( "Proximal Circumflex Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12292], ) }, "ProximalFemur": {"310651003": ("Proximal Femur", [7304, 8134])}, "ProximalHumerus": {"119524001": ("Proximal Humerus", [7304, 8134])}, "ProximalLeftAnteriorDescendingCoronaryArtery": { "68787002": ( "Proximal Left Anterior Descending Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "ProximalRadius": {"12881000": ("Proximal Radius", [7304, 8134])}, "ProximalRightCoronaryArtery": { "91083009": ( "Proximal Right Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "ProximalUlna": {"34318004": ("Proximal Ulna", [7304, 8134])}, "ProximoDistal": {"442626000": ("Proximo-distal", [7484])}, "ProximoDistalProjection": { "442626000": ("Proximo-distal projection (qualifier value)", []) }, "PrussianBlueStain": {"406452004": ("Prussian blue stain", [8112])}, "PseudoAneurysm": {"22036004": ("Pseudo Aneurysm", [3491])}, "Pseudoaneurysm": {"22036004": ("Pseudoaneurysm", [3413, 3754, 3810])}, "Pseudophakia": {"95217000": ("Pseudophakia (disorder)", [])}, "Psoriasis": {"9014002": ("Psoriasis", [4405])}, "Psychiatry": {"309958005": ("Psychiatry", [7030])}, "PsychiatryDepartment": {"309958005": ("Psychiatry department (environment)", [])}, "Psychology": {"310123008": ("Psychology", [7030])}, "PsychologyService": {"310123008": ("Psychology service (qualifier value)", [])}, "Pt0": {"1228951007": ("pT0", [6160])}, "Pt0NoEvidenceOfPrimaryTumorBreast": { "373174002": ("pT0: No evidence of primary tumor (breast) (finding)", []) }, "Pt1": {"1228957006": ("pT1", [6160])}, "Pt1Tumor2cmOrLessInGreatestDimensionBreast": { "373172003": ( "pT1: Tumor 2 cm or less in greatest dimension (breast) (finding)", [], ) }, "Pt1a": {"1228959009": ("pT1a", [6160])}, "Pt1aTumorMoreThan0Point1cmButNotMoreThan0Point5cmInGreatestDimensionBreast": { "373180005": ( "pT1a: Tumor more than 0.1 cm but not more than 0.5 cm in greatest dimension (breast) (finding)", [], ) }, "Pt1b": {"1228962007": ("pT1b", [6160])}, "Pt1bTumorMoreThan0Point5cmButNotMoreThan1cmInGreatestDimensionBreast": { "373204007": ( "pT1b: Tumor more than 0.5 cm but not more than 1 cm in greatest dimension (breast) (finding)", [], ) }, "Pt1c": {"1229846008": ("pT1c", [6160])}, "Pt1cTumorMoreThan1cmButNotMoreThan2cmInGreatestDimensionBreast": { "373183007": ( "pT1c: Tumor more than 1 cm but not more than 2 cm in greatest dimension (breast) (finding)", [], ) }, "Pt1mi": {"1228958001": ("pT1mi", [6160])}, "Pt1micMicroinvasion0Point1cmOrLessInGreatestDimensionBreast": { "373179007": ( "pT1mic: Microinvasion 0.1 cm or less in greatest dimension (breast) (finding)", [], ) }, "Pt2": {"1229852009": ("pT2", [6160])}, "Pt2TumorMoreThan2cmButNotMoreThan5cmInGreatestDimensionBreast": { "373182002": ( "pT2: Tumor more than 2 cm but not more than 5 cm in greatest dimension (breast) (finding)", [], ) }, "Pt3": {"1229859000": ("pT3", [6160])}, "Pt3TumorMoreThan5cmInGreatestDimensionBreast": { "373184001": ( "pT3: Tumor more than 5 cm in greatest dimension (breast) (finding)", [], ) }, "Pt4": {"1229864001": ("pT4", [6160])}, "Pt4TumorOfAnySizeWithDirectExtensionToChestWallOrSkinBreast": { "373185000": ( "pT4: Tumor of any size with direct extension to chest wall or skin (breast) (finding)", [], ) }, "Pt4a": {"1229865000": ("pT4a", [6160])}, "Pt4aTumorOfAnySizeWithExtensionToChestWallNotIncludingPectoralisMuscleBreast": { "373186004": ( "pT4a: Tumor of any size with extension to chest wall, not including pectoralis muscle (breast) " "(finding)", [], ) }, "Pt4b": {"1229866004": ("pT4b", [6160])}, "Pt4bTumorOfAnySizeWithEdemaIncludingPeauDOrangeOrUlcerationOfTheSkinOfTheBreastOrSatelliteSkinNodulesConfinedToTheSameBreastBreast": { "373187008": ( "pT4b: Tumor of any size with edema (including " "peau d'orange) or ulceration of the skin of the " "breast or satellite skin nodules confined to " "the same breast (breast) (finding)", [], ) }, "Pt4c": {"1229867008": ("pT4c", [6160])}, "Pt4cTumorOfAnySizeWithDirectExtensionToChestWallNotIncludingPectoralisMuscleAndEdemaIncludingPeauDOrangeOrUlcerationOfTheSkinOfTheBreastOrSatelliteSkinNodulesConfinedToTheSameBreast": { "373189006": ( "pT4c: " "Tumor " "of " "any " "size " "with " "direct " "extension " "to " "chest " "wall " "(not " "including " "pectoralis " "muscle) " "and " "edema " "(including " "peau " "d'orange) " "or " "ulceration " "of " "the " "skin " "of " "the " "breast " "or " "satellite " "skin " "nodules " "confined " "to " "the " "same " "breast " "(finding)", [], ) }, "Pt4d": {"1229868003": ("pT4d", [6160])}, "Pt4dInflammatoryCarcinomaBreast": { "373190002": ("pT4d: Inflammatory carcinoma (breast) (finding)", []) }, "PtCategoryFinding": {"385385001": ("pT category finding (finding)", [])}, "Ptis": {"1228953005": ("pTis", [6160])}, "PtisCarcinomaInSituBreast": { "373175001": ("pTis: Carcinoma in situ (breast) (finding)", []) }, "PtisDCIS": {"1228954004": ("pTis (DCIS)", [6160])}, "PtisDuctalCarcinomaInSituBreast": { "373176000": ("pTis: Ductal carcinoma in situ (breast) (finding)", []) }, "PtisLobularCarcinomaInSituBreast": { "373177009": ("pTis: Lobular carcinoma in situ (breast) (finding)", []) }, "PtisPaget": {"1228956002": ("pTis (Paget)", [6160])}, "PtisPagetDiseaseWithoutInvasiveCarcinomaBreast": { "373178004": ( "pTis: Paget disease without invasive carcinoma (breast) (finding)", [], ) }, "Ptx": {"1228950008": ("pTX", [6160])}, "PtxPrimaryTumorCannotBeAssessedBreast": { "373173008": ("pTX: Primary tumor cannot be assessed (breast) (finding)", []) }, "Pudelpointer": {"61286000": ("Pudelpointer", [7480])}, "PuertoRicanCriolloCattleBreed": { "133434006": ("Puerto Rican Criollo cattle breed", [7480]) }, "PugDog": {"60252000": ("Pug dog", [7480])}, "PulMBorCattleBreed": {"133755009": ("Pul-M'bor cattle breed", [7480])}, "PulawyPigBreed": {"132271004": ("Pulawy pig breed", [7480])}, "PuliDog": {"21039009": ("Puli dog", [7480])}, "PullbackMethod": {"128575005": ("Pullback method", [3241])}, "PulmonaryArterialWaveform": { "128443005": ("Pulmonary arterial waveform (observable entity)", []) }, "PulmonaryArteriovenousFistula": { "111289009": ( "Pulmonary arteriovenous fistula", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "PulmonaryArtery": { "81040000": ( "Pulmonary artery", [ 4, 3010, 3604, 3606, 3610, 3630, 4030, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12141, 12290, 12305, ], ) }, "PulmonaryArteryBlood": {"371953005": ("Pulmonary Artery Blood", [3520])}, "PulmonaryArteryCatheter": { "397755005": ("Pulmonary artery catheter (physical object)", []) }, "PulmonaryArteryConduit": { "128584005": ( "Pulmonary artery conduit", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "PulmonaryArteryOxygenSaturationWaveform": { "128447006": ("Pulmonary artery oxygen saturation waveform", [3003]) }, "PulmonaryArteryOxygenSaturationWaveformFunction": { "128447006": ( "Pulmonary artery oxygen saturation waveform, function (observable entity)", [], ) }, "PulmonaryArteryPressure": {"250767002": ("Pulmonary Artery Pressure", [3641])}, "PulmonaryArteryPressureWaveform": { "128443005": ("Pulmonary artery pressure waveform", [3003]) }, "PulmonaryArteryStructure": { "81040000": ("Pulmonary artery structure (body structure)", []) }, "PulmonaryArteryWedge": {"128449009": ("Pulmonary artery wedge", [3608, 3630])}, "PulmonaryArteryWedgePressure": { "118433006": ("Pulmonary artery wedge pressure (observable entity)", []) }, "PulmonaryArteryWedgePressureWaveform": { "128449009": ("Pulmonary artery wedge pressure waveform", [3003]) }, "PulmonaryAtresiaWithIntactVentricularSeptum": { "253590009": ( "Pulmonary atresia with intact ventricular septum", [12248, 12249], ) }, "PulmonaryAtresiaWithVentricularSeptalDefect": { "253591008": ( "Pulmonary atresia with ventricular septal defect", [12248, 12249], ) }, "PulmonaryCapillaryWedge": { "128448001": ("Pulmonary capillary wedge", [3608, 3630]) }, "PulmonaryCapillaryWedgeMethod": { "128448001": ("Pulmonary capillary wedge method", [3241]) }, "PulmonaryCapillaryWedgePressure": { "118433006": ("Pulmonary Capillary Wedge Pressure", [3641]) }, "PulmonaryCapillaryWedgePressureWaveform": { "128448001": ("Pulmonary capillary wedge pressure waveform", [3003]) }, "PulmonaryCapillaryWedgePressureWaveformFunction": { "128448001": ( "Pulmonary capillary wedge pressure waveform, function (observable entity)", [], ) }, "PulmonaryChamberInCorTriatriatum": { "128586007": ("Pulmonary chamber in cor triatriatum", [3608, 3630]) }, "PulmonaryChamberOfCorTriatriatum": { "128586007": ( "Pulmonary chamber of cor triatriatum", [4, 3010, 4042, 7151, 7192, 8134, 9514], ) }, "PulmonaryDisease": {"19829001": ("Pulmonary disease", [3205])}, "PulmonaryEdema": {"19242006": ("Pulmonary edema", [3700])}, "PulmonaryEmbolism": {"59282003": ("Pulmonary embolism", [6102, 6104])}, "PulmonaryHypertension": { "70995007": ("Pulmonary hypertension", [64, 3640, 3700, 3728]) }, "PulmonaryMetastasis": {"94391008": ("Pulmonary metastasis", [645, 8134])}, "PulmonarySystemicFlowRatio": { "251050008": ("Pulmonary/Systemic Flow Ratio", [3620]) }, "PulmonarySystolicEjectionPeriod": { "371848004": ("Pulmonary systolic ejection period (observable entity)", []) }, "PulmonarySystolicEjectionPeriodSepp": { "371848004": ("Pulmonary Systolic Ejection Period (SEPp)", [3616]) }, "PulmonaryToSystemicFlowRatio": { "251050008": ("Pulmonary to systemic flow ratio (observable entity)", []) }, "PulmonaryTrunk": { "45341000": ("Pulmonary trunk", [6102, 6109, 6117, 8134, 12290]) }, "PulmonaryValve": { "39057004": ( "Pulmonary valve", [3610, 3630, 3701, 6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "PulmonaryValveArea": { "251013007": ("Pulmonary valve area (observable entity)", []) }, "PulmonaryValveDisorder": {"76267008": ("Pulmonary valve disorder (disorder)", [])}, "PulmonaryValveFlow": {"371846000": ("Pulmonary Valve Flow", [3617])}, "PulmonaryValvePullbackPressureWaveform": { "128452001": ("Pulmonary valve pullback pressure waveform", [3003]) }, "PulmonaryValveSinuses": { "90315007": ("pulmonary valve sinuses", [3829, 7151, 7192, 9514]) }, "PulmonaryValveStructure": { "39057004": ("Pulmonary valve structure (body structure)", []) }, "PulmonaryVascularResistance": { "276901002": ("Pulmonary Vascular Resistance", [3619, 3641]) }, "PulmonaryVein": { "122972007": ( "Pulmonary vein", [ 4, 3010, 3011, 3607, 3630, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12141, 12283, ], ) }, "PulmonaryVeinAWaveDuration": { "399070007": ("Pulmonary Vein A-Wave Duration", [12214]) }, "PulmonaryVeinBlood": {"371954004": ("Pulmonary Vein Blood", [3520])}, "PulmonaryVeinCommonLeftSegment": { "443705001": ("Pulmonary Vein Common Left Segment", [12280]) }, "PulmonaryVeinCommonRightSegment": { "443591004": ("Pulmonary Vein Common Right Segment", [12280]) }, "PulmonaryVeinConfluence": { "128566008": ( "Pulmonary vein confluence", [4, 3010, 3607, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "PulmonaryVeinConfluenceToAtriumConnection": { "443208000": ("Pulmonary Vein confluence to Atrium Connection", [12280]) }, "PulmonaryVeinDWaveVelocityTimeIntegral": { "399039004": ("Pulmonary Vein D-Wave Velocity Time Integral", [12214]) }, "PulmonaryVeinGreatVessel": { "430757002": ("Pulmonary Vein", [3827, 3840, 7151, 7192, 9514, 12283, 12305]) }, "PulmonaryVeinSWaveVelocityTimeIntegral": { "399267001": ("Pulmonary Vein S-Wave Velocity Time Integral", [12214]) }, "PulmonaryVeinToAtriumConnection": { "443297004": ("Pulmonary Vein to Atrium Connection", [12283]) }, "PulmonaryVeinWedge": {"371829003": ("Pulmonary vein wedge", [3604, 3606, 3630])}, "PulmonaryVeinWedgePressure": { "371829003": ("Pulmonary vein wedge pressure (observable entity)", []) }, "PulmonaryVenousAtrium": { "128567004": ( "Pulmonary venous atrium", [4, 3010, 3608, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "PulmonaryVenousStructure": { "122972007": ("Pulmonary venous structure (body structure)", []) }, "PulmonicRing": {"90318009": ("Pulmonic ring", [3011, 8134, 12305])}, "PulmonicValve": {"39057004": ("Pulmonic Valve", [12288, 12289, 12305])}, "PulmonicValveArea": {"251013007": ("Pulmonic Valve Area", [3614, 3615])}, "PulmonicValveDisease": {"76267008": ("Pulmonic valve disease", [3700])}, "PulmonicValveStenosis": {"56786000": ("Pulmonic valve stenosis", [12248, 12249])}, "Pulmonology": {"309918008": ("Pulmonology", [7030])}, "PulsatilityIndex": {"252068008": ("Pulsatility Index", [3620])}, "PulsatilityIndexArterialVelocityWaveform": { "252068008": ( "Pulsatility index, arterial velocity waveform (observable entity)", [], ) }, "PumiDogBreed": {"132575007": ("Pumi dog breed", [7480])}, "PunctateCalcification": {"129755006": ("Punctate calcification", [6010, 6011])}, "PunctateRadiographicCalcification": { "129755006": ("Punctate radiographic calcification (finding)", []) }, "PunganurCattleBreed": {"133756005": ("Punganur cattle breed", [7480])}, "Pupillograph": {"420827006": ("Pupillograph", [4202])}, "PurkinjeFibers": {"13050003": ("Purkinje fibers", [3011, 8134])}, "Purple": {"371250004": ("Purple", [4411])}, "PurpleColor": {"371250004": ("Purple color (qualifier value)", [])}, "Putamen": {"89278009": ("Putamen", [7140, 7151, 7153, 7192, 8134, 9514])}, "PutianPigBreed": {"132284008": ("Putian pig breed", [7480])}, "PygmyGoat": {"684003": ("Pygmy goat (organism)", [])}, "PygmyGoatBreed": {"684003": ("Pygmy goat breed", [7480])}, "PygoraGoatBreed": {"131672003": ("Pygora goat breed", [7480])}, "PyloricLymphNode": {"24889003": ("pyloric lymph node", [7600, 8134])}, "PyreneanCattleBreed": {"133435007": ("Pyrenean cattle breed", [7480])}, "PyreneanGoatBreed": {"131619002": ("Pyrenean goat breed", [7480])}, "PyreneanMastiffDogBreed": {"132447008": ("Pyrenean Mastiff dog breed", [7480])}, "PyriformSinus": {"6217003": ("pyriform sinus", [7601, 8134])}, "PyronineBStain": {"76001002": ("pyronine B stain", [8112])}, "PyronineGStain": {"43106008": ("pyronine G stain", [8112])}, "QinchuanCattleBreed": {"133446005": ("Qinchuan cattle breed", [7480])}, "QingpingPigBreed": {"132313006": ("Qingping pig breed", [7480])}, "QuadrantectomyOfBreast": {"172049005": ("Quadrantectomy of breast", [6058, 6060])}, "Quantity": {"246205007": ("Quantity", [9000])}, "QuarabHorseBreed": {"133159006": ("Quarab horse breed", [7480])}, "QuarterHorse": {"76467006": ("Quarter horse (organism)", [])}, "QuarterHorseBreed": {"76467006": ("Quarter horse breed", [7480])}, "QuarterPonyHorseBreed": {"133158003": ("Quarter Pony horse breed", [7480])}, "QuasahCattleBreed": {"133823003": ("Quasah cattle breed (organism)", [])}, "QuasahXZebuCattleBreed": {"133823003": ("Quasah X zebu cattle breed", [7480])}, "QuinacrineFluorescentStain": { "406968003": ("quinacrine fluorescent stain", [8112]) }, "Quinidine": {"31306009": ("Quinidine", [10])}, "QuinoloneAntibiotic": {"372722000": ("Quinolone antibiotic", [621, 622])}, "QuinoloneClassOfAntibiotic": { "372722000": ("Quinolone -class of antibiotic- (substance)", []) }, "RK": {"51683002": ("RK", [4234])}, "RVCardiacIndex": {"427990004": ("RV Cardiac Index", [12204])}, "RVCardiacOutput": {"428628004": ("RV Cardiac Output", [12204])}, "RVStrokeIndex": {"429619008": ("RV Stroke Index", [12204])}, "RVStrokeVolume": {"429483009": ("RV Stroke Volume", [12204])}, "RX3CattleBreed": {"133266003": ("RX3 cattle breed", [7480])}, "RaadPigBreed": {"133171000": ("Raad pig breed", [7480])}, "RaboLargoSheepBreed": {"132815009": ("Rabo Largo sheep breed", [7480])}, "RacemoseAneurysm": {"14156004": ("racemose aneurysm", [3808])}, "RacialGroup": {"415229000": ("Racial group (racial group)", [])}, "RackaSheepBreed": {"131851004": ("Racka sheep breed", [7480])}, "RackingHorseHorseBreed": {"133157008": ("Racking Horse horse breed", [7480])}, "RacloprideC11": {"129512009": ("Raclopride C^11^", [4021])}, "RadialArtery": { "45631007": ( "Radial artery", [ 4, 3010, 3440, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12107, ], ) }, "RadialKeratotomy": {"51683002": ("Radial keratotomy (procedure)", [])}, "RadialScar": {"133855003": ("Radial scar", [6030, 6031])}, "RadialVein": { "52359001": ("Radial vein", [3827, 7151, 7192, 8134, 9514, 12103, 12108]) }, "RadiationOncologyANDORRadiotherapy": { "108290001": ("Radiation oncology AND/OR radiotherapy (procedure)", []) }, "RadiationTherapist": { "3430008": ("Radiation Therapist", [7450, 7452, 9536, 9562]) }, "RadiationTherapy": {"108290001": ("Radiation therapy", [6083, 6085])}, "RadiationTherapyProcedureOrService": { "53438000": ("Radiation therapy procedure or service (procedure)", []) }, "RadicalAortopulmonaryReconstructWRVToPAValvelessConduit": { "429616001": ( "Radical aortopulmonary reconstruct w RV to PA valveless conduit", [12247], ) }, "RadioactiveImplant": { "19443004": ("Radioactive implant", [7111, 7112, 7151, 7157, 7193]) }, "RadioactiveImplantDevice": { "19443004": ("Radioactive implant, device (physical object)", []) }, "RadioactiveIsotope": {"89457008": ("Radioactive isotope (substance)", [])}, "RadiofrequencyAblation": {"879916008": ("Radiofrequency ablation", [4409])}, "RadiofrequencyAblationDevice": { "371791001": ("Radiofrequency Ablation Device", [3411, 3429]) }, "RadiofrequencyAblationProcedurePhase": { "129089003": ("Radiofrequency Ablation procedure phase", [3254]) }, "RadiographicCalcificationFinding": { "129748009": ("Radiographic calcification finding", [6055]) }, "RadiographicCalcificationWithClusteredDistribution": { "129769006": ( "Radiographic calcification with clustered distribution (finding)", [], ) }, "RadiographicCalcificationWithDiffuseDistribution": { "129764001": ( "Radiographic calcification with diffuse distribution (finding)", [], ) }, "RadiographicCalcificationWithGroupedDistribution": { "129766004": ( "Radiographic calcification with grouped distribution (finding)", [], ) }, "RadiographicCalcificationWithLinearDistribution": { "129765000": ( "Radiographic calcification with linear distribution (finding)", [], ) }, "RadiographicCalcificationWithRegionalDistribution": { "129767008": ( "Radiographic calcification with regional distribution (finding)", [], ) }, "RadiographicCalcificationWithSegmentalDistribution": { "129768003": ( "Radiographic calcification with segmental distribution (finding)", [], ) }, "RadiographicContrastMedia": { "7140000": ("Radiographic contrast media (product)", []) }, "RadiographicFindingOfAmorphousCalcification": { "129760005": ("Radiographic finding of amorphous calcification (finding)", []) }, "RadiographicFindingOfCalcifiedSkinOfBreast": { "129757003": ("Radiographic finding of calcified skin of breast (finding)", []) }, "RadiographicFindingOfCalcifiedSutureMaterial": { "129758008": ("Radiographic finding of calcified suture material (finding)", []) }, "RadiographicIndividualCalcification": { "129770007": ("Radiographic individual calcification (finding)", []) }, "RadiographicLesionMarginCharacteristics": { "129737002": ("Radiographic lesion margin characteristics (finding)", []) }, "RadiographyOfTeeth": {"22891007": ("Radiography of teeth (procedure)", [])}, "RadioisotopeBrainImaging": { "41440006": ("Radioisotope brain imaging (procedure)", []) }, "RadioisotopeScanOfLymphaticSystem": { "169167001": ("Radioisotope scan of lymphatic system", [6050, 6083]) }, "RadioisotopeScanOfTotalBody": { "229033006": ("Radioisotope scan of total body (procedure)", []) }, "RadioisotopeStudyOfEndocrineSystem": { "7562007": ("Radioisotope study of endocrine system", [3108]) }, "RadioisotopeStudyOfGastrointestinalSystem": { "53585008": ("Radioisotope study of gastrointestinal system", [3108]) }, "RadioisotopeStudyOfGenitourinarySystem": { "76927004": ("Radioisotope study of genitourinary system", [3108]) }, "RadioisotopeStudyOfHematopoieticSystem": { "41842006": ("Radioisotope study of hematopoietic system", [3108]) }, "RadioisotopeStudyOfMusculoskeletalSystem": { "68796002": ("Radioisotope study of musculoskeletal system", [3108]) }, "RadioisotopeStudyOfRespiratorySystem": { "19086005": ("Radioisotope study of respiratory system", [3108]) }, "RadiologicTechnologist": { "159016003": ("Radiologic Technologist", [7450, 7452, 9536]) }, "Radiology": {"309964003": ("Radiology", [7030])}, "RadiologyDepartment": {"309964003": ("Radiology department (environment)", [])}, "RadionuclideAngiocardiography": { "426940008": ("Radionuclide angiocardiography", [3757]) }, "RadionuclideCardiacVentriculography": { "85606007": ("Radionuclide cardiac ventriculography (procedure)", []) }, "RadionuclideLocalizationOfTumor": { "45316007": ("Radionuclide localization of tumor", [3108]) }, "RadionuclideLocalizationOfTumorLimitedArea": { "66377006": ("Radionuclide localization of tumor, limited area", [6050, 6083]) }, "RadionuclideLymphogram": { "169167001": ("Radionuclide lymphogram (procedure)", []) }, "RadionuclideMyocardialPerfusionStudy": { "252432008": ("Radionuclide myocardial perfusion study", [3757]) }, "RadionuclideStudyForLocalizationOfInflammatoryDisease": { "252680004": ( "Radionuclide study for localization of inflammatory disease", [3108], ) }, "RadionuclideStudyForLocalizationOfTumorOrInflammatoryDisease": { "252680004": ( "Radionuclide study for localization of tumor or inflammatory disease (procedure)", [], ) }, "RadionuclideVentriculography": { "85606007": ("Radionuclide ventriculography", [3744]) }, "RadiopharmaceuticalAdverseReaction": { "292094009": ("Radiopharmaceutical Adverse Reaction", [9300, 9301]) }, "Radiopharmaceuticals": {"349358000": ("Radiopharmaceuticals (product)", [])}, "Radiotherapy": {"309903007": ("Radiotherapy", [7030])}, "RadiotherapyDepartment": { "309903007": ("Radiotherapy department (environment)", []) }, "Radium223Dichloride": {"724024003": ("Radium^223^ dichloride", [25])}, "Radius": { "131190003": ( "Radius", [ 218, 6165, 7469, 7470, 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, ], ) }, "RadiusANDUlnaCombinedSite": { "110535000": ("radius AND ulna (combined site) (body structure)", []) }, "RadiusAndUlna": {"110535000": ("Radius and ulna", [7482, 7483, 8134])}, "RadiusBone": {"62413002": ("Radius", [7304, 8134, 12021])}, "RaferProjection": {"423720000": ("Rafer projection (qualifier value)", [])}, "Rafert": {"423720000": ("Rafert", [4012])}, "RafertLong": {"422534007": ("Rafert-Long", [4012])}, "RafertLongProjection": { "422534007": ("Rafert-Long projection (qualifier value)", []) }, "RagamuffinCatBreed": {"132675004": ("Ragamuffin cat breed", [7480])}, "RagdollCatBreed": {"132654007": ("Ragdoll cat breed", [7480])}, "RahvanHorseBreed": {"132980005": ("Rahvan horse breed", [7480])}, "Raloxifene": {"109029006": ("Raloxifene", [6080])}, "RambouilletSheep": {"2124007": ("Rambouillet sheep (organism)", [])}, "RambouilletSheepBreed": {"2124007": ("Rambouillet sheep breed", [7480])}, "RamgarhiCattleBreed": {"133757001": ("Ramgarhi cattle breed", [7480])}, "RamoGrandeCattleBreed": {"133447001": ("Ramo Grande cattle breed", [7480])}, "RampProtocol": {"129099008": ("Ramp protocol", [3261, 12001])}, "RanaCattle": {"133824009": ("Rana cattle (organism)", [])}, "RanaXZebuCattleBreed": {"133824009": ("Rana X zebu cattle breed", [7480])}, "RandallLinebackCattleBreed": { "133448006": ("Randall Lineback cattle breed", [7480]) }, "RangeOfLowerMeasurementUncertainty": { "371885007": ("-, range of lower measurement uncertainty", [225]) }, "RangeOfMeasurementUncertainty": { "371884006": ("+/-, range of measurement uncertainty", [225]) }, "RangeOfUpperMeasurementUncertainty": { "371886008": ("+, range of upper measurement uncertainty", [225]) }, "RangerCattle": {"133825005": ("Ranger cattle (organism)", [])}, "RangerXZebuCattleBreed": {"133825005": ("Ranger X zebu cattle breed", [7480])}, "RasNLansaPigBreed": {"132039000": ("Ras-n-Lansa pig breed", [7480])}, "RasaAragonesaSheepBreed": {"131852006": ("Rasa Aragonesa sheep breed", [7480])}, "Rash": {"271807003": ("Rash", [6062])}, "RastelliInterventricularTunnel": { "443260009": ("Rastelli Interventricular Tunnel", [12288]) }, "RastelliOperation": {"44777001": ("Rastelli operation", [12247])}, "RastreadorBrasileiroDogBreed": { "132448003": ("Rastreador Brasileiro dog breed", [7480]) }, "RatTerrierDogBreed": {"132574006": ("Rat Terrier dog breed", [7480])}, "RathCattleBreed": {"133623001": ("Rath cattle breed", [7480])}, "RathiCattleBreed": {"133624007": ("Rathi cattle breed", [7480])}, "Ratio": {"118586006": ("Ratio", [12303])}, "RatioOfAorticValveAccelerationTimeToAorticValveEjectionTime": { "399058008": ( "Ratio of aortic valve acceleration time to aortic valve ejection time (observable entity)", [], ) }, "RatioOfAorticValveAccelerationTimeToEjectionTime": { "399058008": ( "Ratio of Aortic Valve Acceleration Time to Ejection Time", [12211], ) }, "RatioOfMVPeakVelocityToLVPeakTissueVelocityEWave": { "399140004": ( "Ratio of MV Peak Velocity to LV Peak Tissue Velocity E-Wave", [12200, 12203, 12257, 12259, 12271], ) }, "RatioOfMitralValveAccelerationTimeToMitralValveDecelerationTime": { "399062002": ( "Ratio of mitral valve acceleration time to mitral valve deceleration time (observable entity)", [], ) }, "RatioOfMitralValvePeakVelocityToLeftVentricularPeakTissueVelocityEWave": { "399140004": ( "Ratio of mitral valve peak velocity to left ventricular peak tissue velocity e-wave (observable entity)", [], ) }, "RatioOfPulmonicValveAccelerationTimeToEjectionTime": { "399238002": ( "Ratio of Pulmonic Valve Acceleration Time to Ejection Time", [12209], ) }, "RatioOfPulmonicValveAccelerationTimeToPulmonicValveEjectionTime": { "399238002": ( "Ratio of pulmonic valve acceleration time to pulmonic valve ejection time (observable entity)", [], ) }, "RatioProperty": {"118586006": ("Ratio (property) (qualifier value)", [])}, "Rattus": {"371564000": ("Rattus", [7454])}, "RattusNorvegicus": {"371565004": ("Rattus norvegicus", [7454])}, "RaynaudDisease": {"195295006": ("Raynaud's disease", [3805])}, "RazorBackPigBreed": {"132051003": ("Razor-Back pig breed", [7480])}, "ReasonForStoppingTest": { "246101005": ("Reason for stopping test (attribute)", []) }, "ReceivingOfSpecimenInLaboratory": { "428995007": ("Receiving of specimen in laboratory (procedure)", []) }, "RecentMyocardialInfarction": { "428752002": ("Recent Myocardial infarction", [3205]) }, "ReconstructionOfBreast": { "33496007": ("Reconstruction of breast (procedure)", []) }, "RecoveryRoom": {"398161000": ("Recovery room", [603])}, "RectalCatheter": {"705541005": ("Rectal Catheter", [74])}, "RectalMass": {"248523006": ("Rectal mass", [6201])}, "RectalRoute": {"37161004": ("Rectal route (qualifier value)", [])}, "RectalTemperature": {"307047009": ("Rectal temperature", [636])}, "RectalTube": {"67966000": ("Rectal tube", [6202, 6203])}, "Rectum": { "34402009": ( "Rectum", [ 645, 4009, 4030, 4031, 4040, 4042, 6202, 6204, 6210, 6348, 7151, 7160, 7192, 8134, 9514, ], ) }, "RectumStructure": {"34402009": ("Rectum structure (body structure)", [])}, "Recumbent": {"102538003": ("recumbent", [19])}, "RecumbentBodyPosition": {"102538003": ("Recumbent body position (finding)", [])}, "RecurrenceOfTumor": {"25173007": ("Recurrence of tumor", [6146])}, "Recurrent": {"255227004": ("Recurrent", [3770])}, "RecurrentAnginaPostCABG": {"371810009": ("Recurrent angina Post-CABG", [3700])}, "RecurrentAnginaPostDCA": {"371812001": ("Recurrent angina Post-DCA", [3700])}, "RecurrentAnginaPostPTCA": {"371808007": ("Recurrent angina Post-PTCA", [3700])}, "RecurrentAnginaPostRotationalAtherectomy": { "371811008": ("Recurrent angina Post-Rotational Atherectomy", [3700]) }, "RecurrentAnginaPostStent": {"371809004": ("Recurrent angina Post-Stent", [3700])}, "RecurrentAnginaStatusPostCoronaryArteryBypassGraft": { "371810009": ( "Recurrent angina status post coronary artery bypass graft (disorder)", [], ) }, "RecurrentAnginaStatusPostCoronaryStentPlacement": { "371809004": ( "Recurrent angina status post coronary stent placement (disorder)", [], ) }, "RecurrentAnginaStatusPostDirectionalCoronaryAtherectomy": { "371812001": ( "Recurrent angina status post directional coronary atherectomy (disorder)", [], ) }, "RecurrentAnginaStatusPostPercutaneousTransluminalCoronaryAngioplasty": { "371808007": ( "Recurrent angina status post percutaneous transluminal coronary angioplasty (disorder)", [], ) }, "RecurrentAnginaStatusPostRotationalAtherectomy": { "371811008": ( "Recurrent angina status post rotational atherectomy (disorder)", [], ) }, "RecurrentTumor": {"25173007": ("Recurrent tumor (finding)", [])}, "Red": {"371240000": ("Red", [4206, 4255, 4411, 8122])}, "RedAndWhiteCattleBreed": {"133258007": ("Red and White cattle breed", [7480])}, "RedAngusCattleBreed": {"133259004": ("Red Angus cattle breed", [7480])}, "RedBororoCattleBreed": {"133758006": ("Red Bororo cattle breed", [7480])}, "RedBrangusCattleBreed": {"133749004": ("Red Brangus cattle breed (organism)", [])}, "RedBrangusXZebuCattleBreed": { "133749004": ("Red Brangus X zebu cattle breed", [7480]) }, "RedColor": {"371240000": ("Red color (qualifier value)", [])}, "RedDesertCattleBreed": {"133759003": ("Red Desert cattle breed", [7480])}, "RedEngadineSheepBreed": {"131853001": ("Red Engadine sheep breed", [7480])}, "RedFlemishCattleBreed": {"133386001": ("Red Flemish cattle breed", [7480])}, "RedFree": {"405739002": ("Red free", [4206])}, "RedFriesianCattleBreed": {"133586000": ("Red Friesian cattle breed", [7480])}, "RedGallowayCattleBreed": {"133449003": ("Red Galloway cattle breed", [7480])}, "RedHampracePigBreed": {"132044007": ("Red Hamprace pig breed", [7480])}, "RedKandhariCattleBreed": {"133760008": ("Red Kandhari cattle breed", [7480])}, "RedOpticalFilter": {"445279009": ("Red optical filter", [4204, 8124])}, "RedOpticalFilterOfOpticalMicroscope": { "445279009": ("Red optical filter of optical microscope (physical object)", []) }, "RedPollCattleBreed": {"88807001": ("Red Poll cattle breed (organism)", [])}, "RedPollCowBreed": {"88807001": ("Red Poll cow breed", [7480])}, "RedPolledØstlandCattleBreed": { "133260009": ("Red Polled Østland cattle breed", [7480]) }, "RedSindhiCattleBreed": {"133625008": ("Red Sindhi cattle breed", [7480])}, "RedSteppeCattleBreed": {"133261008": ("Red Steppe cattle breed", [7480])}, "RedWattlePig": {"74568001": ("Red wattle pig (organism)", [])}, "RedWattlePigBreed": {"74568001": ("Red wattle pig breed", [7480])}, "RedboneCoonhound": {"25171009": ("Redbone coonhound (organism)", [])}, "RedboneCoonhoundDogBreed": {"25171009": ("Redbone coonhound dog breed", [7480])}, "ReductionMammoplasty": {"59214008": ("Reduction mammoplasty", [6051, 6083, 6084])}, "RefractiveError": {"39021009": ("Refractive Error", [4222])}, "ReggianaCattleBreed": {"133262001": ("Reggiana cattle breed", [7480])}, "RegionOfMetatarsal": {"280711000": ("Region of metatarsal (body structure)", [])}, "RegionOfNasopharynx": { "360955006": ("Region of nasopharynx (body structure)", []) }, "Regional": {"410674003": ("Regional", [6335, 6336, 6337])}, "RegionalAnesthesia": {"27372005": ("Regional anesthesia", [611, 612])}, "RegionalCalcificationDistribution": { "129767008": ("Regional calcification distribution", [6012, 6013]) }, "RegionalLymphNode": {"312500006": ("regional lymph node", [7600, 8134])}, "RegionalLymphNodeStructure": { "312500006": ("Regional lymph node structure (body structure)", []) }, "Registrar": {"158971006": ("Registrar", [7450, 7452])}, "RegurgitantFlow": {"397417004": ("Regurgitant Flow", [12221])}, "RegurgitantFraction": { "399301000": ( "Regurgitant Fraction", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "Regurgitation": {"10337008": ("Regurgitation", [3711])}, "RegusCattleBreed": {"133450003": ("Regus cattle breed", [7480])}, "Rehabilitation": {"309940004": ("Rehabilitation", [7030])}, "RehabilitationDepartment": { "309940004": ("Rehabilitation department (environment)", []) }, "RelativeTimeProperty": { "118578006": ("Relative time (property) (qualifier value)", []) }, "Remifentanil": {"386839004": ("Remifentanil", [65, 66])}, "RemovalOfBreastImplant": {"27315000": ("Removal of breast implant", [6083, 6084])}, "RemovalOfCatheter": {"103715008": ("Removal of catheter", [9])}, "RemovalOfDevice": {"128538000": ("Removal of device", [8109])}, "RemovalOfForeignBody": {"10849003": ("Removal of foreign body", [9])}, "RemovalOfImplantSincePreviousMammogram": { "129730000": ("Removal of implant since previous mammogram", [6002, 6003]) }, "RenalArtery": { "2841007": ( "Renal artery", [ 4, 3010, 3604, 3606, 3630, 3827, 3837, 4030, 4042, 7111, 7151, 7192, 8134, 9514, 12103, 12115, ], ) }, "RenalCellCarcinoma": {"702391001": ("Renal cell carcinoma", [638, 639])}, "RenalFailure": {"42399005": ("Renal failure", [3413, 3755])}, "RenalFailureSyndrome": {"42399005": ("Renal failure syndrome (disorder)", [])}, "RenalHilarLymphNode": {"249708006": ("renal hilar lymph node", [7600, 8134])}, "RenalImpairment": {"236423003": ("Renal impairment (disorder)", [])}, "RenalPelvis": {"25990002": ("Renal pelvis", [4, 7151, 7192, 8134, 9514])}, "RenalPelvisStructure": { "25990002": ("Renal pelvis structure (body structure)", []) }, "RenalStone": {"386103008": ("Renal stone", [300])}, "RenalVein": { "56400007": ( "Renal vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12115], ) }, "RendenaCattleBreed": {"133451004": ("Rendena cattle breed", [7480])}, "ReniteloCattleBreed": {"133826006": ("Renitelo cattle breed (organism)", [])}, "ReniteloXZebuCattleBreed": {"133826006": ("Renitelo X zebu cattle breed", [7480])}, "RepairByNailing": {"35860002": ("Repair by nailing", [7310])}, "RepairOfAtrialSeptalDefectWithProsthesisByClosedHeartTechnique": { "30123000": ( "Repair of atrial septal defect with prosthesis by closed heart technique (procedure)", [], ) }, "RepairOfCoarctationOfAorta": { "274022008": ("Repair of coarctation of aorta", [12247]) }, "RepairOfDefectOfTheAtrioventricularSeptum": { "174836000": ("Repair of defect of the atrioventricular septum", [12247]) }, "RepairOfPartialAnomalousPulmonaryVenousConnection": { "174900004": ( "Repair of partial anomalous pulmonary venous connection (procedure)", [], ) }, "RepairOfTotalAnomalousPulmonaryVenousConnection": { "174830006": ("Repair of total anomalous pulmonary venous connection", [12247]) }, "RepairOfVentricularSeptalDefectWithProsthesis": { "89814007": ( "Repair of ventricular septal defect with prosthesis (procedure)", [], ) }, "RepartidaGoatBreed": {"131647003": ("Repartida goat breed", [7480])}, "ReplacementOfCatheter": {"103713001": ("Replacement of catheter (procedure)", [])}, "Representative": {"371916004": ("Representative", [3676])}, "RepresentativeNumericEstimationTechnique": { "371916004": ( "Representative - numeric estimation technique (qualifier value)", [], ) }, "RequestByPhysician": {"103321005": ("Request by Physician", [3205])}, "RequestByPhysicianContextualQualifier": { "103321005": ( "Request by physician (contextual qualifier) (qualifier value)", [], ) }, "ResavaPigBreed": {"133205002": ("Resava pig breed", [7480])}, "Resident": {"405277009": ("Resident", [7450, 7452, 9536, 9555, 9562])}, "ResidentPhysician": {"405277009": ("Resident physician (occupation)", [])}, "ResolutionOfIschemia": {"428824000": ("Resolution of ischemia", [3235])}, "ResolutionOfMyocardialIschemia": { "428824000": ("Resolution of myocardial ischemia (situation)", []) }, "RespirationAssessment": {"364062005": ("Respiration assessment", [3441])}, "RespirationImpedanceWaveform": { "128436004": ("Respiration impedance waveform", [3003]) }, "RespirationImpedanceWaveformFunction": { "128436004": ( "Respiration impedance waveform, function (observable entity)", [], ) }, "RespirationIntermittent": {"271824009": ("respiration intermittent", [3416])}, "RespirationObservable": { "364062005": ("Respiration observable (observable entity)", []) }, "RespiratoryCyclePoint": { "272517003": ("Respiratory cycle point (qualifier value)", []) }, "RespiratoryMedicineDepartment": { "309918008": ("Respiratory medicine department (environment)", []) }, "RespiratoryRate": {"86290005": ("Respiratory rate (observable entity)", [])}, "RespiratoryStimulant": {"418760000": ("Respiratory stimulant", [621, 622])}, "Restenotic": {"371893007": ("Restenotic", [3712])}, "RestenoticLesionOfCoronaryArtery": { "371893007": ("Restenotic lesion of coronary artery (finding)", []) }, "RestingState": { "128975004": ( "Resting State", [3101, 3102, 3207, 3250, 3262, 3405, 3602, 3651, 10045, 12002], ) }, "Restrictive": {"253551005": ("Restrictive", [3707])}, "RestrictiveCardiomyopathy": { "90828009": ("Restrictive cardiomyopathy", [3700, 3728]) }, "RestrictiveVentricularSeptalDefect": { "253551005": ("Restrictive ventricular septal defect (disorder)", []) }, "ResurfacingOfHeadOfFemur": { "445185007": ("Resurfacing of head of femur (procedure)", []) }, "ResurfacingOfTheFemoralHead": { "445185007": ("Resurfacing of the femoral head", [7301]) }, "ResurfacingOfThePatella": {"239503002": ("Resurfacing of the patella", [7301])}, "Retina": {"5665001": ("Retina", [4029, 4209, 4211, 8134])}, "RetinalStructure": {"5665001": ("Retinal structure (body structure)", [])}, "RetinalThicknessAnalyzer": {"416567007": ("Retinal Thickness Analyzer", [4210])}, "RetintaCattleBreed": {"133263006": ("Retinta cattle breed", [7480])}, "RetintaExtremenaGoatBreed": { "131615008": ("Retinta Extremena goat breed", [7480]) }, "RetractionOfNipple": {"31845005": ("Retraction of nipple (disorder)", [])}, "Retriever": {"1974006": ("Retriever", [7480])}, "RetrocecalLymphNode": {"281847004": ("retrocecal lymph node", [7600, 8134])}, "RetrogradeDirection": {"312004007": ("Retrograde Direction", [12306])}, "RetrogradeFlow": {"312004007": ("Retrograde Flow", [12221])}, "RetromolarTrigone": {"85816001": ("retromolar trigone", [7601, 8134])}, "RetroperitonealCompartmentStructure": { "82849001": ("Retroperitoneal compartment structure (body structure)", []) }, "RetroperitonealLymphNode": { "91394001": ("retroperitoneal lymph node", [7600, 8134]) }, "RetroperitonealSpace": { "82849001": ("Retroperitoneal space", [7151, 7154, 7192, 8134, 9514]) }, "Retroperitoneum": {"82849001": ("Retroperitoneum", [4])}, "RetropharyngealLymphNode": { "25683005": ("retropharyngeal lymph node", [7600, 8134]) }, "RetropyloricLymphNode": {"280402004": ("retropyloric lymph node", [7600, 8134])}, "RetrotrachealLymphNode": { "127931000": ("retrotracheal lymph node (mediastinal)", [7600, 8134]) }, "RetrotrachealLymphNodeMediastinal": { "127931000": ("Retrotracheal lymph node (mediastinal) (body structure)", []) }, "ReversibleMyocardialPerfusionDefect": { "251055003": ("Reversible myocardial perfusion defect", [3113]) }, "RexCatBreed": {"1809004": ("Rex cat breed", [7480])}, "RhaetianGrayCattleBreed": {"133462004": ("Rhaetian Gray cattle breed", [7480])}, "RheinbergFilter": {"445623003": ("Rheinberg filter", [8124])}, "RheinbergFilterOfOpticalMicroscope": { "445623003": ("Rheinberg filter of optical microscope (physical object)", []) }, "Rhenium186re": {"395865006": ("Rhenium[186Re] (substance)", [])}, "Rhese": {"399234000": ("Rhese", [4012])}, "RheseProjection": {"399234000": ("Rhese projection (qualifier value)", [])}, "RheumaticFever": {"58718002": ("Rheumatic Fever", [12248, 12249])}, "Rheumatology": {"309941000": ("Rheumatology", [7030])}, "RheumatologyDepartment": { "309941000": ("Rheumatology department (environment)", []) }, "RhinelandHeavyDraftHorseBreed": { "132965004": ("Rhineland Heavy Draft horse breed", [7480]) }, "RhodamineBStain": {"27671009": ("rhodamine B stain", [8112])}, "RhodamineStain": {"406977005": ("rhodamine stain", [8112])}, "RhodesianRidgebackDog": {"74173000": ("Rhodesian ridgeback dog", [7480])}, "Rhodium": {"59801003": ("Rhodium", [10006, 10016, 10067])}, "RhoenschafSheepBreed": {"131854007": ("Rhoenschaf sheep breed", [7480])}, "Rib": { "113197003": ( "Rib", [4, 4009, 4030, 4031, 4042, 6102, 6109, 6114, 7151, 7155, 7192, 8134, 9514], ) }, "RideauArcottSheepBreed": {"132703001": ("Rideau Arcott sheep breed", [7480])}, "Right": {"24028007": ("Right", [2, 5, 211, 244, 245, 247, 3019, 12117])}, "Right20DegreeDorsalLeftVentralOblique": { "442627009": ("Right 20 degree dorsal-left ventral oblique", [7484]) }, "Right20DegreeDorsalLeftVentralObliqueProjection": { "442627009": ( "Right 20 degree dorsal-left ventral oblique projection (qualifier value)", [], ) }, "Right20DegreeRostralLeftCaudalOblique": { "442743006": ("Right 20 degree rostral-left caudal oblique", [7484]) }, "Right20DegreeRostralLeftCaudalObliqueProjection": { "442743006": ( "Right 20 degree rostral-left caudal oblique projection (qualifier value)", [], ) }, "Right20DegreeVentralLeftDorsalOblique": { "442612009": ("Right 20 degree ventral-left dorsal oblique", [7484]) }, "Right20DegreeVentralLeftDorsalObliqueProjection": { "442612009": ( "Right 20 degree ventral-left dorsal oblique projection (qualifier value)", [], ) }, "Right30DegreeCaudalLeftRostralOblique": { "442605000": ("Right 30 degree caudal-left rostral oblique", [7484]) }, "Right30DegreeCaudalLeftRostralObliqueProjection": { "442605000": ( "Right 30 degree caudal-left rostral oblique projection (qualifier value)", [], ) }, "Right45DegreeDorsalLeftVentralOblique": { "442660007": ("Right 45 degree dorsal-left ventral oblique", [7484]) }, "Right45DegreeDorsalLeftVentralObliqueProjection": { "442660007": ( "Right 45 degree dorsal-left ventral oblique projection (qualifier value)", [], ) }, "Right45DegreeVentralLeftDorsalOblique": { "442628004": ("Right 45 degree ventral-left dorsal oblique", [7484]) }, "Right45DegreeVentralLeftDorsalObliqueProjection": { "442628004": ( "Right 45 degree ventral-left dorsal oblique projection (qualifier value)", [], ) }, "RightAndLeft": {"51440002": ("Right and left (qualifier value)", [])}, "RightAnteriorApicalPeripheralZoneOfProstate": { "716936005": ( "Right anterior apical peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightAnteriorApicalTransitionZoneOfProstate": { "716930004": ( "Right anterior apical transition zone of prostate", [6300, 6301, 6304], ) }, "RightAnteriorBasalPeripheralZoneOfProstate": { "716904003": ( "Right anterior basal peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightAnteriorBasalTransitionZoneOfProstate": { "716896009": ( "Right anterior basal transition zone of prostate", [6300, 6301, 6304], ) }, "RightAnteriorMiddlePeripheralZoneOfProstate": { "716919002": ( "Right anterior middle peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightAnteriorMiddleTransitionZoneOfProstate": { "716913001": ( "Right anterior middle transition zone of prostate", [6300, 6301, 6304], ) }, "RightAnteriorOblique": { "399356000": ("right anterior oblique", [501, 3466, 4010]) }, "RightAnteriorObliqueEmissiveProjection": { "399108003": ("Right anterior oblique", [26, 501]) }, "RightAnteriorObliqueProjection": { "399356000": ("Right anterior oblique projection (qualifier value)", []) }, "RightApicalAnteriorFibromuscularStromaOfProstate": { "716926002": ( "Right apical anterior fibromuscular stroma of prostate", [6300, 6301, 6304], ) }, "RightApicalPeripheralZoneOfProstate": { "716934008": ("Right apical peripheral zone of prostate", [6300, 6302]) }, "RightApicalTransitionZoneOfProstate": { "716928001": ("Right apical transition zone of prostate", [6300, 6302, 6303]) }, "RightAtrialPressure": {"276755008": ("Right Atrial Pressure", [3641])}, "RightAtrialStructure": { "73829009": ("Right atrial structure (body structure)", []) }, "RightAtrioventricularOstium": { "90561006": ("Right atrioventricular ostium", [3011, 8134]) }, "RightAtrioventricularOstiumStructure": { "90561006": ("Right atrioventricular ostium structure (body structure)", []) }, "RightAtrium": { "73829009": ( "Right atrium", [ 4, 3010, 3011, 3462, 3608, 3630, 4042, 7151, 7192, 8134, 9514, 12284, 12305, ], ) }, "RightAtriumPressureWaveform": { "128440008": ("Right atrium pressure waveform", [3003]) }, "RightAtriumPressureWaveformFunction": { "128440008": ( "Right atrium pressure waveform, function (observable entity)", [], ) }, "RightAuricularAppendage": { "68300000": ( "Right auricular appendage", [4, 3010, 3011, 4042, 7151, 7192, 8134, 9514, 12284], ) }, "RightBasalAnteriorFibromuscularStromaOfProstate": { "716892006": ( "Right basal anterior fibromuscular stroma of prostate", [6300, 6301, 6304], ) }, "RightBasalPeripheralZoneOfProstate": { "716902004": ("Right basal peripheral zone of prostate", [6300, 6302]) }, "RightBasalTransitionZoneOfProstate": { "716894007": ("Right basal transition zone of prostate", [6300, 6302, 6303]) }, "RightBranchOfAtrioventricularBundle": { "57383004": ("Right branch of Atrioventricular bundle", [3011, 8134]) }, "RightBranchOfHepaticArtery": { "69421009": ( "Right Branch of Hepatic Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "RightBreast": {"73056007": ("Right breast", [6022, 6023])}, "RightBreastStructure": { "73056007": ("Right breast structure (body structure)", []) }, "RightBundleBranchBlock": {"59118001": ("Right bundle branch block", [3230])}, "RightCaudalLeftRostralOblique": { "442629007": ("Right caudal-left rostral oblique", [7484]) }, "RightCaudalLeftRostralObliqueProjection": { "442629007": ( "Right caudal-left rostral oblique projection (qualifier value)", [], ) }, "RightCommonCarotidArtery": {"65355003": ("Right Common Carotid Artery", [12291])}, "RightCommonCarotidArteryStructure": { "65355003": ("Right common carotid artery structure (body structure)", []) }, "RightCoronaryArtery": { "13647002": ( "Right Coronary Artery", [3015, 3016, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12292], ) }, "RightCoronaryArteryOstium": { "56789007": ( "Right Coronary Artery Ostium", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "RightCoronaryArteryStructure": { "13647002": ("Right coronary artery structure (body structure)", []) }, "RightCoronaryDominance": {"253728007": ("Right Coronary Dominance", [3710])}, "RightDominantCoronarySystem": { "253728007": ("Right dominant coronary system (disorder)", []) }, "RightDorsalLeftVentralOblique": { "442607008": ("Right dorsal-left ventral oblique", [7484]) }, "RightDorsalLeftVentralObliqueProjection": { "442607008": ( "Right dorsal-left ventral oblique projection (qualifier value)", [], ) }, "RightDowngaze": {"255524005": ("Right downgaze", [4201])}, "RightFemoralArtery": { "69833005": ( "Right femoral artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "RightGaze": {"255531009": ("Right gaze", [4201])}, "RightGlennShuntProcedure": {"444001009": ("Right Glenn shunt procedure", [12247])}, "RightHepaticVein": { "272998002": ( "Right Hepatic Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "RightHypochondriacRegion": { "133946002": ("Right hypochondriac region", [4, 7151, 7192, 8134, 9514]) }, "RightHypochondriacRegionStructure": { "133946002": ("Right hypochondriac region structure (body structure)", []) }, "RightInferiorPulmonaryVein": { "113273001": ("Right Inferior Pulmonary Vein", [12280]) }, "RightInguinalRegion": { "37117007": ("Right inguinal region", [4, 7151, 7192, 8134, 9514]) }, "RightInguinalRegionStructure": { "37117007": ("Right inguinal region structure (body structure)", []) }, "RightLateral": {"399198007": ("right lateral", [501, 4010])}, "RightLateralDecubitus": {"102535000": ("right lateral decubitus", [20, 6206])}, "RightLateralDecubitusPosition": { "102535000": ("Right lateral decubitus position (finding)", []) }, "RightLateralEmissiveProjection": { "399297009": ("Right lateral projection", [26, 501]) }, "RightLateralMiddlePeripheralZoneOfProstate": { "716917000": ("Right lateral middle peripheral zone of prostate", [6300, 6302]) }, "RightLateralProjection": { "399198007": ("Right lateral projection (qualifier value)", []) }, "RightLeftLateral": {"399173006": ("Right-left lateral", [7484])}, "RightLobeOfThyroid": {"29565003": ("Right lobe of thyroid", [12131])}, "RightLowerQuadrantOfAbdomen": { "48544008": ("Right lower quadrant of abdomen", [4, 7151, 7192, 8134, 9514]) }, "RightLowerSegment": {"255496004": ("Right Lower Segment", [12219, 12237])}, "RightLumbarRegion": { "1017211000": ("Right lumbar region", [4, 7151, 7192, 8134, 9514]) }, "RightLumbarRegion_Inactive": { "133944004": ("Right lumbar region (body structure)", []) }, "RightMainBranchOfPortalVein": { "73931004": ( "Right Main Branch of Portal Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "RightMainBronchus": { "70074004": ( "Right main bronchus", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514], ) }, "RightMainBronchusStructure": { "70074004": ("Right main bronchus structure (body structure)", []) }, "RightMiddleAnteriorFibromuscularStromaOfProstate": { "716909008": ( "Right middle anterior fibromuscular stroma of prostate", [6300, 6301, 6304], ) }, "RightMiddleTransitionZoneOfProstate": { "716911004": ("Right middle transition zone of prostate", [6300, 6302, 6303]) }, "RightOblique": {"399236003": ("right oblique", [501, 4010])}, "RightObliqueProjection": { "399236003": ("Right oblique projection (qualifier value)", []) }, "RightPleura": {"44788007": ("Right Pleura", [12294])}, "RightPleuraStructure": { "44788007": ("Right pleura structure (body structure)", []) }, "RightPosteriorAVCoronaryArtery": { "12800002": ( "Right posterior AV Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "RightPosteriorApicalTransitionZoneOfProstate": { "716932007": ( "Right posterior apical transition zone of prostate", [6300, 6301, 6304], ) }, "RightPosteriorBasalTransitionZoneOfProstate": { "716898005": ( "Right posterior basal transition zone of prostate", [6300, 6301, 6304], ) }, "RightPosteriorMiddleTransitionZoneOfProstate": { "716915008": ( "Right posterior middle transition zone of prostate", [6300, 6301, 6304], ) }, "RightPosteriorOblique": {"399038007": ("right posterior oblique", [501, 4010])}, "RightPosteriorObliqueEmissiveProjection": { "399075002": ("Right posterior oblique", [26, 501]) }, "RightPosteriorObliqueProjection": { "399038007": ("Right posterior oblique projection (qualifier value)", []) }, "RightPosterolateralApicalPeripheralZoneOfProstate": { "716938006": ( "Right posterolateral apical peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightPosterolateralBasalPeripheralZoneOfProstate": { "716906001": ( "Right posterolateral basal peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightPosterolateralMiddlePeripheralZoneOfProstate": { "716921007": ( "Right posterolateral middle peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightPosteromedialApicalPeripheralZoneOfProstate": { "716940001": ( "Right posteromedial apical peripheral zone of prostate", [6300, 6301, 6303, 6304], ) }, "RightPosteromedialBasalPeripheralZoneOfProstate": { "836428004": ( "Right posteromedial basal peripheral zone of prostate", [6300, 6304], ) }, "RightPosteromedialMiddlePeripheralZoneOfProstate": { "716923005": ( "Right posteromedial middle peripheral zone of prostate", [6300, 6301, 6302, 6303, 6304], ) }, "RightPulmonaryArtery": { "78480002": ( "Right pulmonary artery", [ 4, 3010, 3604, 3606, 3630, 3829, 4042, 7151, 7192, 8134, 9514, 12280, 12305, ], ) }, "RightPulmonaryVein": { "91539005": ("Right Pulmonary Vein", [3827, 3840, 7151, 7192, 9514]) }, "RightRostralLeftCaudalOblique": { "442747007": ("Right rostral-left caudal oblique", [7484]) }, "RightRostralLeftCaudalObliqueProjection": { "442747007": ( "Right rostral-left caudal oblique projection (qualifier value)", [], ) }, "RightSeminalVesicle": { "74308000": ("Right seminal vesicle", [6300, 6301, 6302, 6303, 6304]) }, "RightSidedBidirectionalGlennShuntProcedure": { "444034006": ("Right-sided bidirectional Glenn shunt procedure", [12247]) }, "RightSinusOfValsalva": {"89093001": ("Right Sinus of Valsalva", [12291])}, "RightSubclavianArtery": {"29700009": ("Right Subclavian Artery", [12291])}, "RightSuperiorPulmonaryVein": { "8629005": ("Right Superior Pulmonary Vein", [12280]) }, "RightSuperiorVenaCava": {"443444008": ("Right Superior Vena Cava", [12282])}, "RightToLeftCardiovascularShunt": { "79692001": ("Right to left cardiovascular shunt", [12221]) }, "RightUpgaze": {"255526007": ("Right upgaze", [4201])}, "RightUpperQuadrantOfAbdomen": { "50519007": ("Right upper quadrant of abdomen", [4, 7151, 7192, 8134, 9514]) }, "RightUpperSegment": {"255499006": ("Right Upper Segment", [12219, 12237])}, "RightVentralLeftDorsalOblique": { "442595001": ("Right ventral-left dorsal oblique", [7484]) }, "RightVentralLeftDorsalObliqueProjection": { "442595001": ( "Right ventral-left dorsal oblique projection (qualifier value)", [], ) }, "RightVentricle": { "53085002": ( "Right ventricle", [ 4, 3010, 3011, 3462, 3463, 3609, 3630, 4042, 7151, 7152, 7192, 8134, 9514, 12287, 12288, 12305, ], ) }, "RightVentricleApex": {"128565007": ("Right ventricle apex", [3609, 3630])}, "RightVentricleBasalSegment": { "277635008": ("Right Ventricle Basal Segment", [12305]) }, "RightVentricleInflow": { "8017000": ( "Right ventricle inflow", [4, 3010, 3011, 3609, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "RightVentricleMidventricularSegment": { "277634007": ("Right Ventricle Midventricular Segment", [12305]) }, "RightVentricleOutflowTract": { "44627009": ( "Right ventricle outflow tract", [ 4, 3010, 3011, 3609, 3610, 3630, 4042, 7151, 7192, 8134, 9514, 12223, 12236, 12280, 12305, ], ) }, "RightVentriclePressureWaveform": { "128439006": ("Right ventricle pressure waveform", [3003]) }, "RightVentriclePressureWaveformFunction": { "128439006": ( "Right ventricle pressure waveform, function (observable entity)", [], ) }, "RightVentricleToPulmonaryArteryConduitAnastomosis": { "443328003": ( "Right Ventricle to Pulmonary Artery Conduit Anastomosis", [12288], ) }, "RightVentricularCardiacIndex": { "427990004": ("Right ventricular cardiac index (observable entity)", []) }, "RightVentricularCardiacOutput": { "428628004": ("Right ventricular cardiac output (observable entity)", []) }, "RightVentricularCavitySize": { "250964004": ("Right ventricular cavity size (observable entity)", []) }, "RightVentricularEndDiastolicPressure": { "276774000": ("Right Ventricular End-Diastolic Pressure", [3641]) }, "RightVentricularIndexOfMyocardialPerformance": { "399154007": ("Right Ventricular Index of Myocardial Performance", [12204]) }, "RightVentricularInflowTractView": { "398998003": ("Right Ventricular Inflow Tract View", [501, 12226]) }, "RightVentricularOutflowTractView": { "399195005": ("Right Ventricular Outflow Tract View", [501, 12226]) }, "RightVentricularPeakSystolicPressure": { "399023006": ("Right Ventricular Peak Systolic Pressure", [12204]) }, "RightVentricularStrokeIndex": { "429619008": ("Right ventricular stroke index (observable entity)", []) }, "RightVentricularStrokeVolume": { "429483009": ("Right ventricular stroke volume (observable entity)", []) }, "RightVentricularStructure": { "53085002": ("Right ventricular structure (body structure)", []) }, "RightVentricularSystolicPressure": { "276772001": ("Right Ventricular Systolic Pressure", [3641]) }, "RightVentricularWallMotion": { "250949004": ("Right ventricular wall motion (observable entity)", []) }, "RightVentriculogram": {"265483003": ("Right ventriculogram (procedure)", [])}, "RightVentriculography": {"265483003": ("Right Ventriculography", [3405, 3428])}, "RijnlamASheepBreed": {"132697002": ("Rijnlam-A sheep breed", [7480])}, "RioLimonDairyCriolloCattleBreed": { "133463009": ("Rio Limon Dairy Criollo cattle breed", [7480]) }, "RiopardenzeCattleBreed": { "133827002": ("Riopardenze cattle breed (organism)", []) }, "RiopardenzeXZebuCattleBreed": { "133827002": ("Riopardenze X zebu cattle breed", [7480]) }, "RiskFactor": {"80943009": ("Risk factor (observable entity)", [])}, "RiskFactorsPresentAtHeartDiseaseScreening": { "171224000": ( "Risk factors present at heart disease screening (observable entity)", [], ) }, "Robert": {"425035007": ("Robert", [4012])}, "RobertProjection": {"425035007": ("Robert projection (qualifier value)", [])}, "RockAlpineGoat": {"74745008": ("Rock alpine goat (organism)", [])}, "RockAlpineGoatBreed": {"74745008": ("Rock alpine goat breed", [7480])}, "RockyMountainHorseHorseBreed": { "133156004": ("Rocky Mountain Horse horse breed", [7480]) }, "RodopiCattleBreed": {"133464003": ("Rodopi cattle breed", [7480])}, "RojhanCattleBreed": {"133626009": ("Rojhan cattle breed", [7480])}, "RolledInferior": {"414493004": ("Rolled Inferior", [4015])}, "RolledLateral": {"399197002": ("Rolled Lateral", [4015])}, "RolledMedial": {"399226006": ("Rolled Medial", [4015])}, "RolledSuperior": {"415670009": ("Rolled Superior", [4015])}, "RomagnolaCattleBreed": {"131437007": ("Romagnola cattle breed", [7480])}, "RomagnolaPigBreed": {"132195006": ("Romagnola pig breed", [7480])}, "RomanianBrownCattleBreed": {"133466001": ("Romanian Brown cattle breed", [7480])}, "RomanianLargeWhitePigBreed": { "133201006": ("Romanian Large White pig breed", [7480]) }, "RomanianMeatPigPigBreed": {"133202004": ("Romanian Meat Pig pig breed", [7480])}, "RomanianNativeBaltaretPigBreed": { "133196002": ("Romanian Native, Baltaret pig breed", [7480]) }, "RomanianNativeStocliPigBreed": { "133195003": ("Romanian Native, Stocli pig breed", [7480]) }, "RomanianRedCattleBreed": {"133465002": ("Romanian Red cattle breed", [7480])}, "RomanianSaddleHorseHorseBreed": { "132966003": ("Romanian Saddle Horse horse breed", [7480]) }, "RomanianSteppeCattleBreed": { "131518000": ("Romanian Steppe cattle breed", [7480]) }, "RomanovSheep": {"32145006": ("Romanov sheep (organism)", [])}, "RomanovSheepBreed": {"32145006": ("Romanov sheep breed", [7480])}, "RomanowskyStain": {"255810000": ("Romanowsky stain", [8112])}, "RomboSyndrome": {"721904001": ("Rombo syndrome", [4405])}, "RomedaleSheep": {"79603002": ("Romedale sheep (organism)", [])}, "RomedaleSheepBreed": {"79603002": ("Romedale sheep breed", [7480])}, "RomneletSheep": {"112487006": ("Romnelet sheep (organism)", [])}, "RomneletSheepBreed": {"112487006": ("Romnelet sheep breed", [7480])}, "RomneyMarshSheep": {"3099004": ("Romney marsh sheep (organism)", [])}, "RomneyMarshSheepBreed": {"3099004": ("Romney marsh sheep breed", [7480])}, "RomneySheepBreed": {"132807006": ("Romney sheep breed", [7480])}, "RomosinuanoCattleBreed": {"133264000": ("Romosinuano cattle breed", [7480])}, "RongchangPigBreed": {"132150004": ("Rongchang pig breed", [7480])}, "RootOfAorta": {"8128003": ("Root of Aorta", [12289, 12291])}, "Rosacea": {"398909004": ("Rosacea", [4405])}, "RoseBengal": {"408742009": ("Rose bengal (substance)", [])}, "RoseBengalContainingProduct": {"330888007": ("Rose Bengal", [4200])}, "RoseBengalSodiumI131": {"111159009": ("Rose Bengal sodium I^131^", [25])}, "RoseBengalStain": {"408742009": ("rose bengal stain", [8112])}, "Rosenberg": {"425042007": ("Rosenberg", [4012])}, "RosenbergProjection": { "425042007": ("Rosenberg projection (qualifier value)", []) }, "RosolicAcidSodiumSaltStain": { "15529003": ("rosolic acid sodium salt stain", [8112]) }, "RostovPigBreed": {"132104002": ("Rostov pig breed", [7480])}, "Rostral20DegreeDorsalCaudoventralOblique": { "442730006": ("Rostral 20 degree dorsal-caudoventral oblique", [7484]) }, "Rostral20DegreeDorsalCaudoventralObliqueProjection": { "442730006": ( "Rostral 20 degree dorsal-caudoventral oblique projection (qualifier value)", [], ) }, "Rostral30DegreeVentralCaudodorsal": { "442588005": ("Rostral 30 degree ventral-caudodorsal", [7484]) }, "Rostral30DegreeVentralCaudodorsalProjection": { "442588005": ( "Rostral 30 degree ventral-caudodorsal projection (qualifier value)", [], ) }, "Rostrocaudal": {"442690000": ("Rostrocaudal", [7484])}, "RostrocaudalProjection": { "442690000": ("Rostrocaudal projection (qualifier value)", []) }, "RostrodorsalCaudoventralOblique": { "442637004": ("Rostrodorsal-caudoventral oblique", [7484]) }, "RostrodorsalCaudoventralObliqueProjection": { "442637004": ( "Rostrodorsal-caudoventral oblique projection (qualifier value)", [], ) }, "RostroventralCaudodorsal": {"442586009": ("Rostroventral-caudodorsal", [7484])}, "RostroventralCaudodorsalProjection": { "442586009": ("Rostroventral-caudodorsal projection (qualifier value)", []) }, "RotationAction": {"257912008": ("Rotation - action", [94])}, "RotationalAtherectomyDevice": { "102313007": ( "Rotational atherectomy device", [8, 3411, 3429, 4051, 7151, 7193], ) }, "RotationalAtherectomySpeed": { "371854003": ("Rotational Atherectomy Speed", [3425]) }, "RottalHorseBreed": {"132967007": ("Rottal horse breed", [7480])}, "RottweilerDog": {"14245006": ("Rottweiler dog", [7480])}, "RougeDeLQuestSheepBreed": {"132789004": ("Rouge de l'Quest sheep breed", [7480])}, "RoughAndSmoothCollie": {"58341007": ("Rough and smooth collie (organism)", [])}, "RoughAndSmoothDogBreed": {"58341007": ("Rough and smooth dog breed", [7480])}, "RoughCollie": {"31377001": ("Rough collie (organism)", [])}, "RoughCollieDogBreed": {"31377001": ("Rough collie dog breed", [7480])}, "RoughFellSheepBreed": {"131816007": ("Rough Fell sheep breed", [7480])}, "Round": {"42700002": ("Round", [6335, 6339, 6340])}, "RoundShape": {"42700002": ("Round shape", [6004, 6005, 6119])}, "RoundShapedCalcification": { "129756007": ("Round shaped calcification", [6010, 6011]) }, "RoundShapedRadiographicCalcification": { "129756007": ("Round shaped radiographic calcification (finding)", []) }, "RouteOfAdministration": {"410675002": ("Route of administration (attribute)", [])}, "Routine": {"373115008": ("Routine", [3676])}, "RoutineNumericEstimationTechnique": { "373115008": ("Routine - numeric estimation technique (qualifier value)", []) }, "RoutineProcedure": {"373113001": ("Routine procedure", [3671])}, "RoveGoatBreed": {"131639003": ("Rove goat breed", [7480])}, "RoyaVesubieGoatBreed": {"131614007": ("Roya-Vesubie goat breed", [7480])}, "RoyalCanadianMountedPoliceHorseHorseBreed": { "132968002": ("Royal Canadian Mounted Police Horse horse breed", [7480]) }, "RubidiumChlorideRb82": {"129503007": ("Rubidium chloride Rb^82^", [4021])}, "RuptureOfBreastImplant": {"237473006": ("Rupture of breast implant", [6072])}, "RupturedAneurysm": {"22039006": ("ruptured aneurysm", [3808])}, "RupturedSinusOfValsalva": {"21379009": ("Ruptured Sinus of Valsalva", [3709])}, "RussianBlackPiedCattleBreed": { "133265004": ("Russian Black Pied cattle breed", [7480]) }, "RussianBlueCat": {"84797007": ("Russian blue cat", [7480])}, "RussianBrownCattleBreed": {"133467005": ("Russian Brown cattle breed", [7480])}, "RussianHeavyDraftHorseBreed": { "133155000": ("Russian Heavy Draft horse breed", [7480]) }, "RussianLargeWhitePigBreed": { "132076002": ("Russian Large White pig breed", [7480]) }, "RussianLongEaredWhitePigBreed": { "132105001": ("Russian Long-Eared White pig breed", [7480]) }, "RussianSaddleHorseHorseBreed": { "132969005": ("Russian Saddle Horse horse breed", [7480]) }, "RussianShortEaredWhitePigBreed": { "132106000": ("Russian Short-Eared White pig breed", [7480]) }, "RussianTrotterHorseBreed": {"132994006": ("Russian Trotter horse breed", [7480])}, "RussianWhiteGoatBreed": {"131621007": ("Russian White goat breed", [7480])}, "RussoLaikaDogBreed": {"132572005": ("Russo-Laika dog breed", [7480])}, "RustaqiCattleBreed": {"133828007": ("Rustaqi cattle breed (organism)", [])}, "RustaqiXZebuCattleBreed": {"133828007": ("Rustaqi X zebu cattle breed", [7480])}, "RutherfordMorrisonPouch": { "243977002": ("Rutherford Morrison's pouch (body structure)", []) }, "RyaSheepBreed": {"132787002": ("Rya sheep breed", [7480])}, "RyelandSheepBreed": {"132706009": ("Ryeland sheep breed", [7480])}, "RygjaSheepBreed": {"132786006": ("Rygja sheep breed", [7480])}, "RätienGrayCattleBreed": {"133257002": ("Rätien Gray cattle breed", [7480])}, "SL96PigBreed": {"133221007": ("SL96 pig breed", [7480])}, "SPECT": {"105371005": ("SPECT", [3206, 3757])}, "SPMIPositiveStressForIschemia": { "371824008": ("s/p MI positive stress for ischemia", [3700]) }, "SPMPigBreed": {"132020005": ("SPM pig breed", [7480])}, "SRDGoatBreed": {"131640001": ("SRD goat breed", [7480])}, "STDepression": {"429622005": ("ST Depression (observable entity)", [])}, "STElevation": {"164931005": ("ST elevation (observable entity)", [])}, "STElevationMyocardialInfarction": { "401303003": ("ST Elevation Myocardial Infarction", [3723]) }, "STIntervalNormal": {"164929001": ("ST Interval Normal", [3231])}, "STSegmentDepression": {"26141007": ("ST depression", [3230, 3233])}, "STSegmentElevation": {"76388001": ("ST elevation", [3230, 3233])}, "SaanenGoat": {"21208000": ("Saanen goat (organism)", [])}, "SaanenGoatBreed": {"21208000": ("Saanen goat breed", [7480])}, "SableIslandHorseHorseBreed": { "132970006": ("Sable Island Horse horse breed", [7480]) }, "SabreCattleBreed": {"133829004": ("Sabre cattle breed (organism)", [])}, "SabreXZebuCattleBreed": {"133829004": ("Sabre X zebu cattle breed", [7480])}, "SabuesoEspañolDogBreed": { "132449006": ("Sabueso Español dog breed (organism)", []) }, "SabuesosEspañolesDogBreed": { "132449006": ("Sabuesos Españoles dog breed", [7480]) }, "SaccularAneurysm": {"54002007": ("saccular aneurysm", [3808])}, "SacralLymphNode": {"79926007": ("sacral lymph node", [7600, 8134])}, "SacroCoccygealSpine": { "1217254007": ( "Sacro-coccygeal Spine", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "SacrococcygealRegionOfSpineStructure": { "297174005": ("Sacrococcygeal region of spine structure (body structure)", []) }, "SacroiliacJoint": { "39723000": ( "Sacroiliac joint", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "SacroiliacJointStructure": { "39723000": ("Sacroiliac joint structure (body structure)", []) }, "Sacrum": { "54735007": ( "Sacrum", [ 4, 1000, 1001, 1005, 4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514, ], ) }, "SaddlebackPigBreed": {"132225006": ("Saddleback pig breed", [7480])}, "SaddlebredHorseSuperbreed": { "427136006": ("Saddlebred horse superbreed (organism)", []) }, "SaddlebredHorseSuperbreedHorseBreed": { "427136006": ("Saddlebred horse superbreed horse breed", [7480]) }, "SaffronStain": {"38271009": ("saffron stain", [8112])}, "SafraninStain": {"406988004": ("safranin stain", [8112])}, "Sagittal": {"30730003": ("Sagittal", [2, 6, 26, 501, 502, 4010, 6312])}, "SagittalObliqueAxial": {"399325008": ("sagittal-oblique axial", [501, 4010])}, "SagittalObliqueAxialProjection": { "399325008": ("Sagittal-oblique axial projection (qualifier value)", []) }, "SagittalObliqueAxisEmissiveProjection": { "399273000": ("Sagittal-oblique axial", [26, 501]) }, "SahelTypeSheepBreed": {"132785005": ("Sahel-type sheep breed", [7480])}, "SahfordCattleBreed": {"133830009": ("Sahford cattle breed (organism)", [])}, "SahfordXZebuCattleBreed": {"133830009": ("Sahford X zebu cattle breed", [7480])}, "SahiwalCattleBreed": {"133627000": ("Sahiwal cattle breed", [7480])}, "SaidiCattleBreed": {"131519008": ("Saidi cattle breed", [7480])}, "SaintBernardDog": {"83236005": ("Saint Bernard dog (organism)", [])}, "SaintBernardLongHairedDogBreed": { "132394001": ("Saint Bernard, Long-haired dog breed", [7480]) }, "SaintBernardShortHairedDogBreed": { "132395000": ("Saint Bernard, Short-haired dog breed", [7480]) }, "SaintHubertBloodhoundDogBreed": { "132373004": ("Saint Hubert bloodhound dog breed (organism)", []) }, "SakhalinWhitePigBreed": {"132113000": ("Sakhalin White pig breed", [7480])}, "SalernoHorseBreed": {"132981009": ("Salerno horse breed", [7480])}, "SalersCattleBreed": {"90612002": ("Salers cattle breed (organism)", [])}, "SalersCowBreed": {"90612002": ("Salers cow breed", [7480])}, "Saline": {"373757009": ("Saline", [70, 3850])}, "SalineBagProsthesisForImagingProcedure": { "102324009": ("Saline bag prosthesis for imaging procedure", [5]) }, "SalineBagProsthesisForImagingProcedureDevice": { "102324009": ( "Saline bag prosthesis for imaging procedure, device (physical object)", [], ) }, "SalineThrombectomy": {"371797002": ("Saline Thrombectomy", [3411, 3429])}, "SalineThrombectomyDevice": { "371797002": ("Saline thrombectomy device (physical object)", []) }, "SalivaryGland": { "385294005": ("Salivary gland", [645, 4028, 7151, 7192, 7601, 8134, 9514]) }, "SalivaryGlandStructure": { "385294005": ("Salivary gland structure (body structure)", []) }, "SalivaryGlands": {"385294005": ("Salivary Glands", [10044, 10060])}, "SalornCattleBreed": {"133267007": ("Salorn cattle breed", [7480])}, "SalukiDog": {"59528003": ("Saluki dog", [7480])}, "SalvageProcedure": {"257950002": ("Salvage Procedure", [3414])}, "Samarium153": {"419804008": ("Samarium 153 (substance)", [])}, "SamoyedDog": {"69474004": ("Samoyed dog", [7480])}, "SamplingForSmear": {"448895004": ("Sampling for smear (procedure)", [])}, "SamplingOfTissueSpecimen": {"433465004": ("Sampling of tissue specimen", [8111])}, "SanClementeGoatBreed": {"131636005": ("San Clemente goat breed", [7480])}, "SanMartineroCattleBreed": {"133269005": ("San Martinero cattle breed", [7480])}, "SanPierrePig": {"80979001": ("San Pierre pig (organism)", [])}, "SanPierrePigBreed": {"80979001": ("San Pierre pig breed", [7480])}, "SandalwoodHorseBreed": {"132982002": ("Sandalwood horse breed", [7480])}, "SandanHorseBreed": {"132983007": ("Sandan horse breed", [7480])}, "SanfratelloHorseBreed": {"133030008": ("Sanfratello horse breed", [7480])}, "SanheCattleBreed": {"131438002": ("Sanhe cattle breed", [7480])}, "SanheHorseBreed": {"133154001": ("Sanhe horse breed", [7480])}, "SanjiangWhitePigBreed": {"132121006": ("Sanjiang White pig breed", [7480])}, "SanoProcedure": {"442123009": ("Sano procedure", [12247])}, "SantaCruzCattleBreed": {"133750004": ("Santa Cruz cattle breed (organism)", [])}, "SantaCruzSheepBreed": {"131790005": ("Santa Cruz sheep breed", [7480])}, "SantaCruzXZebuCattleBreed": { "133750004": ("Santa Cruz X zebu cattle breed", [7480]) }, "SantaInêsSheepBreed": {"132784009": ("Santa Inês sheep breed", [7480])}, "SaphenofemoralJunction": { "128587003": ( "Saphenofemoral junction", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "SaphenopoplitealJunction": { "244415001": ( "Saphenopopliteal junction", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "SaphenousVein": { "362072009": ( "Saphenous vein", [4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "SaphenousVeinStructure": { "362072009": ("Saphenous vein structure (body structure)", []) }, "SarPlaninaSheepBreed": {"132783003": ("Sar Planina sheep breed", [7480])}, "SarabiCattleBreed": {"133270006": ("Sarabi cattle breed", [7480])}, "Sarcoma": {"1187396000": ("Sarcoma", [638, 639])}, "SarcomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "2424003": ( "Sarcoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "SarcomaOfSoftTissue": {"424952003": ("Sarcoma of soft tissue", [638, 639])}, "SardaGoatBreed": {"131626002": ("Sarda goat breed", [7480])}, "SardinianAngloArabHorseBreed": { "133075006": ("Sardinian Anglo-Arab horse breed", [7480]) }, "SardinianBrownCattleBreed": { "133479005": ("Sardinian brown cattle breed", [7480]) }, "SardinianCattleBreed": {"133478002": ("Sardinian cattle breed", [7480])}, "SardinianPigBreed": {"132257007": ("Sardinian pig breed", [7480])}, "SardinianPonyHorseBreed": {"133076007": ("Sardinian Pony horse breed", [7480])}, "SardinianSheepBreed": {"132852009": ("Sardinian sheep breed", [7480])}, "SardoModicanaCattleBreed": {"131520002": ("Sardo-Modicana cattle breed", [7480])}, "SarnyPigBreed": {"133227006": ("Sarny pig breed", [7480])}, "SarplaninacDogBreed": {"132571003": ("Sarplaninac dog breed", [7480])}, "SarvarHorseBreed": {"133077003": ("Sarvar horse breed", [7480])}, "SavinjaGrayCattleBreed": {"133480008": ("Savinja Gray cattle breed", [7480])}, "SayaguesaCattleBreed": {"133481007": ("Sayaguesa cattle breed", [7480])}, "ScaleneLymphNode": {"81132008": ("scalene lymph node", [7600, 8134])}, "ScalenousAnteriorMuscle": { "50755001": ( "Scalenous anterior muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "Scalp": {"41695006": ("Scalp", [4, 7151, 7192, 8134, 9514])}, "ScalpEEG": {"252721009": ("Scalp EEG", [3049])}, "ScalpStructure": {"41695006": ("Scalp structure (body structure)", [])}, "ScanningLaserOphthalmoscope": { "392001008": ("Scanning Laser Ophthalmoscope", [4202]) }, "ScanningLaserPolarimeter": {"392007007": ("Scanning Laser Polarimeter", [4210])}, "ScanningOrImagingWithVascularFlow": { "35202002": ("Scanning or imaging with vascular flow (procedure)", []) }, "Scaphoid": {"30518006": ("Scaphoid", [1000, 1001, 1006])}, "Scapula": { "79601000": ( "Scapula", [ 4, 1000, 1001, 1004, 4009, 4030, 4031, 4042, 6102, 6109, 6114, 7151, 7192, 8134, 9514, ], ) }, "Scar": {"12402003": ("Scar (morphologic abnormality)", [])}, "ScarTissue": { "12402003": ( "Scar tissue", [6030, 6031, 6040, 6102, 6138, 6202, 6203, 6403, 6405, 7151, 7191], ) }, "ScatteredFibroglandularDensities": { "129717001": ("Scattered fibroglandular densities", [6000, 6001]) }, "SchapendoesDogBreed": {"132570002": ("Schapendoes dog breed", [7480])}, "SchillerHoundDogBreed": {"132450006": ("Schiller Hound dog breed", [7480])}, "SchipperkeDog": {"21150005": ("Schipperke dog", [7480])}, "SchleswigHorseBreed": {"133078008": ("Schleswig horse breed", [7480])}, "SchnauzerSuperbreed": {"91429002": ("Schnauzer superbreed (organism)", [])}, "SchnauzerSuperbreedDogBreed": { "91429002": ("Schnauzer superbreed dog breed", [7480]) }, "SchoonebekerSheepBreed": {"132698007": ("Schoonebeker sheep breed", [7480])}, "Schuller": {"399290006": ("Schuller", [4012])}, "SchwarzwalderFuchseHorseBreed": { "133079000": ("Schwarzwalder Fuchse horse breed", [7480]) }, "SchwerfurtMeatPigBreed": {"132362006": ("Schwerfurt Meat pig breed", [7480])}, "SchwyzCattleBreed": {"133576001": ("Schwyz cattle breed", [7480])}, "SchwyzZeboidCattleBreed": { "133831008": ("Schwyz-Zeboid cattle breed (organism)", []) }, "SchwyzZeboidXZebuCattleBreed": { "133831008": ("Schwyz-Zeboid X zebu cattle breed", [7480]) }, "SchüllerProjection": {"399290006": ("Schüller projection (qualifier value)", [])}, "Sclera": {"18619003": ("Sclera", [4, 4029, 4209, 4211, 7151, 7192, 8134, 9514])}, "ScleralStructure": {"18619003": ("Scleral structure (body structure)", [])}, "SclerosingAdenosis": {"50916005": ("Sclerosing adenosis", [6030, 6031])}, "Score": {"246262008": ("Score (attribute)", [])}, "ScottishDeerhound": {"54858000": ("Scottish deerhound", [7480])}, "ScottishFoldCat": {"73049001": ("Scottish fold cat", [7480])}, "ScottishHighlandCattleBreed": { "83173002": ("Scottish Highland cattle breed (organism)", []) }, "ScottishHighlandCowBreed": {"83173002": ("Scottish Highland cow breed", [7480])}, "ScottishTerrier": {"61405001": ("Scottish terrier", [7480])}, "Scraping": {"56757003": ("Scraping", [8109])}, "Screening": {"360156006": ("Screening", [4256, 6051, 6058, 6061])}, "ScreeningIntent": {"360156006": ("Screening Intent", [3629])}, "ScreeningProcedureIntent": { "360156006": ("Screening - procedure intent (qualifier value)", []) }, "Screw": {"68183006": ("Screw", [7307, 7309])}, "ScrotalStructure": {"20233005": ("Scrotal structure (body structure)", [])}, "Scrotum": {"20233005": ("Scrotum", [4, 7151, 7192, 8134, 9514])}, "ScrubNurse": {"415506007": ("Scrub nurse", [7450, 7452])}, "SealyhamTerrier": {"34752004": ("Sealyham terrier", [7480])}, "SebaceousCystOfSkinOfBreast": { "76649007": ("Sebaceous cyst of skin of breast", [6054, 6064]) }, "SecondDegreeAtrioventricularBlock": { "195042002": ("Second degree Atrioventricular block", [3230]) }, "SecondIntercostalSpace": {"117134006": ("Second Intercostal Space", [5])}, "SecondLumbarArtery": { "397408004": ( "Second Lumbar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "SecondMolarRegion": {"699505003": ("Second molar region", [4017])}, "SecondMolarRegionOfOralCavity": { "699505003": ("Second molar region of oral cavity (body structure)", []) }, "SecondPremolarRegion": {"699508001": ("Second premolar region", [4017])}, "SecondPremolarRegionOfOralCavity": { "699508001": ("Second premolar region of oral cavity (body structure)", []) }, "SecondaryMalignantNeoplasmOfBone": { "94222008": ("Secondary malignant neoplasm of bone (disorder)", []) }, "SecondaryMalignantNeoplasmOfLung": { "94391008": ("Secondary malignant neoplasm of lung (disorder)", []) }, "SecondaryMalignantNeoplasticDisease": { "128462008": ("Secondary malignant neoplastic disease (disorder)", []) }, "SecondarySTTAbnormality": {"428549008": ("Secondary ST-T abnormality", [3230])}, "SecondarySTTAbnormalityOnElectrocardiogram": { "428549008": ("Secondary ST-T abnormality on electrocardiogram (finding)", []) }, "SecretoryJuvenileCarcinomaOfTheBreast": { "41919003": ("Secretory (juvenile) carcinoma of the breast", [6030, 6033]) }, "SectioningOfTissueBlock": { "434472006": ("Sectioning of tissue block (procedure)", []) }, "Sedation": {"72641008": ("Sedation", [611, 612, 9577])}, "Sedative": {"372614000": ("Sedative", [76])}, "SeferihisarCattleBreed": {"133482000": ("Seferihisar cattle breed", [7480])}, "SegmentOfLung": { "72674008": ("Segment of lung", [6102, 6109, 6110, 7151, 7192, 9514]) }, "Segmental": {"62372003": ("Segmental", [6128])}, "SegmentalArtery": { "120234003": ("Segmental Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12115]) }, "SegmentalCalcificationDistribution": { "129768003": ("Segmental calcification distribution", [6012, 6013]) }, "SegmentalLymphNodeOfTheLung": { "127921007": ("segmental lymph node of the lung", [7600, 8134]) }, "SegmentectomyBreastSample": { "309547008": ("segmentectomy breast sample", [8103, 8104]) }, "SelectiveEmbolizationOfArtery": { "57238002": ("Selective embolization of artery", [9, 3405]) }, "SelectiveFetalReduction": { "133874006": ("Selective fetal reduction (procedure)", []) }, "Selenium75HCAT": {"395894004": ("Selenium^75^ HCAT", [25])}, "SelenomethionineSe75": {"88473009": ("Selenomethionine Se^75^ (substance)", [])}, "SelenomethionioneSe75": {"88473009": ("Selenomethionione Se^75^", [25])}, "SelkirkRexCatBreed": {"132676003": ("Selkirk Rex cat breed", [7480])}, "SellaTurcica": { "42575006": ( "Sella turcica", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "SelleFrancaisHorseBreed": {"133153007": ("Selle Francais horse breed", [7480])}, "SemiErect": {"102539006": ("semi-erect", [19])}, "SemiErectBodyPosition": {"102539006": ("Semi-erect body position (finding)", [])}, "SemiProne": {"34026001": ("semi-prone", [20])}, "SeminalVesicle": { "64739004": ( "Seminal Vesicle", [6202, 6204, 6300, 6348, 7151, 7160, 7192, 8134, 9514], ) }, "SeminalVesicleStructure": { "64739004": ("Seminal vesicle structure (body structure)", []) }, "SemipronePosition": {"34026001": ("Semiprone position (finding)", [])}, "SemirechenskPigBreed": {"132119001": ("Semirechensk pig breed", [7480])}, "SenegusCattleBreed": {"133587009": ("Senegus cattle breed", [7480])}, "SenepolCattleBreed": {"132781001": ("Senepol cattle breed", [7480])}, "SengologaCattleBreed": {"131521003": ("Sengologa cattle breed", [7480])}, "SenneHorseBreed": {"133080002": ("Senne horse breed", [7480])}, "SensationOfBeingWarm": { "724232004": ("Sensation of being warm (finding)", [60, 9300]) }, "SentinelLymphNodeBiopsy": { "396487001": ("Sentinel lymph node biopsy", [6050, 6083]) }, "Sepsis": {"91302008": ("Sepsis", [1201])}, "SeptalArtery": {"244251006": ("Septal Artery", [12292])}, "SerereCattleBreed": {"131522005": ("Serere cattle breed", [7480])}, "Seroma": {"56021002": ("Seroma", [6030, 6031])}, "SerpentinaGoatBreed": {"131627006": ("Serpentina goat breed", [7480])}, "SerpentineAneurysm": {"70984001": ("serpentine aneurysm", [3808])}, "SerranaGoatBreed": {"131628001": ("Serrana goat breed", [7480])}, "SerratusAnteriorMuscle": { "18346003": ( "Serratus anterior muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "SerumAlanineAminotransferaseLevelRaised": { "409673008": ("Serum alanine aminotransferase level raised", [12325]) }, "SerumAlbuminBelowReferenceRange": { "115347700": ("Serum albumin below reference range", [12325]) }, "SerumBilirubinRaised": {"166612004": ("Serum bilirubin raised", [12325])}, "SesamoidBonesOfFoot": { "58742003": ( "Sesamoid bones of foot", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "SeshagaCattleBreed": {"131523000": ("Seshaga cattle breed", [7480])}, "Sessile": {"5712003": ("Sessile", [6209])}, "Settegast": {"399243009": ("Settegast", [4012])}, "SettegastProjection": { "399243009": ("Settegast projection (qualifier value)", []) }, "Setter": {"37453003": ("Setter", [7480])}, "SeventhIntercostalSpace": {"117139001": ("Seventh Intercostal Space", [5])}, "Severe": {"24484000": ("Severe", [3716, 3832, 6130])}, "SevereHypokinesis": {"371870001": ("Severe Hypokinesis", [3703])}, "SevereHypokinesisOfCardiacWall": { "371870001": ("Severe hypokinesis of cardiac wall (finding)", []) }, "SevereSeverityModifier": { "24484000": ("Severe (severity modifier) (qualifier value)", []) }, "SevereThrombus": {"373143004": ("Severe Thrombus", [3714])}, "SeverelyDisabled": {"161045001": ("Severely disabled", [3772])}, "SeverelyElevated": {"260360000": ("Severely Elevated", [3642])}, "SeverelyIll": {"271593001": ("Severely ill", [3772])}, "Severity": {"246112005": ("Severity (attribute)", [])}, "Sevoflurane": {"386842005": ("Sevoflurane", [623, 624])}, "ShaftOfFemur": {"41111004": ("Shaft of Femur", [7304, 8134])}, "ShaftOfHumerus": {"20760004": ("Shaft of Humerus", [7304, 8134])}, "ShaftOfRadius": {"47728000": ("Shaft of Radius", [7304, 8134])}, "ShaftOfRib": {"41601005": ("Shaft of rib", [6115, 8134])}, "ShaftOfTibia": {"52687003": ("Shaft of Tibia", [7304, 8134])}, "ShaftOfUlna": {"21133008": ("Shaft of Ulna", [7304, 8134])}, "ShagyaHorseBreed": {"133152002": ("Shagya horse breed", [7480])}, "ShahutouPigBreed": {"132320004": ("Shahutou pig breed", [7480])}, "ShakhansurriCattleBreed": {"133761007": ("Shakhansurri cattle breed", [7480])}, "Shaking": {"26079004": ("Shaking", [60, 9300])}, "ShallowBreathing": {"386616007": ("shallow breathing", [3823, 9272])}, "ShanHorseBreed": {"133081003": ("Shan horse breed", [7480])}, "ShanghaiWhitePigBreed": {"132322007": ("Shanghai White pig breed", [7480])}, "ShanxiBlackPigBreed": {"132335003": ("Shanxi Black pig breed", [7480])}, "Shape": {"300842002": ("Shape", [6333, 6334])}, "ShapeFinding": {"107644003": ("Shape finding (qualifier value)", [])}, "SharPeiDogBreed": {"132589002": ("Shar-pei dog breed", [7480])}, "SharabiCattleBreed": {"133271005": ("Sharabi cattle breed", [7480])}, "Sheath": {"371793003": ("Sheath", [3429])}, "SheathContraception": {"268461001": ("Sheath contraception (finding)", [])}, "SheepBreedUndeterminedSheepBreed": { "131832005": ("Sheep, Breed Undetermined sheep breed", [7480]) }, "ShekoCattleBreed": {"133762000": ("Sheko cattle breed", [7480])}, "ShendiCattleBreed": {"133769009": ("Shendi cattle breed", [7480])}, "ShengxianSpottedPigBreed": {"132312001": ("Shengxian Spotted pig breed", [7480])}, "ShetlandCattleBreed": {"133272003": ("Shetland cattle breed", [7480])}, "ShetlandPony": {"69067004": ("Shetland pony (organism)", [])}, "ShetlandPonyHorseBreed": {"69067004": ("Shetland pony horse breed", [7480])}, "ShetlandSheepBreed": {"131801009": ("Shetland sheep breed", [7480])}, "ShetlandSheepdog": {"50125003": ("Shetland sheepdog", [7480])}, "ShibaInuDogBreed": {"132587000": ("Shiba Inu dog breed", [7480])}, "ShieldingBlock": { "228739009": ("Shielding Block", [9517, 9520, 9541, 9545, 10066]) }, "ShihTzuDog": {"31077009": ("Shih tzu dog", [7480])}, "ShillukCattleBreed": {"132782008": ("Shilluk cattle breed", [7480])}, "ShilohShepherdDogBreed": {"132586009": ("Shiloh Shepherd dog breed", [7480])}, "ShireHorse": {"13487004": ("Shire horse (organism)", [])}, "ShireHorseBreed": {"13487004": ("Shire horse breed", [7480])}, "ShkodraPigBreed": {"133210003": ("Shkodra pig breed", [7480])}, "ShkodraRedCattleBreed": {"133483005": ("Shkodra Red cattle breed", [7480])}, "Short": {"367450005": ("short", [3831])}, "ShortAxis": { "103340004": ("Short axis", [6, 26, 27, 218, 501, 502, 6165, 6166, 7469, 7470]) }, "ShortCoatChihuahua": {"15966002": ("Short coat chihuahua (organism)", [])}, "ShortCoatChihuahuaDogBreed": { "15966002": ("Short coat chihuahua dog breed", [7480]) }, "ShorthairCatBreed": {"132665002": ("Shorthair cat breed", [7480])}, "ShorthornCattleBreed": {"80835003": ("Shorthorn cattle breed (organism)", [])}, "ShorthornCowBreed": {"80835003": ("Shorthorn cow breed", [7480])}, "Shoulder": { "16982005": ( "Shoulder", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514], ) }, "ShoulderGirdleStructure": { "26444007": ("Shoulder girdle structure (body structure)", []) }, "ShoulderRegionStructure": { "16982005": ("Shoulder region structure", [1000, 1001, 1004]) }, "ShropshireSheep": {"4574003": ("Shropshire sheep (organism)", [])}, "ShropshireSheepBreed": {"4574003": ("Shropshire sheep breed", [7480])}, "ShropshireTerrierDogBreed": { "132579001": ("Shropshire Terrier dog breed", [7480]) }, "ShuwaCattleBreed": {"133770005": ("Shuwa cattle breed", [7480])}, "SiameseCat": {"65694005": ("Siamese cat", [7480])}, "SiamesePigBreed": {"133168008": ("Siamese pig breed", [7480])}, "SiberianBlackPiedCattleBreed": { "131524006": ("Siberian Black Pied cattle breed", [7480]) }, "SiberianBlackPiedPigBreed": { "132115007": ("Siberian Black Pied pig breed", [7480]) }, "SiberianCatBreed": {"132677007": ("Siberian cat breed", [7480])}, "SiberianHuskie": {"3674001": ("Siberian huskie", [7480])}, "SiberianPigBreed": {"132196007": ("Siberian pig breed", [7480])}, "SiboneyCattleBreed": {"133751000": ("Siboney cattle breed (organism)", [])}, "SiboneyXZebuCattleBreed": {"133751000": ("Siboney X zebu cattle breed", [7480])}, "SicilianBarbarySheepBreed": { "131767000": ("Sicilian Barbary sheep breed", [7480]) }, "SicilianPigBreed": {"132258002": ("Sicilian pig breed", [7480])}, "SienaBeltedPigBreed": {"132098006": ("Siena Belted pig breed", [7480])}, "SigmoidColon": { "60184004": ("Sigmoid colon", [4, 4040, 6210, 7151, 7192, 8134, 9514]) }, "SigmoidColonStructure": { "60184004": ("Sigmoid colon structure (body structure)", []) }, "SigmoidLymphNode": {"30024008": ("sigmoid lymph node", [7600, 8134])}, "SignetRingCellCarcinoma": { "87737001": ("Signet ring cell carcinoma", [6030, 6033]) }, "SignificanceUndetermined": {"386135008": ("Significance Undetermined", [220])}, "Significant": {"386134007": ("Significant", [220])}, "SignificantCoronaryBypassGraftDisease": { "371805005": ("Significant coronary bypass graft disease", [3728]) }, "SilentIschemia": {"233823002": ("Silent ischemia", [3700])}, "SilentMyocardialIschemia": { "233823002": ("Silent myocardial ischemia (disorder)", []) }, "SilesianHorseBreed": {"133082005": ("Silesian horse breed", [7480])}, "Silicon": {"51420009": ("Silicon", [300])}, "Silicone": {"13652007": ("Silicone", [300])}, "SiliconeGelFilledBreastImplant": { "465380004": ("Silicone gel-filled breast implant (physical object)", []) }, "SiliconeGelImplant": {"465380004": ("Silicone gel implant", [6058, 6059])}, "SiliconeOil": {"247095003": ("Silicone Oil", [4232])}, "SilkyTerrier": {"39882003": ("Silky terrier", [7480])}, "Silver": {"41967008": ("Silver", [300, 10006, 10067])}, "SilverNitrateStain": {"406985001": ("silver nitrate stain", [8112])}, "SilverStain": {"406951002": ("silver stain", [8112])}, "SimbrahCattleBreed": {"133273008": ("Simbrah cattle breed", [7480])}, "SimmentalCattleBreed": {"28483003": ("Simmental cattle breed (organism)", [])}, "SimmentalCowBreed": {"28483003": ("Simmental cow breed", [7480])}, "SinclairMiniaturePigBreed": { "132224005": ("Sinclair Miniature pig breed", [7480]) }, "SingapuraCat": {"10136006": ("Singapura cat", [7480])}, "SingleBeats": {"371871002": ("Single Beats", [3676])}, "SingleBeatsNumericEstimationTechnique": { "371871002": ( "Single beats - numeric estimation technique (qualifier value)", [], ) }, "SingleCoronaryVesselDisease": { "194842008": ("Single coronary vessel disease (disorder)", []) }, "SingleEvent": {"307486002": ("Single event", [6091])}, "SingleFootingHorseHorseBreed": { "133160001": ("Single-Footing Horse horse breed", [7480]) }, "SinglePhotonEmissionComputerizedTomography": { "105371005": ("Single photon emission computerized tomography (procedure)", []) }, "SingleVesselCoronaryArteryDisease": { "194842008": ("Single vessel coronary artery disease.", [3728]) }, "SinhalaCattleBreed": {"133771009": ("Sinhala cattle breed", [7480])}, "SiniHorseBreed": {"133083000": ("Sini horse breed", [7480])}, "SinoAtrialNode": {"88210001": ("Sino-atrial node", [3011, 8134])}, "SinoGasconyPigBreed": {"132031002": ("Sino-Gascony pig breed", [7480])}, "SinoVietnamesePigBreed": {"133163004": ("Sino-Vietnamese pig breed", [7480])}, "SinusNodeRecoveryPhase": { "129086005": ("Sinus node recovery phase (qualifier value)", []) }, "SinusNodeRecoveryTimeEvaluationOf": { "129086005": ("Sinus Node Recovery Time, evaluation of", [3254]) }, "SiriZebuCattleBreed": {"133628005": ("Siri zebu cattle breed", [7480])}, "SiriusRedF3BStain": {"51567006": ("sirius red F3B stain", [8112])}, "SiskaPigBreed": {"132261001": ("Siska pig breed", [7480])}, "SistaniCattleBreed": {"133772002": ("Sistani cattle breed", [7480])}, "SiteOf": {"272737002": ("Site of (attribute)", [])}, "Sitting": {"33586001": ("sitting", [20])}, "SittingPosition": {"33586001": ("Sitting position (finding)", [])}, "SixthIntercostalSpace": {"117138009": ("Sixth Intercostal Space", [5])}, "SixthLumbarArtery": { "397412005": ( "Sixth Lumbar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "SkeletalAndOrSmoothMuscleStructure": { "71616004": ("Skeletal and/or smooth muscle structure (body structure)", []) }, "SkeletalMuscle": {"127954009": ("Skeletal muscle", [7710, 8134])}, "SkeletalMuscleRelaxant": {"372666009": ("Skeletal muscle relaxant", [621, 622])}, "SkeletalMuscleStructure": { "127954009": ("Skeletal muscle structure (body structure)", []) }, "SkeletalMuscleStructureOfChestWall": { "372074006": ("Skeletal muscle structure of chest wall (body structure)", []) }, "SkeletalMuscleStructureOfHead": { "22688005": ("Skeletal muscle structure of head (body structure)", []) }, "SkeletalMuscleStructureOfLowerLimb": { "102292000": ("Skeletal muscle structure of lower limb (body structure)", []) }, "SkeletalMuscleStructureOfNeck": { "81727001": ("Skeletal muscle structure of neck (body structure)", []) }, "SkeletalMuscleStructureOfUpperLimb": { "30608006": ("Skeletal muscle structure of upper limb (body structure)", []) }, "Skin": {"39937001": ("Skin", [645, 4029, 7151, 7166, 7191, 8134, 10044, 10060])}, "SkinAcheSyndrome": {"403598008": ("Skin-ache syndrome (finding)", [])}, "SkinCareTopicalTreatmentsRegimeTherapy": { "386439008": ("Skin care: topical treatments (regime/therapy)", []) }, "SkinConditionAssessment": {"364528001": ("Skin condition assessment", [3441])}, "SkinLesion": {"95324001": ("Skin lesion", [6014, 6015, 6016, 6054, 6056])}, "SkinObservable": {"364528001": ("Skin observable (observable entity)", [])}, "SkinOfAbdomen": { "75093004": ("Skin of abdomen", [4029, 7151, 7154, 7192, 8134, 9514]) }, "SkinOfAlaNasi": {"68598004": ("Skin of ala nasi", [4029, 8134])}, "SkinOfAntecubitalFossa": {"17957002": ("Skin of antecubital fossa", [4029, 8134])}, "SkinOfAnteriorPortionOfNeck": { "11584001": ("Skin of anterior portion of neck", [4029, 8134]) }, "SkinOfAnteriorSurfaceOfForearm": { "70559009": ("Skin of anterior surface of forearm", [4029, 8134]) }, "SkinOfAnteriorSurfaceOfKnee": { "181553006": ("Skin of anterior surface of knee", [4029, 8134]) }, "SkinOfAnteriorSurfaceOfLowerLeg": { "25763004": ("Skin of anterior surface of lower leg", [4029, 8134]) }, "SkinOfAnteriorSurfaceOfThigh": { "61248009": ("Skin of anterior surface of thigh", [4029, 8134]) }, "SkinOfAnteriorSurfaceOfThorax": { "244106003": ("Skin of anterior surface of thorax", [4029, 8134]) }, "SkinOfAnteriorSurfaceOfUpperArm": { "45981001": ("Skin of anterior surface of upper arm", [4029, 8134]) }, "SkinOfAnteriorTrunk": {"181491009": ("Skin of anterior trunk", [4029, 8134])}, "SkinOfAntitragus": {"38407007": ("Skin of antitragus", [4029, 8134])}, "SkinOfAnus": {"59112000": ("Skin of anus", [4029, 8134])}, "SkinOfAreola": {"72005009": ("Skin of areola", [4029, 8134])}, "SkinOfAxilla": {"76261009": ("Skin of axilla", [4029, 8134])}, "SkinOfBack": {"66643007": ("Skin of back", [4029, 8134])}, "SkinOfBackOfUpperThoracicRegion": { "699893008": ("Skin of back of upper thoracic region", [4029, 8134]) }, "SkinOfButtock": {"22180002": ("Skin of buttock", [4029, 8134])}, "SkinOfCavityOfConcha": {"51098001": ("Skin of cavity of concha", [4029, 8134])}, "SkinOfCheek": {"36141000": ("Skin of cheek", [4029, 8134])}, "SkinOfChest": {"74160004": ("Skin of chest", [7151, 7155, 7192, 8134, 9514])}, "SkinOfChin": {"23747009": ("Skin of chin", [4029, 8134])}, "SkinOfClitoris": {"29353003": ("Skin of clitoris", [4029, 8134])}, "SkinOfCrusOfHelix": {"57726007": ("Skin of crus of helix", [4029, 8134])}, "SkinOfDigitOfHand": {"244169007": ("Skin of digit of hand", [4029, 8134])}, "SkinOfDorsalAreaOfWrist": { "52876008": ("Skin of dorsal area of wrist", [4029, 8134]) }, "SkinOfEar": {"1902009": ("Skin of ear", [4029, 8134])}, "SkinOfEarLobule": {"2059009": ("Skin of ear lobule", [4029, 8134])}, "SkinOfEpigastricArea": {"30598005": ("Skin of epigastric area", [4029, 8134])}, "SkinOfExternalAuditoryCanal": { "86409001": ("Skin of external auditory canal", [4029, 8134]) }, "SkinOfExternalGenitalia": { "60944009": ("Skin of external genitalia", [4029, 8134]) }, "SkinOfEyeRegion": {"362916000": ("Skin of eye region", [4029, 8134])}, "SkinOfEyebrow": {"367577003": ("Skin of eyebrow", [4029, 8134])}, "SkinOfFace": {"73897004": ("Skin of face", [4029, 8134])}, "SkinOfFingersAndThumb": { "244169007": ("Skin of fingers and thumb (body structure)", []) }, "SkinOfFoot": {"60496002": ("Skin of foot", [4029, 8134])}, "SkinOfForehead": {"68698007": ("Skin of forehead", [4029, 8134])}, "SkinOfGlansPenis": {"7991003": ("Skin of glans penis", [4029, 8134])}, "SkinOfGlutealFold": {"63029009": ("Skin of gluteal fold", [4029, 8134])}, "SkinOfHand": {"33712006": ("Skin of hand", [4029, 8134])}, "SkinOfHead": {"70762009": ("Skin of head", [4029, 8134])}, "SkinOfHeel": {"84607009": ("Skin of heel", [4029, 8134])}, "SkinOfHelixOfEar": {"79313003": ("Skin of helix of ear", [4029, 8134])}, "SkinOfHypogastricRegion": { "367578008": ("Skin of hypogastric region", [4029, 8134]) }, "SkinOfHypothenarRegionOfPalm": { "89784008": ("Skin of hypothenar region of palm", [4029, 8134]) }, "SkinOfInfraclavicularRegion": { "66288003": ("Skin of infraclavicular region", [4029, 8134]) }, "SkinOfInguinalRegion": {"39687006": ("Skin of inguinal region", [4029, 8134])}, "SkinOfIntertragalIncisure": { "45591000": ("Skin of intertragal incisure", [4029, 8134]) }, "SkinOfJawline": {"244097004": ("Skin of jawline", [4029, 8134])}, "SkinOfLabium": {"73058008": ("Skin of labium", [4029, 8134])}, "SkinOfLabiumMajus": {"128252004": ("Skin of labium majus", [4029, 8134])}, "SkinOfLabiumMinus": {"128253009": ("Skin of labium minus", [4029, 8134])}, "SkinOfLateralAspectOfAnkle": { "181564009": ("Skin of lateral aspect of ankle", [4029, 8134]) }, "SkinOfLateralBorderOfSoleOfFoot": { "35739000": ("Skin of lateral border of sole of foot", [4029, 8134]) }, "SkinOfLateralCanthus": {"37671003": ("Skin of lateral canthus", [4029, 8134])}, "SkinOfLateralNoseStructure": { "314395006": ("Skin of lateral nose structure (body structure)", []) }, "SkinOfLateralPartOfHeel": { "699909001": ("Skin of lateral part of heel", [4029, 8134]) }, "SkinOfLateralPortionOfNeck": { "5272005": ("Skin of lateral portion of neck", [4029, 8134]) }, "SkinOfLip": {"88089004": ("Skin of lip", [4029, 8134])}, "SkinOfLowerAbdomen": {"699914002": ("Skin of lower abdomen", [4029, 8134])}, "SkinOfLowerBack": {"113182001": ("Skin of lower back", [4029, 8134])}, "SkinOfLowerChestWall": {"699915001": ("Skin of lower chest wall", [4029, 8134])}, "SkinOfLowerExtremity": {"371304004": ("Skin of lower extremity", [4029, 8134])}, "SkinOfLowerEyelid": {"40069000": ("Skin of lower eyelid", [4029, 8134])}, "SkinOfLowerLip": {"66934001": ("Skin of lower lip", [4029, 8134])}, "SkinOfMedialAspectOfAnkle": { "181563003": ("Skin of medial aspect of ankle", [4029, 8134]) }, "SkinOfMedialBorderOfSoleOfFoot": { "52953006": ("Skin of medial border of sole of foot", [4029, 8134]) }, "SkinOfMedialCanthus": {"27887005": ("Skin of medial canthus", [4029, 8134])}, "SkinOfMedialPartOfHeel": { "699919007": ("Skin of medial part of heel", [4029, 8134]) }, "SkinOfMedialSurfaceOfThigh": { "73958006": ("Skin of medial surface of thigh", [4029, 8134]) }, "SkinOfNasolabialFold": {"37108007": ("Skin of nasolabial fold", [4029, 8134])}, "SkinOfNeck": {"43081002": ("Skin of neck", [4029, 8134])}, "SkinOfNipple": {"54468004": ("Skin of nipple", [4029, 8134])}, "SkinOfNose": {"113179006": ("Skin of nose", [4029, 8134])}, "SkinOfNuchalRegion": {"4658004": ("Skin of nuchal region", [4029, 8134])}, "SkinOfOccipitalRegion": {"79951008": ("Skin of occipital region", [4029, 8134])}, "SkinOfPalmOfHand": {"70887009": ("Skin of palm of hand", [4029, 8134])}, "SkinOfPalmarAreaOfWrist": { "24527008": ("Skin of palmar area of wrist", [4029, 8134]) }, "SkinOfParietalRegion": {"21672008": ("Skin of parietal region", [4029, 8134])}, "SkinOfPartOfDorsalSurfaceOfHand": { "281642007": ("Skin of part of dorsal surface of hand", [4029, 8134]) }, "SkinOfPenis": {"35900000": ("Skin of penis", [4029, 8134])}, "SkinOfPerineum": {"48014002": ("Skin of perineum", [4029, 8134])}, "SkinOfPerioralRegionOfFace": { "110488009": ("Skin of perioral region of face", [4029, 8134]) }, "SkinOfPhiltrum": {"84365009": ("Skin of philtrum", [4029, 8134])}, "SkinOfPoplitealFossa": {"84507004": ("Skin of popliteal fossa", [4029, 8134])}, "SkinOfPostauricularRegion": { "24483006": ("Skin of postauricular region", [4029, 8134]) }, "SkinOfPosteriorSurfaceOfElbow": { "181536004": ("Skin of posterior surface of elbow", [4029, 8134]) }, "SkinOfPosteriorSurfaceOfForearm": { "41550009": ("Skin of posterior surface of forearm", [4029, 8134]) }, "SkinOfPosteriorSurfaceOfLowerLeg": { "47224004": ("Skin of posterior surface of lower leg", [4029, 8134]) }, "SkinOfPosteriorSurfaceOfThigh": { "4578000": ("Skin of posterior surface of thigh", [4029, 8134]) }, "SkinOfPosteriorSurfaceOfThorax": { "244111001": ("Skin of posterior surface of thorax", [4029, 8134]) }, "SkinOfPosteriorSurfaceOfUpperArm": { "72939005": ("Skin of posterior surface of upper arm", [4029, 8134]) }, "SkinOfPreauricularRegion": { "86719006": ("Skin of preauricular region", [4029, 8134]) }, "SkinOfPrepuceOfClitoris": { "76723005": ("Skin of prepuce of clitoris", [4029, 8134]) }, "SkinOfRootOfPenis": {"244117002": ("Skin of root of penis", [4029, 8134])}, "SkinOfScalp": {"43067004": ("Skin of scalp", [4029, 8134])}, "SkinOfScrotum": {"81992007": ("Skin of scrotum", [4029, 8134])}, "SkinOfShaftOfPenis": {"244118007": ("Skin of shaft of penis", [4029, 8134])}, "SkinOfSideOfNose": {"314395006": ("Skin of side of nose", [4029, 8134])}, "SkinOfSideOfNose_Inactive": { "244089006": ("Skin of side of nose (body structure)", []) }, "SkinOfStructureOfLabiumPudendum": { "73058008": ("Skin of structure of labium pudendum (body structure)", []) }, "SkinOfSubmentalArea": {"34926004": ("Skin of submental area", [4029, 8134])}, "SkinOfSupraclavicularRegionOfNeck": { "76072005": ("Skin of supraclavicular region of neck", [4029, 8134]) }, "SkinOfTemporalRegion": {"16621002": ("Skin of temporal region", [4029, 8134])}, "SkinOfThenarRegionOfPalm": { "26795005": ("Skin of thenar region of palm", [4029, 8134]) }, "SkinOfTipOfNose": {"79283007": ("Skin of tip of nose", [4029, 8134])}, "SkinOfToe": {"52034004": ("Skin of toe", [4029, 8134])}, "SkinOfTragus": {"79502000": ("Skin of tragus", [4029, 8134])}, "SkinOfUmbilicus": {"315003": ("Skin of umbilicus", [4029, 8134])}, "SkinOfUpperAbdomen": {"699935000": ("Skin of upper abdomen", [4029, 8134])}, "SkinOfUpperExtremity": {"371311000": ("Skin of upper extremity", [4029, 8134])}, "SkinOfUpperEyelid": {"41310005": ("Skin of upper eyelid", [4029, 8134])}, "SkinOfUpperLip": {"16251004": ("Skin of upper lip", [4029, 8134])}, "SkinOfUpperTrunk": {"54440003": ("Skin of upper trunk", [4029, 8134])}, "SkinOfVertex": {"61719002": ("Skin of vertex (body structure)", [])}, "SkinOfVertexOfScalp": {"61719002": ("Skin of vertex of scalp", [4029, 8134])}, "SkinRetractionOfBreast": { "129796009": ("Skin retraction of breast", [6014, 6015, 6016, 6054, 6055, 6056]) }, "SkinStructure": {"39937001": ("Skin structure (body structure)", [])}, "SkinStructureOfAbdomen": { "75093004": ("Skin structure of abdomen (body structure)", []) }, "SkinStructureOfAlaNasi": { "68598004": ("Skin structure of ala nasi (body structure)", []) }, "SkinStructureOfAntecubitalFossa": { "17957002": ("Skin structure of antecubital fossa (body structure)", []) }, "SkinStructureOfAnteriorPortionOfNeck": { "11584001": ("Skin structure of anterior portion of neck (body structure)", []) }, "SkinStructureOfAnteriorSurfaceOfForearm": { "70559009": ( "Skin structure of anterior surface of forearm (body structure)", [], ) }, "SkinStructureOfAnteriorSurfaceOfThigh": { "61248009": ("Skin structure of anterior surface of thigh (body structure)", []) }, "SkinStructureOfAnteriorSurfaceOfUpperArm": { "45981001": ( "Skin structure of anterior surface of upper arm (body structure)", [], ) }, "SkinStructureOfAnteriorTrunk": { "181491009": ("Skin structure of anterior trunk (body structure)", []) }, "SkinStructureOfAntitragus": { "38407007": ("Skin structure of antitragus (body structure)", []) }, "SkinStructureOfAnus": { "59112000": ("Skin structure of anus (body structure)", []) }, "SkinStructureOfAreola": { "72005009": ("Skin structure of areola (body structure)", []) }, "SkinStructureOfAxilla": { "76261009": ("Skin structure of axilla (body structure)", []) }, "SkinStructureOfAxillaryFossa": { "699891005": ("Skin structure of axillary fossa (body structure)", []) }, "SkinStructureOfBack": { "66643007": ("Skin structure of back (body structure)", []) }, "SkinStructureOfBackOfUpperThoracicRegion": { "699893008": ( "Skin structure of back of upper thoracic region (body structure)", [], ) }, "SkinStructureOfButtock": { "22180002": ("Skin structure of buttock (body structure)", []) }, "SkinStructureOfCavityOfConcha": { "51098001": ("Skin structure of cavity of concha (body structure)", []) }, "SkinStructureOfCheek": { "36141000": ("Skin structure of cheek (body structure)", []) }, "SkinStructureOfChest": { "74160004": ("Skin structure of chest (body structure)", []) }, "SkinStructureOfChin": { "23747009": ("Skin structure of chin (body structure)", []) }, "SkinStructureOfClitoris": { "29353003": ("Skin structure of clitoris (body structure)", []) }, "SkinStructureOfCruroVulvarFold": { "87706001": ("Skin structure of cruro-vulvar fold (body structure)", []) }, "SkinStructureOfCrusOfHelix": { "57726007": ("Skin structure of crus of helix (body structure)", []) }, "SkinStructureOfDorsalAreaOfWrist": { "52876008": ("Skin structure of dorsal area of wrist (body structure)", []) }, "SkinStructureOfEar": {"1902009": ("Skin structure of ear (body structure)", [])}, "SkinStructureOfEarLobule": { "2059009": ("Skin structure of ear lobule (body structure)", []) }, "SkinStructureOfEpigastricArea": { "30598005": ("Skin structure of epigastric area (body structure)", []) }, "SkinStructureOfExternalGenitalia": { "60944009": ("Skin structure of external genitalia (body structure)", []) }, "SkinStructureOfEyebrow": { "367577003": ("Skin structure of eyebrow (body structure)", []) }, "SkinStructureOfFace": { "73897004": ("Skin structure of face (body structure)", []) }, "SkinStructureOfFoot": { "60496002": ("Skin structure of foot (body structure)", []) }, "SkinStructureOfForehead": { "68698007": ("Skin structure of forehead (body structure)", []) }, "SkinStructureOfFrontalRegionOfScalp": { "699900002": ("Skin structure of frontal region of scalp (body structure)", []) }, "SkinStructureOfGlansPenis": { "7991003": ("Skin structure of glans penis (body structure)", []) }, "SkinStructureOfGlutealFold": { "63029009": ("Skin structure of gluteal fold (body structure)", []) }, "SkinStructureOfHand": { "33712006": ("Skin structure of hand (body structure)", []) }, "SkinStructureOfHead": { "70762009": ("Skin structure of head (body structure)", []) }, "SkinStructureOfHeel": { "84607009": ("Skin structure of heel (body structure)", []) }, "SkinStructureOfHelix": { "79313003": ("Skin structure of helix (body structure)", []) }, "SkinStructureOfHypogastricRegion": { "367578008": ("Skin structure of hypogastric region (body structure)", []) }, "SkinStructureOfHypothenarRegionOfPalm": { "89784008": ("Skin structure of hypothenar region of palm (body structure)", []) }, "SkinStructureOfInfraclavicularRegion": { "66288003": ("Skin structure of infraclavicular region (body structure)", []) }, "SkinStructureOfInguinalRegion": { "39687006": ("Skin structure of inguinal region (body structure)", []) }, "SkinStructureOfIntertragalIncisure": { "45591000": ("Skin structure of intertragal incisure (body structure)", []) }, "SkinStructureOfLabiumMajus": { "128252004": ("Skin structure of labium majus (body structure)", []) }, "SkinStructureOfLabiumMinus": { "128253009": ("Skin structure of labium minus (body structure)", []) }, "SkinStructureOfLateralBorderOfSoleOfFoot": { "35739000": ( "Skin structure of lateral border of sole of foot (body structure)", [], ) }, "SkinStructureOfLateralCanthus": { "37671003": ("Skin structure of lateral canthus (body structure)", []) }, "SkinStructureOfLateralPartOfHeel": { "699909001": ("Skin structure of lateral part of heel (body structure)", []) }, "SkinStructureOfLateralPortionOfNeck": { "5272005": ("Skin structure of lateral portion of neck (body structure)", []) }, "SkinStructureOfLip": {"88089004": ("Skin structure of lip (body structure)", [])}, "SkinStructureOfLowerAbdomen": { "699914002": ("Skin structure of lower abdomen (body structure)", []) }, "SkinStructureOfLowerBack": { "113182001": ("Skin structure of lower back (body structure)", []) }, "SkinStructureOfLowerChestWall": { "699915001": ("Skin structure of lower chest wall (body structure)", []) }, "SkinStructureOfLowerEyelid": { "40069000": ("Skin structure of lower eyelid (body structure)", []) }, "SkinStructureOfLowerLimb": { "371304004": ("Skin structure of lower limb (body structure)", []) }, "SkinStructureOfLowerLip": { "66934001": ("Skin structure of lower lip (body structure)", []) }, "SkinStructureOfMedialBorderOfSoleOfFoot": { "52953006": ( "Skin structure of medial border of sole of foot (body structure)", [], ) }, "SkinStructureOfMedialCanthus": { "27887005": ("Skin structure of medial canthus (body structure)", []) }, "SkinStructureOfMedialPartOfHeel": { "699919007": ("Skin structure of medial part of heel (body structure)", []) }, "SkinStructureOfMedialSurfaceOfThigh": { "73958006": ("Skin structure of medial surface of thigh (body structure)", []) }, "SkinStructureOfNasolabialFold": { "37108007": ("Skin structure of nasolabial fold (body structure)", []) }, "SkinStructureOfNeck": { "43081002": ("Skin structure of neck (body structure)", []) }, "SkinStructureOfNipple": { "54468004": ("Skin structure of nipple (body structure)", []) }, "SkinStructureOfNose": { "113179006": ("Skin structure of nose (body structure)", []) }, "SkinStructureOfNuchalRegion": { "4658004": ("Skin structure of nuchal region (body structure)", []) }, "SkinStructureOfPalmarAreaOfHand": { "70887009": ("Skin structure of palmar area of hand (body structure)", []) }, "SkinStructureOfPalmarAreaOfWrist": { "24527008": ("Skin structure of palmar area of wrist (body structure)", []) }, "SkinStructureOfPerineum": { "48014002": ("Skin structure of perineum (body structure)", []) }, "SkinStructureOfPhiltrum": { "84365009": ("Skin structure of philtrum (body structure)", []) }, "SkinStructureOfPoplitealFossa": { "84507004": ("Skin structure of popliteal fossa (body structure)", []) }, "SkinStructureOfPostauricularRegion": { "24483006": ("Skin structure of postauricular region (body structure)", []) }, "SkinStructureOfPosteriorSurfaceOfForearm": { "41550009": ( "Skin structure of posterior surface of forearm (body structure)", [], ) }, "SkinStructureOfPosteriorSurfaceOfThigh": { "4578000": ("Skin structure of posterior surface of thigh (body structure)", []) }, "SkinStructureOfPosteriorSurfaceOfUpperArm": { "72939005": ( "Skin structure of posterior surface of upper arm (body structure)", [], ) }, "SkinStructureOfPreauricularRegion": { "86719006": ("Skin structure of preauricular region (body structure)", []) }, "SkinStructureOfPrepuceOfClitoris": { "76723005": ("Skin structure of prepuce of clitoris (body structure)", []) }, "SkinStructureOfScalp": { "43067004": ("Skin structure of scalp (body structure)", []) }, "SkinStructureOfScrotum": { "81992007": ("Skin structure of scrotum (body structure)", []) }, "SkinStructureOfSupraclavicularRegionOfNeck": { "76072005": ( "Skin structure of supraclavicular region of neck (body structure)", [], ) }, "SkinStructureOfTemporalRegion": { "16621002": ("Skin structure of temporal region (body structure)", []) }, "SkinStructureOfThenarRegionOfPalm": { "26795005": ("Skin structure of thenar region of palm (body structure)", []) }, "SkinStructureOfTipOfNose": { "79283007": ("Skin structure of tip of nose (body structure)", []) }, "SkinStructureOfToe": {"52034004": ("Skin structure of toe (body structure)", [])}, "SkinStructureOfTragus": { "79502000": ("Skin structure of tragus (body structure)", []) }, "SkinStructureOfUmbilicus": { "315003": ("Skin structure of umbilicus (body structure)", []) }, "SkinStructureOfUpperAbdomen": { "699935000": ("Skin structure of upper abdomen (body structure)", []) }, "SkinStructureOfUpperEyelid": { "41310005": ("Skin structure of upper eyelid (body structure)", []) }, "SkinStructureOfUpperLimb": { "371311000": ("Skin structure of upper limb (body structure)", []) }, "SkinStructureOfUpperLip": { "16251004": ("Skin structure of upper lip (body structure)", []) }, "SkinStructureOfUpperTrunk": { "54440003": ("Skin structure of upper trunk (body structure)", []) }, "SkinThickeningOfBreast": { "129797000": ("Skin thickening of breast", [6014, 6015, 6016, 6054, 6055, 6056]) }, "SkuddeSheepBreed": {"131799006": ("Skudde sheep breed", [7480])}, "Skull": { "89546000": ( "Skull", [ 4, 1000, 1001, 1002, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514, 12020, ], ) }, "SkyeTerrier": {"24299002": ("Skye terrier", [7480])}, "SkyrosHorseBreed": {"133084006": ("Skyros horse breed", [7480])}, "SkyrosPonyBreed": {"423926000": ("Skyros pony breed (organism)", [])}, "SkyrosPonyHorseBreed": {"423926000": ("Skyros pony horse breed", [7480])}, "SleepEEG": {"18648009": ("Sleep EEG", [3049])}, "Slide": {"1179252003": ("Slide", [8103])}, "SlideOverviewLens": {"445601002": ("Slide overview lens", [8121])}, "Slide_Inactive": {"258661006": ("Slide (specimen)", [])}, "SlitLampBiomicroscope": {"397247004": ("Slit Lamp Biomicroscope", [4202])}, "SloughiDogBreed": {"132590006": ("Sloughi dog breed", [7480])}, "SlovakCuvakDogBreed": {"132585008": ("Slovak Cuvak dog breed", [7480])}, "SlovakWarmbloodHorseBreed": { "133085007": ("Slovak Warmblood horse breed", [7480]) }, "SlovakianBlackPiedPigBreed": { "133214007": ("Slovakian Black Pied pig breed", [7480]) }, "SlovakianPiedCattleBreed": {"133494009": ("Slovakian Pied cattle breed", [7480])}, "SlovakianPinzgauCattleBreed": { "133495005": ("Slovakian Pinzgau cattle breed", [7480]) }, "SlovakianWhitePigBreed": {"133217000": ("Slovakian White pig breed", [7480])}, "SlovenianBrownCattleBreed": { "133496006": ("Slovenian Brown cattle breed", [7480]) }, "SlovenianWhitePigBreed": {"133211004": ("Slovenian White pig breed", [7480])}, "Slovhyb1PigBreed": {"133218005": ("Slovhyb-1 pig breed", [7480])}, "Small": {"255507004": ("Small", [252, 6118])}, "SmallCardiacVein": { "49082002": ("Small Cardiac Vein", [3827, 3839, 7151, 7192, 9514]) }, "SmallCellCarcinoma": {"74364000": ("Small cell carcinoma", [638, 639])}, "SmallEastAfricanZebuCattleBreed": { "133773007": ("Small East African Zebu cattle breed", [7480]) }, "SmallIntestinalStructure": { "30315005": ("Small intestinal structure (body structure)", []) }, "SmallIntestine": { "30315005": ( "Small intestine", [4, 4009, 4030, 4031, 4042, 7151, 7154, 7192, 8134, 9514, 10044, 10060], ) }, "SmallMünsterländerDogBreed": { "132584007": ("Small Münsterländer dog breed", [7480]) }, "SmallPolishPrickEaredPigBreed": { "133224004": ("Small Polish Prick-Eared pig breed", [7480]) }, "SmallSpanishHoundDogBreed": { "132583001": ("Small Spanish Hound dog breed", [7480]) }, "SmallWhitePigBreed": {"132197003": ("Small White pig breed", [7480])}, "SmallestCardiacVein": { "195073003": ("Smallest Cardiac Vein", [3827, 3839, 7151, 7192, 9514]) }, "SmearProcedure": {"448895004": ("Smear procedure", [8110])}, "SmearSample": {"258433009": ("Smear sample", [8103])}, "SmithfieldDogBreed": {"132465007": ("Smithfield dog breed", [7480])}, "Smoker": {"77176002": ("Smoker (finding)", [])}, "Smooth": {"82280004": ("Smooth", [3715])}, "SmoothCollie": {"10544000": ("Smooth collie (organism)", [])}, "SmoothCollieDogBreed": {"10544000": ("Smooth collie dog breed", [7480])}, "SmoothFoxTerrier": {"8351009": ("Smooth fox terrier (organism)", [])}, "SmoothFoxTerrierDogBreed": {"8351009": ("Smooth fox terrier dog breed", [7480])}, "SmoothHairedVizsla": {"90444005": ("Smooth haired vizsla (organism)", [])}, "SmoothHairedVizslaDogBreed": { "90444005": ("Smooth haired vizsla dog breed", [7480]) }, "SmoothMiniatureDachshund": { "112493003": ("Smooth miniature dachshund (organism)", []) }, "SmoothMiniatureDachshundDogBreed": { "112493003": ("Smooth miniature dachshund dog breed", [7480]) }, "SmoothStandardDachshund": { "69862006": ("Smooth standard dachshund (organism)", []) }, "SmoothStandardDachshundDogBreed": { "69862006": ("Smooth standard dachshund dog breed", [7480]) }, "SnowshoeCatBreed": {"132678002": ("Snowshoe cat breed", [7480])}, "SoaySheepBreed": {"132790008": ("Soay sheep breed", [7480])}, "SocialPersonalHistoryObservable": { "160476009": ("Social / personal history observable (observable entity)", []) }, "SocotraCattleBreed": {"131525007": ("Socotra cattle breed", [7480])}, "SodiumAcetrizoate": {"32836007": ("Sodium acetrizoate", [12, 3850])}, "SodiumChlorideNa22": {"6257000": ("Sodium chloride Na^22^", [25])}, "SodiumChlorideNa24": {"31527000": ("Sodium chloride Na^24^", [25])}, "SodiumChlorideSolution": { "373757009": ("Sodium chloride solution (substance)", []) }, "SodiumChromateCr51": {"62517004": ("Sodium chromate Cr^51^", [25])}, "SodiumDiatrizoate": {"24891006": ("Sodium diatrizoate (product)", [])}, "SodiumDiprotrizoate": {"83423008": ("Sodium diprotrizoate", [12, 3850])}, "SodiumFluorideF18": {"129501009": ("Sodium fluoride F^18^", [25, 4021])}, "SodiumIodideI123": {"67690002": ("Sodium iodide I^123^", [25])}, "SodiumIodideI124": {"422980002": ("Sodium iodide I^124^", [4021])}, "SodiumIodideI131": {"111160004": ("Sodium iodide I^131^", [25])}, "SodiumIodipamide": {"925002": ("Sodium iodipamide", [12, 3850])}, "SodiumIodomethamate": {"38344006": ("Sodium iodomethamate", [12, 3850])}, "SodiumNa22": {"71633006": ("Sodium Na^22^", [4021])}, "SodiumPertechnetateTc99m": {"19495007": ("Sodium pertechnetate Tc^99m^", [25])}, "SodiumPhosphateP32": {"10781003": ("Sodium phosphate P^32^", [25])}, "SodiumTyropanoate": {"109212003": ("Sodium tyropanoate", [12, 3850])}, "SoftCoatedWheatenTerrier": {"47699005": ("Soft-coated wheaten terrier", [7480])}, "SoftPalate": {"49460000": ("Soft palate", [4028, 7151, 7192, 8134, 9514])}, "SoftPalateStructure": {"49460000": ("Soft palate structure (body structure)", [])}, "SoftTissue": { "87784001": ("Soft tissue", [645, 6122, 6211, 7151, 7166, 7191, 8134]) }, "SoftTissues": {"87784001": ("Soft tissues (body structure)", [])}, "SokokeCatBreed": {"132679005": ("Sokoke cat breed", [7480])}, "SokolkaHorseBreed": {"133086008": ("Sokolka horse breed", [7480])}, "SokotoGudaliCattleBreed": {"133774001": ("Sokoto Gudali cattle breed", [7480])}, "SolarDegeneration": {"43982006": ("Solar degeneration", [4405])}, "SolealVein": { "397427005": ("Soleal vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110]) }, "SolitaryFibrousTumor": { "128736003": ("Solitary fibrous tumor (morphologic abnormality)", []) }, "SolitaryPlasmacytomaOfBone": { "10639003": ("Solitary plasmacytoma of bone (morphologic abnormality)", []) }, "SolochromeAzurineBSStain": {"43549000": ("solochrome azurine (BS) stain", [8112])}, "SolochromeBlack6BStain": {"11201005": ("solochrome black 6B stain", [8112])}, "SolochromeCyanineRStain": {"25091000": ("solochrome cyanine R stain", [8112])}, "SolochromeDarkBlueStain": {"38902009": ("solochrome dark blue stain", [8112])}, "SolognoteSheepBreed": {"131803007": ("Solognote sheep breed", [7480])}, "SolubleBerlinBlueStain": {"64991008": ("soluble berlin blue stain", [8112])}, "SomaliCat": {"4042003": ("Somali cat", [7480])}, "SomaliCattleBreed": {"133775000": ("Somali cattle breed", [7480])}, "SomaliGoatBreed": {"131637001": ("Somali goat breed", [7480])}, "SomaliPonyHorseBreed": {"133150005": ("Somali Pony horse breed", [7480])}, "SomaliSheepBreed": {"131797008": ("Somali sheep breed", [7480])}, "SombaCattleBreed": {"133497002": ("Somba cattle breed", [7480])}, "SonValleyCattleBreed": {"133777008": ("Son Valley cattle breed", [7480])}, "SonkheriCattleBreed": {"133776004": ("Sonkheri cattle breed", [7480])}, "SopravissanaSheepBreed": {"131796004": ("Sopravissana sheep breed", [7480])}, "SorraiaHorseBreed": {"133149005": ("Sorraia horse breed", [7480])}, "Source": {"260753009": ("Source (attribute)", [])}, "SouthAfricanBrownSwissCattleBreed": { "133498007": ("South African Brown Swiss cattle breed", [7480]) }, "SouthAfricanLandracePigBreed": { "133190008": ("South African Landrace pig breed", [7480]) }, "SouthAfricanMerinoSheepBreed": { "132723000": ("South African Merino sheep breed", [7480]) }, "SouthAfricanMiniatureHorseBreed": { "133087004": ("South African Miniature horse breed", [7480]) }, "SouthAfricanMuttonMerinoSheepBreed": { "132719008": ("South African Mutton Merino sheep breed", [7480]) }, "SouthAnatolianRedCattleBreed": { "133499004": ("South Anatolian Red cattle breed", [7480]) }, "SouthChinaBlackPigBreed": {"133174008": ("South China Black pig breed", [7480])}, "SouthChinaPigBreed": {"133173002": ("South China pig breed", [7480])}, "SouthChinaZebuCattleBreed": { "133778003": ("South China Zebu cattle breed", [7480]) }, "SouthDevonCattleBreed": {"133274002": ("South Devon cattle breed", [7480])}, "SouthGermanColdbloodHorseBreed": { "133088009": ("South German Coldblood horse breed", [7480]) }, "SouthMalawiZebuCattleBreed": { "133785004": ("South Malawi Zebu cattle breed", [7480]) }, "SouthRussianOvcharkaDogBreed": { "132582006": ("South Russian Ovcharka dog breed", [7480]) }, "SouthRussianSteppeHoundDogBreed": { "132451005": ("South Russian Steppe Hound dog breed", [7480]) }, "SouthSuffolkSheepBreed": {"132791007": ("South Suffolk sheep breed", [7480])}, "SouthWalesMountainSheepBreed": { "132792000": ("South Wales Mountain sheep breed", [7480]) }, "SouthYunnanShortEaredPigBreed": { "132154008": ("South Yunnan Short-Eared pig breed", [7480]) }, "SouthdownSheep": {"3566006": ("Southdown sheep (organism)", [])}, "SouthdownSheepBreed": {"3566006": ("Southdown sheep breed", [7480])}, "SouthernBlackmouthCurDogBreed": { "132581004": ("Southern Blackmouth Cur dog breed", [7480]) }, "SouthernCriouloCattleBreed": { "133588004": ("Southern Crioulo cattle breed", [7480]) }, "SouthernTswanaCattleBreed": { "131526008": ("Southern Tswana cattle breed", [7480]) }, "SouthernUkrainianCattleBreed": { "133510004": ("Southern Ukrainian cattle breed (organism)", []) }, "SouthernUkranianCattleBreed": { "133510004": ("Southern Ukranian cattle breed", [7480]) }, "SouthwestSpanishMustangHorseBreed": { "133089001": ("Southwest Spanish Mustang horse breed", [7480]) }, "SovereignPigBreed": {"132068004": ("Sovereign pig breed", [7480])}, "SovietHeavyDraftHorseBreed": { "133148002": ("Soviet Heavy Draft horse breed", [7480]) }, "SovietMeatPigBreed": {"132071007": ("Soviet Meat pig breed", [7480])}, "Spaniel": {"45625009": ("Spaniel", [7480])}, "SpanishAmericanHorseHorseBreed": { "133090005": ("Spanish-American Horse horse breed", [7480]) }, "SpanishAngloArabHorseBreed": { "133091009": ("Spanish Anglo-Arab horse breed", [7480]) }, "SpanishBarbHorseBreed": {"133147007": ("Spanish Barb horse breed", [7480])}, "SpanishBrownAlpineCattleBreed": { "133511000": ("Spanish Brown Alpine cattle breed", [7480]) }, "SpanishColonialHorseHorseBreed": { "133092002": ("Spanish Colonial Horse horse breed", [7480]) }, "SpanishGoatBreed": {"131638006": ("Spanish goat breed", [7480])}, "SpanishGreyhoundDogBreed": {"132466008": ("Spanish Greyhound dog breed", [7480])}, "SpanishMastiffDogBreed": {"132639001": ("Spanish Mastiff dog breed", [7480])}, "SpanishMustangHorse": {"76302002": ("Spanish mustang horse (organism)", [])}, "SpanishMustangHorseBreed": {"76302002": ("Spanish mustang horse breed", [7480])}, "SpanishNormanHorseBreed": {"133146003": ("Spanish-Norman horse breed", [7480])}, "SpanishPointerDogBreed": {"132611002": ("Spanish Pointer dog breed", [7480])}, "SpatialAndRelationalConcept": { "309825002": ("Spatial and Relational Concept", [7150, 9502, 9580]) }, "SpatialAndRelationalConcepts": { "309825002": ("Spatial and relational concepts (qualifier value)", []) }, "SpatialCollocationAnalysis": { "133884007": ("Spatial collocation analysis", [6043, 6137]) }, "SpatialProximityAnalysis": { "133885008": ("Spatial proximity analysis", [6043, 6137]) }, "SpecimenClearing": {"433452008": ("Specimen clearing", [8113])}, "SpecimenCollection": {"17636008": ("specimen collection", [3515, 8109, 8111])}, "SpecimenContainer": {"434711009": ("Specimen container", [8101, 8102])}, "SpecimenContainerLid": {"434473001": ("Specimen container lid", [8102])}, "SpecimenDehydration": {"433470006": ("Specimen dehydration", [8113])}, "SpecimenFreezing": {"27872000": ("Specimen freezing", [8113])}, "SpecimenFromBreastByIncisionalBiopsyOfBreastMass": { "122739003": ( "specimen from breast by incisional biopsy of breast mass", [8103, 8104], ) }, "SpecimenFromBreastObtainedByCoreNeedleBiopsy": { "122737001": ( "specimen from breast obtained by core needle biopsy", [8103, 8104], ) }, "SpecimenFromBreastObtainedByExcision": { "397199005": ("specimen from breast obtained by excision", [8103, 8104]) }, "SpecimenFromBreastObtainedByImageGuidedCoreBiopsy": { "373102004": ( "specimen from breast obtained by image guided core biopsy", [8103, 8104], ) }, "SpecimenFromBreastObtainedByIncisionalBiopsyOfBreastMass": { "122739003": ( "Specimen from breast obtained by incisional biopsy of breast mass (specimen)", [], ) }, "SpecimenFromBreastObtainedByTotalMastectomy": { "122595009": ("specimen from breast obtained by total mastectomy", [8103, 8104]) }, "SpecimenFromBreastStereotacticallyGuidedCoreNeedleBiopsy": { "122738006": ( "specimen from breast, stereotactically guided core needle biopsy", [8103, 8104], ) }, "SpecimenMammography": {"80865008": ("Specimen mammography (procedure)", [])}, "SpecimenMicrowaveHeating": {"433455005": ("Specimen microwave heating", [8113])}, "SpecimenObtainedByAspiration": { "119295008": ("Specimen obtained by aspiration (specimen)", []) }, "SpecimenObtainedFromBreastByStereotacticallyGuidedCoreNeedleBiopsy": { "122738006": ( "Specimen obtained from breast by stereotactically guided core needle biopsy (specimen)", [], ) }, "SpecimenProcessing": {"9265001": ("Specimen processing", [8111])}, "SpecimenRadiographyOfBreast": { "80865008": ("Specimen radiography of breast", [6050, 6083]) }, "SpecimenReceiving": {"428995007": ("Specimen receiving", [8111])}, "SpecimenSteamHeating": {"433457002": ("Specimen steam heating", [8113])}, "SpecimenType": {"371439000": ("Specimen type (observable entity)", [])}, "SpecimenVial": {"434746001": ("Specimen vial", [8101, 8102])}, "SpecimenWell": {"434822004": ("Specimen well", [8101, 8102])}, "SpecularMicroscope": {"409899004": ("Specular Microscope", [4202])}, "SpeechAndLanguageTherapy": {"310101009": ("Speech and Language Therapy", [7030])}, "SpeechAndLanguageTherapyService": { "310101009": ("Speech and language therapy service (qualifier value)", []) }, "SpeedOfBloodPressureResponse": { "427732000": ("Speed of blood pressure response (observable entity)", []) }, "SphenoidBone": {"73117003": ("Sphenoid bone", [4028, 7151, 7192, 8134, 9514])}, "SphenoidBoneStructure": { "73117003": ("Sphenoid bone structure (body structure)", []) }, "SphynxCatBreed": {"132680008": ("Sphynx cat breed", [7480])}, "SpiculatedLesion": { "129742005": ("Spiculated lesion", [6006, 6007, 6335, 6341, 6342]) }, "SpiegelSheepBreed": {"132794004": ("Spiegel sheep breed", [7480])}, "SpinalAnesthesia": {"231249005": ("Spinal anesthesia", [611, 612])}, "SpinalCanalStructure": { "61853006": ("Spinal canal structure (body structure)", []) }, "SpinalCerebrospinalFluidPathway": { "280401006": ( "Spinal cerebrospinal fluid pathway", [7151, 7153, 7192, 8134, 9514], ) }, "SpinalCord": {"2748008": ("Spinal cord", [4, 7151, 7153, 7192, 8134, 9514])}, "SpinalCordGrayMatter": { "12958003": ("Spinal cord gray matter", [7151, 7153, 7192, 8134, 9514]) }, "SpinalCordGrayMatterStructure": { "12958003": ("Spinal cord gray matter structure (body structure)", []) }, "SpinalCordStructure": {"2748008": ("Spinal cord structure (body structure)", [])}, "SpinalCordWhiteMatter": { "27088001": ("Spinal cord white matter", [7151, 7153, 7192, 7710, 8134, 9514]) }, "SpinalCordWhiteMatterStructure": { "27088001": ("Spinal cord white matter structure (body structure)", []) }, "SpinalisMuscle": { "4317002": ("Spinalis muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "SpindleCellCarcinoma": {"65692009": ("Spindle cell carcinoma", [638, 639])}, "SpindleCellNodule": {"110451006": ("Spindle cell nodule (tumor)", [6030, 6033])}, "Spine": { "421060004": ( "Spine", [4, 4009, 4030, 4031, 4040, 4042, 6102, 6109, 6114, 7151, 7192, 8134, 9514], ) }, "SpinoneItalianoDogBreed": {"132638009": ("Spinone Italiano dog breed", [7480])}, "SpinousProcessOfVertebra": { "55678000": ("Spinous process of vertebra", [6115, 8134]) }, "SpiperoneF18": {"129499001": ("Spiperone F^18^", [4021])}, "SpiralAcquisition": {"116152004": ("Spiral Acquisition", [10013])}, "SpiralComputedTomographyScan": { "116152004": ("Spiral computed tomography scan (procedure)", []) }, "SpiritSolubleAnilineBlueStain": { "11645004": ("spirit soluble aniline blue stain", [8112]) }, "SpiritSolubleEosinStain": {"83600004": ("spirit soluble eosin stain", [8112])}, "SpitiHorseBreed": {"133093007": ("Spiti horse breed", [7480])}, "Spleen": { "78961009": ( "Spleen", [4, 4030, 6202, 6204, 7151, 7154, 7192, 8134, 9514, 10044, 10060, 12321], ) }, "SplenicArtery": { "22083002": ( "Splenic artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "SplenicFlexureOfColon": {"72592005": ("Splenic flexure of colon", [6210, 8134])}, "SplenicLymphNode": {"280824006": ("splenic lymph node", [7600, 8134])}, "SplenicStructure": {"78961009": ("Splenic structure (body structure)", [])}, "SplenicVein": { "35819009": ( "Splenic vein", [ 4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12114, 12125, ], ) }, "SpleniumOfCorpusCallosum": { "23347006": ("splenium of corpus callosum", [7705, 7710, 8134]) }, "SporeStain": {"255811001": ("spore stain", [8112])}, "SpotCompression": {"399055006": ("Spot Compression", [4015, 6028, 6029])}, "SpotCompressionOfBreast": { "399055006": ("Spot compression of breast (procedure)", []) }, "SpottedPig": {"36187006": ("Spotted pig (organism)", [])}, "SpottedPigBreed": {"36187006": ("Spotted pig breed", [7480])}, "SprecaCattleBreed": {"131527004": ("Spreca cattle breed", [7480])}, "SpælsauSheepBreed": {"132793005": ("Spælsau sheep breed", [7480])}, "SquamousCellCarcinoma": { "1162767002": ("Squamous cell carcinoma", [638, 639, 6030, 6033]) }, "SquamousCellCarcinomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "28899001": ( "Squamous cell carcinoma, no International Classification of Diseases for Oncology subtype " "(morphologic abnormality)", [], ) }, "SquamousCellCarcinomaOfAnus": { "723265000": ("Squamous cell carcinoma of anus", [638, 639]) }, "SquamousCellCarcinomaOfHeadAndNeck": { "716659002": ("Squamous cell carcinoma of head and neck", [638, 639]) }, "SquamousCellCarcinomaOfLaryngealCartilage": { "707357005": ("Squamous cell carcinoma of laryngeal cartilage", [638, 639]) }, "SquamousCellCarcinomaOfLung": { "254634000": ("Squamous cell carcinoma of lung", [638, 639]) }, "SquamousCellCarcinomaOfMouth": { "307502000": ("Squamous cell carcinoma of mouth", [638, 639]) }, "SquamousCellCarcinomaOfSkin": { "254651007": ("Squamous cell carcinoma of skin", [638, 639]) }, "StBernardDog": {"83236005": ("St. Bernard dog", [7480])}, "StCroixSheepBreed": {"132795003": ("St. Croix sheep breed", [7480])}, "StableAngina": {"233819005": ("Stable Angina", [3202, 3220, 3700])}, "StabyhounDogBreed": {"132637004": ("Stabyhoun dog breed", [7480])}, "StaffordshireBullTerrier": { "83216009": ("Staffordshire bull terrier (organism)", []) }, "StaffordshireBullTerrierDogBreed": { "83216009": ("Staffordshire bull terrier dog breed", [7480]) }, "Stage": {"258214002": ("Stage (attribute)", [])}, "Stage0": {"261613009": ("Stage 0", [3778])}, "Stage1": {"258215001": ("Stage 1", [3778])}, "Stage2": {"258219007": ("Stage 2", [3778])}, "Stage3": {"258224005": ("Stage 3", [3778])}, "Stage4": {"258228008": ("Stage 4", [3778])}, "Stage5": {"261617005": ("Stage 5", [3778])}, "Staging": {"373825000": ("Staging", [6327])}, "StagingIntent": {"373825000": ("Staging intent", [3629])}, "StagingProcedureIntent": { "373825000": ("Staging - procedure intent (qualifier value)", []) }, "Staining": {"127790008": ("Staining", [8111, 8130])}, "StainingMethod": {"127790008": ("Staining method (procedure)", [])}, "StainlessSteelMaterial": {"256506002": ("Stainless Steel Material", [7300, 9579])}, "StandardDachshund": {"416885007": ("Standard dachshund (organism)", [])}, "StandardDachshundDogBreed": { "416885007": ("Standard dachshund dog breed", [7480]) }, "StandardDeviation": {"386136009": ("Standard Deviation", [7464])}, "StandardManchesterTerrier": {"9131007": ("Standard Manchester terrier", [7480])}, "StandardPoodle": {"507002": ("Standard poodle (organism)", [])}, "StandardPoodleDogBreed": {"507002": ("Standard poodle dog breed", [7480])}, "StandardSchnauzer": {"69592005": ("Standard schnauzer (organism)", [])}, "StandardSchnauzerDogBreed": {"69592005": ("Standard schnauzer dog breed", [7480])}, "StandardbredHorse": {"34200004": ("Standardbred horse (organism)", [])}, "StandardbredHorseBreed": {"34200004": ("Standardbred horse breed", [7480])}, "Standing": {"10904000": ("standing", [20])}, "Staple": { "56353002": ("Staple", [6040, 6102, 6138, 6202, 6203, 6401, 6404, 7151, 7193]) }, "StapleDevice": {"56353002": ("Staple, device (physical object)", [])}, "StartTime": {"398201009": ("Start time (qualifier value)", [])}, "StaticCatheterHemodynamicMeasurementMethodRegimeTherapy": { "128578007": ( "Static catheter hemodynamic measurement method (regime/therapy)", [], ) }, "StaticCatheterMethod": {"128578007": ("Static catheter method", [3241])}, "Statins": {"96302009": ("Statins", [3761])}, "Staunig": {"399098005": ("Staunig", [4012])}, "StaunigProjection": {"399098005": ("Staunig projection (qualifier value)", [])}, "Steady": {"55011004": ("Steady", [4220])}, "SteamHeatingOfTissueSpecimen": { "433457002": ("Steam heating of tissue specimen (procedure)", []) }, "Stecher": {"399292003": ("Stecher", [4012])}, "StecherProjection": {"399292003": ("Stecher projection (qualifier value)", [])}, "SteigarSheepBreed": {"132796002": ("Steigar sheep breed", [7480])}, "SteinschafSheepBreed": {"132797006": ("Steinschaf sheep breed", [7480])}, "Stenosis": {"415582006": ("stenosis", [3810, 3813])}, "Stenotic": {"386139002": ("Stenotic", [3712])}, "StenoticCoronaryArtery": {"386139002": ("Stenotic coronary artery (finding)", [])}, "StenoticLesionLength": {"408716009": ("Stenotic Lesion Length", [3483])}, "Stent": { "65818007": ("Stent", [8, 3411, 3429, 3496, 3810, 4051, 7111, 7151, 7157, 7193]) }, "StentCrossSectionalArea": {"408705002": ("Stent Cross-Sectional Area", [3482])}, "StentDevice": {"65818007": ("Stent, device", [1000])}, "StentDiameter": {"408706001": ("Stent Diameter", [3481])}, "StentLength": {"408703009": ("Stent Length", [3483])}, "StentPlacement": {"103716009": ("Stent placement", [9, 3405])}, "StentVolume": {"408704003": ("Stent Volume", [3485])}, "Stented": {"386138005": ("Stented", [3712])}, "StentedCoronaryArtery": {"386138005": ("Stented coronary artery (finding)", [])}, "StenverProjection": {"399349006": ("Stenver's projection (qualifier value)", [])}, "Stenvers": {"399349006": ("Stenvers", [4012])}, "StepSectioningOfTissueBlock": { "434475008": ("Step sectioning of tissue block (procedure)", []) }, "SteppeMeatPigBreed": {"132073005": ("Steppe Meat pig breed", [7480])}, "SterlingPigBreed": {"132200002": ("Sterling pig breed", [7480])}, "SternalAngle": {"44612009": ("Sternal angle", [6115, 8134])}, "SternalSkin": {"244107007": ("Sternal skin", [4029, 8134])}, "SternoclavicularJoint": { "7844006": ( "Sternoclavicular joint", [4, 1000, 1001, 1004, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "SternoclavicularJointStructure": { "7844006": ("Sternoclavicular joint structure (body structure)", []) }, "SternocleidomastoidMuscle": { "22823000": ( "Sternocleidomastoid muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514], ) }, "Sternum": { "56873002": ( "Sternum", [ 4, 1000, 1001, 1004, 4009, 4030, 4031, 4042, 6102, 6109, 6114, 7151, 7155, 7192, 8134, 9514, ], ) }, "Steroid": {"116566001": ("Steroid", [621, 622, 4410])}, "Stiffle": {"116010006": ("Stiffle", [7482, 7483, 8134])}, "StifleJoint": {"116010006": ("Stifle joint (body structure)", [])}, "StomaAppliance": {"407744008": ("Stoma appliance", [6202, 6203])}, "Stomach": { "69695003": ( "Stomach", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514, 10044, 10060], ) }, "StomachStructure": {"69695003": ("Stomach structure (body structure)", [])}, "StoopedOver": {"87068006": ("stooped-over", [20])}, "StoopedOverPosition": {"87068006": ("Stooped-over position (finding)", [])}, "StopTime": {"397898000": ("Stop time (qualifier value)", [])}, "StreiPigBreed": {"133200007": ("Strei pig breed", [7480])}, "Streptokinase": {"395889004": ("Streptokinase", [10])}, "StressTestUsingBicycleErgometer": { "26046004": ("Stress test using Bicycle Ergometer", [3261, 12001]) }, "StressTestUsingCardiacPacing": { "428685003": ("Stress test using cardiac pacing", [3261, 3757, 12001]) }, "StressThalliumProcedure": {"431511008": ("Stress thallium procedure", [3110])}, "Stretcher": { "89149003": ("Stretcher", [7151, 7157, 7193, 9505, 9515, 9520, 9573]) }, "StretcherDevice": {"89149003": ("Stretcher, device (physical object)", [])}, "Stroke": {"309966001": ("Stroke", [7030])}, "StrokeIndex": { "277381004": ( "Stroke Index", [ 12200, 12207, 12239, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "StrokeUnit": {"309966001": ("Stroke unit (environment)", [])}, "StrokeVolume": { "90096001": ( "Stroke Volume", [ 3835, 12200, 12207, 12239, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, 12304, ], ) }, "StrongWoolMerinoSheepBreed": { "132720002": ("Strong Wool Merino sheep breed", [7480]) }, "Strontium89Chloride": {"125701003": ("Strontium-89 Chloride (substance)", [])}, "StrontiumChlorideSr85": {"69076006": ("Strontium chloride Sr^85^", [25])}, "StrontiumChlorideSr87": {"38424001": ("Strontium chloride Sr^87^", [25])}, "StrontiumChlorideSr89": {"125701003": ("Strontium chloride Sr^89^", [25])}, "StrontiumNitrateSr85": {"8858006": ("Strontium nitrate Sr^85^", [25])}, "StrontiumNitrateSr87": {"31953001": ("Strontium nitrate Sr^87^", [25])}, "StructureOfAbdominalVein": { "84421000": ("Structure of abdominal vein (body structure)", []) }, "StructureOfAbdominalWallMuscle": { "195879000": ("Structure of abdominal wall muscle (body structure)", []) }, "StructureOfAchillesTendon": { "61352006": ("Structure of achilles tendon (body structure)", []) }, "StructureOfAcromion": {"31934006": ("Structure of acromion (body structure)", [])}, "StructureOfAlveolarProcessOfMandible": { "38754007": ("Structure of alveolar process of mandible (body structure)", []) }, "StructureOfAmnion": {"70847004": ("Structure of amnion (body structure)", [])}, "StructureOfAngleOfRib": { "14510004": ("Structure of angle of rib (body structure)", []) }, "StructureOfAntecubitalVein": { "128553008": ("Structure of antecubital vein (body structure)", []) }, "StructureOfAnteriorApicalPartOfPeripheralZoneOfLeftHalfProstate": { "716937001": ( "Structure of anterior apical part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfAnteriorApicalPartOfPeripheralZoneOfRightHalfProstate": { "716936005": ( "Structure of anterior apical part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfAnteriorApicalPartOfTransitionZoneOfLeftHalfProstate": { "716931000": ( "Structure of anterior apical part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfAnteriorApicalPartOfTransitionZoneOfRightHalfProstate": { "716930004": ( "Structure of anterior apical part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfAnteriorAuricularLymphNode": { "25247006": ("Structure of anterior auricular lymph node (body structure)", []) }, "StructureOfAnteriorBasalPartOfPeripheralZoneOfLeftHalfProstate": { "716905002": ( "Structure of anterior basal part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfAnteriorBasalPartOfPeripheralZoneOfRightHalfProstate": { "716904003": ( "Structure of anterior basal part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfAnteriorBasalPartOfTransitionZoneOfLeftHalfProstate": { "716897000": ( "Structure of anterior basal part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfAnteriorBasalPartOfTransitionZoneOfRightHalfProstate": { "716896009": ( "Structure of anterior basal part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfAnteriorCardiacVein": { "194996006": ("Structure of anterior cardiac vein (body structure)", []) }, "StructureOfAnteriorCerebralArtery": { "60176003": ("Structure of anterior cerebral artery (body structure)", []) }, "StructureOfAnteriorCervicalLymphNode": { "5727003": ("Structure of anterior cervical lymph node (body structure)", []) }, "StructureOfAnteriorCommissure": { "62872008": ("Structure of anterior commissure (body structure)", []) }, "StructureOfAnteriorCommunicatingArtery": { "8012006": ("Structure of anterior communicating artery (body structure)", []) }, "StructureOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "59438005": ( "Structure of anterior descending branch of left coronary artery (body structure)", [], ) }, "StructureOfAnteriorFibromuscularStromaOfProstate": { "717025007": ( "Structure of anterior fibromuscular stroma of prostate (body structure)", [], ) }, "StructureOfAnteriorHornOfLateralVentricle": { "30399003": ( "Structure of anterior horn of lateral ventricle (body structure)", [], ) }, "StructureOfAnteriorMediastinalLymphNode": { "5296000": ("Structure of anterior mediastinal lymph node (body structure)", []) }, "StructureOfAnteriorMiddleRegionalPartOfPeripheralZoneOfLeftHalfProstate": { "716920008": ( "Structure of anterior middle regional part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfAnteriorMiddleRegionalPartOfPeripheralZoneOfRightHalfProstate": { "716919002": ( "Structure of anterior middle regional part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfAnteriorMiddleRegionalPartOfTransitionZoneOfLeftHalfProstate": { "716914007": ( "Structure of anterior middle regional part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfAnteriorMiddleRegionalPartOfTransitionZoneOfRightHalfProstate": { "716913001": ( "Structure of anterior middle regional part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfAnteriorSegmentOfRightUpperLobeOfLung": { "39743006": ( "Structure of anterior segment of right upper lobe of lung (body structure)", [], ) }, "StructureOfAnteriorSegmentOfUpperDivisionOfLeftUpperLobeOfLung": { "22270008": ( "Structure of anterior segment of upper division of left upper lobe of lung (body structure)", [], ) }, "StructureOfAnteriorSpinalArtery": { "17388009": ("Structure of anterior spinal artery (body structure)", []) }, "StructureOfAnteriorTibialArtery": { "68053000": ("Structure of anterior tibial artery (body structure)", []) }, "StructureOfAnteriorTibialLymphNode": { "303713004": ("Structure of anterior tibial lymph node (body structure)", []) }, "StructureOfAnteriorTibialVein": { "26703007": ("Structure of anterior tibial vein (body structure)", []) }, "StructureOfAnulusFibrosusOfAorta": { "77583004": ("Structure of anulus fibrosus of aorta (body structure)", []) }, "StructureOfAnulusFibrosusOfMitralOrifice": { "65197004": ( "Structure of anulus fibrosus of mitral orifice (body structure)", [], ) }, "StructureOfAnulusFibrosusOfPulmonaryArtery": { "90318009": ( "Structure of anulus fibrosus of pulmonary artery (body structure)", [], ) }, "StructureOfAnulusFibrosusOfTricuspidOrifice": { "113259005": ( "Structure of anulus fibrosus of tricuspid orifice (body structure)", [], ) }, "StructureOfAorticBifurcation": { "73166001": ("Structure of aortic bifurcation (body structure)", []) }, "StructureOfAorticIsthmus": { "88593004": ("Structure of aortic isthmus (body structure)", []) }, "StructureOfAorticLymphNode": { "35783009": ("Structure of aortic lymph node (body structure)", []) }, "StructureOfAorticSinotubularJunction": { "443167003": ("Structure of aortic sinotubular junction (body structure)", []) }, "StructureOfApexOfHeart": { "13383001": ("Structure of apex of heart (body structure)", []) }, "StructureOfApexOfLeftVentricle": { "128564006": ("Structure of apex of left ventricle (body structure)", []) }, "StructureOfApexOfLung": { "86598002": ("Structure of apex of lung (body structure)", []) }, "StructureOfApexOfRightVentricle": { "128565007": ("Structure of apex of right ventricle (body structure)", []) }, "StructureOfApicalAxillaryLymphNode": { "16051009": ("Structure of apical axillary lymph node (body structure)", []) }, "StructureOfApicalPartOfAnteriorFibromuscularStromaOfLeftHalfProstate": { "716927006": ( "Structure of apical part of anterior fibromuscular stroma of left half prostate (body structure)", [], ) }, "StructureOfApicalPartOfAnteriorFibromuscularStromaOfProstate": { "716925003": ( "Structure of apical part of anterior fibromuscular stroma of prostate (body structure)", [], ) }, "StructureOfApicalPartOfAnteriorFibromuscularStromaOfRightHalfProstate": { "716926002": ( "Structure of apical part of anterior fibromuscular stroma of right half prostate (body structure)", [], ) }, "StructureOfApicalPartOfPeripheralZoneOfLeftHalfProstate": { "716935009": ( "Structure of apical part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfApicalPartOfPeripheralZoneOfRightHalfProstate": { "716934008": ( "Structure of apical part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfApicalPartOfTransitionZoneOfLeftHalfProstate": { "716929009": ( "Structure of apical part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfApicalPartOfTransitionZoneOfRightHalfProstate": { "716928001": ( "Structure of apical part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfAppendicularLymphNode": { "46157003": ("Structure of appendicular lymph node (body structure)", []) }, "StructureOfArchOfVertebra": { "40265002": ("Structure of arch of vertebra (body structure)", []) }, "StructureOfArcuateArteryOfKidney": { "274231001": ("Structure of arcuate artery of kidney (body structure)", []) }, "StructureOfArteryOfAbdomen": { "118634008": ("Structure of artery of abdomen (body structure)", []) }, "StructureOfArteryOfLowerExtremity": { "70791007": ("Structure of artery of lower extremity (body structure)", []) }, "StructureOfArteryOfNeck": { "119568004": ("Structure of artery of neck (body structure)", []) }, "StructureOfArteryOfUpperExtremity": { "75531005": ("Structure of artery of upper extremity (body structure)", []) }, "StructureOfAtlantoaxialJoint": { "62555009": ("Structure of atlantoaxial joint (body structure)", []) }, "StructureOfAtrialVein": { "195164009": ("Structure of atrial vein (body structure)", []) }, "StructureOfAtrioventricularBranchOfCircumflexBranchOfLeftCoronaryArtery": { "75902001": ( "Structure of atrioventricular branch of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfAtrioventricularNode": { "25943004": ("Structure of atrioventricular node (body structure)", []) }, "StructureOfAtrioventricularNodeBranchOfRightCoronaryArtery": { "12800002": ( "Structure of atrioventricular node branch of right coronary artery (body structure)", [], ) }, "StructureOfAtrioventricularVein": { "195496005": ("Structure of atrioventricular vein (body structure)", []) }, "StructureOfAxillaryArtery": { "67937003": ("Structure of axillary artery (body structure)", []) }, "StructureOfAxillaryFascia": { "368536000": ("Structure of axillary fascia (body structure)", []) }, "StructureOfAxillaryVein": { "68705008": ("Structure of axillary vein (body structure)", []) }, "StructureOfAxillaryVeinLymphNode": { "421624008": ("Structure of axillary vein lymph node (body structure)", []) }, "StructureOfAzygousVein": { "72107004": ("Structure of azygous vein (body structure)", []) }, "StructureOfBasalPartOfAnteriorFibromuscularStromaOfLeftHalfProstate": { "716893001": ( "Structure of basal part of anterior fibromuscular stroma of left half prostate (body structure)", [], ) }, "StructureOfBasalPartOfAnteriorFibromuscularStromaOfProstate": { "716891004": ( "Structure of basal part of anterior fibromuscular stroma of prostate (body structure)", [], ) }, "StructureOfBasalPartOfAnteriorFibromuscularStromaOfRightHalfProstate": { "716892006": ( "Structure of basal part of anterior fibromuscular stroma of right half prostate (body structure)", [], ) }, "StructureOfBasalPartOfPeripheralZoneOfLeftHalfProstate": { "716903009": ( "Structure of basal part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfBasalPartOfPeripheralZoneOfRightHalfProstate": { "716902004": ( "Structure of basal part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfBasalPartOfTransitionZoneOfLeftHalfProstate": { "716895008": ( "Structure of basal part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfBasalPartOfTransitionZoneOfRightHalfProstate": { "716894007": ( "Structure of basal part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfBasilarArtery": { "59011009": ("Structure of basilar artery (body structure)", []) }, "StructureOfBasilicVein": { "19715009": ("Structure of basilic vein (body structure)", []) }, "StructureOfBodyConduit": { "91830000": ("Structure of body conduit (body structure)", []) }, "StructureOfBodyOfSternum": { "52509009": ("Structure of body of sternum (body structure)", []) }, "StructureOfBothEyes": { "40638003": ("Structure of both eyes (body structure)", []) }, "StructureOfBrachialArtery": { "17137000": ("Structure of brachial artery (body structure)", []) }, "StructureOfBrachialVein": { "20115005": ("Structure of brachial vein (body structure)", []) }, "StructureOfBrachiocephalicArtery": { "12691009": ("Structure of brachiocephalic artery (body structure)", []) }, "StructureOfBrachiocephalicVein": { "8887007": ("Structure of brachiocephalic vein (body structure)", []) }, "StructureOfBronchialArtery": { "64468002": ("Structure of bronchial artery (body structure)", []) }, "StructureOfBuccinatorLymphNode": { "143925009": ("Structure of buccinator lymph node (body structure)", []) }, "StructureOfCalfOfLeg": { "53840002": ("Structure of calf of leg (body structure)", []) }, "StructureOfCalyx": {"2334006": ("Structure of calyx (body structure)", [])}, "StructureOfCapillaryBloodVesselOrgan": { "20982000": ("Structure of capillary blood vessel (organ) (body structure)", []) }, "StructureOfCardiacValveLeaflet": { "6530003": ("Structure of cardiac valve leaflet (body structure)", []) }, "StructureOfCardiacVein": { "85439003": ("Structure of cardiac vein (body structure)", []) }, "StructureOfCardiovascularSystem": { "113257007": ("Structure of cardiovascular system (body structure)", []) }, "StructureOfCarina": {"28700002": ("Structure of carina (body structure)", [])}, "StructureOfCarotidBifurcation": { "80272002": ("Structure of carotid bifurcation (body structure)", []) }, "StructureOfCarotidSinus": { "21479005": ("Structure of carotid sinus (body structure)", []) }, "StructureOfCarotidSiphon": { "54409005": ("Structure of carotid siphon (body structure)", []) }, "StructureOfCaudateLobeOfLiver": { "71133005": ("Structure of caudate lobe of liver (body structure)", []) }, "StructureOfCavumSeptiPellucidi": { "74968005": ("Structure of cavum septi pellucidi (body structure)", []) }, "StructureOfCeliacArtery": { "57850000": ("Structure of celiac artery (body structure)", []) }, "StructureOfCeliacLymphNode": { "47985009": ("Structure of celiac lymph node (body structure)", []) }, "StructureOfCentralAxillaryLymphNode": { "283001": ("Structure of central axillary lymph node (body structure)", []) }, "StructureOfCentralNervousSystem": { "21483005": ("Structure of central nervous system (body structure)", []) }, "StructureOfCentralRetinalArtery": { "76117006": ("Structure of central retinal artery (body structure)", []) }, "StructureOfCentralVeinOfTheRetina": { "62869001": ("Structure of central vein of the retina (body structure)", []) }, "StructureOfCentralZoneOfLeftHalfProstate": { "716901006": ( "Structure of central zone of left half prostate (body structure)", [], ) }, "StructureOfCentralZoneOfRightHalfProstate": { "716900007": ( "Structure of central zone of right half prostate (body structure)", [], ) }, "StructureOfCephalicVein": { "20699002": ("Structure of cephalic vein (body structure)", []) }, "StructureOfCerebralAqueduct": { "80447000": ("Structure of cerebral aqueduct (body structure)", []) }, "StructureOfCerebralArtery": { "88556005": ("Structure of cerebral artery (body structure)", []) }, "StructureOfCerebralCortex": { "40146001": ("Structure of cerebral cortex (body structure)", []) }, "StructureOfCervicalVertebralColumn": { "122494005": ("Structure of cervical vertebral column (body structure)", []) }, "StructureOfChordaeTendineaeCordis": { "102298001": ("Structure of chordae tendineae cordis (body structure)", []) }, "StructureOfChoroidPlexus": { "80621003": ("Structure of choroid plexus (body structure)", []) }, "StructureOfCingulum": {"37035000": ("Structure of cingulum (body structure)", [])}, "StructureOfCircleOfWillis": { "11279006": ("Structure of circle of Willis (body structure)", []) }, "StructureOfCircumflexBranchOfLeftCoronaryArtery": { "57396003": ( "Structure of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfCisternaMagna": { "54165005": ("Structure of cisterna magna (body structure)", []) }, "StructureOfClavicularNotchOfSternum": { "75319007": ("Structure of clavicular notch of sternum (body structure)", []) }, "StructureOfClinoidPortionOfInternalCarotidArtery": { "415637004": ( "Structure of clinoid portion of internal carotid artery (body structure)", [], ) }, "StructureOfColicLymphNode": { "8356004": ("Structure of colic lymph node (body structure)", []) }, "StructureOfColonicHaustra": { "6533001": ("Structure of colonic haustra (body structure)", []) }, "StructureOfCommonDuctLymphNode": { "280639005": ("Structure of common duct lymph node (body structure)", []) }, "StructureOfCommonHepaticArtery": { "66559000": ("Structure of common hepatic artery (body structure)", []) }, "StructureOfCommonIliacVein": { "46027005": ("Structure of common iliac vein (body structure)", []) }, "StructureOfCommonLeftPulmonaryVein": { "443705001": ("Structure of common left pulmonary vein (body structure)", []) }, "StructureOfCommonRightPulmonaryVein": { "443591004": ("Structure of common right pulmonary vein (body structure)", []) }, "StructureOfCoracoidProcessOfScapula": { "8931003": ("Structure of coracoid process of scapula (body structure)", []) }, "StructureOfCornealEndothelium": { "65431007": ("Structure of corneal endothelium (body structure)", []) }, "StructureOfCornealEpithelium": { "15775008": ("Structure of corneal epithelium (body structure)", []) }, "StructureOfCoronarySinusOfLeftAtrialSeptum": { "31162003": ( "Structure of coronary sinus of left atrial septum (body structure)", [], ) }, "StructureOfCoronarySinusOstium": { "71271007": ("Structure of coronary sinus ostium (body structure)", []) }, "StructureOfCostalCartilage": { "50016007": ("Structure of costal cartilage (body structure)", []) }, "StructureOfCostalGroove": { "17399006": ("Structure of costal groove (body structure)", []) }, "StructureOfCostocervicalTrunk": { "3159004": ("Structure of costocervical trunk (body structure)", []) }, "StructureOfCubitalLymphNode": { "34775006": ("Structure of cubital lymph node (body structure)", []) }, "StructureOfCysticLymphNode": { "280556009": ("Structure of cystic lymph node (body structure)", []) }, "StructureOfDeciduousMandibularLeftCanineTooth": { "43281008": ( "Structure of deciduous mandibular left canine tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularLeftCentralIncisorTooth": { "89552004": ( "Structure of deciduous mandibular left central incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularLeftFirstMolarTooth": { "38896004": ( "Structure of deciduous mandibular left first molar tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularLeftLateralIncisorTooth": { "14770005": ( "Structure of deciduous mandibular left lateral incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularLeftSecondMolarTooth": { "49330006": ( "Structure of deciduous mandibular left second molar tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularRightCanineTooth": { "6062009": ( "Structure of deciduous mandibular right canine tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularRightCentralIncisorTooth": { "67834006": ( "Structure of deciduous mandibular right central incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularRightFirstMolarTooth": { "58646007": ( "Structure of deciduous mandibular right first molar tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularRightLateralIncisorTooth": { "22445006": ( "Structure of deciduous mandibular right lateral incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMandibularRightSecondMolarTooth": { "61868007": ( "Structure of deciduous mandibular right second molar tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryLeftCanineTooth": { "73937000": ( "Structure of deciduous maxillary left canine tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryLeftCentralIncisorTooth": { "51678005": ( "Structure of deciduous maxillary left central incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryLeftFirstMolarTooth": { "45234009": ( "Structure of deciduous maxillary left first molar tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryLeftLateralIncisorTooth": { "43622005": ( "Structure of deciduous maxillary left lateral incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryLeftSecondMolarTooth": { "51943008": ( "Structure of deciduous maxillary left second molar tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryRightCanineTooth": { "30618001": ( "Structure of deciduous maxillary right canine tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryRightCentralIncisorTooth": { "88824007": ( "Structure of deciduous maxillary right central incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryRightFirstMolarTooth": { "17505006": ( "Structure of deciduous maxillary right first molar tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryRightLateralIncisorTooth": { "65624003": ( "Structure of deciduous maxillary right lateral incisor tooth (body structure)", [], ) }, "StructureOfDeciduousMaxillaryRightSecondMolarTooth": { "27855007": ( "Structure of deciduous maxillary right second molar tooth (body structure)", [], ) }, "StructureOfDeepAnteriorCervicalLymphNode": { "168360002": ( "Structure of deep anterior cervical lymph node (body structure)", [], ) }, "StructureOfDeepInguinalLymphNode": { "65266007": ("Structure of deep inguinal lymph node (body structure)", []) }, "StructureOfDeepLateralCervicalLymphNode": { "167864002": ( "Structure of deep lateral cervical lymph node (body structure)", [], ) }, "StructureOfDeepLymphNode": { "60996007": ("Structure of deep lymph node (body structure)", []) }, "StructureOfDeepPalmarVenousArch": { "368481004": ("Structure of deep palmar venous arch (body structure)", []) }, "StructureOfDeepPoplitealLymphNode": { "35721009": ("Structure of deep popliteal lymph node (body structure)", []) }, "StructureOfDeepVolarArchOfRadialArtery": { "10119003": ( "Structure of deep volar arch of radial artery (body structure)", [], ) }, "StructureOfDelphianLymphNode": { "167664004": ("Structure of delphian lymph node (body structure)", []) }, "StructureOfDeltoidMuscle": { "35259002": ("Structure of deltoid muscle (body structure)", []) }, "StructureOfDescendingThoracicAorta": { "32672002": ( "Descending aorta", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "StructureOfDiaphragmaticLymphNode": { "196751009": ("Structure of diaphragmatic lymph node (body structure)", []) }, "StructureOfDiencephalon": { "87563008": ("Structure of diencephalon (body structure)", []) }, "StructureOfDigitalArteryOfHand": { "40254007": ("Structure of digital artery of hand (body structure)", []) }, "StructureOfDistalPortionOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "36672000": ( "Structure of distal portion of anterior descending branch of left coronary artery (body structure)", [], ) }, "StructureOfDistalPortionOfCircumflexBranchOfLeftCoronaryArtery": { "6511003": ( "Structure of distal portion of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfDistalPortionOfRightCoronaryArtery": { "41879009": ( "Structure of distal portion of right coronary artery (body structure)", [], ) }, "StructureOfDorsalAspectOfScapula": { "51698000": ("Structure of dorsal aspect of scapula (body structure)", []) }, "StructureOfDorsalScapularArtery": { "91732003": ("Structure of dorsal scapular artery (body structure)", []) }, "StructureOfDorsalisPedisArtery": { "86547008": ("Structure of dorsalis pedis artery (body structure)", []) }, "StructureOfDuctusArteriosus": { "4432005": ("Structure of ductus arteriosus (body structure)", []) }, "StructureOfDuctusVenosus": { "367624001": ("Structure of ductus venosus (body structure)", []) }, "StructureOfEighthIntercostalSpace": { "117140004": ("Structure of eighth intercostal space (body structure)", []) }, "StructureOfEleventhIntercostalSpace": { "117143002": ("Structure of eleventh intercostal space (body structure)", []) }, "StructureOfEntorhinalCortex": { "3937002": ("Structure of entorhinal cortex (body structure)", []) }, "StructureOfEpigastricLymphNode": { "60965003": ("Structure of epigastric lymph node (body structure)", []) }, "StructureOfEpitrochlearLymphNode": { "28870006": ("Structure of epitrochlear lymph node (body structure)", []) }, "StructureOfErectorSpinaeMuscle": { "44947003": ("Structure of erector spinae muscle (body structure)", []) }, "StructureOfEsophagealArtery": { "206034008": ("Structure of esophageal artery (body structure)", []) }, "StructureOfEsophagealLymphNode": { "11899006": ("Structure of esophageal lymph node (body structure)", []) }, "StructureOfExternalIliacArtery": { "113269004": ("Structure of external iliac artery (body structure)", []) }, "StructureOfExternalIliacLymphNode": { "65349008": ("Structure of external iliac lymph node (body structure)", []) }, "StructureOfExternalIliacVein": { "63507001": ("Structure of external iliac vein (body structure)", []) }, "StructureOfExternalIntercostalMuscle": { "53967007": ("Structure of external intercostal muscle (body structure)", []) }, "StructureOfExternalJugularVein": { "71585003": ("Structure of external jugular vein (body structure)", []) }, "StructureOfExternalLimitingMembraneOfRetina": { "76710003": ( "Structure of external limiting membrane of retina (body structure)", [], ) }, "StructureOfExternalMammaryLymphNode": { "421988007": ("Structure of external mammary lymph node (body structure)", []) }, "StructureOfExtrapulmonaryLymphNodeOfLung": { "363537007": ( "Structure of extrapulmonary lymph node of lung (body structure)", [], ) }, "StructureOfEyeProper": { "81745001": ("Structure of eye proper (body structure)", []) }, "StructureOfEyelash": {"85803001": ("Structure of eyelash (body structure)", [])}, "StructureOfFacialArtery": { "23074001": ("Structure of facial artery (body structure)", []) }, "StructureOfFacialLymphNode": { "48918001": ("Structure of facial lymph node (body structure)", []) }, "StructureOfFemaleInternalGenitalOrgan": { "699886009": ("Structure of female internal genital organ (body structure)", []) }, "StructureOfFemoralArtery": { "7657000": ("Structure of femoral artery (body structure)", []) }, "StructureOfFibularLymphNode": { "31171007": ("Structure of fibular lymph node (body structure)", []) }, "StructureOfFifthIntercostalSpace": { "117137004": ("Structure of fifth intercostal space (body structure)", []) }, "StructureOfFifthLumbarArtery": { "397411003": ("Structure of fifth lumbar artery (body structure)", []) }, "StructureOfFirstDiagonalBranchOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "91750005": ( "Structure of first diagonal branch of anterior descending branch of left coronary artery (body " "structure)", [], ) }, "StructureOfFirstIntercostalSpace": { "117133000": ("Structure of first intercostal space (body structure)", []) }, "StructureOfFirstLeftPosterolateralBranchOfCircumflexBranchOfLeftCoronaryArtery": { "91757008": ( "Structure of first left posterolateral branch of circumflex branch of left coronary artery (body " "structure)", [], ) }, "StructureOfFirstLumbarArtery": { "397407009": ("Structure of first lumbar artery (body structure)", []) }, "StructureOfFirstObtuseMarginalBranchOfCircumflexBranchOfLeftCoronaryArtery": { "91754001": ( "Structure of first obtuse marginal branch of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfFirstRightPosterolateralBranchOfThePosteriorDescendingBranchOfRightCoronaryArtery": { "91761002": ( "Structure of first right posterolateral branch of the posterior descending branch of " "right coronary artery (body structure)", [], ) }, "StructureOfFontanelOfSkull": { "79361005": ("Structure of fontanel of skull (body structure)", []) }, "StructureOfForamenMagnum": { "24532009": ("Structure of foramen magnum (body structure)", []) }, "StructureOfForcepsMajor": { "80049006": ("Structure of forceps major (body structure)", []) }, "StructureOfForcepsMinor": { "42932006": ("Structure of forceps minor (body structure)", []) }, "StructureOfFourthIntercostalSpace": { "117136008": ("Structure of fourth intercostal space (body structure)", []) }, "StructureOfFourthLumbarArtery": { "397410002": ("Structure of fourth lumbar artery (body structure)", []) }, "StructureOfFoveaCentralis": { "67046006": ("Structure of fovea centralis (body structure)", []) }, "StructureOfGastricVein": { "110568007": ("Structure of gastric vein (body structure)", []) }, "StructureOfGastroOmentalLymphNode": { "83380007": ("Structure of gastro-omental lymph node (body structure)", []) }, "StructureOfGastroduodenalArtery": { "37274004": ("Structure of gastroduodenal artery (body structure)", []) }, "StructureOfGenicularArtery": { "128559007": ("Structure of genicular artery (body structure)", []) }, "StructureOfGenuOfCorpusCallosum": { "70215001": ("Structure of genu of corpus callosum (body structure)", []) }, "StructureOfGlutealLymphNode": { "80867000": ("Structure of gluteal lymph node (body structure)", []) }, "StructureOfHabenularCommissure": { "6866008": ("Structure of habenular commissure (body structure)", []) }, "StructureOfHeadOfFemur": { "2812003": ("Structure of head of femur (body structure)", []) }, "StructureOfHemolymphNode": { "18457007": ("Structure of hemolymph node (body structure)", []) }, "StructureOfHepaticArteryProper": { "18112008": ("Structure of hepatic artery proper (body structure)", []) }, "StructureOfHepaticLymphNode": { "61492009": ("Structure of hepatic lymph node (body structure)", []) }, "StructureOfHepaticVein": { "8993003": ("Structure of hepatic vein (body structure)", []) }, "StructureOfHighRightAtrium": { "128591008": ("Structure of high right atrium (body structure)", []) }, "StructureOfHilarLymphNode": { "53074004": ("Structure of hilar lymph node (body structure)", []) }, "StructureOfHilumOfLung": { "46750007": ("Structure of hilum of lung (body structure)", []) }, "StructureOfHypogastricLymphNode": { "69255009": ("Structure of hypogastric lymph node (body structure)", []) }, "StructureOfIleocolicLymphNode": { "281676003": ("Structure of ileocolic lymph node (body structure)", []) }, "StructureOfIliacArtery": { "10293006": ("Structure of iliac artery (body structure)", []) }, "StructureOfIliacLymphNode": { "84219008": ("Structure of iliac lymph node (body structure)", []) }, "StructureOfIliocostalisMuscle": { "57651003": ("Structure of iliocostalis muscle (body structure)", []) }, "StructureOfInferiorArticularProcessOfVertebra": { "317766009": ( "Structure of inferior articular process of vertebra (body structure)", [], ) }, "StructureOfInferiorAuricularLymphNode": { "155237005": ("Structure of inferior auricular lymph node (body structure)", []) }, "StructureOfInferiorFrontoOccipitalFasciculus": { "35664009": ( "Structure of inferior fronto-occipital fasciculus (body structure)", [], ) }, "StructureOfInferiorGlutealLymphNode": { "40684008": ("Structure of inferior gluteal lymph node (body structure)", []) }, "StructureOfInferiorHornOfLateralVentricle": { "53118009": ( "Structure of inferior horn of lateral ventricle (body structure)", [], ) }, "StructureOfInferiorInguinalLymphNode": { "85380009": ("Structure of inferior inguinal lymph node (body structure)", []) }, "StructureOfInferiorLeftPulmonaryVein": { "51249003": ("Structure of inferior left pulmonary vein (body structure)", []) }, "StructureOfInferiorLongitudinalFasciculus": { "55233005": ( "Structure of inferior longitudinal fasciculus (body structure)", [], ) }, "StructureOfInferiorMesentericArtery": { "33795007": ("Structure of inferior mesenteric artery (body structure)", []) }, "StructureOfInferiorMesentericLymphNode": { "113336002": ( "Structure of inferior mesenteric lymph node (body structure)", [], ) }, "StructureOfInferiorMesentericVein": { "32859001": ("Structure of inferior mesenteric vein (body structure)", []) }, "StructureOfInferiorPancreaticLymphNode": { "280915003": ( "Structure of inferior pancreatic lymph node (body structure)", [], ) }, "StructureOfInferiorPancreaticoduodenalLymphNode": { "281227003": ( "Structure of inferior pancreaticoduodenal lymph node (body structure)", [], ) }, "StructureOfInferiorPhrenicArtery": { "29660000": ("Structure of inferior phrenic artery (body structure)", []) }, "StructureOfInferiorRightPulmonaryVein": { "113273001": ("Structure of inferior right pulmonary vein (body structure)", []) }, "StructureOfInflowTractOfLeftVentricle": { "70238003": ("Structure of inflow tract of left ventricle (body structure)", []) }, "StructureOfInflowTractOfRightVentricle": { "8017000": ("Structure of inflow tract of right ventricle (body structure)", []) }, "StructureOfInfrarenalAorta": { "28205006": ("Structure of infrarenal aorta (body structure)", []) }, "StructureOfInfrasternalAngle": { "5076001": ("Structure of infrasternal angle (body structure)", []) }, "StructureOfInnermostIntercostalMuscle": { "24062007": ("Structure of innermost intercostal muscle (body structure)", []) }, "StructureOfInnominateLymphNode": { "196821008": ("Structure of innominate lymph node (body structure)", []) }, "StructureOfInteriliacLymphNode": { "279271008": ("Structure of interiliac lymph node (body structure)", []) }, "StructureOfInterlobarArteryOfKidney": { "274143007": ("Structure of interlobar artery of kidney (body structure)", []) }, "StructureOfInterlobularArteryOfKidney": { "274329007": ("Structure of interlobular artery of kidney (body structure)", []) }, "StructureOfIntermediateCommonIliacLymphNode": { "64556009": ( "Structure of intermediate common iliac lymph node (body structure)", [], ) }, "StructureOfInternalAcousticMeatusOfTemporalBone": { "61671002": ( "Structure of internal acoustic meatus of temporal bone (body structure)", [], ) }, "StructureOfInternalIliacArtery": { "90024005": ("Structure of internal iliac artery (body structure)", []) }, "StructureOfInternalIliacVein": { "40300007": ("Structure of internal iliac vein (body structure)", []) }, "StructureOfInternalIntercostalMuscle": { "41313007": ("Structure of internal intercostal muscle (body structure)", []) }, "StructureOfInternalThoracicArtery": { "69327007": ("Structure of internal thoracic artery (body structure)", []) }, "StructureOfInterpectoralLymphNode": { "420800007": ("Structure of interpectoral lymph node (body structure)", []) }, "StructureOfIntervertebralDiscOfL5AndS1": { "715056000": ( "Structure of intervertebral disc of L5 and S1 (body structure)", [], ) }, "StructureOfIntestinalLymphNode": { "36251007": ("Structure of intestinal lymph node (body structure)", []) }, "StructureOfIntracranialVein": { "128320002": ("Structure of intracranial vein (body structure)", []) }, "StructureOfIntraglandularParotidLymphNode": { "143824007": ( "Structure of intraglandular parotid lymph node (body structure)", [], ) }, "StructureOfIntramammaryLymphNode": { "443808008": ("Structure of intramammary lymph node (body structure)", []) }, "StructureOfIntrapulmonaryLymphNode": { "196662004": ("Structure of intrapulmonary lymph node (body structure)", []) }, "StructureOfIsthmusOfThyroidGland": { "40867004": ("Structure of isthmus of thyroid gland (body structure)", []) }, "StructureOfJugularLymphNode": { "58130000": ("Structure of jugular lymph node (body structure)", []) }, "StructureOfJugularNotchOfSternum": { "26493002": ("Structure of jugular notch of sternum (body structure)", []) }, "StructureOfJuxtaintestinalLymphNode": { "279609001": ("Structure of juxtaintestinal lymph node (body structure)", []) }, "StructureOfLacrimalArtery": { "59749000": ("Structure of lacrimal artery (body structure)", []) }, "StructureOfLaminaOfVertebra": { "89340005": ("Structure of lamina of vertebra (body structure)", []) }, "StructureOfLateralAxillaryLymphNode": { "33770006": ("Structure of lateral axillary lymph node (body structure)", []) }, "StructureOfLateralCalfPerforator": { "714754004": ("Structure of lateral calf perforator (body structure)", []) }, "StructureOfLateralCervicalLymphNode": { "68915008": ("Structure of lateral cervical lymph node (body structure)", []) }, "StructureOfLateralCommonIliacLymphNode": { "41145006": ( "Structure of lateral common iliac lymph node (body structure)", [], ) }, "StructureOfLateralCorticospinalTract": { "461002": ("Structure of lateral corticospinal tract (body structure)", []) }, "StructureOfLateralExternalIliacLymphNode": { "40242007": ( "Structure of lateral external iliac lymph node (body structure)", [], ) }, "StructureOfLateralJugularLymphNode": { "168159002": ("Structure of lateral jugular lymph node (body structure)", []) }, "StructureOfLateralMiddleRegionalPartOfPeripheralZoneOfLeftHalfProstate": { "716918005": ( "Structure of lateral middle regional part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfLateralMiddleRegionalPartOfPeripheralZoneOfRightHalfProstate": { "716917000": ( "Structure of lateral middle regional part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfLateralPericardialLymphNode": { "196587000": ( "Structure of lateral pericardial lymph node (body structure)", [], ) }, "StructureOfLateralPlantarArtery": { "44830000": ("Structure of lateral plantar artery (body structure)", []) }, "StructureOfLateralRetropharyngealLymphNode": { "167464007": ( "Structure of lateral retropharyngeal lymph node (body structure)", [], ) }, "StructureOfLateralVesicularLymphNode": { "278672000": ("Structure of lateral vesicular lymph node (body structure)", []) }, "StructureOfLatissimusDorsiMuscle": { "15665001": ("Structure of latissimus dorsi muscle (body structure)", []) }, "StructureOfLeftAnteriorDivisionOfLeftBranchOfAtrioventricularBundle": { "84654008": ( "Structure of left anterior division of left branch of atrioventricular bundle (body structure)", [], ) }, "StructureOfLeftAuricularAppendage": { "33626005": ("Structure of left auricular appendage (body structure)", []) }, "StructureOfLeftBranchOfHepaticArtery": { "21807003": ("Structure of left branch of hepatic artery (body structure)", []) }, "StructureOfLeftCarotidSinus": { "9775002": ("Structure of left carotid sinus (body structure)", []) }, "StructureOfLeftColicFlexure": { "72592005": ("Structure of left colic flexure (body structure)", []) }, "StructureOfLeftFemoralArtery": { "113270003": ("Structure of left femoral artery (body structure)", []) }, "StructureOfLeftGastricArtery": { "23771002": ("Structure of left gastric artery (body structure)", []) }, "StructureOfLeftHepaticVein": { "273202007": ("Structure of left hepatic vein (body structure)", []) }, "StructureOfLeftLobeOfThyroidGland": { "79163004": ("Structure of left lobe of thyroid gland (body structure)", []) }, "StructureOfLeftLowerQuadrantOfAbdomen": { "68505006": ("Structure of left lower quadrant of abdomen (body structure)", []) }, "StructureOfLeftMainBranchOfPortalVein": { "70253006": ( "Structure of left main branch of portal vein (body structure)", [], ) }, "StructureOfLeftPosteriorDivisionOfLeftBranchOfAtrioventricularBundle": { "91085002": ( "Structure of left posterior division of left branch of atrioventricular bundle (body structure)", [], ) }, "StructureOfLeftPosteriorLateralBranchOfCircumflexBranchOfLeftCoronaryArtery": { "57823005": ( "Structure of left posterior lateral branch of circumflex branch of left coronary artery (body " "structure)", [], ) }, "StructureOfLeftPulmonaryArtery": { "50408007": ("Structure of left pulmonary artery (body structure)", []) }, "StructureOfLeftPulmonaryVein": { "27706005": ("Structure of left pulmonary vein (body structure)", []) }, "StructureOfLeftSeminalVesicle": { "42320003": ("Structure of left seminal vesicle (body structure)", []) }, "StructureOfLeftSinusOfValsalva": { "36371001": ("Structure of left sinus of Valsalva (body structure)", []) }, "StructureOfLeftSubclavianArtery": { "85235006": ("Structure of left subclavian artery (body structure)", []) }, "StructureOfLeftUpperQuadrantOfAbdomen": { "86367003": ("Structure of left upper quadrant of abdomen (body structure)", []) }, "StructureOfLensOfEye": { "78076003": ("Structure of lens of eye (body structure)", []) }, "StructureOfLesserTrochanterOfFemur": { "55499008": ("Structure of lesser trochanter of femur (body structure)", []) }, "StructureOfLevatorCostaeMuscle": { "73930003": ("Structure of levator costae muscle (body structure)", []) }, "StructureOfLigament": {"52082005": ("Structure of ligament (body structure)", [])}, "StructureOfLigamentumArteriosum": { "2160002": ("Structure of ligamentum arteriosum (body structure)", []) }, "StructureOfLimbusOfFossaOvalis": { "84712000": ("Structure of limbus of fossa ovalis (body structure)", []) }, "StructureOfLingualArtery": { "113264009": ("Structure of lingual artery (body structure)", []) }, "StructureOfLobarArteryOfKidney": { "274060004": ("Structure of lobar artery of kidney (body structure)", []) }, "StructureOfLobeOfLung": { "31094006": ("Structure of lobe of lung (body structure)", []) }, "StructureOfLobeOfThyroidGland": { "119281005": ("Structure of lobe of thyroid gland (body structure)", []) }, "StructureOfLongissimusMuscle": { "88340001": ("Structure of longissimus muscle (body structure)", []) }, "StructureOfLowRightAtrium": { "128594000": ("Structure of low right atrium (body structure)", []) }, "StructureOfLowerInnerQuadrantOfBreast": { "19100000": ("Structure of lower inner quadrant of breast (body structure)", []) }, "StructureOfLowerLobeOfLung": { "90572001": ("Structure of lower lobe of lung (body structure)", []) }, "StructureOfLowerOuterQuadrantOfBreast": { "33564002": ("Structure of lower outer quadrant of breast (body structure)", []) }, "StructureOfLumbarArtery": { "34635009": ("Structure of lumbar artery (body structure)", []) }, "StructureOfLumbarLymphNode": { "8334002": ("Structure of lumbar lymph node (body structure)", []) }, "StructureOfLumenOfBodySystem": { "113342003": ("Structure of lumen of body system (body structure)", []) }, "StructureOfLungAndOrMediastinum": { "310787001": ("Structure of lung and/or mediastinum (body structure)", []) }, "StructureOfLymphNode": { "59441001": ("Structure of lymph node (body structure)", []) }, "StructureOfLymphNodeOfEpiploicForamen": { "68878000": ("Structure of lymph node of epiploic foramen (body structure)", []) }, "StructureOfLymphNodeOfGreaterCurvatureOfStomach": { "76878005": ( "Structure of lymph node of greater curvature of stomach (body structure)", [], ) }, "StructureOfLymphNodeOfHead": { "13482005": ("Structure of lymph node of head (body structure)", []) }, "StructureOfLymphNodeOfHeadAndNeck": { "312501005": ("Structure of lymph node of head and neck (body structure)", []) }, "StructureOfLymphNodeOfLesserCurvatureOfStomach": { "279784003": ( "Structure of lymph node of lesser curvature of stomach (body structure)", [], ) }, "StructureOfLymphNodeOfMesentery": { "279795009": ("Structure of lymph node of mesentery (body structure)", []) }, "StructureOfLymphNodeOfThorax": { "47109002": ("Structure of lymph node of thorax (body structure)", []) }, "StructureOfLymphNodeRingOfCardiaOfStomach": { "279866008": ( "Structure of lymph node ring of cardia of stomach (body structure)", [], ) }, "StructureOfLymphaticSystem": { "89890002": ("Structure of lymphatic system (body structure)", []) }, "StructureOfLymphaticVessel": { "83555006": ("Structure of lymphatic vessel (body structure)", []) }, "StructureOfMaleExternalUrethralSphincter": { "717027004": ( "Structure of male external urethral sphincter (body structure)", [], ) }, "StructureOfMandibularIncisorTooth": { "442274007": ("Structure of mandibular incisor tooth (body structure)", []) }, "StructureOfMandibularLeftCanineTooth": { "39844006": ("Structure of mandibular left canine tooth (body structure)", []) }, "StructureOfMandibularLeftCentralIncisorTooth": { "113278005": ( "Structure of mandibular left central incisor tooth (body structure)", [], ) }, "StructureOfMandibularLeftFirstMolarTooth": { "89625000": ( "Structure of mandibular left first molar tooth (body structure)", [], ) }, "StructureOfMandibularLeftFirstPremolarTooth": { "2400006": ( "Structure of mandibular left first premolar tooth (body structure)", [], ) }, "StructureOfMandibularLeftLateralIncisorTooth": { "77130001": ( "Structure of mandibular left lateral incisor tooth (body structure)", [], ) }, "StructureOfMandibularLeftSecondMolarTooth": { "48402004": ( "Structure of mandibular left second molar tooth (body structure)", [], ) }, "StructureOfMandibularLeftSecondPremolarTooth": { "24573005": ( "Structure of mandibular left second premolar tooth (body structure)", [], ) }, "StructureOfMandibularLeftThirdMolarTooth": { "74344005": ( "Structure of mandibular left third molar tooth (body structure)", [], ) }, "StructureOfMandibularLymphNode": { "155338003": ("Structure of mandibular lymph node (body structure)", []) }, "StructureOfMandibularRightCanineTooth": { "47055002": ("Structure of mandibular right canine tooth (body structure)", []) }, "StructureOfMandibularRightCentralIncisorTooth": { "15422005": ( "Structure of mandibular right central incisor tooth (body structure)", [], ) }, "StructureOfMandibularRightFirstMolarTooth": { "28480000": ( "Structure of mandibular right first molar tooth (body structure)", [], ) }, "StructureOfMandibularRightFirstPremolarTooth": { "80140008": ( "Structure of mandibular right first premolar tooth (body structure)", [], ) }, "StructureOfMandibularRightLateralIncisorTooth": { "82628004": ( "Structure of mandibular right lateral incisor tooth (body structure)", [], ) }, "StructureOfMandibularRightSecondMolarTooth": { "40005008": ( "Structure of mandibular right second molar tooth (body structure)", [], ) }, "StructureOfMandibularRightSecondPremolarTooth": { "8873007": ( "Structure of mandibular right second premolar tooth (body structure)", [], ) }, "StructureOfMandibularRightThirdMolarTooth": { "38994002": ( "Structure of mandibular right third molar tooth (body structure)", [], ) }, "StructureOfMarginalBranchOfRightCoronaryArtery": { "22765000": ( "Structure of marginal branch of right coronary artery (body structure)", [], ) }, "StructureOfMaxillaryIncisorTooth": { "442100006": ("Structure of maxillary incisor tooth (body structure)", []) }, "StructureOfMaxillaryLeftCanineTooth": { "72876007": ("Structure of maxillary left canine tooth (body structure)", []) }, "StructureOfMaxillaryLeftCentralIncisorTooth": { "31982000": ( "Structure of maxillary left central incisor tooth (body structure)", [], ) }, "StructureOfMaxillaryLeftFirstMolarTooth": { "23427002": ( "Structure of maxillary left first molar tooth (body structure)", [], ) }, "StructureOfMaxillaryLeftFirstPremolarTooth": { "61897005": ( "Structure of maxillary left first premolar tooth (body structure)", [], ) }, "StructureOfMaxillaryLeftLateralIncisorTooth": { "25748002": ( "Structure of maxillary left lateral incisor tooth (body structure)", [], ) }, "StructureOfMaxillaryLeftSecondMolarTooth": { "66303006": ( "Structure of maxillary left second molar tooth (body structure)", [], ) }, "StructureOfMaxillaryLeftSecondPremolarTooth": { "23226009": ( "Structure of maxillary left second premolar tooth (body structure)", [], ) }, "StructureOfMaxillaryLeftThirdMolarTooth": { "87704003": ( "Structure of maxillary left third molar tooth (body structure)", [], ) }, "StructureOfMaxillaryRightCanineTooth": { "80647007": ("Structure of maxillary right canine tooth (body structure)", []) }, "StructureOfMaxillaryRightCentralIncisorTooth": { "22120004": ( "Structure of maxillary right central incisor tooth (body structure)", [], ) }, "StructureOfMaxillaryRightFirstMolarTooth": { "5140004": ( "Structure of maxillary right first molar tooth (body structure)", [], ) }, "StructureOfMaxillaryRightFirstPremolarTooth": { "57826002": ( "Structure of maxillary right first premolar tooth (body structure)", [], ) }, "StructureOfMaxillaryRightLateralIncisorTooth": { "11712009": ( "Structure of maxillary right lateral incisor tooth (body structure)", [], ) }, "StructureOfMaxillaryRightSecondMolarTooth": { "7121006": ( "Structure of maxillary right second molar tooth (body structure)", [], ) }, "StructureOfMaxillaryRightSecondPremolarTooth": { "36492000": ( "Structure of maxillary right second premolar tooth (body structure)", [], ) }, "StructureOfMaxillaryRightThirdMolarTooth": { "68085002": ( "Structure of maxillary right third molar tooth (body structure)", [], ) }, "StructureOfMedialCommonIliacLymphNode": { "34625003": ("Structure of medial common iliac lymph node (body structure)", []) }, "StructureOfMedialExternalIliacLymphNode": { "42472007": ( "Structure of medial external iliac lymph node (body structure)", [], ) }, "StructureOfMedialLacunarLymphNode": { "23198005": ("Structure of medial lacunar lymph node (body structure)", []) }, "StructureOfMedialPlantarArtery": { "74156002": ("Structure of medial plantar artery (body structure)", []) }, "StructureOfMedianCubitalVein": { "49852007": ("Structure of median cubital vein (body structure)", []) }, "StructureOfMedianRetropharyngealLymphNode": { "167364008": ( "Structure of median retropharyngeal lymph node (body structure)", [], ) }, "StructureOfMesentericArtery": { "86570000": ("Structure of mesenteric artery (body structure)", []) }, "StructureOfMesentericArteryLymphNode": { "299993000": ("Structure of mesenteric artery lymph node (body structure)", []) }, "StructureOfMesentericVein": { "128583004": ("Structure of mesenteric vein (body structure)", []) }, "StructureOfMidPortionOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "91748002": ( "Structure of mid portion of anterior descending branch of left coronary artery (body structure)", [], ) }, "StructureOfMidPortionOfCircumflexBranchOfLeftCoronaryArtery": { "91753007": ( "Structure of mid portion of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfMidPortionOfRightCoronaryArtery": { "450960006": ( "Structure of mid portion of right coronary artery (body structure)", [], ) }, "StructureOfMidRightAtrium": { "128593006": ("Structure of mid right atrium (body structure)", []) }, "StructureOfMidcolicLymphNode": { "282031000": ("Structure of midcolic lymph node (body structure)", []) }, "StructureOfMiddleCardiacVein": { "73580002": ("Structure of middle cardiac vein (body structure)", []) }, "StructureOfMiddleCerebellarPeduncle": { "33723005": ("Structure of middle cerebellar peduncle (body structure)", []) }, "StructureOfMiddleCerebralArtery": { "17232002": ("Structure of middle cerebral artery (body structure)", []) }, "StructureOfMiddleHepaticVein": { "273099000": ("Structure of middle hepatic vein (body structure)", []) }, "StructureOfMiddleLobeOfLung": { "40020002": ("Structure of middle lobe of lung (body structure)", []) }, "StructureOfMiddleLobeOfRightLung": { "72481006": ("Structure of middle lobe of right lung (body structure)", []) }, "StructureOfMiddleRegionalPartOfAnteriorFibromuscularStromaOfLeftHalfProstate": { "716910003": ( "Structure of middle regional part of anterior fibromuscular stroma of left half prostate (body " "structure)", [], ) }, "StructureOfMiddleRegionalPartOfAnteriorFibromuscularStromaOfProstate": { "716908000": ( "Structure of middle regional part of anterior fibromuscular stroma of prostate (body structure)", [], ) }, "StructureOfMiddleRegionalPartOfAnteriorFibromuscularStromaOfRightHalfProstate": { "716909008": ( "Structure of middle regional part of anterior fibromuscular stroma of right half prostate (body " "structure)", [], ) }, "StructureOfMiddleRegionalPartOfTransitionZoneOfLeftHalfProstate": { "716912006": ( "Structure of middle regional part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfMiddleRegionalPartOfTransitionZoneOfRightHalfProstate": { "716911004": ( "Structure of middle regional part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfMucousMembraneOfFloorOfMouth": { "36152006": ( "Structure of mucous membrane of floor of mouth (body structure)", [], ) }, "StructureOfMucousMembraneOfLowerLip": { "46353006": ("Structure of mucous membrane of lower lip (body structure)", []) }, "StructureOfMucousMembraneOfTongue": { "8001006": ("Structure of mucous membrane of tongue (body structure)", []) }, "StructureOfMucousMembraneOfUpperLip": { "18444004": ("Structure of mucous membrane of upper lip (body structure)", []) }, "StructureOfMyocardiumOfAnterolateralRegion": { "73050001": ( "Structure of myocardium of anterolateral region (body structure)", [], ) }, "StructureOfMyocardiumOfApexOfHeart": { "47962008": ("Structure of myocardium of apex of heart (body structure)", []) }, "StructureOfMyocardiumOfDiaphragmaticRegion": { "72542009": ( "Structure of myocardium of diaphragmatic region (body structure)", [], ) }, "StructureOfMyocardiumOfInferolateralRegion": { "16239001": ( "Structure of myocardium of inferolateral region (body structure)", [], ) }, "StructureOfMyocardiumOfLeftVentricle": { "49848007": ("Structure of myocardium of left ventricle (body structure)", []) }, "StructureOfMyocardiumOfPosterolateralRegion": { "33272004": ( "Structure of myocardium of posterolateral region (body structure)", [], ) }, "StructureOfNasolabialLymphNode": { "144026003": ("Structure of nasolabial lymph node (body structure)", []) }, "StructureOfNasopharyngealCavity": { "18962004": ("Structure of nasopharyngeal cavity (body structure)", []) }, "StructureOfNeckOfRib": { "72184008": ("Structure of neck of rib (body structure)", []) }, "StructureOfNinthIntercostalSpace": { "117141000": ("Structure of ninth intercostal space (body structure)", []) }, "StructureOfObturatorLymphNode": { "36086000": ("Structure of obturator lymph node (body structure)", []) }, "StructureOfOccipitalArtery": { "31145008": ("Structure of occipital artery (body structure)", []) }, "StructureOfOccipitalLymphNode": { "3916005": ("Structure of occipital lymph node (body structure)", []) }, "StructureOfOccipitalRegionOfScalp": { "700032006": ("Structure of occipital region of scalp (body structure)", []) }, "StructureOfOccipitalVein": { "32114007": ("Structure of occipital vein (body structure)", []) }, "StructureOfOphthalmicArtery": { "53549008": ("Structure of ophthalmic artery (body structure)", []) }, "StructureOfOphthalmicSegmentOfInternalCarotidArtery": { "698348000": ( "Structure of ophthalmic segment of internal carotid artery (body structure)", [], ) }, "StructureOfOpticRadiation": { "70105001": ("Structure of optic radiation (body structure)", []) }, "StructureOfOrbitProper": { "363654007": ("Structure of orbit proper (body structure)", []) }, "StructureOfOstiumOfLeftCoronaryArtery": { "76862008": ("Structure of ostium of left coronary artery (body structure)", []) }, "StructureOfOstiumOfRightCoronaryArtery": { "56789007": ( "Structure of ostium of right coronary artery (body structure)", [], ) }, "StructureOfOutflowTractOfLeftVentricle": { "13418002": ( "Structure of outflow tract of left ventricle (body structure)", [], ) }, "StructureOfOutflowTractOfRightVentricle": { "44627009": ( "Structure of outflow tract of right ventricle (body structure)", [], ) }, "StructureOfOvarianArtery": { "12052000": ("Structure of ovarian artery (body structure)", []) }, "StructureOfOvarianVein": { "976004": ("Structure of ovarian vein (body structure)", []) }, "StructureOfPancreaticLymphNode": { "77778009": ("Structure of pancreatic lymph node (body structure)", []) }, "StructureOfPancreaticoduodenalLymphNode": { "76659008": ("Structure of pancreaticoduodenal lymph node (body structure)", []) }, "StructureOfPancreaticosplenicLymphNode": { "16050005": ("Structure of pancreaticosplenic lymph node (body structure)", []) }, "StructureOfParamammaryLymphNode": { "368550005": ("Structure of paramammary lymph node (body structure)", []) }, "StructureOfParametrialLymphNode": { "3243006": ("Structure of parametrial lymph node (body structure)", []) }, "StructureOfPararectalLymphNode": { "21875007": ("Structure of pararectal lymph node (body structure)", []) }, "StructureOfParasternalLymphNode": { "82365008": ("Structure of parasternal lymph node (body structure)", []) }, "StructureOfParasternalRegion": { "91691001": ("Structure of parasternal region (body structure)", []) }, "StructureOfParatrachealLymphNode": { "65690001": ("Structure of paratracheal lymph node (body structure)", []) }, "StructureOfParavaginalLymphNode": { "16228004": ("Structure of paravaginal lymph node (body structure)", []) }, "StructureOfParavesicularLymphNode": { "1439000": ("Structure of paravesicular lymph node (body structure)", []) }, "StructureOfParotidLymphNode": { "10209003": ("Structure of parotid lymph node (body structure)", []) }, "StructureOfPatellarLigament": { "18033002": ("Structure of patellar ligament (body structure)", []) }, "StructureOfPectoralAxillaryLymphNode": { "69691007": ("Structure of pectoral axillary lymph node (body structure)", []) }, "StructureOfPedicleOfVertebra": { "78972004": ("Structure of pedicle of vertebra (body structure)", []) }, "StructureOfPenileArtery": { "282044005": ("Structure of penile artery (body structure)", []) }, "StructureOfPerforatingArteryOfKidney": { "15763003": ("Structure of perforating artery of kidney (body structure)", []) }, "StructureOfPericardiophrenicArtery": { "3924000": ("Structure of pericardiophrenic artery (body structure)", []) }, "StructureOfPeripheralGlandularZoneOfProstate": { "279706003": ( "Structure of peripheral glandular zone of prostate (body structure)", [], ) }, "StructureOfPermanentMandibularLeftCentralIncisorTooth": { "425106001": ( "Structure of permanent mandibular left central incisor tooth (body structure)", [], ) }, "StructureOfPermanentMandibularLeftLateralIncisorTooth": { "423331005": ( "Structure of permanent mandibular left lateral incisor tooth (body structure)", [], ) }, "StructureOfPermanentMandibularRightCentralIncisorTooth": { "424575004": ( "Structure of permanent mandibular right central incisor tooth (body structure)", [], ) }, "StructureOfPermanentMandibularRightLateralIncisorTooth": { "423937004": ( "Structure of permanent mandibular right lateral incisor tooth (body structure)", [], ) }, "StructureOfPermanentMaxillaryLeftCentralIncisorTooth": { "424399000": ( "Structure of permanent maxillary left central incisor tooth (body structure)", [], ) }, "StructureOfPermanentMaxillaryLeftLateralIncisorTooth": { "423185002": ( "Structure of permanent maxillary left lateral incisor tooth (body structure)", [], ) }, "StructureOfPermanentMaxillaryRightCentralIncisorTooth": { "422653006": ( "Structure of permanent maxillary right central incisor tooth (body structure)", [], ) }, "StructureOfPermanentMaxillaryRightLateralIncisorTooth": { "424877001": ( "Structure of permanent maxillary right lateral incisor tooth (body structure)", [], ) }, "StructureOfPeronealArtery": { "8821006": ("Structure of peroneal artery (body structure)", []) }, "StructureOfPeronealVein": { "71758008": ("Structure of peroneal vein (body structure)", []) }, "StructureOfPharyngealRecess": { "1849007": ("Structure of pharyngeal recess (body structure)", []) }, "StructureOfPiriformRecess": { "6217003": ("Structure of piriform recess (body structure)", []) }, "StructureOfPituitaryFossa": { "42575006": ("Structure of pituitary fossa (body structure)", []) }, "StructureOfPoplitealArtery": { "43899006": ("Structure of popliteal artery (body structure)", []) }, "StructureOfPoplitealVein": { "56849005": ("Structure of popliteal vein (body structure)", []) }, "StructureOfPostductalRegionOfAorticArch": { "60835009": ( "Structure of postductal region of aortic arch (body structure)", [], ) }, "StructureOfPosteriorApicalPartOfTransitionZoneOfLeftHalfProstate": { "716933002": ( "Structure of posterior apical part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfPosteriorApicalPartOfTransitionZoneOfRightHalfProstate": { "716932007": ( "Structure of posterior apical part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfPosteriorBasalPartOfTransitionZoneOfLeftHalfProstate": { "716899002": ( "Structure of posterior basal part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfPosteriorBasalPartOfTransitionZoneOfRightHalfProstate": { "716898005": ( "Structure of posterior basal part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfPosteriorCerebralArtery": { "70382005": ("Structure of posterior cerebral artery (body structure)", []) }, "StructureOfPosteriorCommissureOfLabiaMajora": { "4019005": ( "Structure of posterior commissure of labia majora (body structure)", [], ) }, "StructureOfPosteriorCommunicatingArtery": { "43119007": ("Structure of posterior communicating artery (body structure)", []) }, "StructureOfPosteriorDescendingBranchOfRightCoronaryArtery": { "53655008": ( "Structure of posterior descending branch of right coronary artery (body structure)", [], ) }, "StructureOfPosteriorDescendingCoronaryArtery": { "443113009": ( "Structure of posterior descending coronary artery (body structure)", [], ) }, "StructureOfPosteriorHornOfLateralVentricle": { "52943005": ( "Structure of posterior horn of lateral ventricle (body structure)", [], ) }, "StructureOfPosteriorLateralBranchOfRightCoronaryArtery": { "17269004": ( "Structure of posterior lateral branch of right coronary artery (body structure)", [], ) }, "StructureOfPosteriorMediastinalLymphNode": { "25447008": ( "Structure of posterior mediastinal lymph node (body structure)", [], ) }, "StructureOfPosteriorMiddleRegionalPartOfTransitionZoneOfLeftHalfProstate": { "716916009": ( "Structure of posterior middle regional part of transition zone of left half prostate (body structure)", [], ) }, "StructureOfPosteriorMiddleRegionalPartOfTransitionZoneOfRightHalfProstate": { "716915008": ( "Structure of posterior middle regional part of transition zone of right half prostate (body structure)", [], ) }, "StructureOfPosteriorSegmentOfRightUpperLobeOfLung": { "3236000": ( "Structure of posterior segment of right upper lobe of lung (body structure)", [], ) }, "StructureOfPosteriorSinusOfValsalva": { "24865005": ("Structure of posterior sinus of Valsalva (body structure)", []) }, "StructureOfPosteriorTibialArtery": { "13363002": ("Structure of posterior tibial artery (body structure)", []) }, "StructureOfPosteriorTibialLymphNode": { "303623000": ("Structure of posterior tibial lymph node (body structure)", []) }, "StructureOfPosteriorTibialVein": { "4258007": ("Structure of posterior tibial vein (body structure)", []) }, "StructureOfPosteriorVeinOfLeftVentricle": { "195416006": ( "Structure of posterior vein of left ventricle (body structure)", [], ) }, "StructureOfPosterolateralApicalPartOfPeripheralZoneOfLeftHalfProstate": { "716939003": ( "Structure of posterolateral apical part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfPosterolateralApicalPartOfPeripheralZoneOfRightHalfProstate": { "716938006": ( "Structure of posterolateral apical part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfPosterolateralBasalPartOfPeripheralZoneOfLeftHalfProstate": { "716907005": ( "Structure of posterolateral basal part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfPosterolateralBasalPartOfPeripheralZoneOfRightHalfProstate": { "716906001": ( "Structure of posterolateral basal part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfPosterolateralMiddleRegionalPartOfPeripheralZoneOfLeftHalfProstate": { "716922000": ( "Structure of posterolateral middle regional part of peripheral zone of left half prostate (body " "structure)", [], ) }, "StructureOfPosterolateralMiddleRegionalPartOfPeripheralZoneOfRightHalfProstate": { "716921007": ( "Structure of posterolateral middle regional part of peripheral zone of right half prostate (body " "structure)", [], ) }, "StructureOfPosteromedialApicalPartOfPeripheralZoneOfLeftHalfProstate": { "716941002": ( "Structure of posteromedial apical part of peripheral zone of left half prostate (body structure)", [], ) }, "StructureOfPosteromedialApicalPartOfPeripheralZoneOfRightHalfProstate": { "716940001": ( "Structure of posteromedial apical part of peripheral zone of right half prostate (body structure)", [], ) }, "StructureOfPosteromedialMiddleRegionalPartOfPeripheralZoneOfLeftHalfProstate": { "716924004": ( "Structure of posteromedial middle regional part of peripheral zone of left half prostate (body " "structure)", [], ) }, "StructureOfPosteromedialMiddleRegionalPartOfPeripheralZoneOfRightHalfProstate": { "716923005": ( "Structure of posteromedial middle regional part of peripheral zone of right half prostate (body " "structure)", [], ) }, "StructureOfPostvesicularLymphNode": { "278571002": ("Structure of postvesicular lymph node (body structure)", []) }, "StructureOfPrececalLymphNode": { "281765006": ("Structure of prececal lymph node (body structure)", []) }, "StructureOfPreductalRegionOfAorticArch": { "75397005": ( "Structure of preductal region of aortic arch (body structure)", [], ) }, "StructureOfPrelaryngealLymphNode": { "74203007": ("Structure of prelaryngeal lymph node (body structure)", []) }, "StructureOfPrepericardialLymphNode": { "196516004": ("Structure of prepericardial lymph node (body structure)", []) }, "StructureOfPresymphysialLymphNode": { "6413002": ("Structure of presymphysial lymph node (body structure)", []) }, "StructureOfPretrachealLymphNode": { "168460001": ("Structure of pretracheal lymph node (body structure)", []) }, "StructureOfPrevertebralLymphNode": { "196446004": ("Structure of prevertebral lymph node (body structure)", []) }, "StructureOfPrevesicularLymphNode": { "11740004": ("Structure of prevesicular lymph node (body structure)", []) }, "StructureOfPrimitivePulmonaryArtery": { "91707000": ("Structure of primitive pulmonary artery (body structure)", []) }, "StructureOfProfundaFemorisArtery": { "31677005": ("Structure of profunda femoris artery (body structure)", []) }, "StructureOfProfundaFemorisVein": { "23438002": ("Structure of profunda femoris vein (body structure)", []) }, "StructureOfPromontoryCommonIliacLymphNode": { "279189002": ( "Structure of promontory common iliac lymph node (body structure)", [], ) }, "StructureOfProximalPortionOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "68787002": ( "Structure of proximal portion of anterior descending branch of left coronary artery (body structure)", [], ) }, "StructureOfProximalPortionOfCircumflexBranchOfLeftCoronaryArtery": { "52433000": ( "Structure of proximal portion of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfProximalPortionOfRightCoronaryArtery": { "91083009": ( "Structure of proximal portion of right coronary artery (body structure)", [], ) }, "StructureOfPurkinjeFibers": { "13050003": ("Structure of purkinje fibers (body structure)", []) }, "StructureOfPutamen": {"89278009": ("Structure of putamen (body structure)", [])}, "StructureOfPyloricLymphNode": { "24889003": ("Structure of pyloric lymph node (body structure)", []) }, "StructureOfRadialArtery": { "45631007": ("Structure of radial artery (body structure)", []) }, "StructureOfRadialVein": { "52359001": ("Structure of radial vein (body structure)", []) }, "StructureOfRectouterinePouch": { "53843000": ("Structure of rectouterine pouch (body structure)", []) }, "StructureOfRenalArtery": { "2841007": ("Structure of renal artery (body structure)", []) }, "StructureOfRenalHilarLymphNode": { "249708006": ("Structure of renal hilar lymph node (body structure)", []) }, "StructureOfRenalVein": { "56400007": ("Structure of renal vein (body structure)", []) }, "StructureOfRetrocecalLymphNode": { "281847004": ("Structure of retrocecal lymph node (body structure)", []) }, "StructureOfRetromolarAreaOfMouth": { "85816001": ("Structure of retromolar area of mouth (body structure)", []) }, "StructureOfRetroperitonealLymphNode": { "91394001": ("Structure of retroperitoneal lymph node (body structure)", []) }, "StructureOfRetropharyngealLymphNode": { "25683005": ("Structure of retropharyngeal lymph node (body structure)", []) }, "StructureOfRetropyloricLymphNode": { "280402004": ("Structure of retropyloric lymph node (body structure)", []) }, "StructureOfRightAuricularAppendage": { "68300000": ("Structure of right auricular appendage (body structure)", []) }, "StructureOfRightBranchOfAtrioventricularBundle": { "57383004": ( "Structure of right branch of atrioventricular bundle (body structure)", [], ) }, "StructureOfRightBranchOfHepaticArtery": { "69421009": ("Structure of right branch of hepatic artery (body structure)", []) }, "StructureOfRightColicFlexure": { "48338005": ("Structure of right colic flexure (body structure)", []) }, "StructureOfRightFemoralArtery": { "69833005": ("Structure of right femoral artery (body structure)", []) }, "StructureOfRightHepaticVein": { "272998002": ("Structure of right hepatic vein (body structure)", []) }, "StructureOfRightLobeOfThyroidGland": { "29565003": ("Structure of right lobe of thyroid gland (body structure)", []) }, "StructureOfRightLowerQuadrantOfAbdomen": { "48544008": ( "Structure of right lower quadrant of abdomen (body structure)", [], ) }, "StructureOfRightMainBranchOfPortalVein": { "73931004": ( "Structure of right main branch of portal vein (body structure)", [], ) }, "StructureOfRightMiddlePulmonaryVein": { "443714006": ("Structure of right middle pulmonary vein (body structure)", []) }, "StructureOfRightPulmonaryArtery": { "78480002": ("Structure of right pulmonary artery (body structure)", []) }, "StructureOfRightPulmonaryVein": { "91539005": ("Structure of right pulmonary vein (body structure)", []) }, "StructureOfRightSeminalVesicle": { "74308000": ("Structure of right seminal vesicle (body structure)", []) }, "StructureOfRightSinusOfValsalva": { "89093001": ("Structure of right sinus of Valsalva (body structure)", []) }, "StructureOfRightSubclavianArtery": { "29700009": ("Structure of right subclavian artery (body structure)", []) }, "StructureOfRightUpperQuadrantOfAbdomen": { "50519007": ( "Structure of right upper quadrant of abdomen (body structure)", [], ) }, "StructureOfRootOfTongue": { "47975008": ("Structure of root of tongue (body structure)", []) }, "StructureOfSacralLymphNode": { "79926007": ("Structure of sacral lymph node (body structure)", []) }, "StructureOfSaphenofemoralJunction": { "128587003": ("Structure of saphenofemoral junction (body structure)", []) }, "StructureOfScaleneLymphNode": { "81132008": ("Structure of scalene lymph node (body structure)", []) }, "StructureOfScalenusAnteriorMuscle": { "50755001": ("Structure of scalenus anterior muscle (body structure)", []) }, "StructureOfSecondDiagonalBranchOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "91751009": ( "Structure of second diagonal branch of anterior descending branch of left coronary artery (body " "structure)", [], ) }, "StructureOfSecondIntercostalSpace": { "117134006": ("Structure of second intercostal space (body structure)", []) }, "StructureOfSecondLeftPosterolateralBranchOfCircumflexBranchOfLeftCoronaryArtery": { "91758003": ( "Structure of second left posterolateral branch of circumflex branch of left coronary artery (body " "structure)", [], ) }, "StructureOfSecondLumbarArtery": { "397408004": ("Structure of second lumbar artery (body structure)", []) }, "StructureOfSecondObtuseMarginalBranchOfCircumflexBranchOfLeftCoronaryArtery": { "91755000": ( "Structure of second obtuse marginal branch of circumflex branch of left coronary artery (body " "structure)", [], ) }, "StructureOfSecondRightPosterolateralBranchOfThePosteriorDescendingBranchOfRightCoronaryArtery": { "91762009": ( "Structure of second right posterolateral branch of the posterior descending branch of " "right coronary artery (body structure)", [], ) }, "StructureOfSegmentalBranchOfRenalArtery": { "120234003": ( "Structure of segmental branch of renal artery (body structure)", [], ) }, "StructureOfSerratusAnteriorMuscle": { "18346003": ("Structure of serratus anterior muscle (body structure)", []) }, "StructureOfSesamoidBoneOfFoot": { "58742003": ("Structure of sesamoid bone of foot (body structure)", []) }, "StructureOfSeventhIntercostalSpace": { "117139001": ("Structure of seventh intercostal space (body structure)", []) }, "StructureOfShaftOfRib": { "41601005": ("Structure of shaft of rib (body structure)", []) }, "StructureOfSigmoidLymphNode": { "30024008": ("Structure of sigmoid lymph node (body structure)", []) }, "StructureOfSinoatrialNode": { "88210001": ("Structure of sinoatrial node (body structure)", []) }, "StructureOfSinusOfValsalva": { "81128002": ("Structure of sinus of Valsalva (body structure)", []) }, "StructureOfSixthIntercostalSpace": { "117138009": ("Structure of sixth intercostal space (body structure)", []) }, "StructureOfSixthLumbarArtery": { "397412005": ("Structure of sixth lumbar artery (body structure)", []) }, "StructureOfSmallCardiacVein": { "49082002": ("Structure of small cardiac vein (body structure)", []) }, "StructureOfSmallSaphenousVein": { "26805005": ("Structure of small saphenous vein (body structure)", []) }, "StructureOfSmallestCardiacVein": { "195073003": ("Structure of smallest cardiac vein (body structure)", []) }, "StructureOfSpinalisMuscle": { "4317002": ("Structure of spinalis muscle (body structure)", []) }, "StructureOfSpinousProcessOfVertebra": { "55678000": ("Structure of spinous process of vertebra (body structure)", []) }, "StructureOfSplenicArtery": { "22083002": ("Structure of splenic artery (body structure)", []) }, "StructureOfSplenicLymphNode": { "280824006": ("Structure of splenic lymph node (body structure)", []) }, "StructureOfSplenicVein": { "35819009": ("Structure of splenic vein (body structure)", []) }, "StructureOfSpleniumOfCorpusCallosum": { "23347006": ("Structure of splenium of corpus callosum (body structure)", []) }, "StructureOfSternalAngle": { "44612009": ("Structure of sternal angle (body structure)", []) }, "StructureOfSternocleidomastoidMuscle": { "22823000": ("Structure of sternocleidomastoid muscle (body structure)", []) }, "StructureOfSubarachnoidSpaceOfBrain": { "33930006": ("Structure of subarachnoid space of brain (body structure)", []) }, "StructureOfSubcarinalLymphNode": { "28330007": ("Structure of subcarinal lymph node (body structure)", []) }, "StructureOfSubclavianArtery": { "36765005": ("Structure of subclavian artery (body structure)", []) }, "StructureOfSubclavianLymphNode": { "421861001": ("Structure of subclavian lymph node (body structure)", []) }, "StructureOfSubclavianVein": { "9454009": ("Structure of subclavian vein (body structure)", []) }, "StructureOfSubcostalMuscle": { "64658001": ("Structure of subcostal muscle (body structure)", []) }, "StructureOfSubmandibularLymphNode": { "59503006": ("Structure of submandibular lymph node (body structure)", []) }, "StructureOfSubmentalLymphNode": { "46055009": ("Structure of submental lymph node (body structure)", []) }, "StructureOfSubpyloricLymphNode": { "280314006": ("Structure of subpyloric lymph node (body structure)", []) }, "StructureOfSubscapularAxillaryLymphNode": { "12196003": ( "Structure of subscapular axillary lymph node (body structure)", [], ) }, "StructureOfSuperficialAnteriorCervicalLymphNode": { "168557005": ( "Structure of superficial anterior cervical lymph node (body structure)", [], ) }, "StructureOfSuperficialInguinalLymphNode": { "113340006": ( "Structure of superficial inguinal lymph node (body structure)", [], ) }, "StructureOfSuperficialLateralCervicalLymphNode": { "167965000": ( "Structure of superficial lateral cervical lymph node (body structure)", [], ) }, "StructureOfSuperficialLymphNode": { "90606007": ("Structure of superficial lymph node (body structure)", []) }, "StructureOfSuperficialPalmarVenousArch": { "368479001": ( "Structure of superficial palmar venous arch (body structure)", [], ) }, "StructureOfSuperficialPoplitealLymphNode": { "12728001": ( "Structure of superficial popliteal lymph node (body structure)", [], ) }, "StructureOfSuperficialTemporalArtery": { "15672000": ("Structure of superficial temporal artery (body structure)", []) }, "StructureOfSuperiorArticularProcessOfVertebra": { "317665004": ( "Structure of superior articular process of vertebra (body structure)", [], ) }, "StructureOfSuperiorCerebellarPeduncle": { "11089000": ("Structure of superior cerebellar peduncle (body structure)", []) }, "StructureOfSuperiorFrontoOccipitalFasciculus": { "13958008": ( "Structure of superior fronto-occipital fasciculus (body structure)", [], ) }, "StructureOfSuperiorGlutealLymphNode": { "76290003": ("Structure of superior gluteal lymph node (body structure)", []) }, "StructureOfSuperiorLeftPulmonaryVein": { "43863001": ("Structure of superior left pulmonary vein (body structure)", []) }, "StructureOfSuperiorLongitudinalFasciculus": { "89202009": ( "Structure of superior longitudinal fasciculus (body structure)", [], ) }, "StructureOfSuperiorMesentericLymphNode": { "49394004": ("Structure of superior mesenteric lymph node (body structure)", []) }, "StructureOfSuperiorMesentericVein": { "90771006": ("Structure of superior mesenteric vein (body structure)", []) }, "StructureOfSuperiorPancreaticLymphNode": { "280999005": ( "Structure of superior pancreatic lymph node (body structure)", [], ) }, "StructureOfSuperiorPancreaticoduodenalLymphNode": { "281320004": ( "Structure of superior pancreaticoduodenal lymph node (body structure)", [], ) }, "StructureOfSuperiorPhrenicArtery": { "38991005": ("Structure of superior phrenic artery (body structure)", []) }, "StructureOfSuperiorRectalLymphNode": { "68881005": ("Structure of superior rectal lymph node (body structure)", []) }, "StructureOfSuperiorRightPulmonaryVein": { "8629005": ("Structure of superior right pulmonary vein (body structure)", []) }, "StructureOfSuperiorThyroidArtery": { "72021004": ("Structure of superior thyroid artery (body structure)", []) }, "StructureOfSuperiorTracheobronchialLymphNode": { "67941004": ( "Structure of superior tracheobronchial lymph node (body structure)", [], ) }, "StructureOfSupraclavicularLymphNode": { "76838003": ("Structure of supraclavicular lymph node (body structure)", []) }, "StructureOfSupraclavicularRegionOfNeck": { "77621008": ("Structure of supraclavicular region of neck (body structure)", []) }, "StructureOfSuprapyloricLymphNode": { "280216006": ("Structure of suprapyloric lymph node (body structure)", []) }, "StructureOfSuprarenalAorta": { "1918003": ("Structure of suprarenal aorta (body structure)", []) }, "StructureOfSurfaceOfBone": { "425647002": ("Structure of surface of bone (body structure)", []) }, "StructureOfTapetumOfCorpusCallosum": { "60105000": ("Structure of tapetum of corpus callosum (body structure)", []) }, "StructureOfTeethGumsAndSupportingStructures": { "28035005": ( "Structure of teeth, gums, and supporting structures (body structure)", [], ) }, "StructureOfTelencephalon": { "11628009": ("Structure of telencephalon (body structure)", []) }, "StructureOfTendonOfTodaro": { "128595004": ("Structure of tendon of Todaro (body structure)", []) }, "StructureOfTenthIntercostalSpace": { "117142007": ("Structure of tenth intercostal space (body structure)", []) }, "StructureOfTeresMajorMuscle": { "1193009": ("Structure of teres major muscle (body structure)", []) }, "StructureOfTeresMinorMuscle": { "51159009": ("Structure of teres minor muscle (body structure)", []) }, "StructureOfTerminalPortionOfInternalCarotidArtery": { "415646005": ( "Structure of terminal portion of internal carotid artery (body structure)", [], ) }, "StructureOfTesticularArtery": { "27175001": ("Structure of testicular artery (body structure)", []) }, "StructureOfTesticularVein": { "31688004": ("Structure of testicular vein (body structure)", []) }, "StructureOfThighPerforator": { "714759009": ("Structure of thigh perforator (body structure)", []) }, "StructureOfThirdDiagonalBranchOfAnteriorDescendingBranchOfLeftCoronaryArtery": { "91752002": ( "Structure of third diagonal branch of anterior descending branch of left coronary artery (body " "structure)", [], ) }, "StructureOfThirdIntercostalSpace": { "117135007": ("Structure of third intercostal space (body structure)", []) }, "StructureOfThirdLeftPosterolateralBranchOfCircumflexBranchOfLeftCoronaryArtery": { "91759006": ( "Structure of third left posterolateral branch of circumflex branch of left coronary artery (body " "structure)", [], ) }, "StructureOfThirdLumbarArtery": { "397409007": ("Structure of third lumbar artery (body structure)", []) }, "StructureOfThirdObtuseMarginalBranchOfCircumflexBranchOfLeftCoronaryArtery": { "91756004": ( "Structure of third obtuse marginal branch of circumflex branch of left coronary artery (body structure)", [], ) }, "StructureOfThirdRightPosterolateralBranchOfThePosteriorDescendingBranchOfRightCoronaryArtery": { "91763004": ( "Structure of third right posterolateral branch of the posterior descending branch of " "right coronary artery (body structure)", [], ) }, "StructureOfThoracicInlet": { "42973007": ("Structure of thoracic inlet (body structure)", []) }, "StructureOfThyrocervicalTrunk": { "6538005": ("Structure of thyrocervical trunk (body structure)", []) }, "StructureOfTibialLymphNode": { "80769008": ("Structure of tibial lymph node (body structure)", []) }, "StructureOfTransitionZoneOfProstate": { "399384005": ("Structure of transition zone of prostate (body structure)", []) }, "StructureOfTransverseAorticArch": { "443281009": ("Structure of transverse aortic arch (body structure)", []) }, "StructureOfTransverseProcessOfVertebra": { "73400003": ("Structure of transverse process of vertebra (body structure)", []) }, "StructureOfTransverseThoracisMuscle": { "88454005": ("Structure of transverse thoracis muscle (body structure)", []) }, "StructureOfTrapeziusMuscle": { "31764008": ("Structure of trapezius muscle (body structure)", []) }, "StructureOfTrunkOfPulmonaryArtery": { "45341000": ("Structure of trunk of pulmonary artery (body structure)", []) }, "StructureOfTubalTonsil": { "21058000": ("Structure of tubal tonsil (body structure)", []) }, "StructureOfUlnarArtery": { "44984001": ("Structure of ulnar artery (body structure)", []) }, "StructureOfUlnarVein": { "17623008": ("Structure of ulnar vein (body structure)", []) }, "StructureOfUmbilicalArtery": { "50536004": ("Structure of umbilical artery (body structure)", []) }, "StructureOfUmbilicalPortionOfPortalVein": { "284639000": ( "Structure of umbilical portion of portal vein (body structure)", [], ) }, "StructureOfUmbilicalVein": { "367567000": ("Structure of umbilical vein (body structure)", []) }, "StructureOfUncinateFasciculus": { "26230003": ("Structure of uncinate fasciculus (body structure)", []) }, "StructureOfUpperInnerQuadrantOfBreast": { "77831004": ("Structure of upper inner quadrant of breast (body structure)", []) }, "StructureOfUpperLobeOfLeftLung": { "44714003": ("Structure of upper lobe of left lung (body structure)", []) }, "StructureOfUpperLobeOfLung": { "45653009": ("Structure of upper lobe of lung (body structure)", []) }, "StructureOfUpperOuterQuadrantOfBreast": { "76365002": ("Structure of upper outer quadrant of breast (body structure)", []) }, "StructureOfUpperUrinaryTractProper": { "431491007": ("Structure of upper urinary tract proper (body structure)", []) }, "StructureOfUrinaryBladderCavity": { "48367006": ("Structure of urinary bladder cavity (body structure)", []) }, "StructureOfUrinaryTractProper": { "431938005": ("Structure of urinary tract proper (body structure)", []) }, "StructureOfUterineArtery": { "91079009": ("Structure of uterine artery (body structure)", []) }, "StructureOfUterineParacervicalLymphNode": { "5394000": ("Structure of uterine paracervical lymph node (body structure)", []) }, "StructureOfUterineVein": { "60028002": ("Structure of uterine vein (body structure)", []) }, "StructureOfVeinOfLowerExtremity": { "122774002": ("Structure of vein of lower extremity (body structure)", []) }, "StructureOfVeinOfUpperExtremity": { "122775001": ("Structure of vein of upper extremity (body structure)", []) }, "StructureOfVenousNetwork": { "34340008": ("Structure of venous network (body structure)", []) }, "StructureOfVentricularVein": { "195328002": ("Structure of ventricular vein (body structure)", []) }, "StructureOfVertebralArtery": { "85234005": ("Structure of vertebral artery (body structure)", []) }, "StructureOfVertebralColumn": { "421060004": ("Structure of vertebral column (body structure)", []) }, "StructureOfVerticalOccipitalFasciculus": { "80434005": ("Structure of vertical occipital fasciculus (body structure)", []) }, "StructureOfVisceralPericardium": { "6871001": ("Structure of visceral pericardium (body structure)", []) }, "StructureOfVitellineArteryOfPlacenta": { "256779006": ("Structure of vitelline artery of placenta (body structure)", []) }, "StructureOfVitellineVeinOfPlacenta": { "256875007": ("Structure of vitelline vein of placenta (body structure)", []) }, "StructureOfXiphoidProcessOfSternum": { "20298003": ("Structure of xiphoid process of sternum (body structure)", []) }, "StructureSinusOfValsalva": {"81128002": ("Structure Sinus of Valsalva", [12291])}, "Stryker": {"422954003": ("Stryker", [4012])}, "StrykerProjection": {"422954003": ("Stryker projection (qualifier value)", [])}, "StumpyTailCattleDogBreed": {"132636008": ("Stumpy Tail Cattle Dog breed", [7480])}, "StyrianMountainDogBreed": {"132452003": ("Styrian Mountain dog breed", [7480])}, "Subacute": {"19939008": ("Subacute", [6130])}, "SubacuteBacterialEndocarditis": { "73774007": ("Subacute bacterial endocarditis", [3700]) }, "SubaorticCommonIliacLymphNode": { "60227002": ("subaortic common iliac lymph node", [7600, 8134]) }, "SubarachnoidSpace": { "35951006": ("Subarachnoid space", [7151, 7153, 7192, 8134, 9514]) }, "SubarachnoidSpaceStructure": { "35951006": ("Subarachnoid space structure (body structure)", []) }, "SubareolarPositionOnMammogram": { "129784002": ("Subareolar position on mammogram (finding)", []) }, "SubareolarRegion": {"129784002": ("Subareolar region", [6018, 6019])}, "Subcapsular": {"61397002": ("Subcapsular", [2])}, "SubcarinalLymphNode": {"28330007": ("subcarinal lymph node", [7600, 8134])}, "SubclavianArtery": { "36765005": ( "Subclavian artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12104, 12107, ], ) }, "SubclavianLymphNode": {"421861001": ("subclavian lymph node", [7600, 8134])}, "SubclavianVein": { "9454009": ( "Subclavian vein", [ 4, 3010, 3607, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12108, ], ) }, "Subcostal": {"264208000": ("Subcostal", [5])}, "SubcostalLongAxis": {"399310008": ("Subcostal long axis", [501, 12226])}, "SubcostalLongAxisView": { "399310008": ("Subcostal long axis view (qualifier value)", []) }, "SubcostalMuscle": { "64658001": ("Subcostal muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "SubcostalObliqueCoronalView": { "443640005": ("Subcostal oblique coronal view", [501, 12226]) }, "SubcostalShortAxis": {"399200001": ("Subcostal short axis", [501, 12226])}, "SubcostalShortAxisView": { "399200001": ("Subcostal short axis view (qualifier value)", []) }, "SubcostalShortAxisViewAtAorticValveLevel": { "443609003": ("Subcostal short axis view at aortic valve level", [501, 12226]) }, "SubcostalShortAxisViewAtMitralValveLevel": { "443499004": ("Subcostal short axis view at mitral valve level", [501, 12226]) }, "SubcostalShortAxisViewAtPapillaryMuscleLevel": { "443160001": ( "Subcostal short axis view at papillary muscle level", [501, 12226], ) }, "SubcostalShortAxisViewAtVenousInflowLevel": { "443500008": ("Subcostal short axis view at venous inflow level", [501, 12226]) }, "SubcostalViewOfCardiacOutletsDirectedAnteriorly": { "443100003": ( "Subcostal view of cardiac outlets directed anteriorly", [501, 12226], ) }, "SubcutaneousRoute": {"34206005": ("Subcutaneous route", [11])}, "SubcutaneousTissue": {"71966008": ("Subcutaneous tissue", [5, 7151, 7166, 7191])}, "SubcutaneousTissueStructure": { "71966008": ("Subcutaneous tissue structure (body structure)", []) }, "SubdiaphragmaticTracerUptake": { "429382003": ("Subdiaphragmatic tracer uptake (finding)", []) }, "SubdiaphragmaticUptake": {"429382003": ("Subdiaphragmatic uptake", [3115])}, "SubfamilyBovinae": {"107007004": ("Subfamily Bovinae (organism)", [])}, "SubjectRelationshipContext": { "408732007": ("Subject relationship context (attribute)", []) }, "SubmandibularArea": {"5713008": ("Submandibular area", [4, 7151, 7192, 9514])}, "SubmandibularGland": { "54019009": ( "Submandibular gland", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "SubmandibularLymphNode": {"59503006": ("submandibular lymph node", [7600, 8134])}, "SubmandibularSalivaryApparatus": { "54019009": ("Submandibular salivary apparatus (body structure)", []) }, "SubmandibularTriangle": {"5713008": ("Submandibular triangle", [4029, 8134])}, "SubmandibularTriangleStructure": { "5713008": ("Submandibular triangle structure (body structure)", []) }, "Submental": {"170887008": ("Submental", [4, 7151, 7192, 8134, 9514])}, "SubmentalLymphNode": {"46055009": ("submental lymph node", [7600, 8134])}, "SubmentalTriangleStructure": { "170887008": ("Submental triangle structure (body structure)", []) }, "Submentovertical": {"399255003": ("submentovertical", [501, 4010])}, "SubmentoverticalProjection": { "399255003": ("Submentovertical projection (qualifier value)", []) }, "SuboticaWhitePigBreed": {"133212006": ("Subotica White pig breed", [7480])}, "Subpleural": {"68599007": ("Subpleural", [6124, 6126])}, "SubpyloricLymphNode": {"280314006": ("subpyloric lymph node", [7600, 8134])}, "SubscapularAxillaryLymphNode": { "12196003": ("subscapular axillary lymph node", [7600, 8134]) }, "SubscapularisMuscle": { "90588001": ("Subscapularis muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "SubscapularisMuscleStructure": { "90588001": ("Subscapularis muscle structure (body structure)", []) }, "SubsegmentalLymphNodeOfTheLung": { "127922000": ("subsegmental lymph node of the lung", [7600, 8134]) }, "Substance": {"105590001": ("Substance", [7150, 9502, 9580])}, "SubstantiaNigra": { "70007007": ("Substantia nigra", [7151, 7153, 7192, 8134, 9514]) }, "SubstantiaNigraStructure": { "70007007": ("Substantia nigra structure (body structure)", []) }, "Subxiphoid": {"5076001": ("Subxiphoid", [4, 7151, 7192, 8134, 9514])}, "Succinylcholine": {"372724004": ("Succinylcholine", [623, 627])}, "SudanBlackBStain": {"36572009": ("Sudan black B stain", [8112])}, "SudanBlackStain": {"310805002": ("Sudan black stain", [8112])}, "SudanBlueStain": {"10740006": ("Sudan blue stain", [8112])}, "SudanCountryBredHorseBreed": { "133145004": ("Sudan Country-Bred horse breed", [7480]) }, "SudanIIIStain": {"39777001": ("Sudan III stain", [8112])}, "SudanIIStain": {"12030009": ("Sudan II stain", [8112])}, "SudanIVStain": {"69133007": ("Sudan IV stain", [8112])}, "SudanStain": {"314900004": ("Sudan stain", [8112])}, "SudaneseFulaniCattleBreed": { "133786003": ("Sudanese Fulani cattle breed", [7480]) }, "SuddenOnset": {"385315009": ("Acute onset", [6130])}, "Sufentanil": {"49998007": ("Sufentanil", [65, 66])}, "SuffolkCattleBreed": {"133275001": ("Suffolk cattle breed", [7480])}, "SuffolkHorse": {"53567001": ("Suffolk horse (organism)", [])}, "SuffolkHorseBreed": {"53567001": ("Suffolk horse breed", [7480])}, "SuffolkSheep": {"72648002": ("Suffolk sheep (organism)", [])}, "SuffolkSheepBreed": {"72648002": ("Suffolk sheep breed", [7480])}, "SuiaCattleBreed": {"133832001": ("Suia cattle breed (organism)", [])}, "SuiaXZebuCattleBreed": {"133832001": ("Suia X zebu cattle breed", [7480])}, "SuisbuCattleBreed": {"133833006": ("Suisbu cattle breed (organism)", [])}, "SuisbuXZebuCattleBreed": {"133833006": ("Suisbu X zebu cattle breed", [7480])}, "SuksunCattleBreed": {"133512007": ("Suksun cattle breed", [7480])}, "SulawesiHorseBreed": {"133094001": ("Sulawesi horse breed", [7480])}, "SulfonamideAntibiotic": {"372788003": ("Sulfonamide antibiotic", [621, 622])}, "SulfonamideClassOfAntibiotic": { "372788003": ("Sulfonamide -class of antibiotic- (substance)", []) }, "SumadijaPigBreed": {"132262008": ("Sumadija pig breed", [7480])}, "SumbaHorseBreed": {"131944007": ("Sumba horse breed", [7480])}, "SumbawaHorseBreed": {"131945008": ("Sumbawa horse breed", [7480])}, "SunandiniCattleBreed": {"133834000": ("Sunandini cattle breed (organism)", [])}, "SunandiniXZebuCattleBreed": { "133834000": ("Sunandini X zebu cattle breed", [7480]) }, "SunkumaCattleBreed": {"131528009": ("Sunkuma cattle breed", [7480])}, "SunsetYellowFCFStain": {"22968009": ("sunset yellow FCF stain", [8112])}, "Superficial": {"26283006": ("Superficial", [2, 3489])}, "SuperficialAnteriorCervicalLymphNode": { "168557005": ("superficial anterior cervical lymph node", [7600, 8134]) }, "SuperficialCervicalLymphNode": { "279144003": ("superficial cervical lymph node", [7600, 8134]) }, "SuperficialFemoralArtery": { "181349008": ( "Superficial Femoral Artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12109, ], ) }, "SuperficialFemoralVein": { "397364003": ( "Superficial Femoral Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12110], ) }, "SuperficialFemoralVeinStructure": { "397364003": ("Superficial femoral vein structure (body structure)", []) }, "SuperficialInguinalLymphNode": { "113340006": ("superficial inguinal lymph node", [7600, 8134]) }, "SuperficialIntraparotidLymphNode": { "68339009": ("superficial intraparotid lymph node", [7600, 8134]) }, "SuperficialLateralCervicalLymphNode": { "167965000": ("superficial lateral cervical lymph node", [7600, 8134]) }, "SuperficialLymphNode": {"90606007": ("superficial lymph node", [7600, 8134])}, "SuperficialPalmarArch": { "26818002": ( "Superficial Palmar Arch", [3827, 7151, 7192, 8134, 9514, 12103, 12107], ) }, "SuperficialPalmarArchStructure": { "26818002": ("Superficial palmar arch structure (body structure)", []) }, "SuperficialPalmarVenousArch": { "368479001": ( "Superficial Palmar Venous Arch", [3827, 7151, 7192, 8134, 9514, 12103, 12108], ) }, "SuperficialParotidLymphNode": { "279141006": ("superficial parotid lymph node", [7600, 8134]) }, "SuperficialPoplitealLymphNode": { "12728001": ("superficial popliteal lymph node", [7600, 8134]) }, "SuperficialTemporalArtery": { "15672000": ( "Superficial temporal artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "SuperfineMerinoSheepBreed": { "132724006": ("Superfine Merino sheep breed", [7480]) }, "Superior": {"264217000": ("Superior", [2, 5, 211, 212, 3019, 4005, 6065, 12117])}, "SuperiorArticularFacetOfAxis": { "181900008": ("Superior articular facet of axis", [6115, 8134]) }, "SuperiorArticularProcessOfVertebra": { "317665004": ("Superior articular process of vertebra", [6115, 8134]) }, "SuperiorCerebellarPeduncle": { "11089000": ( "Superior cerebellar peduncle", [7151, 7153, 7192, 7701, 7710, 8134, 9514], ) }, "SuperiorFrontoOccipitalFasciculus": { "13958008": ("superior fronto-occipital fasciculus", [7703, 7710, 8134]) }, "SuperiorGlutealLymphNode": { "76290003": ("superior gluteal lymph node", [7600, 8134]) }, "SuperiorLateralInguinalLymphNode": { "76704003": ("superior lateral inguinal lymph node", [7600, 8134]) }, "SuperiorLeftPulmonaryVein": { "43863001": ( "Superior left pulmonary vein", [4, 3010, 3011, 3827, 3840, 4042, 7151, 7192, 8134, 9514], ) }, "SuperiorLongitudinalFasciculus": { "89202009": ("Superior longitudinal fasciculus", [7151, 7153, 7192, 8134, 9514]) }, "SuperiorMedialInguinalLymphNode": { "52554005": ("superior medial inguinal lymph node", [7600, 8134]) }, "SuperiorMediastinalLymphNode": { "127925003": ("superior mediastinal lymph node", [7600, 8134]) }, "SuperiorMesentericArtery": { "42258001": ( "Superior mesenteric artery", [4, 3010, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12112, 12125], ) }, "SuperiorMesentericArteryStructure": { "42258001": ("Superior mesenteric artery structure (body structure)", []) }, "SuperiorMesentericLymphNode": { "49394004": ("superior mesenteric lymph node", [7600, 8134]) }, "SuperiorMesentericVein": { "90771006": ( "Superior Mesenteric Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "SuperiorPancreaticLymphNode": { "280999005": ("superior pancreatic lymph node", [7600, 8134]) }, "SuperiorPancreaticoduodenalLymphNode": { "281320004": ("superior pancreaticoduodenal lymph node", [7600, 8134]) }, "SuperiorPhrenicArtery": { "38991005": ( "Superior phrenic artery", [6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "SuperiorRectalLymphNode": { "68881005": ("superior rectal lymph node", [7600, 8134]) }, "SuperiorRightPulmonaryVein": { "8629005": ( "Superior right pulmonary vein", [4, 3010, 3011, 3827, 3840, 4042, 7151, 7192, 8134, 9514], ) }, "SuperiorRollingOfBreast": { "415670009": ("Superior rolling of breast (procedure)", []) }, "SuperiorThyroidArtery": { "72021004": ( "Superior thyroid artery", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "SuperiorTracheobronchialLymphNode": { "67941004": ("superior tracheobronchial lymph node", [7600, 8134]) }, "SuperiorVenaCava": { "48345005": ( "Superior vena cava", [ 4, 3010, 3607, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12108, 12282, ], ) }, "SuperiorVenaCavaStructure": { "48345005": ("Superior vena cava structure (body structure)", []) }, "SupernumeraryDeciduousMandibularLeftCanineTooth": { "2211000124103": ( "Supernumerary deciduous mandibular left canine tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularLeftCanineTooth_Inactive": { "707029006": ( "Supernumerary deciduous mandibular left canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularLeftCentralIncisorTooth": { "2261000124100": ( "Supernumerary deciduous mandibular left central incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularLeftCentralIncisorTooth_Inactive": { "707026004": ( "Supernumerary deciduous mandibular left central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularLeftFirstMolarTooth": { "2181000124102": ( "Supernumerary deciduous mandibular left first molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularLeftFirstMolarTooth_Inactive": { "707030001": ( "Supernumerary deciduous mandibular left first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularLeftLateralIncisorTooth": { "2171000124100": ( "Supernumerary deciduous mandibular left lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularLeftLateralIncisorTooth_Inactive": { "707028003": ( "Supernumerary deciduous mandibular left lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularLeftSecondMolarTooth": { "2241000124104": ( "Supernumerary deciduous mandibular left second molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularLeftSecondMolarTooth_Inactive": { "707031002": ( "Supernumerary deciduous mandibular left second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularRightCanineTooth": { "2221000124106": ( "Supernumerary deciduous mandibular right canine tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularRightCanineTooth_Inactive": { "707023007": ( "Supernumerary deciduous mandibular right canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularRightCentralIncisorTooth": { "2191000124104": ( "Supernumerary deciduous mandibular right central incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularRightCentralIncisorTooth_Inactive": { "707025000": ( "Supernumerary deciduous mandibular right central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularRightFirstMolarTooth": { "2231000124109": ( "Supernumerary deciduous mandibular right first molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularRightFirstMolarTooth_Inactive": { "707022002": ( "Supernumerary deciduous mandibular right first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularRightLateralIncisorTooth": { "2201000124101": ( "Supernumerary deciduous mandibular right lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularRightLateralIncisorTooth_Inactive": { "707024001": ( "Supernumerary deciduous mandibular right lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMandibularRightSecondMolarTooth": { "2251000124102": ( "Supernumerary deciduous mandibular right second molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMandibularRightSecondMolarTooth_Inactive": { "707021009": ( "Supernumerary deciduous mandibular right second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryLeftCanineTooth": { "2361000124105": ( "Supernumerary deciduous maxillary left canine tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryLeftCanineTooth_Inactive": { "707016006": ( "Supernumerary deciduous maxillary left canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth": { "2351000124108": ( "Supernumerary deciduous maxillary left central incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth_Inactive": { "707014009": ( "Supernumerary deciduous maxillary left central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth": { "2331000124101": ( "Supernumerary deciduous maxillary left first molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth_Inactive": { "707017002": ( "Supernumerary deciduous maxillary left first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth": { "2271000124107": ( "Supernumerary deciduous maxillary left lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth_Inactive": { "707015005": ( "Supernumerary deciduous maxillary left lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth": { "2311000124107": ( "Supernumerary deciduous maxillary left second molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth_Inactive": { "707018007": ( "Supernumerary deciduous maxillary left second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryRightCanineTooth": { "2291000124108": ( "Supernumerary deciduous maxillary right canine tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryRightCanineTooth_Inactive": { "707011001": ( "Supernumerary deciduous maxillary right canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth": { "2301000124109": ( "Supernumerary deciduous maxillary right central incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth_Inactive": { "707013003": ( "Supernumerary deciduous maxillary right central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryRightFirstMolarTooth": { "2321000124104": ( "Supernumerary deciduous maxillary right first molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryRightFirstMolarTooth_Inactive": { "707010000": ( "Supernumerary deciduous maxillary right first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth": { "2281000124105": ( "Supernumerary deciduous maxillary right lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth_Inactive": { "707012008": ( "Supernumerary deciduous maxillary right lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryDeciduousMaxillaryRightSecondMolarTooth": { "2341000124106": ( "Supernumerary deciduous maxillary right second molar tooth", [4025, 4026], ) }, "SupernumeraryDeciduousMaxillaryRightSecondMolarTooth_Inactive": { "707009005": ( "Supernumerary deciduous maxillary right second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftCanineTooth": { "2441000124103": ( "Supernumerary permanent mandibular left canine tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftCanineTooth_Inactive": { "707058009": ( "Supernumerary permanent mandibular left canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftCentralIncisorTooth": { "2481000124109": ( "Supernumerary permanent mandibular left central incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftCentralIncisorTooth_Inactive": { "707060006": ( "Supernumerary permanent mandibular left central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftFirstMolarTooth": { "2431000124108": ( "Supernumerary permanent mandibular left first molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftFirstMolarTooth_Inactive": { "707055007": ( "Supernumerary permanent mandibular left first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftFirstPremolarTooth": { "2451000124101": ( "Supernumerary permanent mandibular left first premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftFirstPremolarTooth_Inactive": { "707057004": ( "Supernumerary permanent mandibular left first premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftLateralIncisorTooth": { "2381000124100": ( "Supernumerary permanent mandibular left lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftLateralIncisorTooth_Inactive": { "707059001": ( "Supernumerary permanent mandibular left lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftSecondMolarTooth": { "2371000124103": ( "Supernumerary permanent mandibular left second molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftSecondMolarTooth_Inactive": { "707054006": ( "Supernumerary permanent mandibular left second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftSecondPremolarTooth": { "2471000124106": ( "Supernumerary permanent mandibular left second premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftSecondPremolarTooth_Inactive": { "707056008": ( "Supernumerary permanent mandibular left second premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularLeftThirdMolarTooth": { "2391000124102": ( "Supernumerary permanent mandibular left third molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularLeftThirdMolarTooth_Inactive": { "707052005": ( "Supernumerary permanent mandibular left third molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightCanineTooth": { "2501000124104": ( "Supernumerary permanent mandibular right canine tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightCanineTooth_Inactive": { "707063008": ( "Supernumerary permanent mandibular right canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightCentralIncisorTooth": { "2511000124101": ( "Supernumerary permanent mandibular right central incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightCentralIncisorTooth_Inactive": { "707061005": ( "Supernumerary permanent mandibular right central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightFirstMolarTooth": { "2491000124107": ( "Supernumerary permanent mandibular right first molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightFirstMolarTooth_Inactive": { "707066000": ( "Supernumerary permanent mandibular right first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightFirstPremolarTooth": { "2461000124104": ( "Supernumerary permanent mandibular right first premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightFirstPremolarTooth_Inactive": { "707064002": ( "Supernumerary permanent mandibular right first premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightLateralIncisorTooth": { "2521000124109": ( "Supernumerary permanent mandibular right lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightLateralIncisorTooth_Inactive": { "707062003": ( "Supernumerary permanent mandibular right lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightSecondMolarTooth": { "2401000124100": ( "Supernumerary permanent mandibular right second molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightSecondMolarTooth_Inactive": { "707067009": ( "Supernumerary permanent mandibular right second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightSecondPremolarTooth": { "2421000124105": ( "Supernumerary permanent mandibular right second premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightSecondPremolarTooth_Inactive": { "707065001": ( "Supernumerary permanent mandibular right second premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMandibularRightThirdMolarTooth": { "2411000124102": ( "Supernumerary permanent mandibular right third molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMandibularRightThirdMolarTooth_Inactive": { "707068004": ( "Supernumerary permanent mandibular right third molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftCanineTooth": { "2611000124100": ( "Supernumerary permanent maxillary left canine tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftCanineTooth_Inactive": { "707044007": ( "Supernumerary permanent maxillary left canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth": { "2541000124102": ( "Supernumerary permanent maxillary left central incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth_Inactive": { "707042006": ( "Supernumerary permanent maxillary left central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftFirstMolarTooth": { "2661000124102": ( "Supernumerary permanent maxillary left first molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftFirstMolarTooth_Inactive": { "707047000": ( "Supernumerary permanent maxillary left first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth": { "2641000124101": ( "Supernumerary permanent maxillary left first premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth_Inactive": { "707045008": ( "Supernumerary permanent maxillary left first premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth": { "2651000124104": ( "Supernumerary permanent maxillary left lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth_Inactive": { "707043001": ( "Supernumerary permanent maxillary left lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftSecondMolarTooth": { "2621000124108": ( "Supernumerary permanent maxillary left second molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftSecondMolarTooth_Inactive": { "707048005": ( "Supernumerary permanent maxillary left second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth": { "2681000124107": ( "Supernumerary permanent maxillary left second premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth_Inactive": { "707046009": ( "Supernumerary permanent maxillary left second premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryLeftThirdMolarTooth": { "2581000124108": ( "Supernumerary permanent maxillary left third molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryLeftThirdMolarTooth_Inactive": { "707049002": ( "Supernumerary permanent maxillary left third molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightCanineTooth": { "2601000124103": ( "Supernumerary permanent maxillary right canine tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightCanineTooth_Inactive": { "707038008": ( "Supernumerary permanent maxillary right canine tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightCentralIncisorTooth": { "2551000124100": ( "Supernumerary permanent maxillary right central incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightCentralIncisorTooth_Inactive": { "707041004": ( "Supernumerary permanent maxillary right central incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightFirstMolarTooth": { "2591000124106": ( "Supernumerary permanent maxillary right first molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightFirstMolarTooth_Inactive": { "707035006": ( "Supernumerary permanent maxillary right first molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightFirstPremolarTooth": { "2671000124109": ( "Supernumerary permanent maxillary right first premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightFirstPremolarTooth_Inactive": { "707037003": ( "Supernumerary permanent maxillary right first premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightLateralIncisorTooth": { "2571000124105": ( "Supernumerary permanent maxillary right lateral incisor tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightLateralIncisorTooth_Inactive": { "707039000": ( "Supernumerary permanent maxillary right lateral incisor tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightSecondMolarTooth": { "2631000124106": ( "Supernumerary permanent maxillary right second molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightSecondMolarTooth_Inactive": { "707033004": ( "Supernumerary permanent maxillary right second molar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightSecondPremolarTooth": { "2561000124103": ( "Supernumerary permanent maxillary right second premolar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightSecondPremolarTooth_Inactive": { "707036007": ( "Supernumerary permanent maxillary right second premolar tooth (morphologic abnormality)", [], ) }, "SupernumeraryPermanentMaxillaryRightThirdMolarTooth": { "2531000124107": ( "Supernumerary permanent maxillary right third molar tooth", [4025, 4026], ) }, "SupernumeraryPermanentMaxillaryRightThirdMolarTooth_Inactive": { "707032009": ( "Supernumerary permanent maxillary right third molar tooth (morphologic abnormality)", [], ) }, "SuperolateralToInferomedialOblique": { "399188001": ("superolateral to inferomedial oblique", [4014]) }, "SuperolateralToInferomedialObliqueProjection": { "399188001": ( "Superolateral to inferomedial oblique projection (qualifier value)", [], ) }, "Supination": {"14502000": ("Supination", [92])}, "SupinationFunction": { "14502000": ("Supination, function (observable entity)", []) }, "Supine": {"40199007": ("supine", [20, 6206])}, "SupineBodyPosition": {"40199007": ("Supine body position", [3262, 3602])}, "SupportiveIntent": {"399707004": ("Supportive intent", [3629])}, "SupportiveProcedureIntent": { "399707004": ("Supportive - procedure intent (qualifier value)", []) }, "SupraRenalAorta": { "1918003": ( "Supra-renal Aorta", [3827, 7151, 7192, 8134, 9514, 12103, 12112, 12125, 12291], ) }, "SupraaorticValveAreaStructure": { "8128003": ("Supraaortic valve area structure (body structure)", []) }, "SupraclavicularLymphNode": { "76838003": ("supraclavicular lymph node", [7600, 8134]) }, "SupraclavicularRegionOfNeck": { "77621008": ("Supraclavicular region of neck", [4, 7151, 7192, 8134, 9514]) }, "Supraglottis": {"119255006": ("supraglottis", [7601, 8134])}, "SupraglottisStructure": { "119255006": ("Supraglottis structure (body structure)", []) }, "SuprapulmonicValveArea": { "79142001": ("Suprapulmonic valve area", [3829, 7151, 7192, 9514]) }, "SuprapulmonicValveAreaStructure": { "79142001": ("Suprapulmonic valve area structure (body structure)", []) }, "SuprapyloricLymphNode": {"280216006": ("suprapyloric lymph node", [7600, 8134])}, "SupraspinatusMuscle": { "6423006": ("Supraspinatus muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "SupraspinatusMuscleStructure": { "6423006": ("Supraspinatus muscle structure (body structure)", []) }, "SuprasternalCoronalView": { "443162009": ("Suprasternal coronal view", [501, 12226]) }, "SuprasternalLongAxis": {"399106004": ("Suprasternal long axis", [501, 12226])}, "SuprasternalLongAxisView": { "399106004": ("Suprasternal long axis view (qualifier value)", []) }, "SuprasternalLongAxisViewOfAorticArch": { "443562002": ("Suprasternal long axis view of aortic arch", [501, 12226]) }, "SuprasternalNotch": { "26493002": ( "Suprasternal notch", [4, 1000, 1001, 1004, 6115, 7151, 7192, 8134, 9514], ) }, "SuprasternalSagittalView": { "443163004": ("Suprasternal sagittal view", [501, 12226]) }, "SuprasternalShortAxis": {"399145009": ("Suprasternal short axis", [501, 12226])}, "SuprasternalShortAxisView": { "399145009": ("Suprasternal short axis view (qualifier value)", []) }, "SupraventricularTachycardia": { "6456007": ("Supraventricular tachycardia", [3201, 3230, 12246]) }, "Surface": {"410679008": ("Surface", [2, 5])}, "SurfaceBolus": {"228736002": ("Surface Bolus", [9516, 9520])}, "SurfaceRecuttingOfTissueBlock": { "434474007": ("Surface recutting of tissue block (procedure)", []) }, "Surgeon": {"304292004": ("Surgeon", [7450, 7452])}, "Surgery": {"309967005": ("Surgery", [7030])}, "Surgical": {"83578000": ("surgical", [3815])}, "SurgicalBiopsyOfBreast": { "274331003": ("Surgical biopsy of breast (procedure)", []) }, "SurgicalDepartment": {"309967005": ("Surgical department (environment)", [])}, "SurgicalIntensiveCare": {"418433008": ("Surgical Intensive Care", [7030])}, "SurgicalIntensiveCareUnit": { "418433008": ("Surgical intensive care unit (environment)", []) }, "SurgicalMarginObservable": { "396631001": ("Surgical margin observable (observable entity)", []) }, "SurgicalMetalNailDevice": { "63289001": ("Surgical metal nail, device (physical object)", []) }, "SurgicalProcedure": {"387713003": ("Surgical procedure", [6319])}, "SurgicalScar": {"63130001": ("Surgical scar", [6056])}, "SurgicalSutureDevice": { "27065002": ("Surgical suture, device (physical object)", []) }, "SurgicalTransplantDepartment": { "309993003": ("Surgical transplant department (environment)", []) }, "SurgicallyConstructedBidirectionalPathwayFromSuperiorVenaCavaToPulmonaryArtery": { "443789005": ( "Surgically constructed bidirectional pathway from superior vena cava to pulmonary artery " "(morphologic abnormality)", [], ) }, "SurgicallyConstructedConnectionOfAortaToPulmonaryArtery": { "443096004": ( "Surgically constructed connection of aorta to pulmonary artery (morphologic abnormality)", [], ) }, "SurgicallyConstructedConnectionOfLeftVentricleToPulmonaryArteryConduit": { "443696003": ( "Surgically constructed connection of left ventricle to pulmonary artery conduit (morphologic abnormality)", [], ) }, "SurgicallyConstructedConnectionOfPulmonaryVeinToLeftAtrium": { "443297004": ( "Surgically constructed connection of pulmonary vein to left atrium (morphologic abnormality)", [], ) }, "SurgicallyConstructedConnectionOfRightVentricleToPulmonaryArteryConduit": { "443328003": ( "Surgically constructed connection of right ventricle to pulmonary artery conduit (morphologic abnormality)", [], ) }, "SurgicallyConstructedConnectionOfSystemicVenousReturnToPulmonaryArtery": { "443625008": ( "Surgically constructed connection of systemic venous return to pulmonary artery (morphologic abnormality)", [], ) }, "SurgicallyConstructedConvergenceOfInferiorAndSuperiorVenaCavaPathwaysIntoCommonPathwaySuperiorToAtrioventricularValve": { "443809000": ( "Surgically constructed convergence of inferior and superior " "vena cava pathways into common pathway superior to " "atrioventricular valve (morphologic abnormality)", [], ) }, "SurgicallyConstructedOrificeBetweenSystemicVenousPathwayAndLeftAtrium": { "443724003": ( "Surgically constructed orifice between systemic venous pathway and left atrium (morphologic abnormality)", [], ) }, "SurgicallyConstructedOutflowTractOfLeftVentricleAcrossVentricularSeptalDefectToAorta": { "443260009": ( "Surgically constructed outflow tract of left ventricle across ventricular septal defect to " "aorta (morphologic abnormality)", [], ) }, "SurgicallyConstructedPathwayFromInferiorVenaCavaToMitralValve": { "444329004": ( "Surgically constructed pathway from inferior vena cava to mitral valve (morphologic abnormality)", [], ) }, "SurgicallyConstructedPathwayFromInferiorVenaCavaToPulmonaryArtery": { "443326004": ( "Surgically constructed pathway from inferior vena cava to pulmonary artery (morphologic abnormality)", [], ) }, "SurgicallyConstructedPathwayFromPulmonaryVeinsToTricuspidValve": { "443907004": ( "Surgically constructed pathway from pulmonary veins to tricuspid valve (morphologic abnormality)", [], ) }, "SurgicallyConstructedPathwayFromSuperiorVenaCavaToMitralValve": { "444177009": ( "Surgically constructed pathway from superior vena cava to mitral valve (morphologic abnormality)", [], ) }, "SurgicallyConstructedPathwayFromSuperiorVenaCavaToPulmonaryArtery": { "443327008": ( "Surgically constructed pathway from superior vena cava to pulmonary artery (morphologic abnormality)", [], ) }, "SurgicallyConstructedPathwayThroughHeartFromInferiorVenaCavaAndSuperiorVenaCavaToPulmonaryArtery": { "443298009": ( "Surgically constructed pathway through heart from inferior vena cava and superior " "vena cava to pulmonary artery (morphologic abnormality)", [], ) }, "Sus": {"388393002": ("Sus", [7454])}, "SusScrofa": {"78678003": ("Sus scrofa", [7454])}, "SusScrofaDomesticPigXJapaneseWildBoarIntragenusHybrid": { "133182008": ( "Sus scrofa domestic pig X Japanese wild boar intragenus hybrid (organism)", [], ) }, "Suspected": {"415684004": ("Suspected", [3770])}, "Suspended": {"385655000": ("Suspended", [3773])}, "SussexCattleBreed": {"133276000": ("Sussex cattle breed", [7480])}, "SussexSpaniel": {"80576000": ("Sussex spaniel (organism)", [])}, "SussexSpanielDogBreed": {"80576000": ("Sussex spaniel dog breed", [7480])}, "Suture": { "27065002": ("Suture", [6040, 6102, 6138, 6202, 6203, 6401, 6404, 7151, 7193]) }, "SwabianHallPigBreed": {"132354003": ("Swabian-Hall pig breed", [7480])}, "SwaledaleSheepBreed": {"131822003": ("Swaledale sheep breed", [7480])}, "SwallowBeliedMangalitzaPigBreed": { "132232002": ("Swallow Belied Mangalitza pig breed", [7480]) }, "SwannGanzCatheter": {"397755005": ("Swann-Ganz catheter", [3429])}, "Swanson": {"399313005": ("Swanson", [4012])}, "SwansonProjection": {"399313005": ("Swanson projection (qualifier value)", [])}, "Sweating": {"415690000": ("Sweating", [60, 9300])}, "SwedishArdennesHorseBreed": { "131946009": ("Swedish Ardennes horse breed", [7480]) }, "SwedishFurSheepBreed": {"132799009": ("Swedish Fur Sheep breed", [7480])}, "SwedishLandraceGoatBreed": {"131641002": ("Swedish Landrace goat breed", [7480])}, "SwedishLandracePig": {"12407009": ("Swedish landrace pig (organism)", [])}, "SwedishLandracePigBreed": {"12407009": ("Swedish landrace pig breed", [7480])}, "SwedishLapphundDogBreed": {"132632005": ("Swedish Lapphund dog breed", [7480])}, "SwedishRedPolledCattleBreed": { "133277009": ("Swedish Red Polled cattle breed", [7480]) }, "SwedishVallhundDogBreed": {"132635007": ("Swedish Vallhund dog breed", [7480])}, "SwedishWarmbloodHorseBreed": { "133144000": ("Swedish Warmblood horse breed", [7480]) }, "Swelling": {"65124004": ("Swelling", [6062])}, "SwissAlpineGoat": {"28360002": ("Swiss alpine goat (organism)", [])}, "SwissAlpineGoatBreed": {"28360002": ("Swiss alpine goat breed", [7480])}, "SwissBlackPiedCattleBreed": { "133513002": ("Swiss Black Pied cattle breed", [7480]) }, "SwissEdelschweinPigBreed": {"132101005": ("Swiss Edelschwein pig breed", [7480])}, "SwissImprovedLandracePigBreed": { "132351006": ("Swiss Improved Landrace pig breed", [7480]) }, "SwissMountainDogBreed": {"132642007": ("Swiss Mountain Dog breed", [7480])}, "SwissWarmbloodHorseBreed": {"132763004": ("Swiss Warmblood horse breed", [7480])}, "SychevkaCattleBreed": {"133514008": ("Sychevka cattle breed", [7480])}, "SykiaCattleBreed": {"133515009": ("Sykia cattle breed", [7480])}, "SympatheticTrunk": { "44909008": ("Sympathetic trunk", [7151, 7167, 7192, 8134, 9514]) }, "SympatheticTrunkStructure": { "44909008": ("Sympathetic trunk structure (body structure)", []) }, "SympathomimeticAgent": {"86308005": ("Sympathomimetic agent (product)", [])}, "SymphysisPubis": {"82561000": ("Symphysis pubis", [1000, 1001, 1005, 8134])}, "SymphysisPubisStructure": { "82561000": ("Symphysis pubis structure (body structure)", []) }, "SymptomFree": {"162467007": ("Symptom free", [3772])}, "SymptomHasChanged": {"162499001": ("Symptom has changed", [4406])}, "Syncope": {"271594007": ("Syncope", [3201, 3220, 3221, 12246])}, "SyntheticSL98PigBreed": {"133220008": ("Synthetic SL98 pig breed", [7480])}, "Syringe": {"61968008": ("Syringe", [69, 4051])}, "SyringeDevice": {"61968008": ("Syringe, device (physical object)", [])}, "SyringeUnit": {"733020007": ("Syringe", [68])}, "Systemic": {"31099001": ("Systemic", [6128])}, "SystemicArterialBlood": {"371952000": ("Systemic arterial blood (substance)", [])}, "SystemicArterialHypertension": { "38341003": ("Systemic arterial hypertension", [3640]) }, "SystemicArterialStructure": { "281159003": ("Systemic arterial structure (body structure)", []) }, "SystemicArtery": { "281159003": ("Systemic artery", [7151, 7156, 7192, 8134, 9514]) }, "SystemicArteryBlood": {"371952000": ("Systemic Artery Blood", [3520])}, "SystemicCollateralArteryToLung": { "128589000": ( "Systemic collateral artery to lung", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "SystemicVascularResistance": { "386530009": ("Systemic Vascular Resistance", [3619]) }, "SystemicVascularStructure": {"281157001": ("Systemic vascular structure", [6100])}, "SystemicVein": {"360592004": ("Systemic vein", [7151, 7156, 7192, 8134, 9514])}, "SystemicVenousAtrium": { "128568009": ( "Systemic venous atrium", [4, 3010, 3608, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "SystemicVenousStructure": { "360592004": ("Systemic venous structure (body structure)", []) }, "Systole": {"111973004": ("Systole", [12233, 12307])}, "SystoleFunction": {"111973004": ("Systole, function (observable entity)", [])}, "Systolic": {"111973004": ("Systolic", [3472])}, "SystolicBloodPressure": { "271649006": ("Systolic blood pressure (observable entity)", []) }, "T10T11Disc": {"34959001": ("T10/T11 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T10Vertebra": {"7610001": ("T10 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T11T12Disc": {"1537001": ("T11/T12 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T11Vertebra": {"12989004": ("T11 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T12L1Disc": {"76206002": ("T12/L1 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T12Vertebra": {"23215003": ("T12 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T1T2Disc": {"40908007": ("T1/T2 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T1Vertebra": {"64864005": ("T1 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T2T3Disc": {"6004007": ("T2/T3 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T2Vertebra": {"53733008": ("T2 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T3T4Disc": {"2620004": ("T3/T4 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T3Vertebra": {"1626008": ("T3 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T4T5Disc": {"82965004": ("T4/T5 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T4Vertebra": {"73071006": ("T4 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T5T6Disc": {"72692000": ("T5/T6 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T5Vertebra": {"56401006": ("T5 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T6T7Disc": {"74401007": ("T6/T7 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T6Vertebra": {"45296009": ("T6 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T7T8Disc": {"28693002": ("T7/T8 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T7Vertebra": {"62487009": ("T7 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T8T9Disc": {"9188009": ("T8/T9 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T8Vertebra": {"11068009": ("T8 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "T9T10Disc": {"113209001": ("T9/T10 disc", [7151, 7192, 7602, 7604, 8134, 9514])}, "T9Vertebra": {"82687006": ("T9 vertebra", [7151, 7192, 7602, 7603, 8134, 9514])}, "TSSH1CattleBreed": {"133839005": ("TSSH-1 cattle breed (organism)", [])}, "TSSH1XZebuCattleBreed": {"133839005": ("TSSH-1 X zebu cattle breed", [7480])}, "TWaveAlternans": {"428550008": ("T wave alternans (observable entity)", [])}, "TabapuaCattleBreed": {"133787007": ("Tabapua cattle breed", [7480])}, "Table": {"86407004": ("Table", [7151, 7157, 7158, 7193, 9505, 9515, 9520, 9573])}, "TableDevice": {"86407004": ("Table, device (physical object)", [])}, "TachycardiaBradycardia": {"74615001": ("Tachycardia-bradycardia", [60, 9300])}, "TadzhikZebuCattleBreed": {"133700006": ("Tadzhik zebu cattle breed", [7480])}, "TagilCattleBreed": {"133526003": ("Tagil cattle breed", [7480])}, "TahltanBearDog": {"61320006": ("Tahltan bear dog", [7480])}, "TaihuPigBreed": {"132316003": ("Taihu pig breed", [7480])}, "TainoCattleBreed": {"133835004": ("Taino cattle breed (organism)", [])}, "TainoXZebuCattleBreed": {"133835004": ("Taino X zebu cattle breed", [7480])}, "TaishuhHorseBreed": {"133143006": ("Taishuh horse breed", [7480])}, "TaiwanSmallBlackPigBreed": {"132146006": ("Taiwan Small Black pig breed", [7480])}, "TaiwanSmallRedPigBreed": {"132147002": ("Taiwan Small Red pig breed", [7480])}, "TaiwanYellowCattleBreed": {"131553007": ("Taiwan Yellow cattle breed", [7480])}, "TaiwanZebuCattleBreed": {"131529001": ("Taiwan Zebu cattle breed", [7480])}, "TajmaCattleBreed": {"133527007": ("Tajma cattle breed", [7480])}, "TakingOfSwab": {"285570007": ("Taking of swab", [8109])}, "TakingPatientVitalSigns": { "61746007": ("Taking patient vital signs (procedure)", []) }, "Talus": {"67453005": ("Talus", [1000, 1001, 1006, 7304, 8134])}, "TamankaduwaCattleBreed": {"133788002": ("Tamankaduwa cattle breed", [7480])}, "TambovRedCattleBreed": {"133528002": ("Tambov Red cattle breed", [7480])}, "Tamoxifen": {"75959001": ("Tamoxifen", [6080])}, "TamworthPig": {"30634003": ("Tamworth pig (organism)", [])}, "TamworthPigBreed": {"30634003": ("Tamworth pig breed", [7480])}, "Tangential": {"399110001": ("tangential", [501, 4010, 4015])}, "TangentialProjection": { "399110001": ("Tangential projection (qualifier value)", []) }, "Tantalum": {"45215009": ("Tantalum", [300, 10006, 10067])}, "TanzanianZebuCattleBreed": {"133789005": ("Tanzanian Zebu cattle breed", [7480])}, "TaoyuanPigBreed": {"132145005": ("Taoyuan pig breed", [7480])}, "TapWater": {"444923006": ("Tap water", [610])}, "TapetumOfCorpusCallosum": { "60105000": ("tapetum of corpus callosum", [7705, 7710, 8134]) }, "TaraiCattleBreed": {"133790001": ("Tarai cattle breed", [7480])}, "TarentaiseCattleBreed": {"50959000": ("Tarentaise cattle breed (organism)", [])}, "TarentaiseCowBreed": {"50959000": ("Tarentaise cow breed", [7480])}, "TargetHeartRate": {"428420003": ("Target heart rate (observable entity)", [])}, "TargetHeartRateAchieved": {"258153002": ("Target Heart Rate Achieved", [3221])}, "TargheeSheep": {"89665001": ("Targhee sheep (organism)", [])}, "TargheeSheepBreed": {"89665001": ("Targhee sheep breed", [7480])}, "TarinaCattleBreed": {"133529005": ("Tarina cattle breed", [7480])}, "Tarrant": {"399247005": ("Tarrant", [4012])}, "TarrantProjection": {"399247005": ("Tarrant projection (qualifier value)", [])}, "TarsalJoint": { "27949001": ( "Tarsal joint", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "Tarsus": {"108371006": ("Tarsus", [7482, 7483, 8134])}, "TartrazineStain": {"21592006": ("tartrazine stain", [8112])}, "TasteSenseAltered": {"271801002": ("Taste sense altered", [60, 9300])}, "Taurine": {"10944007": ("Taurine (substance)", [])}, "TauroselcholicAcid75se": { "395894004": ("Tauroselcholic acid[75Se] (substance)", []) }, "TavdaHorseBreed": {"132764005": ("Tavda horse breed", [7480])}, "TawleedHorseBreed": {"133001001": ("Tawleed horse breed", [7480])}, "Taylor": {"399296000": ("Taylor", [4012])}, "TaylorProjection": {"399296000": ("Taylor projection (qualifier value)", [])}, "Tc99mSestamibi": {"424299003": ("Tc-99m sestamibi", [3111])}, "Tc99mTetrofosmin": {"424118002": ("Tc-99m tetrofosmin", [3111])}, "Technetium99mGalactosylHumanSerumAlbuminDiethylenetriamine": { "446534003": ( "Technetium^99m Galactosyl Human Serum Albumin Diethylenetriamine", [25], ) }, "Technetium99mLabeledCarbon": { "447125008": ("Technetium^99m labeled carbon", [25]) }, "Technetium99mMercaptoacetylTriglycineMAG3": { "446536001": ("Technetium^99m Mercaptoacetyl triglycine MAG3", [25]) }, "Technetium99mNPyridoxyl5Methyltryptophan": { "447126009": ("Technetium^99m N-pyridoxyl-5-methyltryptophan", [25]) }, "Technetium99mPhytate": {"447127000": ("Technetium^99m Phytate", [25])}, "Technetium99mStannousColloid": { "447128005": ("Technetium^99m Stannous Colloid", [25]) }, "Technetium99mtcEthylCysteinateDimerInjection": { "404713008": ( "Technetium[99mTc] ethyl cysteinate dimer injection (product)", [], ) }, "TechnetiumTc99NSubstitutedIminodiacetate": { "87410002": ("Technetium Tc^99^ N-substituted iminodiacetate (substance)", []) }, "TechnetiumTc99TaggedRedCells": { "89818005": ("Technetium Tc^99^ tagged red cells (substance)", []) }, "TechnetiumTc99cAlbuminMicrospheres": { "55494003": ("Technetium Tc^99c^ albumin microspheres", [25]) }, "TechnetiumTc99mAggregatedAlbumin": { "85693008": ("Technetium Tc^99m^ aggregated albumin", [25]) }, "TechnetiumTc99mAlbuminMicrospheres": { "55494003": ("Technetium Tc^99m^ albumin microspheres (substance)", []) }, "TechnetiumTc99mBicisate": {"766886003": ("Technetium Tc^99m^ bicisate", [25])}, "TechnetiumTc99mDepreotide": {"415704007": ("Technetium Tc^99m^ depreotide", [25])}, "TechnetiumTc99mDisofenin": {"3040004": ("Technetium Tc^99m^ disofenin", [25])}, "TechnetiumTc99mExametazime": { "77313009": ("Technetium Tc^99m^ exametazime", [25]) }, "TechnetiumTc99mGalactosylHumanSerumAlbuminDiethylenetriaminePentaaceticAcid": { "446534003": ( "Technetium Tc^99m^ galactosyl human serum albumin diethylenetriamine pentaacetic acid (substance)", [], ) }, "TechnetiumTc99mIronAscorbate": { "87853006": ("Technetium Tc^99m^ iron ascorbate", [25]) }, "TechnetiumTc99mLabeledCarbon": { "447125008": ("Technetium Tc^99m^ labeled carbon (substance)", []) }, "TechnetiumTc99mLidofenin": {"7281000": ("Technetium Tc^99m^ lidofenin", [25])}, "TechnetiumTc99mMebrofenin": {"4832001": ("Technetium Tc^99m^ mebrofenin", [25])}, "TechnetiumTc99mMedronate": {"96390006": ("Technetium Tc^99m^ medronate", [25])}, "TechnetiumTc99mMercaptoacetyltriglycine": { "446536001": ("Technetium Tc^99m^ mercaptoacetyltriglycine (substance)", []) }, "TechnetiumTc99mMicroaggregatedAlbumin": { "81761004": ("Technetium Tc^99m^ microaggregated albumin", [25]) }, "TechnetiumTc99mNPyridoxyl5Methyltryptophan": { "447126009": ( "Technetium Tc^99m^ N-pyridoxyl-5-methyltryptophan (substance)", [], ) }, "TechnetiumTc99mNSubstitutedIminodiacetate": { "87410002": ("Technetium Tc^99m^ N-substituted iminodiacetate", [25]) }, "TechnetiumTc99mOxidronate": {"53951001": ("Technetium Tc^99m^ oxidronate", [25])}, "TechnetiumTc99mPentetate": {"430276001": ("Technetium Tc^99m^ pentetate", [25])}, "TechnetiumTc99mPhytate": { "447127000": ("Technetium Tc^99m^ phytate (substance)", []) }, "TechnetiumTc99mPyrophosphate": { "764821009": ("Technetium Tc^99m^ pyrophosphate", [25]) }, "TechnetiumTc99mSerumAlbumin": { "79610008": ("Technetium Tc^99m^ serum albumin", [25]) }, "TechnetiumTc99mSestamibi": {"424299003": ("Technetium Tc^99m^ sestamibi", [25])}, "TechnetiumTc99mSodiumGlucoheptonate": { "45849009": ("Technetium Tc^99m^ sodium glucoheptonate", [25]) }, "TechnetiumTc99mStannousColloid": { "447128005": ("Technetium Tc^99m^ stannous colloid (substance)", []) }, "TechnetiumTc99mStannousEtidronate": { "111162007": ("Technetium Tc^99m^ stannous etidronate", [25]) }, "TechnetiumTc99mSuccimer": {"24511001": ("Technetium Tc^99m^ succimer", [25])}, "TechnetiumTc99mSulfurColloid": { "5931004": ("Technetium Tc^99m^ sulfur colloid", [25]) }, "TechnetiumTc99mTaggedRedCells": { "89818005": ("Technetium Tc^99m^ tagged red cells", [25]) }, "TechnetiumTc99mTeboroxime": {"424318009": ("Technetium Tc^99m^Teboroxime", [25])}, "TechnetiumTc99mTetrofosmin": { "424118002": ("Technetium Tc^99m^Tetrofosmin", [25]) }, "TeddyRooseveltTerrierDogBreed": { "132454002": ("Teddy Roosevelt Terrier dog breed", [7480]) }, "TeeswaterSheepBreed": {"132800008": ("Teeswater sheep breed", [7480])}, "TeethGumsAndSupportingStructures": { "28035005": ("Teeth, gums and supporting structures", [4016]) }, "TelangiectasiaCutaneousCancerSyndromeFamilial": { "782823001": ("Telangiectasia, cutaneous, cancer syndrome, familial", [4405]) }, "TelemarkCattleBreed": {"133278004": ("Telemark cattle breed", [7480])}, "Telencephalon": {"11628009": ("Telencephalon", [7151, 7153, 7192, 8134, 9514])}, "TelomainDogBreed": {"132634006": ("Telomain dog breed", [7480])}, "TelomianDogBreed": {"132634006": ("Telomian dog breed (organism)", [])}, "TemperatureWaveform": {"128437008": ("Temperature waveform", [3003])}, "TemperatureWaveformFunction": { "128437008": ("Temperature waveform, function (observable entity)", []) }, "TemporalBone": { "60911003": ("Temporal Bone", [1000, 1001, 1002, 4028, 7151, 7192, 8134, 9514]) }, "TemporalBoneStructure": { "60911003": ("Temporal bone structure (body structure)", []) }, "TemporalCorrelation": {"133886009": ("Temporal correlation", [6043, 6137])}, "TemporalLobe": {"78277001": ("Temporal lobe", [7151, 7153, 7192, 8134, 9514])}, "TemporalLobeStructure": { "78277001": ("Temporal lobe structure (body structure)", []) }, "TemporalPeriodsRelatingToFeedingAndEating": { "309602000": ( "Temporal periods relating to feeding and eating (qualifier value)", [], ) }, "TemporalPeriodsRelatingToProcedure": { "307152002": ("Temporal periods relating to procedure (qualifier value)", []) }, "TemporaryTranscutaneousPacing": { "59218006": ("temporary transcutaneous pacing", [3555]) }, "TemporomandibularJoint": { "53620006": ( "Temporomandibular joint", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "TemporomandibularJointStructure": { "53620006": ("Temporomandibular joint structure (body structure)", []) }, "Tendon": {"13024002": ("Tendon", [7151, 7166, 7191])}, "TendonOfRotatorCuffOfShoulder": { "245100002": ("Tendon of Rotator Cuff of Shoulder", [12321]) }, "TendonOfTodaro": {"128595004": ("Tendon of Todaro", [3011, 8134])}, "TendonStructure": {"13024002": ("Tendon structure (body structure)", [])}, "TennesseeWalkingHorse": {"51023000": ("Tennessee walking horse (organism)", [])}, "TennesseeWalkingHorseBreed": { "51023000": ("Tennessee walking horse breed", [7480]) }, "TenthIntercostalSpace": {"117142007": ("Tenth Intercostal Space", [5])}, "TenthPercentile": {"371890005": ("Tenth percentile (qualifier value)", [])}, "TeresMajorMuscle": { "1193009": ("Teres major muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "TeresMinorMuscle": { "51159009": ("Teres minor muscle", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "TerminalDeoxynucleotidylTransferaseStain": { "406975002": ("terminal deoxynucleotidyl transferase stain", [8112]) }, "TerminalInternalCarotidArtery": { "415646005": ( "Terminal internal carotid artery", [3827, 7151, 7192, 8134, 9514, 12103, 12105], ) }, "Terrier": {"606003": ("Terrier", [7480])}, "TerskHorseBreed": {"133151009": ("Tersk horse breed", [7480])}, "TestDuration": {"252129004": ("Test duration (observable entity)", [])}, "TestNotDone": {"373121007": ("Test not done (qualifier value)", [])}, "TesticularArtery": { "27175001": ( "Testicular Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "TesticularVein": { "31688004": ( "Testicular Vein", [3827, 7151, 7192, 8134, 9514, 12103, 12113, 12125], ) }, "Testis": { "40689003": ( "Testis", [4, 4030, 6202, 6204, 7151, 7160, 7192, 8134, 9514, 10044, 10060, 12321], ) }, "TestisStructure": {"40689003": ("Testis structure (body structure)", [])}, "TetracyclineAntibiotic": {"373206009": ("Tetracycline antibiotic", [621, 622])}, "TetracyclineClassOfAntibioticSubstance": { "373206009": ("Tetracycline (class of antibiotic, substance) (substance)", []) }, "TetralogyOfFallot": {"86299006": ("Tetralogy of Fallot", [12248, 12249])}, "Teufel": {"399127009": ("Teufel", [4012])}, "TeufelProjection": {"399127009": ("Teufel projection (qualifier value)", [])}, "TexasLonghornCattleBreed": {"133279007": ("Texas Longhorn cattle breed", [7480])}, "TexelSheepBreed": {"132801007": ("Texel sheep breed", [7480])}, "TexonCattleBreed": {"133280005": ("Texon cattle breed", [7480])}, "ThaiBinhPigBreed": {"132349007": ("Thai Binh pig breed", [7480])}, "ThaiCattleBreed": {"131530006": ("Thai cattle breed", [7480])}, "ThaiPonyHorseBreed": {"131949002": ("Thai Pony horse breed", [7480])}, "ThaiRidgebackDogBreed": {"132641000": ("Thai Ridgeback dog breed", [7480])}, "ThailandFightingZebuCattleBreed": { "131531005": ("Thailand Fighting Zebu cattle breed", [7480]) }, "ThalamicStructure": {"42695009": ("Thalamic structure (body structure)", [])}, "Thalamus": {"42695009": ("Thalamus", [7151, 7153, 7192, 8134, 9514])}, "ThalamusPart": {"119406000": ("Thalamus", [7140])}, "ThalliSheepBreed": {"132707000": ("Thalli sheep breed", [7480])}, "Thallium201": {"353842007": ("Thallium-201", [3111])}, "ThallousChlorideTl201": {"73685002": ("Thallous chloride Tl^201^", [25])}, "ThanhHoaCattleBreed": {"131532003": ("Thanh-Hoa cattle breed", [7480])}, "TharparkarCattleBreed": {"133629002": ("Tharparkar cattle breed", [7480])}, "TheilerMurineEncephalomyelitisVirus": { "42024000": ("Theiler's murine encephalomyelitis virus", [638, 641]) }, "TherapeuticIntent": {"262202000": ("Therapeutic Intent", [3629])}, "TherapeuticProcedure": {"277132007": ("Therapeutic procedure", [6319])}, "TherapeuticRadioisotope": {"439007": ("Therapeutic radioisotope", [25])}, "ThermalBath": {"371838001": ("Thermal Bath", [3628])}, "ThermalCardiacOutputWaveform": { "128454000": ("Thermal cardiac output waveform", [3003]) }, "ThermalCardiacOutputWaveformFunction": { "128454000": ( "Thermal cardiac output waveform, function (observable entity)", [], ) }, "ThermalInline": {"371843008": ("Thermal Inline", [3628])}, "ThermistorCatheter": {"371800000": ("Thermistor catheter", [3429])}, "ThermistorCatheterMethod": {"133914002": ("Thermistor catheter method", [3241])}, "ThermoluminescentRadiationDosimeter": { "464983000": ("Thermoluminescent radiation dosimeter", [7026, 7027, 7151, 7193]) }, "ThessalonianHorseBreed": {"131950002": ("Thessalonian horse breed", [7480])}, "ThessalyCattleBreed": {"133530000": ("Thessaly cattle breed", [7480])}, "Thiamylal": {"40342009": ("Thiamylal", [623, 625])}, "ThiamylalSodium": {"40342009": ("Thiamylal sodium (substance)", [])}, "ThibarCattleBreed": {"133836003": ("Thibar cattle breed (organism)", [])}, "ThibarXZebuCattleBreed": {"133836003": ("Thibar X zebu cattle breed", [7480])}, "Thigh": { "68367000": ("Thigh", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "ThighPerforator": { "714759009": ("Thigh perforator", [3827, 7151, 7192, 8134, 9514, 12103, 12110]) }, "ThighStructure": {"68367000": ("Thigh structure (body structure)", [])}, "ThillariCattleBreed": {"133791002": ("Thillari cattle breed", [7480])}, "ThioflavineSStain": {"406995008": ("thioflavine S stain", [8112])}, "ThioflavineTStain": {"61068006": ("thioflavine T stain", [8112])}, "ThioninStain": {"406969006": ("Thionin stain (substance)", [])}, "ThionineStain": {"12001002": ("thionine stain", [8112])}, "Thiopental": {"387448009": ("Thiopental", [623, 625])}, "ThiopentalSodium": {"387448009": ("Thiopental sodium (substance)", [])}, "ThirdDegreeAtrioventricularBlock": { "27885002": ("Third degree Atrioventricular block", [3230]) }, "ThirdIntercostalSpace": {"117135007": ("Third Intercostal Space", [5])}, "ThirdLumbarArtery": { "397409007": ( "Third Lumbar Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125], ) }, "ThirdMolarRegion": {"699503005": ("Third molar region", [4017])}, "ThirdMolarRegionOfOralCavity": { "699503005": ("Third molar region of oral cavity (body structure)", []) }, "ThirdVentricle": { "49841001": ("Third ventricle", [7140, 7151, 7153, 7192, 8134, 9514]) }, "ThirdVentricleStructure": { "49841001": ("Third ventricle structure (body structure)", []) }, "Thoracentesis": {"91602002": ("Thoracentesis", [9])}, "ThoracicAorta": { "113262008": ( "Thoracic aorta", [4, 3010, 3604, 3606, 3630, 4030, 4042, 7151, 7192, 8134, 9514, 12291], ) }, "ThoracicAortaStructure": { "113262008": ("Thoracic aorta structure (body structure)", []) }, "ThoracicAorticCoarctation": { "253678000": ("Thoracic Aortic Coarctation", [12236]) }, "ThoracicCavityStructure": { "43799004": ("Thoracic cavity structure (body structure)", []) }, "ThoracicDuct": { "1732005": ("Thoracic Duct", [6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514]) }, "ThoracicDuctStructure": { "1732005": ("Thoracic duct structure (body structure)", []) }, "ThoracicInlet": {"42973007": ("Thoracic Inlet", [1000, 1001, 1004, 8134])}, "ThoracicSpine": { "122495006": ( "Thoracic spine", [4, 4009, 4030, 4031, 4042, 7151, 7155, 7192, 7304, 7482, 7483, 8134, 9514], ) }, "ThoracicSpineStructure": { "122495006": ("Thoracic spine structure (body structure)", []) }, "ThoracicStructure": {"51185008": ("Thoracic structure (body structure)", [])}, "ThoracicSurgery": {"309970009": ("Thoracic Surgery", [7030])}, "ThoracicSurgeryDepartment": { "309970009": ("Thoracic surgery department (environment)", []) }, "ThoracoLumbarSpine": { "1217256009": ( "Thoraco-lumbar spine", [4, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 7482, 7483, 8134, 9514], ) }, "ThoracolumbarRegionOfSpineStructure": { "297172009": ("Thoracolumbar region of spine structure (body structure)", []) }, "Thorax": {"816094009": ("Thorax", [4, 7155, 12020])}, "ThraceCattleBreed": {"133360006": ("Thrace cattle breed", [7480])}, "Thrombin": {"36176003": ("Thrombin (substance)", [])}, "ThrombinPreparation": {"36176003": ("Thrombin preparation", [10])}, "ThrombolysisInMyocardialInfarctionGrade0NoPerfusion": { "371867000": ( "Thrombolysis in Myocardial Infarction grade 0: no perfusion (finding)", [], ) }, "ThrombolysisInMyocardialInfarctionGrade1PenetrationWithoutPerfusion": { "371866009": ( "Thrombolysis in Myocardial Infarction grade 1: penetration without perfusion (finding)", [], ) }, "ThrombolysisInMyocardialInfarctionGrade2PartialPerfusion": { "371864007": ( "Thrombolysis in Myocardial Infarction grade 2: partial perfusion (finding)", [], ) }, "ThrombolysisInMyocardialInfarctionGrade3CompletePerfusion": { "371865008": ( "Thrombolysis in Myocardial Infarction grade 3: complete perfusion (finding)", [], ) }, "Thrombolytic": {"303960004": ("Thrombolytic (product)", [])}, "ThrombolyticAgent": {"303960004": ("Thrombolytic agent", [10])}, "ThrombolyticAgentAdministeredBetween3And6HoursBeforePercutaneousCoronaryIntervention": { "371897008": ( "Thrombolytic agent administered between 3 and 6 hours before percutaneous coronary " "intervention (situation)", [], ) }, "ThrombolyticAgentAdministeredBetween6HoursAnd7DaysBeforePercutaneousCoronaryIntervention": { "371906007": ( "Thrombolytic agent administered between 6 hours and 7 days before percutaneous coronary " "intervention (situation)", [], ) }, "ThrombolyticAgentAdministeredLessThan3HoursBeforePercutaneousCoronaryIntervention": { "371896004": ( "Thrombolytic agent administered less than 3 hours before percutaneous coronary intervention " "(situation)", [], ) }, "ThrombolyticAgentContraindicated": {"373148008": ("Contraindicated", [3740])}, "ThrombolyticTherapy": {"426347000": ("Thrombolytic therapy", [3764])}, "ThrombophlebitisOfBreast": { "69954004": ("Thrombophlebitis of breast (disorder)", []) }, "ThrombophlebitisOfBreastMondorDisease": { "69954004": ("Thrombophlebitis of breast (Mondor's disease)", [6030, 6031]) }, "Thromboplastin": {"387124009": ("Thromboplastin", [10])}, "ThrombosedAneurysm": {"125271003": ("thrombosed aneurysm", [3808])}, "Thrombosis": {"264579008": ("thrombosis", [3805])}, "ThromboticDisorder": {"118927008": ("thrombosis", [3815])}, "Thrombus": { "396339007": ( "Thrombus", [3491, 3495, 3497, 3712, 3810, 7151, 7156, 7192, 8134, 9514], ) }, "Thumb": { "76505004": ("Thumb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "ThumbStructure": {"76505004": ("Thumb structure (body structure)", [])}, "ThuocNhieuPigBreed": {"133165006": ("Thuoc Nhieu pig breed", [7480])}, "ThuringianGoatBreed": {"131642009": ("Thuringian goat breed", [7480])}, "ThymidineF18": {"129502002": ("Thymidine F^18^", [4021])}, "Thymus": {"9875009": ("Thymus", [4, 4030, 7151, 7155, 7192, 9514, 10044, 10060])}, "ThymusGland": {"9875009": ("Thymus Gland", [6102, 6109, 6113, 6149, 8134])}, "ThymusGlandStructure": { "9875009": ("Thymus gland structure (body structure)", []) }, "ThyrocervicalTrunk": { "6538005": ("Thyrocervical trunk", [6102, 6109, 6117, 7151, 7192, 8134, 9514]) }, "Thyroid": { "69748006": ( "Thyroid", [ 4, 645, 4030, 6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514, 10044, 10060, 12321, ], ) }, "ThyroidHormone": {"18220004": ("Thyroid hormone", [621, 622])}, "ThyroidIsthmus": {"40867004": ("Thyroid isthmus", [12130])}, "ThyroidNodule": {"237495005": ("Thyroid Nodule", [12322])}, "ThyroidPart": {"362892003": ("Thyroid part", [12130])}, "ThyroidStructure": {"69748006": ("Thyroid structure (body structure)", [])}, "TiaMeslanPigBreed": {"132090004": ("Tia Meslan pig breed", [7480])}, "TibetanCattleBreed": {"131533008": ("Tibetan cattle breed", [7480])}, "TibetanHorseBreed": {"131951003": ("Tibetan horse breed", [7480])}, "TibetanMastiffDogBreed": {"132643002": ("Tibetan Mastiff dog breed", [7480])}, "TibetanPigBreed": {"132228008": ("Tibetan pig breed", [7480])}, "TibetanSpaniel": {"87219003": ("Tibetan spaniel", [7480])}, "TibetanTerrier": {"17663009": ("Tibetan terrier", [7480])}, "Tibia": {"12611008": ("Tibia", [7304, 8134, 12021])}, "TibiaAndFibula": {"110536004": ("Tibia and fibula", [7482, 7483, 8134])}, "TibiaAndFibulaCombinedSite": { "110536004": ("Tibia and fibula (combined site) (body structure)", []) }, "TibialArtery": {"181351007": ("tibial artery", [3604, 3606, 3630])}, "TibialLymphNode": {"80769008": ("tibial lymph node", [7600, 8134])}, "TibialPlateau": {"306783000": ("Tibial Plateau", [1000, 1001, 1006, 8134])}, "TibialPlateauStructure": { "306783000": ("Tibial plateau structure (body structure)", []) }, "TielingHorseBreed": {"131952005": ("Tieling horse breed", [7480])}, "Tiletamine": {"96265006": ("Tiletamine", [623, 625])}, "TiletamineHydrochloride": { "96265006": ("Tiletamine hydrochloride (substance)", []) }, "TimeFromStartOfTest": { "252131008": ("Time from start of test (observable entity)", []) }, "TimorHorseBreed": {"131953000": ("Timor horse breed", [7480])}, "Tin": {"12597001": ("Tin", [10006, 10067])}, "TinimaCattleBreed": {"133531001": ("Tinima cattle breed", [7480])}, "TinosCattleBreed": {"133542005": ("Tinos cattle breed", [7480])}, "TipManometer": {"371802008": ("Tip manometer", [3429])}, "TipManometerHemodynamicMeasurementMethodRegimeTherapy": { "128582009": ( "Tip manometer hemodynamic measurement method (regime/therapy)", [], ) }, "TipManometerMethod": {"128582009": ("Tip manometer method", [3241])}, "Tissue": { "85756007": ("Tissue", [7150, 7151, 7165, 7166, 7191, 7196, 9502, 9580]) }, "TissueCassette": {"434464009": ("Tissue cassette", [8101, 8102])}, "TissueCassetteForMicroarray": { "434708008": ("Tissue cassette for microarray (physical object)", []) }, "TissueDopplerImaging": {"439858009": ("Tissue Doppler Imaging", [6058, 12224])}, "TissueEmbeddingMedium": {"430863003": ("Tissue embedding medium (substance)", [])}, "TissueFixative": {"430864009": ("Tissue fixative (substance)", [])}, "TissueFreezingMedium": {"433469005": ("Tissue freezing medium", [8115])}, "TissueMicroarrayCassette": { "434708008": ("Tissue microarray cassette", [8101, 8102]) }, "TissueSection": {"430856003": ("Tissue section", [8103])}, "TissueSpecimen": {"119376003": ("tissue specimen", [501, 4010, 8103])}, "TissueSpecimenFromBreast": {"127457009": ("tissue specimen from breast", [4014])}, "TissueSpot": {"431196006": ("Tissue spot", [8103])}, "TitanYellowStain": {"84217005": ("titan yellow stain", [8112])}, "Titanium": {"1166006": ("Titanium", [300])}, "Titterington": {"399241006": ("Titterington", [4012])}, "TitteringtonProjection": { "399241006": ("Titterington projection (qualifier value)", []) }, "TobaccoSmokingBehavior": {"365981007": ("Tobacco Smoking Behavior", [3774])}, "Toe": { "29707007": ( "Toe", [4, 1000, 1001, 1006, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "ToeStructure": {"29707007": ("Toe structure (body structure)", [])}, "ToggenburgGoat": {"30089001": ("Toggenburg goat (organism)", [])}, "ToggenburgGoatBreed": {"30089001": ("Toggenburg goat breed", [7480])}, "TokaraHorseBreed": {"133009004": ("Tokara horse breed", [7480])}, "TolazolineHydrochloride": { "19041007": ("Tolazoline hydrochloride (substance)", []) }, "TolazolineHydrocholoride": {"19041007": ("Tolazoline hydrocholoride", [10])}, "ToluidineBlueStain": {"29522004": ("toluidine blue stain", [4412, 8112])}, "TongConPigBreed": {"132347009": ("Tong Con pig breed", [7480])}, "TongSheepBreed": {"132708005": ("Tong sheep breed", [7480])}, "TongaCattleBreed": {"131534002": ("Tonga cattle breed", [7480])}, "Tongue": {"21974007": ("Tongue", [4, 4028, 7151, 7192, 7601, 8134, 9514])}, "TongueStructure": {"21974007": ("Tongue structure (body structure)", [])}, "TonkineseCat": {"44855006": ("Tonkinese cat", [7480])}, "TonsilAndAdenoid": {"303337002": ("tonsil and adenoid", [7601, 8134])}, "TonsilAndAdenoidStructure": { "303337002": ("Tonsil and adenoid structure (body structure)", []) }, "TonsillarStructurePalatine": { "75573002": ("Tonsillar structure (palatine) (body structure)", []) }, "Tooth": {"38199008": ("Tooth", [4028, 4029, 7151, 7192, 8134, 9514])}, "ToothStructure": {"38199008": ("Tooth structure (body structure)", [])}, "TopicalChemotherapyForMalignantNeoplasm": { "24977001": ("Topical chemotherapy for malignant neoplasm", [4409]) }, "TopicalLocalAnesthesia": {"386760001": ("Topical local anesthesia", [611, 612])}, "TopicalLocalAnesthetic": { "386760001": ("Topical local anesthetic (procedure)", []) }, "TopicalRoute": {"6064005": ("Topical route", [11])}, "TopographicalModifier": {"106233006": ("Topographical modifier", [210])}, "ToposaCattleBreed": {"133792009": ("Toposa cattle breed", [7480])}, "ToriHorseBreed": {"133008007": ("Tori horse breed", [7480])}, "ToroCattleBreed": {"131535001": ("Toro cattle breed", [7480])}, "ToronkeCattleBreed": {"133793004": ("Toronke cattle breed", [7480])}, "Torsion": {"51795009": ("Torsion", [92])}, "Tortuosity": {"15690004": ("tortuosity", [3810])}, "Tortuous": {"386137000": ("Tortuous", [3712])}, "TortuousCoronaryArtery": {"386137000": ("Tortuous coronary artery (finding)", [])}, "TosaInuDogBreed": {"132645009": ("Tosa Inu dog breed", [7480])}, "Total": {"255619001": ("Total", [7464])}, "TotalBloodVolume": {"268384009": ("Total blood volume (observable entity)", [])}, "TotalCavopulmonaryConnectionWithLateralAtrialTunnel": { "427886002": ( "Total cavopulmonary connection with lateral atrial tunnel (procedure)", [], ) }, "TotalExerciseTime": {"252130009": ("Total exercise time (observable entity)", [])}, "TouabireSheepBreed": {"132709002": ("Touabire sheep breed", [7480])}, "ToubouCattleBreed": {"133837007": ("Toubou cattle breed (organism)", [])}, "ToubouXZebuCattleBreed": {"133837007": ("Toubou X zebu cattle breed", [7480])}, "TouchPreparation": {"430854000": ("Touch preparation (procedure)", [8110])}, "TouchPreparationCytologicMaterial": { "430855004": ("Touch preparation cytologic material", [8103]) }, "TouchPreparationOfSpecimen": { "430854000": ("Touch preparation of specimen (procedure)", []) }, "ToupouriCattleBreed": {"133794005": ("Toupouri cattle breed", [7480])}, "Towne": {"399270002": ("Towne", [4012])}, "TowneProjection": {"399270002": ("Towne's projection (qualifier value)", [])}, "Toxin": {"80917008": ("Toxin", [637])}, "ToyFoxTerrier": {"26639007": ("Toy fox terrier (organism)", [])}, "ToyFoxTerrierDogBreed": {"26639007": ("Toy fox terrier dog breed", [7480])}, "ToyHavaneseTerrierDogBreed": { "132646005": ("Toy Havanese Terrier dog breed", [7480]) }, "ToyManchesterTerrier": {"13942005": ("Toy Manchester terrier", [7480])}, "ToyPoodle": {"25243005": ("Toy poodle (organism)", [])}, "ToyPoodleDogBreed": {"25243005": ("Toy poodle dog breed", [7480])}, "TrabeculaeCarnae": { "118755002": ("Trabeculae carnae", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "TrabeculaeCarneaeCordis": { "118755002": ("Trabeculae carneae cordis (body structure)", []) }, "TrabecularThickeningOfBreast": { "129795008": ("Trabecular thickening of breast", [6014, 6015, 6016, 6054, 6056]) }, "Trachea": { "44567001": ( "Trachea", [ 4, 4009, 4028, 4030, 4031, 4042, 6102, 6109, 6113, 6149, 7151, 7155, 7192, 8134, 9514, ], ) }, "TracheaAndBronchus": { "110726009": ("Trachea and bronchus", [4, 4040, 7151, 7192, 8134, 9514]) }, "TracheaAndBronchusCombinedSite": { "110726009": ("Trachea and bronchus (combined site) (body structure)", []) }, "TrachealStructure": {"44567001": ("Tracheal structure (body structure)", [])}, "TracheobronchialLymphNode": { "245341003": ("tracheobronchial lymph node", [7600, 8134]) }, "TracheobronchialLymphNodeLocatedNearCarina": { "89858007": ("tracheobronchial lymph node, located near carina", [7600, 8134]) }, "Tracheotomy": {"48387007": ("Tracheotomy", [6102, 6138, 6404, 7151, 7193])}, "TractionAction": {"129411004": ("Traction - action", [94])}, "TrakehnerHorse": {"1789009": ("Trakehner horse (organism)", [])}, "TrakehnerHorseBreed": {"1789009": ("Trakehner horse breed", [7480])}, "TrakyaHorseBreed": {"131954006": ("Trakya horse breed", [7480])}, "TransAbdominal": {"66739002": ("Trans-abdominal", [7, 12025])}, "TransEsophageal": {"103383005": ("Trans-esophageal", [7])}, "TransGastric": {"103353001": ("Trans-gastric", [7])}, "TransHepatic": {"103381007": ("Trans-hepatic", [7])}, "TransMural": {"103354007": ("Trans-mural", [7])}, "TransOrbital": {"129226004": ("Trans-orbital", [7])}, "TransPancreatic": {"103349003": ("Trans-pancreatic", [7])}, "TransPleural": {"103348006": ("Trans-pleural", [7])}, "TransRectal": {"6706003": ("Trans-rectal", [7])}, "TransRenal": {"103347001": ("Trans-renal", [7])}, "TransSplenic": {"103346005": ("Trans-splenic", [7])}, "TransTemporal": {"103382000": ("Trans-temporal", [7])}, "TransThecal": {"103345009": ("Trans-thecal", [7])}, "TransUrethral": {"57257006": ("Trans-urethral", [7])}, "TransVaginal": {"54300008": ("Trans-vaginal", [7, 12025])}, "TransVesical": {"103344008": ("Trans-vesical", [7])}, "TransarterialApproach": { "103387006": ("Transarterial approach (qualifier value)", []) }, "TranscatheterDeploymentOfDetachableBalloon": { "105372003": ("Transcatheter deployment of detachable balloon", [9, 3405]) }, "TranscatheterTherapyForEmbolization": { "16736007": ("Transcatheter therapy for embolization", [9, 3405]) }, "TransesophagealApproach": { "103383005": ("Transesophageal approach (qualifier value)", []) }, "TransesophagealEchocardiography": { "105376000": ("Transesophageal echocardiography", [3405, 3428, 3757, 12001]) }, "TransesophagealShortAxisView": { "443698002": ("Transesophageal short axis view", [501, 12226]) }, "Transfer": {"4563007": ("Transfer", [3729])}, "Transforamenal": {"272466003": ("transforamenal", [502, 4011])}, "Transgastric": {"103353001": ("Transgastric (qualifier value)", [])}, "TranshepaticApproach": { "103381007": ("Transhepatic approach (qualifier value)", []) }, "TransientIschemicDilatationOfLeftVentricularCavity": { "429710001": ( "Transient ischemic dilatation of left ventricular cavity (disorder)", [], ) }, "TransientIschemicDilatationRatioOfLeftVentricularCavity": { "428832008": ( "Transient ischemic dilatation ratio of left ventricular cavity (observable entity)", [], ) }, "TransientLimbParalysis": {"274662006": ("Transient limb paralysis", [3205])}, "TransitionZoneOfTheProstate": { "399384005": ("Transition zone of the prostate", [6300]) }, "TransitionalCellCarcinoma": { "27090000": ("Transitional cell carcinoma", [638, 639]) }, "TransjugularIntrahepaticPortosystemicShunt": { "397423009": ( "Transjugular Intrahepatic Portosystemic Shunt", [3827, 7151, 7192, 8134, 9514, 12103, 12114, 12125], ) }, "TransluminalExtractionCatheterDevice": { "21870002": ("Transluminal extraction catheter, device (physical object)", []) }, "TransluminalExtractionCatheterTEC": { "21870002": ("Transluminal Extraction Catheter (TEC)", [3411, 3429]) }, "Transmural": {"103354007": ("Transmural (qualifier value)", [])}, "Transoral": {"118438002": ("transoral", [502, 4011])}, "TransoralApproach": {"118438002": ("Transoral approach (qualifier value)", [])}, "Transorbital": {"278318001": ("transorbital", [502, 4011])}, "TransorbitalApproach": { "129226004": ("Transorbital approach (qualifier value)", []) }, "TransorbitalProjection": { "278318001": ("Transorbital projection (qualifier value)", []) }, "Transpancreatic": {"103349003": ("Transpancreatic (qualifier value)", [])}, "TransplantSurgery": {"309993003": ("Transplant Surgery", [7030])}, "TransplantationOfBoneMarrow": { "23719005": ("Transplantation of bone marrow (procedure)", []) }, "TransplantationOfHeart": { "32413006": ("Transplantation of heart (procedure)", []) }, "Transpleural": {"103348006": ("Transpleural (qualifier value)", [])}, "TransrectalApproach": {"6706003": ("Transrectal approach (qualifier value)", [])}, "Transrenal": {"103347001": ("Transrenal (qualifier value)", [])}, "TransseptalCatheter": {"386124003": ("Transseptal catheter", [3429])}, "TransseptalCatheterization": { "67338003": ("Transseptal catheterization", [3250, 3405]) }, "Transsplenic": {"103346005": ("Transsplenic (qualifier value)", [])}, "TranstemporalApproach": { "103382000": ("Transtemporal approach (qualifier value)", []) }, "Transthecal": {"103345009": ("Transthecal (qualifier value)", [])}, "Transthoracic": {"272476000": ("transthoracic", [502, 4011])}, "TransthoracicEchocardiography": { "433236007": ("Transthoracic echocardiography", [3405, 3428, 3757, 12001]) }, "TransthoracicEchocardiography_Inactive": { "252418006": ("Transthoracic echocardiography (procedure)", []) }, "TransthoracicProjection": { "272476000": ("Transthoracic projection (qualifier value)", []) }, "TranstrachealJetVentilation": { "448442005": ("Transtracheal jet ventilation", [619, 620]) }, "TransurethralApproach": { "57257006": ("Transurethral approach (qualifier value)", []) }, "TransvenousApproach": { "103386002": ("Transvenous approach (qualifier value)", []) }, "Transverse": {"62824007": ("Transverse", [2, 5, 6, 26, 501, 502, 3838, 12118])}, "TransverseAorticArch": {"443281009": ("Transverse Aortic Arch", [12280])}, "TransverseBodyPosition": {"399220000": ("transverse", [21])}, "TransverseColon": {"485005": ("Transverse colon", [6210, 8134])}, "TransverseColonStructure": { "485005": ("Transverse colon structure (body structure)", []) }, "TransverseProcessOrVertebra": { "73400003": ("Transverse process or vertebra", [6115, 8134]) }, "TransversusThoracis": { "88454005": ("Transversus thoracis", [6102, 6109, 6116, 7151, 7192, 8134, 9514]) }, "Transvesical": {"103344008": ("Transvesical (qualifier value)", [])}, "TransylvanianHoundDogBreed": { "132455001": ("Transylvanian Hound dog breed", [7480]) }, "TransylvanianPinzgauCattleBreed": { "133543000": ("Transylvanian Pinzgau cattle breed (organism)", []) }, "TransylvanianPinzguaCattleBreed": { "133543000": ("Transylvanian Pinzgua cattle breed", [7480]) }, "TrapeziusMuscle": { "31764008": ( "Trapezius muscle", [6102, 6109, 6113, 6116, 6149, 7151, 7192, 8134, 9514], ) }, "Trauma": {"417746004": ("trauma", [3815])}, "TraumaSurgery": {"309994009": ("Trauma Surgery", [7030])}, "TraumaSurgeryDepartment": { "309994009": ("Trauma surgery department (environment)", []) }, "TraumaticAbnormality": {"417746004": ("Traumatic Abnormality", [3809])}, "TraumaticAbnormalityMorphologic": { "19130008": ("Traumatic abnormality (morphologic abnormality)", []) }, "TraumaticAneurysm": {"110421000": ("traumatic aneurysm", [3808])}, "TraumaticInjury": {"417746004": ("Traumatic injury (disorder)", [])}, "Treadmill": {"1211003": ("Treadmill", [3203])}, "TreadmillDevice": {"1211003": ("Treadmill, device (physical object)", [])}, "TreeingCurDogBreed": {"132647001": ("Treeing Cur dog breed", [7480])}, "TreeingFeistDogBreed": {"132648006": ("Treeing Feist dog breed", [7480])}, "TreeingTennesseeBrindleDogBreed": { "132633000": ("Treeing Tennessee Brindle dog breed", [7480]) }, "TreeingWalkerCoonhound": {"57120006": ("Treeing walker coonhound (organism)", [])}, "TreeingWalkerCoonhoundDogBreed": { "57120006": ("Treeing walker coonhound dog breed", [7480]) }, "Tremor": {"26079004": ("Tremor (finding)", [])}, "Trendelenburg": {"34106002": ("Trendelenburg", [20])}, "TrendelenburgPosition": {"34106002": ("Trendelenburg position (finding)", [])}, "Tretinoin": {"387305002": ("Tretinoin", [4410])}, "TribredPigBreed": {"132029006": ("Tribred pig breed", [7480])}, "Tribromoethanol": {"84386009": ("Tribromoethanol", [623, 625])}, "TrichromeStain": {"406989007": ("trichrome stain", [8112])}, "TricuspidAnnulus": {"113259005": ("Tricuspid Annulus", [12236, 12241, 12305])}, "TricuspidDiastolicFillingPeriod": { "371847009": ("Tricuspid diastolic filling period (observable entity)", []) }, "TricuspidDiastolicFillingPeriodDfpt": { "371847009": ("Tricuspid Diastolic Filling Period (DFPt)", [3616, 12267, 12268]) }, "TricuspidRegurgitation": {"111287006": ("Tricuspid regurgitation", [3700])}, "TricuspidRing": {"113259005": ("Tricuspid ring", [3011, 8134])}, "TricuspidValve": { "46030003": ( "Tricuspid valve", [ 3610, 3630, 3701, 6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514, 12285, 12305, ], ) }, "TricuspidValveArea": {"251014001": ("Tricuspid Valve Area", [3614, 3615])}, "TricuspidValveClosureToOpeningTime": { "399282006": ("Tricuspid Valve Closure to Opening Time", [12208]) }, "TricuspidValveDisease": {"20721001": ("Tricuspid valve disease", [3700])}, "TricuspidValveDisorder": {"20721001": ("Tricuspid valve disorder (disorder)", [])}, "TricuspidValveFlow": {"371840006": ("Tricuspid Valve Flow", [3617])}, "TricuspidValvePullbackPressureWaveform": { "128451008": ("Tricuspid valve pullback pressure waveform", [3003]) }, "TricuspidValvePullbackPressureWaveformFunction": { "128451008": ( "Tricuspid valve pullback pressure waveform, function (observable entity)", [], ) }, "TricuspidValveRegurgitation": { "111287006": ("Tricuspid valve regurgitation (disorder)", []) }, "TricuspidValveStructure": { "46030003": ("Tricuspid valve structure (body structure)", []) }, "TrigeminalNerve": {"27612005": ("trigeminal nerve", [7706, 7710, 8134])}, "TrigeminalNerveStructure": { "27612005": ("Trigeminal nerve structure (body structure)", []) }, "TriggHoundDogBreed": {"132456000": ("Trigg Hound dog breed", [7480])}, "TripleVesselCoronaryArteryDisease": { "233817007": ("Triple vessel coronary artery disease.", [3728]) }, "TripleVesselDiseaseOfTheHeart": { "233817007": ("Triple vessel disease of the heart (disorder)", []) }, "TrochlearNerve": {"39322007": ("trochlear nerve", [7706, 7710, 8134])}, "TrochlearNerveStructure": { "39322007": ("Trochlear nerve structure (body structure)", []) }, "TropaeolinOOStain": {"53511009": ("tropaeolin OO stain", [8112])}, "TropaeolinOStain": {"35094004": ("tropaeolin O stain", [8112])}, "TropicalCattleBreed": {"133838002": ("Tropical cattle breed (organism)", [])}, "TropicalDairyCattleCattleBreed": { "133544006": ("Tropical Dairy Cattle cattle breed", [7480]) }, "TropicalMedicine": {"441548002": ("Tropical Medicine", [7030])}, "TropicalMedicineDepartment": { "441548002": ("Tropical medicine department (environment)", []) }, "TropicalXZebuCattleBreed": {"133838002": ("Tropical X zebu cattle breed", [7480])}, "Tropicamide": {"9190005": ("Tropicamide", [4208])}, "TropicanaCattleBreed": {"133545007": ("Tropicana cattle breed", [7480])}, "TroteEnGallopeHorseBreed": {"131955007": ("Trote en Gallope horse breed", [7480])}, "TruncalValveStructure": {"279317000": ("Truncal Valve Structure", [12289])}, "TruncusArteriosusCommunis": { "61959006": ( "Truncus arteriosus communis", [4, 3010, 3604, 3606, 3630, 4042, 7151, 7192, 8134, 9514], ) }, "TruncusCoeliacus": { "57850000": ("Truncus coeliacus", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "Trunk": {"22943007": ("Trunk", [8134, 12020])}, "TrunkAngiography": {"303827001": ("trunk angiography", [3820])}, "TrunkOfPulmonaryArtery": { "45341000": ("Trunk of pulmonary artery", [3829, 7151, 7192, 9514, 12305]) }, "TrunkStructure": {"22943007": ("Trunk structure (body structure)", [])}, "TrypanBlue": {"60441008": ("Trypan blue", [4200])}, "TrypanBlueStain": {"60441008": ("trypan blue stain", [8112])}, "TsivilskPigBreed": {"132110002": ("Tsivilsk pig breed", [7480])}, "TswanaCattleBreed": {"131439005": ("Tswana cattle breed", [7480])}, "Tuarine": {"10944007": ("Tuarine", [218, 4032, 4033, 7180, 7186, 7469])}, "TubalTonsil": {"21058000": ("tubal tonsil", [7601, 8134])}, "Tube": {"83059008": ("Tube", [69])}, "TubeDevice": {"83059008": ("Tube, device (physical object)", [])}, "TubeFeedingOfPatientRegimeTherapy": { "61420007": ("Tube feeding of patient (regime/therapy)", []) }, "TubercleOfRib": {"113198008": ("Tubercle of rib", [6115, 8134])}, "TubercleOfRibStructure": { "113198008": ("Tubercle of rib structure (body structure)", []) }, "TubularAdenocarcinoma": {"4631006": ("Tubular adenocarcinoma", [6030, 6033])}, "TubularAdenoma": {"444408007": ("Tubular adenoma", [6030, 6031])}, "TubularAdenomaNoInternationalClassificationOfDiseasesForOncologySubtype": { "19665009": ( "Tubular adenoma, no International Classification of Diseases for Oncology subtype (morphologic abnormality)", [], ) }, "TubularDensity": { "129794007": ("Tubular density", [6014, 6015, 6016, 6054, 6056]) }, "TubularShapedDensityOfBreast": { "129794007": ("Tubular shaped density of breast (finding)", []) }, "TudancaCattleBreed": {"133546008": ("Tudanca cattle breed", [7480])}, "TukidaleSheepBreed": {"132704007": ("Tukidale sheep breed", [7480])}, "TuliCattleBreed": {"131440007": ("Tuli cattle breed", [7480])}, "Tumor": {"108369006": ("Tumor", [644, 3815, 8134])}, "TumorInvasionLimitedToSkin": { "409783000": ("Tumor invasion limited to skin (finding)", []) }, "TumorMarginStatus": {"372249001": ("Tumor margin status (observable entity)", [])}, "TumorNecrosisFactorAlpha": { "39525005": ("Tumor necrosis factor alpha", [638, 642]) }, "TumorOfColon": {"126838000": ("Tumor of colon", [6201])}, "TumorStageFinding": {"385356007": ("Tumor stage finding (finding)", [])}, "TunchangPigBreed": {"132199000": ("Tunchang pig breed (organism)", [])}, "TungchangPigBreed": {"132199000": ("Tungchang pig breed", [7480])}, "Tungsten": {"26194003": ("Tungsten", [10016])}, "TungstenHalogenLamp": {"445679001": ("Tungsten halogen lamp", [8125])}, "TungstenHalogenLampMicroscopeIlluminator": { "445679001": ( "Tungsten halogen lamp microscope illuminator (physical object)", [], ) }, "TuniCattleBreed": {"131536000": ("Tuni cattle breed", [7480])}, "TunicaAdventitia": {"30180000": ("Tunica adventitia (body structure)", [])}, "TunicaIntima": {"8361002": ("Tunica intima (body structure)", [])}, "TunicaIntimaOfVessel": { "87483006": ("Tunica intima of vessel (body structure)", []) }, "TunicaMediaVasorum": {"61695000": ("Tunica media vasorum (body structure)", [])}, "TunisSheepBreed": {"132710007": ("Tunis sheep breed", [7480])}, "TurinoCattleBreed": {"133547004": ("Turino cattle breed", [7480])}, "TurkishAngoraCat": {"50441005": ("Turkish angora cat", [7480])}, "TurkishBrownCattleBreed": {"133548009": ("Turkish Brown cattle breed", [7480])}, "TurkishGraySteppeCattleBreed": { "131537009": ("Turkish Gray Steppe cattle breed", [7480]) }, "TurkishVanCatBreed": {"132655008": ("Turkish van cat breed", [7480])}, "TurkmenZebuCattleBreed": {"133652003": ("Turkmen zebu cattle breed", [7480])}, "TurkomanHorseBreed": {"131956008": ("Turkoman horse breed", [7480])}, "TuropoljePigBreed": {"132229000": ("Turopolje pig breed", [7480])}, "TushinHorseBreed": {"131957004": ("Tushin horse breed", [7480])}, "TuvaHorseBreed": {"131958009": ("Tuva horse breed", [7480])}, "TuxZillertalCattleBreed": {"133549001": ("Tux-Zillertal cattle breed", [7480])}, "TuyHoaCattleBreed": {"131538004": ("Tuy-Hoa cattle breed", [7480])}, "TuyHoaHairlessPigBreed": {"133161002": ("Tuy Hoa Hairless pig breed", [7480])}, "Twining": {"399125001": ("Twining", [4012])}, "TwiningProjection": {"399125001": ("Twining projection (qualifier value)", [])}, "TwoChamber": {"399232001": ("Two chamber", [6, 501, 502])}, "TwoStandardDeviationsAboveMean": { "371920000": ("Two standard deviations above mean (qualifier value)", []) }, "TwoStandardDeviationsBelowMean": { "371918003": ("Two standard deviations below mean (qualifier value)", []) }, "TypeOfStenosis": {"246244004": ("Type of stenosis (attribute)", [])}, "TypicalAngina": {"429559004": ("Typical Angina", [3202, 3220])}, "TyrolGrayCattleBreed": {"133550001": ("Tyrol Gray cattle breed", [7480])}, "TyrolMountainSheepBreed": {"132711006": ("Tyrol Mountain sheep breed", [7480])}, "TyroleanHoundDogBreed": {"132457009": ("Tyrolean Hound dog breed", [7480])}, "TyropanoateSodium": {"109212003": ("Tyropanoate sodium (substance)", [])}, "UdaSheepBreed": {"132712004": ("Uda sheep breed", [7480])}, "UjumqinCattleBreed": {"131539007": ("Ujumqin cattle breed", [7480])}, "UjumqinSheepBreed": {"132854005": ("Ujumqin sheep breed", [7480])}, "UkrainianGrayCattleBreed": {"131544000": ("Ukrainian Gray cattle breed", [7480])}, "UkrainianSaddleHorseHorseBreed": { "133007002": ("Ukrainian Saddle Horse horse breed", [7480]) }, "UkrainianSteppeWhitePig": { "406663005": ("Ukrainian steppe white pig (organism)", []) }, "UkrainianSteppeWhitePigBreed": { "406663005": ("Ukrainian steppe white pig breed", [7480]) }, "UkrainianWhiteheadedCattleBreed": { "133555006": ("Ukrainian Whiteheaded cattle breed", [7480]) }, "Ulcer": {"56208002": ("Ulcer", [6209])}, "Ulcerated": {"373138006": ("Ulcerated", [3712])}, "UlceratedAtheromatousPlaque": { "62189002": ("ulcerated atheromatous plaque", [3817]) }, "UlceratedLesionOfCoronaryArtery": { "373138006": ("Ulcerated lesion of coronary artery (finding)", []) }, "Ulcerative": {"255321001": ("Ulcerative", [3715])}, "Ulna": {"23416004": ("Ulna", [7304, 8134, 12021])}, "UlnarArtery": { "44984001": ( "Ulnar artery", [4, 3010, 3440, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12107], ) }, "UlnarVein": { "17623008": ("Ulnar vein", [3827, 7151, 7192, 8134, 9514, 12103, 12108]) }, "UltraVioletColor": {"415770004": ("Ultra-violet color (qualifier value)", [])}, "UltrasonicGuidanceForAmniocentesis": { "65388005": ("Ultrasonic guidance for amniocentesis", [9]) }, "UltrasonicGuidanceProcedure": { "61593002": ("Ultrasonic guidance procedure", [6058, 6060]) }, "Ultrasonography": {"310169008": ("Ultrasonography", [7030])}, "UltrasonographyOfBreast": { "47079000": ("Ultrasonography of breast", [6050, 6083]) }, "UltrasonographyOfTotalBody": { "24135002": ("Ultrasonography of total body", [646]) }, "UltrasonographyService": { "310169008": ("Ultrasonography service (qualifier value)", []) }, "UltrasoundCouplingGel": {"1004163002": ("Ultrasound coupling gel", [11002])}, "UltrasoundPeripheralVascularFlowStudy": { "48526000": ("Ultrasound peripheral vascular flow study (procedure)", []) }, "UltrasoundScanNormal": {"169254007": ("Ultrasound scan normal", [6054, 6064])}, "UltrasoundScanObstetric": { "268445003": ("Ultrasound scan - obstetric (procedure)", []) }, "Ultraviolet": {"415770004": ("Ultraviolet", [4206, 8122])}, "UltravioletOpticalFilter": {"445254006": ("Ultraviolet optical filter", [8124])}, "UltravioletOpticalFilterOfOpticalMicroscope": { "445254006": ( "Ultraviolet optical filter of optical microscope (physical object)", [], ) }, "UmbilicalArtery": { "50536004": ( "Umbilical artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12111, 12125, 12140, ], ) }, "UmbilicalCord": {"29870000": ("Umbilical cord", [8134])}, "UmbilicalCordStructure": { "29870000": ("Umbilical cord structure (body structure)", []) }, "UmbilicalRegion": {"90290004": ("Umbilical region", [4, 7151, 7192, 8134, 9514])}, "UmbilicalRegionStructure": { "90290004": ("Umbilical region structure (body structure)", []) }, "UmbilicalVein": { "284639000": ( "Umbilical vein", [ 4, 3010, 3607, 3630, 3827, 4042, 7151, 7192, 8134, 9514, 12103, 12114, 12125, ], ) }, "UmblacheryCattleBreed": {"133671001": ("Umblachery cattle breed", [7480])}, "UnableToAchieveTargetHeartRate": { "429733000": ("Unable to achieve target heart rate (finding)", []) }, "UncementedComponentFixation": { "304367000": ("Uncemented component fixation", [7310]) }, "Uncertain": {"64957009": ("Uncertain (qualifier value)", [])}, "UncertainRisk": {"64957009": ("Uncertain risk", [3118])}, "UncinateFasciculus": { "26230003": ("Uncinate fasciculus", [7151, 7153, 7192, 7703, 7710, 8134, 9514]) }, "Uncle": {"38048003": ("Uncle", [7450, 7451])}, "UncorrectedVisualAcuity": {"420050001": ("Uncorrected Visual Acuity", [4216])}, "Undetermined": {"373068000": ("Undetermined", [230, 240])}, "UnifocalPrematureVentricularComplexes": { "27337007": ("Unifocal premature ventricular complexes (disorder)", []) }, "UnifocalPvcs": {"27337007": ("Unifocal PVCs", [3234])}, "Unilateral": {"66459002": ("Unilateral", [2, 211, 244, 245])}, "Unknown": {"261665006": ("Unknown", [3703, 6096])}, "UnstableAngina": {"4557003": ("Unstable Angina", [3202, 3220])}, "UnstableAnginaProgressiveAngina": { "4557003": ("Unstable Angina, Progressive Angina", [3700]) }, "Unsteady": {"103361006": ("Unsteady (qualifier value)", [])}, "Up": {"255532002": ("Up", [4215])}, "UpperAbdomen": {"80581009": ("Upper abdomen", [6129, 8134])}, "UpperAbdomenStructure": { "80581009": ("Upper abdomen structure (body structure)", []) }, "UpperArm": { "40983000": ("Upper arm", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "UpperArmStructure": {"40983000": ("Upper arm structure (body structure)", [])}, "UpperDeepCervicalLymphNode": { "285425001": ("upper deep cervical lymph node", [7600, 8134]) }, "UpperDentalArchStructure": { "39481002": ("Upper dental arch structure (body structure)", []) }, "UpperEyelid": {"38934000": ("Upper Eyelid", [4209, 8134])}, "UpperEyelidStructure": { "38934000": ("Upper eyelid structure (body structure)", []) }, "UpperGastroIntestinalTract": { "62834003": ("Upper gastro-intestinal tract", [7482, 7483, 8134]) }, "UpperGastrointestinalTractStructure": { "62834003": ("Upper gastrointestinal tract structure (body structure)", []) }, "UpperInnerQuadrantOfBreast": { "77831004": ( "Upper inner quadrant of breast", [4, 6020, 6021, 7151, 7192, 8134, 9514], ) }, "UpperJugularLymphNode": {"245321008": ("upper jugular lymph node", [7600, 8134])}, "UpperLimb": { "53120007": ("Upper limb", [4, 4009, 4030, 4031, 4042, 7151, 7192, 8134, 9514]) }, "UpperLimbLymphNode": {"44914007": ("upper limb lymph node", [7600, 8134])}, "UpperLimbLymphNodeStructure": { "44914007": ("Upper limb lymph node structure (body structure)", []) }, "UpperLimbStructure": {"53120007": ("Upper limb structure (body structure)", [])}, "UpperLimitOfReferenceRange": { "371933006": ("Upper limit of reference range (qualifier value)", []) }, "UpperLobeOfLung": { "45653009": ( "Upper lobe of lung", [6124, 6126, 6170, 7151, 7155, 7192, 8134, 9514], ) }, "UpperOuterQuadrantOfBreast": { "76365002": ( "Upper outer quadrant of breast", [4, 6020, 6021, 7151, 7192, 8134, 9514], ) }, "UpperParatrachealLymphNode": { "127927006": ("upper paratracheal lymph node (mediastinal)", [7600, 8134]) }, "UpperParatrachealLymphNodeMediastinal": { "127927006": ( "Upper paratracheal lymph node (mediastinal) (body structure)", [], ) }, "UpperUrinaryTract": { "431491007": ( "Upper urinary tract", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 8134, 9514], ) }, "UpperZoneOfLung": {"281392002": ("Upper zone of lung", [6124, 6126, 6171])}, "UpwardGaze": {"255533007": ("Upward gaze", [4201])}, "UralBlackPiedCattleBreed": {"133556007": ("Ural Black Pied cattle breed", [7480])}, "Ureter": { "87953007": ("Ureter", [4009, 4030, 4031, 4040, 4042, 7151, 7192, 9514]) }, "UreteralStent": {"286558002": ("Ureteral stent", [6202, 6203])}, "UretericStent": {"286558002": ("Ureteric stent", [6102, 6138, 6404, 7151, 7193])}, "UretericStructure": {"87953007": ("Ureteric structure (body structure)", [])}, "Urethan": {"873008": ("Urethan (substance)", [])}, "Urethane": {"873008": ("Urethane (ethyl carbamate)", [623, 625])}, "Urethra": { "13648007": ( "Urethra", [4009, 4030, 4031, 4042, 7151, 7192, 7482, 7483, 8134, 9514], ) }, "UrethralCatheter": {"34759008": ("Urethral catheter", [6202, 6203])}, "UrethralCatheterDevice": { "34759008": ("Urethral catheter, device (physical object)", []) }, "UrethralStructure": {"13648007": ("Urethral structure (body structure)", [])}, "Urgency": {"103391001": ("Urgency (qualifier value)", [])}, "UrgentProcedure": {"103391001": ("Urgent Procedure", [3414])}, "UricAcid": {"1710001": ("Uric Acid", [300])}, "UrinaryBladderAndUrethraCombinedSite": { "110837003": ( "Urinary bladder and urethra (combined site) (body structure)", [], ) }, "UrinaryBladderStructure": { "89837001": ("Urinary bladder structure (body structure)", []) }, "UrinarySystem": {"122489005": ("Urinary system", [7151, 7154, 7192, 8134, 9514])}, "UrinarySystemStructure": { "122489005": ("Urinary system structure (body structure)", []) }, "UrinaryTract": {"431938005": ("Urinary tract", [7482, 7483, 8134])}, "Urine": {"78014005": ("Urine", [7151, 7197])}, "Urokinase": {"59082006": ("Urokinase (substance)", [])}, "UrokinasePreparation": {"59082006": ("Urokinase preparation", [10])}, "Urology": {"309995005": ("Urology", [7030])}, "UrologyDepartment": {"309995005": ("Urology department (environment)", [])}, "UrostomyBag": {"344088002": ("Urostomy bag", [6202, 6203])}, "UrostomySet": {"344575009": ("Urostomy set (physical object)", [])}, "UrzhumPigBreed": {"132111003": ("Urzhum pig breed", [7480])}, "UsesEquipment": {"116682006": ("Uses equipment (attribute)", [])}, "UsingSubstance": {"424361007": ("Using substance (attribute)", [])}, "UterineArtery": { "91079009": ( "Uterine Artery", [3827, 7151, 7192, 8134, 9514, 12103, 12111, 12125, 12140], ) }, "UterineLeiomyoma": {"95315005": ("Uterine leiomyoma (disorder)", [])}, "UterineParacervicalLymphNode": { "5394000": ("uterine paracervical lymph node", [7600, 8134]) }, "UterineStructure": {"35039007": ("Uterine structure (body structure)", [])}, "UterineVein": {"60028002": ("Uterine Vein", [12140])}, "Uterus": { "35039007": ( "Uterus", [ 4, 645, 4030, 6202, 6204, 7151, 7160, 7192, 8134, 9514, 10044, 10060, 12023, ], ) }, "UterusAndFallopianTubes": { "110639002": ( "Uterus and fallopian tubes", [4, 4009, 4030, 4031, 4040, 4042, 7151, 7192, 8134, 9514], ) }, "UterusAndFallopianTubesCombinedSite": { "110639002": ("Uterus and fallopian tubes (combined site) (body structure)", []) }, "Uvula": {"26140008": ("uvula", [7601, 8134])}, "UvulaPalatinaStructure": { "26140008": ("Uvula palatina structure (body structure)", []) }, "UzbekBlackGoatBreed": {"131643004": ("Uzbek Black goat breed", [7480])}, "UzunyaylaHorseBreed": {"131959001": ("Uzunyayla horse breed", [7480])}, "VagalStimulation": {"128968000": ("Vagal stimulation", [91, 3271])}, "VagalStimulationPhysiologicChallenge": { "128968000": ("Vagal stimulation physiologic challenge (procedure)", []) }, "Vagina": {"76784001": ("Vagina", [7151, 7160, 7192, 8134, 9514])}, "VaginalApproach": {"54300008": ("Vaginal approach (qualifier value)", [])}, "VaginalIntroitus": {"18857001": ("Vaginal introitus", [4029, 8134])}, "VaginalIntroitusStructure": { "18857001": ("Vaginal introitus structure (body structure)", []) }, "VaginalRoute": {"16857009": ("Vaginal route", [11])}, "VaginalStructure": {"76784001": ("Vaginal structure (body structure)", [])}, "VagusNerve": { "88882009": ("Vagus nerve", [7151, 7167, 7192, 7706, 7710, 8134, 9514]) }, "VagusNerveStructure": {"88882009": ("Vagus nerve structure (body structure)", [])}, "Valdini": {"399330007": ("Valdini", [4012])}, "ValdiniProjection": {"399330007": ("Valdini projection (qualifier value)", [])}, "ValdresCattleBreed": {"133557003": ("Valdres cattle breed", [7480])}, "ValsalvaManeuver": { "261039008": ("Valsalva maneuver", [91, 3271, 3823, 9272, 12002]) }, "ValvularEndocarditis": {"89736004": ("Valvular endocarditis", [3711])}, "ValvularHeartDisease": {"368009": ("Valvular heart disease", [3201, 3727, 12246])}, "VanGiesonStain": {"406957003": ("Van Gieson stain", [8112])}, "VanRosenProjection": {"260506009": ("Van Rosen projection", [4012])}, "Vancomycin": {"372735009": ("Vancomycin (substance)", [])}, "VancomycinAntibiotic": {"372735009": ("Vancomycin antibiotic", [621, 622])}, "VaricoseAneurysm": {"57754000": ("varicose aneurysm", [3808])}, "VasDeferens": {"57671007": ("Vas deferens", [7151, 7160, 7192, 8134, 9514])}, "VasDeferensStructure": { "57671007": ("Vas deferens structure (body structure)", []) }, "VascularCalcification": { "237897009": ("Vascular Calcification", [3491, 3495, 3496, 3497, 7111]) }, "VascularCalcificationRadiographicFinding": { "129759000": ("Vascular calcification", [6010, 6011]) }, "VascularCoiling": {"416061003": ("vascular coiling", [3810])}, "VascularConstrictionFunction": { "32318003": ("Vascular constriction, function (observable entity)", []) }, "VascularDilatationFunction": { "30017007": ("Vascular dilatation, function (observable entity)", []) }, "VascularEndothelialGrowthFactor": { "417324009": ("Vascular endothelial growth factor", [638, 642]) }, "VascularFlowFunction": { "58190003": ("Vascular flow, function (observable entity)", []) }, "VascularGraft": {"312288001": ("Vascular graft (morphologic abnormality)", [])}, "VascularMRI": {"241663008": ("vascular MRI", [3820])}, "VascularResistance": {"251271006": ("Vascular Resistance", [12304])}, "VascularResistanceFunction": {"88619007": ("Vascular Resistance", [3641])}, "VascularSclerosis": { "107671003": ("vascular sclerosis", [3810, 7151, 7156, 7192, 8134, 9514]) }, "VascularStentCrossSectionalArea": { "408705002": ("Vascular stent cross sectional area (observable entity)", []) }, "VascularStentDiameter": { "408706001": ("Vascular stent diameter (observable entity)", []) }, "VascularStentLength": { "408703009": ("Vascular stent length (observable entity)", []) }, "VascularStentVolume": { "408704003": ("Vascular stent volume (observable entity)", []) }, "VascularStructureOfHead": { "281231009": ("Vascular structure of head (body structure)", []) }, "VascularStructureOfKidney": { "303402001": ("Vascular structure of kidney (body structure)", []) }, "VascularSurgery": {"309996006": ("Vascular Surgery", [7030])}, "VascularSurgeryDepartment": { "309996006": ("Vascular surgery department (environment)", []) }, "VascularWallDegeneration": {"33593002": ("vascular wall degeneration", [3817])}, "Vasculitis": {"31996006": ("vasculitis", [3805, 3815])}, "Vasoconstriction": {"32318003": ("Vasoconstriction", [9])}, "Vasoconstrictor": {"372881000": ("Vasoconstrictor (substance)", [])}, "Vasodilatation": {"30017007": ("Vasodilatation", [9])}, "Vasodilator": {"372787008": ("Vasodilator", [10, 621, 622])}, "Vasopressor": {"870406003": ("Vasoconstrictor", [621, 622])}, "VasovagalSyncope": {"398665005": ("Vasovagal syncope", [6062])}, "VaynolCattleBreed": {"133558008": ("Vaynol cattle breed", [7480])}, "Vein": { "29092000": ( "Vein", [3010, 3496, 3607, 3630, 4042, 7111, 7151, 7166, 7191, 7192, 8134, 9514], ) }, "VenaAnonyma": {"371951007": ("Vena anonyma (body structure)", [])}, "VenaCava": {"35532006": ("Vena cava", [4, 3010, 4042, 7151, 7192, 8134, 9514])}, "VenaCavaFilter": { "257409000": ("Vena cava filter", [6102, 6138, 6202, 6203, 6404, 7151, 7193]) }, "VenaCavalStructure": {"35532006": ("Vena caval structure (body structure)", [])}, "VenaContracta": {"443501007": ("Vena Contracta", [12280])}, "VendéenSheepBreed": {"131914009": ("Vendéen sheep breed", [7480])}, "VenezuelanBlackPigBreed": {"132167006": ("Venezuelan Black pig breed", [7480])}, "VenezuelanZebuCattleBreed": { "133672008": ("Venezuelan Zebu cattle breed", [7480]) }, "Venipuncture": {"22778000": ("Venipuncture", [8109])}, "VenousGraftToCitedSegment": { "128951004": ("Venous graft to cited segment (substance)", []) }, "VenousHemangioma": { "56468002": ("Venous hemangioma (morphologic abnormality)", []) }, "VenousNetwork": { "34340008": ("Venous network", [4, 3010, 4042, 7151, 7192, 8134, 9514]) }, "VenousStructure": {"29092000": ("Venous structure (body structure)", [])}, "Ventral20DegreeRostralDorsocaudalOblique": { "442721003": ("Ventral 20 degree rostral-dorsocaudal oblique", [7484]) }, "Ventral20DegreeRostralDorsocaudalObliqueProjection": { "442721003": ( "Ventral 20 degree rostral-dorsocaudal oblique projection (qualifier value)", [], ) }, "Ventral30DegreeLeftDorsalRightOblique": { "442589002": ("Ventral 30 degree left-dorsal right oblique", [7484]) }, "Ventral30DegreeLeftDorsalRightObliqueProjection": { "442589002": ( "Ventral 30 degree left-dorsal right oblique projection (qualifier value)", [], ) }, "Ventral30DegreeRightDorsalLeftOblique": { "442587000": ("Ventral 30 degree right-dorsal left oblique", [7484]) }, "Ventral30DegreeRightDorsalLeftObliqueProjection": { "442587000": ( "Ventral 30 degree right-dorsal left oblique projection (qualifier value)", [], ) }, "VentralFuniculus": {"31701002": ("ventral funiculus", [7707, 7710, 8134])}, "VentralFuniculusStructure": { "31701002": ("Ventral funiculus structure (body structure)", []) }, "VentralLeftDorsalRightOblique": { "442590006": ("Ventral left-dorsal right oblique", [7484]) }, "VentralLeftDorsalRightObliqueProjection": { "442590006": ( "Ventral left-dorsal right oblique projection (qualifier value)", [], ) }, "VentralRightDorsalLeftOblique": { "442738004": ("Ventral right-dorsal left oblique", [7484]) }, "VentralRightDorsalLeftObliqueProjection": { "442738004": ( "Ventral right-dorsal left oblique projection (qualifier value)", [], ) }, "Ventricle": { "21814001": ("Ventricle", [4, 6102, 6109, 6113, 6149, 7151, 7192, 8134, 9514]) }, "VentricularAneurysm": {"90539001": ("Ventricular Aneurysm", [3704])}, "VentricularArrhythmia": {"44103008": ("ventricular arrhythmia", [3826])}, "VentricularBigeminy": {"11157007": ("Ventricular bigeminy", [3234])}, "VentricularEffectiveRefractoryPeriod": { "129088006": ("Ventricular effective refractory period (observable entity)", []) }, "VentricularEffectiveRefractoryPeriodEvaluationOf": { "129088006": ("Ventricular Effective Refractory Period, evaluation of", [3254]) }, "VentricularEjection": {"444371003": ("Ventricular Ejection", [12233])}, "VentricularEjectionSWave": { "444371003": ("Ventricular Ejection (S-wave)", [12307]) }, "VentricularFibrillation": {"71908006": ("Ventricular fibrillation", [3230, 3700])}, "VentricularIsovolumicContraction": { "444379001": ("Ventricular Isovolumic Contraction", [12233, 12307]) }, "VentricularIsovolumicRelaxation": { "444361000": ("Ventricular Isovolumic Relaxation", [12233, 12307]) }, "VentricularPacing": {"344994008": ("ventricular pacing", [3555])}, "VentricularPreExcitation": {"195060002": ("Ventricular pre-excitation", [3230])}, "VentricularPrematureBeats": { "17338001": ("Ventricular premature beats (disorder)", []) }, "VentricularPrematureComplex": { "251175005": ("Ventricular premature complex (disorder)", []) }, "VentricularPrematureContraction": { "251175005": ("Ventricular premature contraction", [3230]) }, "VentricularSeptalDefect": { "30288003": ( "Ventricular Septal defect", [3610, 3630, 3700, 3728, 12236, 12244, 12248, 12249, 12286], ) }, "VentricularSeptalDefectDeviceClosure": { "89814007": ("Ventricular septal defect device closure", [12247]) }, "VentricularSystole": {"8997002": ("Ventricular Systole", [12233])}, "VentricularSystoleFunction": { "8997002": ("Ventricular systole, function (observable entity)", []) }, "VentricularTachycardia": { "25569003": ("Ventricular tachycardia", [3230, 3234, 3700]) }, "VentricularTachycardiaPolymorphic": { "251159007": ("Ventricular tachycardia, polymorphic", [3234]) }, "VentricularVein": { "195328002": ("Ventricular Vein", [3827, 3839, 7151, 7192, 9514]) }, "VentroDorsal": {"442441009": ("Ventro-dorsal", [7484])}, "VentroDorsalProjection": { "442441009": ("Ventro-dorsal projection (qualifier value)", []) }, "VentrorostralDorsocaudalOblique": { "442741008": ("Ventrorostral-dorsocaudal oblique", [7484]) }, "VentrorostralDorsocaudalObliqueProjection": { "442741008": ( "Ventrorostral-dorsocaudal oblique projection (qualifier value)", [], ) }, "Verapamil": {"47898004": ("Verapamil", [10])}, "VerataGoatBreed": {"131629009": ("Verata goat breed", [7480])}, "VerhoeffHematoxylinStain": {"406992006": ("verhoeff's hematoxylin stain", [8112])}, "VerinesaCattleBreed": {"133559000": ("Verinesa cattle breed", [7480])}, "Vertebra": {"51282000": ("Vertebra", [6102, 6109, 6114, 7151, 7192, 9514])}, "VertebralArtery": { "85234005": ( "Vertebral artery", [ 4, 3010, 3604, 3606, 3630, 3827, 4042, 6102, 6109, 6117, 7151, 7192, 8134, 9514, 12103, 12104, ], ) }, "VertebralCanal": {"61853006": ("Vertebral canal", [6115, 8134])}, "VertebralColumnAndCranium": { "110517009": ( "Vertebral column and cranium", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "VertebralColumnAndCraniumCombinedSite": { "110517009": ( "Vertebral column and cranium (combined site) (body structure)", [], ) }, "VertebralForamen": {"280734009": ("Vertebral foramen", [6115, 8134])}, "VertexOfHead": {"88986008": ("Vertex of Head", [1000, 1001, 1002, 8134])}, "VertexStructure": {"88986008": ("Vertex structure (body structure)", [])}, "Vertical": {"33096000": ("Vertical", [2, 6121])}, "VerticalLongAxis": {"131185001": ("Vertical Long Axis", [26, 27, 501])}, "VerticalOccipitalFasciculus": { "80434005": ("vertical occipital fasciculus", [7703, 7710, 8134]) }, "Verticosubmental": {"399360002": ("verticosubmental", [501, 4010])}, "VerticosubmentalProjection": { "399360002": ("Verticosubmental projection (qualifier value)", []) }, "VeryHigh": {"260360000": ("Very high (qualifier value)", [])}, "VerzascaBlackGoatBreed": { "131630004": ("Verzasca black goat breed (organism)", []) }, "VerzascaGoatBreed": {"131630004": ("Verzasca goat breed", [7480])}, "VesicularLymphNode": {"360992006": ("vesicular lymph node", [7600, 8134])}, "VesselDepthFromSurface": { "413975003": ("Vessel depth from surface", [12119, 12122]) }, "VesselIntimalCrossSectionalDiameter": { "415814008": ("Vessel Intimal Cross-Sectional Diameter", [12119, 12122]) }, "VesselIntimalDiameter": {"415815009": ("Vessel Intimal Diameter", [12119, 12122])}, "VesselLumenCrossSectionalArea": { "397415007": ("Vessel lumen cross-sectional area", [3482, 12119, 12122]) }, "VesselLumenCrossSectionalAreaIncrease": { "415816005": ( "Vessel lumen cross-sectional area increase (observable entity)", [], ) }, "VesselLumenCrossSectionalDiameterIncrease": { "415817001": ( "Vessel lumen cross-sectional diameter increase (observable entity)", [], ) }, "VesselLumenDiameter": { "397413000": ("Vessel lumen diameter", [3481, 12119, 12122]) }, "VesselOrigin": {"397421006": ("Vessel Origin", [3496, 7111])}, "VesselOutsideDiameter": {"397414006": ("Vessel outside diameter", [12119, 12122])}, "VestibulocochlearNerve": { "8598002": ("vestibulocochlear nerve", [7706, 7710, 8134]) }, "VestibulocochlearNerveStructure": { "8598002": ("Vestibulocochlear nerve structure (body structure)", []) }, "VestlandFjordCattleBreed": {"133281009": ("Vestland Fjord cattle breed", [7480])}, "VestlandRedPolledCattleBreed": { "133282002": ("Vestland Red Polled cattle breed", [7480]) }, "ViaArmVein": {"261459001": ("Via arm vein", [3403, 3746])}, "ViaArtery": {"103387006": ("Via artery", [3403, 3746])}, "ViaBrachialArtery": {"260585005": ("Via brachial artery", [3403, 3746])}, "ViaFemoralArtery": {"260590008": ("Via femoral artery", [3403, 3746])}, "ViaFemoralVein": {"260601006": ("Via femoral vein", [3403, 3746])}, "ViaRadialArtery": {"444850002": ("Via radial artery", [3403, 3746])}, "ViaTracheostomy": {"180640008": ("Via tracheostomy", [617, 618])}, "ViaVein": {"103386002": ("Via vein", [3403, 3746])}, "VianesaCattleBreed": {"133560005": ("Vianesa cattle breed", [7480])}, "VichPigBreed": {"132201003": ("Vich pig breed", [7480])}, "VictoriaBlue4RStain": {"82682000": ("victoria blue 4R stain", [8112])}, "VictoriaBlueBStain": {"22749001": ("victoria blue B stain", [8112])}, "VictoriaCattleBreed": {"133840007": ("Victoria cattle breed (organism)", [])}, "VictoriaXZebuCattleBreed": {"133840007": ("Victoria X zebu cattle breed", [7480])}, "VictorianBulldogge": {"426571006": ("Victorian Bulldogge (organism)", [])}, "VictorianBulldoggeDogBreed": { "426571006": ("Victorian Bulldogge dog breed", [7480]) }, "VideoEEG": {"252738008": ("Video EEG", [3049])}, "VietnamesePigBreed": {"132202005": ("Vietnamese pig breed", [7480])}, "VietnamesePotBelliedPigPigBreed": { "132230005": ("Vietnamese Pot-Bellied Pig pig breed", [7480]) }, "VietnameseYellowCattleBreed": { "131545004": ("Vietnamese Yellow cattle breed", [7480]) }, "VietnameseYorkshirePigBreed": { "132307002": ("Vietnamese Yorkshire pig breed", [7480]) }, "VikingHorse": {"1118004": ("Viking horse (organism)", [])}, "VikingHorseBreed": {"1118004": ("Viking horse breed", [7480])}, "VillardDeLansCattleBreed": {"133561009": ("Villard-de-Lans cattle breed", [7480])}, "VioletOpticalFilter": {"445278001": ("Violet optical filter", [8124])}, "VioletOpticalFilterOfOpticalMicroscope": { "445278001": ( "Violet optical filter of optical microscope (physical object)", [], ) }, "ViralHepatitisTypeB": {"66071002": ("Viral hepatitis type B (disorder)", [])}, "ViralHepatitisTypeC": {"50711007": ("Viral hepatitis type C (disorder)", [])}, "Virus": {"49872002": ("Virus", [637])}, "VisualEstimation": {"258083009": ("Visual estimation", [3627])}, "VitaVetLabMinipigPigBreed": { "132041004": ("Vita Vet Lab Minipig pig breed", [7480]) }, "VitalNewRedStain": {"20230008": ("vital new red stain", [8112])}, "VitalSignsMonitoring": {"304495004": ("Vital signs monitoring", [9577])}, "Vitamin": {"87708000": ("Vitamin", [621, 622])}, "VitellineArteryOfPlacenta": { "256779006": ("Vitelline Artery of Placenta", [12140]) }, "VitellineVeinOfPlacenta": {"256875007": ("Vitelline Vein of Placenta", [12140])}, "VitoriaPigBreed": {"132203000": ("Vitoria pig breed", [7480])}, "Vitreous": {"26386000": ("Vitreous", [4211, 8134])}, "VitreousBodyPart": {"372242005": ("Vitreous body part (body structure)", [])}, "VitreousCavity": {"26386000": ("Vitreous Cavity", [4233])}, "VitreousCavityStructure": { "26386000": ("Vitreous cavity structure (body structure)", []) }, "VitreousOnly": {"372242005": ("Vitreous Only", [4232])}, "VitreousOpacities": {"422061002": ("Vitreous opacities (disorder)", [])}, "VitreousOpacity": {"422061002": ("Vitreous Opacity", [4222])}, "VizslaSuperbreed": {"52105008": ("Vizsla superbreed (organism)", [])}, "VizslaSuperbreedDogBreed": {"52105008": ("Vizsla superbreed dog breed", [7480])}, "VlaamperdHorseBreed": {"133006006": ("Vlaamperd horse breed", [7480])}, "VladimirHeavyDraftHorseBreed": { "133005005": ("Vladimir Heavy Draft horse breed", [7480]) }, "VogelsbergCattleBreed": {"133562002": ("Vogelsberg cattle breed", [7480])}, "Volume": { "118565006": ( "Volume", [218, 3423, 4050, 7469, 7472, 12257, 12258, 12259, 12265, 12271, 12304], ) }, "VolumeProperty": {"118565006": ("Volume (property) (qualifier value)", [])}, "VolumeSupportVentilator": {"371787006": ("Volume Support Ventilator", [3554])}, "VolynskCattleBreed": {"132780000": ("Volynsk cattle breed", [7480])}, "VomerBone": {"87166008": ("Vomer bone", [4028, 7151, 7192, 8134, 9514])}, "VomerBoneStructure": {"87166008": ("Vomer bone structure (body structure)", [])}, "VorderwaldCattleBreed": {"133564001": ("Vorderwald cattle breed", [7480])}, "VoronezhCoachHorseHorseBreed": { "131960006": ("Voronezh Coach Horse horse breed", [7480]) }, "VosgesCattleBreed": {"133589007": ("Vosges cattle breed", [7480])}, "Vulva": {"45292006": ("Vulva", [4, 7151, 7160, 7192, 8134, 9514])}, "VulvalStructure": {"45292006": ("Vulval structure (body structure)", [])}, "VulvalVestibule": {"23213005": ("Vulval vestibule", [4029, 8134])}, "VulvalVestibuleStructure": { "23213005": ("Vulval vestibule structure (body structure)", []) }, "VyatkaHorseBreed": {"133004009": ("Vyatka horse breed", [7480])}, "WagyuCattleBreed": {"133283007": ("Wagyu cattle breed", [7480])}, "WaiChowPigBreed": {"132204006": ("Wai Chow pig breed", [7480])}, "WakwaCattleBreed": {"133683004": ("Wakwa cattle breed", [7480])}, "WalachenschafSheepBreed": {"132856007": ("Walachenschaf sheep breed", [7480])}, "WaldeyerRingStructure": { "17861009": ("Waldeyer's ring structure (body structure)", []) }, "WalerHorseBreed": {"133015004": ("Waler horse breed", [7480])}, "WalkingSurfaceOfRoom": { "709280007": ("Walking surface of room (physical object)", []) }, "Wall": {"224727009": ("Wall", [7151, 7157, 7193, 9505, 9515, 9520, 9573])}, "WallisBlacknosedSheepBreed": { "132699004": ("Wallis Blacknosed Sheep breed", [7480]) }, "WallisCountrySheepBreed": {"132702006": ("Wallis Country Sheep breed", [7480])}, "Walls": {"224727009": ("Walls (physical object)", [])}, "WanzheSpottedChunanSpottedPigBreed": { "132310009": ("Wanzhe Spotted, Chunan Spotted pig breed", [7480]) }, "WanzheSpottedPigBreed": {"132309004": ("Wanzhe Spotted pig breed", [7480])}, "WanzheSpottedWannanSpottedPigBreed": { "132311008": ("Wanzhe Spotted, Wannan Spotted pig breed", [7480]) }, "Warfarin": {"48603004": ("Warfarin", [10])}, "WarmbloodHorseBreed": {"407402001": ("Warmblood horse breed", [7480])}, "WarmerDevice": {"71384000": ("Warmer device", [635])}, "WarmingBlanket": {"421335007": ("Warming blanket", [635])}, "WasteMaterial": {"289925000": ("Waste Material", [7151, 7165, 7196])}, "Water": { "11713004": ("Water", [12, 13, 218, 300, 3850, 6350, 7180, 7469, 11002, 11006]) }, "WaterBagProsthesisForImagingProcedure": { "102323003": ("Water bag prosthesis for imaging procedure", [5]) }, "WaterBagProsthesisForImagingProcedureDevice": { "102323003": ( "Water bag prosthesis for imaging procedure, device (physical object)", [], ) }, "WaterSolubleAnilineBlueStain": { "88625006": ("water soluble aniline blue stain", [8112]) }, "WaterSolubleAnthraceneBrownStain": { "58755002": ("water soluble anthracene brown stain", [8112]) }, "WaterSolubleEosinStain": {"36879007": ("water soluble eosin stain", [8112])}, "WaterSolubleNigrosineStain": { "12119009": ("water soluble nigrosine stain", [8112]) }, "Waters": {"260473000": ("Waters", [4012])}, "Waters35DegreeTiltToRadiographicBaseline": { "260473000": ( "Waters - 35 degree tilt to radiographic baseline (qualifier value)", [], ) }, "WatusiUSACattleBreed": {"131546003": ("Watusi (USA) cattle breed", [7480])}, "WatusiUnitedStatesOfAmericaCattleBreed": { "131546003": ("Watusi (United States of America) cattle breed (organism)", []) }, "Waveform": {"260893003": ("Waveform", [272])}, "WaxolineBlueStain": {"60739006": ("waxoline blue stain", [8112])}, "WaysonStain": {"409549005": ("wayson stain", [8112])}, "WaziriHorseBreed": {"131872001": ("Waziri horse breed", [7480])}, "WaziriSheepBreed": {"131800005": ("Waziri sheep breed", [7480])}, "WeaklyPositive": {"260408008": ("Weakly positive", [3231])}, "Weal": {"247472004": ("Weal", [6062])}, "WedgeMethod": {"128579004": ("Wedge method", [3241])}, "WedgeShape": {"20446002": ("Wedge shape (qualifier value)", [])}, "WedgeShaped": {"20446002": ("Wedge-shaped", [6335, 6339, 6340])}, "WeightBearing": {"87731000": ("Weight bearing", [91])}, "WeightBearingFunctionOfBone": { "87731000": ("Weight bearing function of bone (observable entity)", []) }, "Weimaraner": {"69249004": ("Weimaraner", [7480])}, "WeisseHornloseHeidschnuckeSheepBreed": { "132684004": ("Weisse Hornlose Heidschnucke sheep breed", [7480]) }, "WeleraPonyHorseBreed": {"133003003": ("Welera Pony horse breed", [7480])}, "WellControlled": {"1194003": ("Well controlled", [3770])}, "WellDefined": {"260409000": ("Well defined", [6120])}, "WelshCobHorseBreed": {"131962003": ("Welsh Cob horse breed", [7480])}, "WelshCorgiSuperbreed": {"37024005": ("Welsh corgi superbreed (organism)", [])}, "WelshCorgiSuperbreedDogBreed": { "37024005": ("Welsh corgi superbreed dog breed", [7480]) }, "WelshHillSpeckledFaceSheepBreed": { "131798003": ("Welsh Hill Speckled Face sheep breed", [7480]) }, "WelshMountainBadgerFacedSheepBreed": { "131769002": ("Welsh Mountain Badger Faced sheep breed", [7480]) }, "WelshMountainPonyHorseBreed": { "131963008": ("Welsh Mountain Pony horse breed", [7480]) }, "WelshMountainSheepBreed": {"132798001": ("Welsh Mountain sheep breed", [7480])}, "WelshPig": {"54232006": ("Welsh pig (organism)", [])}, "WelshPigBreed": {"54232006": ("Welsh pig breed", [7480])}, "WelshPonyHorseBreed": {"132744000": ("Welsh Pony horse breed", [7480])}, "WelshPonyOfCobTypeHorseBreed": { "132745004": ("Welsh Pony of Cob Type horse breed", [7480]) }, "WelshSheepdogBreed": {"132588005": ("Welsh Sheepdog breed", [7480])}, "WelshSpringerSpaniel": {"40898002": ("Welsh Springer spaniel (organism)", [])}, "WelshSpringerSpanielDogBreed": { "40898002": ("Welsh Springer spaniel dog breed", [7480]) }, "WelshTerrier": {"49421002": ("Welsh terrier", [7480])}, "WelshWalkingHorse": {"8089006": ("Welsh walking horse (organism)", [])}, "WelshWalkingHorseBreed": {"8089006": ("Welsh walking horse breed", [7480])}, "WenshanCattleBreed": {"131547007": ("Wenshan cattle breed", [7480])}, "WensleydaleSheepBreed": {"131780002": ("Wensleydale sheep breed", [7480])}, "WessexSaddlebackPig": {"73648005": ("Wessex saddleback pig (organism)", [])}, "WessexSaddlebackPigBreed": {"73648005": ("Wessex saddleback pig breed", [7480])}, "WestAfricanBarbHorseBreed": { "132995007": ("West African Barb horse breed", [7480]) }, "WestAfricanDwarfSheepBreed": { "131781003": ("West African Dwarf sheep breed", [7480]) }, "WestAfricanDwarfShorthornCattleBreed": { "133565000": ("West African Dwarf Shorthorn cattle breed", [7480]) }, "WestAfricanPigBreed": {"133185005": ("West African pig breed", [7480])}, "WestFinnishCattleBreed": {"133566004": ("West Finnish cattle breed", [7480])}, "WestFrenchWhitePigBreed": {"132769000": ("West French White pig breed", [7480])}, "WestHighlandWhiteTerrier": {"40727008": ("West Highland white terrier", [7480])}, "WestMacedonianCattleBreed": { "133567008": ("West Macedonian cattle breed", [7480]) }, "WestPoint": {"399130002": ("West Point", [4012])}, "WestPointProjection": { "399130002": ("West Point projection (qualifier value)", []) }, "WestSiberianLaikaDogBreed": { "132396004": ("West Siberian Laika dog breed", [7480]) }, "WesternSudanPonyHorseBreed": { "133002008": ("Western Sudan Pony horse breed", [7480]) }, "WestphalianHorse": {"25369002": ("Westphalian horse (organism)", [])}, "WestphalianHorseBreed": {"25369002": ("Westphalian horse breed", [7480])}, "WestrainPigBreed": {"132049002": ("Westrain pig breed", [7480])}, "WhippetDog": {"76351004": ("Whippet dog", [7480])}, "White": {"371251000": ("White", [4255, 4411])}, "WhiteBullTerrier": {"42902003": ("White bull terrier (organism)", [])}, "WhiteBullTerrierDogBreed": {"42902003": ("White bull terrier dog breed", [7480])}, "WhiteColor": {"371251000": ("White color", [6067])}, "WhiteCáceresCattleBreed": {"133284001": ("White Cáceres cattle breed", [7480])}, "WhiteFulaniCattleBreed": {"133684005": ("White Fulani cattle breed", [7480])}, "WhiteGallowayCattleBreed": {"133569006": ("White Galloway cattle breed", [7480])}, "WhiteMatter": {"389080008": ("White Matter", [7151, 7153, 7192, 8134, 9514])}, "WhiteMatterOfBrainAndSpinalCord": { "389080008": ("White matter of brain and spinal cord", [7710]) }, "WhiteMatterStructureOfBrainAndSpinalCord": { "389080008": ( "White matter structure of brain and spinal cord (body structure)", [], ) }, "WhiteParkCattleBreed": {"26525003": ("White Park cattle breed (organism)", [])}, "WhiteParkCowBreed": {"26525003": ("White Park cow breed", [7480])}, "WhiteShepherdDogBreed": {"132458004": ("White Shepherd dog breed", [7480])}, "WhiteSuffolkSheepBreed": {"131782005": ("White Suffolk sheep breed", [7480])}, "WhiteWelshCattleBreed": {"133570007": ("White Welsh cattle breed", [7480])}, "WhitebredShorthornCattleBreed": { "133568003": ("Whitebred Shorthorn cattle breed", [7480]) }, "WhitefaceDartmoorSheepBreed": { "131783000": ("Whiteface Dartmoor sheep breed", [7480]) }, "WhitefaceWoodlandSheepBreed": { "131784006": ("Whiteface Woodland sheep breed", [7480]) }, "Width": {"103355008": ("Width", [218, 6165, 7469, 7470])}, "WielkopolskiHorseBreed": {"132741008": ("Wielkopolski horse breed", [7480])}, "WigbyTaylor": {"399215000": ("Wigby-Taylor", [4012])}, "WigbyTaylorProjection": { "399215000": ("Wigby-Taylor projection (qualifier value)", []) }, "WiltshireHornSheep": {"39855006": ("Wiltshire horn sheep (organism)", [])}, "WiltshireHornSheepBreed": {"39855006": ("Wiltshire horn sheep breed", [7480])}, "WiltshirePigBreed": {"132207004": ("Wiltshire pig breed", [7480])}, "WindsnyerPigBreed": {"133188007": ("Windsnyer pig breed", [7480])}, "Wing": {"53036007": ("Wing", [7482, 7483, 8134])}, "WingStructure": {"53036007": ("Wing structure (body structure)", [])}, "WireFoxTerrier": {"41584008": ("Wire fox terrier (organism)", [])}, "WireFoxTerrierDogBreed": {"41584008": ("Wire fox terrier dog breed", [7480])}, "WirehairStyrianMountainDogBreed": { "132459007": ("Wirehair Styrian mountain dog breed", [7480]) }, "WirehairedMiniatureDachshund": { "56243001": ("Wirehaired miniature dachshund (organism)", []) }, "WirehairedMiniatureDachshundDogBreed": { "56243001": ("Wirehaired miniature dachshund dog breed", [7480]) }, "WirehairedPointingGriffonDog": { "33401005": ("Wirehaired pointing griffon dog", [7480]) }, "WirehairedStandardDachshund": { "36274006": ("Wirehaired standard dachshund (organism)", []) }, "WirehairedStandardDachshundDogBreed": { "36274006": ("Wirehaired standard dachshund dog breed", [7480]) }, "WirehairedVizsla": {"583000": ("Wirehaired vizsla (organism)", [])}, "WirehairedVizslaDogBreed": {"583000": ("Wirehaired vizsla dog breed", [7480])}, "WithinNormalLimits": {"125112009": ("Within normal limits", [4254])}, "WitrikCattleBreed": {"133571006": ("Witrik cattle breed", [7480])}, "WokalupCattleBreed": {"133841006": ("Wokalup cattle breed (organism)", [])}, "WokalupXZebuCattleBreed": {"133841006": ("Wokalup X zebu cattle breed", [7480])}, "Wolf": {"82676003": ("Wolf", [7480])}, "WolfProjection": {"422996004": ("Wolf", [4012])}, "WoodenLegGoatBreed": {"131673008": ("Wooden Leg goat breed", [7480])}, "WrightStain": {"373682001": ("wright stain", [8112])}, "WristJoint": { "74670003": ( "Wrist joint", [4, 1000, 1001, 1006, 4009, 4030, 4031, 4042, 7151, 7192, 7304, 8134, 9514], ) }, "WristJointStructure": {"74670003": ("Wrist joint structure (body structure)", [])}, "WristRegionStructure": { "8205005": ("Wrist region structure (body structure)", []) }, "WujinPigBreed": {"132151000": ("Wujin pig breed", [7480])}, "WurttembergHorseBreed": {"131965001": ("Wurttemberg horse breed", [7480])}, "WuyiBlackPigBreed": {"132304009": ("Wuyi Black pig breed", [7480])}, "WuzhishanPigBreed": {"132222009": ("Wuzhishan pig breed", [7480])}, "XRayFilmCassetteManual": { "466556008": ("X-Ray film cassette, manual", [9268, 9271]) }, "XRayShield": {"65577000": ("X-Ray shield", [10066])}, "XRayShieldDevice": {"65577000": ("X-Ray shield, device (physical object)", [])}, "Xenon": {"83598005": ("Xenon", [13])}, "Xenon133Gas": {"780783002": ("Xenon^133^ gas", [25])}, "XenonArcLamp": {"445671003": ("Xenon arc lamp", [8125])}, "XenonArcLampMicroscopeIlluminator": { "445671003": ("Xenon arc lamp microscope illuminator (physical object)", []) }, "XiangPigBreed": {"132291006": ("Xiang pig breed", [7480])}, "XiangxiBlackPigBreed": {"132314000": ("Xiangxi Black pig breed", [7480])}, "XilingolHorseBreed": {"131966000": ("Xilingol horse breed", [7480])}, "XinjiangBrownCattleBreed": {"133285000": ("Xinjiang Brown cattle breed", [7480])}, "XinjiangFinewoolSheepBreed": { "131785007": ("Xinjiang Finewool sheep breed", [7480]) }, "XinjiangWhitePigBreed": {"132341005": ("Xinjiang White pig breed", [7480])}, "XinjinJilinBlackPigBreed": { "132325009": ("Xinjin, Jilin Black pig breed", [7480]) }, "XinjinNingAnPigBreed": {"132326005": ("Xinjin, Ning-an pig breed", [7480])}, "XinjinPigBreed": {"132324008": ("Xinjin pig breed", [7480])}, "XinjinXinjinPigBreed": {"132329003": ("Xinjin, Xinjin pig breed", [7480])}, "XiphoidProcess": {"20298003": ("Xiphoid Process", [1000, 1001, 1004])}, "XiphoidProcessOfSternum": { "20298003": ("Xiphoid process of sternum", [6115, 8134]) }, "Xylazine": {"96230006": ("Xylazine", [623, 625])}, "XylazineHydrochloride": {"96230006": ("Xylazine hydrochloride (substance)", [])}, "XyleneCyanolFFStain": {"55831004": ("xylene cyanol FF stain", [8112])}, "YacumentoCattleBreed": {"133572004": ("Yacumento cattle breed", [7480])}, "YakutCattleBreed": {"131548002": ("Yakut cattle breed", [7480])}, "YakutHorseBreed": {"133000000": ("Yakut horse breed", [7480])}, "YananPigBreed": {"132153002": ("Yanan pig breed", [7480])}, "YanbianCattleBreed": {"133286004": ("Yanbian cattle breed", [7480])}, "YanqiHorseBreed": {"131967009": ("Yanqi horse breed", [7480])}, "YaroslavlCattleBreed": {"133573009": ("Yaroslavl cattle breed", [7480])}, "Yellow": {"371244009": ("Yellow", [4255, 4411])}, "YellowColor": {"371244009": ("Yellow color", [6067])}, "YellowGreenOpticalFilter": {"445340000": ("Yellow-green optical filter", [4204])}, "YellowGreenOpticalFilterOfOpticalMicroscope": { "445340000": ( "Yellow-green optical filter of optical microscope (physical object)", [], ) }, "YemeniHorsesHorseBreed": {"131968004": ("Yemeni Horses horse breed", [7480])}, "YemeniZebuCattleBreed": {"133685006": ("Yemeni Zebu cattle breed", [7480])}, "Yes": {"373066001": ("Yes", [230, 231, 10072])}, "YiliHorseBreed": {"131969007": ("Yili horse breed", [7480])}, "YiliWhitePigBreed": {"132340006": ("Yili White pig breed", [7480])}, "YimengBlackPigBreed": {"132138005": ("Yimeng Black pig breed", [7480])}, "YiwuHorseBreed": {"131970008": ("Yiwu horse breed", [7480])}, "YonaguniHorseBreed": {"132999001": ("Yonaguni horse breed", [7480])}, "YorkshireBlueAndWhitePigBreed": { "132205007": ("Yorkshire Blue and White pig breed", [7480]) }, "YorkshireCoachHorse": {"31633003": ("Yorkshire coach horse (organism)", [])}, "YorkshireCoachHorseBreed": {"31633003": ("Yorkshire coach horse breed", [7480])}, "YorkshirePig": {"85315007": ("Yorkshire pig (organism)", [])}, "YorkshirePigBreed": {"85315007": ("Yorkshire pig breed", [7480])}, "YorkshireTerrier": {"13284009": ("Yorkshire terrier", [7480])}, "Yttrium": {"63754004": ("Yttrium", [300])}, "Yttrium90Microspheres": {"764678003": ("Yttrium^90^ microspheres", [25])}, "Yttrium90Microspheres_Inactive": { "409105003": ("Yttrium-90 microspheres (product)", []) }, "YucaPig": {"15443006": ("Yuca pig (organism)", [])}, "YucaPigBreed": {"15443006": ("Yuca pig breed", [7480])}, "YucatanMinaturePigBreed": {"132226007": ("Yucatan Minature pig breed", [7480])}, "YucatanMiniaturePigBreed": { "132226007": ("Yucatan Miniature pig breed (organism)", []) }, "YuedongBlackPigBreed": {"132290007": ("Yuedong Black pig breed", [7480])}, "YugoslavianHoundDogBreed": {"132460002": ("Yugoslavian Hound dog breed", [7480])}, "YujiangPigBreed": {"132308007": ("Yujiang pig breed", [7480])}, "YunnanHorseBreed": {"131971007": ("Yunnan horse breed", [7480])}, "YunnanZebuCattleBreed": {"131549005": ("Yunnan Zebu cattle breed", [7480])}, "YurinoCattleBreed": {"133574003": ("Yurino cattle breed", [7480])}, "ZambiaAngoniCattleBreed": {"131550005": ("Zambia Angoni cattle breed", [7480])}, "Zanelli": {"399026003": ("Zanelli", [4012])}, "ZanelliProjection": {"399026003": ("Zanelli projection (qualifier value)", [])}, "ZanzibarZebuCattleBreed": {"133630007": ("Zanzibar Zebu cattle breed", [7480])}, "ZaobeiCattleBreed": {"133287008": ("Zaobei cattle breed", [7480])}, "ZavotCattleBreed": {"133288003": ("Zavot cattle breed", [7480])}, "ZenkerFixative": {"433473008": ("Zenker fixative (substance)", [])}, "ZenkerFluid": {"433473008": ("Zenker's fluid", [8114])}, "ZhemaichuHorseBreed": {"132998009": ("Zhemaichu horse breed", [7480])}, "ZhongweiGoatBreed": {"131644005": ("Zhongwei goat breed", [7480])}, "ZiehlNeelsenStain": {"255813003": ("Ziehl-Neelsen stain", [8112])}, "ZlotnikiSpottedPigBreed": {"132259005": ("Zlotniki Spotted pig breed", [7480])}, "ZlotnikiWhitePigBreed": {"132260000": ("Zlotniki White pig breed", [7480])}, "ZnamenskCattleBreed": {"133289006": ("Znamensk cattle breed", [7480])}, "Zolazepam": {"96227004": ("Zolazepam", [623, 625])}, "ZolazepamHydrochloride": {"96227004": ("Zolazepam hydrochloride (substance)", [])}, "Zygoma": { "13881006": ( "Zygoma", [4, 4009, 4028, 4030, 4031, 4042, 7151, 7192, 8134, 9514], ) }, "ZygomaticBoneStructure": { "13881006": ("Zygomatic bone structure (body structure)", []) }, "_0NoPerfusion": {"371867000": ("0: No Perfusion", [3713])}, "_103Palladium": {"9351000": ("^103^Palladium", [9528])}, "_106Ruthenium": {"8227001": ("^106^Ruthenium", [9528])}, "_10OClockPosition": {"129781005": ("10 o'clock position", [6018, 6019, 6205])}, "_10OClockPositionOnMammogram": { "129781005": ("10 o'clock position on mammogram (finding)", []) }, "_10thPercentileValueOfPopulation": { "371890005": ("10th Percentile Value of population", [221, 226, 7465]) }, "_111Indium": {"56609000": ("^111^Indium", [18])}, "_113mIndium": {"48895003": ("^113m^Indium", [18])}, "_11Carbon": {"40565003": ("^11^Carbon", [4020])}, "_11OClockPosition": {"129782003": ("11 o'clock position", [6018, 6019, 6205])}, "_11OClockPositionOnMammogram": { "129782003": ("11 o'clock position on mammogram (finding)", []) }, "_123Iodine": {"21572004": ("^123^Iodine", [18])}, "_124Iodine": {"40937006": ("^124^Iodine", [4020])}, "_125Iodine": {"68630002": ("^125^Iodine", [18, 9528])}, "_127Xenon": {"27081007": ("^127^Xenon", [18])}, "_12LeadECG": {"268400002": ("12-Lead ECG", [3670])}, "_12LeadElectrocardiogram": { "268400002": ("12 lead electrocardiogram (procedure)", []) }, "_12OClockPosition": {"129783008": ("12 o'clock position", [6018, 6019, 6205])}, "_12OClockPositionOnMammogram": { "129783008": ("12 o'clock position on mammogram (finding)", []) }, "_131Cesium": {"13237009": ("^131^Cesium", [9528])}, "_131Iodine": {"1368003": ("^131^Iodine", [18])}, "_133Barium": {"3027009": ("^133^Barium", [18])}, "_133Xenon": {"80751004": ("^133^Xenon", [18])}, "_137Cesium": {"55117002": ("^137^Cesium", [9528])}, "_13Nitrogen": {"21576001": ("^13^Nitrogen", [3107, 4020])}, "_14Carbon": {"71647005": ("^14^Carbon", [18])}, "_14Oxygen": {"424875009": ("^14^Oxygen", [4020])}, "_153Gadolinium": {"14529005": ("^153^Gadolinium", [18])}, "_153Samarium": {"419804008": ("^153^Samarium", [18])}, "_15LeadECG": {"429163003": ("15-Lead ECG", [3670])}, "_15LeadElectrocardiographicMonitoring": { "429163003": ("15 lead electrocardiographic monitoring (procedure)", []) }, "_15Oxygen": {"129504001": ("^15^Oxygen", [4020])}, "_169Ytterbium": {"41758004": ("^169^Ytterbium", [18, 9528])}, "_177Lutetium": {"447553000": ("^177^Lutetium", [18])}, "_178Tantalum": {"6301006": ("^178^Tantalum", [18])}, "_186Rhenium": {"395865006": ("^186^Rhenium", [18])}, "_188Rhenium": {"423578007": ("^188^Rhenium", [18])}, "_18FFluoroethylflumazenil": { "422975006": ("[(18)F]fluoroethylflumazenil (product)", []) }, "_18Fluorine": {"77004003": ("^18^Fluorine", [18, 4020])}, "_18LeadECG": {"425808002": ("18-Lead ECG", [3670])}, "_18LeadElectrocardiographicMonitoring": { "425808002": ("18 lead electrocardiographic monitoring (procedure)", []) }, "_192Iridium": {"48341001": ("^192^Iridium", [9528])}, "_198Gold": {"24301009": ("^198^Gold", [18, 9528])}, "_199Gold": {"70544003": ("^199^Gold", [18])}, "_1OClockPosition": {"129772004": ("1 o'clock position", [6018, 6019, 6205])}, "_1OClockPositionOnMammogram": { "129772004": ("1 o'clock position on mammogram (finding)", []) }, "_1PenetrationWithoutPerfusion": { "371866009": ("1: Penetration without Perfusion", [3713]) }, "_1Phenylpropan2Amine": {"703842006": ("1-phenylpropan-2-amine (substance)", [])}, "_1SigmaLowerValueOfPopulation": { "371919006": ("1 Sigma Lower Value of population", [221, 226, 7465]) }, "_1SigmaUpperValueOfPopulation": { "371917008": ("1 Sigma Upper Value of population", [221, 226, 7465]) }, "_1stDiagonalCoronaryArtery": { "91750005": ( "1st Diagonal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_1stLeftPosterolateralCoronaryArtery": { "91757008": ( "1st Left Posterolateral Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_1stMarginalCoronaryArtery": { "91754001": ( "1st Marginal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_1stRightPosterolateralCoronaryArtery": { "91761002": ( "1st Right posterolateral Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_1stSeptalCoronaryArtery": { "244251006": ( "1st Septal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_201Thallium": {"60057003": ("^201^Thallium", [18])}, "_203Lead": {"47588004": ("^203^Lead", [18])}, "_222Radon": {"51800004": ("^222^Radon", [9528])}, "_223Radium": {"24853006": ("^223^Radium", [18])}, "_226Radium": {"28243009": ("^226^Radium", [9528])}, "_22Sodium": {"71633006": ("^22^Sodium", [18, 4020])}, "_24Sodium": {"58541008": ("^24^Sodium", [18])}, "_252Californium": {"35978008": ("^252^Californium", [9528])}, "_2DMode": {"399064001": ("2D mode", [6058, 12224])}, "_2DModeUltrasound": {"399064001": ("2D mode ultrasound (qualifier value)", [])}, "_2OClockPosition": {"129773009": ("2 o'clock position", [6018, 6019, 6205])}, "_2OClockPositionOnMammogram": { "129773009": ("2 o'clock position on mammogram (finding)", []) }, "_2PartialPerfusion": {"371864007": ("2: Partial Perfusion", [3713])}, "_2SigmaLowerValueOfPopulation": { "371918003": ("2 Sigma Lower Value of population", [221, 226, 7465]) }, "_2SigmaUpperValueOfPopulation": { "371920000": ("2 Sigma Upper Value of population", [221, 226, 7465]) }, "_2ndDiagonalCoronaryArtery": { "91751009": ( "2nd Diagonal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_2ndLeftPosterolateralCoronaryArtery": { "91758003": ( "2nd Left Posterolateral Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_2ndMarginalCoronaryArtery": { "91755000": ( "2nd Marginal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_2ndRightPosterolateralCoronaryArtery": { "91762009": ( "2nd Right posterolateral Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_32Phosphorus": {"32505007": ("^32^Phosphorus", [18, 9528])}, "_38Potassium": {"423764008": ("^38^Potassium", [4020])}, "_3CompletePerfusion": {"371865008": ("3: Complete Perfusion", [3713])}, "_3DMode": {"426865009": ("3D mode", [6058, 12224])}, "_3DModeUltrasound": {"426865009": ("3D mode ultrasound (qualifier value)", [])}, "_3OClockPosition": {"129774003": ("3 o'clock position", [6018, 6019, 6205])}, "_3OClockPositionOnMammogram": { "129774003": ("3 o'clock position on mammogram (finding)", []) }, "_3rdDiagonalCoronaryArtery": { "91752002": ( "3rd diagonal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_3rdLeftPosterolateralCoronaryArtery": { "91759006": ( "3rd Left Posterolateral Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_3rdMarginalCoronaryArtery": { "91756004": ( "3rd Marginal Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_3rdRightPosterolateralCoronaryArtery": { "91763004": ( "3rd Right posterolateral Coronary Artery", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_42Potassium": {"59844004": ("^42^Potassium", [18])}, "_43Potassium": {"8202008": ("^43^Potassium", [18])}, "_45Titanium": {"75696008": ("^45^Titanium", [4020])}, "_4OClockPosition": {"129775002": ("4 o'clock position", [6018, 6019, 6205])}, "_4OClockPositionOnMammogram": { "129775002": ("4 o'clock position on mammogram (finding)", []) }, "_51Chromium": {"52745005": ("^51^Chromium", [18])}, "_52Iron": {"69089000": ("^52^Iron", [4020])}, "_52Manganese": {"37225000": ("^52^Manganese", [4020])}, "_57Cobalt": {"27054007": ("^57^Cobalt", [18])}, "_58Cobalt": {"89272005": ("^58^Cobalt", [18])}, "_59Iron": {"68580003": ("^59^Iron", [18])}, "_5OClockPosition": {"129776001": ("5 o'clock position", [6018, 6019, 6205])}, "_5OClockPositionOnMammogram": { "129776001": ("5 o'clock position on mammogram (finding)", []) }, "_5thPercentileValueOfPopulation": { "371888009": ("5th Percentile Value of population", [221, 226, 7465]) }, "_60Cobalt": {"5405008": ("^60^Cobalt", [18, 9527, 9528])}, "_60Copper": {"425364008": ("^60^Copper", [4020])}, "_61Copper": {"71425003": ("^61^Copper", [4020])}, "_62Copper": {"422934004": ("^62^Copper", [4020])}, "_62Zinc": {"65054007": ("^62^Zinc", [4020])}, "_64Copper": {"3932008": ("^64^Copper", [18, 4020])}, "_66Gallium": {"79477007": ("^66^Gallium", [4020])}, "_67Copper": {"53700003": ("^67^Copper", [18])}, "_67Gallium": {"2008008": ("^67^Gallium", [18])}, "_68Gallium": {"35337001": ("^68^Gallium", [4020])}, "_68Germanium": {"53315004": ("^68^Germanium", [4020])}, "_6OClockPosition": {"129777005": ("6 o'clock position", [6018, 6019, 6205])}, "_6OClockPositionOnMammogram": { "129777005": ("6 o'clock position on mammogram (finding)", []) }, "_72Arsenic": {"2705002": ("^72^Arsenic", [4020])}, "_73Selenium": {"87437000": ("^73^Selenium", [4020])}, "_75Bromine": {"17910003": ("^75^Bromine", [4020])}, "_75Selenium": {"43239002": ("^75^Selenium", [18])}, "_76Bromine": {"79523006": ("^76^Bromine", [4020])}, "_77Bromine": {"86521004": ("^77^Bromine", [4020])}, "_7OClockPosition": {"129778000": ("7 o'clock position", [6018, 6019, 6205])}, "_7OClockPositionOnMammogram": { "129778000": ("7 o'clock position on mammogram (finding)", []) }, "_81mKrypton": {"61716009": ("^81m^Krypton", [18])}, "_82Rubidium": {"79197006": ("^82^Rubidium", [3107, 4020])}, "_85Krypton": {"34127007": ("^85^Krypton", [18])}, "_85Strontium": {"111084009": ("^85^Strontium", [18])}, "_86Yttrium": {"10738001": ("^86^Yttrium", [4020])}, "_87mStrontium": {"78023008": ("^87m^Strontium", [18])}, "_89Strontium": {"7770004": ("^89^Strontium", [18])}, "_89Zirconium": {"63360001": ("^89^Zirconium", [4020])}, "_8OClockPosition": {"129779008": ("8 o'clock position", [6018, 6019, 6205])}, "_8OClockPositionOnMammogram": { "129779008": ("8 o'clock position on mammogram (finding)", []) }, "_90Strontium": {"14071002": ("^90^Strontium", [9528])}, "_90Yttrium": {"14691008": ("^90^Yttrium", [18, 4020, 9528])}, "_90thPercentileValueOfPopulation": { "371887004": ("90th Percentile Value of population", [221, 226, 7465]) }, "_94mTechnetium": {"424079002": ("^94m^Technetium", [4020])}, "_95thPercentileValueOfPopulation": { "371889001": ("95th Percentile Value of population", [221, 226, 7465]) }, "_97Ruthenium": {"23788009": ("^97^Ruthenium", [18])}, "_99mTechnetium": {"72454006": ("^99m^Technetium", [18])}, "_9OClockPosition": {"129780006": ("9 o'clock position", [6018, 6019, 6205])}, "_9OClockPositionOnMammogram": { "129780006": ("9 o'clock position on mammogram (finding)", []) }, "ÍPigBreed": {"132327001": ("Í pig breed", [7480])}, } concepts["NCIt"] = { "Abnormality": {"C9440": ("Abnormality", [6333, 6334])}, "AdLibitum": {"C64636": ("ad libitum", [609])}, "Adjudicator": {"C96561": ("Adjudicator", [7453])}, "BronchioloalveolarAdenocarcinoma": { "C2923": ("Bronchioloalveolar adenocarcinoma", [638, 639]) }, "CardiotonicAgent": {"C78322": ("Cardiotonic agent", [10])}, "Cryoablation": {"C15215": ("Cryoablation", [6320])}, "DCFBCF18": {"C96234": ("DCFBC F^18^", [4021])}, "Dosimetrist": {"C93176": ("Dosimetrist", [9555, 9562])}, "EnhancingLesion": { "C113842": ("Enhancing Lesion", [7151, 7159, 7168, 7169, 7194]) }, "Enrollment": {"C37948": ("Enrollment", [280])}, "Erect": {"C86043": ("erect", [19])}, "ExtraluminalRoute": {"C38213": ("Extraluminal route", [11])}, "Fibrate": {"C98150": ("Fibrate", [3761])}, "FocusedUltrasoundAblation": {"C68681": ("Focused ultrasound ablation", [6320])}, "Image": {"C48179": ("Image", [272])}, "ImagingRegionOfInterest": {"C85402": ("Imaging Region of Interest", [272])}, "IndexLesion": {"C110961": ("Index lesion", [6335, 6336, 6337])}, "IntraepithelialRoute": {"C38244": ("Intraepithelial route", [11])}, "Ion": {"C597": ("Ion", [9526])}, "IrreversibleElectroporation": { "C131483": ("Irreversible electroporation", [6320]) }, "Middle": {"C25569": ("Middle", [211, 212, 3019, 6024, 6025, 12116, 12117, 12281])}, "MouseMammaryFatPad": {"C22550": ("Mouse mammary fat pad", [644, 8134])}, "NativeHawaiianOrOtherPacificIslander": { "C41219": ("Native Hawaiian or other Pacific Islander", [6099]) }, "NoEvidenceOfDisease": {"C40413": ("No Evidence of Disease", [6098])}, "NonEnhancingLesion": { "C81175": ("Non-Enhancing Lesion", [7151, 7159, 7168, 7169, 7194]) }, "PSMA11Ga68": {"C118961": ("PSMA-11 Ga^68^", [4021])}, "PiflufolastatF18": {"C116352": ("Piflufolastat F^18^", [4021])}, "RANO": {"C114879": ("RANO", [6147])}, "Reader": {"C28747": ("Reader", [7453])}, "RecurrentDisease": {"C38155": ("Recurrent Disease", [6098])}, "ReferenceRegion": {"C94970": ("Reference Region", [7151, 7165, 7196, 9000])}, "Reviewer": {"C54634": ("Reviewer", [7453])}, "SarcosineC11": {"C122684": ("Sarcosine C^11^", [4021])}, "SoftTissueSarcomaExcludingRhabdomyosarcoma": { "C148457": ("Soft tissue sarcoma, excluding rhabdomyosarcoma", [638, 639]) }, "Technetium99mTrofolastat": {"C116887": ("Technetium^99m Trofolastat", [25])}, "TransluminalRoute": {"C38306": ("Transluminal route", [11])}, "UnitConversionFactor": {"C70774": ("Unit Conversion Factor", [10069])}, "_166Holmium": {"C1943": ("^166^Holmium", [18])}, "_4kscore": {"C142184": ("4Kscore", [6352])}, } concepts["RXNORM"] = { "MangafodipirTrisodium": {"236987": ("Mangafodipir trisodium", [12, 3850])} } concepts["RADLEX"] = { "ACRCategory1ActionableFinding": { "RID49480": ("ACR Category 1 Actionable Finding", [7035]) }, "ACRCategory2ActionableFinding": { "RID49481": ("ACR Category 2 Actionable Finding", [7035]) }, "ACRCategory3ActionableFinding": { "RID49482": ("ACR Category 3 Actionable Finding", [7035]) }, "BariumSulfateSuspension": {"RID11588": ("Barium sulfate suspension", [6350])}, "BeamHardeningArtifact": {"RID11327": ("Beam-hardening artifact", [6135])}, "ChemicalShiftArtifact": {"RID11374": ("Chemical shift artifact", [6315, 6316])}, "DelayedPhase": {"RID11081": ("Delayed phase", [6335, 6345, 6346])}, "DiagnosticQuality": {"RID12": ("Diagnostic quality", [7036])}, "DiffusionWeightedHypersensitivity": { "RID39536": ("Diffusion-weighted hypersensitivity", [6335, 6343, 6344]) }, "EarlyPhaseWashIn": {"RID49530": ("Early phase wash-in", [6335, 6345, 6346])}, "EndorectalCoil": {"RID10809": ("Endorectal coil", [6349])}, "EnhancementPattern": {"RID6058": ("Enhancement pattern", [6333, 6334])}, "ErasedCharcoalSign": {"RID49497": ("Erased charcoal sign", [6335, 6341, 6342])}, "FerromagneticImplantMagneticSusceptibilityEffect": { "RID11370": ( "Ferromagnetic implant magnetic susceptibility effect", [6315, 6316], ) }, "Ghost": {"RID11426": ("Ghost", [6315, 6316])}, "Heterogeneous": {"RID6060": ("Heterogeneous", [6335, 6343, 6344])}, "Hyperintense": {"RID35805": ("Hyperintense", [6335, 6343, 6344])}, "Hypointense": {"RID35804": ("Hypointense", [6335, 6343, 6344])}, "IonicIodinatedContrastAgent": { "RID11585": ("Ionic iodinated contrast agent", [12, 3850]) }, "Isointense": {"RID6053": ("Isointense", [6335, 6343, 6344])}, "Lenticular": {"RID49495": ("Lenticular", [6335, 6339, 6340])}, "LimitedQuality": {"RID13": ("Limited quality", [7036])}, "MarkedlyHypointense": {"RID49500": ("Markedly hypointense", [6335, 6343, 6344])}, "MotionRelatedArtifact": {"RID11423": ("Motion related artifact", [6315, 6316])}, "NMHeadPerfusionBrainPETCTAV45": { "RPID5427": ("NM head perfusion brain PET-CT AV-45", [100]) }, "NeurovascularBundleOfProstate": { "RID43492": ("Neurovascular bundle of prostate", [6348]) }, "NonCircumscribedMargin": { "RID34355": ("Non-circumscribed margin", [6335, 6341, 6342]) }, "NonDiagnosticQuality": {"RID14": ("Non-diagnostic quality", [7036])}, "NonIonicIodinatedContrastAgent": { "RID38696": ("Non-ionic iodinated contrast agent", [12, 3850]) }, "NonUniformSignalIntensityArtifact": { "RID11408": ("Non-uniform signal intensity artifact", [6315, 6316]) }, "OrganizedChaos": {"RID49499": ("Organized chaos", [6335, 6343, 6344])}, "PIRADS1DWIVeryLow": {"RID50314": ("PI-RADS 1 - DWI Very low", [6331])}, "PIRADS1T2WIPZVeryLow": {"RID50302": ("PI-RADS 1 - T2WI PZ Very low", [6329])}, "PIRADS1T2WITZVeryLow": {"RID50308": ("PI-RADS 1 - T2WI TZ Very low", [6330])}, "PIRADS1VeryLow": {"RID50289": ("PI-RADS 1 - Very low", [6324, 6325])}, "PIRADS1VeryLowLesion": {"RID50296": ("PI-RADS 1 - Very low (lesion)", [6328])}, "PIRADS2DWILow": {"RID50315": ("PI-RADS 2 - DWI Low", [6331])}, "PIRADS2Low": {"RID50290": ("PI-RADS 2 - Low", [6324, 6325])}, "PIRADS2LowLesion": {"RID50297": ("PI-RADS 2 - Low (lesion)", [6328])}, "PIRADS2T2WIPZLow": {"RID50303": ("PI-RADS 2 - T2WI PZ Low", [6329])}, "PIRADS2T2WITZLow": {"RID50309": ("PI-RADS 2 - T2WI TZ Low", [6330])}, "PIRADS3DWIIntermediate": {"RID50316": ("PI-RADS 3 - DWI Intermediate", [6331])}, "PIRADS3Intermediate": {"RID50291": ("PI-RADS 3 - Intermediate", [6324, 6325])}, "PIRADS3IntermediateLesion": { "RID50298": ("PI-RADS 3 - Intermediate (lesion)", [6328]) }, "PIRADS3T2WIPZIntermediate": { "RID50304": ("PI-RADS 3 - T2WI PZ Intermediate", [6329]) }, "PIRADS3T2WITZIntermediate": { "RID50310": ("PI-RADS 3 - T2WI TZ Intermediate", [6330]) }, "PIRADS4DWIHigh": {"RID50317": ("PI-RADS 4 - DWI High", [6331])}, "PIRADS4High": {"RID50292": ("PI-RADS 4 - High", [6324, 6325])}, "PIRADS4HighLesion": {"RID50299": ("PI-RADS 4 - High (lesion)", [6328])}, "PIRADS4T2WIPZHigh": {"RID50305": ("PI-RADS 4 - T2WI PZ High", [6329])}, "PIRADS4T2WITZHigh": {"RID50311": ("PI-RADS 4 - T2WI TZ High", [6330])}, "PIRADS5DWIVeryHigh": {"RID50318": ("PI-RADS 5 - DWI Very high", [6331])}, "PIRADS5T2WIPZVeryHigh": {"RID50306": ("PI-RADS 5 - T2WI PZ Very high", [6329])}, "PIRADS5T2WITZVeryHigh": {"RID50312": ("PI-RADS 5 - T2WI TZ Very high", [6330])}, "PIRADS5VeryHigh": {"RID50293": ("PI-RADS 5 - Very high", [6324, 6325])}, "PIRADS5VeryHighLesion": {"RID50300": ("PI-RADS 5 - Very high (lesion)", [6328])}, "PIRADSXDCEInadequateOrAbsent": { "RID50327": ("PI-RADS X - DCE Inadequate or absent", [6332]) }, "PIRADSXDWIInadequateOrAbsent": { "RID50326": ("PI-RADS X - DWI Inadequate or absent", [6331]) }, "PIRADSXInadequateOrAbsent": { "RID50322": ("PI-RADS X - Inadequate or absent", [6324, 6325]) }, "PIRADSXInadequateOrAbsentLesion": { "RID50323": ("PI-RADS X - Inadequate or absent (lesion)", [6328]) }, "PIRADSXT2WIPZInadequateOrAbsent": { "RID50324": ("PI-RADS X - T2WI PZ Inadequate or absent", [6329]) }, "PIRADSXT2WITZInadequateOrAbsent": { "RID50325": ("PI-RADS X - T2WI TZ Inadequate or absent", [6330]) }, "PIRADS_DCENegative": {"RID50320": ("PI-RADS DCE -ve", [6332])}, "PIRADS_DCEPositive": {"RID50321": ("PI-RADS DCE +ve", [6332])}, "ParallelImagingArtifact": { "RID11464": ("Parallel imaging artifact", [6315, 6316]) }, "PersistentDelayedPhase": { "RID34331": ("Persistent delayed phase", [6335, 6345, 6346]) }, "PhaseWraparoundArtifact": { "RID11395": ("Phase wraparound artifact", [6315, 6316]) }, "PlateauDelayedPhase": {"RID34332": ("Plateau delayed phase", [6335, 6345, 6346])}, "RestrictedDiffusion": {"RID43349": ("Restricted diffusion", [6335, 6343, 6344])}, "SignalCharacteristic": {"RID6049": ("Signal characteristic", [6333, 6334])}, "Smearing": {"RID11424": ("Smearing", [6315, 6316])}, "SuboptimalPatientPositioning": { "RID11281": ("Suboptimal patient positioning", [6314]) }, "T2Hyperintensity": {"RID39467": ("T2 Hyperintensity", [6335, 6343, 6344])}, "T2Hypointensity": {"RID49501": ("T2 hypointensity", [6335, 6343, 6344])}, "TissueMagneticSusceptibilityEffect": { "RID11372": ("Tissue magnetic susceptibility effect", [6315, 6316]) }, "WashoutDelayedPhase": {"RID34333": ("Washout delayed phase", [6335, 6345, 6346])}, } concepts["MSH"] = { "LactatedRingerS": {"D000077325": ("Lactated Ringer's", [70, 3850])}, "MonteCarloMethod": {"D009010": ("Monte Carlo Method", [10068])}, "Technetium99mTRODAT1": {"C104196": ("Technetium^99m^ TRODAT-1", [25])}, } concepts["UCUM"] = { "ArbitraryUnit": {"[arb'U]": ("arbitrary unit", [7181])}, "Becquerel": {"Bq": ("becquerel", [3083])}, "BecquerelsPerMilliliter": {"Bq/ml": ("Becquerels/milliliter", [83, 84, 7181])}, "Centimeter": {"cm": ("cm", [7063, 7181, 7183, 7460])}, "CentimeterPerSecond": {"cm/s": ("centimeter/second", [7181])}, "Counts": {"{counts}": ("Counts", [83, 84, 7181])}, "CountsPerSecond": {"{counts}/s": ("Counts per second", [83, 84, 7181])}, "CubicCentimeter": {"cm3": ("cubic centimeter", [7181, 7462])}, "CubicDecimeter": {"dm3": ("cubic decimeter", [7181, 7462])}, "CubicMicrometer": {"um3": ("cubic micrometer", [7181, 7462])}, "CubicMillimeter": {"mm3": ("cubic millimeter", [7181, 7462])}, "Day": {"d": ("day", [6046, 7456])}, "Decibel": {"dB": ("decibel", [7181])}, "DecibelsMicrovolt": {"dB[uV]": ("dB(µV)", [3045])}, "DecibelsMillivolt": {"dB[mV]": ("dB(mV)", [3045])}, "Degree": {"deg": ("Degree", [7183])}, "DegreesCelsius": {"Cel": ("degrees Celsius", [7181])}, "Diopters": {"diop": ("diopters", [4267])}, "DynScm5": {"dyn.s.cm-5": ("dyn.s.cm-5", [3502, 7181])}, "DynScm5M2": {"dyn.s.cm-5/m2": ("dyn.s.cm-5/m2", [3503, 7181])}, "ElectronDensity": {"10*23/ml": ("Electron Density", [301])}, "French": {"[Ch]": ("french", [3510])}, "GrayPerSecond": {"Gy/s": ("Gy/s", [9558, 9560])}, "Gy": {"Gy": ("Gy", [7181, 10071])}, "Hertz": {"Hz": ("Hertz", [7181])}, "HounsfieldUnit": {"[hnsf'U]": ("Hounsfield unit", [83, 301, 7181])}, "Hour": {"h": ("hour", [7456])}, "Hz": {"Hz": ("Hz", [3044])}, "KilometersPerHour": {"km/h": ("km/h", [3212])}, "Kilopascal": {"kPa": ("kPa", [3500, 7181])}, "Kilovolt": {"kV": ("Kilovolt", [9521])}, "MegaElectronVolt": {"MeV": ("Megaelectronvolt", [9521])}, "Megabecquerel": {"MBq": ("megabecquerel", [3083])}, "Megavolt": {"MV": ("Megavolt", [9521])}, "Meter": {"m": ("m", [7063])}, "Micrometer": {"um": ("micrometer", [4260, 4267, 7063, 7181, 7183, 7460])}, "MicromolePerMilliliter": {"umol/ml": ("Micromole/milliliter", [83, 84, 7181])}, "MicromolePerMinutePerMilliliter": { "umol/min/ml": ("Micromole/minute/milliliter", [83, 84, 7181]) }, "Microvolt": {"uV": ("µV", [3045])}, "MilesPerHour": {"[mi_i]/h": ("mph", [3212])}, "Millicurie": {"mCi": ("millicurie", [3083])}, "MilligramsPerCubicCentimeter": {"mg/cm3": ("mg/cm^3", [301])}, "MilligramsPerMilliliter": {"mg/ml": ("mg/ml", [301, 4244])}, "MilligramsPerMinutePerMilliliter": { "mg/min/ml": ("Milligrams/minute/milliliter", [83, 84, 7181]) }, "MilliliterPer100GramPerMinute": { "ml/[100]g/min": ("milliliter per 100 gram per minute", [7181]) }, "MilliliterPer100Milliliter": { "ml/[100]ml": ("milliliter per 100 milliliter", [7181]) }, "MilliliterPerGram": {"ml/g": ("Milliliter/gram", [83, 84, 7181])}, "MilliliterPerMinute": {"ml/min": ("milliliter per minute", [7181])}, "MilliliterPerMinutePerGram": { "ml/min/g": ("Milliliter/minute/gram", [83, 84, 7181]) }, "MilliliterPerSecond": {"ml/s": ("milliliter per second", [7181])}, "Millimeter": {"mm": ("mm", [3510, 4267, 7063, 7181, 7183, 7460])}, "MillimeterPerSecond": {"mm/s": ("millimeter/second", [7181])}, "MillimetersHg": {"mm[Hg]": ("mmHg", [3500, 7181])}, "MillimolesPerKilogramWetWeight": { "mmol/kg{WetWeight}": ("millimoles per kg wet weight", [7181]) }, "Millisecond": {"ms": ("millisecond", [7181, 7183])}, "Millitesla": {"mT": ("milliTesla", [7181])}, "Millivolt": {"mV": ("mV", [3045])}, "Minute": {"min": ("minute", [7456])}, "MonitorUnits": {"{MU}": ("Monitor Units", [9269, 9552, 9557, 9559])}, "MonitorUnitsPerSecond": {"{MU}/s": ("Monitor Units/Second", [9550, 9558])}, "Month": {"mo": ("month", [6046, 7456])}, "NoUnits": {"1": ("no units", [7181])}, "NumberParticlesPer100GramOfTissue": { "{Particles}/[100]g{Tissue}": ( "number particles per 100 gram of tissue", [7181], ) }, "PRU": {"[PRU]": ("P.R.U.", [3502, 7181])}, "PRUPerSquareMeter": {"[PRU]/m2": ("P.R.U./m2", [3503, 7181])}, "PerCentimeter": {"/cm": ("/Centimeter", [83, 84, 7181])}, "PerMinute": {"/min": ("/min", [7181])}, "PerSecond": {"/s": ("/s", [7181])}, "Percent": {"%": ("Percent", [83, 84, 301, 4244, 7181])}, "Ppm": {"ppm": ("ppm", [7181])}, "ProportionalToCounts": { "{propcounts}": ("Proportional to counts", [83, 84, 7181]) }, "ProportionalToCountsPerSecond": { "{propcounts}/s": ("Proportional to counts per second", [83, 84, 7181]) }, "Radian": {"rad": ("Radian", [7183])}, "RadiansPerSecond": {"rad/s": ("rad/s", [3044])}, "Ratio": {"{ratio}": ("ratio", [7181])}, "Second": {"s": ("second", [7181, 7183, 9269, 9557])}, "SecondPerSquareMillimeter": {"s/mm2": ("second per square millimeter", [7181])}, "SquareCentimeter": {"cm2": ("Centimeter**2", [83, 84, 7181, 7461])}, "SquareCentimeterPerMilliliter": { "cm2/ml": ("Centimeter**2/milliliter", [83, 84, 7181]) }, "SquareMicrometer": {"um2": ("square micrometer", [7181, 7461])}, "SquareMicrometerPerMillisecond": {"um2/ms": ("um2/ms", [7181, 7277])}, "SquareMicrometerPerSecond": {"um2/s": ("um2/s", [7181, 7277])}, "SquareMillimeter": {"mm2": ("square millimeter", [7181, 7461])}, "SquareMillimeterPerSecond": {"mm2/s": ("mm2/s", [7181, 7277])}, "StandardizedUptakeValueBodySurfaceArea": { "cm2/ml{SUVbsa}": ( "Standardized Uptake Value body surface area", [83, 84, 85, 7181], ) }, "StandardizedUptakeValueBodyWeight": { "g/ml{SUVbw}": ("Standardized Uptake Value body weight", [83, 84, 85, 7181]) }, "StandardizedUptakeValueIdealBodyWeight": { "g/ml{SUVibw}": ( "Standardized Uptake Value ideal body weight", [83, 84, 85, 7181], ) }, "StandardizedUptakeValueLeanBodyMassJames": { "g/ml{SUVlbm}": ( "Standardized Uptake Value lean body mass (James)", [83, 84, 85, 7181], ) }, "StandardizedUptakeValueLeanBodyMassJames128Multiplier": { "g/ml{SUVlbm(James128)}": ( "Standardized Uptake Value lean body mass (James 128 multiplier)", [83, 84, 85, 7181], ) }, "StandardizedUptakeValueLeanBodyMassJanma": { "g/ml{SUVlbm(Janma)}": ( "Standardized Uptake Value lean body mass (Janma)", [83, 84, 85, 7181], ) }, "Sv": {"Sv": ("Sv", [7181, 10071])}, "Week": {"wk": ("week", [6046, 7456])}, "WoodU": {"[wood'U]": ("Wood U", [3502, 7181])}, "WoodUM2": {"[wood'U]/m2": ("Wood U/m2", [3503, 7181])}, "Year": {"a": ("year", [6046, 7456])}, "_10EMinus6SquareMillimetersPerSecond": { "10-6.mm2/s": ("10-6.mm2/s", [7181, 7277]) }, } concepts["LN"] = { "ACASUM2000": {"33072-0": ("AC, ASUM 2000", [12012, 12013])}, "ACByGAASUM2000": {"33145-4": ("AC by GA, ASUM 2000", [12012, 12015])}, "ACByGAHadlock1984": {"33146-2": ("AC by GA, Hadlock 1984", [12012, 12015])}, "ACByGAMerz1988": {"33148-8": ("AC by GA, Merz 1988", [12012, 12015])}, "ACByGAShinozuka1996": {"33149-6": ("AC by GA, Shinozuka 1996", [12012, 12015])}, "ACCampbell1975": {"11889-3": ("AC, Campbell 1975", [12012, 12013])}, "ACDerivedByGAChitty1994": { "33546-3": ("AC (derived) by GA, Chitty 1994", [12012, 12015]) }, "ACHadlock1984": {"11892-7": ("AC, Hadlock 1984", [12012, 12013])}, "ACHansmann1985": {"33073-8": ("AC, Hansmann1985", [12012, 12013])}, "ACInterval": { "59103-2": ( "A-C Interval", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "ACJeanty1982": {"33537-2": ("AC, Jeanty 1982", [12012, 12013])}, "ACJeanty1984": {"11893-5": ("AC, Jeanty 1984", [12012, 12013])}, "ACLessoway1998": {"33074-6": ("AC, Lessoway 1998", [12012, 12013])}, "ACMeasuredByGAChitty1994": { "33147-0": ("AC (measured) by GA, Chitty 1994", [12012, 12015]) }, "ACMertz1988": {"33075-3": ("AC, Mertz 1988", [12012, 12013])}, "ACShinozuka1996": {"33076-1": ("AC, Shinozuka 1996", [12012, 12013])}, "APADTAD": {"33191-8": ("APAD * TAD", [12005])}, "APAbdominalDiameterLessoway1998": { "33077-9": ("A-P Abdominal Diameter, Lessoway 1998", [12012, 12013]) }, "AWaveAmplitude": {"59100-8": ("A-Wave Amplitude", [12262, 12263, 12271, 12272])}, "AWaveDuration": { "59105-7": ( "A-Wave Duration", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "AWavePeakVelocity": { "59081-0": ( "A-Wave Peak Velocity", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "AbdominalCircumference": {"11979-2": ("Abdominal Circumference", [12005, 12279])}, "AccelerationIndex": {"20167-3": ("Acceleration Index", [12119, 12121])}, "AccelerationSlope": { "20167-3": ( "Acceleration Slope", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "AccelerationTime": { "20168-1": ( "Acceleration Time", [ 12119, 12122, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "Addendum": {"55107-7": ("Addendum", [6052, 7001])}, "AliasVelocity": { "59130-5": ( "Alias velocity", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "AmnioticFluidIndex": {"11627-7": ("Amniotic Fluid Index", [12008])}, "AnteriorHornLateralVentricularWidth": { "33197-5": ("Anterior Horn Lateral ventricular width", [12007]) }, "AnteriorPosteriorAbdominalDiameter": { "11818-2": ("Anterior-Posterior Abdominal Diameter", [12005, 12279]) }, "AnteriorPosteriorTrunkDiameter": { "11819-0": ("Anterior-Posterior Trunk Diameter", [12005, 12279]) }, "AorticAnnulusDiameter": {"79940-3": ("Aortic annulus diameter", [12300])}, "AorticArchDiameter": {"18011-7": ("Aortic Arch Diameter", [12212])}, "AorticIsthmusDiameter": {"18014-1": ("Aortic Isthmus Diameter", [12212])}, "AorticRegurgitantFlow": {"79941-1": ("Aortic regurgitant flow", [12300])}, "AorticRegurgitantFraction": {"79942-9": ("Aortic regurgitant fraction", [12300])}, "AorticRegurgitantJetAreaLVOTAreaPercent": { "79943-7": ("Aortic regurgitant jet area/LVOT area %", [12300]) }, "AorticRegurgitantJetWidthLVOTWidthPercent": { "79944-5": ("Aortic regurgitant jet width/LVOT width %", [12300]) }, "AorticRegurgitationPISARadius": { "79945-2": ("Aortic regurgitation PISA radius", [12300]) }, "AorticRegurgitationPISAVelocity": { "79946-0": ("Aortic regurgitation PISA velocity", [12300]) }, "AorticRegurgitationPressureHalfTime": { "79947-8": ("Aortic regurgitation pressure half-time", [12300]) }, "AorticRegurgitationVTI": {"79952-8": ("Aortic regurgitation VTI", [12300])}, "AorticRegurgitationVenaContractaWidth": { "79948-6": ("Aortic regurgitation vena contracta width", [12300]) }, "AorticRegurgitationVmax": {"79949-4": ("Aortic regurgitation Vmax", [12300])}, "AorticRegurgitationVolumeContinuityVTI": { "79950-2": ("Aortic regurgitation volume (Continuity VTI)", [12300]) }, "AorticRegurgitationVolumePISA": { "79951-0": ("Aortic regurgitation volume (PISA)", [12300]) }, "AorticRootAnnuloAorticJunctionDiameter": { "18015-8": ("Aortic Root Diameter", [12212]) }, "AorticRootDiameter": {"79953-6": ("Aortic root diameter", [12300])}, "AorticRootDiameterBSA": {"79954-4": ("Aortic root diameter / BSA", [12300])}, "AorticRootOxygenContent": {"10232-7": ("Aortic Root Oxygen content", [3525])}, "AorticSinotubularJunctionDimension": { "79955-1": ("Aortic sinotubular junction dimension", [12300]) }, "AorticSinotubularJunctionToAorticRootRatio": { "59116-4": ("Aortic Sinotubular Junction to Aortic Root Ratio", [12273, 12274]) }, "AorticValveAreaContinuityVTI": { "79958-5": ("Aortic valve area (Continuity VTI)", [12300]) }, "AorticValveAreaContinuityVTIBSA": { "79959-3": ("Aortic valve area (Continuity VTI) / BSA", [12300]) }, "AorticValveAreaContinuityVmax": { "79956-9": ("Aortic valve area (Continuity Vmax)", [12300]) }, "AorticValveAreaContinuityVmaxBSA": { "79957-7": ("Aortic valve area (Continuity Vmax) / BSA", [12300]) }, "AorticValveCuspSeparation": { "17996-0": ("Aortic Valve Cusp Separation", [12211, 12270, 12271, 12272, 12274]) }, "AorticValveEffectiveRegurgitantOrificeArea": { "79960-1": ("Aortic valve effective regurgitant orifice area", [12300]) }, "AorticValveEjectionTime": {"18041-4": ("Aortic Valve Ejection Time", [12211])}, "AorticValveMeanBloodVelocity": { "79961-9": ("Aortic valve mean blood velocity", [12300]) }, "AorticValveMeanGradient": {"79962-7": ("Aortic valve mean gradient", [12300])}, "AorticValvePeakInstantaneousGradient": { "79963-5": ("Aortic valve peak instantaneous gradient", [12300]) }, "AorticValveVTI": {"79965-0": ("Aortic valve VTI", [12300])}, "AorticValveVmax": {"79964-3": ("Aortic valve Vmax", [12300])}, "ArterialBloodBaseExcess": {"1925-7": ("Arterial Blood Base Excess", [3527])}, "ArterialBloodCarbonDioxideContent": { "2026-3": ("Arterial Blood Carbon dioxide content", [3525]) }, "ArterialBloodCarbonDioxidePartialPressure": { "2019-8": ("Arterial Blood Carbon dioxide partial pressure", [3524]) }, "ArterialBloodPh": {"2744-1": ("Arterial Blood pH", [3528])}, "ArterialContentFca": {"19218-7": ("Arterial Content (FCa)", [3529])}, "ArterialOxygenContent": {"19218-7": ("Arterial Oxygen content", [3525])}, "ArterialOxygenPartialPressure": { "2703-7": ("Arterial Oxygen partial pressure", [3524]) }, "ArterialOxygenPartialPressureAt50PercentSaturation": { "19214-6": ("Arterial Oxygen partial pressure at 50% saturation", [3524]) }, "ArterialOxygenSaturation": {"2708-6": ("Arterial Oxygen saturation", [3526])}, "AscendingAortaDimension": {"79966-8": ("Ascending Aorta Dimension", [12300])}, "AscendingAorticDiameter": {"18012-5": ("Ascending Aortic Diameter", [12212])}, "AverageUltrasoundAge": {"11884-4": ("Average Ultrasound Age", [12012, 12013])}, "AxtByGAShinozuka1996": {"33150-4": ("AxT by GA, Shinozuka 1996", [12012, 12015])}, "AxtShinozuka1996": {"33078-7": ("AxT, Shinozuka 1996", [12012, 12013])}, "BCSlope": {"59126-3": ("B-C Slope", [12262, 12263, 12271, 12272])}, "BDJeanty1982": {"33545-5": ("BD, Jeanty 1982", [12012, 12013])}, "BPDASUM1989": {"33079-5": ("BPD, ASUM 1989", [12012, 12013])}, "BPDAreaCorrected": {"11824-0": ("BPD area corrected", [12005, 12279])}, "BPDByGAASUM2000": {"33151-2": ("BPD by GA, ASUM 2000", [12012, 12015])}, "BPDByGAHadlock1984": {"33198-3": ("BPD by GA, Hadlock 1984", [12012, 12015])}, "BPDByGAJeanty1982": {"33153-8": ("BPD by GA, Jeanty 1982", [12012, 12015])}, "BPDByGAMerz1988": {"33154-6": ("BPD by GA, Merz 1988", [12012, 12015])}, "BPDByGARempen1991": {"33155-3": ("BPD by GA, Rempen 1991", [12012, 12015])}, "BPDByGAShinozuka1996": {"33156-1": ("BPD by GA, Shinozuka 1996", [12012, 12015])}, "BPDDoubilet1993": {"11900-8": ("BPD, Doubilet 1993", [12012, 12013])}, "BPDHadlock1984": {"11902-4": ("BPD, Hadlock 1984", [12012, 12013])}, "BPDHansmann1985": {"11903-2": ("BPD, Hansmann 1985", [12012, 12013])}, "BPDHansmann1986": {"33538-0": ("BPD, Hansmann 1986", [12012, 12013])}, "BPDJeanty1982": {"33539-8": ("BPD, Jeanty 1982", [12012, 12013])}, "BPDJeanty1984": {"11905-7": ("BPD, Jeanty 1984", [12012, 12013])}, "BPDKurtz1980": {"11906-5": ("BPD, Kurtz 1980", [12012, 12013])}, "BPDLessoway1998": {"33080-3": ("BPD, Lessoway 1998", [12012, 12013])}, "BPDMertz1988": {"33081-1": ("BPD, Mertz 1988", [12012, 12013])}, "BPDOiChitty1997": {"33086-0": ("BPD-oi, Chitty 1997", [12012, 12013])}, "BPDOoChitty1997": {"33087-8": ("BPD-oo, Chitty 1997", [12012, 12013])}, "BPDOsaka1989": {"33082-9": ("BPD, Osaka 1989", [12012, 12013])}, "BPDOuterInnerByGAChitty1994": { "33556-2": ("BPD outer-inner by GA, Chitty 1994", [12012, 12015]) }, "BPDOuterOuterByGAChitty1994": { "33152-0": ("BPD outer-outer by GA, Chitty 1994", [12012, 12015]) }, "BPDRempen1991": {"33083-7": ("BPD, Rempen 1991", [12012, 12013])}, "BPDSabbagha1978": {"11907-3": ("BPD, Sabbagha 1978", [12012, 12013])}, "BPDShinozuka1996": {"33084-5": ("BPD, Shinozuka 1996", [12012, 12013])}, "BPDTokyo1986": {"33085-2": ("BPD, Tokyo 1986", [12012, 12013])}, "BSA": {"8277-6": ("BSA", [3455])}, "BiparietalDiameter": {"11820-8": ("Biparietal Diameter", [12005, 12279])}, "BloodBaseExcess": {"11555-0": ("Blood Base Excess", [3527])}, "BloodCarbonDioxideContent": {"20565-8": ("Blood Carbon dioxide content", [3525])}, "BloodCarbonDioxidePartialPressure": { "11557-6": ("Blood Carbon dioxide partial pressure", [3524]) }, "BloodOxygenPartialPressure": { "11556-8": ("Blood Oxygen partial pressure", [3524]) }, "BloodOxygenSaturation": {"20564-1": ("Blood Oxygen saturation", [3526])}, "BloodPh": {"11558-4": ("Blood pH", [3528])}, "BpdaHadlock1982": {"11901-6": ("BPDa, Hadlock 1982", [12012, 12013])}, "BrainMRI": {"24590-2": ("Brain MRI", [646])}, "BrainPET": {"44138-6": ("Brain PET", [646])}, "BrainSPECT": {"39632-5": ("Brain SPECT", [646])}, "BreastBilateralMammogram": { "36626-0": ("breast - bilateral mammogram", [6050, 6083]) }, "BreastBilateralMr": {"30795-9": ("breast - bilateral mr", [6050, 6083])}, "BreastBilateralMrWContrastIv": { "36150-1": ("breast - bilateral mr w contrast iv", [6050, 6083]) }, "BreastBilateralMrWoAndWContrastIv": { "36277-2": ("breast - bilateral mr wo and w contrast iv", [6050, 6083]) }, "BreastFfdMammogram": {"46342-2": ("breast ffd mammogram", [6050, 6083])}, "BreastLeftMammogram": {"36627-8": ("breast - left mammogram", [6050, 6083])}, "BreastLeftMr": {"35954-7": ("breast - left mr", [6050, 6083])}, "BreastLeftMrWContrastIv": { "36151-9": ("breast - left mr w contrast iv", [6050, 6083]) }, "BreastLeftMrWoAndWContrastIv": { "36278-0": ("breast - left mr wo and w contrast iv", [6050, 6083]) }, "BreastMrWContrastIv": {"36149-3": ("breast mr w contrast iv", [6050, 6083])}, "BreastMrWoAndWContrastIv": { "36276-4": ("breast mr wo and w contrast iv", [6050, 6083]) }, "BreastRightMammogram": {"37774-7": ("breast - right mammogram", [6050, 6083])}, "BreastRightMr": {"35955-4": ("breast - right mr", [6050, 6083])}, "BreastRightMrWContrastIv": { "36152-7": ("breast - right mr w contrast iv", [6050, 6083]) }, "BreastRightMrWoAndWContrastIv": { "36279-8": ("breast - right mr wo and w contrast iv", [6050, 6083]) }, "BreastUnilateralMammogram": { "46339-8": ("breast - unilateral mammogram", [6050, 6083]) }, "BreastUnilateralMr": {"46299-4": ("breast - unilateral mr", [6050, 6083])}, "BreastUnilateralMrWContrastIv": { "46323-2": ("breast - unilateral mr w contrast iv", [6050, 6083]) }, "BreastUnilateralMrWoAndWContrastIv": { "43528-9": ("breast - unilateral mr wo and w contrast iv", [6050, 6083]) }, "BreastUnilateralMrWoContrast": { "46333-1": ("breast - unilateral mr wo contrast", [6050, 6083]) }, "CEDistance": { "59122-2": ( "C-E Distance", [12251, 12262, 12263, 12266, 12267, 12268, 12271, 12272], ) }, "CKDEPIFormulaEstimationOfGFR": { "62238-1": ("CKD-EPI Formula estimation of GFR", [10046]) }, "CRLASUM1991": {"33089-4": ("CRL, ASUM 1991", [12012, 12013])}, "CRLASUM2000": {"33090-2": ("CRL, ASUM 2000", [12012, 12013])}, "CRLByGAASUM2000": {"33159-5": ("CRL by GA ASUM 2000", [12012, 12015])}, "CRLByGARempen1991": {"33160-3": ("CRL by GA, Rempen1991", [12012, 12015])}, "CRLByGAShinozuka1996": {"33161-1": ("CRL by GA, Shinozuka 1996", [12012, 12015])}, "CRLDaya1993": {"33091-0": ("CRL, Daya 1993", [12012, 12013])}, "CRLHadlock1992": {"11910-7": ("CRL, Hadlock 1992", [12012, 12013])}, "CRLHansmann1985": {"11911-5": ("CRL, Hansmann 1985", [12012, 12013])}, "CRLHansmann1986": {"33540-6": ("CRL, Hansmann 1986", [12012, 12013])}, "CRLJeanty1982": {"33092-8": ("CRL, Jeanty 1982", [12012, 12013])}, "CRLJeanty1984": {"11917-2": ("CRL, Jeanty 1984", [12012, 12013])}, "CRLNelson1981": {"11913-1": ("CRL, Nelson 1981", [12012, 12013])}, "CRLOsaka1989": {"33093-6": ("CRL, Osaka 1989", [12012, 12013])}, "CRLRempen1991": {"33094-4": ("CRL, Rempen 1991", [12012, 12013])}, "CRLRobinson1975": {"11914-9": ("CRL, Robinson 1975", [12012, 12013])}, "CRLShinozuka1996": {"33095-1": ("CRL, Shinozuka 1996", [12012, 12013])}, "CRLTokyo1986": {"33096-9": ("CRL, Tokyo 1986", [12012, 12013])}, "CT3DCAMModel": {"85040-4": ("CT 3D CAM model", [7061])}, "CTAbdomenReport": {"41806-1": ("CT Abdomen Report", [7000])}, "CTChestReport": {"24627-2": ("CT Chest Report", [7000])}, "CTHeadReport": {"24725-4": ("CT Head Report", [7000])}, "CTPerfusionHeadWithContrastIV": { "39142-5": ("CT perfusion head with contrast IV", [100]) }, "CTReport": {"25045-6": ("CT Report", [7000])}, "CTUnspecifiedBodyRegion": {"25045-6": ("CT unspecified body region", [100])}, "CapillaryBloodOxygenSaturation": { "2709-4": ("Capillary Blood Oxygen Saturation", [3526]) }, "CapillaryBloodOxygenSaturationByOximetry": { "2710-2": ("Capillary Blood Oxygen Saturation, by Oximetry", [3526]) }, "CardiacCatheterizationReport": { "18745-0": ("Cardiac Catheterization Report", [7000]) }, "CardiacCircumferenceTransverseByUS": { "59073-7": ("Cardiac Circumference, transverse by US", [12279]) }, "CardiacCrossSectionalAreaTransverseByUS": { "59075-2": ("Cardiac Cross-sectional Area, transverse by US", [12279]) }, "CardiacElectrophysiologyReport": { "18750-0": ("Cardiac Electrophysiology Report", [7000]) }, "CardiacRhythm": {"8884-9": ("Cardiac Rhythm", [3441])}, "CardiothoracicAreaRatio": {"59076-0": ("Cardiothoracic Area Ratio", [12279])}, "CardiothoracicCircumferenceRatio": { "59074-5": ("Cardiothoracic Circumference Ratio", [12279]) }, "CephalicIndex": {"11823-2": ("Cephalic Index", [12004, 12279])}, "CephalicIndexByGAChitty1994": { "33157-9": ("Cephalic Index by GA, Chitty 1994", [12012, 12015]) }, "CephalicIndexByGAHadlock1981": { "33158-7": ("Cephalic Index by GA, Hadlock 1981", [12012, 12015]) }, "CervixLength": {"11961-0": ("Cervix Length", [12011])}, "CisternaMagnaLength": { "11860-4": ("Cisterna Magna Length", [12005, 12007, 12279]) }, "ClavicleLength": {"11962-8": ("Clavicle length", [12006])}, "ClavicleLengthYarkoni1985": { "33088-6": ("Clavicle length, Yarkoni 1985", [12012, 12013]) }, "ClinicalInformation": {"55752-0": ("Clinical Information", [7001])}, "ClosureToOpeningTime": { "59082-8": ( "Closure to Opening Time", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "CockroftGaultFormulaEstimationOfGFR": { "35591-7": ("Cockroft-Gault Formula estimation of GFR", [10046]) }, "CommunicationOfCriticalResults": { "73568-8": ("Communication of Critical Results", [7001]) }, "Complications": {"55109-3": ("Complications", [7001])}, "CompositeUltrasoundAge": {"11888-5": ("Composite Ultrasound Age", [12019])}, "ConceptionDate": {"33067-0": ("Conception Date", [12003])}, "Conclusions": {"55110-1": ("Conclusions", [6052, 7001])}, "CrownRumpLength": {"11957-8": ("Crown Rump Length", [12009])}, "CurrentProcedureDescriptions": { "55111-9": ("Current Procedure Descriptions", [7001]) }, "DEExcursion": { "59091-9": ( "D-E Excursion", [12251, 12262, 12263, 12266, 12267, 12268, 12271, 12272], ) }, "DESlope": { "59127-1": ( "D-E Slope", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "DEXASkeletalSystemStudyReport": { "38269-7": ("DEXA Skeletal System Study Report", [7000]) }, "DecelerationSlope": { "20216-8": ( "Deceleration Slope", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "DecelerationTime": { "20217-6": ( "Deceleration Time", [ 12119, 12122, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "DescendingAorticDiameter": {"18013-3": ("Descending Aortic Diameter", [12212])}, "DiagnosticImagingReport": {"18748-4": ("Diagnostic Imaging Report", [7000])}, "DiagnosticInterventionalRadiologyReport": { "47048-4": ("Diagnostic Interventional Radiology Report", [7000]) }, "DpDtByUS": { "59120-6": ( "dP/dt by US", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, 12304, ], ) }, "ECGReport": {"11524-0": ("ECG Report", [7000])}, "EDD": {"11778-8": ("EDD", [12003])}, "EDDFromAverageUltrasoundAge": { "11781-2": ("EDD from average ultrasound age", [12003]) }, "EDDFromLMP": {"11779-6": ("EDD from LMP", [12003])}, "EDDFromOvulationDate": {"11780-4": ("EDD from ovulation date", [12003])}, "EFSlope": { "59128-9": ( "E-F Slope", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "EFW1ByShinozuka1996": {"33141-3": ("EFW1 by Shinozuka 1996", [12012, 12014])}, "EFW2ByShinozuka1996": {"33142-1": ("EFW2 by Shinozuka 1996", [12012, 12014])}, "EFW3ByShinozuka1996": {"33143-9": ("EFW3 by Shinozuka 1996", [12012, 12014])}, "EFWByACAndBPDShepard1982": { "11739-0": ("EFW by AC and BPD, Shepard 1982", [12012, 12014]) }, "EFWByACBPDFLHCHadlock1985": { "11732-5": ("EFW by AC, BPD, FL, HC, Hadlock 1985", [12012, 12014]) }, "EFWByACBPDFLHadlock1984": { "11734-1": ("EFW by AC, BPD, FL, Hadlock 1984", [12012, 12014]) }, "EFWByACBPDFLHadlock1985": { "11735-8": ("EFW by AC, BPD, FL, Hadlock 1985", [12012, 12014]) }, "EFWByACBPDHadlock1984": { "11738-2": ("EFW by AC, BPD, Hadlock 1984", [12012, 12014]) }, "EFWByACCampbell1975": {"11756-4": ("EFW by AC, Campbell 1975", [12012, 12014])}, "EFWByACFLHCHadlock1985": { "11746-5": ("EFW by AC, FL, HC, Hadlock 1985", [12012, 12014]) }, "EFWByACFLHadlock1984": { "11750-7": ("EFW by AC, FL, Hadlock 1984", [12012, 12014]) }, "EFWByACFLHadlock1985": { "11751-5": ("EFW by AC, FL, Hadlock 1985", [12012, 12014]) }, "EFWByACHCHadlock1984": {"11754-9": ("EFW by AC, HC Hadlock 1984", [12012, 12014])}, "EFWByBPDAPADTADFLTokyo1987": { "33144-7": ("EFW by BPD, APAD, TAD, FL, Tokyo 1987", [12012, 12014]) }, "EFWByBPDFTAFLOsaka1990": { "33140-5": ("EFW by BPD, FTA, FL, Osaka 1990", [12012, 12014]) }, "EFWByBPDTTDHansmann1986": { "33139-7": ("EFW by BPD, TTD, Hansmann 1986", [12012, 12014]) }, "EFWByGAHadlock1991": {"33162-9": ("EFW by GA, Hadlock 1991", [12012, 12015])}, "EFWByGAHansmann1986": {"33163-7": ("EFW by GA, Hansmann 1986", [12012, 12015])}, "EFWDiscordance": {"98031-8": ("EFW Discordance", [12019])}, "EFWPercentileRank": {"11767-1": ("EFW percentile rank", [12019])}, "EFWRatio": {"98032-6": ("EFW Ratio", [12019])}, "EVelocityToAnnulusEVelocityRatio": { "59111-5": ( "E Velocity to Annulus E Velocity Ratio", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "EWavePeakVelocity": { "59080-2": ( "E-Wave Peak Velocity", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "EchocardiographyReport": {"42148-7": ("Echocardiography Report", [7000])}, "EjectionTime": { "20222-6": ( "Ejection Time", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "EndDiastolicVelocity": { "11653-3": ( "End Diastolic Velocity", [ 12119, 12120, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "EndocardialArea": { "59094-3": ("Endocardial Area", [12255, 12257, 12258, 12259, 12265, 12271]) }, "EndometriumThickness": {"12145-9": ("Endometrium Thickness", [12011])}, "EnvelopeDuration": { "59108-1": ( "Envelope Duration", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "EpicardialArea": { "59093-5": ( "Epicardial Area", [12255, 12257, 12258, 12259, 12265, 12271, 12304], ) }, "EstimatedLMPByEDD": {"33066-2": ("Estimated LMP by EDD", [12003])}, "EstimatedWeight": {"11727-5": ("Estimated Weight", [12019])}, "ExerciseStressTestReport": {"18752-6": ("Exercise Stress Test Report", [7000])}, "FLAC": {"11871-1": ("FL/AC", [12004, 12279])}, "FLBPD": {"11872-9": ("FL/BPD", [12004, 12279])}, "FLByGAASUM2000": {"33165-2": ("FL by GA, ASUM 2000", [12012, 12015])}, "FLByGAChitty1994": {"33167-8": ("FL by GA, Chitty 1994", [12012, 12015])}, "FLByGAHadlock1984": {"33166-0": ("FL by GA, Hadlock 1984", [12012, 12015])}, "FLByGAJeanty1982": {"33168-6": ("FL by GA, Jeanty 1982", [12012, 12015])}, "FLByGAMerz1988": {"33169-4": ("FL by GA, Merz 1988", [12012, 12015])}, "FLByGAShinozuka1996": {"33170-2": ("FL by GA, Shinozuka 1996", [12012, 12015])}, "FLChitty1997": {"33098-5": ("FL, Chitty 1997", [12012, 12013])}, "FLHC": {"11873-7": ("FL/HC", [12004, 12279])}, "FLHadlock1984": {"11920-6": ("FL, Hadlock 1984", [12012, 12013])}, "FLHansmann1985": {"11921-4": ("FL, Hansmann 1985", [12012, 12013])}, "FLHansmann1986": {"33541-4": ("FL, Hansmann 1986", [12012, 12013])}, "FLHohler1982": {"11922-2": ("FL, Hohler 1982", [12012, 12013])}, "FLJeanty1982": {"33099-3": ("FL, Jeanty 1982", [12012, 12013])}, "FLJeanty1984": {"11923-0": ("FL, Jeanty 1984", [12012, 12013])}, "FLLessoway1998": {"33100-9": ("FL, Lessoway 1998", [12012, 12013])}, "FLMerz1987": {"11924-8": ("FL, Merz 1987", [12012, 12013])}, "FLMerz1988": {"33542-2": ("FL, Merz 1988", [12012, 12013])}, "FLOsaka1989": {"33101-7": ("FL, Osaka 1989", [12012, 12013])}, "FLShinozuka1996": {"33102-5": ("FL, Shinozuka 1996", [12012, 12013])}, "FLTokyo1986": {"33103-3": ("FL, Tokyo 1986", [12012, 12013])}, "FWPByGAAlexander1996": {"33185-0": ("FWP by GA, Alexander, 1996", [12012, 12016])}, "FWPByGABrenner1976": {"33189-2": ("FWP by GA, Brenner 1976", [12012, 12016])}, "FWPByGAHadlock1985": {"33190-0": ("FWP by GA, Hadlock 1985", [12012, 12016])}, "FWPByGAWilliams1982": {"33184-3": ("FWP by GA, Williams, 1982", [12012, 12016])}, "FemaleSingletonBWPByGAArbuckle1993": { "33187-6": ("Female Singleton BWP by GA, Arbuckle 1993", [12012, 12016]) }, "FemaleTwinsBWPByGAArbuckle1993": { "33188-4": ("Female Twins BWP by GA, Arbuckle 1993", [12012, 12016]) }, "FemurLength": {"11963-6": ("Femur Length", [12005, 12006, 12279])}, "FetalHeartRate": {"11948-7": ("Fetal Heart Rate", [12019])}, "FetalTrunkCrossSectionalAreaOsaka1989": { "33138-9": ("Fetal Trunk Cross-Sectional Area, Osaka 1989", [12012, 12013]) }, "FibulaByGAJeanty1983": {"33164-5": ("Fibula by GA, Jeanty 1983", [12012, 12015])}, "FibulaJeanty1983": {"33097-7": ("Fibula, Jeanty 1983", [12012, 12013])}, "FibulaLength": {"11964-4": ("Fibula length", [12006])}, "FibulaMerz1987": {"11918-0": ("Fibula, Merz 1987", [12012, 12013])}, "FillingTime": { "59119-8": ( "Filling Time", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "Findings": {"59776-5": ("Findings", [6052, 7001])}, "FirstQuadrantDiameter": {"11624-4": ("First Quadrant Diameter", [12008])}, "FitzpatrickSkinTypeI": {"C74569": ("Fitzpatrick Skin Type I", [4401])}, "FitzpatrickSkinTypeII": {"C74570": ("Fitzpatrick Skin Type II", [4401])}, "FitzpatrickSkinTypeIII": {"C74571": ("Fitzpatrick Skin Type III", [4401])}, "FitzpatrickSkinTypeIV": {"C74572": ("Fitzpatrick Skin Type IV", [4401])}, "FitzpatrickSkinTypeV": {"C74573": ("Fitzpatrick Skin Type V", [4401])}, "FitzpatrickSkinTypeVI": {"C74574": ("Fitzpatrick Skin Type VI", [4401])}, "FlowArea": { "20226-7": ( "Flow Area", [ 12253, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12274, ], ) }, "FlowRadius": { "59102-4": ( "Flow Radius", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "FluoroscopyStudyReport": {"49512-7": ("Fluoroscopy Study Report", [7000])}, "FootLength": {"11965-1": ("Foot length", [12005])}, "FootLengthMercer1987": {"11926-3": ("Foot Length, Mercer 1987", [12012, 12013])}, "ForamenOvaleDiameterAorticRootDiameter": { "59077-8": ("Foramen Ovale Diameter/Aortic Root Diameter", [12279]) }, "FourthQuadrantDiameter": {"11623-6": ("Fourth Quadrant Diameter", [12008])}, "FractionalShortening": { "59132-1": ( "Fractional Shortening", [ 12252, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, 12304, ], ) }, "GSByGARempen1991": {"33171-0": ("GS by GA, Rempen 1991", [12012, 12015])}, "GSDaya1991": {"33104-1": ("GS, Daya 1991", [12012, 12013])}, "GSHansmann1979": {"33105-8": ("GS, Hansmann 1979", [12012, 12013])}, "GSHansmann1982": {"33106-6": ("GS, Hansmann 1982", [12012, 12013])}, "GSHellman1969": {"11928-9": ("GS, Hellman 1969", [12012, 12013])}, "GSNyberg1992": {"33107-4": ("GS, Nyberg 1992", [12012, 12013])}, "GSRempen1991": {"11929-7": ("GS, Rempen 1991", [12012, 12013])}, "GSTokyo1986": {"33108-2": ("GS, Tokyo 1986", [12012, 12013])}, "GestationalAge": {"18185-9": ("Gestational Age", [12019])}, "GestationalAgeByLMP": { "11885-1": ("Gestational Age by LMP", [12012, 12013, 12019]) }, "GestationalAgeByOvulationDate": { "11886-9": ("Gestational Age by ovulation date", [12018]) }, "GestationalSacDiameter": {"11850-5": ("Gestational Sac Diameter", [12009])}, "GlomerularFiltrationRateBlackMDRD": { "48643-1": ("Glomerular Filtration Rate black (MDRD)", [10046]) }, "GlomerularFiltrationRateCreatinineBasedFormulaSchwartz": { "50384-7": ( "Glomerular Filtration Rate Creatinine-based formula (Schwartz)", [10046], ) }, "GlomerularFiltrationRateCystatinBasedFormula": { "50210-4": ("Glomerular Filtration Rate Cystatin-based formula", [10046]) }, "GlomerularFiltrationRateFemaleMDRD": { "50044-7": ("Glomerular Filtration Rate female (MDRD)", [10046]) }, "GlomerularFiltrationRateMDRD": { "33914-3": ("Glomerular Filtration Rate (MDRD)", [10046]) }, "GlomerularFiltrationRateNonBlackMDRD": { "48642-3": ("Glomerular Filtration Rate non-black (MDRD)", [10046]) }, "HCAC": {"11947-9": ("HC/AC", [12004, 12279])}, "HCACByGACampbell1977": {"80416-1": ("HC/AC by GA, Campbell 1977", [12012, 12015])}, "HCASUM2000": {"33109-0": ("HC, ASUM 2000", [12012, 12013])}, "HCByGAASUM2000": {"33172-8": ("HC by GA, ASUM 2000", [12012, 12015])}, "HCByGAHadlock1984": {"33173-6": ("HC by GA, Hadlock 1984", [12012, 12015])}, "HCByGAJeanty1982": {"33175-1": ("HC by GA, Jeanty 1982", [12012, 12015])}, "HCByGAMerz1988": {"33176-9": ("HC by GA, Merz 1988", [12012, 12015])}, "HCDerivedByGAChitty1994": { "33174-4": ("HC derived by GA, Chitty 1994", [12012, 12015]) }, "HCDerivedChitty1997": {"33111-6": ("HC derived, Chitty 1997", [12012, 12013])}, "HCHadlock1984": {"11932-1": ("HC, Hadlock 1984", [12012, 12013])}, "HCHansmann1985": {"33112-4": ("HC, Hansmann 1985", [12012, 12013])}, "HCHansmann1986": {"33543-0": ("HC, Hansmann 1986", [12012, 12013])}, "HCJeanty1982": {"33113-2": ("HC, Jeanty 1982", [12012, 12013])}, "HCJeanty1984": {"11934-7": ("HC, Jeanty 1984", [12012, 12013])}, "HCLessoway1998": {"33114-0": ("HC, Lessoway 1998", [12012, 12013])}, "HCMeasuredChitty1997": {"33110-8": ("HC measured, Chitty 1997", [12012, 12013])}, "HCMerz1988": {"33115-7": ("HC Merz, 1988", [12012, 12013])}, "HRCorrectedMeanVelocityOfCircumferentialFiberShortening": { "59118-0": ( "HR-Corrected Mean Velocity of Circumferential Fiber Shortening", [ 12252, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "HeadCT": {"24725-4": ("Head CT", [646])}, "HeadCircumference": {"11984-2": ("Head Circumference", [12005, 12279])}, "HeartRate": { "8867-4": ( "Heart rate", [ 12200, 12204, 12205, 12206, 12207, 12208, 12209, 12210, 12211, 12212, 12214, 12215, 12216, 12217, 12218, 12220, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "HeartRateCorrectedEjectionTime": { "59086-9": ( "Heart Rate-Corrected Ejection Time", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "HeartRateCorrectedPreEjectionPeriod": { "59087-7": ( "Heart Rate-Corrected Pre-Ejection Period", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "Hematocrit": {"20570-8": ("Hematocrit", [4110])}, "HepaticVeinAtrialContractionReversalPeakVelocity": { "29474-4": ("Hepatic Vein Atrial Contraction Reversal Peak Velocity", [12216]) }, "HepaticVeinDiastolicPeakVelocity": { "29472-8": ("Hepatic Vein Diastolic Peak Velocity", [12216]) }, "HepaticVeinSystolicPeakVelocity": { "29471-0": ("Hepatic Vein Systolic Peak Velocity", [12216]) }, "HepaticVeinSystolicToDiastolicRatio": { "29473-6": ("Hepatic Vein Systolic to Diastolic Ratio", [12216]) }, "History": {"11329-0": ("History", [7001, 7002])}, "HolterStudyReport": {"18754-2": ("Holter Study Report", [7000])}, "HumerusJeanty1984": {"11936-2": ("Humerus, Jeanty 1984", [12012, 12013])}, "HumerusLength": {"11966-9": ("Humerus length", [12006])}, "HumerusLengthASUM2000": {"33116-5": ("Humerus Length, ASUM 2000", [12012, 12013])}, "HumerusLengthByGAASUM2000": { "33177-7": ("Humerus Length by GA, ASUM 2000", [12012, 12015]) }, "HumerusLengthOsaka1989": { "33117-3": ("Humerus Length, Osaka 1989", [12012, 12013]) }, "HumerusMerz1987": {"11937-0": ("Humerus, Merz 1987", [12012, 12013])}, "ICACCAVelocityRatio": {"33868-1": ("ICA/CCA velocity ratio", [12123])}, "IODMayden1982": {"33122-3": ("IOD, Mayden 1982", [12012, 12013])}, "IODTrout1994": {"33123-1": ("IOD, Trout 1994", [12012, 12013])}, "Impressions": {"19005-8": ("Impressions", [6052, 7001])}, "IndicationsForProcedure": { "18785-6": ("Indications for Procedure", [6052, 6053, 7001]) }, "InferiorVenaCavaDiameter": {"18006-7": ("Inferior Vena Cava Diameter", [12215])}, "InferiorVenaCavaDiameterAtEndExpiration": { "79967-6": ("Inferior vena cava diameter", [12300]) }, "InferiorVenaCavaPercentCollapse": { "18050-5": ("Inferior Vena Cava % Collapse", [12215]) }, "InnerOrbitalDiameter": {"33070-4": ("Inner Orbital Diameter", [12007])}, "InternalDimension": {"59090-1": ("Internal Dimension", [12304])}, "InterventricularSeptumDiastolicDimension2D": { "79969-2": ("Interventricular septum diastolic dimension 2D", [12300]) }, "InterventricularSeptumDiastolicDimensionMM": { "79968-4": ("Interventricular septum diastolic dimension MM", [12300]) }, "InterventricularSeptumDiastolicThickness": { "18154-5": ("Interventricular Septum Diastolic Thickness", [12200, 12201]) }, "InterventricularSeptumPercentThickening": { "18054-7": ("Interventricular Septum % Thickening", [12200, 12201]) }, "InterventricularSeptumSystolicDimension2D": { "79971-8": ("Interventricular septum systolic dimension 2D", [12300]) }, "InterventricularSeptumSystolicDimensionMM": { "79970-0": ("Interventricular septum systolic dimension MM", [12300]) }, "InterventricularSeptumSystolicThickness": { "18158-6": ("Interventricular Septum Systolic Thickness", [12200, 12201]) }, "InterventricularSeptumTimeToPeakDisplacement": { "79972-6": ("Interventricular septum time to peak displacement", [12300]) }, "InterventricularSeptumToPosteriorWallThicknessRatio": { "18155-2": ( "Interventricular Septum to Posterior Wall Thickness Ratio", [12200, 12201, 12257, 12259, 12271], ) }, "IntravascularDiastolicBloodPressure": { "8462-4": ("Intravascular diastolic blood pressure", [3611]) }, "IntravascularSystolicBloodPressure": { "8480-6": ("Intravascular Systolic Blood pressure", [3611]) }, "IsovolumicContractionTime": { "59084-4": ( "Isovolumic Contraction Time", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "IsovolumicRelaxationTime": { "59083-6": ( "Isovolumic Relaxation Time", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "JetArea": { "59123-0": ( "Jet Area", [ 12253, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12274, ], ) }, "KeyImages": {"55113-5": ("Key Images", [7001])}, "LMP": {"8665-2": ("LMP", [12003])}, "LVBasalAnteriorTimeToSVmaxTsBasalAnterior": { "80036-7": ("LV basal anterior time to S Vmax (Ts-basal anterior)", [12300]) }, "LVBasalAnteroseptalTimeToSVmaxTSBasalAnteroseptal": { "80037-5": ( "LV basal anteroseptal time to S Vmax (TS-basal anteroseptal)", [12300], ) }, "LVBasalInferiorTimeToSVmaxTsBasalInferior": { "80038-3": ("LV basal inferior time to S Vmax (Ts-basal inferior)", [12300]) }, "LVBasalLateralTimeToSVmaxTsBasalLateral": { "80039-1": ("LV basal lateral time to S Vmax (Ts-basal lateral)", [12300]) }, "LVBasalPosteriorTimeToSVmaxTsBasalPosterior": { "80040-9": ("LV basal posterior time to S Vmax (Ts-basal posterior)", [12300]) }, "LVBasalSeptalTimeToSVmaxTsBasalSeptal": { "80041-7": ("LV basal septal time to S Vmax (Ts-basal septal)", [12300]) }, "LVMidAnteriorTimeToSVmaxTsMidAnterior": { "80042-5": ("LV mid anterior time to S Vmax (Ts-mid anterior)", [12300]) }, "LVMidAnteroseptalTimeToSVmaxTsMidAnteroseptal": { "80043-3": ("LV mid anteroseptal time to S Vmax (Ts-mid anteroseptal)", [12300]) }, "LVMidInferiorTimeToSVmaxTsMidInferior": { "80044-1": ("LV mid inferior time to S Vmax (Ts-mid inferior)", [12300]) }, "LVMidLateralTimeToSVmaxTsMidLateral": { "80045-8": ("LV mid lateral time to S Vmax (Ts-mid lateral)", [12300]) }, "LVMidPosteriorTimeToSVmaxTsMidPosterior": { "80046-6": ("LV mid posterior time to S Vmax (Ts-mid posterior)", [12300]) }, "LVMidSeptalTimeToSVmaxTsMidSeptal": { "80047-4": ("LV mid septal time to S Vmax (Ts-mid septal)", [12300]) }, "LVTsSDDyssynchronyIndex": {"80048-2": ("LV Ts-SD (Dyssynchrony Index)", [12300])}, "LateralVentricleWidth": {"12171-5": ("Lateral Ventricle width", [12007])}, "LeafletSeparation": { "59109-9": ( "Leaflet Separation", [12251, 12262, 12263, 12266, 12267, 12268, 12271, 12272], ) }, "LeafletThickness": { "59110-7": ( "Leaflet Thickness", [12251, 12262, 12263, 12266, 12267, 12268, 12271, 12272], ) }, "LeftAtrialAppendagePeakVelocity": { "29486-8": ("Left Atrial Appendage Peak Velocity", [12205]) }, "LeftAtrialEndSystolicArea2C": { "79973-4": ("Left atrial end systolic area 2C", [12300]) }, "LeftAtrialEndSystolicArea4C": { "79974-2": ("Left atrial end systolic area 4C", [12300]) }, "LeftAtrialEndSystolicDiameterAP2D": { "79975-9": ("Left atrial end systolic diameter (AP) 2D", [12300]) }, "LeftAtrialEndSystolicDiameterAP2DBSA": { "79976-7": ("Left atrial end systolic diameter (AP) 2D / BSA", [12300]) }, "LeftAtrialEndSystolicDiameterAPMM": { "79977-5": ("Left atrial end systolic diameter (AP) MM", [12300]) }, "LeftAtrialEndSystolicDiameterAPMMBSA": { "79978-3": ("Left atrial end systolic diameter (AP) MM / BSA", [12300]) }, "LeftAtrialEndSystolicLength2C": { "79979-1": ("Left atrial end systolic length 2C", [12300]) }, "LeftAtrialEndSystolicLength4C": { "79980-9": ("Left atrial end systolic length 4C", [12300]) }, "LeftAtrialEndSystolicVolumeBiplaneAreaLength": { "79981-7": ("Left atrial end systolic volume biplane (area-length)", [12300]) }, "LeftAtrialEndSystolicVolumeBiplaneAreaLengthBSA": { "79982-5": ( "Left atrial end systolic volume biplane (area-length) / BSA", [12300], ) }, "LeftAtrialEndSystolicVolumeBiplaneMOD": { "79983-3": ("Left atrial end systolic volume biplane (MOD)", [12300]) }, "LeftAtrialEndSystolicVolumeBiplaneMODBSA": { "79984-1": ("Left atrial end systolic volume biplane (MOD) / BSA", [12300]) }, "LeftAtrialEndSystolicVolumeSinglePlane2CMOD": { "79985-8": ("Left atrial end systolic volume single plane 2C (MOD)", [12300]) }, "LeftAtrialEndSystolicVolumeSinglePlane4CMOD": { "79986-6": ("Left atrial end systolic volume single plane 4C (MOD)", [12300]) }, "LeftAtriumAnteroPosteriorSystolicDimension": { "29469-4": ("Left Atrium Antero-posterior Systolic Dimension", [12205]) }, "LeftAtriumAreaA4CView": {"17977-0": ("Left Atrium Area A4C view", [12205])}, "LeftAtriumToAorticRootRatio": { "17985-3": ("Left Atrium to Aortic Root Ratio", [12205, 12265]) }, "LeftAtriumVolumeToRightAtriumVolumeRatio": { "59131-3": ("Left Atrium Volume to Right Atrium Volume Ratio", [12265]) }, "LeftFetalEarLength": {"53684-7": ("Left Fetal Ear Length", [12005])}, "LeftKidneyLength": {"11834-9": ("Left Kidney length", [12005])}, "LeftKidneyThickness": {"11853-9": ("Left Kidney thickness", [12005])}, "LeftKidneyWidth": {"11825-7": ("Left Kidney width", [12005])}, "LeftPulmonaryArteryDiameter": { "18019-0": ("Left Pulmonary Artery Diameter", [12210]) }, "LeftPulmonaryArteryDiameterAtEndSystole": { "79987-4": ("Left pulmonary artery diameter", [12300]) }, "LeftVenticularPosteriorWallTimeToPeakDisplacement": { "79988-2": ("Left venticular posterior wall time to peak displacement", [12300]) }, "LeftVentricleDiastolicMajorAxis": { "18077-8": ("Left Ventricle diastolic major axis", [12200, 12201]) }, "LeftVentricleEToATissueVelocityRatio": { "59129-7": ( "Left Ventricle E to A Tissue Velocity Ratio", [12257, 12259, 12271], ) }, "LeftVentricleInternalEndDiastolicDimension": { "29436-3": ("Left Ventricle Internal End Diastolic Dimension", [12200, 12201]) }, "LeftVentricleInternalSystolicDimension": { "29438-9": ("Left Ventricle Internal Systolic Dimension", [12200, 12201]) }, "LeftVentricleMass": {"18087-7": ("Left Ventricle Mass", [12200, 12203])}, "LeftVentricleMeridionalWallStress": { "59097-6": ("Left Ventricle Meridional Wall Stress", [12257, 12259, 12271]) }, "LeftVentriclePosteriorWallDiastolicThickness": { "18152-9": ("Left Ventricle Posterior Wall Diastolic Thickness", [12200, 12201]) }, "LeftVentriclePosteriorWallPercentThickening": { "18053-9": ("Left Ventricle Posterior Wall % Thickening", [12200, 12201]) }, "LeftVentriclePosteriorWallSystolicThickness": { "18156-0": ("Left Ventricle Posterior Wall Systolic Thickness", [12200, 12201]) }, "LeftVentricleRightVentricleDiameterRatio": { "59078-6": ("Left Ventricle/Right Ventricle Diameter Ratio", [12279]) }, "LeftVentricleSystolicMajorAxis": { "18076-0": ("Left Ventricle systolic major axis", [12200, 12201]) }, "LeftVentricularEDVolume": {"8821-1": ("Left Ventricular ED Volume", [3468, 3835])}, "LeftVentricularESVolume": {"8823-7": ("Left Ventricular ES Volume", [3469, 3835])}, "LeftVentricularEjectionFraction3D": { "79990-8": ("Left ventricular ejection fraction 3D", [12300]) }, "LeftVentricularEjectionFractionBiplaneMOD": { "79991-6": ("Left ventricular ejection fraction biplane (MOD)", [12300]) }, "LeftVentricularEjectionFractionByAngiography": { "8808-8": ("Left Ventricular Ejection Fraction by Angiography", [3467]) }, "LeftVentricularEjectionFractionByCT": { "8810-4": ("Left ventricular ejection fraction by CT", [3833]) }, "LeftVentricularEjectionFractionByMR": { "8811-2": ("Left ventricular ejection fraction by MR", [3833]) }, "LeftVentricularEjectionFractionByUS": { "18043-0": ("Left Ventricular Ejection Fraction by US", [12200, 12202]) }, "LeftVentricularEjectionFractionSinglePlane2CMOD": { "79992-4": ("Left ventricular ejection fraction single plane 2C (MOD)", [12300]) }, "LeftVentricularEjectionFractionSinglePlane4CMOD": { "79993-2": ("Left ventricular ejection fraction single plane 4C (MOD)", [12300]) }, "LeftVentricularEjectionFractionTeichholz2D": { "77891-0": ("Left ventricular ejection fraction (Teichholz) 2D", [12300]) }, "LeftVentricularEjectionFractionTeichholzMM": { "18049-7": ("Left ventricular ejection fraction (Teichholz) MM", [12300]) }, "LeftVentricularEndDiastolicLength4C": { "79994-0": ("Left ventricular end diastolic length 4C", [12300]) }, "LeftVentricularEndDiastolicVolume": { "18026-5": ("Left Ventricular End Diastolic Volume", [12200, 12202]) }, "LeftVentricularEndDiastolicVolume3D": { "79995-7": ("Left ventricular end diastolic volume (3D)", [12300]) }, "LeftVentricularEndDiastolicVolumeBiplaneMOD": { "79996-5": ("Left ventricular end diastolic volume biplane (MOD)", [12300]) }, "LeftVentricularEndDiastolicVolumeBiplaneMODBSA": { "79997-3": ( "Left ventricular end diastolic volume biplane (MOD) / BSA", [12300], ) }, "LeftVentricularEndDiastolicVolumeSinglePlane2CMOD": { "79998-1": ( "Left ventricular end diastolic volume single plane 2C (MOD)", [12300], ) }, "LeftVentricularEndDiastolicVolumeSinglePlane4CMOD": { "79999-9": ( "Left ventricular end diastolic volume single plane 4C (MOD)", [12300], ) }, "LeftVentricularEndSystolicVolume": { "18148-7": ("Left Ventricular End Systolic Volume", [12200, 12202]) }, "LeftVentricularEndSystolicVolume3D": { "80000-3": ("Left ventricular end systolic volume (3D)", [12300]) }, "LeftVentricularEndSystolicVolumeBiplaneMOD": { "80001-1": ("Left ventricular end systolic volume biplane (MOD)", [12300]) }, "LeftVentricularEndSystolicVolumeBiplaneMODBSA": { "80002-9": ("Left ventricular end systolic volume biplane (MOD) / BSA", [12300]) }, "LeftVentricularEndSystolicVolumeSinglePlane2CMOD": { "80003-7": ( "Left ventricular end systolic volume single plane 2C (MOD)", [12300], ) }, "LeftVentricularEndSystolicVolumeSinglePlane4CMOD": { "80004-5": ( "Left ventricular end systolic volume single plane 4C (MOD)", [12300], ) }, "LeftVentricularEndocardialAreaSAXPMLevel": { "80005-2": ("Left ventricular endocardial area SAX PM level", [12300]) }, "LeftVentricularEpicardialAreaSAXPMLevel": { "80006-0": ("Left ventricular epicardial area SAX PM level", [12300]) }, "LeftVentricularFractionalShortening": { "18051-3": ("Left Ventricular Fractional Shortening", [12200, 12201]) }, "LeftVentricularFractionalShorteningOfMinorAxis2D": { "29434-8": ( "Left ventricular fractional shortening (of minor axis) (2D)", [12300], ) }, "LeftVentricularFractionalShorteningOfMinorAxisMM": { "29435-5": ( "Left ventricular fractional shortening (of minor axis) (MM)", [12300], ) }, "LeftVentricularInternalDiastolicDimension2D": { "80007-8": ("Left ventricular internal diastolic dimension - 2D", [12300]) }, "LeftVentricularInternalDiastolicDimensionByUS2DBSA": { "80010-2": ("Left ventricular internal diastolic dimension / BSA", [12300]) }, "LeftVentricularInternalDiastolicDimensionByUSMModeBSA": { "80009-4": ("Left ventricular internal diastolic dimension / BSA", [12300]) }, "LeftVentricularInternalDiastolicDimensionMM": { "80008-6": ("Left ventricular internal diastolic dimension - MM", [12300]) }, "LeftVentricularInternalSystolicDimension2D": { "80011-0": ("Left ventricular internal systolic dimension - 2D", [12300]) }, "LeftVentricularInternalSystolicDimensionByUS2DBSA": { "80014-4": ("Left ventricular internal systolic dimension / BSA", [12300]) }, "LeftVentricularInternalSystolicDimensionByUSMModeBSA": { "80013-6": ("Left ventricular internal systolic dimension / BSA", [12300]) }, "LeftVentricularInternalSystolicDimensionMM": { "80012-8": ("Left ventricular internal systolic dimension - MM", [12300]) }, "LeftVentricularIsovolumicRelaxationTime": { "18071-1": ("Left Ventricular Isovolumic Relaxation Time", [12200, 12203]) }, "LeftVentricularIsovolumicRelaxationTimeByDoppler": { "18071-1": ("Left ventricular isovolumic relaxation time by Doppler", [12300]) }, "LeftVentricularIsovolumicRelaxationTimeByTDI": { "80015-1": ("Left ventricular isovolumic relaxation time by TDI", [12300]) }, "LeftVentricularMass": { "80025-0": ("Left ventricular mass (truncated ellipse)", [12300]) }, "LeftVentricularMassAreaLength": { "80016-9": ("Left ventricular mass (area-length)", [12300]) }, "LeftVentricularMassAreaLengthBSA": { "80017-7": ("Left ventricular mass (area-length) / BSA", [12300]) }, "LeftVentricularMassAreaLengthHeight2Point7": { "80018-5": ("Left ventricular mass (area-length) / height^^2.7", [12300]) }, "LeftVentricularMassDimensionMethod2D": { "80019-3": ("Left ventricular mass (dimension method) 2D", [12300]) }, "LeftVentricularMassDimensionMethod2DBSA": { "80020-1": ("Left ventricular mass (dimension method) 2D / BSA", [12300]) }, "LeftVentricularMassDimensionMethod2DHeight2Point7": { "80021-9": ( "Left ventricular mass (dimension method) 2D / height^^2.7", [12300], ) }, "LeftVentricularMassDimensionMethodMM": { "80022-7": ("Left ventricular mass (dimension method) MM", [12300]) }, "LeftVentricularMassDimensionMethodMMBSA": { "80023-5": ("Left ventricular mass (dimension method) MM / BSA", [12300]) }, "LeftVentricularMassDimensionMethodMMHeight2Point7": { "80024-3": ( "Left ventricular mass (dimension method) MM / height^^2.7", [12300], ) }, "LeftVentricularMassTruncatedEllipseBSA": { "80026-8": ("Left ventricular mass (truncated ellipse) / BSA", [12300]) }, "LeftVentricularMassTruncatedEllipseHeight2Point7": { "80027-6": ("Left ventricular mass (truncated ellipse) / height^^2.7", [12300]) }, "LeftVentricularOutflowTractDimension2D": { "80028-4": ("Left ventricular outflow tract dimension (2D)", [12300]) }, "LeftVentricularOutflowTractVTI": { "80030-0": ("Left ventricular outflow tract VTI", [12300]) }, "LeftVentricularOutflowTractVmax": { "80029-2": ("Left ventricular outflow tract Vmax", [12300]) }, "LeftVentricularPosteriorWallDiastolicThicknessByUS2D": { "80032-6": ("Left ventricular posterior wall diastolic thickness", [12300]) }, "LeftVentricularPosteriorWallDiastolicThicknessByUSMMode": { "80031-8": ("Left ventricular posterior wall diastolic thickness", [12300]) }, "LeftVentricularPosteriorWallSystolicThicknessByUS2D": { "80034-2": ("Left ventricular posterior wall systolic thickness", [12300]) }, "LeftVentricularPosteriorWallSystolicThicknessByUSMMode": { "80033-4": ("Left ventricular posterior wall systolic thickness", [12300]) }, "LeftVentricularPreEjectionPeriod": { "79989-0": ("Left ventricular pre-ejection period", [12300]) }, "LeftVentricularStrokeVolume3D": { "80035-9": ("Left ventricular stroke volume 3D", [12300]) }, "LengthOfVertebraTokyo1986": { "33118-1": ("Length of Vertebra, Tokyo 1986", [12012, 12013]) }, "MR3DCAMModel": {"85041-2": ("MR 3D CAM model", [7061])}, "MRIHeadReport": {"24590-2": ("MRI Head Report", [7000])}, "MRIReport": {"25056-3": ("MRI Report", [7000])}, "MRISpineReport": {"18756-7": ("MRI Spine Report", [7000])}, "MRIUnspecifiedBodyRegion": {"25056-3": ("MRI unspecified body region", [100])}, "MRIWholeBody": {"46358-8": ("MRI whole body", [646])}, "MainPulmonaryArteryDiameter": { "18020-8": ("Main Pulmonary Artery Diameter", [12210]) }, "MainPulmonaryArteryDiameterAtEndSystole": { "80049-0": ("Main pulmonary artery diameter", [12300]) }, "MainPulmonaryArteryVmax": {"": ("Main pulmonary artery Vmax", [12300])}, "MaleSingletonBWPByGAArbuckle1993": { "33186-8": ("Male Singleton BWP by GA, Arbuckle 1993", [12012, 12016]) }, "MaleTwinsBWPByGAArbuckle1993": { "33199-1": ("Male Twins BWP by GA, Arbuckle 1993", [12012, 12016]) }, "MammographyScreeningReport": {"24606-6": ("Mammography Screening Report", [7000])}, "MeanBloodVelocity": {"20352-1": ("Mean Blood Velocity", [12304])}, "MeanGradient": { "20256-4": ( "Mean Gradient", [ 12119, 12122, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "MeanGradientPressureByDoppler": { "20256-4": ("Mean Gradient [Pressure] by Doppler", [12304]) }, "MeanVelocityOfCircumferentialFiberShorteningMeanVcfv": { "59117-2": ( "Mean Velocity of Circumferential Fiber Shortening (Mean VcFv)", [ 12252, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "MedicationsAdministered": {"29549-3": ("Medications Administered", [7001])}, "MinimumDiastolicVelocity": { "11665-7": ("Minimum Diastolic Velocity", [12119, 12120]) }, "MitralAnnulusDiastolicDiameterA2C": { "80050-8": ("Mitral annulus diastolic diameter - A2C", [12300]) }, "MitralAnnulusDiastolicDiameterA4C": { "80051-6": ("Mitral annulus diastolic diameter - A4C", [12300]) }, "MitralAnnulusDiastolicDiameterPLAX": { "80052-4": ("Mitral annulus diastolic diameter - PLAX", [12300]) }, "MitralAnnulusVTI": {"80053-2": ("Mitral annulus VTI", [12300])}, "MitralLateralEPrimeVmax": {"80054-0": ("Mitral lateral e-prime Vmax", [12300])}, "MitralRegurgitantFlowPISA": { "80057-3": ("Mitral regurgitant flow (PISA)", [12300]) }, "MitralRegurgitantFractionContinuityVTI": { "80055-7": ("Mitral regurgitant fraction (Continuity VTI)", [12300]) }, "MitralRegurgitantFractionPISA": { "80056-5": ("Mitral regurgitant fraction (PISA)", [12300]) }, "MitralRegurgitationDpDtDerivedFromMitralRegVelocity": { "18035-6": ( "Mitral Regurgitation dP/dt derived from Mitral Reg. velocity", [12207, 12266, 12268], ) }, "MitralRegurgitationPISARadius": { "80059-9": ("Mitral regurgitation PISA radius", [12300]) }, "MitralRegurgitationPISAVelocity": { "80060-7": ("Mitral regurgitation PISA velocity", [12300]) }, "MitralRegurgitationPeakGradient": { "80058-1": ("Mitral regurgitation peak gradient", [12300]) }, "MitralRegurgitationVenaContractaWidth": { "80061-5": ("Mitral regurgitation vena contracta width", [12300]) }, "MitralRegurgitationVmax": {"80062-3": ("Mitral regurgitation Vmax", [12300])}, "MitralRegurgitationVolumeContinuityVTI": { "80063-1": ("Mitral regurgitation volume (Continuity VTI)", [12300]) }, "MitralRegurgitationVolumePISA": { "80064-9": ("Mitral regurgitation volume (PISA)", [12300]) }, "MitralSeptalEPrimeVmax": {"79911-4": ("Mitral septal e-prime Vmax", [12300])}, "MitralValveAWaveDuration": {"80065-6": ("Mitral valve A-wave duration", [12300])}, "MitralValveAWavePeakVelocity": { "17978-8": ("Mitral Valve A-Wave Peak Velocity", [12207]) }, "MitralValveAWaveVmax": {"80066-4": ("Mitral valve A-wave Vmax", [12300])}, "MitralValveAreaPISA": {"80067-2": ("Mitral valve area (PISA)", [12300])}, "MitralValveAreaPlanimetry": { "80068-0": ("Mitral valve area (Planimetry)", [12300]) }, "MitralValveAreaPressureHalfTime": { "80069-8": ("Mitral valve area (Pressure Half-Time)", [12300]) }, "MitralValveDecelerationTime": { "78191-4": ("Mitral valve deceleration time", [12300]) }, "MitralValveDiastolicPeakInstantaneousGradient": { "18057-0": ("Mitral Valve Diastolic Peak Instantaneous Gradient", [12207]) }, "MitralValveEFSlopeByMMode": { "18040-6": ("Mitral Valve E-F Slope by M-Mode", [12207]) }, "MitralValveEPSSEWave": { "18036-4": ("Mitral Valve EPSS, E wave", [12207, 12266, 12268]) }, "MitralValveESeptalSeparation": { "59098-4": ("Mitral Valve E-septal Separation", [12266, 12268]) }, "MitralValveEToARatio": {"18038-0": ("Mitral Valve E to A Ratio", [12207, 12300])}, "MitralValveEWavePeakVelocity": { "18037-2": ("Mitral Valve E-Wave Peak Velocity", [12207]) }, "MitralValveEWaveVmax": {"80070-6": ("Mitral valve E-wave Vmax", [12300])}, "MitralValveEffectiveRegurgitantOrificeAreaPISA": { "80071-4": ("Mitral valve effective regurgitant orifice area (PISA)", [12300]) }, "MitralValveFlowPropagationVelocityVp": { "80072-2": ("Mitral valve flow propagation velocity (Vp)", [12300]) }, "MitralValveMeanGradient": {"80073-0": ("Mitral valve mean gradient", [12300])}, "MitralValvePeakInstantaneousGradient": { "80074-8": ("Mitral valve peak instantaneous gradient", [12300]) }, "MitralValvePressureHalfTime": { "79912-2": ("Mitral valve pressure half-time", [12300]) }, "MitralValveVTI": {"79914-8": ("Mitral valve VTI", [12300])}, "MitralValveVmax": {"79913-0": ("Mitral valve Vmax", [12300])}, "MyocardialPerformanceIndexTei": { "59099-2": ( "Myocardial Performance Index (Tei)", [12255, 12257, 12258, 12259, 12265, 12271, 12304], ) }, "NMUnspecifiedBodyRegion": {"49118-3": ("NM unspecified body region", [100])}, "NuchalFoldThickness": {"12146-7": ("Nuchal Fold thickness", [12007])}, "NuchalTranslucency": {"33069-6": ("Nuchal Translucency", [12007, 12009, 12279])}, "NuclearMedicineReport": {"49118-3": ("Nuclear Medicine Report", [7000])}, "NuclearMedicineThyroidScanReport": { "30695-1": ("Nuclear Medicine Thyroid Scan Report", [7000]) }, "NumberOfFetusesByUS": {"11878-6": ("Number of Fetuses by US", [12018])}, "OFDASUM2000": {"33119-9": ("OFD, ASUM 2000", [12012, 12013])}, "OFDByGAASUM2000": {"33178-5": ("OFD by GA, ASUM 2000", [12012, 12015])}, "OFDByGAChitty1994": {"33179-3": ("OFD by GA, Chitty 1994", [12012, 12015])}, "OFDHansmann1985": {"33544-8": ("OFD, Hansmann 1985", [12012, 12013])}, "OFDHansmann1986": {"33120-7": ("OFD, Hansmann 1986", [12012, 12013])}, "OFDLessoway1998": {"33121-5": ("OFD, Lessoway 1998", [12012, 12013])}, "OODMayden1982": {"33124-9": ("OOD, Mayden, 1982", [12012, 12013])}, "OODTrout1994": {"33125-6": ("OOD, Trout 1994", [12012, 12013])}, "OccipitalFrontalDiameter": { "11851-3": ("Occipital-Frontal Diameter", [12005, 12279]) }, "OuterOrbitalDiameter": {"11629-3": ("Outer Orbital Diameter", [12007])}, "OvulationDate": {"11976-8": ("Ovulation date", [12003])}, "OxygenPartialPressureAt50PercentSaturationP50": { "19217-9": ("Oxygen partial pressure at 50% saturation (P50)", [3524]) }, "PETScanReport": {"44136-0": ("PET Scan Report", [7000])}, "PETUnspecifiedBodyRegion": {"44136-0": ("PET unspecified body region", [100])}, "PETWholeBody": {"44139-4": ("PET whole body", [100, 646])}, "PatientPresentation": {"55108-5": ("Patient Presentation", [7001, 7002])}, "PeakBloodVelocity": { "20355-4": ( "Peak Blood Velocity", [ 12119, 12120, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "PeakEWavePeakAWaveByUS": { "59104-0": ( "Peak E wave/Peak A wave by US", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "PeakGradient": { "20247-3": ( "Peak Gradient", [ 12119, 12122, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "PeakGradientPressure": {"20247-3": ("Peak Gradient [Pressure]", [12304])}, "PeakInstantaneousFlowRate": { "34141-2": ( "Peak Instantaneous Flow Rate", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "PeakReversalVelocityDuringAtrialContraction": { "59079-4": ( "Peak Reversal Velocity during Atrial Contraction", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "PeakSystolicVelocity": { "11726-7": ( "Peak Systolic Velocity", [ 12119, 12120, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "PeakTissueVelocity": {"59133-9": ("Peak Tissue Velocity", [12257, 12259, 12271])}, "PercentThickening": { "59092-7": ( "% Thickening", [ 12252, 12257, 12259, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "PosteriorHornLateralVentricularWidth": { "33196-7": ("Posterior Horn Lateral ventricular width", [12007]) }, "PreEjectionPeriod": { "59085-1": ( "Pre-Ejection Period", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "PreEjectionPeriodEjectionTimeRatio": { "59088-5": ( "Pre-Ejection Period/Ejection Time Ratio", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "PressureHalfTime": { "20280-4": ( "Pressure Half-Time", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "PreviousFindings": {"18834-2": ("Previous Findings", [7001])}, "PriorProcedureDescriptions": {"55114-3": ("Prior Procedure Descriptions", [7001])}, "ProstateCancerAntigen": {"2857-1": ("Prostate Cancer Antigen", [6352])}, "ProstateSpecificAntigenDensity": { "15325-4": ("Prostate specific Antigen Density", [6352]) }, "PulmVeinADurationToMVADurationDifference": { "59114-9": ("Pulm Vein A duration to MV A duration difference", [12261, 12263]) }, "PulmonaryArteryMainOxygenContent": { "10245-9": ("Pulmonary Artery Main Oxygen content", [3525]) }, "PulmonaryArteryPressureUsingAccelTime": { "59101-6": ( "Pulmonary Artery Pressure using Accel Time", [12262, 12263, 12271, 12272], ) }, "PulmonaryToSystemicShuntFlowRatio": { "29462-9": ("Pulmonary-to-Systemic Shunt Flow Ratio", [12217, 12276]) }, "PulmonaryVeinADurationMitralValveADurationRatio": { "59112-3": ( "Pulmonary Vein A Duration Mitral Valve A Duration Ratio", [12261, 12263], ) }, "PulmonaryVeinAVTIToMitralValveVTIRatio": { "59113-1": ("Pulmonary Vein A VTI to Mitral Valve VTI Ratio", [12261, 12263]) }, "PulmonaryVeinAWaveDuration": { "78184-9": ("Pulmonary vein A-wave duration", [12300]) }, "PulmonaryVeinAWaveVmax": {"79915-5": ("Pulmonary vein A-wave Vmax", [12300])}, "PulmonaryVeinAtrialContractionReversalPeakVelocity": { "29453-8": ("Pulmonary Vein Atrial Contraction Reversal Peak Velocity", [12214]) }, "PulmonaryVeinDWaveVmax": {"79916-3": ("Pulmonary vein D-wave Vmax", [12300])}, "PulmonaryVeinDiastolicPeakVelocity": { "29451-2": ("Pulmonary Vein Diastolic Peak Velocity", [12214]) }, "PulmonaryVeinSWaveVmax": {"79917-1": ("Pulmonary vein S-wave Vmax", [12300])}, "PulmonaryVeinSystolicPeakVelocity": { "29450-4": ("Pulmonary Vein Systolic Peak Velocity", [12214]) }, "PulmonaryVeinSystolicToDiastolicRatio": { "29452-0": ("Pulmonary Vein Systolic to Diastolic Ratio", [12214]) }, "PulmonaryWedgeOxygenContent": { "10247-5": ("Pulmonary Wedge Oxygen content", [3525]) }, "PulmonicAnnulusDiameter": {"79909-8": ("Pulmonic annulus diameter", [12300])}, "PulmonicRegurgitationEndDiastolicPeakGradient": { "79934-6": ("Pulmonic regurgitation end diastolic peak gradient", [12300]) }, "PulmonicRegurgitationEndDiastolicVelocity": { "79918-9": ("Pulmonic regurgitation end diastolic velocity", [12300]) }, "PulmonicRegurgitationVmax": {"79919-7": ("Pulmonic regurgitation Vmax", [12300])}, "PulmonicValveAccelerationTime": { "79928-8": ("Pulmonic valve acceleration time", [12300]) }, "PulmonicValveAreaByContinuity": { "18096-8": ("Pulmonic Valve Area by continuity", [12209]) }, "PulmonicValveEjectionTime": { "18042-2": ("Pulmonic Valve Ejection Time", [12209, 12300]) }, "PulmonicValvePeakGradient": {"79935-3": ("Pulmonic valve peak gradient", [12300])}, "PulmonicValveVTI": {"79910-6": ("Pulmonic valve VTI", [12300])}, "PulmonicValveVmax": {"79920-5": ("Pulmonic valve Vmax", [12300])}, "PulsatilityIndex": {"12008-9": ("Pulsatility Index", [12119, 12121])}, "ROIInternalDimensionByUS": { "59090-1": ( "ROI Internal Dimension by US", [ 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, ], ) }, "ROIThicknessByUS": { "59089-3": ( "ROI Thickness by US", [ 12218, 12250, 12251, 12257, 12258, 12259, 12260, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12277, ], ) }, "RadiationExposureAndProtectionInformation": { "73569-6": ("Radiation Exposure and Protection Information", [7001]) }, "RadiologyReport": {"11528-7": ("Radiology Report", [7000])}, "RadionuclideBrainScan": {"24730-4": ("Radionuclide brain scan", [646])}, "RadionuclideScanOfWholeBody": { "42175-0": ("Radionuclide scan of whole body", [646]) }, "RadiusByGAJeanty1983": {"33180-1": ("Radius by GA, Jeanty 1983", [12012, 12015])}, "RadiusJeanty1983": {"33126-4": ("Radius, Jeanty 1983", [12012, 12013])}, "RadiusLength": {"11967-7": ("Radius length", [12006])}, "RadiusMerz1987": {"11939-6": ("Radius, Merz 1987", [12012, 12013])}, "Recommendations": {"18783-1": ("Recommendations", [6052, 7001])}, "RelevantDiagnosticTestsAndOrLaboratoryData": { "30954-2": ("Relevant Diagnostic Tests and/or Laboratory Data", [9509]) }, "RenalArteryAortaVelocityRatio": { "33869-9": ("Renal Artery/Aorta velocity ratio", [12124]) }, "Request": {"55115-0": ("Request", [7001, 7002])}, "ResistivityIndex": {"12023-8": ("Resistivity Index", [12119, 12121])}, "RespirationRhythm": {"9304-7": ("Respiration Rhythm", [3441])}, "RightAtrialEndSystolicArea4C": { "80075-5": ("Right atrial end systolic area 4C", [12300]) }, "RightAtrialMajorAxisDimension4C": { "80076-3": ("Right atrial major axis dimension 4C", [12300]) }, "RightAtrialMinorAxisDimension4C": { "80077-1": ("Right atrial minor axis dimension 4C", [12300]) }, "RightAtrialMinorAxisDimension4CBSA": { "80078-9": ("Right atrial minor axis dimension 4C / BSA", [12300]) }, "RightAtriumAreaA4CView": {"17988-7": ("Right Atrium Area A4C view", [12206])}, "RightAtriumSystolicPressure": { "18070-3": ("Right Atrium Systolic Pressure", [12206]) }, "RightFetalEarLength": {"53668-0": ("Right Fetal Ear Length", [12005])}, "RightKidneyLength": {"11836-4": ("Right Kidney length", [12005])}, "RightKidneyThickness": {"11855-4": ("Right Kidney thickness", [12005])}, "RightKidneyWidth": {"11827-3": ("Right Kidney width", [12005])}, "RightPulmonaryArteryDiameter": { "18021-6": ("Right Pulmonary Artery Diameter", [12210]) }, "RightPulmonaryArteryDiameterAtEndSystole": { "80079-7": ("Right pulmonary artery diameter", [12300]) }, "RightVentricularAnteriorWallDiastolicThickness": { "18153-7": ("Right Ventricular Anterior Wall Diastolic Thickness", [12204]) }, "RightVentricularAnteriorWallSystolicThickness": { "18157-8": ("Right Ventricular Anterior Wall Systolic Thickness", [12204]) }, "RightVentricularBasalDimension4C": { "80080-5": ("Right ventricular basal dimension 4C", [12300]) }, "RightVentricularEDVolume": { "8822-9": ("Right Ventricular ED Volume", [3468, 3835]) }, "RightVentricularESVolume": { "8824-5": ("Right Ventricular ES Volume", [3469, 3835]) }, "RightVentricularEjectionFractionByAngiography": { "8815-3": ("Right Ventricular Ejection Fraction by Angiography", [3467]) }, "RightVentricularEjectionFractionByCT": { "8817-9": ("Right ventricular ejection fraction by CT", [3833]) }, "RightVentricularEjectionFractionByMR": { "8818-7": ("Right ventricular ejection fraction by MR", [3833]) }, "RightVentricularEjectionTime": { "79929-6": ("Right ventricular ejection time", [12300]) }, "RightVentricularEndDiastolicArea4C": { "80081-3": ("Right ventricular end diastolic area 4C", [12300]) }, "RightVentricularEndSystolicArea4C": { "80082-1": ("Right ventricular end systolic area 4C", [12300]) }, "RightVentricularFractionalAreaChange": { "79936-1": ("Right ventricular fractional area change", [12300]) }, "RightVentricularFreeWallThickness2D": { "80083-9": ("Right ventricular free wall thickness 2D", [12300]) }, "RightVentricularFreeWallThicknessMM": { "80084-7": ("Right ventricular free wall thickness MM", [12300]) }, "RightVentricularInternalDiastolicDimension": { "20304-2": ("Right Ventricular Internal Diastolic Dimension", [12204]) }, "RightVentricularInternalSystolicDimension": { "20305-9": ("Right Ventricular Internal Systolic Dimension", [12204]) }, "RightVentricularMidCavityDimension4C": { "80085-4": ("Right ventricular mid-cavity dimension 4C", [12300]) }, "RightVentricularMyocardialPerformanceIndex": { "80086-2": ("Right ventricular myocardial performance index", [12300]) }, "RightVentricularOutflowTractDiameterAtPulmonicValveRVOTDistal": { "80087-0": ( "Right ventricular outflow tract diameter at pulmonic valve (RVOT-Distal)", [12300], ) }, "RightVentricularOutflowTractDiameterAtSubvalvularLevelRVOTProximal": { "80088-8": ( "Right ventricular outflow tract diameter at subvalvular level (RVOT-Proximal)", [12300], ) }, "RightVentricularOutflowTractVTI": { "80089-6": ("Right ventricular outflow tract VTI", [12300]) }, "RightVentricularPreEjectionPeriod": { "80090-4": ("Right ventricular pre-ejection period", [12300]) }, "SPECTBrain": {"39632-5": ("SPECT brain", [100])}, "SecondQuadrantDiameter": {"11626-9": ("Second Quadrant Diameter", [12008])}, "SpineLength": {"33071-2": ("Spine Length", [12009])}, "SpineLengthTokyo1989": {"33127-2": ("Spine Length, Tokyo, 1989", [12012, 12013])}, "StenosisPeakGradient": { "59106-5": ( "Stenosis Peak Gradient", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "StenosisPeakVelocity": { "59107-3": ( "Stenosis Peak Velocity", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "Summary": {"55112-7": ("Summary", [7001, 7002])}, "SystolicToDiastolicVelocityRatio": { "12144-2": ( "Systolic to Diastolic Velocity Ratio", [ 12119, 12121, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "TADEriksen1985": {"33128-0": ("TAD, Eriksen 1985", [12012, 12013])}, "TADHansmann1979": {"33129-8": ("TAD Hansmann, 1979", [12012, 12013])}, "TADTokyo1986": {"33130-6": ("TAD, Tokyo 1986", [12012, 12013])}, "TCDByGAGoldstein1987": {"33181-9": ("TCD by GA Goldstein 1987", [12012, 12015])}, "TCDChitty1994": {"33132-2": ("TCD, Chitty 1994", [12012, 12013])}, "TCDGoldstein1987": {"33133-0": ("TCD, Goldstein 1987", [12012, 12013])}, "TCDHill1990": {"33134-8": ("TCD, Hill 1990", [12012, 12013])}, "TCDNimrod1986": {"33135-5": ("TCD, Nimrod 1986", [12012, 12013])}, "ThcChitkara1987": {"33131-4": ("ThC, Chitkara 1987", [12012, 12013])}, "Thickness": {"59089-3": ("Thickness", [12304])}, "ThirdQuadrantDiameter": {"11625-1": ("Third Quadrant Diameter", [12008])}, "ThoracicAortaCoarctationSystolicPeakInstantaneousGradient": { "17995-2": ( "Thoracic Aorta Coarctation Systolic Peak Instantaneous Gradient", [12212], ) }, "ThoracicAortaCoarctationSystolicPeakVelocity": { "29460-3": ("Thoracic Aorta Coarctation Systolic Peak Velocity", [12212]) }, "ThoracicArea": {"33068-8": ("Thoracic Area", [12005, 12279])}, "ThoracicCircumference": {"11988-3": ("Thoracic Circumference", [12005, 12279])}, "TibiaJeanty1984": {"11941-2": ("Tibia, Jeanty 1984", [12012, 12013])}, "TibiaLength": {"11968-5": ("Tibia length", [12006])}, "TibialBrachialIndex": {"8581-1": ("Tibial/brachial index", [3620])}, "TimeAveragedMeanVelocity": { "20352-1": ( "Time averaged mean velocity", [ 12119, 12120, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "TimeAveragedPeakVelocity": { "11692-1": ( "Time averaged peak velocity", [ 12119, 12120, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "TimeFromQWaveToPulmonicValveCloses": { "20295-2": ( "Time from Q wave to Pulmonic Valve Closes", [12209, 12262, 12263, 12271, 12272], ) }, "TimeFromQWaveToTricuspidValveOpens": { "20296-0": ("Time from Q wave to Tricuspid Valve Opens", [12208, 12267, 12268]) }, "TimeToLeftVentricleETissueVelocity": { "59096-8": ("Time to Left Ventricle E Tissue Velocity", [12257, 12259, 12271]) }, "TimeToLeftVentricleSTissueVelocity": { "59095-0": ("Time to Left Ventricle S Tissue Velocity", [12257, 12259, 12271]) }, "TimeToPeakByUS": { "59121-4": ( "Time to Peak by US", [ 12254, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12266, 12267, 12268, 12270, 12271, 12272, 12274, ], ) }, "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleAWave": { "59125-5": ( "Tissue Velocity Time Integral (VTI) for the area under Left Ventricle A wave", [12257, 12259, 12271], ) }, "TissueVelocityTimeIntegralVTIForTheAreaUnderLeftVentricleEWave": { "59124-8": ( "Tissue Velocity Time Integral (VTI) for the area under Left Ventricle E wave", [12257, 12259, 12271], ) }, "TransverseAbdominalDiameter": { "11862-0": ("Transverse Abdominal Diameter", [12005, 12279]) }, "TransverseCerebellarDiameter": { "11863-8": ("Transverse Cerebellar Diameter", [12005, 12007, 12279]) }, "TransverseThoracicDiameter": { "11864-6": ("Transverse Thoracic Diameter", [12005, 12279]) }, "TransverseThoracicDiameterHansmann1985": { "33136-3": ("Transverse Thoracic Diameter, Hansmann 1985", [12012, 12013]) }, "TransverseThoracicDiameterLessoway1998": { "33137-1": ("Transverse Thoracic Diameter, Lessoway 1998", [12012, 12013]) }, "TricuspidAnnularPlaneSystolicExcursionTAPSE": { "77903-3": ("Tricuspid Annular Plane Systolic Excursion (TAPSE)", [12300]) }, "TricuspidAnnulusDiameter": {"80091-2": ("Tricuspid annulus diameter", [12300])}, "TricuspidRegurgitationDpDt": { "18034-9": ("Tricuspid Regurgitation dP/dt", [12208]) }, "TricuspidRegurgitationPISARadius": { "79932-0": ("Tricuspid regurgitation PISA radius", [12300]) }, "TricuspidRegurgitationPeakGradient": { "79937-9": ("Tricuspid regurgitation peak gradient", [12300]) }, "TricuspidRegurgitationVenaContractaWidth": { "79933-8": ("Tricuspid regurgitation vena contracta width", [12300]) }, "TricuspidRegurgitationVmax": { "79921-3": ("Tricuspid regurgitation Vmax", [12300]) }, "TricuspidValveAPrimeVmax": {"79922-1": ("Tricuspid valve a-prime Vmax", [12300])}, "TricuspidValveAWavePeakVelocity": { "18030-7": ("Tricuspid Valve A Wave Peak Velocity", [12208]) }, "TricuspidValveAWaveVmax": {"79923-9": ("Tricuspid valve A-wave Vmax", [12300])}, "TricuspidValveClosureToOpeningTime": { "79930-4": ("Tricuspid valve closure to opening time", [12300]) }, "TricuspidValveDecelerationTime": { "79931-2": ("Tricuspid valve deceleration time", [12300]) }, "TricuspidValveDiastolicVTI": { "18175-0": ("Tricuspid valve diastolic VTI", [12300]) }, "TricuspidValveEPrimeVmax": {"79924-7": ("Tricuspid valve e-prime Vmax", [12300])}, "TricuspidValveEToARatio": {"18039-8": ("Tricuspid Valve E to A Ratio", [12208])}, "TricuspidValveEWavePeakVelocity": { "18031-5": ("Tricuspid Valve E Wave Peak Velocity", [12208]) }, "TricuspidValveEWaveVmax": {"79925-4": ("Tricuspid valve E-wave Vmax", [12300])}, "TricuspidValveMeanGradient": { "79938-7": ("Tricuspid valve mean gradient", [12300]) }, "TricuspidValvePeakGradient": { "79939-5": ("Tricuspid valve peak gradient", [12300]) }, "TricuspidValvePressureHalfTime": { "18032-3": ("Tricuspid valve pressure half-time", [12300]) }, "TricuspidValveSPrimeVmax": {"79926-2": ("Tricuspid valve s-prime Vmax", [12300])}, "TricuspidValveVmax": {"79927-0": ("Tricuspid valve Vmax", [12300])}, "USArteryReport": {"46375-2": ("US Artery Report", [7000, 12100])}, "USBreastReport": {"24601-7": ("US Breast Report", [7000, 12320])}, "USCarotidArteriesReport": { "24616-5": ("US Carotid Arteries Report", [7000, 12100]) }, "USDopplerAbdominalVesselsReport": { "24534-0": ("US Doppler Abdominal Vessels Report", [7000, 12100]) }, "USDopplerExtremityVesselsReport": { "43771-5": ("US Doppler Extremity Vessels Report", [7000, 12100]) }, "USDopplerHeadVesselsReport": { "24733-8": ("US Doppler Head Vessels Report", [7000, 12100]) }, "USDopplerLowerExtremityVesselsReport": { "44174-1": ("US Doppler Lower Extremity Vessels Report", [7000, 12100]) }, "USDopplerUpperExtremityVesselsReport": { "39448-6": ("US Doppler Upper Extremity Vessels Report", [7000, 12100]) }, "USDopplerVesselsReport": {"39445-2": ("US Doppler Vessels Report", [7000, 12100])}, "USKidneyReport": {"38036-0": ("US Kidney Report", [7000, 12320])}, "USLiverReport": {"28614-6": ("US Liver Report", [7000, 12320])}, "USPancreasReport": {"24859-1": ("US Pancreas Report", [7000, 12320])}, "USPelvis": {"24869-0": ("US Pelvis", [12024])}, "USProstateTransrectalReport": { "24884-9": ("US Prostate (transrectal) Report", [7000, 12320]) }, "USScrotumAndTesticleReport": { "25002-7": ("US Scrotum and Testicle Report", [7000, 12320]) }, "USShoulderReport": {"24907-8": ("US Shoulder Report", [7000, 12320])}, "USSpleenReport": {"24990-4": ("US Spleen Report", [7000, 12320])}, "USTendonReport": {"39453-6": ("US Tendon Report", [7000, 12320])}, "USThyroidReport": {"25010-0": ("US Thyroid Report", [7000, 12320])}, "USVeinReport": {"39036-9": ("US Vein Report", [7000, 12100])}, "UlnaJeanty1984": {"11944-6": ("Ulna, Jeanty 1984", [12012, 12013])}, "UlnaLength": {"11969-3": ("Ulna length", [12006])}, "UlnaMerz1987": {"11945-3": ("Ulna, Merz 1987", [12012, 12013])}, "UltrasoundObstetricAndGynReport": { "11525-3": ("Ultrasound Obstetric and Gyn Report", [7000]) }, "UltrasoundReport": {"25061-3": ("Ultrasound Report", [7000, 12320])}, "VelocityOfFlowPropagation": { "59115-6": ( "Velocity of Flow Propagation", [ 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "VelocityRatio": {"33867-3": ("Velocity ratio", [12119, 12121])}, "VelocityTimeIntegral": { "20354-7": ( "Velocity Time Integral", [ 12119, 12120, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, 12304, ], ) }, "VenousBloodBaseExcess": {"1927-3": ("Venous Blood Base Excess", [3527])}, "VenousBloodCarbonDioxideContent": { "2027-1": ("Venous Blood Carbon dioxide content", [3525]) }, "VenousBloodCarbonDioxidePartialPressure": { "2021-4": ("Venous Blood Carbon dioxide partial pressure", [3524]) }, "VenousBloodPh": {"2746-6": ("Venous Blood pH", [3528])}, "VenousContentFcv": {"19220-3": ("Venous Content (FCv)", [3529])}, "VenousOxygenContent": {"19220-3": ("Venous Oxygen content", [3525])}, "VenousOxygenPartialPressure": { "2705-2": ("Venous Oxygen partial pressure", [3524]) }, "VenousOxygenPartialPressureAt50PercentSaturation": { "19216-1": ("Venous Oxygen partial pressure at 50% saturation", [3524]) }, "VenousOxygenSaturation": {"2711-0": ("Venous Oxygen saturation", [3526])}, "VolumeFlow": { "33878-0": ( "Volume flow", [ 12119, 12122, 12200, 12204, 12207, 12208, 12209, 12211, 12218, 12222, 12257, 12258, 12259, 12260, 12261, 12262, 12263, 12264, 12265, 12266, 12267, 12268, 12269, 12270, 12271, 12272, 12273, 12274, 12275, 12276, ], ) }, "VolumeFlowRate": {"33878-0": ("Volume Flow Rate", [12304])}, "WholeBodyCT": {"46305-9": ("Whole body CT", [646])}, "WholeBodyCt": {"46305-9": ("whole body ct", [6050, 6083])}, "WholeBodyPtWRncIv": {"44139-4": ("whole body pt w rnc iv", [6050, 6083])}, "WidthOfHemisphere": {"12170-7": ("Width of Hemisphere", [12007])}, "XRUnspecifiedBodyRegion": {"43468-8": ("XR unspecified body region", [100])}, "XRayReport": {"43468-8": ("X-Ray Report", [7000])}, "YolkSacLength": {"11816-6": ("Yolk Sac length", [12009])}, } concepts["IBSI"] = { "AngularSecondMomentOfGLCM": { "8ZQL": ("Angular Second Moment of GLCM", [218, 7467, 7468]) }, "AreaDensityInApproximateEnclosingEllipsoid": { "RDD2": ("Area Density in Approximate Enclosing Ellipsoid", [218, 7477]) }, "AreaDensityInConvexHull": {"7T7F": ("Area Density in Convex Hull", [218, 7477])}, "AreaDensityInFrameOfReferenceAxisAlignedBoundingBox": { "R59B": ( "Area Density in Frame of Reference Axis Aligned Bounding Box", [218, 7477], ) }, "AreaDensityInMinimumVolumeEnclosingEllipsoid": { "BRI8": ("Area Density in Minimum Volume Enclosing Ellipsoid", [218, 7477]) }, "AreaDensityInOrientedMinimumBoundingBox": { "IQYR": ("Area Density in Oriented Minimum Bounding Box", [218, 7477]) }, "Asphericity": {"25C7": ("Asphericity", [218, 7477])}, "AutocorrelationOfGLCM": {"QWB0": ("Autocorrelation of GLCM", [218, 7467, 7468])}, "BusynessOfNGTDM": {"NQ30": ("Busyness of NGTDM", [218, 7468, 7500])}, "CentreOfMassShift": {"KLMA": ("Centre of Mass Shift", [218, 7477])}, "ClusterProminenceOfGLCM": { "AE86": ("Cluster Prominence of GLCM", [218, 7467, 7468]) }, "ClusterShadeOfGLCM": {"7NFM": ("Cluster Shade of GLCM", [218, 7467, 7468])}, "ClusterTendencyOfGLCM": {"DG8W": ("Cluster Tendency of GLCM", [218, 7467, 7468])}, "CoarsenessOfNGTDM": {"QCDE": ("Coarseness of NGTDM", [218, 7468, 7500])}, "Compactness1": {"SKGS": ("Compactness 1", [218, 7477])}, "Compactness2": {"BQWJ": ("Compactness 2", [218, 7477])}, "ComplexityOfNGTDM": {"HDEZ": ("Complexity of NGTDM", [218, 7468, 7500])}, "ContrastOfGLCM": {"ACUI": ("Contrast of GLCM", [218, 7467, 7468])}, "ContrastOfNGTDM": {"65HE": ("Contrast of NGTDM", [218, 7468, 7500])}, "CorrelationOfGLCM": {"NI2N": ("Correlation of GLCM", [218, 7467, 7468])}, "DependenceCountEnergy": {"CAS9": ("Dependence count energy", [218, 7468, 7501])}, "DependenceCountEntropy": {"FCBV": ("Dependence count entropy", [218, 7468, 7501])}, "DependenceCountNonUniformity": { "Z87G": ("Dependence count non-uniformity", [218, 7468, 7501]) }, "DependenceCountNonUniformityNormalized": { "OKJI": ("Dependence count non-uniformity normalized", [218, 7468, 7501]) }, "DependenceCountPercentage": { "6XV8": ("Dependence count percentage", [218, 7468, 7501]) }, "DependenceCountVariance": { "DNX2": ("Dependence count variance", [218, 7468, 7501]) }, "DifferenceAverageOfGLCM": { "TF7R": ("Difference Average of GLCM", [218, 7467, 7468]) }, "DifferenceEntropyOfGLCM": { "NTRS": ("Difference Entropy of GLCM", [218, 7467, 7468]) }, "DifferenceVarianceOfGLCM": { "D3YU": ("Difference Variance of GLCM", [218, 7467, 7468]) }, "DissimilarityOfGLCM": {"8S9J": ("Dissimilarity of GLCM", [218, 7467, 7468])}, "DistanceZonePercentage": {"VIWW": ("Distance Zone Percentage", [218, 7468, 7479])}, "Elongation": {"Q3CK": ("Elongation", [218, 7477])}, "FirstMeasureOfInformationCorrelationOfGLCM": { "R8DG": ("First Measure of Information Correlation of GLCM", [218, 7467, 7468]) }, "Flatness": {"N17B": ("Flatness", [218, 7477])}, "GearyCMeasure": {"NPT7": ("Geary's C Measure", [218, 7477])}, "GrayLevelNonuniformityInRuns": { "R5YN": ("Gray Level Nonuniformity in Runs", [218, 7468, 7475]) }, "GrayLevelNonuniformityOfSizeZoneCounts": { "JNSA": ("Gray Level Nonuniformity of Size Zone Counts", [218, 7468, 7476]) }, "GrayLevelVarianceInRuns": { "8CE5": ("Gray Level Variance in Runs", [218, 7468, 7475]) }, "GrayLevelVarianceInSizeZones": { "BYLV": ("Gray Level Variance in Size Zones", [218, 7468, 7476]) }, "GreyLevelNonUniformityOfDistanceZoneCounts": { "VFT7": ("Grey Level Non-uniformity of Distance Zone Counts", [218, 7468, 7479]) }, "GreyLevelNonUniformityOfNGLDM": { "FP8K": ("Grey level non-uniformity of NGLDM", [218, 7468, 7501]) }, "GreyLevelVarianceInDistanceZones": { "QK93": ("Grey Level Variance in Distance Zones", [218, 7468, 7479]) }, "GreyLevelVarianceOfNGLDM": { "1PFV": ("Grey level variance of NGLDM", [218, 7468, 7501]) }, "HighDependenceEmphasis": {"IMOQ": ("High dependence emphasis", [218, 7468, 7501])}, "HighDependenceHighGreyLevelEmphasis": { "9QMG": ("High dependence high grey level emphasis", [218, 7468, 7501]) }, "HighDependenceLowGreyLevelEmphasis": { "NBZI": ("High dependence low grey level emphasis", [218, 7468, 7501]) }, "HighGrayLevelRunEmphasis": { "G3QZ": ("High Gray Level Run Emphasis", [218, 7468, 7475]) }, "HighGrayLevelZoneEmphasis": { "5GN9": ("High Gray Level Zone Emphasis", [218, 7468, 7476]) }, "HighGreyLevelCountEmphasis": { "OAE7": ("High grey level count emphasis", [218, 7468, 7501]) }, "HighGreyLevelZoneEmphasis": { "K26C": ("High Grey Level Zone Emphasis", [218, 7468, 7479]) }, "IntegratedIntensity": {"99N0": ("Integrated Intensity", [218, 7477])}, "IntensityHistogram10thPercentile": { "GPMT": ("Intensity Histogram 10th Percentile", [218, 7468, 7478]) }, "IntensityHistogram90thPercentile": { "OZ0C": ("Intensity Histogram 90th Percentile", [218, 7468, 7478]) }, "IntensityHistogramCoefficientOfVariation": { "CWYJ": ("Intensity Histogram Coefficient of Variation", [218, 7468, 7478]) }, "IntensityHistogramEntropy": { "TLU2": ("Intensity Histogram Entropy", [218, 7468, 7478]) }, "IntensityHistogramInterquartileRange": { "WR0O": ("Intensity Histogram Interquartile Range", [218, 7468, 7478]) }, "IntensityHistogramKurtosis": { "C3I7": ("Intensity Histogram Kurtosis", [218, 7468, 7478]) }, "IntensityHistogramMaximumGradient": { "12CE": ("Intensity Histogram Maximum Gradient", [218, 7468, 7478]) }, "IntensityHistogramMaximumGradientGrayLevel": { "8E6O": ("Intensity Histogram Maximum Gradient Gray Level", [218, 7468, 7478]) }, "IntensityHistogramMaximumGrayLevel": { "3NCY": ("Intensity Histogram Maximum Gray Level", [218, 7468, 7478]) }, "IntensityHistogramMean": {"X6K6": ("Intensity Histogram Mean", [218, 7468, 7478])}, "IntensityHistogramMeanAbsoluteDeviation": { "D2ZX": ("Intensity Histogram Mean Absolute Deviation", [218, 7468, 7478]) }, "IntensityHistogramMedian": { "WIFQ": ("Intensity Histogram Median", [218, 7468, 7478]) }, "IntensityHistogramMedianAbsoluteDeviation": { "4RNL": ("Intensity Histogram Median Absolute Deviation", [218, 7468, 7478]) }, "IntensityHistogramMinimumGradient": { "VQB3": ("Intensity Histogram Minimum Gradient", [218, 7468, 7478]) }, "IntensityHistogramMinimumGradientGrayLevel": { "RHQZ": ("Intensity Histogram Minimum Gradient Gray Level", [218, 7468, 7478]) }, "IntensityHistogramMinimumGrayLevel": { "1PR8": ("Intensity Histogram Minimum Gray Level", [218, 7468, 7478]) }, "IntensityHistogramMode": {"AMMC": ("Intensity Histogram Mode", [218, 7468, 7478])}, "IntensityHistogramQuartileCoefficientOfDispersion": { "SLWD": ( "Intensity Histogram Quartile Coefficient of Dispersion", [218, 7468, 7478], ) }, "IntensityHistogramRange": { "5Z3W": ("Intensity Histogram Range", [218, 7468, 7478]) }, "IntensityHistogramRobustMeanAbsoluteDeviation": { "WRZB": ( "Intensity Histogram Robust Mean Absolute Deviation", [218, 7468, 7478], ) }, "IntensityHistogramSkewness": { "88K1": ("Intensity Histogram Skewness", [218, 7468, 7478]) }, "IntensityHistogramUniformity": { "BJ5W": ("Intensity Histogram Uniformity", [218, 7468, 7478]) }, "IntensityHistogramVariance": { "CH89": ("Intensity Histogram Variance", [218, 7468, 7478]) }, "InverseDifferenceMomentOfGLCM": { "WF0Z": ("Inverse Difference Moment of GLCM", [218, 7467, 7468]) }, "InverseDifferenceOfGLCM": { "IB1Z": ("Inverse Difference of GLCM", [218, 7467, 7468]) }, "InverseVarianceOfGLCM": {"E8JP": ("Inverse Variance of GLCM", [218, 7467, 7468])}, "JointAverageOfGLCM": {"60VM": ("Joint Average of GLCM", [218, 7467, 7468])}, "JointEntropyOfGLCM": {"TU9B": ("Joint Entropy of GLCM", [218, 7467, 7468])}, "JointMaximumOfGLCM": {"GYBY": ("Joint Maximum of GLCM", [218, 7467, 7468])}, "JointVarianceOfGLCM": {"UR99": ("Joint Variance of GLCM", [218, 7467, 7468])}, "LargeDistanceEmphasis": {"MB4I": ("Large Distance Emphasis", [218, 7468, 7479])}, "LargeDistanceHighGreyLevelEmphasis": { "KLTH": ("Large Distance High Grey Level Emphasis", [218, 7468, 7479]) }, "LargeDistanceLowGreyLevelEmphasis": { "A7WM": ("Large Distance Low Grey Level Emphasis", [218, 7468, 7479]) }, "LargeZoneEmphasis": {"48P8": ("Large Zone Emphasis", [218, 7468, 7476])}, "LargeZoneHighGrayLevelEmphasis": { "J17V": ("Large Zone High Gray Level Emphasis", [218, 7468, 7476]) }, "LargeZoneLowGrayLevelEmphasis": { "YH51": ("Large Zone Low Gray Level Emphasis", [218, 7468, 7476]) }, "LeastAxisIn3DLength": { "7J51": ("Least Axis in 3D Length", [218, 6165, 7469, 7470, 7477]) }, "LongRunHighGrayLevelEmphasis": { "3KUM": ("Long Run High Gray Level Emphasis", [218, 7468, 7475]) }, "LongRunLowGrayLevelEmphasis": { "IVPO": ("Long Run Low Gray Level Emphasis", [218, 7468, 7475]) }, "LongRunsEmphasis": {"W4KF": ("Long Runs Emphasis", [218, 7468, 7475])}, "LowDependenceEmphasis": {"SODN": ("Low dependence emphasis", [218, 7468, 7501])}, "LowDependenceHighGreyLevelEmphasis": { "JA6D": ("Low dependence high grey level emphasis", [218, 7468, 7501]) }, "LowDependenceLowGreyLevelEmphasis": { "EQ3F": ("Low dependence low grey level emphasis", [218, 7468, 7501]) }, "LowGrayLevelRunEmphasis": { "V3SW": ("Low Gray Level Run Emphasis", [218, 7468, 7475]) }, "LowGrayLevelZoneEmphasis": { "XMSY": ("Low Gray Level Zone Emphasis", [218, 7468, 7476]) }, "LowGreyLevelCountEmphasis": { "TL9H": ("Low grey level count emphasis", [218, 7468, 7501]) }, "LowGreyLevelZoneEmphasis": { "S1RA": ("Low Grey Level Zone Emphasis", [218, 7468, 7479]) }, "MajorAxisIn3DLength": { "TDIC": ("Major Axis in 3D Length", [218, 6165, 7469, 7470, 7477]) }, "Maximum3DDiameterOfAMesh": { "L0JK": ("Maximum 3D Diameter of a Mesh", [218, 6165, 7469, 7470, 7477]) }, "MinorAxisIn3DLength": { "P9VJ": ("Minor Axis in 3D Length", [218, 6165, 7469, 7470, 7477]) }, "MoranIIndex": {"N365": ("Moran's I Index", [218, 7477])}, "NormalizedGrayLevelNonuniformityInRuns": { "OVBL": ("Normalized Gray Level Nonuniformity in Runs", [218, 7468, 7475]) }, "NormalizedGrayLevelNonuniformityOfSizeZoneCounts": { "Y1RO": ( "Normalized Gray Level Nonuniformity of Size Zone Counts", [218, 7468, 7476], ) }, "NormalizedGreyLevelNonUniformityOfDistanceZoneCounts": { "7HP3": ( "Normalized Grey Level Non-uniformity of Distance Zone Counts", [218, 7468, 7479], ) }, "NormalizedGreyLevelNonUniformityOfNGLDM": { "5SPA": ("Normalized grey level non-uniformity of NGLDM", [218, 7468, 7501]) }, "NormalizedInverseDifferenceMomentOfGLCM": { "1QCO": ("Normalized Inverse Difference Moment of GLCM", [218, 7467, 7468]) }, "NormalizedInverseDifferenceOfGLCM": { "NDRX": ("Normalized Inverse Difference of GLCM", [218, 7467, 7468]) }, "NormalizedRunLengthNonuniformity": { "IC23": ("Normalized Run Length Nonuniformity", [218, 7468, 7475]) }, "NormalizedZoneDistanceNonUniformity": { "IATH": ("Normalized Zone Distance Non-uniformity", [218, 7468, 7479]) }, "NormalizedZoneSizeNonuniformity": { "VB3A": ("Normalized Zone Size Nonuniformity", [218, 7468, 7476]) }, "RunEntropy": {"HJ9O": ("Run Entropy", [218, 7468, 7475])}, "RunLengthNonuniformity": {"W92Y": ("Run Length Nonuniformity", [218, 7468, 7475])}, "RunLengthVariance": {"SXLW": ("Run Length Variance", [218, 7468, 7475])}, "RunPercentage": {"9ZK5": ("Run Percentage", [218, 7468, 7475])}, "SecondMeasureOfInformationCorrelationOfGLCM": { "JN9H": ("Second Measure of Information Correlation of GLCM", [218, 7467, 7468]) }, "ShortRunHighGrayLevelEmphasis": { "GD3A": ("Short Run High Gray Level Emphasis", [218, 7468, 7475]) }, "ShortRunLowGrayLevelEmphasis": { "HTZT": ("Short Run Low Gray Level Emphasis", [218, 7468, 7475]) }, "ShortRunsEmphasis": {"22OV": ("Short Runs Emphasis", [218, 7468, 7475])}, "SizeZonePercentage": {"P30P": ("Size Zone Percentage", [218, 7468, 7476])}, "SmallDistanceEmphasis": {"0GBI": ("Small Distance Emphasis", [218, 7468, 7479])}, "SmallDistanceHighGreyLevelEmphasis": { "DKNJ": ("Small Distance High Grey Level Emphasis", [218, 7468, 7479]) }, "SmallDistanceLowGreyLevelEmphasis": { "RUVG": ("Small Distance Low Grey Level Emphasis", [218, 7468, 7479]) }, "SmallZoneEmphasis": {"5QRC": ("Small Zone Emphasis", [218, 7468, 7476])}, "SmallZoneHighGrayLevelEmphasis": { "HW1V": ("Small Zone High Gray Level Emphasis", [218, 7468, 7476]) }, "SmallZoneLowGrayLevelEmphasis": { "5RAI": ("Small Zone Low Gray Level Emphasis", [218, 7468, 7476]) }, "SphericalDisproportion": {"KRCK": ("Spherical Disproportion", [218, 7477])}, "Sphericity": {"QCFX": ("Sphericity", [218, 7477])}, "StrengthOfNGTDM": {"1X9X": ("Strength of NGTDM", [218, 7468, 7500])}, "SumAverageOfGLCM": {"ZGXS": ("Sum Average of GLCM", [218, 7467, 7468])}, "SumEntropyOfGLCM": {"P6QZ": ("Sum Entropy of GLCM", [218, 7467, 7468])}, "SumVarianceOfGLCM": {"OEEB": ("Sum Variance of GLCM", [218, 7467, 7468])}, "SurfaceAreaOfMesh": {"C0JK": ("Surface Area of Mesh", [218, 7469, 7471, 7477])}, "SurfaceToVolumeRatio": {"2PR5": ("Surface to Volume Ratio", [218, 7477])}, "VolumeDensityInApproximateEnclosingEllipsoid": { "6BDE": ("Volume Density in Approximate Enclosing Ellipsoid", [218, 7477]) }, "VolumeDensityInConvexHull": { "R3ER": ("Volume Density in Convex Hull", [218, 7477]) }, "VolumeDensityInFrameOfReferenceAxisAlignedBoundingBox": { "PBX1": ( "Volume Density in Frame of Reference Axis Aligned Bounding Box", [218, 7477], ) }, "VolumeDensityInMinimumVolumeEnclosingEllipsoid": { "SWZ1": ("Volume Density in Minimum Volume Enclosing Ellipsoid", [218, 7477]) }, "VolumeDensityInOrientedMinimumBoundingBox": { "ZH1A": ("Volume Density in Oriented Minimum Bounding Box", [218, 7477]) }, "VolumeFromVoxelSummation": { "YEKZ": ("Volume from Voxel Summation", [218, 7469, 7472, 7477]) }, "VolumeOfMesh": {"RNU0": ("Volume of Mesh", [218, 7469, 7472, 7477])}, "ZoneDistanceEntropy": {"GBDU": ("Zone Distance Entropy", [218, 7468, 7479])}, "ZoneDistanceNonUniformity": { "V294": ("Zone Distance Non-uniformity", [218, 7468, 7479]) }, "ZoneDistanceVariance": {"7WT1": ("Zone Distance Variance", [218, 7468, 7479])}, "ZoneSizeEntropy": {"GU8N": ("Zone Size Entropy", [218, 7468, 7476])}, "ZoneSizeNonuniformity": {"4JP3": ("Zone Size Nonuniformity", [218, 7468, 7476])}, "ZoneSizeVariance": {"3NSA": ("Zone Size Variance", [218, 7468, 7476])}, } concepts["UMLS"] = { "Alphaxalone": {"C0051482": ("Alphaxalone", [623, 625])}, "AnesthesiaRecoveryPeriod": {"C0002908": ("Anesthesia recovery period", [634])}, "Antihypoglycemic": {"C1579431": ("Antihypoglycemic", [621, 622])}, "Baseline": {"C1442488": ("Baseline", [6146])}, "CoefficientOfVariance": {"C0681921": ("Coefficient of Variance", [7464])}, "CommercialProduct": {"C1547887": ("Commercial product", [608])}, "ConsultingPhysician": { "C1441532": ("Consulting Physician", [7450, 7452, 9536, 9555, 9562]) }, "DistalPhalanx": {"C3669027": ("Distal phalanx", [7482, 7483, 8134])}, "EdotreotideGa68": {"C2713594": ("Edotreotide Ga^68^", [4021])}, "EthidiumBromide": {"C0019873": ("Ethidium Bromide", [638, 643])}, "Fluanisone": {"C0060473": ("Fluanisone", [623, 625])}, "FluoroetanidazoleF18": {"C1541539": ("Fluoroetanidazole F^18^", [4021])}, "FluoropropylDihydrotetrabenazineF18": { "C2934038": ("Fluoropropyl-dihydrotetrabenazine F^18^", [4021]) }, "H2Antagonist": {"C0019593": ("H2 antagonist", [621, 622])}, "HeatLamp": {"C0181514": ("Heat lamp", [635])}, "ISO1F18": {"C2981788": ("ISO-1 F^18^", [4021])}, "InfantOfMotherWithGestationalDiabetes": { "C0456029": ("Infant of mother with gestational diabetes", [3756]) }, "Intern": {"C1144859": ("Intern", [7450, 7452])}, "InverseRatioVentilation": {"C2223982": ("Inverse ratio ventilation", [619, 620])}, "KevlarAramidFiber": {"C0064329": ("Kevlar Aramid Fiber", [10067])}, "MK6240F18": {"C4506764": ("MK-6240 F^18^", [4021])}, "Mastectomy": {"C0024881": ("Mastectomy", [6058, 6060])}, "MedicalPhysicist": { "C1708969": ("Medical Physicist", [7450, 7452, 9536, 9555, 9562]) }, "Metomidate": {"C0025856": ("Metomidate", [623, 625])}, "MiddleEasternOrNorthAfrican": { "C5690844": ("Middle Eastern or North African", [6099]) }, "MobileSkinLesion": {"C2071496": ("Mobile skin lesion", [4407])}, "Nadir": {"C1708760": ("Nadir", [6146])}, "NarcoticAnalgesic": {"C0027409": ("Narcotic analgesic", [621, 622])}, "Neuroradiology": {"C2183225": ("Neuroradiology", [7030])}, "PK1119511C": {"C1609883": ("PK11195 ^11^C", [4021])}, "Pretreatment": {"C3539075": ("Pretreatment", [6146])}, "RadiationPhysicist": { "C2985483": ("Radiation Physicist", [7450, 7452, 9536, 9555, 9562]) }, "Referring": {"C1709880": ("Referring", [7453])}, "RestrictedDiet": {"C0425422": ("Restricted diet", [609])}, "RoomAir": {"C3846005": ("Room air", [623, 629])}, "RootMeanSquare": {"C2347976": ("Root Mean Square", [7464])}, "Sonographer": {"C1954848": ("Sonographer", [7450, 7452])}, "THK5317F18": {"C4550127": ("THK5317 F^18^", [4021])}, "THK5351F18": {"C4279748": ("THK5351 F^18^", [4021])}, "Thermography": {"C0039810": ("Thermography", [636])}, "TransgenicAnimal": {"C0003069": ("Transgenic animal", [602])}, "UCBJC11": {"C4506788": ("UCB-J C^11^", [4021])}, "UnknownPrimaryNeoplasiaSite": { "C0221297": ("unknown primary neoplasia site", [7601, 8134]) }, "Unscheduled": {"C1699701": ("Unscheduled", [6146])}, "Variance": {"C1711260": ("Variance", [7464])}, } concepts["PUBCHEM_CID"] = { "_6Hydroxydopamine": {"4624": ("6-hydroxydopamine", [638, 643])} } concepts["FMA"] = { "ArcuateFasciculus": { "276650": ("Arcuate Fasciculus", [7151, 7153, 7192, 8134, 9514]) }, "Bregma": {"264776": ("Bregma", [647])}, "Lambda": {"264773": ("Lambda", [647])}, "LumenOfGallbladder": { "17891": ("Lumen of gallbladder", [7151, 7154, 7192, 8134, 9514]) }, "MucosaOfDorsumOfOralPartOfTongue": { "281534": ("Mucosa of dorsum of oral part of tongue", [4029, 8134]) }, "MucosaOfDorsumOfPharyngealPartOfTongue": { "281537": ("Mucosa of dorsum of pharyngeal part of tongue", [4029, 8134]) }, "MucosaOfOralSegmentOfHardPalate": { "289677": ("Mucosa of oral segment of hard palate", [4029, 8134]) }, "MucosaOfPalatoglossalArch": { "60031": ("Mucosa of palatoglossal arch", [4029, 8134]) }, "MucosaOfPharynx": {"55031": ("Mucosa of pharynx", [4029, 8134])}, "MucosaOfPosteriorWallOfOropharynx": { "55060": ("Mucosa of posterior wall of oropharynx", [4029, 8134]) }, "MucosaOfUvula": {"60030": ("Mucosa of uvula", [4029, 8134])}, "Nasion": {"264779": ("Nasion", [1000, 1001, 1002, 8134])}, "SkinOfBackOfTrunk": {"49943": ("Skin of back of trunk", [4029, 8134])}, "SkinOfDorsalPartOfFifthToe": { "37885": ("Skin of dorsal part of fifth toe", [4029, 8134]) }, "SkinOfDorsalPartOfFourthToe": { "37882": ("Skin of dorsal part of fourth toe", [4029, 8134]) }, "SkinOfDorsalPartOfGreatToe": { "37873": ("Skin of dorsal part of great toe", [4029, 8134]) }, "SkinOfDorsalPartOfIndexFinger": { "38324": ("Skin of dorsal part of index finger", [4029, 8134]) }, "SkinOfDorsalPartOfLittleFinger": { "38333": ("Skin of dorsal part of little finger", [4029, 8134]) }, "SkinOfDorsalPartOfMiddleFinger": { "38327": ("Skin of dorsal part of middle finger", [4029, 8134]) }, "SkinOfDorsalPartOfRingFinger": { "38330": ("Skin of dorsal part of ring finger", [4029, 8134]) }, "SkinOfDorsalPartOfSecondToe": { "37876": ("Skin of dorsal part of second toe", [4029, 8134]) }, "SkinOfDorsalPartOfThirdToe": { "37879": ("Skin of dorsal part of third toe", [4029, 8134]) }, "SkinOfDorsalPartOfThumb": { "38321": ("Skin of dorsal part of thumb", [4029, 8134]) }, "SkinOfDorsumOfNose": {"59532": ("Skin of dorsum of nose", [4029, 8134])}, "SkinOfLowerInnerQuadrantOfBreast": { "61427": ("Skin of lower inner quadrant of breast", [4029, 8134]) }, "SkinOfLowerOuterQuadrantOfBreast": { "61423": ("Skin of lower outer quadrant of breast", [4029, 8134]) }, "SkinOfPalmarPartOfIndexFinger": { "38344": ("Skin of palmar part of index finger", [4029, 8134]) }, "SkinOfPalmarPartOfLittleFinger": { "38357": ("Skin of palmar part of little finger", [4029, 8134]) }, "SkinOfPalmarPartOfMiddleFinger": { "38347": ("Skin of palmar part of middle finger", [4029, 8134]) }, "SkinOfPalmarPartOfRingFinger": { "38354": ("Skin of palmar part of ring finger", [4029, 8134]) }, "SkinOfPalmarPartOfThumb": { "38341": ("Skin of palmar part of thumb", [4029, 8134]) }, "SkinOfPlantarPartOfFifthToe": { "38119": ("Skin of plantar part of fifth toe", [4029, 8134]) }, "SkinOfPlantarPartOfFourthToe": { "38116": ("Skin of plantar part of fourth toe", [4029, 8134]) }, "SkinOfPlantarPartOfGreatToe": { "38107": ("Skin of plantar part of great toe", [4029, 8134]) }, "SkinOfPlantarPartOfSecondToe": { "38110": ("Skin of plantar part of second toe", [4029, 8134]) }, "SkinOfPlantarPartOfThirdToe": { "38113": ("Skin of plantar part of third toe", [4029, 8134]) }, "SkinOfUpperInnerQuadrantOfBreast": { "61426": ("Skin of upper inner quadrant of breast", [4029, 8134]) }, "SkinOfUpperOuterQuadrantOfLeftBreast": { "61439": ("Skin of upper outer quadrant of left breast", [4029, 8134]) }, "SkinOfVermilionProperOfLowerLip": { "312651": ("Skin of vermilion proper of lower lip", [4029, 8134]) }, "SkinOfVermilionProperOfUpperLip": { "312647": ("Skin of vermilion proper of upper lip", [4029, 8134]) }, "SubcorticalGrayMatter": { "223151": ("Subcortical gray matter", [7151, 7153, 7192, 8134, 9514]) }, "SubiliacLymphNode": {"323407": ("subiliac lymph node", [7600, 8134])}, "SupramammaryLymphNode": {"12785": ("supramammary lymph node", [7600, 8134])}, "TorusOfPharyngotympanicTube": { "54993": ("torus of pharyngotympanic tube", [7601, 8134]) }, "WallOfGallbladder": { "14657": ("Wall of gallbladder", [7151, 7154, 7192, 8134, 9514]) }, } concepts["MDC"] = { "A1": {"7:1289": ("A1", [3030])}, "A2": {"7:1290": ("A2", [3030])}, "AF3": {"7:1217": ("AF3", [3030])}, "AF4": {"7:1222": ("AF4", [3030])}, "AF7": {"7:1225": ("AF7", [3030])}, "AF8": {"7:1230": ("AF8", [3030])}, "AVDissociation": {"10:9712": ("AV Dissociation", [3415])}, "AVDissociationWithInterference": { "10:9728": ("AV dissociation with interference", [3415]) }, "AVJunctionalNodalEscapeRhythm": { "10:9552": ("AV junctional (nodal) escape rhythm", [3415]) }, "AVJunctionalNodalRhythm": {"10:9536": ("AV junctional (nodal) rhythm", [3415])}, "AVReciprocatingTachycardia": {"10:9600": ("AV reciprocating tachycardia", [3415])}, "AberratedAtrialPrematureBeatAshmanBeat": { "10:8304": ("Aberrated atrial premature beat (Ashman beat)", [3335]) }, "AbnormalBeat": {"10:8224": ("Abnormal beat", [3335])}, "AcceleratedAVJunctionalNodalRhythm": { "10:9568": ("Accelerated AV junctional (nodal) rhythm", [3415]) }, "AcceleratedIdioventricularRhythm": { "10:9888": ("Accelerated idioventricular rhythm", [3415]) }, "Afz": {"7:1004": ("AFz", [3030])}, "AlphadeltaSleep": {"2:23728": ("Alphadelta Sleep", [3035, 3046])}, "AmplitudeAt20msIntoSTSegmentPerLead": { "2:14848": ("Amplitude at 20 ms into ST segment, per lead", [3688]) }, "AmplitudeAt40msIntoSTSegmentPerLead": { "2:15104": ("Amplitude at 40 ms into ST segment, per lead", [3688]) }, "AmplitudeAt60msIntoSTSegmentPerLead": { "2:14336": ("Amplitude at 60 ms into ST segment, per lead", [3688]) }, "AmplitudeAt80msIntoSTSegmentPerLead": { "2:14592": ("Amplitude at 80 ms into ST segment, per lead", [3688]) }, "AntiTachycardiaPacing": {"10:10304": ("Anti-Tachycardia Pacing", [3415])}, "AntibradycardiaPaceSpike": {"10:4096": ("Antibradycardia pace spike", [3335])}, "AntitachycardiaPaceSpike": {"10:6144": ("Antitachycardia pace spike", [3335])}, "Apnea": {"3:3072": ("Apnea", [3038])}, "Apnea15Sec": {"3:3284": ("Apnea 15 sec", [3038])}, "Apnea30Sec": {"3:3292": ("Apnea 30 sec", [3038])}, "Arousal": {"2:22952": ("Arousal", [3040])}, "ArrhythmiaEvent": {"3:3266": ("Arrhythmia event", [3038])}, "Artifact": {"3:432": ("Artifact", [3039])}, "ArtifactualActivity": {"2:24200": ("Artifactual activity", [3035])}, "Asystole": {"3:3076": ("Asystole", [3038])}, "AsystoleRhythm": {"10:10336": ("Asystole", [3415])}, "AtrialBigeminy": {"10:9376": ("Atrial Bigeminy", [3415])}, "AtrialDemandModePacing": {"10:10176": ("Atrial Demand Mode Pacing", [3415])}, "AtrialEctopicRhythm": {"10:9360": ("Atrial Ectopic Rhythm", [3415])}, "AtrialEscapeBeat": {"10:8400": ("Atrial escape beat", [3335])}, "AtrialFibrillation": {"3:3128": ("Atrial fibrillation", [3038])}, "AtrialFibrillationRhythm": {"10:9472": ("Atrial fibrillation", [3415])}, "AtrialFlutter": {"3:3276": ("Atrial flutter", [3038])}, "AtrialFlutterRhythm": {"10:9456": ("Atrial flutter", [3415])}, "AtrialFlutterWave": {"10:1792": ("Atrial flutter wave", [3335])}, "AtrialPrematureContraction": { "10:8272": ("Atrial premature contraction (beat)", [3335]) }, "AtrialTachycardia": {"10:9392": ("Atrial Tachycardia", [3415])}, "AtriumAntibradycardiaPaceSpike": { "10:4352": ("atrium Antibradycardia pace spike", [3335]) }, "AtriumAntitachycardiaPaceSpike": { "10:6400": ("atrium Antitachycardia pace spike", [3335]) }, "AtriumCardioversionSpike": {"10:7424": ("atrium Cardioversion spike", [3335])}, "AtriumDefibrillationSpike": {"10:8448": ("atrium Defibrillation spike", [3335])}, "AtypicalSpikeAndWaveComplex": { "2:23928": ("Atypical spike and wave complex", [3035]) }, "AutomaticAtrialTachycardia": {"10:9440": ("Automatic Atrial Tachycardia", [3415])}, "AuxiliaryBipolarLead1": {"2:127": ("Auxiliary bipolar lead 1", [3001])}, "AuxiliaryBipolarLead2": {"2:128": ("Auxiliary bipolar lead 2", [3001])}, "AuxiliaryBipolarLead3": {"2:129": ("Auxiliary bipolar lead 3", [3001])}, "AuxiliaryBipolarLead4": {"2:130": ("Auxiliary bipolar lead 4", [3001])}, "AuxiliaryUnipolarLead1": {"2:75": ("Auxiliary unipolar lead 1", [3001])}, "AuxiliaryUnipolarLead2": {"2:76": ("Auxiliary unipolar lead 2", [3001])}, "AuxiliaryUnipolarLead3": {"2:77": ("Auxiliary unipolar lead 3", [3001])}, "AuxiliaryUnipolarLead4": {"2:78": ("Auxiliary unipolar lead 4", [3001])}, "AvfAugmentedVoltageFoot": {"2:64": ("aVF, augmented voltage, foot", [3001])}, "AvlAugmentedVoltageLeft": {"2:63": ("aVL, augmented voltage, left", [3001])}, "Avr": {"2:65": ("−aVR", [3001])}, "AvrAugmentedVoltageRight": {"2:62": ("aVR, augmented voltage, right", [3001])}, "BackgroundActivity": {"2:23560": ("Background activity", [3035])}, "BackgroundActivityAlpha": {"2:23592": ("Background activity alpha", [3035])}, "BackgroundActivityArrhythmicDelta": { "2:23640": ("Background activity arrhythmic delta", [3035]) }, "BackgroundActivityBeta": {"2:23568": ("Background activity beta", [3035])}, "BackgroundActivityBisynchronousDelta": { "2:23632": ("Background activity bisynchronous delta", [3035]) }, "BackgroundActivityBisynchronousTheta": { "2:23616": ("Background activity bisynchronous theta", [3035]) }, "BackgroundActivityDelta": {"2:23624": ("Background activity delta", [3035])}, "BackgroundActivityGamma": {"2:23584": ("Background activity gamma", [3035])}, "BackgroundActivitySigma": {"2:23576": ("Background activity sigma", [3035])}, "BackgroundActivitySlowFusedTransients": { "2:23648": ("Background activity slow fused transients", [3035]) }, "BackgroundActivityTheta": {"2:23608": ("Background activity theta", [3035])}, "BackgroundMuActivity": {"2:23600": ("Background Mu activity", [3035])}, "BaselineDescription": {"10:11412": ("Baseline description", [3691])}, "BifascicularBlockBeat": {"10:8560": ("bifascicular block beat", [3335])}, "BilateralBundleBranchBlockBeat": { "10:8592": ("bilateral bundle-branch block beat", [3335]) }, "BipolarUncorrectedXYZLeadSystem": { "10:11277": ("Bipolar uncorrected XYZ lead system", [3263]) }, "BrachycardiaAny": {"10:10432": ("Bradycardia", [3415])}, "Bradycardia": {"3:3084": ("Bradycardia", [3038])}, "BurstSuppression": {"2:23952": ("Burst suppression", [3035])}, "C1": {"7:1129": ("C1", [3030])}, "C2": {"7:1134": ("C2", [3030])}, "C3": {"7:1137": ("C3", [3030])}, "C4": {"7:1142": ("C4", [3030])}, "C5": {"7:1145": ("C5", [3030])}, "C6": {"7:1150": ("C6", [3030])}, "CP1": {"7:1153": ("CP1", [3030])}, "CP2": {"7:1158": ("CP2", [3030])}, "CP3": {"7:1161": ("CP3", [3030])}, "CP4": {"7:1166": ("CP4", [3030])}, "CP5": {"7:1169": ("CP5", [3030])}, "CP6": {"7:1174": ("CP6", [3030])}, "CalibrationPulse": {"10:2240": ("Calibration pulse (individual pulse)", [3335])}, "CalibrationSignal": {"10:10448": ("Calibration signal (sustained)", [3415])}, "CanineFifthRightIntercostalSpaceNearEdgeOfSternum": { "2:148": ("Canine, fifth right intercostal space near edge of sternum", [3001]) }, "CanineOverDorsalSpinousProcessOf7thThoracicVertebra": { "2:151": ( "Canine, over dorsal spinous process of 7th thoracic vertebra", [3001], ) }, "CanineSixthLeftIntercostalSpaceAtCostochondralJunction": { "2:150": ( "Canine, sixth left intercostal space at costochondral junction", [3001], ) }, "CanineSixthLeftIntercostalSpaceNearEdgeOfSternum": { "2:149": ("Canine, sixth left intercostal space near edge of sternum", [3001]) }, "CardioversionSpike": {"10:7168": ("Cardioversion spike", [3335])}, "ChestLead": {"2:86": ("Chest lead", [3001])}, "ChestLeadPerV1AndV1RPlacement": { "2:99": ("Chest lead per V1 and V1R placement", [3001]) }, "ChestLeadPerV2AndV2RPlacement": { "2:100": ("Chest lead per V2 and V2R placement", [3001]) }, "ChestLeadPerV3AndV3RPlacement": { "2:101": ("Chest lead per V3 and V3R placement", [3001]) }, "ChestLeadPerV4AndV4RPlacement": { "2:102": ("Chest lead per V4 and V4R placement", [3001]) }, "ChestLeadPerV5AndV5RPlacement": { "2:19": ("Chest lead per V5 and V5R placement", [3001]) }, "ChestLeadPerV6AndV6RPlacement": { "2:103": ("Chest lead per V6 and V6R placement", [3001]) }, "ChestLeadPerV7AndV8RPlacement": { "2:104": ("Chest lead per V7 and V8R placement", [3001]) }, "ChestLeadSymmetricPlacement": { "2:98": ("Chest lead (symmetric placement)", [3001]) }, "ChestManubriumLead": {"2:105": ("Chest-manubrium lead", [3001])}, "ChestManubriumLeadPerV1Placement": { "2:106": ("Chest-manubrium lead per V1 placement", [3001]) }, "ChestManubriumLeadPerV2Placement": { "2:107": ("Chest-manubrium lead per V2 placement", [3001]) }, "ChestManubriumLeadPerV3Placement": { "2:108": ("Chest-manubrium lead per V3 placement", [3001]) }, "ChestManubriumLeadPerV4Placement": { "2:109": ("Chest-manubrium lead per V4 placement", [3001]) }, "ChestManubriumLeadPerV5Placement": { "2:20": ("Chest-manubrium lead per V5 placement", [3001]) }, "ChestManubriumLeadPerV6Placement": { "2:110": ("Chest-manubrium lead per V6 placement", [3001]) }, "ChestManubriumLeadPerV7Placement": { "2:121": ("Chest-manubrium lead per V7 placement", [3001]) }, "CircumHead": {"2:22784": ("Circum head", [3040])}, "ClinicalSeizureDischarge": {"3:3264": ("Clinical seizure discharge", [3038])}, "CompleteAVDissociation": {"10:9760": ("Complete AV dissociation", [3415])}, "Cpz": {"7:1020": ("CPz", [3030])}, "CubeXYZLeadSystem": {"10:11276": ("Cube XYZ lead system", [3263])}, "Cz": {"7:1016": ("Cz", [3030])}, "DefibrillationSpike": {"10:8192": ("Defibrillation spike", [3335])}, "DefibrillatorLeadAnteriorLateral": { "2:73": ("Defibrillator lead: anterior-lateral", [3001]) }, "DeltaWave": {"10:1216": ("Delta wave", [3335])}, "DerivedLeadAvf": {"2:114": ("Derived Lead aVF", [3001])}, "DerivedLeadAvl": {"2:113": ("Derived Lead aVL", [3001])}, "DerivedLeadAvr": {"2:112": ("Derived Lead aVR", [3001])}, "DerivedLeadI": {"2:31": ("Derived Lead I", [3001])}, "DerivedLeadII": {"2:32": ("Derived Lead II", [3001])}, "DerivedLeadIII": {"2:111": ("Derived Lead III", [3001])}, "DerivedLeadV1": {"2:33": ("Derived Lead V1", [3001])}, "DerivedLeadV2": {"2:34": ("Derived Lead V2", [3001])}, "DerivedLeadV3": {"2:35": ("Derived Lead V3", [3001])}, "DerivedLeadV4": {"2:36": ("Derived Lead V4", [3001])}, "DerivedLeadV5": {"2:37": ("Derived Lead V5", [3001])}, "DerivedLeadV6": {"2:38": ("Derived Lead V6", [3001])}, "Desaturation": {"3:3246": ("Desaturation", [3038])}, "Diaphragma": {"7:552": ("Diaphragma", [3031])}, "DiaphragmaLeft": {"7:553": ("Diaphragma, left", [3031])}, "DiaphragmaRight": {"7:554": ("Diaphragma, right", [3031])}, "DominantBeat": {"10:8240": ("Dominant beat", [3335])}, "E0": {"7:1320": ("E0", [3033])}, "EASILeadAI": {"2:133": ("EASI Lead AI", [3001])}, "EASILeadAS": {"2:132": ("EASI Lead AS", [3001])}, "EASILeadES": {"2:131": ("EASI Lead ES", [3001])}, "EASIUpperSternumLead": {"2:134": ("EASI upper sternum lead", [3001])}, "ECGArtifactualActivity": {"2:24240": ("ECG artifactual activity", [3035])}, "EMGComplexRepetitiveDischarge": { "2:24448": ("EMG complex repetitive discharge", [3036]) }, "EMGCrampDischarge": {"2:24464": ("EMG cramp discharge", [3036])}, "EMGDoubletWaveform": {"2:24360": ("EMG doublet waveform", [3036])}, "EMGEndplateNoise": {"2:24392": ("EMG endplate noise", [3036])}, "EMGEndplateSpike": {"2:24400": ("EMG endplate spike", [3036])}, "EMGFasciculationPotential": {"2:24432": ("EMG fasciculation potential", [3036])}, "EMGFibrillationPotential": {"2:24416": ("EMG fibrillation potential", [3036])}, "EMGInsertionalActivity": {"2:24384": ("EMG insertional activity", [3036])}, "EMGMotorUnitPotential": {"2:24352": ("EMG motor unit potential", [3036])}, "EMGMultipletWaveform": {"2:24376": ("EMG multiplet waveform", [3036])}, "EMGMyokymicDischarge": {"2:24456": ("EMG myokymic discharge", [3036])}, "EMGMyotonicDischarge": {"2:24440": ("EMG myotonic discharge", [3036])}, "EMGPositiveSharpWave": {"2:24424": ("EMG positive sharp wave", [3036])}, "EMGTripletWaveform": {"2:24368": ("EMG triplet waveform", [3036])}, "EMGUnspecifiedIterativeDischarge": { "2:24408": ("EMG unspecified iterative discharge", [3036]) }, "EMGUnspecifiedWaveform": {"2:24336": ("EMG unspecified waveform", [3036])}, "EMGWaveformAfterDischarge": {"2:24472": ("EMG waveform after discharge", [3036])}, "EMGWaveformUnderVoluntaryControl": { "2:24344": ("EMG waveform under voluntary control", [3036]) }, "El1": {"7:1325": ("El1", [3033])}, "El2": {"7:1329": ("El2", [3033])}, "El3": {"7:1333": ("El3", [3033])}, "El4": {"7:1337": ("El4", [3033])}, "El5": {"7:1341": ("El5", [3033])}, "El6": {"7:1345": ("El6", [3033])}, "El7": {"7:1349": ("El7", [3033])}, "Ela": {"7:1389": ("Ela", [3033])}, "Elb": {"7:1393": ("Elb", [3033])}, "ElectrodeInstrumentalArtifactualActivity": { "2:24208": ("Electrode instrumental artifactual activity", [3035]) }, "Ell": {"7:1381": ("ElL", [3033])}, "EntireBeatPonToToffExcludingU": { "10:1472": ("Entire Beat (Pon to Toff, excluding U)", [3335]) }, "EntireBeatQonToToffExcludingPAndU": { "10:1536": ("Entire Beat (Qon to Toff, excluding P and U)", [3335]) }, "EntireQRSExcludingPTAndU": { "10:1600": ("Entire QRS (excluding P, T and U)", [3335]) }, "EpilepticOrPotentiallyEpileptogenicActivity": { "2:23888": ("Epileptic or potentially epileptogenic activity", [3035]) }, "EpilepticOrPotentiallyEpileptogenicSharpWave": { "2:23896": ("Epileptic or potentially epileptogenic sharp wave", [3035]) }, "EpilepticOrPotentiallyEpileptogenicSpike": { "2:23904": ("Epileptic or potentially epileptogenic spike", [3035]) }, "Er1": {"7:1354": ("Er1", [3033])}, "Er2": {"7:1358": ("Er2", [3033])}, "Er3": {"7:1362": ("Er3", [3033])}, "Er4": {"7:1366": ("Er4", [3033])}, "Er5": {"7:1370": ("Er5", [3033])}, "Er6": {"7:1374": ("Er6", [3033])}, "Er7": {"7:1378": ("Er7", [3033])}, "Era": {"7:1398": ("Era", [3033])}, "Erb": {"7:1402": ("Erb", [3033])}, "Erl": {"7:1386": ("ErL", [3033])}, "ExternalInterferenceArtifactualActivity": { "2:24272": ("External interference Artifactual activity", [3035]) }, "ExternalPacingLeadAnteriorPosterior": { "2:74": ("External pacing lead: anterior-posterior", [3001]) }, "ExtraocularMuscleActivity": {"2:24160": ("Extraocular muscle activity", [3035])}, "EyeBlink": {"2:24280": ("Eye blink", [3037])}, "EyeBlinks": {"2:24048": ("Eye blinks", [3035])}, "EyeRelatedActivity": {"2:24040": ("Eye-related activity", [3035])}, "EyeRelatedActivityElectroretinogram": { "2:24112": ("Eye-related activity electroretinogram", [3035]) }, "EyeRelatedPhotodrivingActivity": { "2:24088": ("Eye-related photodriving activity", [3035]) }, "EyeRelatedPhotomyogenicActivity": { "2:24096": ("Eye-related photomyogenic activity", [3035]) }, "EyeRelatedPhotoparadoxysmalActivity": { "2:24104": ("Eye-related photoparadoxysmal activity", [3035]) }, "EyesClosed": {"2:24320": ("Eyes closed", [3037])}, "EyesOpen": {"2:24328": ("Eyes open", [3037])}, "F1": {"7:1049": ("F1", [3030])}, "F10": {"7:1086": ("F10", [3030])}, "F2": {"7:1054": ("F2", [3030])}, "F3": {"7:1057": ("F3", [3030])}, "F4": {"7:1062": ("F4", [3030])}, "F5": {"7:1065": ("F5", [3030])}, "F6": {"7:1070": ("F6", [3030])}, "F7": {"7:1073": ("F7", [3030])}, "F8": {"7:1078": ("F8", [3030])}, "F9": {"7:1081": ("F9", [3030])}, "FC1": {"7:1089": ("FC1", [3030])}, "FC2": {"7:1094": ("FC2", [3030])}, "FC3": {"7:1097": ("FC3", [3030])}, "FC4": {"7:1102": ("FC4", [3030])}, "FC5": {"7:1105": ("FC5", [3030])}, "FC6": {"7:1110": ("FC6", [3030])}, "FT10": {"7:1126": ("FT10", [3030])}, "FT7": {"7:1113": ("FT7", [3030])}, "FT8": {"7:1118": ("FT8", [3030])}, "FT9": {"7:1121": ("FT9", [3030])}, "FastIrregularEyeMovements": {"2:24072": ("Fast irregular eye movements", [3035])}, "Fcz": {"7:1012": ("FCz", [3030])}, "FirstDegreeAVBlock": {"10:9632": ("First Degree AV Block", [3415])}, "FirstDegreeSABlock": {"10:9776": ("First Degree SA Block", [3415])}, "FlashStimulus": {"2:53539": ("Flash stimulus", [3041])}, "Fp1": {"7:1041": ("Fp1", [3030])}, "Fp2": {"7:1042": ("Fp2", [3030])}, "Fpz": {"7:1000": ("Fpz", [3030])}, "FrankLeadA": {"2:27": ("Frank Lead A", [3001])}, "FrankLeadC": {"2:26": ("Frank Lead C", [3001])}, "FrankLeadE": {"2:25": ("Frank Lead E", [3001])}, "FrankLeadF": {"2:29": ("Frank Lead F", [3001])}, "FrankLeadH": {"2:30": ("Frank Lead H", [3001])}, "FrankLeadI": {"2:24": ("Frank Lead I", [3001])}, "FrankLeadM": {"2:28": ("Frank Lead M", [3001])}, "FrankXYZLeadSystem": {"10:11274": ("Frank XYZ lead system", [3263])}, "FusionOfVentricularAndNormalBeat": { "10:8352": ("Fusion of ventricular and normal beat", [3335]) }, "Fz": {"7:1008": ("Fz", [3030])}, "GlossokineticArtifactualActivity": { "2:24256": ("Glossokinetic artifactual activity", [3035]) }, "Grade1AVBlock": {"3:3146": ("First-degree AV block", [3038])}, "Grade2AVBlock": {"3:3148": ("Second-degree AV block", [3038])}, "HighPassFilter": {"10:11404": ("High pass filter", [3691])}, "HighPassFilterDescription": {"10:11406": ("High pass filter description", [3691])}, "IdioventricularVentricularEscapeRhythm": { "10:9856": ("Idioventricular (ventricular escape) rhythm", [3415]) }, "IncompleteLeftBundleBranchBlockBeat": { "10:8480": ("Incomplete left bundle branch block beat", [3335]) }, "IncompleteRightBundleBranchBlockBeat": { "10:8512": ("Incomplete right bundle branch block beat", [3335]) }, "Interpolator": {"10:11414": ("Interpolator", [3691])}, "InterpolatorDescription": {"10:11416": ("Interpolator description", [3691])}, "InterpolatorSNR": {"10:11418": ("Interpolator SNR", [3690])}, "IntraventricularConductionDisturbance": { "10:8608": ("intraventricular conduction disturbance", [3335]) }, "IrregularHeartRate": {"3:3158": ("Irregular heart rate", [3038])}, "IrregularRhythm": {"3:3118": ("Irregular rhythm", [3038])}, "IrregularRhythmLowHeartRate": {"10:10352": ("Irregular rhythm", [3415])}, "IsoelectricPointOrSegment": {"10:1856": ("Isoelectric point or segment", [3335])}, "IsoelectricRegionFromGlobalQRSOnsetToSpecificLeadOnset": { "10:1280": ( "Isoelectric region from global QRS onset to specific lead onset", [3335], ) }, "IsoelectricRegionFromSpecificLeadQRSOffsetToGlobalOffset": { "10:1344": ( "Isoelectric region from specific lead QRS Offset to global offset", [3335], ) }, "IsolatedQRSLikeArtifact": {"10:2176": ("Isolated QRS-like artifact", [3335])}, "IsorhythmicAVDissociation": {"10:9744": ("Isorhythmic AV dissociation", [3415])}, "Iz": {"7:1036": ("Iz", [3030])}, "JPoint": {"10:2048": ("J-point", [3335])}, "JPointAmplitudePerLead": {"2:1024": ("J point Amplitude, per lead", [3688])}, "JunctionalNodalEscapeBeat": { "10:8416": ("Junctional (nodal) escape beat", [3335]) }, "JunctionalNodalPrematureContraction": { "10:8288": ("Junctional (nodal) premature contraction", [3335]) }, "JunctionalTachycardia": {"10:9584": ("Junctional Tachycardia", [3415])}, "LambdaWave": {"2:23880": ("Lambda wave", [3035])}, "LeadANehbAnterior": {"2:71": ("Lead A (Nehb - Anterior)", [3001])}, "LeadCH5": {"2:122": ("Lead CH5", [3001])}, "LeadCR5": {"2:125": ("Lead CR5", [3001])}, "LeadDNehbDorsal": {"2:70": ("Lead D (Nehb - Dorsal)", [3001])}, "LeadDisconnected": {"3:268": ("Lead disconnected", [3039])}, "LeadI": {"2:1": ("Lead I", [3001])}, "LeadII": {"2:2": ("Lead II", [3001])}, "LeadIII": {"2:61": ("Lead III", [3001])}, "LeadJNehbInferior": {"2:72": ("Lead J (Nehb - Inferior)", [3001])}, "LeadV1": {"2:3": ("Lead V1", [3001])}, "LeadV2": {"2:4": ("Lead V2", [3001])}, "LeadV2R": {"2:10": ("Lead V2R", [3001])}, "LeadV3": {"2:5": ("Lead V3", [3001])}, "LeadV3R": {"2:11": ("Lead V3R", [3001])}, "LeadV4": {"2:6": ("Lead V4", [3001])}, "LeadV4R": {"2:12": ("Lead V4R", [3001])}, "LeadV5": {"2:7": ("Lead V5", [3001])}, "LeadV5R": {"2:13": ("Lead V5R", [3001])}, "LeadV6": {"2:8": ("Lead V6", [3001])}, "LeadV6R": {"2:14": ("Lead V6R", [3001])}, "LeadV7": {"2:9": ("Lead V7", [3001])}, "LeadV7R": {"2:15": ("Lead V7R", [3001])}, "LeadV8": {"2:66": ("Lead V8", [3001])}, "LeadV8R": {"2:68": ("Lead V8R", [3001])}, "LeadV9": {"2:67": ("Lead V9", [3001])}, "LeadV9R": {"2:69": ("Lead V9R", [3001])}, "LeadVFNonaugmentedVoltageVectorOfLL": { "2:90": ("Lead VF, nonaugmented voltage, vector of LL", [3001]) }, "LeadVLNonaugmentedVoltageVectorOfLA": { "2:89": ("Lead VL, nonaugmented voltage, vector of LA", [3001]) }, "LeadVRNonaugmentedVoltageVectorOfRA": { "2:88": ("Lead VR, nonaugmented voltage, vector of RA", [3001]) }, "LeadX": {"2:16": ("Lead X", [3001])}, "LeadY": {"2:17": ("Lead Y", [3001])}, "LeadZ": {"2:18": ("Lead Z", [3001])}, "LeftAnteriorFascicularBlockBeat": { "10:8528": ("Left anterior fascicular block beat", [3335]) }, "LeftArmLead": {"2:21": ("Left Arm Lead", [3001])}, "LeftAtriumAntibradycardiaPaceSpike": { "10:4864": ("left atrium Antibradycardia pace spike", [3335]) }, "LeftBundleBranchBlockBeat": {"10:8464": ("Left bundle branch block beat", [3335])}, "LeftLegLead": {"2:23": ("Left Leg Lead", [3001])}, "LeftPosteriorFascicularBlockBeat": { "10:8544": ("Left posterior fascicular block beat", [3335]) }, "LeftVentricleAntibradycardiaPaceSpike": { "10:5632": ("left ventricle Antibradycardia pace spike", [3335]) }, "LowHeartRateVariability": {"10:10368": ("Low Heart Rate Variability", [3415])}, "LowPassFilter": {"10:11402": ("Low pass filter", [3691])}, "LowPassFilterCutoffFreq": {"10:11403": ("Low pass filter cutoff freq", [3690])}, "LownGanongLevineSyndrome": {"10:10160": ("Lown-Ganong-Levine syndrome", [3415])}, "LownGanongLevineSyndromeNormalQRS": { "10:8688": ("Lown-Ganong-Levine syndrome", [3335]) }, "MasonLikarLeadPositionsElectrodesPlacedIndividually": { "10:11266": ( "Mason-Likar lead positions, electrodes placed individually", [3263], ) }, "MasonLikarLeadPositionsV1V6InElectrodePad": { "10:11267": ("Mason-Likar lead positions, V1-V6 in electrode pad", [3263]) }, "McfeeParungaoXYZLeadSystem": { "10:11275": ("McFee-Parungao XYZ lead system", [3263]) }, "ModerateNoise": {"10:11216": ("Moderate noise", [3680])}, "ModerateNoiseBeatsCanBeDetectedButCannotBeClassified": { "10:11216": ( "Moderate Noise, beats can be detected but cannot be classified", [3335], ) }, "ModifiedChestLead": { "2:91": ("Modified chest lead (left arm indifferent)", [3001]) }, "ModifiedChestLeadPerV1Placement": { "2:92": ("Modified chest lead per V1 placement", [3001]) }, "ModifiedChestLeadPerV2Placement": { "2:93": ("Modified chest lead per V2 placement", [3001]) }, "ModifiedChestLeadPerV3Placement": { "2:94": ("Modified chest lead per V3 placement", [3001]) }, "ModifiedChestLeadPerV4Placement": { "2:95": ("Modified chest lead per V4 placement", [3001]) }, "ModifiedChestLeadPerV5Placement": { "2:96": ("Modified chest lead per V5 placement", [3001]) }, "ModifiedChestLeadPerV6Placement": { "2:97": ("Modified chest lead per V6 placement", [3001]) }, "ModifiedLimbLead": {"2:126": ("Modified limb lead", [3001])}, "MovementArtifactualActivity": { "2:24216": ("Movement artifactual activity", [3035]) }, "MultifocalAtrialTachycardia": { "10:9424": ("Multifocal Atrial Tachycardia", [3415]) }, "MultipleIndependentSpikesAndAsynchronousSlowWaves": { "2:23960": ("Multiple independent spikes and asynchronous slow waves", [3035]) }, "MultipleSpike": {"2:23912": ("Multiple spike", [3035])}, "MusculiAbdominis": {"7:556": ("Musculi abdominis", [3031])}, "MusculiAbdominisLeft": {"7:557": ("Musculi abdominis, left", [3031])}, "MusculiAbdominisRight": {"7:558": ("Musculi abdominis, right", [3031])}, "MusculiBulbi": {"7:256": ("Musculi bulbi", [3031])}, "MusculiBulbiLeft": {"7:257": ("Musculi bulbi, left", [3031])}, "MusculiBulbiRight": {"7:258": ("Musculi bulbi, right", [3031])}, "MusculiCapitis": {"7:252": ("Musculi capitis", [3031])}, "MusculiCapitisLeft": {"7:253": ("Musculi capitis, left", [3031])}, "MusculiCapitisRight": {"7:254": ("Musculi capitis, right", [3031])}, "MusculiColli": {"7:388": ("Musculi colli", [3031])}, "MusculiColliLeft": {"7:389": ("Musculi colli, left", [3031])}, "MusculiColliRight": {"7:390": ("Musculi colli, right", [3031])}, "MusculiDiaphragmatisPelvis": {"7:580": ("Musculi diaphragmatis pelvis", [3031])}, "MusculiDiaphragmatisPelvisLeft": { "7:581": ("Musculi diaphragmatis pelvis, left", [3031]) }, "MusculiDiaphragmatisPelvisRight": { "7:582": ("Musculi diaphragmatis pelvis, right", [3031]) }, "MusculiDorsi": {"7:424": ("Musculi dorsi", [3031])}, "MusculiDorsiLeft": {"7:425": ("Musculi dorsi, left", [3031])}, "MusculiDorsiRight": {"7:426": ("Musculi dorsi, right", [3031])}, "MusculiFacialesEtMasticatores": { "7:284": ("Musculi faciales et masticatores", [3031]) }, "MusculiFacialesEtMasticatoresLeft": { "7:285": ("Musculi faciales et masticatores, left", [3031]) }, "MusculiFacialesEtMasticatoresRight": { "7:286": ("Musculi faciales et masticatores, right", [3031]) }, "MusculiIntercostales": {"7:548": ("Musculi intercostales", [3031])}, "MusculiIntercostalesLeft": {"7:549": ("Musculi intercostales, left", [3031])}, "MusculiIntercostalesRight": {"7:550": ("Musculi intercostales, right", [3031])}, "MusculiInterosseiDorsales": {"7:772": ("Musculi interossei dorsales", [3031])}, "MusculiInterosseiDorsalesLeft": { "7:773": ("Musculi interossei dorsales, left", [3031]) }, "MusculiInterosseiDorsalesRight": { "7:774": ("Musculi interossei dorsales, right", [3031]) }, "MusculiInterosseiPalmares": {"7:776": ("Musculi interossei palmares", [3031])}, "MusculiInterosseiPalmaresLeft": { "7:777": ("Musculi interossei palmares, left", [3031]) }, "MusculiInterosseiPalmaresRight": { "7:778": ("Musculi interossei palmares, right", [3031]) }, "MusculiInterpsinalesRight": {"7:514": ("Musculi interpsinales, right", [3031])}, "MusculiInterspinales": {"7:512": ("Musculi interspinales", [3031])}, "MusculiInterspinalesCervicis": { "7:516": ("Musculi interspinales cervicis", [3031]) }, "MusculiInterspinalesCervicisLeft": { "7:517": ("Musculi interspinales cervicis, left", [3031]) }, "MusculiInterspinalesCervicisRight": { "7:518": ("Musculi interspinales cervicis, right", [3031]) }, "MusculiInterspinalesLeft": {"7:513": ("Musculi interspinales, left", [3031])}, "MusculiInterspinalesLumborum": { "7:524": ("Musculi interspinales lumborum", [3031]) }, "MusculiInterspinalesLumborumLeft": { "7:525": ("Musculi interspinales lumborum, left", [3031]) }, "MusculiInterspinalesLumborumRight": { "7:526": ("Musculi interspinales lumborum, right", [3031]) }, "MusculiInterspinalesThoracis": { "7:520": ("Musculi interspinales thoracis", [3031]) }, "MusculiInterspinalesThoracisLeft": { "7:521": ("Musculi interspinales thoracis, left", [3031]) }, "MusculiInterspinalesThoracisRight": { "7:522": ("Musculi interspinales thoracis, right", [3031]) }, "MusculiLaringis": {"7:376": ("Musculi laringis", [3031])}, "MusculiLaringisLeft": {"7:377": ("Musculi laringis, left", [3031])}, "MusculiLaringisRight": {"7:378": ("Musculi laringis, right", [3031])}, "MusculiLinguae": {"7:368": ("Musculi linguae", [3031])}, "MusculiLinguaeLeft": {"7:369": ("Musculi linguae, left", [3031])}, "MusculiLinguaeRight": {"7:370": ("Musculi linguae, right", [3031])}, "MusculiLumbricales": {"7:768": ("Musculi lumbricales", [3031])}, "MusculiLumbricalesLeft": {"7:769": ("Musculi lumbricales, left", [3031])}, "MusculiLumbricalesRight": {"7:770": ("Musculi lumbricales, right", [3031])}, "MusculiLunbricales": {"7:984": ("Musculi lunbricales", [3031])}, "MusculiLunbricalesLeft": {"7:985": ("Musculi lunbricales, left", [3031])}, "MusculiLunbricalesRight": {"7:986": ("Musculi lunbricales, right", [3031])}, "MusculiMembriSuperioriRight": { "7:602": ("Musculi membri superiori, right", [3031]) }, "MusculiMembriSuperioris": {"7:600": ("Musculi membri superioris", [3031])}, "MusculiMembriSuperiorisLeft": { "7:601": ("Musculi membri superioris, left", [3031]) }, "MusculiMultifidii": {"7:508": ("Musculi multifidii", [3031])}, "MusculiMultifidiiLeft": {"7:509": ("Musculi multifidii, left", [3031])}, "MusculiMultifidiiRight": {"7:510": ("Musculi multifidii, right", [3031])}, "MusculiThoracis": {"7:528": ("Musculi thoracis", [3031])}, "MusculiThoracisLeft": {"7:529": ("Musculi thoracis, left", [3031])}, "MusculiThoracisRight": {"7:530": ("Musculi thoracis, right", [3031])}, "MusculusAbductorDigitiMinimiFoot": { "7:972": ("Musculus abductor digiti minimi", [3031]) }, "MusculusAbductorDigitiMinimiFootLeft": { "7:973": ("Musculus abductor digiti minimi, left", [3031]) }, "MusculusAbductorDigitiMinimiFootRight": { "7:974": ("Musculus abductor digiti minimi", [3031]) }, "MusculusAbductorDigitiMinimiHand": { "7:756": ("Musculus abductor digiti minimi", [3031]) }, "MusculusAbductorDigitiMinimiHandLeft": { "7:757": ("Musculus abductor digiti minimi, left", [3031]) }, "MusculusAbductorDigitiMinimiHandRight": { "7:758": ("Musculus abductor digiti minimi, right", [3031]) }, "MusculusAbductorHallucis": {"7:960": ("Musculus abductor hallucis", [3031])}, "MusculusAbductorHallucisLeft": { "7:961": ("Musculus abductor hallucis, left", [3031]) }, "MusculusAbductorHallucisRight": { "7:962": ("Musculus abductor hallucis, right", [3031]) }, "MusculusAbductorPollicisBrevis": { "7:740": ("Musculus abductor pollicis brevis", [3031]) }, "MusculusAbductorPollicisBrevisLeft": { "7:741": ("Musculus abductor pollicis brevis, left", [3031]) }, "MusculusAbductorPollicisBrevisRight": { "7:742": ("Musculus abductor pollicis brevis, right", [3031]) }, "MusculusAbductorPollicisLonguss": { "7:720": ("Musculus abductor pollicis longuss", [3031]) }, "MusculusAbductorPollicisLongussLeft": { "7:721": ("Musculus abductor pollicis longuss, left", [3031]) }, "MusculusAbductorPollicisLongussRight": { "7:722": ("Musculus abductor pollicis longuss, right", [3031]) }, "MusculusAdductorBrevis": {"7:860": ("Musculus adductor brevis", [3031])}, "MusculusAdductorBrevisLeft": {"7:861": ("Musculus adductor brevis, left", [3031])}, "MusculusAdductorBrevisRight": { "7:862": ("Musculus adductor brevis, right", [3031]) }, "MusculusAdductorHallucis": {"7:968": ("Musculus adductor hallucis", [3031])}, "MusculusAdductorHallucisLeft": { "7:969": ("Musculus adductor hallucis, left", [3031]) }, "MusculusAdductorHallucisRight": {"7:970": ("Musculus adductor hallucis", [3031])}, "MusculusAdductorLongus": {"7:856": ("Musculus adductor longus", [3031])}, "MusculusAdductorLongusLeft": {"7:857": ("Musculus adductor longus, left", [3031])}, "MusculusAdductorLongusRight": { "7:858": ("Musculus adductor longus, right", [3031]) }, "MusculusAdductorMagnus": {"7:864": ("Musculus adductor magnus", [3031])}, "MusculusAdductorMagnusLeft": {"7:865": ("Musculus adductor magnus, left", [3031])}, "MusculusAdductorMagnusRight": { "7:866": ("Musculus adductor magnus, right", [3031]) }, "MusculusAdductorPollicis": {"7:752": ("Musculus adductor pollicis", [3031])}, "MusculusAdductorPollicisLeft": { "7:753": ("Musculus adductor pollicis, left", [3031]) }, "MusculusAdductorPollicisRight": { "7:754": ("Musculus adductor pollicis, right", [3031]) }, "MusculusAnconeus": {"7:656": ("Musculus anconeus", [3031])}, "MusculusAnconeusLeft": {"7:657": ("Musculus anconeus, left", [3031])}, "MusculusAnconeusRight": {"7:658": ("Musculus anconeus, right", [3031])}, "MusculusAuricularisPosterior": { "7:300": ("Musculus auricularis posterior", [3031]) }, "MusculusAuricularisPosteriorLeft": { "7:301": ("Musculus auricularis posterior, left", [3031]) }, "MusculusAuricularisPosteriorRight": { "7:302": ("Musculus auricularis posterior, right", [3031]) }, "MusculusBicepsBrachii": {"7:628": ("Musculus biceps brachii", [3031])}, "MusculusBicepsBrachiiLeft": {"7:629": ("Musculus biceps brachii, left", [3031])}, "MusculusBicepsBrachiiRight": {"7:630": ("Musculus biceps brachii, right", [3031])}, "MusculusBicepsFemoris": {"7:872": ("Musculus biceps femoris", [3031])}, "MusculusBicepsFemorisCaputBreve": { "7:880": ("Musculus biceps femoris Caput breve", [3031]) }, "MusculusBicepsFemorisCaputBreveLeft": { "7:881": ("Musculus biceps femoris Caput breve, left", [3031]) }, "MusculusBicepsFemorisCaputBreveRight": { "7:882": ("Musculus biceps femoris Caput breve, right", [3031]) }, "MusculusBicepsFemorisCaputLongum": { "7:876": ("Musculus biceps femoris Caput longum", [3031]) }, "MusculusBicepsFemorisCaputLongumLeft": { "7:877": ("Musculus biceps femoris Caput longum, left", [3031]) }, "MusculusBicepsFemorisCaputLongumRight": { "7:878": ("Musculus biceps femoris Caput longum, right", [3031]) }, "MusculusBicepsFemorisLeft": {"7:873": ("Musculus biceps femoris, left", [3031])}, "MusculusBicepsFemorisRight": {"7:874": ("Musculus biceps femoris, right", [3031])}, "MusculusBrachialis": {"7:632": ("Musculus brachialis", [3031])}, "MusculusBrachialisLeft": {"7:633": ("Musculus brachialis, left", [3031])}, "MusculusBrachialisRight": {"7:634": ("Musculus brachialis, right", [3031])}, "MusculusBrachioradialis": {"7:692": ("Musculus brachioradialis", [3031])}, "MusculusBrachioradialisLeft": { "7:693": ("Musculus brachioradialis, left", [3031]) }, "MusculusBrachioradialisRight": { "7:694": ("Musculus brachioradialis, right", [3031]) }, "MusculusBuccinator": {"7:340": ("Musculus buccinator", [3031])}, "MusculusBuccinatorLeft": {"7:341": ("Musculus buccinator, left", [3031])}, "MusculusBuccinatorRight": {"7:342": ("Musculus buccinator, right", [3031])}, "MusculusCapitisLongus": {"7:396": ("Musculus capitis longus", [3031])}, "MusculusCapitisLongusLeft": {"7:397": ("Musculus capitis longus, left", [3031])}, "MusculusCapitisLongusRight": {"7:398": ("Musculus capitis longus, right", [3031])}, "MusculusCoccygeus": {"7:588": ("Musculus coccygeus", [3031])}, "MusculusCoccygeusLeft": {"7:589": ("Musculus coccygeus, left", [3031])}, "MusculusCoccygeusRight": {"7:590": ("Musculus coccygeus, right", [3031])}, "MusculusCoracobrachialis": {"7:636": ("Musculus coracobrachialis", [3031])}, "MusculusCoracobrachialisLeft": { "7:637": ("Musculus coracobrachialis, left", [3031]) }, "MusculusCoracobrachialisRight": { "7:638": ("Musculus coracobrachialis, right", [3031]) }, "MusculusCricothyroideus": {"7:380": ("Musculus cricothyroideus", [3031])}, "MusculusCricothyroideusLeft": { "7:381": ("Musculus cricothyroideus, left", [3031]) }, "MusculusCricothyroideusRight": { "7:382": ("Musculus cricothyroideus, right", [3031]) }, "MusculusDeltoideus": {"7:604": ("Musculus deltoideus", [3031])}, "MusculusDeltoideusLeft": {"7:605": ("Musculus deltoideus, left", [3031])}, "MusculusDeltoideusRight": {"7:606": ("Musculus deltoideus, right", [3031])}, "MusculusDepressorAnguliOris": { "7:308": ("Musculus depressor anguli oris", [3031]) }, "MusculusDepressorAnguliOrisLeft": { "7:309": ("Musculus depressor anguli oris, left", [3031]) }, "MusculusDepressorAnguliOrisRight": { "7:310": ("Musculus depressor anguli oris, right", [3031]) }, "MusculusDepressorLabiiInferioris": { "7:332": ("Musculus depressor labii inferioris", [3031]) }, "MusculusDepressorLabiiInferiorisLeft": { "7:333": ("Musculus depressor labii inferioris, left", [3031]) }, "MusculusDepressorLabiiInferiorisRight": { "7:334": ("Musculus depressor labii inferioris, right", [3031]) }, "MusculusDigastricus": {"7:404": ("Musculus digastricus", [3031])}, "MusculusDigastricusLeft": {"7:405": ("Musculus digastricus, left", [3031])}, "MusculusDigastricusRight": {"7:406": ("Musculus digastricus, right", [3031])}, "MusculusDigastricusVenterAnterior": { "7:408": ("Musculus digastricus, Venter anterior", [3031]) }, "MusculusDigastricusVenterAnteriorLeft": { "7:409": ("Musculus digastricus, Venter anterior, left", [3031]) }, "MusculusDigastricusVenterAnteriorRight": { "7:410": ("Musculus digastricus, Venter anterior, right", [3031]) }, "MusculusDigastricusVenterPosterior": { "7:412": ("Musculus digastricus, Venter posterior", [3031]) }, "MusculusDigastricusVenterPosteriorLeft": { "7:413": ("Musculus digastricus, Venter posterior, left", [3031]) }, "MusculusDigastricusVenterPosteriorRight": { "7:414": ("Musculus digastricus, Venter posterior, right", [3031]) }, "MusculusErectorSpinae": {"7:472": ("Musculus erector spinae", [3031])}, "MusculusErectorSpinaeLeft": {"7:473": ("Musculus erector spinae, left", [3031])}, "MusculusErectorSpinaeRight": {"7:474": ("Musculus erector spinae, right", [3031])}, "MusculusExtensorCarpiRadialisBrevis": { "7:700": ("Musculus extensor carpi radialis brevis", [3031]) }, "MusculusExtensorCarpiRadialisBrevisLeft": { "7:701": ("Musculus extensor carpi radialis brevis, left", [3031]) }, "MusculusExtensorCarpiRadialisBrevisRight": { "7:702": ("Musculus extensor carpi radialis brevis, right", [3031]) }, "MusculusExtensorCarpiRadialisLongus": { "7:696": ("Musculus extensor carpi radialis longus", [3031]) }, "MusculusExtensorCarpiRadialisLongusLeft": { "7:697": ("Musculus extensor carpi radialis longus, left", [3031]) }, "MusculusExtensorCarpiRadialisLongusRight": { "7:698": ("Musculus extensor carpi radialis longus, right", [3031]) }, "MusculusExtensorCarpiUlnaris": { "7:712": ("Musculus extensor carpi ulnaris", [3031]) }, "MusculusExtensorCarpiUlnarisLeft": { "7:713": ("Musculus extensor carpi ulnaris, left", [3031]) }, "MusculusExtensorCarpiUlnarisRight": { "7:714": ("Musculus extensor carpi ulnaris, right", [3031]) }, "MusculusExtensorDigitiMinimi": { "7:708": ("Musculus extensor digiti minimi", [3031]) }, "MusculusExtensorDigitiMinimiLeft": { "7:709": ("Musculus extensor digiti minimi, left", [3031]) }, "MusculusExtensorDigitiMinimiRight": { "7:710": ("Musculus extensor digiti minimi, right", [3031]) }, "MusculusExtensorDigitorum": {"7:704": ("Musculus extensor digitorum", [3031])}, "MusculusExtensorDigitorumBrevis": { "7:956": ("Musculus extensor digitorum brevis", [3031]) }, "MusculusExtensorDigitorumBrevisLeft": { "7:957": ("Musculus extensor digitorum brevis, left", [3031]) }, "MusculusExtensorDigitorumBrevisRight": { "7:958": ("Musculus extensor digitorum brevis, right", [3031]) }, "MusculusExtensorDigitorumLeft": { "7:705": ("Musculus extensor digitorum, left", [3031]) }, "MusculusExtensorDigitorumLongus": { "7:896": ("Musculus extensor digitorum longus", [3031]) }, "MusculusExtensorDigitorumLongusLeft": { "7:897": ("Musculus extensor digitorum longus, left", [3031]) }, "MusculusExtensorDigitorumLongusRight": { "7:898": ("Musculus extensor digitorum longus, right", [3031]) }, "MusculusExtensorDigitorumRight": { "7:706": ("Musculus extensor digitorum, right", [3031]) }, "MusculusExtensorHallucisBrevis": { "7:952": ("Musculus extensor hallucis brevis", [3031]) }, "MusculusExtensorHallucisBrevisLeft": { "7:953": ("Musculus extensor hallucis brevis, left", [3031]) }, "MusculusExtensorHallucisBrevisRight": { "7:954": ("Musculus extensor hallucis brevis, right", [3031]) }, "MusculusExtensorHallucisLongus": { "7:900": ("Musculus extensor hallucis longus", [3031]) }, "MusculusExtensorHallucisLongusLeft": { "7:901": ("Musculus extensor hallucis longus, left", [3031]) }, "MusculusExtensorHallucisLongusRight": { "7:902": ("Musculus extensor hallucis longus, right", [3031]) }, "MusculusExtensorIndicis": {"7:732": ("Musculus extensor indicis", [3031])}, "MusculusExtensorIndicisLeft": { "7:733": ("Musculus extensor indicis, left", [3031]) }, "MusculusExtensorIndicisRight": { "7:734": ("Musculus extensor indicis, right", [3031]) }, "MusculusExtensorPollicisBrevis": { "7:724": ("Musculus extensor pollicis brevis", [3031]) }, "MusculusExtensorPollicisBrevisLeft": { "7:725": ("Musculus extensor pollicis brevis, left", [3031]) }, "MusculusExtensorPollicisBrevisRight": { "7:726": ("Musculus extensor pollicis brevis, right", [3031]) }, "MusculusExtensorPollicisLongus": { "7:728": ("Musculus extensor pollicis longus", [3031]) }, "MusculusExtensorPollicisLongusLeft": { "7:729": ("Musculus extensor pollicis longus, left", [3031]) }, "MusculusExtensorPollicisLongusRight": { "7:730": ("Musculus extensor pollicis longus, right", [3031]) }, "MusculusFlexorCarpiRadialis": { "7:664": ("Musculus flexor carpi radialis", [3031]) }, "MusculusFlexorCarpiRadialisLeft": { "7:665": ("Musculus flexor carpi radialis, left", [3031]) }, "MusculusFlexorCarpiRadialisRight": { "7:666": ("Musculus flexor carpi radialis, right", [3031]) }, "MusculusFlexorCarpiUlnaris": {"7:672": ("Musculus flexor carpi ulnaris", [3031])}, "MusculusFlexorCarpiUlnarisLeft": { "7:673": ("Musculus flexor carpi ulnaris, left", [3031]) }, "MusculusFlexorCarpiUlnarisRight": { "7:674": ("Musculus flexor carpi ulnaris, right", [3031]) }, "MusculusFlexorDigitiMinimiBrevisFoot": { "7:976": ("Musculus flexor digiti minimi brevis", [3031]) }, "MusculusFlexorDigitiMinimiBrevisFootLeft": { "7:977": ("Musculus flexor digiti minimi brevis, left", [3031]) }, "MusculusFlexorDigitiMinimiBrevisFootRight": { "7:978": ("Musculus flexor digiti minimi brevis, right", [3031]) }, "MusculusFlexorDigitiMinimiBrevisHand": { "7:760": ("Musculus flexor digiti minimi brevis", [3031]) }, "MusculusFlexorDigitiMinimiBrevisHandLeft": { "7:761": ("Musculus flexor digiti minimi brevis, left", [3031]) }, "MusculusFlexorDigitiMinimiBrevisHandRight": { "7:762": ("Musculus flexor digiti minimi brevis, right", [3031]) }, "MusculusFlexorDigitorumLongus": { "7:948": ("Musculus flexor digitorum longus", [3031]) }, "MusculusFlexorDigitorumLongusLeft": { "7:949": ("Musculus flexor digitorum longus, left", [3031]) }, "MusculusFlexorDigitorumLongusRight": { "7:950": ("Musculus flexor digitorum longus, right", [3031]) }, "MusculusFlexorDigitorumProfundus": { "7:680": ("Musculus flexor digitorum profundus", [3031]) }, "MusculusFlexorDigitorumProfundusLeft": { "7:681": ("Musculus flexor digitorum profundus, left", [3031]) }, "MusculusFlexorDigitorumProfundusRight": { "7:682": ("Musculus flexor digitorum profundus, right", [3031]) }, "MusculusFlexorDigitorumSuperficialis": { "7:676": ("Musculus flexor digitorum superficialis", [3031]) }, "MusculusFlexorDigitorumSuperficialisLeft": { "7:677": ("Musculus flexor digitorum superficialis, left", [3031]) }, "MusculusFlexorDigitorumSuperficialisRight": { "7:678": ("Musculus flexor digitorum superficialis, right", [3031]) }, "MusculusFlexorHallucisBrevis": { "7:964": ("Musculus flexor hallucis brevis", [3031]) }, "MusculusFlexorHallucisBrevisLeft": { "7:965": ("Musculus flexor hallucis brevis, left", [3031]) }, "MusculusFlexorHallucisBrevisRight": { "7:966": ("Musculus flexor hallucis brevis, right", [3031]) }, "MusculusFlexorPollicisBrevis": { "7:744": ("Musculus flexor pollicis brevis", [3031]) }, "MusculusFlexorPollicisBrevisLeft": { "7:745": ("Musculus flexor pollicis brevis, left", [3031]) }, "MusculusFlexorPollicisBrevisRight": { "7:746": ("Musculus flexor pollicis brevis, right", [3031]) }, "MusculusFlexorPollicisLongus": { "7:684": ("Musculus flexor pollicis longus", [3031]) }, "MusculusFlexorPollicisLongusLeft": { "7:685": ("Musculus flexor pollicis longus, left", [3031]) }, "MusculusFlexorPollicisLongusRight": { "7:686": ("Musculus flexor pollicis longus, right", [3031]) }, "MusculusGastrocnemius": {"7:920": ("Musculus gastrocnemius", [3031])}, "MusculusGastrocnemiusCaputLaterale": { "7:924": ("Musculus gastrocnemius Caput laterale", [3031]) }, "MusculusGastrocnemiusCaputLateraleLeft": { "7:925": ("Musculus gastrocnemius Caput laterale, left", [3031]) }, "MusculusGastrocnemiusCaputLateraleRight": { "7:926": ("Musculus gastrocnemius Caput laterale, right", [3031]) }, "MusculusGastrocnemiusCaputMediale": { "7:928": ("Musculus gastrocnemius Caput mediale", [3031]) }, "MusculusGastrocnemiusCaputMedialeLeft": { "7:929": ("Musculus gastrocnemius Caput mediale, left", [3031]) }, "MusculusGastrocnemiusCaputMedialeRight": { "7:930": ("Musculus gastrocnemius Caput mediale, right", [3031]) }, "MusculusGastrocnemiusLeft": {"7:921": ("Musculus gastrocnemius, left", [3031])}, "MusculusGastrocnemiusRight": {"7:922": ("Musculus gastrocnemius, right", [3031])}, "MusculusGenioglossus": {"7:372": ("Musculus genioglossus", [3031])}, "MusculusGenioglossusLeft": {"7:373": ("Musculus genioglossus, left", [3031])}, "MusculusGenioglossusRight": {"7:374": ("Musculus genioglossus, right", [3031])}, "MusculusGluteusMaximus": {"7:796": ("Musculus gluteus maximus", [3031])}, "MusculusGluteusMaximusLeft": {"7:797": ("Musculus gluteus maximus, left", [3031])}, "MusculusGluteusMaximusRight": { "7:798": ("Musculus gluteus maximus, right", [3031]) }, "MusculusGluteusMedius": {"7:800": ("Musculus gluteus medius", [3031])}, "MusculusGluteusMediusLeft": {"7:801": ("Musculus gluteus medius, left", [3031])}, "MusculusGluteusMediusRight": {"7:802": ("Musculus gluteus medius, right", [3031])}, "MusculusGluteusMinimus": {"7:804": ("Musculus gluteus minimus", [3031])}, "MusculusGluteusMinimusLeft": {"7:805": ("Musculus gluteus minimus, left", [3031])}, "MusculusGluteusMinimusRight": { "7:806": ("Musculus gluteus minimus, right", [3031]) }, "MusculusGmellus": {"7:820": ("Musculus gmellus", [3031])}, "MusculusGmellusLeft": {"7:821": ("Musculus gmellus, left", [3031])}, "MusculusGmellusRight": {"7:822": ("Musculus gmellus, right", [3031])}, "MusculusGracilis": {"7:868": ("Musculus gracilis", [3031])}, "MusculusGracilisLeft": {"7:869": ("Musculus gracilis, left", [3031])}, "MusculusGracilisRight": {"7:870": ("Musculus gracilis, right", [3031])}, "MusculusIliopsoas": {"7:792": ("Musculus iliopsoas", [3031])}, "MusculusIliopsoasLeft": {"7:793": ("Musculus iliopsoas, left", [3031])}, "MusculusIliopsoasRight": {"7:794": ("Musculus iliopsoas, right", [3031])}, "MusculusInfraspinatus": {"7:612": ("Musculus infraspinatus", [3031])}, "MusculusInfraspinatusLeft": {"7:613": ("Musculus infraspinatus, left", [3031])}, "MusculusInfraspinatusRight": {"7:614": ("Musculus infraspinatus, right", [3031])}, "MusculusInterosseiDorsales": {"7:988": ("Musculus interossei dorsales", [3031])}, "MusculusInterosseiDorsalesLeft": { "7:989": ("Musculus interossei dorsales, left", [3031]) }, "MusculusInterosseiDorsalesRight": { "7:990": ("Musculus interossei dorsales, right", [3031]) }, "MusculusInterosseiPlantares": {"7:992": ("Musculus interossei plantares", [3031])}, "MusculusInterosseiPlantaresLeft": { "7:993": ("Musculus interossei plantares, left", [3031]) }, "MusculusInterosseiPlantaresRight": { "7:994": ("Musculus interossei plantares, right", [3031]) }, "MusculusLatissimusDorsi": {"7:440": ("Musculus latissimus dorsi", [3031])}, "MusculusLatissimusDorsiLeft": { "7:441": ("Musculus latissimus dorsi, left", [3031]) }, "MusculusLatissimusDorsiRight": { "7:442": ("Musculus latissimus dorsi, right", [3031]) }, "MusculusLevatorAnguliOris": {"7:336": ("Musculus levator anguli oris", [3031])}, "MusculusLevatorAnguliOrisLeft": { "7:337": ("Musculus levator anguli oris, left", [3031]) }, "MusculusLevatorAnguliOrisRight": { "7:338": ("Musculus levator anguli oris, right", [3031]) }, "MusculusLevatorLabiiSuperioris": { "7:324": ("Musculus levator labii superioris", [3031]) }, "MusculusLevatorLabiiSuperiorisAlaequeNasi": { "7:328": ("Musculus levator labii superioris alaeque nasi", [3031]) }, "MusculusLevatorLabiiSuperiorisAlaequeNasiLeft": { "7:329": ("Musculus levator labii superioris alaeque nasi, left", [3031]) }, "MusculusLevatorLabiiSuperiorisAlaequeNasiRight": { "7:330": ("Musculus levator labii superioris alaeque nasi, right", [3031]) }, "MusculusLevatorLabiiSuperiorisLeft": { "7:325": ("Musculus levator labii superioris, left", [3031]) }, "MusculusLevatorLabiiSuperiorisRight": { "7:326": ("Musculus levator labii superioris, right", [3031]) }, "MusculusLevatorScapulae": {"7:452": ("Musculus levator scapulae", [3031])}, "MusculusLevatorScapulaeLeft": { "7:453": ("Musculus levator scapulae, left", [3031]) }, "MusculusLevatorScapulaeRight": { "7:454": ("Musculus levator scapulae, right", [3031]) }, "MusculusMasseter": {"7:348": ("Musculus masseter", [3031])}, "MusculusMasseterLeft": {"7:349": ("Musculus masseter, left", [3031])}, "MusculusMasseterRight": {"7:350": ("Musculus masseter, right", [3031])}, "MusculusMentalis": {"7:344": ("Musculus mentalis", [3031])}, "MusculusMentalisLeft": {"7:345": ("Musculus mentalis, left", [3031])}, "MusculusMentalisRight": {"7:346": ("Musculus mentalis, right", [3031])}, "MusculusMylohyoideus": {"7:416": ("Musculus mylohyoideus", [3031])}, "MusculusMylohyoideusLeft": {"7:417": ("Musculus mylohyoideus, left", [3031])}, "MusculusMylohyoideusRight": {"7:418": ("Musculus mylohyoideus, right", [3031])}, "MusculusObliquusExternusAbdominis": { "7:564": ("Musculus obliquus externus abdominis", [3031]) }, "MusculusObliquusExternusAbdominisLeft": { "7:565": ("Musculus obliquus externus abdominis, left", [3031]) }, "MusculusObliquusExternusAbdominisRight": { "7:566": ("Musculus obliquus externus abdominis, right", [3031]) }, "MusculusObliquusInferior": {"7:280": ("Musculus obliquus inferior", [3031])}, "MusculusObliquusInferiorLeft": { "7:281": ("Musculus obliquus inferior, left", [3031]) }, "MusculusObliquusInferiorRight": { "7:282": ("Musculus obliquus inferior, right", [3031]) }, "MusculusObliquusInternusAbdominis": { "7:568": ("Musculus obliquus internus abdominis", [3031]) }, "MusculusObliquusInternusAbdominisLeft": { "7:569": ("Musculus obliquus internus abdominis, left", [3031]) }, "MusculusObliquusInternusAbdominisRight": { "7:570": ("Musculus obliquus internus abdominis, right", [3031]) }, "MusculusObliquusSuperior": {"7:276": ("Musculus obliquus superior", [3031])}, "MusculusObliquusSuperiorLeft": { "7:277": ("Musculus obliquus superior, left", [3031]) }, "MusculusObliquusSuperiorRight": { "7:278": ("Musculus obliquus superior, right", [3031]) }, "MusculusObturator": {"7:816": ("Musculus obturator", [3031])}, "MusculusObturatorLeft": {"7:817": ("Musculus obturator, left", [3031])}, "MusculusObturatorRight": {"7:818": ("Musculus obturator, right", [3031])}, "MusculusOccipitofrontalisVenterFrontalis": { "7:288": ("Musculus occipitofrontalis, Venter frontalis", [3031]) }, "MusculusOccipitofrontalisVenterFrontalisLeft": { "7:289": ("Musculus occipitofrontalis, Venter frontalis, left", [3031]) }, "MusculusOccipitofrontalisVenterFrontalisRight": { "7:290": ("Musculus occipitofrontalis, Venter frontalis, right", [3031]) }, "MusculusOpponensDigitiMinimi": { "7:764": ("Musculus opponens digiti minimi", [3031]) }, "MusculusOpponensDigitiMinimiLeft": { "7:765": ("Musculus opponens digiti minimi, left", [3031]) }, "MusculusOpponensDigitiMinimiRight": { "7:766": ("Musculus opponens digiti minimi, right", [3031]) }, "MusculusOpponensPollicis": {"7:748": ("Musculus opponens pollicis", [3031])}, "MusculusOpponensPollicisLeft": { "7:749": ("Musculus opponens pollicis, left", [3031]) }, "MusculusOpponensPollicisRight": { "7:750": ("Musculus opponens pollicis, right", [3031]) }, "MusculusOrbicularisOculi": {"7:292": ("Musculus orbicularis oculi", [3031])}, "MusculusOrbicularisOculiLeft": { "7:293": ("Musculus orbicularis oculi, left", [3031]) }, "MusculusOrbicularisOculiParsOrbitalis": { "7:296": ("Musculus orbicularis oculi, Pars orbitalis", [3031]) }, "MusculusOrbicularisOculiParsOrbitalisLeft": { "7:297": ("Musculus orbicularis oculi, Pars orbitalis, left", [3031]) }, "MusculusOrbicularisOculiParsOrbitalisRight": { "7:298": ("Musculus orbicularis oculi, Pars orbitalis, right", [3031]) }, "MusculusOrbicularisOculiRight": { "7:294": ("Musculus orbicularis oculi, right", [3031]) }, "MusculusOrbicularisOris": {"7:304": ("Musculus orbicularis oris", [3031])}, "MusculusOrbicularisOrisLeft": { "7:305": ("Musculus orbicularis oris, left", [3031]) }, "MusculusOrbicularisOrisRight": { "7:306": ("Musculus orbicularis oris, right", [3031]) }, "MusculusPalmarisBrevis": {"7:736": ("Musculus palmaris brevis", [3031])}, "MusculusPalmarisBrevisLeft": {"7:737": ("Musculus palmaris brevis, left", [3031])}, "MusculusPalmarisBrevisRight": { "7:738": ("Musculus palmaris brevis, right", [3031]) }, "MusculusPalmarisLongus": {"7:668": ("Musculus palmaris longus", [3031])}, "MusculusPalmarisLongusLeft": {"7:669": ("Musculus palmaris longus, left", [3031])}, "MusculusPalmarisLongusRight": { "7:670": ("Musculus palmaris longus, right", [3031]) }, "MusculusPectineus": {"7:852": ("Musculus pectineus", [3031])}, "MusculusPectineusLeft": {"7:853": ("Musculus pectineus, left", [3031])}, "MusculusPectineusRight": {"7:854": ("Musculus pectineus, right", [3031])}, "MusculusPectoralisMajor": {"7:532": ("Musculus pectoralis major", [3031])}, "MusculusPectoralisMajorLeft": { "7:533": ("Musculus pectoralis major, left", [3031]) }, "MusculusPectoralisMajorRight": { "7:534": ("Musculus pectoralis major, right", [3031]) }, "MusculusPectoralisMinor": {"7:536": ("Musculus pectoralis minor", [3031])}, "MusculusPectoralisMinorLeft": { "7:537": ("Musculus pectoralis minor, left", [3031]) }, "MusculusPectoralisMinorRight": { "7:538": ("Musculus pectoralis minor, right", [3031]) }, "MusculusPeroneusBrevis": {"7:912": ("Musculus peroneus brevis", [3031])}, "MusculusPeroneusBrevisLeft": {"7:913": ("Musculus peroneus brevis, left", [3031])}, "MusculusPeroneusBrevisRight": { "7:914": ("Musculus peroneus brevis, right", [3031]) }, "MusculusPeroneusLongus": {"7:908": ("Musculus peroneus longus", [3031])}, "MusculusPeroneusLongusLeft": {"7:909": ("Musculus peroneus longus, left", [3031])}, "MusculusPeroneusLongusRight": { "7:910": ("Musculus peroneus longus, right", [3031]) }, "MusculusPiriformis": {"7:812": ("Musculus piriformis", [3031])}, "MusculusPiriformisLeft": {"7:813": ("Musculus piriformis, left", [3031])}, "MusculusPiriformisRight": {"7:814": ("Musculus piriformis, right", [3031])}, "MusculusPlantaris": {"7:936": ("Musculus plantaris", [3031])}, "MusculusPlantarisLeft": {"7:937": ("Musculus plantaris, left", [3031])}, "MusculusPlantarisRight": {"7:938": ("Musculus plantaris, right", [3031])}, "MusculusPopliteus": {"7:940": ("Musculus popliteus", [3031])}, "MusculusPopliteusLeft": {"7:941": ("Musculus popliteus, left", [3031])}, "MusculusPopliteusRight": {"7:942": ("Musculus popliteus, right", [3031])}, "MusculusPronatorQuadratus": {"7:688": ("Musculus pronator quadratus", [3031])}, "MusculusPronatorQuadratusLeft": { "7:689": ("Musculus pronator quadratus, left", [3031]) }, "MusculusPronatorQuadratusRight": { "7:690": ("Musculus pronator quadratus, right", [3031]) }, "MusculusPronatorTeres": {"7:660": ("Musculus pronator teres", [3031])}, "MusculusPronatorTeresLeft": {"7:661": ("Musculus pronator teres, left", [3031])}, "MusculusPronatorTeresRight": {"7:662": ("Musculus pronator teres, right", [3031])}, "MusculusPterygoideus": {"7:356": ("Musculus Pterygoideus", [3031])}, "MusculusPterygoideusLateralis": { "7:360": ("Musculus Pterygoideus lateralis", [3031]) }, "MusculusPterygoideusLateralisLeft": { "7:361": ("Musculus Pterygoideus lateralis, left", [3031]) }, "MusculusPterygoideusLateralisRight": { "7:362": ("Musculus Pterygoideus lateralis, right", [3031]) }, "MusculusPterygoideusLeft": {"7:357": ("Musculus Pterygoideus, left", [3031])}, "MusculusPterygoideusMedialis": { "7:364": ("Musculus Pterygoideus, medialis", [3031]) }, "MusculusPterygoideusMedialisLeft": { "7:365": ("Musculus Pterygoideus, medialis, left", [3031]) }, "MusculusPterygoideusMedialisRight": { "7:366": ("Musculus Pterygoideus, medialis, right", [3031]) }, "MusculusPterygoideusRight": {"7:358": ("Musculus Pterygoideus, right", [3031])}, "MusculusPuborectalis": {"7:584": ("Musculus puborectalis", [3031])}, "MusculusPuborectalisLeft": {"7:585": ("Musculus puborectalis, left", [3031])}, "MusculusPuborectalisRight": {"7:586": ("Musculus puborectalis, right", [3031])}, "MusculusQuadratusFemoris": {"7:824": ("Musculus quadratus femoris", [3031])}, "MusculusQuadratusFemorisLeft": { "7:825": ("Musculus quadratus femoris, left", [3031]) }, "MusculusQuadratusFemorisRight": { "7:826": ("Musculus quadratus femoris, right", [3031]) }, "MusculusQuadratusLumborum": {"7:576": ("Musculus quadratus lumborum", [3031])}, "MusculusQuadratusLumborumLeft": { "7:577": ("Musculus quadratus lumborum, left", [3031]) }, "MusculusQuadratusLumborumRight": { "7:578": ("Musculus quadratus lumborum, right", [3031]) }, "MusculusQuadratusPlantae": {"7:980": ("Musculus quadratus plantae", [3031])}, "MusculusQuadratusPlantaeLeft": { "7:981": ("Musculus quadratus plantae, left", [3031]) }, "MusculusQuadratusPlantaeRight": { "7:982": ("Musculus quadratus plantae, right", [3031]) }, "MusculusQuadricepsFemoris": {"7:832": ("Musculus quadriceps femoris", [3031])}, "MusculusQuadricepsFemorisLeft": { "7:833": ("Musculus quadriceps femoris, left", [3031]) }, "MusculusQuadricepsFemorisRight": { "7:834": ("Musculus quadriceps femoris, right", [3031]) }, "MusculusRectusAbdominis": {"7:560": ("Musculus rectus abdominis", [3031])}, "MusculusRectusAbdominisLeft": { "7:561": ("Musculus rectus abdominis, left", [3031]) }, "MusculusRectusAbdominisRight": { "7:562": ("Musculus rectus abdominis, right", [3031]) }, "MusculusRectusFemoris": {"7:836": ("Musculus rectus femoris", [3031])}, "MusculusRectusFemorisLeft": {"7:837": ("Musculus rectus femoris, left", [3031])}, "MusculusRectusFemorisRight": {"7:838": ("Musculus rectus femoris, right", [3031])}, "MusculusRectusInferior": {"7:264": ("Musculus rectus inferior", [3031])}, "MusculusRectusInferiorLeft": {"7:265": ("Musculus rectus inferior, left", [3031])}, "MusculusRectusInferiorRight": { "7:266": ("Musculus rectus inferior, right", [3031]) }, "MusculusRectusLateralis": {"7:272": ("Musculus rectus lateralis", [3031])}, "MusculusRectusLateralisLeft": { "7:273": ("Musculus rectus lateralis, left", [3031]) }, "MusculusRectusLateralisRight": { "7:274": ("Musculus rectus lateralis, right", [3031]) }, "MusculusRectusMedialis": {"7:268": ("Musculus rectus medialis", [3031])}, "MusculusRectusMedialisLeft": {"7:269": ("Musculus rectus medialis, left", [3031])}, "MusculusRectusMedialisRight": { "7:270": ("Musculus rectus medialis, right", [3031]) }, "MusculusRectusSuperior": {"7:260": ("Musculus rectus superior", [3031])}, "MusculusRectusSuperiorLeft": {"7:261": ("Musculus rectus superior, left", [3031])}, "MusculusRectusSuperiorRight": { "7:262": ("Musculus rectus superior, right", [3031]) }, "MusculusRhomboideusMajor": {"7:444": ("Musculus rhomboideus major", [3031])}, "MusculusRhomboideusMajorLeft": { "7:445": ("Musculus rhomboideus major, left", [3031]) }, "MusculusRhomboideusMajorRight": { "7:446": ("Musculus rhomboideus major, right", [3031]) }, "MusculusRhomboideusMinor": {"7:448": ("Musculus rhomboideus minor", [3031])}, "MusculusRhomboideusMinorLeft": { "7:449": ("Musculus rhomboideus minor, left", [3031]) }, "MusculusRhomboideusMinorRight": { "7:450": ("Musculus rhomboideus minor, right", [3031]) }, "MusculusRisorius": {"7:312": ("Musculus risorius", [3031])}, "MusculusRisoriusLeft": {"7:313": ("Musculus risorius, left", [3031])}, "MusculusRisoriusRight": {"7:314": ("Musculus risorius, right", [3031])}, "MusculusSartorius": {"7:828": ("Musculus sartorius", [3031])}, "MusculusSartoriusLeft": {"7:829": ("Musculus sartorius, left", [3031])}, "MusculusSartoriusRight": {"7:830": ("Musculus sartorius, right", [3031])}, "MusculusSemimembranosus": {"7:888": ("Musculus semimembranosus", [3031])}, "MusculusSemimembranosusLeft": { "7:889": ("Musculus semimembranosus, left", [3031]) }, "MusculusSemimembranosusRight": { "7:890": ("Musculus semimembranosus, right", [3031]) }, "MusculusSemispinalis": {"7:492": ("Musculus semispinalis", [3031])}, "MusculusSemispinalisCapitis": {"7:504": ("Musculus semispinalis capitis", [3031])}, "MusculusSemispinalisCapitisLeft": { "7:505": ("Musculus semispinalis capitis, left", [3031]) }, "MusculusSemispinalisCapitisRight": { "7:506": ("Musculus semispinalis capitis, right", [3031]) }, "MusculusSemispinalisCervicis": { "7:500": ("Musculus semispinalis cervicis", [3031]) }, "MusculusSemispinalisCervicisLeft": { "7:501": ("Musculus semispinalis cervicis, left", [3031]) }, "MusculusSemispinalisCervicisRight": { "7:502": ("Musculus semispinalis cervicis, right", [3031]) }, "MusculusSemispinalisLeft": {"7:493": ("Musculus semispinalis, left", [3031])}, "MusculusSemispinalisRight": {"7:494": ("Musculus semispinalis, right", [3031])}, "MusculusSemispinalisThoracis": { "7:496": ("Musculus semispinalis thoracis", [3031]) }, "MusculusSemispinalisThoracisLeft": { "7:497": ("Musculus semispinalis thoracis, left", [3031]) }, "MusculusSemispinalisThoracisRight": { "7:498": ("Musculus semispinalis thoracis, right", [3031]) }, "MusculusSemitendinosus": {"7:884": ("Musculus semitendinosus", [3031])}, "MusculusSemitendinosusLeft": {"7:885": ("Musculus semitendinosus, left", [3031])}, "MusculusSemitendinosusRight": { "7:886": ("Musculus semitendinosus, right", [3031]) }, "MusculusSerratusAnterior": {"7:544": ("Musculus serratus anterior", [3031])}, "MusculusSerratusAnteriorLeft": { "7:545": ("Musculus serratus anterior, left", [3031]) }, "MusculusSerratusAnteriorRight": { "7:546": ("Musculus serratus anterior, right", [3031]) }, "MusculusSerratusPosterior": {"7:456": ("Musculus serratus posterior", [3031])}, "MusculusSerratusPosteriorLeft": { "7:457": ("Musculus serratus posterior, left", [3031]) }, "MusculusSerratusPosteriorRight": { "7:458": ("Musculus serratus posterior, right", [3031]) }, "MusculusSoleus": {"7:932": ("Musculus soleus", [3031])}, "MusculusSoleusLeft": {"7:933": ("Musculus soleus, left", [3031])}, "MusculusSoleusRight": {"7:934": ("Musculus soleus, right", [3031])}, "MusculusSphincterAni": {"7:592": ("Musculus sphincter ani", [3031])}, "MusculusSphincterAniExternus": { "7:596": ("Musculus sphincter ani externus", [3031]) }, "MusculusSpinalis": {"7:476": ("Musculus spinalis", [3031])}, "MusculusSpinalisCapitis": {"7:488": ("Musculus spinalis capitis", [3031])}, "MusculusSpinalisCapitisLeft": { "7:489": ("Musculus spinalis capitis, left", [3031]) }, "MusculusSpinalisCapitisRight": { "7:490": ("Musculus spinalis capitis, right", [3031]) }, "MusculusSpinalisCervicis": {"7:484": ("Musculus spinalis cervicis", [3031])}, "MusculusSpinalisCervicisLeft": { "7:485": ("Musculus spinalis cervicis, left", [3031]) }, "MusculusSpinalisCervicisRight": { "7:486": ("Musculus spinalis cervicis, right", [3031]) }, "MusculusSpinalisLeft": {"7:477": ("Musculus spinalis, left", [3031])}, "MusculusSpinalisRight": {"7:478": ("Musculus spinalis, right", [3031])}, "MusculusSpinalisThoracis": {"7:480": ("Musculus spinalis thoracis", [3031])}, "MusculusSpinalisThoracisLeft": { "7:481": ("Musculus spinalis thoracis, left", [3031]) }, "MusculusSpinalisThoracisRight": { "7:482": ("Musculus spinalis thoracis, right", [3031]) }, "MusculusSplenius": {"7:468": ("Musculus splenius", [3031])}, "MusculusSpleniusCapitis": {"7:460": ("Musculus splenius capitis", [3031])}, "MusculusSpleniusCapitisLeft": { "7:461": ("Musculus splenius capitis, left", [3031]) }, "MusculusSpleniusCapitisRight": { "7:462": ("Musculus splenius capitis, right", [3031]) }, "MusculusSpleniusCervicis": {"7:464": ("Musculus splenius cervicis", [3031])}, "MusculusSpleniusCervicisLeft": { "7:465": ("Musculus splenius cervicis, left", [3031]) }, "MusculusSpleniusCervicisRight": { "7:466": ("Musculus splenius cervicis, right", [3031]) }, "MusculusSpleniusLeft": {"7:469": ("Musculus splenius, left", [3031])}, "MusculusSpleniusRight": {"7:470": ("Musculus splenius, right", [3031])}, "MusculusSternocleidomastoideus": { "7:400": ("Musculus Sternocleidomastoideus", [3031]) }, "MusculusSternocleidomastoideusLeft": { "7:401": ("Musculus Sternocleidomastoideus, left", [3031]) }, "MusculusSternocleidomastoideusRight": { "7:402": ("Musculus Sternocleidomastoideus, right", [3031]) }, "MusculusSubclavius": {"7:540": ("Musculus subclavius", [3031])}, "MusculusSubclaviusLeft": {"7:541": ("Musculus subclavius, left", [3031])}, "MusculusSubclaviusRight": {"7:542": ("Musculus subclavius, right", [3031])}, "MusculusSubscapularis": {"7:624": ("Musculus subscapularis", [3031])}, "MusculusSubscapularisLeft": {"7:625": ("Musculus subscapularis, left", [3031])}, "MusculusSubscapularisRight": {"7:626": ("Musculus subscapularis, right", [3031])}, "MusculusSupinator": {"7:716": ("Musculus supinator", [3031])}, "MusculusSupinatorLeft": {"7:717": ("Musculus supinator, left", [3031])}, "MusculusSupinatorRight": {"7:718": ("Musculus supinator, right", [3031])}, "MusculusSupraspinatus": {"7:608": ("Musculus supraspinatus", [3031])}, "MusculusSupraspinatusLeft": {"7:609": ("Musculus supraspinatus, left", [3031])}, "MusculusSupraspinatusRight": {"7:610": ("Musculus supraspinatus, right", [3031])}, "MusculusTemporalis": {"7:352": ("Musculus temporalis", [3031])}, "MusculusTemporalisLeft": {"7:353": ("Musculus temporalis, left", [3031])}, "MusculusTemporalisRight": {"7:354": ("Musculus temporalis, right", [3031])}, "MusculusTensorFasciaeLatae": {"7:808": ("Musculus tensor fasciae latae", [3031])}, "MusculusTensorFasciaeLataeLeft": { "7:809": ("Musculus tensor fasciae latae, left", [3031]) }, "MusculusTensorFasciaeLataeRight": { "7:810": ("Musculus tensor fasciae latae, right", [3031]) }, "MusculusTeresMajor": {"7:620": ("Musculus teres major", [3031])}, "MusculusTeresMajorLeft": {"7:621": ("Musculus teres major, left", [3031])}, "MusculusTeresMajorRight": {"7:622": ("Musculus teres major, right", [3031])}, "MusculusTeresMinor": {"7:616": ("Musculus teres minor", [3031])}, "MusculusTeresMinorLeft": {"7:617": ("Musculus teres minor, left", [3031])}, "MusculusTeresMinorRight": {"7:618": ("Musculus teres minor, right", [3031])}, "MusculusTibialisAnterior": {"7:892": ("Musculus tibialis anterior", [3031])}, "MusculusTibialisAnteriorLeft": { "7:893": ("Musculus tibialis anterior, left", [3031]) }, "MusculusTibialisAnteriorRight": { "7:894": ("Musculus tibialis anterior, right", [3031]) }, "MusculusTibialisPosterior": {"7:944": ("Musculus tibialis posterior", [3031])}, "MusculusTibialisPosteriorLeft": { "7:945": ("Musculus tibialis posterior, left", [3031]) }, "MusculusTibialisPosteriorRight": { "7:946": ("Musculus tibialis posterior, right", [3031]) }, "MusculusTransversusAbdominis": { "7:572": ("Musculus transversus abdominis", [3031]) }, "MusculusTransversusAbdominisLeft": { "7:573": ("Musculus transversus abdominis, left", [3031]) }, "MusculusTransversusAbdominisRight": { "7:574": ("Musculus transversus abdominis, right", [3031]) }, "MusculusTrapezius": {"7:436": ("Musculus trapezius", [3031])}, "MusculusTrapeziusLeft": {"7:437": ("Musculus trapezius, left", [3031])}, "MusculusTrapeziusRight": {"7:438": ("Musculus trapezius, right", [3031])}, "MusculusTricepsBrachii": {"7:640": ("Musculus triceps brachii", [3031])}, "MusculusTricepsBrachiiCaputLaterale": { "7:648": ("Musculus triceps brachii, Caput laterale", [3031]) }, "MusculusTricepsBrachiiCaputLateraleLeft": { "7:649": ("Musculus triceps brachii, Caput laterale, left", [3031]) }, "MusculusTricepsBrachiiCaputLateraleRight": { "7:650": ("Musculus triceps brachii, Caput laterale, right", [3031]) }, "MusculusTricepsBrachiiCaputLongum": { "7:644": ("Musculus triceps brachii, Caput longum", [3031]) }, "MusculusTricepsBrachiiCaputLongumLeft": { "7:645": ("Musculus triceps brachii, Caput longum, left", [3031]) }, "MusculusTricepsBrachiiCaputLongumRight": { "7:646": ("Musculus triceps brachii, Caput longum, right", [3031]) }, "MusculusTricepsBrachiiCaputMediale": { "7:652": ("Musculus triceps brachii, Caput mediale", [3031]) }, "MusculusTricepsBrachiiCaputMedialeLeft": { "7:653": ("Musculus triceps brachii, Caput mediale, left", [3031]) }, "MusculusTricepsBrachiiCaputMedialeRight": { "7:654": ("Musculus triceps brachii, Caput mediale, right", [3031]) }, "MusculusTricepsBrachiiLeft": {"7:641": ("Musculus triceps brachii, left", [3031])}, "MusculusTricepsBrachiiRight": { "7:642": ("Musculus triceps brachii, right", [3031]) }, "MusculusTyroartenoideus": {"7:384": ("Musculus tyroartenoideus", [3031])}, "MusculusTyroartenoideusLeft": { "7:385": ("Musculus tyroartenoideus, left", [3031]) }, "MusculusTyroartenoideusRight": { "7:386": ("Musculus tyroartenoideus, right", [3031]) }, "MusculusVastusIntermedius": {"7:844": ("Musculus vastus intermedius", [3031])}, "MusculusVastusIntermediusLeft": { "7:845": ("Musculus vastus intermedius, left", [3031]) }, "MusculusVastusIntermediusRight": { "7:846": ("Musculus vastus intermedius, right", [3031]) }, "MusculusVastusLateralis": {"7:840": ("Musculus vastus lateralis", [3031])}, "MusculusVastusLateralisLeft": { "7:841": ("Musculus vastus lateralis, left", [3031]) }, "MusculusVastusLateralisRight": { "7:842": ("Musculus vastus lateralis, right", [3031]) }, "MusculusVastusMedialis": {"7:848": ("Musculus vastus medialis", [3031])}, "MusculusVastusMedialisLeft": {"7:849": ("Musculus vastus medialis, left", [3031])}, "MusculusVastusMedialisRight": { "7:850": ("Musculus vastus medialis, right", [3031]) }, "MusculusZygomaticusMajor": {"7:316": ("Musculus zygomaticus major", [3031])}, "MusculusZygomaticusMajorLeft": { "7:317": ("Musculus zygomaticus major, left", [3031]) }, "MusculusZygomaticusMajorRight": { "7:318": ("Musculus zygomaticus major, right", [3031]) }, "MusculusZygomaticusMinor": {"7:320": ("Musculus zygomaticus minor", [3031])}, "MusculusZygomaticusMinorLeft": { "7:321": ("Musculus zygomaticus minor, left", [3031]) }, "MusculusZygomaticusMinorRight": { "7:322": ("Musculus zygomaticus minor, right", [3031]) }, "MusculustricepsSurae": {"7:916": ("Musculustriceps surae", [3031])}, "MusculustricepsSuraeLeft": {"7:917": ("Musculustriceps surae, left", [3031])}, "MusculustricepsSuraeRight": {"7:918": ("Musculustriceps surae, right", [3031])}, "MyoclonicActivity": {"2:24176": ("Myoclonic activity", [3035])}, "MyogenicHemifacialSpasms": {"2:24152": ("Myogenic hemifacial spasms", [3035])}, "MyogenicNoncerebralActivity": { "2:24120": ("Myogenic noncerebral activity", [3035]) }, "MyogenicNoncerebralFacialSynkinesis": { "2:24144": ("Myogenic noncerebral facial synkinesis", [3035]) }, "MyogenicNoncerebralMyokymia": { "2:24136": ("Myogenic noncerebral myokymia", [3035]) }, "MyogenicPalatalMyoclonus": {"2:24128": ("Myogenic palatal myoclonus", [3035])}, "MyogenicTremorActivity": {"2:24168": ("Myogenic tremor activity", [3035])}, "NEHBLeadSystem": {"10:11280": ("NEHB lead system", [3263])}, "NegativeLowRightScapulaLead": { "2:124": ("negative: low right scapula Lead", [3001]) }, "NegativeRightInfraclavicularFossa": { "2:123": ("negative: right infraclavicular fossa", [3001]) }, "NerviCervicales": {"7:92": ("Nervi cervicales", [3032])}, "NerviCervicalesLeft": {"7:93": ("Nervi cervicales, left", [3032])}, "NerviCervicalesRight": {"7:94": ("Nervi cervicales, right", [3032])}, "NerviCraniales": {"7:8": ("Nervi craniales", [3032])}, "NerviCranialesLeft": {"7:9": ("Nervi craniales, left", [3032])}, "NerviCranialesRight": {"7:10": ("Nervi craniales, right", [3032])}, "NerviLumbales": {"7:168": ("Nervi lumbales", [3032])}, "NerviLumbalesLeft": {"7:169": ("Nervi lumbales, left", [3032])}, "NerviLumbalesRight": {"7:170": ("Nervi lumbales, right", [3032])}, "NerviSacralesAtNervusCoccygeus": { "7:204": ("Nervi sacrales at Nervus coccygeus", [3032]) }, "NerviSacralesAtNervusCoccygeusLeft": { "7:205": ("Nervi sacrales at Nervus coccygeus, left", [3032]) }, "NerviSacralesAtNervusCoccygeusRight": { "7:206": ("Nervi sacrales at Nervus coccygeus, right", [3032]) }, "NerviSpinales": {"7:88": ("Nervi spinales", [3032])}, "NerviSpinalesLeft": {"7:89": ("Nervi spinales, left", [3032])}, "NerviSpinalesRight": {"7:90": ("Nervi spinales, right", [3032])}, "NerviSubscapulares": {"7:156": ("Nervi subscapulares", [3032])}, "NerviSubscapularesLeft": {"7:157": ("Nervi subscapulares, left", [3032])}, "NerviSubscapularesRight": {"7:158": ("Nervi subscapulares, right", [3032])}, "NerviThoracici": {"7:164": ("Nervi thoracici", [3032])}, "NerviThoraciciLeft": {"7:165": ("Nervi thoracici, left", [3032])}, "NerviThoraciciRight": {"7:166": ("Nervi thoracici, right", [3032])}, "NervusAbducensVI": {"7:48": ("Nervus abducens (VI)", [3032])}, "NervusAbducensVILeft": {"7:49": ("Nervus abducens (VI), left", [3032])}, "NervusAbducensVIRight": {"7:50": ("Nervus abducens (VI), right", [3032])}, "NervusAcessoriusXIRadicesCraniales": { "7:76": ("Nervus acessorius (XI), Radices craniales", [3032]) }, "NervusAcessoriusXIRadicesCranialesLeft": { "7:77": ("Nervus acessorius (XI), Radices craniales, left", [3032]) }, "NervusAcessoriusXIRadicesCranialesRight": { "7:78": ("Nervus acessorius (XI), Radices craniales, right", [3032]) }, "NervusAcessoriusXIRadicesSpinales": { "7:80": ("Nervus acessorius (XI), Radices spinales", [3032]) }, "NervusAcessoriusXIRadicesSpinalesLeft": { "7:81": ("Nervus acessorius (XI), Radices spinales, left", [3032]) }, "NervusAcessoriusXIRadicesSpinalesRight": { "7:82": ("Nervus acessorius (XI), Radices spinales, right", [3032]) }, "NervusAxillaris": {"7:160": ("Nervus axillaris", [3032])}, "NervusAxillarisLeft": {"7:161": ("Nervus axillaris, left", [3032])}, "NervusAxillarisRight": {"7:162": ("Nervus axillaris, right", [3032])}, "NervusCochlearis": {"7:64": ("Nervus cochlearis", [3032])}, "NervusCochlearisLeft": {"7:65": ("Nervus cochlearis, left", [3032])}, "NervusCochlearisRight": {"7:66": ("Nervus cochlearis, right", [3032])}, "NervusCutaneusAntebrachiiLateralis": { "7:112": ("Nervus cutaneus antebrachii lateralis", [3032]) }, "NervusCutaneusAntebrachiiLateralisLeft": { "7:113": ("Nervus cutaneus antebrachii lateralis, left", [3032]) }, "NervusCutaneusAntebrachiiLateralisRight": { "7:114": ("Nervus cutaneus antebrachii lateralis, right", [3032]) }, "NervusCutaneusAntebrachiiMedialis": { "7:116": ("Nervus cutaneus antebrachii medialis", [3032]) }, "NervusCutaneusAntebrachiiMedialisLeft": { "7:117": ("Nervus cutaneus antebrachii medialis, left", [3032]) }, "NervusCutaneusAntebrachiiMedialisRight": { "7:118": ("Nervus cutaneus antebrachii medialis, right", [3032]) }, "NervusCutaneusFemorisLateralis": { "7:188": ("Nervus cutaneus femoris lateralis", [3032]) }, "NervusCutaneusFemorisLateralisLeft": { "7:189": ("Nervus cutaneus femoris lateralis, left", [3032]) }, "NervusCutaneusFemorisLateralisRight": { "7:190": ("Nervus cutaneus femoris lateralis, right", [3032]) }, "NervusFacialisVII": {"7:52": ("Nervus facialis (VII)", [3032])}, "NervusFacialisVIILeft": {"7:53": ("Nervus facialis (VII), left", [3032])}, "NervusFacialisVIIRight": {"7:54": ("Nervus facialis (VII), right", [3032])}, "NervusFemoralis": {"7:196": ("Nervus femoralis", [3032])}, "NervusFemoralisLeft": {"7:197": ("Nervus femoralis, left", [3032])}, "NervusFemoralisRight": {"7:198": ("Nervus femoralis, right", [3032])}, "NervusFibularisCommunis": {"7:216": ("Nervus fibularis communis", [3032])}, "NervusFibularisCommunisLeft": { "7:217": ("Nervus fibularis communis, left", [3032]) }, "NervusFibularisCommunisRight": { "7:218": ("Nervus fibularis communis, right", [3032]) }, "NervusFibularisProfundus": {"7:220": ("Nervus fibularis profundus", [3032])}, "NervusFibularisProfundusLeft": { "7:221": ("Nervus fibularis profundus, left", [3032]) }, "NervusFibularisProfundusRight": { "7:222": ("Nervus fibularis profundus, right", [3032]) }, "NervusFibularisSuperficialis": { "7:224": ("Nervus fibularis superficialis", [3032]) }, "NervusFibularisSuperficialisLeft": { "7:225": ("Nervus fibularis superficialis, left", [3032]) }, "NervusFibularisSuperficialisRight": { "7:226": ("Nervus fibularis superficialis, right", [3032]) }, "NervusGlossopharingeusIX": {"7:68": ("Nervus glossopharingeus (IX)", [3032])}, "NervusGlossopharingeusIXLeft": { "7:69": ("Nervus glossopharingeus (IX), left", [3032]) }, "NervusGlossopharingeusIXRight": { "7:70": ("Nervus glossopharingeus (IX), right", [3032]) }, "NervusHypoglossusXII": {"7:84": ("Nervus hypoglossus (XII)", [3032])}, "NervusHypoglossusXIILeft": {"7:85": ("Nervus hypoglossus (XII), left", [3032])}, "NervusHypoglossusXIIRight": {"7:86": ("Nervus hypoglossus (XII), right", [3032])}, "NervusIlioInguinalis": {"7:184": ("Nervus ilio-inguinalis", [3032])}, "NervusIlioInguinalisLeft": {"7:185": ("Nervus ilio-inguinalis, left", [3032])}, "NervusIlioInguinalisRight": {"7:186": ("Nervus ilio-inguinalis, right", [3032])}, "NervusIliohypogastricus": {"7:180": ("Nervus iliohypogastricus", [3032])}, "NervusIliohypogastricusLeft": { "7:181": ("Nervus iliohypogastricus, left", [3032]) }, "NervusIliohypogastricusRight": { "7:182": ("Nervus iliohypogastricus, right", [3032]) }, "NervusInfraorbitalis": {"7:40": ("Nervus infraorbitalis", [3032])}, "NervusInfraorbitalisLeft": {"7:41": ("Nervus infraorbitalis, left", [3032])}, "NervusInfraorbitalisRight": {"7:42": ("Nervus infraorbitalis, right", [3032])}, "NervusIschiadicus": {"7:212": ("Nervus ischiadicus", [3032])}, "NervusIschiadicusLeft": {"7:213": ("Nervus ischiadicus, left", [3032])}, "NervusIschiadicusRight": {"7:214": ("Nervus ischiadicus, right", [3032])}, "NervusMandibularis": {"7:44": ("Nervus mandibularis", [3032])}, "NervusMandibularisLeft": {"7:45": ("Nervus mandibularis, left", [3032])}, "NervusMandibularisRight": {"7:46": ("Nervus mandibularis, right", [3032])}, "NervusMaxillaris": {"7:36": ("Nervus maxillaris", [3032])}, "NervusMaxillarisLeft": {"7:37": ("Nervus maxillaris, left", [3032])}, "NervusMaxillarisRight": {"7:38": ("Nervus maxillaris, right", [3032])}, "NervusMedianus": {"7:120": ("Nervus medianus", [3032])}, "NervusMedianusLeft": {"7:121": ("Nervus medianus, left", [3032])}, "NervusMedianusNerviDigitalesPalmaresProprii": { "7:128": ("Nervus medianus, Nervi digitales palmares proprii", [3032]) }, "NervusMedianusNerviDigitalesPalmaresPropriiLeft": { "7:129": ("Nervus medianus, Nervi digitales palmares proprii, left", [3032]) }, "NervusMedianusNerviDigitalesPalmaresPropriiRight": { "7:130": ("Nervus medianus, Nervi digitales palmares proprii, right", [3032]) }, "NervusMedianusRight": {"7:122": ("Nervus medianus, right", [3032])}, "NervusMusculocutaneus": {"7:108": ("Nervus musculocutaneus", [3032])}, "NervusMusculocutaneusLeft": {"7:109": ("Nervus musculocutaneus, left", [3032])}, "NervusMusculocutaneusRight": {"7:110": ("Nervus musculocutaneus, right", [3032])}, "NervusObturatorius": {"7:192": ("Nervus obturatorius", [3032])}, "NervusObturatoriusLeft": {"7:193": ("Nervus obturatorius, left", [3032])}, "NervusObturatoriusRight": {"7:194": ("Nervus obturatorius, right", [3032])}, "NervusOculomotoriusIII": {"7:16": ("Nervus oculomotorius (III)", [3032])}, "NervusOculomotoriusIIILeft": { "7:17": ("Nervus oculomotorius (III), left", [3032]) }, "NervusOculomotoriusIIIRight": { "7:18": ("Nervus oculomotorius (III), right", [3032]) }, "NervusOphtalmicus": {"7:28": ("Nervus ophtalmicus", [3032])}, "NervusOphtalmicusLeft": {"7:29": ("Nervus ophtalmicus, left", [3032])}, "NervusOphtalmicusRight": {"7:30": ("Nervus ophtalmicus, right", [3032])}, "NervusOpticusII": {"7:12": ("Nervus opticus (II)", [3032])}, "NervusOpticusIILeft": {"7:13": ("Nervus opticus (II), left", [3032])}, "NervusOpticusIIRight": {"7:14": ("Nervus opticus (II), right", [3032])}, "NervusPhrenicus": {"7:96": ("Nervus phrenicus", [3032])}, "NervusPhrenicusLeft": {"7:97": ("Nervus phrenicus, left", [3032])}, "NervusPhrenicusRight": {"7:98": ("Nervus phrenicus, right", [3032])}, "NervusPlantarisLateralis": {"7:240": ("Nervus plantaris lateralis", [3032])}, "NervusPlantarisLateralisLeft": { "7:241": ("Nervus plantaris lateralis, left", [3032]) }, "NervusPlantarisLateralisRight": { "7:242": ("Nervus plantaris lateralis, right", [3032]) }, "NervusPlantarisMedialis": {"7:236": ("Nervus plantaris medialis", [3032])}, "NervusPlantarisMedialisLeft": { "7:237": ("Nervus plantaris medialis, left", [3032]) }, "NervusPlantarisMedialisRight": { "7:238": ("Nervus plantaris medialis, right", [3032]) }, "NervusPudendus": {"7:244": ("Nervus pudendus", [3032])}, "NervusPudendusLeft": {"7:245": ("Nervus pudendus, left", [3032])}, "NervusPudendusRight": {"7:246": ("Nervus pudendus, right", [3032])}, "NervusRadialis": {"7:148": ("Nervus radialis", [3032])}, "NervusRadialisLeft": {"7:149": ("Nervus radialis, left", [3032])}, "NervusRadialisRamusSuperficialis": { "7:152": ("Nervus radialis Ramus superficialis", [3032]) }, "NervusRadialisRamusSuperficialisLeft": { "7:153": ("Nervus radialis Ramus superficialis, left", [3032]) }, "NervusRadialisRamusSuperficialisRight": { "7:154": ("Nervus radialis Ramus superficialis, right", [3032]) }, "NervusRadialisRight": {"7:150": ("Nervus radialis, right", [3032])}, "NervusSaphenus": {"7:200": ("Nervus saphenus", [3032])}, "NervusSaphenusLeft": {"7:201": ("Nervus saphenus, left", [3032])}, "NervusSaphenusRight": {"7:202": ("Nervus saphenus, right", [3032])}, "NervusSupraorbitalis": {"7:32": ("Nervus supraorbitalis", [3032])}, "NervusSupraorbitalisLeft": {"7:33": ("Nervus supraorbitalis, left", [3032])}, "NervusSupraorbitalisRight": {"7:34": ("Nervus supraorbitalis, right", [3032])}, "NervusSurealis": {"7:232": ("Nervus surealis", [3032])}, "NervusSurealisLeft": {"7:233": ("Nervus surealis, left", [3032])}, "NervusSurealisRight": {"7:234": ("Nervus surealis, right", [3032])}, "NervusThoracicusLongus": {"7:104": ("Nervus thoracicus longus", [3032])}, "NervusThoracicusLongusLeft": {"7:105": ("Nervus thoracicus longus, left", [3032])}, "NervusThoracicusLongusRight": { "7:106": ("Nervus thoracicus longus, right", [3032]) }, "NervusTibialis": {"7:228": ("Nervus tibialis", [3032])}, "NervusTibialisLeft": {"7:229": ("Nervus tibialis, left", [3032])}, "NervusTibialisRight": {"7:230": ("Nervus tibialis, right", [3032])}, "NervusTrigeminusV": {"7:24": ("Nervus trigeminus (V)", [3032])}, "NervusTrigeminusVLeft": {"7:25": ("Nervus trigeminus (V), left", [3032])}, "NervusTrigeminusVRight": {"7:26": ("Nervus trigeminus (V), right", [3032])}, "NervusTrochlearisIV": {"7:20": ("Nervus trochlearis (IV)", [3032])}, "NervusTrochlearisIVLeft": {"7:21": ("Nervus trochlearis (IV), left", [3032])}, "NervusTrochlearisIVRight": {"7:22": ("Nervus trochlearis (IV), right", [3032])}, "NervusUlnaris": {"7:132": ("Nervus ulnaris", [3032])}, "NervusUlnarisLeft": {"7:133": ("Nervus ulnaris, left", [3032])}, "NervusUlnarisNerviDigitalesPalmaresProprii": { "7:144": ("Nervus ulnaris, Nervi digitales palmares proprii", [3032]) }, "NervusUlnarisNerviDigitalesPalmaresPropriiLeft": { "7:145": ("Nervus ulnaris, Nervi digitales palmares proprii, left", [3032]) }, "NervusUlnarisNerviDigitalesPalmaresPropriiRight": { "7:146": ("Nervus ulnaris, Nervi digitales palmares proprii, right", [3032]) }, "NervusUlnarisRight": {"7:134": ("Nervus ulnaris, right", [3032])}, "NervusVagusX": {"7:72": ("Nervus vagus (X)", [3032])}, "NervusVagusXLeft": {"7:73": ("Nervus vagus (X), left", [3032])}, "NervusVagusXRight": {"7:74": ("Nervus vagus (X), right", [3032])}, "NervusVestibularis": {"7:60": ("Nervus vestibularis", [3032])}, "NervusVestibularisLeft": {"7:61": ("Nervus vestibularis, left", [3032])}, "NervusVestibularisRight": {"7:62": ("Nervus vestibularis, right", [3032])}, "NervusVestibulocochlearisVIII": { "7:56": ("Nervus vestibulocochlearis (VIII)", [3032]) }, "NervusVestibulocochlearisVIIILeft": { "7:57": ("Nervus vestibulocochlearis (VIII), left", [3032]) }, "NervusVestibulocochlearisVIIIRight": { "7:58": ("Nervus vestibulocochlearis (VIII), right", [3032]) }, "NoECGSignalIsAvailable": {"10:11248": ("No ECG signal is available", [3335])}, "NoNoise": {"10:11200": ("No Noise", [3335, 3680])}, "NoSignal": {"10:11248": ("No signal", [3680])}, "NonConductedPWave": {"10:8320": ("Non-conducted p-wave (blocked)", [3335])}, "NonRespiratorySinusArrhythmia": { "10:9312": ("Non-Respiratory Sinus Arrhythmia", [3415]) }, "NonsustainedVentricularTachycardia": { "10:10032": ("Nonsustained Ventricular Tachycardia (paroxysmal)", [3415]) }, "NormalBeatSinusBeatNormalConduction": { "10:8208": ("Normal beat (sinus beat, normal conduction)", [3335]) }, "NormalSinusRhythm": {"10:9232": ("Normal Sinus Rhythm", [3415])}, "Notch": {"10:768": ("Notch", [3335])}, "NotchFilter": {"10:11407": ("Notch filter", [3691])}, "NotchFilterBandwidth": {"10:11409": ("Notch filter bandwidth", [3690])}, "NotchFilterDescription": {"10:11410": ("Notch filter description", [3691])}, "NotchFilterFrequency": {"10:11408": ("Notch filter frequency", [3690])}, "NystagmoidEyeMovements": {"2:24056": ("Nystagmoid eye movements", [3035])}, "Nz": {"7:996": ("Nz", [3030])}, "O1": {"7:1209": ("O1", [3030])}, "O2": {"7:1214": ("O2", [3030])}, "OsborneWave": {"10:1408": ("Osborne wave", [3335])}, "OtherEyeMovement": {"2:24312": ("Other eye movement", [3037])}, "Oz": {"7:1032": ("Oz", [3030])}, "P1": {"7:1177": ("P1", [3030])}, "P10": {"7:1206": ("P10", [3030])}, "P2": {"7:1182": ("P2", [3030])}, "P3": {"7:1185": ("P3", [3030])}, "P3AmplitudePerLead": {"2:3072": ("P3 amplitude, per lead", [3688])}, "P4": {"7:1190": ("P4", [3030])}, "P5": {"7:1193": ("P5", [3030])}, "P6": {"7:1198": ("P6", [3030])}, "P9": {"7:1201": ("P9", [3030])}, "PAxis": {"2:16128": ("P Axis", [3229])}, "PDurationGlobal": {"2:16184": ("P duration global", [3228, 3689])}, "PDurationPerLead": {"2:6656": ("P duration per lead", [3228, 3687])}, "PMaximumAmplitudePerLead": {"2:1280": ("P maximum amplitude, per lead", [3688])}, "PMinimumAmplitudePerLead": {"2:1536": ("P minimum amplitude, per lead", [3688])}, "PO3": {"7:1233": ("PO3", [3030])}, "PO4": {"7:1238": ("PO4", [3030])}, "PO7": {"7:1241": ("PO7", [3030])}, "PO8": {"7:1246": ("PO8", [3030])}, "POffsetToQRSOnsetDurationPerLead": { "2:7168": ("P offset to QRS onset duration, per lead", [3687]) }, "POnsetToP1DurationPerLead": { "2:4608": ("P onset to P1 duration, per lead", [3687]) }, "POnsetToP2DurationPerLead": { "2:4864": ("P onset to P2 duration, per lead", [3687]) }, "POnsetToP3DurationPerLead": { "2:5120": ("P onset to P3 duration, per lead", [3687]) }, "PPIntervalGlobal": {"2:16140": ("PP interval global", [3228])}, "PPIntervalPerLead": {"2:32768": ("PP interval per lead", [3228])}, "PPTimePeriodGlobal": {"2:16140": ("PP time period, global", [3689])}, "PPTimePeriodPerLead": {"2:32768": ("PP time period, per lead", [3687])}, "PQSegmentTimePeriodGlobal": { "2:16148": ("PQ segment time period, global", [3689]) }, "PQSegmentTimePeriodPerLead": { "2:33536": ("PQ segment time period, per lead", [3687]) }, "PQTimePeriodGlobal": {"2:16144": ("PQ time period, global", [3689])}, "PQTimePeriodPerLead": {"2:33280": ("PQ time period, per lead", [3687])}, "PRIntervalGlobal": {"2:15872": ("PR interval global", [3228])}, "PRIntervalPerLead": {"2:7168": ("PR interval per lead", [3228])}, "PRSegment": {"10:1920": ("PR Segment", [3335])}, "PRTimePeriodGlobal": {"2:15872": ("PR time period, global", [3689])}, "PWave": {"10:256": ("P wave", [3335])}, "PWaveSecondDeflectionInPWave": { "10:320": ("P' wave (second deflection in P wave)", [3335]) }, "PWaveThirdDeflectionInPWave": { "10:384": ("P'' wave (third deflection in P wave)", [3335]) }, "PacemakerFusionBeat": {"10:8720": ("Pacemaker Fusion beat", [3335])}, "PacemakerLearningBeat": {"10:8752": ("Pacemaker Learning beat", [3335])}, "PacerArtifact": {"3:3294": ("Pacer artifact", [3038])}, "PadValue": {"10:11397": ("Pad value", [3690])}, "ParoxsysmalAtrialTachycardia": { "10:9408": ("Paroxsysmal Atrial Tachycardia", [3415]) }, "PeriodicAndQuasiperiodicCerebralActivity": { "2:23968": ("Periodic and quasiperiodic cerebral activity", [3035]) }, "PeriodicBurstsWithSuppressions": { "2:24032": ("Periodic bursts with suppressions", [3035]) }, "PeriodicCerebralComplexes": {"2:24000": ("Periodic cerebral complexes", [3035])}, "PeriodicEpileptiformDischarges": { "2:23992": ("Periodic epileptiform discharges", [3035]) }, "PeriodicMovementsOfSleep": {"2:24184": ("Periodic movements of sleep", [3035])}, "PeriodicMovementsOfSleepWithArousals": { "2:24192": ("Periodic movements of sleep with arousals", [3035]) }, "PeriodicSharpWaves": {"2:24016": ("Periodic sharp waves", [3035])}, "PeriodicSuppressions": {"2:24024": ("Periodic suppressions", [3035])}, "PeriodicTriphasicWaves": {"2:23984": ("Periodic triphasic waves", [3035])}, "Pg1": {"7:1305": ("Pg1", [3030])}, "Pg2": {"7:1306": ("Pg2", [3030])}, "PhantomSpikeAndWaveActivity": { "2:23864": ("Phantom spike and wave activity", [3035]) }, "Platysma": {"7:392": ("Platysma", [3031])}, "PlatysmaLeft": {"7:393": ("Platysma, left", [3031])}, "PlatysmaRight": {"7:394": ("Platysma, right", [3031])}, "PlexusBrachialis": {"7:100": ("Plexus brachialis", [3032])}, "PlexusBrachialisLeft": {"7:101": ("Plexus brachialis, left", [3032])}, "PlexusBrachialisRight": {"7:102": ("Plexus brachialis, right", [3032])}, "PlexusLumbalis": {"7:176": ("Plexus lumbalis", [3032])}, "PlexusLumbalisLeft": {"7:177": ("Plexus lumbalis, left", [3032])}, "PlexusLumbalisRight": {"7:178": ("Plexus lumbalis, right", [3032])}, "PlexusLumbosacralis": {"7:172": ("Plexus lumbosacralis", [3032])}, "PlexusLumbosacralisLeft": {"7:173": ("Plexus lumbosacralis, left", [3032])}, "PlexusLumbosacralisRight": {"7:174": ("Plexus lumbosacralis, right", [3032])}, "PlexusSacralis": {"7:208": ("Plexus sacralis", [3032])}, "PlexusSacralisLeft": {"7:209": ("Plexus sacralis, left", [3032])}, "PlexusSacralisRight": {"7:210": ("Plexus sacralis, right", [3032])}, "PolymorphicVentricularTachycardia": { "10:10064": ("Polymorphic Ventricular Tachycardia", [3415]) }, "PositiveOccipitalSharpTransientOfSleep": { "2:23776": ("Positive occipital sharp transient of sleep", [3035, 3046]) }, "PowerLineProblem": {"3:236": ("Power line problem", [3039])}, "PowerSupplyProblem": {"3:458": ("Power supply problem", [3039])}, "Poz": {"7:1028": ("POz", [3030])}, "PreExcitation": {"10:10096": ("pre-excitation", [3415])}, "PreExcitationBeat": {"10:8624": ("pre-excitation", [3335])}, "PrecordialLead": {"2:87": ("Precordial lead", [3001])}, "PseudoOrthogonalXYZLeadSystem": { "10:11278": ("Pseudo-orthogonal XYZ lead system", [3263]) }, "PulseArtifactualActivity": {"2:24232": ("Pulse artifactual activity", [3035])}, "Pz": {"7:1024": ("Pz", [3030])}, "QAmplitudePerLead": {"2:1792": ("Q amplitude, per lead", [3688])}, "QDurationPerLead": {"2:7680": ("Q duration, per lead", [3687])}, "QRSAxis": {"2:16132": ("QRS axis", [3229])}, "QRSDurationGlobal": {"2:16156": ("QRS duration global", [3228, 3689])}, "QRSDurationPerLead": {"2:7936": ("QRS duration per lead", [3228, 3687])}, "QSWave": {"10:512": ("QS wave", [3335])}, "QTDurationGlobal": {"2:16160": ("QT duration, global", [3689])}, "QTDurationPerLead": {"2:8192": ("QT duration, per lead", [3687])}, "QTIntervalGlobal": {"2:16160": ("QT interval global", [3228])}, "QTIntervalPerLead": {"2:8192": ("QT interval per lead", [3228])}, "QTUTimePeriodGlobal": {"2:16004": ("QTU time period, global", [3689])}, "QTUTimePeriodPerLead": {"2:34560": ("QTU time period, per lead", [3687])}, "QWave": {"10:448": ("Q wave", [3335])}, "QtcGlobalUsingBazettFormula": { "2:15880": ("QTc global using Bazett formula", [3227]) }, "QtcGlobalUsingFredericiaFormula": { "2:15892": ("QTc global using Fredericia formula", [3227]) }, "QtcIntervalGlobal": {"2:15876": ("QTc interval global", [3227])}, "QtcIntervalPerLead": {"2: 33792": ("QTc interval per lead", [3227])}, "QtcPerLeadUsingBazettFormula": { "2:34048": ("QTc per lead using Bazett formula", [3227]) }, "QtcPerLeadUsingFredericiaFormula": { "2:34304": ("QTc per lead using Fredericia formula", [3227]) }, "QuasiperiodicCerebralSharpWaves": { "2:24008": ("Quasiperiodic cerebral sharp waves", [3035]) }, "QuasiperiodicTriphasicWaves": { "2:23976": ("Quasiperiodic triphasic waves", [3035]) }, "R1AmplitudePerLead": {"2:12800": ("R1 amplitude, per lead", [3688])}, "R1DurationPerLead": {"2:11264": ("R1 duration, per lead", [3687])}, "R2AmplitudePerLead": {"2:13056": ("R2 amplitude, per lead", [3688])}, "R2DurationPerLead": {"2:11520": ("R2 duration, per lead", [3687])}, "R3AmplitudePerLead": {"2:13312": ("R3 amplitude, per lead", [3688])}, "R3DurationPerLead": {"2:11776": ("R3 duration, per lead", [3687])}, "RAmplitudePerLead": {"2:2048": ("R amplitude, per lead", [3688])}, "REM": {"2:24296": ("REM", [3037])}, "ROnTPrematureVentricularBeat": { "10:8368": ("R-on-T premature ventricular beat", [3335]) }, "RRIntervalGlobal": {"2:16168": ("RR interval global", [3228])}, "RRIntervalPerLead": {"2:33024": ("RR interval per lead", [3228])}, "RRTimePeriodGlobal": {"2:16000": ("RR time period, global", [3689])}, "RRTimePeriodPerLead": {"2:33024": ("RR time period, per lead", [3687])}, "RWave": {"10:576": ("R wave", [3335])}, "RWaveSecondDeflectionInRWave": { "10:640": ("R' wave (second deflection in R Wave)", [3335]) }, "RWaveThirdDeflectionInRWave": { "10:704": ("R'' wave (third deflection in R Wave)", [3335]) }, "RamusDorsalisNerviUlnaris": {"7:136": ("Ramus dorsalis nervi ulnaris", [3032])}, "RamusDorsalisNerviUlnarisLeft": { "7:137": ("Ramus dorsalis nervi ulnaris, left", [3032]) }, "RamusDorsalisNerviUlnarisRight": { "7:138": ("Ramus dorsalis nervi ulnaris, right", [3032]) }, "RamusPalmarisNerviMediani": {"7:124": ("Ramus palmaris nervi mediani", [3032])}, "RamusPalmarisNerviMedianiLeft": { "7:125": ("Ramus palmaris nervi mediani, left", [3032]) }, "RamusPalmarisNerviMedianiRight": { "7:126": ("Ramus palmaris nervi mediani, right", [3032]) }, "RamusPalmarisNerviUlnaris": {"7:140": ("Ramus palmaris nervi ulnaris", [3032])}, "RamusPalmarisNerviUlnarisLeft": { "7:141": ("Ramus palmaris nervi ulnaris, left", [3032]) }, "RamusPalmarisNerviUlnarisRight": { "7:142": ("Ramus palmaris nervi ulnaris, right", [3032]) }, "RapidEyeMovements": {"2:24080": ("Rapid eye movements", [3035])}, "ReentrantAVNodalTachycardia": { "10:9616": ("Reentrant AV nodal tachycardia", [3415]) }, "RespiratoryArtifactualActivity": { "2:24248": ("Respiratory artifactual activity", [3035]) }, "RespiratorySinusArrhythmia": {"10:9296": ("Respiratory Sinus Arrhythmia", [3415])}, "RhythmicSharpWaves": {"2:23944": ("Rhythmic sharp waves", [3035])}, "RightArmLead": {"2:22": ("Right Arm Lead", [3001])}, "RightAtriumAntibradycardiaPaceSpike": { "10:4608": ("right atrium Antibradycardia pace spike", [3335]) }, "RightBundleBranchBlockBeat": { "10:8496": ("Right bundle branch block beat", [3335]) }, "RightLegLead": {"2:147": ("Right Leg Lead", [3001])}, "RightVentricleAntibradycardiaPaceSpike": { "10:5376": ("right ventricle Antibradycardia pace spike", [3335]) }, "S1AmplitudePerLead": {"2:13568": ("S1 amplitude, per lead", [3688])}, "S1DurationPerLead": {"2:12032": ("S1 duration, per lead", [3687])}, "S2AmplitudePerLead": {"2:13824": ("S2 amplitude, per lead", [3688])}, "S2DurationPerLead": {"2:12288": ("S2 duration, per lead", [3687])}, "S3AmplitudePerLead": {"2:14080": ("S3 amplitude, per lead", [3688])}, "S3DurationPerLead": {"2:12544": ("S3 duration, per lead", [3687])}, "SAmplitudePerLead": {"2:2304": ("S amplitude, per lead", [3688])}, "STAmplitudePerLead": {"2:768": ("ST amplitude, per lead", [3688])}, "STChange": {"10:2304": ("ST change", [3335])}, "STMeasurementPoint": {"10:2112": ("ST measurement point", [3335])}, "STSegment": {"10:1984": ("ST Segment", [3335])}, "SWave": {"10:832": ("S wave", [3335])}, "SWaveSecondDeflectionInSWave": { "10:896": ("S' wave (second deflection in S Wave)", [3335]) }, "SWaveThirdDeflectionInSWave": { "10:960": ("S'' wave (third deflection in S Wave)", [3335]) }, "Saccade": {"2:24288": ("Saccade", [3037])}, "SampleRate": {"10:11393": ("Sample rate", [3690])}, "SampleSkew": {"10:11399": ("Sample skew", [3690])}, "SecondDegreeAVBlock": {"10:9648": ("Second Degree AV Block", [3415])}, "SecondDegreeAVBlockTypeIIMobitzTypeII": { "10:9680": ("Second Degree AV Block Type II (Mobitz Type II)", [3415]) }, "SecondDegreeAVBlockTypeIWenckebachOrMobitzTypeI": { "10:9664": ( "Second Degree AV Block Type I (Wenckebach, or Mobitz Type I)", [3415], ) }, "SecondDegreeSABlockTypeII": { "10:9808": ("Second Degree SA Block Type II", [3415]) }, "SecondDegreeSABlockTypeIWenckebach": { "10:9792": ("Second Degree SA Block Type I (Wenckebach)", [3415]) }, "Sensitivity": {"10:11394": ("Sensitivity", [3690])}, "SevereNoise": {"10:11232": ("Severe noise", [3680])}, "SevereNoiseBeatsCannotBeDetectedOrClassified": { "10:11232": ("Severe Noise, beats cannot be detected or classified", [3335]) }, "SharpAndSlowWaveComplex": {"2:23936": ("Sharp and slow wave complex", [3035])}, "SharpAppearingOrEpileptiformActivity": { "2:23816": ("Sharp appearing or epileptiform activity", [3035]) }, "SharpSpikes": {"3:3270": ("Sharp spikes", [3038])}, "SharpTransient": {"2:23824": ("Sharp transient", [3035])}, "SinusArrhythmia": {"10:9280": ("Sinus Arrhythmia", [3415])}, "SinusBradycardia": {"10:9248": ("Sinus Bradycardia", [3415])}, "SinusRhythm": {"10:9216": ("Sinus Rhythm", [3415])}, "SinusTachycardia": {"3:3262": ("Sinus tachycardia", [3038])}, "SinusTachycardiaRhythm": {"10:9264": ("Sinus Tachycardia", [3415])}, "SleepActivityAndEvent": {"2:23736": ("Sleep activity and event", [3035, 3046])}, "SleepArousal": {"2:23800": ("Sleep arousal", [3035, 3046])}, "SleepAwakening": {"2:23808": ("Sleep awakening", [3035, 3046])}, "SleepFWave": {"2:23760": ("Sleep F wave", [3035, 3046])}, "SleepKComplex": {"2:23768": ("Sleep K complex", [3035, 3046])}, "SleepSawtoothWave": {"2:23784": ("Sleep sawtooth wave", [3035, 3046])}, "SleepSpindle": {"2:23744": ("Sleep spindle", [3035, 3046])}, "SleepStageREM": {"2:23680": ("Sleep stage REM", [3035, 3046])}, "SleepStageREMWithSleepSpindle": { "2:23688": ("Sleep stage REM with sleep spindle", [3035, 3046]) }, "SleepStageShift": {"2:23792": ("Sleep stage shift", [3035, 3046])}, "SleepStageUnspecified": {"2:23656": ("Sleep stage unspecified", [3035, 3046])}, "SleepStageUnstageable": {"2:23664": ("Sleep stage unstageable", [3035, 3046])}, "SleepStageWake": {"2:23672": ("Sleep stage wake", [3035, 3046])}, "SleepVWave": {"2:23752": ("Sleep V wave", [3035, 3046])}, "SlowEyeMovement": {"2:24304": ("Slow eye movement", [3037])}, "SlowEyeMovements": {"2:24064": ("Slow eye movements", [3035])}, "SlowVentricularTachycardiaIdioventricularTachycardia": { "10:9904": ( "Slow Ventricular Tachycardia (Idioventricular Tachycardia)", [3415], ) }, "SmallSharpSpike": {"2:23840": ("Small sharp spike", [3035])}, "Sp1": {"7:1313": ("Sp1", [3030])}, "Sp2": {"7:1314": ("Sp2", [3030])}, "SpikeAndWaveComplex": {"2:23920": ("Spike and wave complex", [3035])}, "SpikesAndWaves": {"3:3254": ("Spikes and waves", [3038])}, "Standard12LeadAndCC5CM5ML": { "10:11288": ("Standard 12-lead and CC5-CM5-ML", [3263]) }, "Standard12LeadAndCM5CC5CH5": { "10:11289": ("Standard 12-lead and CM5-CC5-CH5", [3263]) }, "Standard12LeadAndNEHB": {"10:11287": ("Standard 12-lead and NEHB", [3263])}, "Standard12LeadAndXYZ": {"10:11286": ("Standard 12-lead and XYZ", [3263])}, "Standard12LeadExtendedToTheLeftByV7V8V9": { "10:11292": ("Standard 12-lead extended to the left by V7, V8, V9", [3263]) }, "Standard12LeadExtendedToTheRightByV5RV4RV3R": { "10:11291": ("Standard 12-lead extended to the right by V5R, V4R, V3R", [3263]) }, "Standard12LeadPositionsElectrodesPlacedIndividually": { "10:11265": ( "Standard 12-lead positions, electrodes placed individually", [3263], ) }, "Standard12LeadPositionsOneIntercostalSpaceHigher": { "10:11272": ("Standard 12-lead positions one intercostal space higher", [3263]) }, "Standard12LeadWithExtraLeadsToTheRightAndOrLeftSides": { "10:11290": ( "Standard 12-lead with extra leads to the right and/or left sides", [3263], ) }, "SupraventricularAtrialOrJunctionalEctopicRhythm": { "10:9488": ("Supraventricular (atrial or junctional) Ectopic Rhythm", [3415]) }, "SupraventricularEscapeBeat": {"10:8384": ("Supraventricular escape beat", [3335])}, "SupraventricularExtrasystole": { "3:3190": ("Supraventricular extrasystole", [3038]) }, "SupraventricularParoxsysmalTachycardia": { "10:9520": ("Supraventricular Paroxsysmal Tachycardia", [3415]) }, "SupraventricularPrematureContraction": { "10:8256": ("Supraventricular premature contraction", [3335]) }, "SupraventricularTachycardia": { "10:9504": ("Supraventricular Tachycardia (atrial or junctional)", [3415]) }, "SustainedMonomorphicVentricularTachycardia": { "10:10048": ("Sustained Monomorphic Ventricular Tachycardia", [3415]) }, "SwallowingAndChewingArtifactualActivity": { "2:24264": ("Swallowing and chewing artifactual activity", [3035]) }, "SweatOfGalvanicArtifactualActivity": { "2:24224": ("Sweat of galvanic artifactual activity", [3035]) }, "T1": {"7:1297": ("T1", [3030])}, "T10": {"7:1270": ("T10", [3030])}, "T2": {"7:1298": ("T2", [3030])}, "T3": {"7:1249": ("T3", [3030])}, "T4": {"7:1254": ("T4", [3030])}, "T5": {"7:1257": ("T5", [3030])}, "T6": {"7:1262": ("T6", [3030])}, "T9": {"7:1265": ("T9", [3030])}, "TAxis": {"2:16136": ("T axis", [3229])}, "TMaximumAmplitudePerLead": {"2:2560": ("T maximum amplitude, per lead", [3688])}, "TMinimumAmplitudePerLead": {"2:2816": ("T minimum amplitude, per lead", [3688])}, "TP10": {"7:1286": ("TP10", [3030])}, "TP7": {"7:1273": ("TP7", [3030])}, "TP8": {"7:1278": ("TP8", [3030])}, "TP9": {"7:1281": ("TP9", [3030])}, "TUFusedWave": {"10:1664": ("TU fused wave", [3335])}, "TWave": {"10:1024": ("T wave", [3335])}, "TWaveAlternans": {"10:10416": ("T-wave alternans", [3415])}, "TWaveChange": {"10:2368": ("T-wave change", [3335])}, "TWaveSecondDeflectionInTWave": { "10:1088": ("T' wave (second deflection in T Wave)", [3335]) }, "ThirdDegreeAVBlock": {"3:3258": ("Third-degree AV block", [3038])}, "ThirdDegreeAVBlockCompleteAVBlock": { "10:9696": ("Third Degree AV Block (complete AV block)", [3415]) }, "ThirdDegreeSABlockCompleteSABlock": { "10:9824": ("Third Degree SA Block (complete SA block)", [3415]) }, "TimeOffset": {"10:11400": ("Time offset", [3690])}, "TimeSkew": {"10:11398": ("Time skew", [3690])}, "TorsadesDePointesVentricularTachycardia": { "10:10080": ("Torsades de Pointes Ventricular Tachycardia", [3415]) }, "TransthoracicAntibradycardiaPaceSpike": { "10:5888": ("transthoracic Antibradycardia pace spike", [3335]) }, "TransthoracicAntitachycardiaPaceSpike": { "10:6912": ("transthoracic Antitachycardia pace spike", [3335]) }, "TransthoracicCardioversionSpike": { "10:7936": ("transthoracic Cardioversion spike", [3335]) }, "TransthoracicDefibrillationSpike": { "10:8960": ("transthoracic Defibrillation spike", [3335]) }, "TrifascicularBlockBeat": {"10:8576": ("trifascicular block beat", [3335])}, "TriphasicWave": {"2:23856": ("Triphasic wave", [3035])}, "UWave": {"10:1152": ("U wave", [3335])}, "UnclassifiableBeat": {"10:8736": ("Unclassifiable beat", [3335])}, "Unspecified12LeadSystem": {"10:11264": ("Unspecified 12-lead system", [3263])}, "UnspecifiedLead": {"2:0": ("Unspecified lead", [3001])}, "UnspecifiedXYZLeadSystem": {"10:11273": ("Unspecified XYZ lead system", [3263])}, "VentricleAntitachycardiaPaceSpike": { "10:6656": ("ventricle Antitachycardia pace spike", [3335]) }, "VentricleCardioversionSpike": { "10:7680": ("ventricle Cardioversion spike", [3335]) }, "VentricleDefibrillationSpike": { "10:8704": ("ventricle Defibrillation spike", [3335]) }, "VentricularActivationTime": {"10:2432": ("Ventricular Activation Time", [3335])}, "VentricularActivationTimePerLead": { "2:11008": ("Ventricular activation time, per lead", [3687]) }, "VentricularAntibradycardiaPaceSpike": { "10:5120": ("ventricular Antibradycardia pace spike", [3335]) }, "VentricularBigeminy": {"10:9920": ("Ventricular Bigeminy", [3415])}, "VentricularCouplet": {"10:9952": ("Ventricular Couplet", [3415])}, "VentricularDemandModePacing": { "10:10240": ("Ventricular Demand Mode Pacing", [3415]) }, "VentricularEscapeBeat": {"10:8432": ("Ventricular escape beat", [3335])}, "VentricularFibrillation": {"10:10016": ("Ventricular Fibrillation", [3415])}, "VentricularFlutter": {"10:10000": ("Ventricular Flutter", [3415])}, "VentricularFlutterWave": {"10:1728": ("Ventricular flutter wave", [3335])}, "VentricularParasystole": {"10:9872": ("Ventricular Parasystole", [3415])}, "VentricularPrematureContractionBeat": { "10:8336": ("Ventricular premature contraction beat", [3335]) }, "VentricularRhythm": {"10:9840": ("Ventricular rhythm", [3415])}, "VentricularRun": {"10:9968": ("Ventricular Run", [3415])}, "VentricularTachycardia": { "10:9984": ("Ventricular Tachycardia (nonparoxysmal)", [3415]) }, "VentricularTrigeminy": {"10:9936": ("Ventricular Trigeminy", [3415])}, "WanderingPacemakerBetweenTheSinusNodeAndTheAVNode": { "10:9344": ( "Wandering Pacemaker between the sinus node and the A-V node", [3415], ) }, "WanderingSinusPacemakerWithinTheSinusNode": { "10:9328": ("Wandering Sinus Pacemaker within the sinus node", [3415]) }, "Wicket": {"2:23832": ("Wicket", [3035])}, "WolfParkinsonTypeA": {"10:10128": ("Wolf-Parkinson type A", [3415])}, "WolfParkinsonTypeAQRSPositiveInV1V2": { "10:8656": ("Wolf-Parkinson type A", [3335]) }, "WolfParkinsonTypeB": {"10:10144": ("Wolf-Parkinson type B", [3415])}, "WolfParkinsonTypeBQRSNegativeInV1V2": { "10:8672": ("Wolf-Parkinson type B", [3335]) }, "WolfParkinsonWhiteSyndrome": { "10:10112": ("Wolf-Parkinson-White syndrome", [3415]) }, "WolfParkinsonWhiteSyndromeLessSpecific": { "10:8640": ("Wolf-Parkinson-White syndrome", [3335]) }, "XYZLeadsDerivedFromStandard12Lead": { "10:11279": ("XYZ leads derived from standard 12-lead", [3263]) }, "ZeroOffset": {"10:11395": ("Zero offset", [3690])}, "ZetaWave": {"2:23848": ("Zeta wave", [3035])}, "_12LeadDerivedFromFrankXYZLeads": { "10:11269": ("12-lead derived from Frank XYZ leads", [3263]) }, "_12LeadDerivedFromNonStandardLeads": { "10:11270": ("12-lead derived from non-standard leads", [3263]) }, "_12LeadElectrodePad": {"10:11268": ("12-lead electrode pad", [3263])}, "_12LeadForBicycleExerciseTestingLimbLeadsOnBackOfPatient": { "10:11271": ( "12-lead for bicycle exercise testing, limb leads on back of patient", [3263], ) }, "_12LeadFromEASILeadsESASAIByDowerEASITransformation": { "10:11284": ( "12-lead from EASI leads (ES, AS, AI) by Dower/EASI transformation", [3263], ) }, "_12LeadFromFrankLeadsXYZLeadsByDowerTransformation": { "10:11283": ( "12-lead from Frank leads XYZ leads by Dower transformation", [3263], ) }, "_12LeadFromLimbLeadsIIIAndOneOrMoreVLeads": { "10:11285": ("12-lead from Limb Leads (I, II) and one or more V leads", [3263]) }, "_14And6HzPositiveBursts": {"2:23872": ("14 and 6 Hz positive bursts", [3035])}, "_3LeadSystemCC5CM5CH5": {"10:11282": ("3-lead system, CC5-CM5-CH5", [3263])}, "_3LeadSystemCC5CM5ML": {"10:11281": ("3-lead system, CC5-CM5-ML", [3263])}, } concepts["BARI"] = { "PosteriorDescendingSeptalPerforators": { "9": ( "Posterior descending septal perforators", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "RamusLaterals": { "28A": ( "Ramus Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_1stDiagonalCoronaryArteryLaterals": { "15A": ( "1st Diagonal Coronary Artery Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_1stMarginalCoronaryArteryLaterals": { "20A": ( "1st Marginal Coronary Artery Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_2ndDiagonalCoronaryArteryLaterals": { "16A": ( "2nd Diagonal Coronary Artery Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_2ndMarginalCoronaryArteryLaterals": { "21A": ( "2nd Marginal Coronary Artery Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_3rdDiagonalCoronaryArteryLaterals": { "29A": ( "3rd Diagonal Coronary Artery Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, "_3rdMarginalCoronaryArteryLaterals": { "22A": ( "3rd Marginal Coronary Artery Laterals", [3014, 3015, 3604, 3827, 6102, 6109, 6117, 7151, 7192, 8134, 9514], ) }, } concepts["I10"] = { "ElevatedProstateSpecificAntigen": { "R97.20": ("Elevated Prostate Specific Antigen", [6327]) } } concepts["ITIS_TSN"] = { "PeromyscusLeucopus": {"180278": ("Peromyscus leucopus", [7454])}, "PeromyscusManiculatus": {"180276": ("Peromyscus maniculatus", [7454])}, "SigmodonGenus": {"180346": ("Sigmodon genus", [7454])}, } concepts["NEU"] = { "AnteriorThalamicRadiation": { "1726": ("anterior thalamic radiation", [7702, 7710, 8134]) }, "ArcuateFasciculus": {"2063": ("arcuate fasciculus", [7703, 7710, 8134])}, "CorticobulbarTract": {"1319": ("corticobulbar tract", [7702, 7710, 8134])}, "CorticospinalTract": {"1320": ("corticospinal tract", [7702, 7710, 8134])}, "InferiorOpticRadiationMeyerLoop": { "1466": ("inferior optic radiation (Meyer's loop)", [7702, 7710, 8134]) }, "InferiorThalamicRadiation": { "2082": ("inferior thalamic radiation", [7702, 7710, 8134]) }, "PosteriorThalamicRadiation": { "2083": ("posterior thalamic radiation", [7702, 7710, 8134]) }, "StriaTerminalis": {"286": ("stria terminalis", [7704, 7710, 8134])}, "SuperiorLongitudinalFasciculus": { "2080": ("superior longitudinal fasciculus", [7703, 7710, 8134]) }, "SuperiorOpticRadiationBaumLoop": { "3473": ("superior optic radiation (Baum's loop)", [7702, 7710, 8134]) }, "SuperiorThalamicRadiation": { "2081": ("superior thalamic radiation", [7702, 7710, 8134]) }, } concepts["NDC"] = { "Definity": {"11994-011-04": ("Definity", [12030])}, "Optison": {"0407-2707-03": ("Optison", [12030])}, } pydicom-pydicom-20aa4b7/src/pydicom/sr/_snomed_dict.py000066400000000000000000015407511515706620200231230ustar00rootroot00000000000000# Auto-generated by generate_concept_dicts.py. # Dict with scheme designator keys; value format is: # {concept_id1: snomed_id1, concept_id2: ...} # or # {snomed_id1: concept_id1, snomed_id2: ...} mapping = {} mapping["SCT"] = { "111002": "T-B7000", "125001": "C-B1123", "187006": "C-B1021", "270002": "S-101A9", "271003": "A-12010", "283001": "T-C4730", "300004": "L-80861", "315003": "T-02483", "345000": "T-32830", "368009": "D3-10800", "400003": "L-80156", "432003": "C-22972", "439007": "C-B1010", "461002": "T-A7093", "485005": "T-59440", "507002": "L-80833", "524008": "G-A443", "583000": "L-80902", "589001": "T-32410", "606003": "L-80703", "661005": "T-D1213", "684003": "L-80213", "739006": "A-17230", "774007": "T-D1000", "795002": "G-A140", "796001": "C-80330", "873008": "C-29020", "925002": "C-B0325", "944009": "L-80175", "955009": "T-26000", "976004": "T-48780", "1006005": "L-80438", "1101003": "T-D1400", "1118004": "L-80462", "1166006": "C-16600", "1182007": "C-81100", "1193009": "T-13640", "1194003": "P0-30450", "1211003": "A-17222", "1231004": "T-A1110", "1240000": "F-10310", "1247002": "L-80419", "1250004": "G-A316", "1307006": "T-24440", "1312007": "G-A371", "1346008": "C-22921", "1368003": "C-114B1", "1386000": "D3-89100", "1420005": "L-80821", "1439000": "T-C46A0", "1483009": "G-A160", "1514007": "L-80715", "1522000": "M-01470", "1537001": "T-117BB", "1626008": "T-11730", "1663004": "G-F212", "1710001": "F-61470", "1732005": "T-C6510", "1789009": "L-80461", "1809004": "L-80A40", "1849007": "T-55255", "1896004": "D4-48014", "1902009": "T-02200", "1918003": "T-42510", "1929004": "M-95913", "1974006": "L-80840", "2008008": "C-131A2", "2048000": "T-C5140", "2059009": "T-02214", "2062007": "L-80770", "2088005": "C-22898", "2092003": "M-87203", "2095001": "T-22000", "2099007": "M-91200", "2124007": "L-80341", "2159007": "C-22831", "2160002": "T-42370", "2272004": "S-10154", "2282003": "A-04830", "2309006": "C-14600", "2334006": "T-72100", "2400006": "T-54410", "2424003": "M-88003", "2620004": "T-1173B", "2705002": "C-115A2", "2739003": "T-83400", "2748008": "T-A7010", "2812003": "T-12711", "2841007": "T-46600", "2869004": "C-21624", "2942001": "C-B1302", "2985005": "M-85403", "3027009": "C-122A5", "3040004": "C-B1207", "3058005": "T-A0140", "3099004": "L-80345", "3120008": "T-29000", "3159004": "T-46180", "3216001": "L-80146", "3227004": "T-43107", "3236000": "T-28220", "3243006": "T-C4660", "3260001": "L-80568", "3325005": "F-63390", "3347005": "L-80778", "3354004": "L-80A15", "3361000": "C-A6700", "3415004": "M-04100", "3430008": "J-06173", "3566006": "L-80347", "3583002": "G-A108", "3653002": "L-80A08", "3674001": "L-80876", "3829006": "C-13000", "3839000": "M-83143", "3916005": "T-C4110", "3921008": "L-80707", "3924000": "T-46210", "3932008": "C-127A2", "3937002": "T-A2594", "3954005": "T-AA940", "3960005": "T-A2920", "3995008": "L-80A30", "3997000": "L-80450", "4019005": "T-81230", "4042003": "L-80A57", "4147007": "M-03000", "4258007": "T-49620", "4317002": "T-14050", "4382004": "C-81120", "4386001": "F-20250", "4421005": "T-E0000", "4432005": "T-F6845", "4525004": "P2-10700", "4554005": "D3-33000", "4557003": "D3-12700", "4563007": "P0-10210", "4574003": "L-80346", "4578000": "T-02812", "4596009": "T-24100", "4631006": "M-82113", "4656000": "C-22963", "4658004": "T-02305", "4693006": "C-B1012", "4754008": "D7-90420", "4832001": "C-B1208", "4942000": "T-C4800", "4958002": "T-A3230", "4960000": "L-80439", "5043000": "C-22923", "5076001": "T-D3213", "5140004": "T-54230", "5164003": "L-80333", "5227002": "L-80643", "5244003": "M-85030", "5272005": "T-02304", "5296000": "T-C4361", "5306005": "L-80800", "5329002": "T-11640", "5366008": "T-A2570", "5394000": "T-C4690", "5405008": "C-144A6", "5438004": "L-80206", "5442001": "C-22901", "5467003": "F-21301", "5540006": "C-14300", "5665001": "T-AA610", "5692007": "C-B1022", "5712003": "G-A530", "5713008": "T-D1603", "5727003": "T-C4240", "5798000": "T-D3400", "5884001": "P1-48350", "5916008": "L-80777", "5928000": "T-48420", "5931004": "C-B1222", "6004007": "T-1172B", "6041008": "G-A485", "6053007": "L-80563", "6062009": "T-54730", "6064005": "G-D112", "6103004": "L-807C8", "6112002": "L-80151", "6217003": "T-55320", "6220006": "L-80422", "6229007": "T-1115A", "6257000": "C-B1176", "6301006": "C-156A6", "6413002": "T-C4680", "6423006": "T-13610", "6425004": "C-51000", "6431001": "L-80325", "6456007": "D3-31290", "6511003": "T-43122", "6516008": "C-B1065", "6530003": "T-35002", "6533001": "T-59345", "6538005": "T-46130", "6574001": "M-54000", "6660000": "M-72175", "6701008": "C-22841", "6703006": "D7-90428", "6706003": "G-D028", "6708002": "P1-86180", "6725000": "C-22947", "6736007": "G-A002", "6797001": "F-31150", "6832004": "P1-30350", "6866008": "T-A4950", "6871001": "T-39010", "6969002": "T-C0200", "6973004": "C-B1013", "7087005": "G-A397", "7121006": "T-54220", "7140000": "C-B0300", "7281000": "C-B1209", "7292004": "C-B0156", "7305005": "D4-32014", "7434003": "C-22924", "7562007": "P5-D6000", "7569003": "T-D8800", "7610001": "T-117A0", "7623008": "L-80409", "7657000": "T-47400", "7770004": "C-158A6", "7771000": "G-A101", "7832008": "T-42500", "7843000": "L-80141", "7844006": "T-15610", "7991003": "T-02531", "8001006": "T-53010", "8012006": "T-45530", "8017000": "T-32540", "8089006": "L-80463", "8128003": "T-42110", "8202008": "C-135A3", "8205005": "T-D8600", "8225009": "T-32850", "8227001": "C-180A5", "8334002": "T-C4490", "8342001": "C-22934", "8348002": "C-97520", "8351009": "L-807A1", "8356004": "T-C4560", "8359006": "G-D231", "8360001": "M-89400", "8361002": "T-1A170", "8419007": "L-80A20", "8429000": "C-22865", "8516002": "L-80564", "8517006": "S-32070", "8568009": "T-C4400", "8592001": "P1-05052", "8598002": "T-A8500", "8629005": "T-48510", "8715000": "P0-10010", "8722008": "D3-29020", "8763002": "L-80606", "8821006": "T-47630", "8836009": "C-22935", "8858006": "C-B1182", "8873007": "T-54490", "8887007": "T-48620", "8926000": "C-22946", "8928004": "T-C4810", "8931003": "T-12282", "8970009": "L-80605", "8989009": "L-80106", "8993003": "T-48720", "8997002": "F-32040", "9010006": "C-22907", "9014002": "D0-22100", "9040008": "T-59420", "9131007": "L-80801", "9135003": "L-80642", "9188009": "T-1178B", "9190005": "C-97580", "9230001": "L-80209", "9265001": "P3-05000", "9277006": "L-80142", "9351000": "C-160A3", "9454009": "T-48330", "9528004": "L-80843", "9642004": "T-48611", "9659009": "T-C4280", "9713002": "D7-51010", "9721008": "C-6A180", "9726003": "G-A214", "9761009": "L-80740", "9775002": "T-45190", "9875009": "T-C8000", "9904008": "D4-30000", "9947008": "S-10131", "9964006": "F-10110", "10040000": "L-80824", "10119003": "T-47340", "10136006": "L-80A56", "10200004": "T-62000", "10209003": "T-C4140", "10247008": "C-22806", "10249006": "C-84085", "10261003": "L-80601", "10293006": "T-46700", "10337008": "F-32400", "10369004": "L-80729", "10376009": "M-80502", "10517005": "T-A3800", "10544000": "L-80754", "10626002": "D3-31744", "10639003": "M-97313", "10701001": "L-80A17", "10712001": "C-A2010", "10738001": "C-162A3", "10740006": "C-22958", "10781003": "C-B1142", "10828004": "G-A200", "10842007": "L-807C4", "10849003": "P1-03176", "10904000": "F-10320", "10944007": "F-64460", "11000004": "T-A3200", "11068009": "T-11780", "11069001": "C-22944", "11070000": "G-A171", "11089000": "T-A6620", "11136004": "C-6A16A", "11157007": "F-33750", "11161001": "L-80567", "11201005": "C-22821", "11279006": "T-45520", "11477006": "L-80873", "11496005": "C-13321", "11554009": "F-10130", "11584001": "T-02302", "11628009": "T-A0103", "11645004": "C-22906", "11671000": "M-82003", "11708003": "T-D4240", "11712009": "T-54270", "11713004": "C-10120", "11723008": "G-4022", "11727009": "C-22927", "11740004": "T-C46A1", "11746005": "L-80711", "11780008": "C-22871", "11851006": "D3-29010", "11896004": "G-A114", "11899006": "T-C4365", "11967001": "L-80324", "11993008": "S-101AA", "11994002": "T-11940", "12001002": "C-22943", "12030009": "C-22807", "12052000": "T-46980", "12091005": "L-80882", "12119009": "C-22933", "12123001": "T-48170", "12130007": "G-D109", "12131006": "L-80805", "12169001": "M-95800", "12196003": "T-C4760", "12335007": "C-B0317", "12360007": "L-80430", "12390000": "L-80731", "12402003": "M-78060", "12407009": "L-80609", "12503006": "C-12000", "12597001": "C-13900", "12611008": "T-12740", "12691009": "T-46010", "12710003": "C-22968", "12728001": "T-C4852", "12738006": "T-A0100", "12745006": "P1-14020", "12800002": "T-43212", "12801003": "C-B0326", "12852001": "F-10210", "12872006": "T-11301", "12881000": "T-1242A", "12921003": "T-D6000", "12958003": "T-A7020", "12977001": "C-10122", "12989004": "T-117B0", "13024002": "T-17010", "13050003": "T-32840", "13091001": "P1-03151", "13132007": "C-A7220", "13190002": "T-D8640", "13213009": "D4-31000", "13237009": "C-142A5", "13248002": "L-80841", "13284009": "L-80915", "13331008": "M-58000", "13363002": "T-47600", "13383001": "T-32004", "13418002": "T-32650", "13482005": "T-C4100", "13487004": "L-80455", "13544004": "L-80131", "13561001": "T-AA910", "13576009": "T-F1820", "13647002": "T-43200", "13648007": "T-75000", "13652007": "C-22301", "13653002": "L-D9814", "13662000": "P1-36957", "13744001": "C-22808", "13791008": "F-01380", "13881006": "T-11166", "13931001": "C-15211", "13934009": "L-80339", "13942005": "L-80802", "13958008": "T-A2860", "14016003": "T-C1000", "14063001": "L-80579", "14071002": "C-158A7", "14106009": "A-11100", "14156004": "M-32410", "14205002": "F-10346", "14245006": "L-80848", "14293000": "T-11920", "14350002": "M-76100", "14414005": "G-A111", "14443002": "C-52500", "14502000": "F-10226", "14510004": "T-11307", "14529005": "C-178A8", "14537002": "M-96503", "14544006": "C-22894", "14691008": "C-162A7", "14738005": "T-A3500", "14742008": "T-59000", "14766002": "P1-03130", "14770005": "T-54770", "14799000": "M-80006", "14804005": "F-61380", "14806007": "T-11610", "14876008": "L-80815", "14892003": "T-A7091", "14910006": "F-20010", "14944004": "T-F7001", "14958002": "C-22801", "14975008": "T-D8500", "14990007": "M-92203", "15020009": "L-80A52", "15119000": "T-A8780", "15158005": "A-80230", "15171008": "L-80830", "15415002": "P1-86520", "15422005": "T-54450", "15425007": "T-D4400", "15443006": "L-80663", "15454001": "M-02520", "15497006": "T-87000", "15508007": "G-4043", "15529003": "C-22908", "15665001": "T-14172", "15672000": "T-45270", "15690004": "M-31790", "15698006": "C-63A10", "15763003": "T-46668", "15775008": "T-AA220", "15776009": "T-65000", "15825003": "T-42000", "15869005": "A-2C090", "15896008": "C-22892", "15924003": "T-22100", "15961007": "L-80541", "15966002": "L-80742", "16015002": "L-80212", "16050005": "T-C4470", "16051009": "T-C4740", "16228004": "T-C46A4", "16239001": "T-32637", "16251004": "T-02151", "16310003": "P5-B0000", "16349000": "A-12000", "16356006": "D8-20100", "16528000": "L-80A10", "16567006": "D4-31B24", "16621002": "T-02111", "16630005": "T-A2300", "16736007": "P5-39010", "16788000": "C-22846", "16811007": "T-51305", "16836001": "C-22945", "16838000": "D2-81180", "16857009": "G-D164", "16932000": "F-52840", "16943008": "C-22805", "16953009": "T-15430", "16973004": "F-18010", "16982005": "T-D2220", "17069007": "C-B1140", "17137000": "T-47160", "17172002": "C-22918", "17232002": "T-45600", "17338001": "D3-31740", "17269004": "T-43211", "17366009": "D3-31500", "17388009": "T-45730", "17399006": "T-11308", "17505006": "T-54640", "17589002": "G-A265", "17600005": "C-B1000", "17621005": "G-A460", "17623008": "T-49330", "17636008": "P3-02000", "17663009": "L-80898", "17693003": "C-22A07", "17717005": "L-80651", "17861009": "T-C5000", "17910003": "C-113A1", "17941002": "M-52200", "17945006": "S-10115", "17957002": "T-02621", "18016009": "M-52500", "18033002": "T-18427", "18102001": "P5-40060", "18112008": "T-46422", "18115005": "M-55420", "18149002": "T-11B00", "18165001": "M-57610", "18212001": "L-80524", "18220004": "F-B3000", "18234004": "T-A8040", "18346003": "T-14140", "18444004": "T-52110", "18457007": "T-C3070", "18525008": "T-D9550", "18545000": "T-A1120", "18546004": "D4-31810", "18590009": "P2-35000", "18619003": "T-AA110", "18686000": "T-14120", "18857001": "T-82006", "18911002": "T-91000", "18946005": "P1-C0220", "18962004": "T-23050", "19041007": "C-815E1", "19078005": "L-80750", "19086005": "P5-D2000", "19100000": "T-04003", "19130008": "M-10000", "19227008": "M-30400", "19242006": "D2-61100", "19346006": "D6-90800", "19356005": "L-80427", "19443004": "A-04034", "19495007": "C-B1206", "19648000": "G-A321", "19665009": "M-82110", "19695001": "T-D4210", "19715009": "T-49230", "19770007": "L-80581", "19776001": "M-02530", "19829001": "D2-50000", "19893005": "C-13518", "19897006": "M-95403", "19923001": "A-26800", "19928005": "M-78800", "19939008": "G-A561", "19943007": "D5-80600", "19952003": "M-52240", "20044005": "L-80654", "20115005": "T-49350", "20230008": "C-22858", "20233005": "T-98000", "20262006": "F-A4580", "20280002": "L-80580", "20292002": "T-15311", "20298003": "T-11227", "20446002": "M-02260", "20699002": "T-49240", "20717008": "M-52120", "20721001": "D3-29040", "20760004": "T-12412", "20982000": "T-40050", "21008007": "M-84403", "21021000": "L-80610", "21039009": "L-80837", "21058000": "T-C5330", "21114003": "G-A472", "21133008": "T-12435", "21134002": "F-00100", "21150005": "L-80851", "21161002": "T-A8570", "21208000": "L-80214", "21278004": "F-13060", "21295007": "L-80431", "21306003": "T-58400", "21326004": "M-80453", "21379009": "D3-83660", "21381006": "D7-90434", "21387005": "T-11190", "21418008": "L-80894", "21479005": "T-45170", "21483005": "T-A0090", "21553004": "L-80148", "21572004": "C-114A4", "21576001": "C-107A1", "21592006": "C-22844", "21594007": "G-A425", "21637005": "L-80A14", "21672008": "T-02108", "21708004": "M-91803", "21726001": "L-80A07", "21793004": "T-1A200", "21807003": "T-46427", "21814001": "T-32400", "21844003": "T-D6221", "21870002": "A-26920", "21875007": "T-C46A5", "21921002": "L-80116", "21951008": "C-22959", "21964009": "M-95903", "21974007": "T-53000", "22021002": "C-22896", "22024005": "M-83240", "22036004": "M-32390", "22039006": "M-32201", "22049009": "D7-90370", "22083002": "T-46460", "22120004": "T-54280", "22180002": "T-02471", "22270008": "T-28630", "22286001": "T-45200", "22298006": "D3-15000", "22325002": "F-18002", "22356005": "T-12340", "22445006": "T-54720", "22506004": "L-80540", "22687000": "M-80123", "22688005": "T-13100", "22694002": "M-85733", "22697009": "L-80884", "22720009": "L-80416", "22749001": "C-22913", "22765000": "T-43230", "22778000": "P1-38200", "22823000": "T-13310", "22890008": "P1-48840", "22891007": "P5-11000", "22931006": "C-22854", "22943007": "T-D2000", "22945000": "T-AB700", "22968009": "C-22827", "22979004": "C-B1083", "23053002": "C-B0333", "23074001": "T-45240", "23141003": "F-20130", "23153004": "T-58650", "23159000": "L-807D0", "23172004": "C-12500", "23180006": "T-A1280", "23198005": "T-C4624", "23213005": "T-81270", "23215003": "T-117C0", "23226009": "T-54330", "23242002": "F-10336", "23347006": "T-A2710", "23416004": "T-12430", "23427002": "T-54340", "23438002": "T-49660", "23451007": "T-B3000", "23583003": "M-40000", "23629009": "L-80137", "23719005": "P1-67D40", "23730008": "M-80500", "23747009": "T-02155", "23771002": "T-46410", "23788009": "C-180A2", "23826000": "L-80A00", "23995009": "L-80730", "24010005": "DA-73410", "24020000": "G-A142", "24028007": "G-A100", "24062007": "T-14165", "24079001": "D0-10130", "24097009": "T-12600", "24099007": "C-10110", "24111007": "L-80573", "24135002": "P5-B0008", "24136001": "T-15710", "24142002": "T-04100", "24154002": "F-10100", "24162005": "T-87600", "24167004": "C-22886", "24215009": "C-21919", "24299002": "L-80878", "24301009": "C-146A9", "24319000": "L-80530", "24389009": "M-44150", "24422004": "G-A147", "24483006": "T-02113", "24484000": "G-A003", "24511001": "C-B1221", "24516006": "C-22937", "24527008": "T-02642", "24532009": "T-11106", "24573005": "T-54400", "24587005": "P3-41910", "24840008": "L-80550", "24853006": "C-136A2", "24863003": "G-A491", "24865005": "T-42230", "24889003": "T-C4460", "24891006": "C-B0347", "24900003": "C-22956", "24924006": "T-11120", "24967003": "L-80A54", "24977001": "P2-67017", "25062003": "A-26430", "25064002": "F-A2700", "25079009": "C-22843", "25091000": "C-22909", "25097001": "L-80702", "25126001": "G-A477", "25171009": "L-80765", "25173007": "G-F517", "25211005": "S-101A1", "25238003": "T-A8000", "25243005": "L-80831", "25247006": "T-C4130", "25264009": "L-80823", "25322007": "M-32000", "25327001": "L-80320", "25342003": "T-AB300", "25351006": "C-22A06", "25369002": "L-80464", "25419009": "C-12217", "25437005": "F-32052", "25447008": "T-C4362", "25489000": "T-39050", "25510005": "A-04110", "25569003": "D3-31700", "25594002": "G-4042", "25660007": "L-80306", "25683005": "T-C4250", "25748002": "T-54300", "25761002": "F-64210", "25763004": "T-02831", "25813002": "L-80426", "25856007": "L-80539", "25876001": "G-D209", "25910003": "M-80503", "25941002": "C-22824", "25943004": "T-32820", "25990002": "T-72000", "25991003": "T-A6040", "26036001": "M-34000", "26046004": "P2-31102", "26057009": "L-80A53", "26079004": "F-A4600", "26105007": "L-80143", "26140008": "T-51130", "26141007": "F-38278", "26146002": "D4-31010", "26194003": "C-16400", "26216008": "G-A110", "26229008": "L-80846", "26230003": "T-A2830", "26242008": "G-A660", "26283006": "G-A139", "26332008": "L-80809", "26370007": "C-A7000", "26382003": "L-80A16", "26386000": "T-AA079", "26412008": "A-25350", "26444007": "T-12200", "26493002": "T-11218", "26523005": "C-68030", "26525003": "L-80176", "26527006": "F-10349", "26639007": "L-807A3", "26643006": "G-D140", "26699009": "L-80433", "26703007": "T-49630", "26795005": "T-02665", "26805005": "T-49550", "26818002": "T-47240", "26837006": "L-80407", "26893007": "T-D7000", "26947005": "DD-33500", "26973000": "L-80411", "27016007": "C-22813", "27054007": "C-144A3", "27065002": "A-13500", "27081007": "C-172A5", "27088001": "T-A7070", "27090000": "M-81203", "27120008": "C-22890", "27125003": "L-80A18", "27167007": "G-F175", "27175001": "T-46970", "27315000": "P1-48520", "27337007": "D3-31742", "27372005": "P1-C0200", "27385008": "L-80889", "27398004": "T-D4600", "27431007": "D7-90310", "27444002": "L-80720", "27483000": "P5-00100", "27606000": "A-04200", "27612005": "T-A8150", "27615007": "L-807B3", "27637000": "D4-31B16", "27671009": "C-22A04", "27706005": "T-48502", "27789000": "G-7155", "27812008": "A-2C140", "27844007": "C-22872", "27855007": "T-54650", "27872000": "P3-05050", "27885002": "D3-32102", "27887005": "T-02135", "27925004": "M-03010", "27947004": "T-D4200", "27949001": "T-15770", "28035005": "T-54000", "28121005": "C-B0331", "28205006": "T-42520", "28231008": "T-63000", "28243009": "C-136A5", "28273000": "T-60610", "28330007": "T-C4332", "28347008": "T-AB100", "28360002": "L-80215", "28390009": "T-A5250", "28480000": "T-54500", "28483003": "L-80172", "28622002": "C-22814", "28693002": "T-1177B", "28700002": "T-25201", "28726007": "T-AA200", "28744004": "L-80174", "28751008": "L-80744", "28870006": "T-C4780", "28899001": "M-80703", "28926001": "D0-71000", "28960008": "M-52000", "29092000": "T-48000", "29185008": "M-50080", "29218008": "C-B1061", "29223008": "L-80534", "29235007": "L-80653", "29252006": "C-22A08", "29342009": "C-22899", "29348008": "C-B1251", "29353003": "T-02523", "29426003": "DA-26000", "29445007": "T-AA860", "29460005": "C-B1018", "29483008": "M-52101", "29522004": "C-22951", "29534007": "T-AA400", "29565003": "T-B6100", "29660000": "T-46940", "29700009": "T-46110", "29707007": "T-D9800", "29836001": "T-D2500", "29850006": "T-1234A", "29857009": "F-37000", "29870000": "T-F1800", "29881002": "L-80554", "30017007": "F-39800", "30021000": "T-D9400", "30024008": "T-C4512", "30089001": "L-80216", "30114003": "T-A5271", "30123000": "P1-31846", "30156004": "M-82013", "30180000": "T-1A190", "30288003": "D4-31150", "30315005": "T-58000", "30347000": "L-807C7", "30384003": "L-80113", "30399003": "T-A1700", "30448006": "L-80594", "30492008": "C-72000", "30518006": "T-12450", "30565000": "L-80886", "30598005": "T-02481", "30608006": "T-13600", "30618001": "T-54630", "30634003": "L-80659", "30720007": "L-80525", "30730003": "G-A145", "30746006": "DC-72130", "30793004": "T-C4120", "30807003": "G-A249", "30996001": "L-85B00", "31065004": "T-A2400", "31077009": "L-80875", "31094006": "T-28770", "31099001": "G-A572", "31113003": "M-32700", "31145008": "T-45250", "31162003": "T-32330", "31171007": "T-C4863", "31186001": "M-92200", "31192007": "C-B1122", "31260003": "C-22952", "31281003": "L-80764", "31306009": "C-80460", "31329001": "T-D8650", "31351009": "D7-76200", "31377001": "L-80752", "31389004": "T-55200", "31392000": "L-80791", "31428008": "T-A3100", "31435000": "T-88000", "31527000": "C-B1175", "31633003": "L-80465", "31636006": "T-AA050", "31640002": "T-11140", "31653004": "M-74880", "31677005": "T-47440", "31688004": "T-48770", "31701002": "T-A7061", "31714001": "C-22891", "31724009": "P2-36110", "31764008": "T-14171", "31811003": "C-10520", "31842008": "M-02000", "31845005": "D7-90554", "31934006": "T-12281", "31953001": "C-B1183", "31971008": "L-80881", "31982000": "T-54290", "31996006": "D3-80650", "32048006": "M-81400", "32062004": "T-45100", "32114007": "T-48214", "32145006": "L-80342", "32185000": "F-10318", "32297006": "L-80522", "32318003": "F-39780", "32361000": "T-D9310", "32381004": "G-A170", "32400000": "G-A121", "32413006": "P1-31D00", "32457005": "T-D0070", "32505007": "C-106A1", "32591006": "L-807D3", "32622004": "T-59460", "32651000": "M-52210", "32670005": "L-807B4", "32672002": "T-42400", "32683006": "L-80577", "32713005": "T-59100", "32764006": "T-48810", "32836007": "C-B0338", "32849002": "T-56000", "32859001": "T-48910", "32913002": "M-85103", "32938007": "L-80134", "32968003": "M-85303", "33060004": "T-A6080", "33096000": "G-A144", "33212007": "L-80535", "33252009": "C-80135", "33271006": "C-B1091", "33272004": "T-32633", "33367005": "P5-30100", "33401005": "L-807C2", "33458006": "L-80721", "33496007": "P1-48820", "33551003": "L-80511", "33564002": "T-04005", "33586001": "F-103A0", "33593002": "M-52400", "33626005": "T-32310", "33712006": "T-02650", "33723005": "T-A6630", "33770006": "T-C4720", "33785000": "C-B1095", "33795007": "T-46520", "33843005": "G-A128", "33889003": "M-72105", "33930006": "T-A1502", "34026001": "F-10316", "34106002": "F-10348", "34108001": "F-10410", "34127007": "C-173A7", "34128002": "C-22911", "34200004": "L-80457", "34202007": "T-35400", "34206005": "G-D104", "34296003": "F-10380", "34318004": "T-1243A", "34340008": "T-48003", "34360000": "M-88303", "34402009": "T-59600", "34411009": "T-D6500", "34516001": "T-58600", "34536000": "P1-86100", "34595003": "L-80538", "34618005": "L-8B941", "34625003": "T-C4611", "34635009": "T-46960", "34700000": "C-22883", "34707002": "T-60600", "34752004": "L-80865", "34759008": "A-26864", "34763001": "C-10330", "34775006": "T-C4770", "34870009": "L-80891", "34882000": "M-90160", "34926004": "T-02156", "34959001": "T-117AB", "35039007": "T-83000", "35094004": "C-22815", "35202002": "P5-D0050", "35229007": "L-80118", "35259002": "T-13660", "35304003": "D3-90100", "35321007": "C-B1031", "35337001": "C-131A3", "35352008": "C-22A00", "35354009": "L-8A102", "35532006": "T-48600", "35566002": "M-35060", "35601003": "M-97651", "35609001": "C-22842", "35621002": "P5-D3304", "35664009": "T-A2861", "35721009": "T-C4851", "35724001": "C-22942", "35739000": "T-02853", "35757004": "P5-B3121", "35764002": "T-A1600", "35783009": "T-C4480", "35802007": "L-807A0", "35819009": "T-48890", "35860002": "P1-08080", "35884005": "C-B1109", "35900000": "T-02530", "35917007": "M-81403", "35918002": "T-A1820", "35951006": "T-A1500", "35978008": "C-124B4", "36054005": "T-11660", "36060005": "M-91501", "36074003": "L-80A05", "36086000": "T-C4626", "36111002": "L-80591", "36118008": "D2-80300", "36141000": "T-02121", "36152006": "T-51210", "36169008": "T-A2610", "36176003": "F-6ACA0", "36187006": "L-80658", "36251007": "T-C4500", "36274006": "L-80776", "36295001": "L-80300", "36360002": "T-51200", "36371001": "T-42220", "36438004": "L-807D7", "36455000": "T-12540", "36470004": "T-11930", "36492000": "T-54240", "36570001": "L-80562", "36571002": "L-86B02", "36572009": "C-22864", "36582005": "T-A9090", "36611001": "L-80741", "36641004": "C-B1152", "36672000": "T-43112", "36765005": "T-46100", "36855005": "L-88121", "36879007": "C-22919", "36900006": "C-B1105", "36969009": "P1-33530", "36978003": "T-11650", "37024005": "L-80910", "37035000": "T-A2840", "37058002": "M-44140", "37108007": "T-02141", "37116003": "L-80718", "37117007": "T-D7010", "37153009": "P1-32502", "37161004": "G-D160", "37197008": "G-A180", "37225000": "C-149A1", "37274004": "T-46440", "37279009": "M-55160", "37285002": "T-11211", "37414007": "T-1167B", "37453003": "L-80870", "37512009": "T-B1200", "37575004": "C-22822", "37671003": "T-02136", "37706002": "F-32056", "37737002": "G-D144", "37760005": "D3-33140", "37783008": "T-12390", "37871000": "D5-80140", "37899009": "T-A8820", "38000004": "T-C6020", "38048003": "S-101A2", "38082009": "F-D5000", "38101003": "DA-74110", "38184008": "L-80735", "38199008": "T-54010", "38239002": "G-D106", "38242008": "T-90020", "38266002": "T-D0010", "38271009": "C-22964", "38341003": "D3-02000", "38344006": "C-B0344", "38407007": "T-02213", "38424001": "C-B1181", "38449002": "L-80842", "38543004": "C-22914", "38586004": "A-81080", "38707008": "C-22936", "38713004": "M-94003", "38717003": "G-A143", "38754007": "T-1118B", "38848004": "T-58200", "38864007": "T-D2700", "38866009": "T-D0011", "38896004": "T-54790", "38902009": "C-22825", "38934000": "T-AA820", "38991005": "T-46350", "38994002": "T-54520", "39000009": "M-91203", "39021009": "DA-74100", "39057004": "T-35200", "39200002": "C-B1089", "39290007": "C-12200", "39322007": "T-A8110", "39348004": "L-807D8", "39352004": "T-15001", "39477002": "T-59666", "39481002": "T-54160", "39525005": "F-CB962", "39532001": "L-80435", "39539005": "F-70102", "39607008": "T-28000", "39687006": "T-02487", "39723000": "T-15680", "39743006": "T-28230", "39777001": "C-22861", "39790008": "A-2C141", "39844006": "T-54420", "39855006": "L-80350", "39882003": "L-80877", "39937001": "T-01000", "39976000": "T-11620", "40005008": "T-54510", "40020002": "T-28825", "40069000": "T-02132", "40076005": "C-22852", "40121001": "L-80832", "40146001": "T-A2020", "40199007": "F-10340", "40242007": "T-C4623", "40250003": "P1-31917", "40254007": "T-47260", "40265002": "T-11511", "40266001": "G-A640", "40300007": "T-48940", "40342009": "C-6A16B", "40388003": "A-04010", "40400008": "L-80816", "40403005": "P1-31602", "40415009": "G-A118", "40547002": "L-80A31", "40565003": "C-105A1", "40617009": "P2-22902", "40638003": "T-AA180", "40684008": "T-C4632", "40689003": "T-94000", "40701008": "P5-B3000", "40710000": "C-B0327", "40718007": "C-22876", "40727008": "L-80913", "40772000": "M-78260", "40779009": "D2-60302", "40808006": "C-22863", "40867004": "T-B6300", "40898002": "L-80893", "40908007": "T-1171B", "40937006": "C-114A5", "40983000": "T-D8200", "41092008": "L-80418", "41111004": "T-12717", "41145006": "T-C4613", "41216001": "T-92000", "41263004": "L-80812", "41296002": "T-AA500", "41309000": "D5-80400", "41310005": "T-02131", "41313007": "T-14163", "41320000": "L-80713", "41334000": "D3-12002", "41440006": "P5-D9020", "41538003": "L-80722", "41549009": "C-80150", "41550009": "T-02631", "41561001": "L-80561", "41584008": "L-807A2", "41598000": "F-B2700", "41601005": "T-11309", "41695006": "T-D1160", "41699000": "M-36700", "41706005": "L-80340", "41738000": "L-80436", "41750006": "C-22965", "41754002": "L-80429", "41758004": "C-181A3", "41801008": "T-43000", "41842006": "P5-D6500", "41879009": "T-43202", "41919003": "M-85023", "41967008": "C-13700", "41976001": "P1-31600", "42018006": "L-80500", "42024000": "L-30606", "42182000": "M-52470", "42248000": "C-22809", "42250008": "L-80728", "42252000": "L-807B2", "42258001": "T-46510", "42320003": "T-93020", "42343007": "D3-16010", "42385006": "D7-90364", "42399005": "D7-11010", "42417005": "C-B1300", "42425007": "G-A466", "42472007": "T-C4621", "42575006": "T-D1460", "42694008": "T-D8030", "42695009": "T-A4000", "42700002": "M-02100", "42724005": "L-80410", "42728008": "C-B1070", "42798000": "G-A166", "42902003": "L-80734", "42932006": "T-A2760", "42948007": "L-80608", "42973007": "T-D3160", "43045000": "T-AA862", "43067004": "T-02102", "43081002": "T-02300", "43106008": "C-22915", "43116000": "D0-10100", "43119007": "T-45320", "43219001": "L-80A09", "43239002": "C-116A3", "43281008": "T-54780", "43299000": "M-32310", "43500007": "L-80531", "43526002": "M-18000", "43529009": "L-80A13", "43538006": "C-B0312", "43549000": "C-22912", "43622005": "T-54670", "43674008": "G-A122", "43706004": "F-BB370", "43799004": "T-D3200", "43863001": "T-48530", "43899006": "T-47500", "43914001": "F-F7100", "43982006": "D0-40100", "44103008": "D3-31715", "44132006": "M-41610", "44230005": "L-80115", "44241007": "D3-29001", "44324008": "PA-50030", "44488008": "C-22849", "44491008": "P5-06000", "44567001": "T-25000", "44578009": "P1-48304", "44588005": "C-11400", "44598004": "M-88900", "44612009": "T-11221", "44627009": "T-32550", "44696006": "L-80714", "44714003": "T-28600", "44771000": "D7-90435", "44777001": "P1-31920", "44788007": "T-29100", "44808001": "D3-30000", "44812007": "P1-C0030", "44830000": "T-47650", "44835005": "L-80312", "44855006": "L-80A58", "44909008": "T-A9630", "44914007": "T-C4700", "44947003": "T-14020", "44984001": "T-47200", "45001002": "T-11034", "45007003": "D3-04000", "45048000": "T-D1600", "45106005": "C-22851", "45206002": "T-21000", "45211000": "P1-05535", "45215009": "C-15600", "45227007": "D3-23000", "45234009": "T-54690", "45284002": "L-80149", "45289007": "T-61100", "45292006": "T-81000", "45296009": "T-11760", "45316007": "P5-D0040", "45341000": "T-44100", "45460008": "P2-68060", "45475000": "C-22962", "45503006": "D4-31120", "45559001": "M-78266", "45561005": "L-80762", "45591000": "T-02212", "45625009": "L-80880", "45631007": "T-47300", "45635003": "L-80571", "45653009": "T-28820", "45690005": "L-80334", "45790002": "L-80405", "45793000": "T-B2000", "45804006": "F-20030", "45849009": "C-B1220", "45929001": "S-10164", "45981001": "T-02612", "46027005": "T-48920", "46030003": "T-35100", "46053002": "G-A119", "46055009": "T-C4170", "46136006": "P2-31010", "46139004": "C-22802", "46157003": "T-C4592", "46212000": "M-90300", "46239008": "L-807D4", "46353006": "T-52210", "46385009": "T-1228A", "46392004": "L-80332", "46408008": "L-80451", "46602004": "C-10004", "46662001": "P2-4A000", "46713006": "G-D172", "46720004": "M-88500", "46725009": "L-80912", "46750007": "T-28080", "46862004": "T-D2600", "46866001": "DD-13000", "47030008": "C-22974", "47055002": "T-54470", "47075006": "L-80780", "47079000": "P5-B8500", "47109002": "T-C4300", "47192000": "C-B0345", "47224004": "T-02833", "47284001": "M-88211", "47429007": "G-C002", "47432005": "P1-32504", "47471008": "T-C4850", "47486002": "C-22877", "47488001": "M-85040", "47542005": "L-80814", "47588004": "C-132A8", "47625008": "G-D101", "47631006": "M-52450", "47659007": "L-80712", "47699005": "L-80879", "47728000": "T-12423", "47729008": "C-B1150", "47795006": "L-80574", "47842004": "L-80417", "47898004": "C-80490", "47962008": "T-32636", "47975008": "T-53130", "47985009": "T-C4410", "47995002": "C-22932", "48014002": "T-02500", "48193007": "T-C4822", "48338005": "T-59438", "48341001": "C-151B2", "48345005": "T-48610", "48367006": "T-74250", "48387007": "P1-26100", "48394005": "L-80505", "48402004": "T-54380", "48434008": "M-52100", "48470006": "L-80536", "48477009": "T-52000", "48524002": "L-80803", "48526000": "P5-B0111", "48540004": "C-22885", "48544008": "T-D4120", "48603004": "C-A6530", "48694002": "F-0B320", "48697009": "L-80309", "48698004": "C-80160", "48702000": "L-80145", "48724000": "D3-29012", "48895003": "C-145A5", "48918001": "T-C4150", "48988008": "F-BA070", "49076000": "T-15720", "49082002": "T-48435", "49240006": "L-80644", "49330006": "T-54800", "49370004": "G-A104", "49394004": "T-C4420", "49400002": "T-1164B", "49421002": "L-80904", "49430005": "M-88503", "49436004": "D3-31520", "49460000": "T-51120", "49462008": "L-80576", "49530007": "G-A127", "49608001": "G-A402", "49668003": "T-11950", "49687009": "C-22A11", "49727002": "F-24100", "49755003": "M-01000", "49841001": "T-A1740", "49848007": "T-32620", "49852007": "T-49250", "49872002": "L-30000", "49992008": "C-913A4", "49998007": "C-60700", "50016007": "T-11240", "50018008": "T-43100", "50062004": "C-22889", "50125003": "L-80874", "50193000": "T-C4622", "50318003": "C-A1204", "50408007": "T-44400", "50441005": "L-80A59", "50519007": "T-D4110", "50536004": "T-F1810", "50672002": "C-14700", "50697003": "P1-C0010", "50711007": "DE-38100", "50717006": "L-80308", "50755001": "T-13450", "50849002": "P0-10800", "50916005": "M-74220", "50920009": "D3-26000", "50959000": "L-80173", "50960005": "M-37000", "51023000": "L-80459", "51098001": "T-02217", "51114001": "T-41000", "51159009": "T-13630", "51185008": "T-D3000", "51249003": "T-48540", "51282000": "T-11510", "51283005": "T-11160", "51299004": "T-12310", "51345006": "T-B4000", "51398009": "M-75500", "51420009": "C-10940", "51440002": "G-A102", "51549004": "M-88903", "51567006": "C-22874", "51599000": "D2-04460", "51668007": "M-32320", "51678005": "T-54660", "51683002": "P1-A3102", "51692004": "L-80A42", "51698000": "T-12287", "51795009": "F-10240", "51800004": "C-136B6", "51845000": "F-10326", "51852003": "T-F6800", "51937006": "L-80144", "51943008": "T-54700", "52017007": "C-85800", "52019005": "F-10220", "52034004": "T-02870", "52082005": "T-18010", "52101004": "G-A203", "52105008": "L-80900", "52124006": "A-26810", "52253003": "L-80806", "52359001": "T-49340", "52374004": "T-11156", "52408003": "C-B1111", "52432005": "P3-40140", "52433000": "T-43121", "52509009": "T-11220", "52554005": "T-C4841", "52612000": "T-D2300", "52687003": "T-12746", "52731004": "T-D4010", "52745005": "C-129A2", "52836003": "C-21403", "52856002": "M-32360", "52876008": "T-02641", "52943005": "T-A1710", "52946002": "L-80705", "52952001": "L-807C5", "52953006": "T-02854", "52988006": "M-01100", "53031002": "L-80120", "53036007": "T-D8040", "53074004": "T-C4320", "53085002": "T-32500", "53118009": "T-A1720", "53120007": "T-D8000", "53151000": "M-52130", "53228008": "L-80709", "53238003": "T-A8060", "53315004": "C-128A2", "53342003": "T-21300", "53350007": "A-04000", "53360003": "L-80338", "53430007": "F-8A030", "53431006": "L-80523", "53438000": "P5-C0000", "53505006": "T-59900", "53511009": "C-22812", "53520000": "T-A9605", "53549008": "T-45400", "53567001": "L-80458", "53585008": "P5-D5000", "53603007": "T-48500", "53617003": "P2-22010", "53620006": "T-15290", "53654007": "M-88103", "53655008": "T-43210", "53700003": "C-127A3", "53727004": "T-29200", "53733008": "T-11720", "53741008": "D3-13040", "53840002": "T-D9440", "53843000": "T-D6407", "53922000": "L-807C9", "53951001": "C-B1213", "53958007": "P1-0D300", "53967007": "T-14161", "54002007": "M-32340", "54019009": "T-61300", "54066008": "T-55000", "54098002": "L-80415", "54102005": "G-F211", "54165005": "T-A1520", "54221006": "C-22832", "54232006": "L-80660", "54247002": "T-42100", "54268001": "T-C4600", "54300008": "G-D002", "54409005": "T-45308", "54432009": "C-22961", "54440003": "T-02401", "54446009": "F-63750", "54447000": "L-80424", "54468004": "T-02431", "54493002": "M-35063", "54640009": "P5-32130", "54699009": "L-80408", "54735007": "T-11AD0", "54791001": "C-22811", "54858000": "L-80779", "54993008": "F-32110", "55011004": "G-A555", "55024004": "T-11102", "55058007": "L-807C0", "55060009": "T-22200", "55117002": "C-142B2", "55167009": "L-80414", "55199003": "M-75300", "55233005": "T-A2850", "55494003": "C-B1205", "55499008": "T-12714", "55530007": "L-80211", "55584005": "M-35300", "55607006": "F-01000", "55673009": "C-B1088", "55678000": "T-11512", "55745002": "C-80450", "55814006": "C-B1090", "55831004": "C-22888", "55855009": "D3-90000", "55864004": "F-10330", "55921005": "M-97323", "55940004": "T-C5300", "55959002": "L-80763", "56021002": "M-36050", "56052001": "T-A8410", "56084008": "L-80529", "56086005": "L-80437", "56193007": "T-A8070", "56208002": "M-38000", "56243001": "L-80773", "56265001": "D3-10000", "56329008": "T-B1000", "56353002": "A-13600", "56400007": "T-48740", "56401006": "T-11750", "56459004": "T-D9700", "56468002": "M-91220", "56609000": "C-145A4", "56757003": "P1-03154", "56786000": "D3-29051", "56789007": "T-43205", "56849005": "T-49650", "56851009": "G-A437", "56873002": "T-11210", "56917006": "L-80A41", "56953008": "F-60710", "56984005": "L-80781", "57034009": "T-42300", "57054005": "D3-15100", "57120006": "L-80766", "57126000": "C-20005", "57134006": "A-00110", "57141000": "M-84013", "57177007": "G-0002", "57183005": "G-A174", "57190000": "DA-74120", "57195005": "G-A123", "57238002": "P1-30530", "57257006": "G-D003", "57349006": "L-80743", "57383004": "T-32831", "57396003": "T-43120", "57429001": "L-80771", "57485005": "P2-22500", "57597008": "M-74200", "57613003": "L-80593", "57651003": "T-14030", "57671007": "T-96000", "57726007": "T-02218", "57753006": "C-22857", "57754000": "M-32221", "57823005": "T-43125", "57826002": "T-54250", "57849000": "L-80872", "57850000": "T-46400", "57947002": "L-80862", "58095006": "T-32150", "58100008": "G-D102", "58108001": "L-80844", "58116005": "L-80811", "58130000": "T-C4230", "58190003": "F-39200", "58264006": "L-80440", "58281002": "C-17800", "58311005": "L-80604", "58322009": "F-20020", "58341007": "L-80753", "58541008": "C-155A2", "58602004": "T-D2310", "58631000": "C-22839", "58646007": "T-54740", "58718002": "D3-17100", "58742003": "T-12980", "58755002": "C-22954", "58820006": "T-1163B", "58888001": "L-80887", "59011009": "T-45800", "59057006": "C-A7021", "59066005": "T-11133", "59082006": "C-A7430", "59094002": "F-62750", "59112000": "T-02508", "59118001": "D3-33110", "59135002": "G-A328", "59210004": "L-80335", "59214008": "P1-48830", "59218006": "P2-35440", "59282003": "D3-40230", "59351004": "F-61080", "59438005": "T-43110", "59441001": "T-C4000", "59492009": "L-80774", "59503006": "T-C4160", "59528003": "L-80849", "59643008": "L-807B1", "59652004": "T-32100", "59667000": "L-80572", "59749000": "T-45410", "59752008": "T-A7081", "59801003": "C-16700", "59820001": "T-40000", "59844004": "C-135A2", "59972007": "F-32030", "59975009": "L-807A5", "60001007": "F-81890", "60005003": "T-14110", "60028002": "T-49010", "60046008": "D2-80100", "60057003": "C-138A9", "60074003": "F-10120", "60105000": "T-A2781", "60113004": "DA-76000", "60132005": "G-A366", "60176003": "T-45540", "60184004": "T-59470", "60213007": "G-D107", "60227002": "T-C4614", "60234000": "D3-29022", "60252000": "L-80836", "60287000": "P3-40150", "60441008": "C-22853", "60459006": "C-B1124", "60496002": "T-02850", "60517007": "L-80911", "60533005": "C-A7001", "60573004": "D3-29021", "60583000": "G-A120", "60614009": "S-10161", "60621009": "F-01860", "60732002": "D4-31310", "60734001": "T-49530", "60739006": "C-22957", "60797005": "F-32050", "60819002": "T-D1206", "60835009": "T-42350", "60911003": "T-11130", "60920007": "C-22902", "60944009": "T-02501", "60958006": "L-80620", "60965003": "T-C4670", "60996007": "T-C4002", "61005006": "T-A0610", "61026006": "G-F213", "61036003": "L-80533", "61068006": "C-22926", "61083001": "L-80630", "61088005": "C-2A000", "61242005": "T-AA813", "61248009": "T-02811", "61286000": "L-80835", "61320006": "L-80896", "61352006": "T-17860", "61397002": "G-A172", "61405001": "L-80864", "61420007": "PA-00620", "61490001": "D3-12001", "61492009": "T-C4440", "61593002": "P5-B0700", "61671002": "T-11134", "61685007": "T-D9000", "61695000": "T-1A180", "61716009": "C-173A5", "61719002": "T-02107", "61746007": "PA-00500", "61753003": "L-80A51", "61773008": "C-80401", "61853006": "T-1151F", "61868007": "T-54750", "61897005": "T-54320", "61946003": "C-A0900", "61959006": "D4-31400", "61962009": "T-A5100", "61968008": "A-10150", "61973002": "L-80565", "62026008": "D3-33150", "62064005": "M-90503", "62067003": "D4-31A00", "62137007": "L-80845", "62153005": "L-80112", "62189002": "M-52103", "62228004": "L-80888", "62296006": "S-10116", "62372003": "G-A137", "62413002": "T-12420", "62442005": "C-B0316", "62482003": "G-A374", "62487009": "T-11770", "62517004": "C-B1011", "62551000": "T-1193B", "62555009": "T-15317", "62683002": "T-C4360", "62736007": "T-AA830", "62790004": "L-80807", "62818001": "T-B1100", "62824007": "G-A117", "62834003": "T-50110", "62869001": "T-48286", "62872008": "T-A2980", "63029009": "T-02506", "63130001": "M-78280", "63161005": "G-A332", "63264007": "M-89803", "63269002": "L-80761", "63289001": "A-12020", "63360001": "C-168A4", "63390008": "L-80834", "63467002": "D3-33120", "63476009": "P3-67350", "63507001": "T-48930", "63562005": "A-12210", "63634009": "M-94403", "63697000": "P1-36858", "63754004": "C-16200", "63762007": "T-04080", "63929007": "C-22905", "63972001": "L-80A32", "64033007": "T-71000", "64038003": "T-C4370", "64112001": "C-22878", "64131007": "T-48710", "64158000": "L-80208", "64234005": "T-12730", "64318009": "P5-00032", "64468002": "T-46310", "64488003": "C-B1100", "64520006": "C-A6710", "64556009": "T-C4612", "64572001": "DF-00000", "64591001": "L-80323", "64605006": "T-1274B", "64634000": "DA-75300", "64658001": "T-14166", "64688005": "T-11BF0", "64715009": "D3-02500", "64730000": "F-33300", "64739004": "T-93000", "64779008": "DC-60000", "64864005": "T-11710", "64957009": "G-A648", "64991008": "C-22975", "65054007": "C-141A1", "65123005": "F-61620", "65124004": "M-02570", "65187008": "L-80307", "65197004": "T-35310", "65216001": "T-A1000", "65240009": "P1-86E70", "65266007": "T-C4820", "65344003": "L-80150", "65345002": "C-2A400", "65349008": "T-C4620", "65355003": "T-45110", "65388005": "P5-B8310", "65431007": "T-AA260", "65445001": "C-22897", "65492002": "L-80326", "65577000": "A-2C152", "65580004": "C-22953", "65624003": "T-54620", "65656005": "S-10121", "65659003": "P1-30351", "65690001": "T-C4340", "65692009": "M-80323", "65694005": "L-80A55", "65709003": "G-A324", "65730007": "C-22829", "65801008": "P1-03000", "65818007": "A-25500", "65877006": "M-90100", "66019005": "T-D0300", "66071002": "DE-38010", "66130006": "F-32330", "66168008": "L-80425", "66288003": "T-02414", "66303006": "T-54350", "66314009": "L-80147", "66377006": "P5-D0042", "66459002": "G-A103", "66495005": "L-80738", "66559000": "T-46421", "66562002": "C-F3302", "66643007": "T-02450", "66657009": "D3-31710", "66712005": "L-80727", "66720007": "T-A1650", "66739002": "G-D001", "66754008": "T-59200", "66787007": "G-A107", "66794005": "T-11910", "66857006": "F-24210", "66859009": "C-81590", "66911005": "L-80130", "66925006": "C-12700", "66934001": "T-02152", "67046006": "T-AA621", "67088002": "L-80782", "67122001": "P3-50480", "67170007": "T-41100", "67338003": "P1-31612", "67362008": "D3-83300", "67414001": "L-80311", "67440007": "C-80131", "67448000": "L-80133", "67453005": "T-12780", "67459009": "T-1192B", "67507000": "C-80110", "67515002": "L-80310", "67617000": "M-72170", "67629009": "P1-31604", "67684001": "L-80813", "67690002": "C-B1081", "67701001": "T-A6640", "67720004": "L-80575", "67763001": "D3-04001", "67834006": "T-54710", "67937003": "T-47100", "67941004": "T-C4331", "67956008": "C-22928", "67966000": "A-26440", "67977006": "L-80883", "68053000": "T-47700", "68085002": "T-54210", "68086001": "L-80A33", "68171009": "T-C4710", "68183006": "A-12030", "68235000": "F-24442", "68237008": "D4-33622", "68263003": "C-22804", "68276009": "A-27500", "68300000": "T-32210", "68339009": "T-C4144", "68367000": "T-D9100", "68453008": "M-80103", "68457009": "P5-31500", "68459007": "C-22833", "68493006": "G-A169", "68496003": "D5-41170", "68505006": "T-D4140", "68512002": "L-80526", "68523003": "T-A2030", "68552000": "L-80200", "68580003": "C-130A3", "68598004": "T-02142", "68630002": "C-114A6", "68698007": "T-02104", "68703001": "T-AA310", "68705008": "T-49110", "68787002": "T-43111", "68796002": "P5-D1000", "68878000": "T-C4442", "68881005": "T-C4513", "68894007": "PA-10130", "68915008": "T-C4210", "68967007": "C-B1087", "68978004": "F-25040", "69067004": "L-80452", "69076006": "C-B1180", "69089000": "C-130A1", "69105007": "T-45010", "69133007": "C-22862", "69158002": "P2-35200", "69245005": "P1-05035", "69249004": "L-80903", "69255009": "T-C4630", "69327007": "T-46200", "69408002": "D4-01046", "69421009": "T-46423", "69461005": "L-80553", "69474004": "L-80850", "69529009": "L-80724", "69536005": "T-D1100", "69592005": "L-80863", "69602006": "L-80590", "69691007": "T-C4750", "69695003": "T-57000", "69748006": "T-B6000", "69783005": "C-B0324", "69805005": "A-28040", "69833005": "T-47410", "69839009": "C-B1096", "69855002": "L-80A06", "69862006": "L-80775", "69930009": "T-65010", "69954004": "D3-87780", "69986009": "L-80700", "70007007": "T-A5160", "70074004": "T-26100", "70105001": "T-A2880", "70106000": "F-63600", "70142008": "D4-31220", "70150004": "T-60650", "70154008": "C-B1099", "70215001": "T-A2730", "70232002": "G-7154", "70238003": "T-32640", "70253006": "T-48814", "70258002": "T-15750", "70382005": "T-45900", "70431006": "L-80205", "70457009": "L-80428", "70520000": "C-22828", "70544003": "C-146B1", "70559009": "T-02632", "70594002": "M-87303", "70653001": "L-80A11", "70762009": "T-02100", "70791007": "T-47040", "70822001": "F-32070", "70847004": "T-F1300", "70887009": "T-02652", "70925003": "T-11170", "70984001": "M-32260", "70995007": "D3-40300", "71128006": "C-15000", "71133005": "T-62023", "71173004": "M-01460", "71175006": "L-80736", "71232009": "M-90201", "71252005": "T-83200", "71271007": "T-48411", "71341001": "T-12710", "71384000": "A-17450", "71388002": "P0-00000", "71400007": "T-1A120", "71425003": "C-127A1", "71553001": "T-75110", "71585003": "T-48160", "71616004": "T-13001", "71633006": "C-155A1", "71636003": "C-B1082", "71647005": "C-105A2", "71651007": "P5-40010", "71758008": "T-49640", "71759000": "C-81560", "71836000": "T-23000", "71854001": "T-59300", "71908006": "D3-31720", "71923001": "L-80607", "71957009": "C-22922", "71966008": "T-03000", "72001000": "T-12700", "72005009": "T-02432", "72015003": "C-B1084", "72021004": "T-45210", "72092001": "D3-81100", "72107004": "T-48340", "72159005": "C-B1023", "72164009": "F-61A90", "72166006": "M-52300", "72184008": "T-11303", "72329005": "L-80322", "72371006": "C-22879", "72394007": "L-80412", "72410000": "T-D3300", "72454006": "C-163A8", "72481006": "T-28300", "72495009": "M-84803", "72506001": "A-11206", "72542009": "T-32632", "72572003": "C-22826", "72573008": "T-13620", "72592005": "T-59442", "72607000": "G-D108", "72641008": "P1-C0B00", "72648002": "L-80348", "72674008": "T-280D0", "72692000": "T-1175B", "72696002": "T-D9200", "72717003": "C-14800", "72876007": "T-54310", "72939005": "T-02613", "73002000": "P2-36102", "73005003": "L-80578", "73049001": "L-80A44", "73050001": "T-32634", "73056007": "T-04020", "73058008": "T-02520", "73065000": "C-B1041", "73071006": "T-11740", "73117003": "T-11150", "73166001": "T-42580", "73191001": "L-80331", "73212002": "C-B0318", "73219006": "M-88610", "73251007": "C-22A02", "73271003": "L-80A19", "73318001": "L-80820", "73319009": "L-80760", "73400003": "T-11513", "73544002": "P1-32000", "73580002": "T-48430", "73634005": "T-46710", "73648005": "L-80661", "73678001": "S-10151", "73685002": "C-B1231", "73774007": "D3-28102", "73829009": "T-32200", "73892005": "C-22971", "73897004": "T-02120", "73930003": "T-14150", "73931004": "T-48813", "73937000": "T-54680", "73949004": "C-67770", "73958006": "T-02814", "73959003": "T-1165B", "74021003": "D3-33200", "74031005": "T-32832", "74135004": "T-15009", "74156002": "T-47660", "74160004": "T-02424", "74173000": "L-80847", "74203007": "T-C4260", "74262004": "T-51004", "74280008": "M-83153", "74308000": "T-93010", "74344005": "T-54370", "74364000": "M-80413", "74386004": "T-11149", "74401007": "T-1176B", "74517004": "L-80640", "74536009": "L-80716", "74551000": "M-02560", "74554008": "C-B0341", "74568001": "L-80656", "74615001": "D3-31121", "74626007": "C-50013", "74670003": "T-15460", "74745008": "L-80207", "74872008": "T-11110", "74899005": "L-80520", "74921000": "L-80560", "74937006": "M-52102", "74947009": "C-10080", "74968005": "T-A1630", "74970001": "L-80527", "75040000": "T-C4143", "75042008": "T-A1220", "75053002": "D3-81660", "75093004": "T-02480", "75095006": "T-1166B", "75118006": "PA-00600", "75129005": "T-1242B", "75245000": "T-26500", "75294000": "G-A600", "75319007": "T-11219", "75367002": "F-31000", "75397005": "T-42340", "75399008": "F-61070", "75494002": "L-807C6", "75531005": "T-47020", "75540009": "G-A373", "75573002": "T-C5100", "75696008": "C-166A2", "75709004": "L-80650", "75753009": "M-35000", "75772009": "T-12800", "75777003": "F-CB250", "75782005": "T-1195B", "75902001": "T-43124", "75911001": "L-80751", "75956008": "C-22967", "75958009": "G-C020", "75959001": "C-781E0", "75976002": "G-4041", "76001002": "C-22916", "76015000": "T-46420", "76025005": "P1-31876", "76048000": "C-22929", "76072005": "T-02306", "76117006": "T-45430", "76155001": "C-B0328", "76171001": "F-20240", "76197007": "M-72000", "76206002": "T-117CB", "76261009": "T-02420", "76267008": "D3-29050", "76281005": "D5-81210", "76290003": "T-C4633", "76302002": "L-80456", "76351004": "L-80914", "76364003": "L-80521", "76365002": "T-04004", "76388001": "F-38277", "76439002": "C-22859", "76467006": "L-80454", "76497003": "L-80132", "76505004": "T-D8810", "76554006": "L-80717", "76604009": "L-80153", "76605005": "C-22866", "76611008": "P1-30352", "76633005": "C-22875", "76649007": "D7-90382", "76659008": "T-C4475", "76704003": "T-C4842", "76710003": "T-AA650", "76723005": "T-02525", "76724004": "L-807C3", "76752008": "T-04000", "76784001": "T-82000", "76838003": "T-C4220", "76848001": "T-39000", "76862008": "T-43105", "76878005": "T-C4456", "76909002": "M-92603", "76925007": "C-22903", "76927004": "P5-D7000", "76994004": "L-80808", "77004003": "C-111A1", "77012006": "T-F1320", "77073008": "C-22941", "77130001": "T-54430", "77176002": "S-32000", "77213006": "L-80706", "77236002": "L-80611", "77296004": "D7-90452", "77313009": "C-B1223", "77343006": "P5-009A0", "77386006": "F-84000", "77444004": "A-12024", "77477000": "P5-08000", "77568009": "T-D2100", "77583004": "T-35410", "77621008": "T-D1620", "77671006": "F-B1810", "77720000": "A-12062", "77778009": "T-C4474", "77831004": "T-04002", "78014005": "T-70060", "78023008": "C-158A5", "78067005": "T-F1100", "78076003": "T-AA700", "78197004": "M-85012", "78214003": "L-807D6", "78246003": "L-80804", "78267003": "D9-30400", "78277001": "T-A2500", "78421000": "G-D103", "78480002": "T-44200", "78481003": "C-B1108", "78541007": "L-80171", "78570003": "C-B1067", "78678003": "L-8B100", "78686003": "C-B1017", "78869007": "C-22955", "78904004": "T-D3050", "78961009": "T-C3000", "78972004": "T-11515", "78994007": "L-80602", "79058000": "L-80100", "79068005": "A-30360", "79142001": "T-44010", "79163004": "T-B6200", "79197006": "C-159A2", "79283007": "T-02143", "79295007": "L-80726", "79313003": "T-02202", "79361005": "T-15200", "79458005": "G-A599", "79477007": "C-131A1", "79502000": "T-02211", "79523006": "C-113A2", "79601000": "T-12280", "79603002": "L-80343", "79610008": "C-B1216", "79619009": "D3-29011", "79652003": "T-AA770", "79654002": "M-36300", "79692001": "F-32340", "79741001": "T-64500", "79811009": "A-18041", "79814001": "L-80655", "79926007": "T-C4650", "79951008": "T-02109", "80049006": "T-A2750", "80064006": "T-1191B", "80084005": "L-80612", "80131009": "L-80600", "80140008": "T-54480", "80144004": "T-12770", "80243003": "T-AA810", "80248007": "T-04030", "80272002": "T-45160", "80274001": "F-70210", "80305003": "C-22856", "80313002": "F-37150", "80434005": "T-A2870", "80447000": "T-A1800", "80515008": "D5-81220", "80576000": "L-80892", "80581009": "T-D4001", "80621003": "T-A1900", "80622005": "T-A8130", "80647007": "T-54260", "80751004": "C-172A8", "80769008": "T-C4860", "80777007": "L-80413", "80835003": "L-80170", "80865008": "P5-40030", "80867000": "T-C4631", "80891009": "T-32000", "80917008": "C-00224", "80919006": "A-61000", "80943009": "F-01500", "80979001": "L-80657", "81016008": "T-AA630", "81040000": "T-44000", "81105003": "T-C4200", "81128002": "T-42200", "81132008": "T-C4290", "81267004": "L-80154", "81274009": "M-73310", "81323004": "F-00001", "81397005": "C-22A01", "81502006": "T-55300", "81529001": "L-80723", "81607005": "L-807D2", "81621007": "C-B1066", "81654009": "G-A138", "81669005": "M-95401", "81727001": "T-13300", "81745001": "T-AA000", "81761004": "C-B1203", "81827009": "M-02550", "81839001": "C-A6500", "81866001": "L-80A21", "81911001": "C-F3310", "81992007": "T-02545", "82078001": "PA-20110", "82206008": "L-80885", "82264009": "C-677C0", "82280004": "G-A545", "82334004": "G-A385", "82365008": "T-C4350", "82440005": "L-80327", "82449006": "A-26836", "82471001": "T-32300", "82474009": "T-12771", "82561000": "T-15690", "82566005": "C-F5000", "82573000": "C-80400", "82628004": "T-54460", "82676003": "L-88120", "82680008": "T-D0310", "82682000": "C-22895", "82687006": "T-11790", "82711006": "M-85003", "82799009": "F-32100", "82849001": "T-D4900", "82909008": "L-80622", "82965004": "T-1174B", "83018002": "T-47690", "83036002": "F-61760", "83059008": "A-26400", "83173002": "L-80160", "83216009": "L-80733", "83236005": "L-80895", "83251001": "T-A2200", "83323007": "F-12100", "83330001": "D4-32012", "83380007": "T-C4458", "83419000": "T-49410", "83420006": "S-10181", "83422003": "P1-30022", "83423008": "C-B0342", "83504004": "L-80793", "83555006": "T-C6010", "83578000": "G-B102", "83598005": "C-17200", "83600004": "C-22920", "83670000": "T-D4425", "83799000": "D4-31040", "83881004": "C-12013", "83996001": "L-80119", "84020006": "T-1194B", "84081007": "L-80537", "84114007": "D3-16000", "84217005": "C-22845", "84219008": "T-C4610", "84229001": "F-01360", "84232003": "L-80592", "84301002": "T-AB200", "84315000": "L-80532", "84360004": "M-02120", "84365009": "T-02153", "84367001": "L-80871", "84386009": "C-6A16E", "84421000": "T-487A0", "84507004": "T-02821", "84514002": "L-80708", "84528008": "L-80603", "84548001": "L-807D5", "84607009": "T-02841", "84640000": "T-E0100", "84654008": "T-32833", "84656005": "C-22A03", "84660008": "L-807D1", "84712000": "T-32156", "84757009": "DA-30000", "84782009": "T-A0500", "84797007": "L-80A43", "84812008": "C-A6540", "84839000": "L-80135", "84847000": "C-15300", "84923006": "L-80105", "85050009": "T-12410", "85066006": "C-22873", "85119005": "T-D7020", "85144002": "L-80719", "85190005": "C-22848", "85234005": "T-45700", "85235006": "T-46120", "85272000": "C-80430", "85284003": "D3-12003", "85293002": "T-1A007", "85315007": "L-80662", "85380009": "T-C4843", "85383006": "T-46640", "85431000": "M-32350", "85439003": "T-48400", "85562004": "T-D8700", "85596006": "C-22A05", "85598007": "D3-91030", "85606007": "P5-D3300", "85637007": "T-A3700", "85659009": "M-32200", "85693008": "C-B1200", "85710004": "T-12350", "85726003": "M-32240", "85756007": "T-D0050", "85803001": "T-01530", "85816001": "T-51600", "85856004": "T-15420", "85898001": "D3-20000", "85981002": "C-22838", "86049000": "M-80003", "86117002": "T-45300", "86122002": "A-32110", "86136007": "T-A5272", "86273004": "P1-03100", "86290005": "F-21000", "86299006": "D4-31110", "86308005": "C-68000", "86367003": "T-D4130", "86407004": "A-17350", "86409001": "T-02219", "86440008": "L-80652", "86521004": "C-113A3", "86541009": "C-22869", "86547008": "T-47740", "86570000": "T-46500", "86584005": "C-B0323", "86593006": "L-80732", "86598002": "T-280A0", "86616005": "M-85002", "86694007": "L-80582", "86719006": "T-02114", "86750008": "C-22823", "86767001": "L-80822", "86920006": "L-80321", "86969008": "T-80010", "87017008": "G-A351", "87029004": "L-80810", "87061000": "L-80528", "87068006": "F-10390", "87111007": "L-80737", "87166008": "T-21342", "87219003": "L-80897", "87342007": "T-12750", "87343002": "D3-12400", "87386002": "D7-90560", "87391001": "T-11670", "87410002": "C-B1225", "87437000": "C-116A2", "87445005": "C-B0335", "87463005": "T-A2970", "87483006": "T-40200", "87563008": "T-A0102", "87612001": "T-C2000", "87644002": "T-95000", "87687004": "G-A151", "87704003": "T-54360", "87706001": "T-02512", "87708000": "F-BB000", "87731000": "F-12300", "87737001": "M-84903", "87759004": "T-80020", "87784001": "T-1A000", "87853006": "C-B1210", "87878005": "T-32600", "87913009": "M-90203", "87953007": "T-73000", "87958003": "C-B1121", "87962009": "L-80337", "87982008": "G-D221", "88014003": "C-12300", "88089004": "T-02150", "88166005": "C-B1016", "88176008": "T-54170", "88195001": "M-95813", "88210001": "T-32810", "88241000": "F-10216", "88340001": "T-14040", "88376000": "C-29000", "88442005": "T-A2700", "88446008": "G-A405", "88454005": "T-14167", "88473009": "C-B1171", "88480006": "C-13500", "88488004": "C-13200", "88556005": "T-45510", "88593004": "T-42310", "88619007": "F-39790", "88625006": "C-22904", "88660000": "C-22867", "88779009": "L-807A4", "88807001": "L-80157", "88824007": "T-54610", "88882009": "T-A8640", "88921000": "T-1A080", "88986008": "T-D1120", "89028002": "C-22966", "89065000": "L-80A12", "89084002": "M-95400", "89093001": "T-42210", "89138009": "D3-00200", "89139001": "C-22887", "89148006": "C-22882", "89149003": "A-17310", "89164003": "D7-90530", "89177007": "C-10005", "89187006": "T-20001", "89202009": "T-A2820", "89272005": "C-144A4", "89278009": "T-A3400", "89323001": "D3-12004", "89340005": "T-11514", "89450005": "L-80790", "89457008": "C-10072", "89545001": "T-D1200", "89546000": "T-11100", "89552004": "T-54760", "89577003": "C-22855", "89595000": "C-B0319", "89625000": "T-54390", "89648005": "L-80421", "89665001": "L-80349", "89708009": "L-80210", "89736004": "D3-28005", "89740008": "M-85203", "89784008": "T-02666", "89814007": "P1-31850", "89818005": "C-B1224", "89837001": "T-74000", "89856006": "C-22868", "89858007": "T-C4330", "89890002": "T-C6000", "89928000": "L-80570", "90024005": "T-46740", "90050009": "L-80406", "90069004": "G-A182", "90096001": "F-32120", "90101001": "L-807B0", "90219004": "T-48410", "90290004": "T-D4230", "90315007": "T-35250", "90318009": "T-35210", "90418005": "T-90010", "90444005": "L-80901", "90470006": "P1-78320", "90539001": "D3-10510", "90561006": "T-35120", "90572001": "T-28830", "90588001": "T-13650", "90606007": "T-C4001", "90612002": "L-80158", "90617008": "C-B1068", "90733003": "C-B0348", "90734009": "G-A270", "90745007": "C-B0315", "90771006": "T-48840", "90828009": "D3-22100", "90885005": "L-8057A", "90892000": "F-32010", "91079009": "T-46820", "91083009": "T-43201", "91085002": "T-32834", "91096005": "P2-34122", "91134007": "T-35300", "91207004": "T-AB600", "91238003": "T-1243B", "91295002": "C-22881", "91302008": "DE-00020", "91394001": "T-C4580", "91397008": "T-11196", "91429002": "L-80860", "91470000": "T-D8104", "91539005": "T-48501", "91553005": "L-80792", "91602002": "P1-28160", "91606004": "C-22973", "91609006": "T-11180", "91691001": "T-D3136", "91707000": "T-F7040", "91716001": "T-AB500", "91720002": "T-D0080", "91723000": "T-D0005", "91732003": "T-461A0", "91747007": "T-40230", "91748002": "T-43115", "91750005": "T-43117", "91751009": "T-43118", "91752002": "T-43119", "91753007": "T-43127", "91754001": "T-43128", "91755000": "T-43129", "91756004": "T-4312A", "91757008": "T-4312B", "91758003": "T-4312C", "91759006": "T-4312D", "91760001": "T-4312E", "91761002": "T-43213", "91762009": "T-43214", "91763004": "T-43215", "91772007": "T-D0062", "91806002": "T-D00A3", "91830000": "T-D00AB", "92248004": "D7-F0810", "92652009": "D7-F0902", "93143009": "DC-F4113", "93473009": "D3-F0620", "93880001": "D2-F1103", "94150003": "D4-31154", "94222008": "D1-F0106", "94391008": "D2-F1106", "95217000": "DA-73460", "95315005": "D7-F1000", "95324001": "D0-00050", "95376002": "D0-B0300", "95377006": "D0-B0310", "95378001": "D0-B0311", "95379009": "D0-B0312", "95380007": "D0-B0314", "95381006": "D0-B0320", "95382004": "D0-B0324", "95383009": "D0-B0326", "95384003": "D0-B0330", "95385002": "D0-B0334", "95386001": "D0-B0338", "95387005": "D0-B0339", "95388000": "D0-B0340", "95389008": "D0-B0342", "95390004": "D0-B0346", "95391000": "D0-B0350", "95392007": "D0-B0352", "95393002": "D0-B0354", "95394008": "D0-B0356", "95395009": "D0-B0360", "95396005": "D0-B0364", "95397001": "D0-B0370", "95398006": "D0-B0380", "95399003": "D0-B0382", "95400005": "D0-B0390", "95401009": "D0-B0394", "95402002": "D0-B03A0", "95403007": "D0-B03A2", "95404001": "D0-B03A4", "96218000": "C-62960", "96227004": "C-64090", "96229001": "C-640A0", "96230006": "C-640B0", "96265006": "C-6A190", "96302009": "C-80800", "96308008": "C-81300", "96328007": "C-97301", "96388005": "C-B0302", "96390006": "C-B1218", "102292000": "T-14668", "102298001": "T-35020", "102304005": "A-10141", "102312002": "A-25600", "102313007": "A-25610", "102314001": "A-25612", "102315000": "A-25614", "102316004": "A-25616", "102317008": "A-26802", "102319006": "A-26912", "102320000": "A-27322", "102321001": "A-2B210", "102322008": "A-2C600", "102323003": "A-2C602", "102324009": "A-2C604", "102325005": "A-2C606", "102378009": "A-32475", "102459008": "F-00453", "102460003": "F-00454", "102535000": "F-10317", "102536004": "F-10319", "102538003": "F-10450", "102539006": "F-10460", "102540008": "F-10470", "102541007": "F-10480", "102589003": "F-37012", "102594003": "F-38002", "102874004": "F-84094", "102877006": "F-84430", "103321005": "G-0202", "103335007": "G-7290", "103339001": "G-A185", "103340004": "G-A186", "103341000": "G-A187", "103342007": "G-A188", "103343002": "G-A189", "103344008": "G-A1A1", "103345009": "G-A1A2", "103346005": "G-A1A3", "103347001": "G-A1A4", "103348006": "G-A1A5", "103349003": "G-A1A6", "103353001": "G-A1B2", "103354007": "G-A1B3", "103355008": "G-A220", "103361006": "G-A556", "103381007": "G-D027", "103382000": "G-D032", "103383005": "G-D033", "103386002": "G-D052", "103387006": "G-D054", "103390000": "G-D210", "103391001": "G-D216", "103693007": "P0-00002", "103709008": "P1-00018", "103712006": "P1-05536", "103713001": "P1-05537", "103714007": "P1-05538", "103715008": "P1-05539", "103716009": "P1-05550", "104157003": "P3-40160", "104210008": "P3-50495", "105371005": "P5-0A100", "105372003": "P5-39015", "105373008": "P5-39191", "105376000": "P5-B3002", "105501005": "S-20570", "105590001": "F-61002", "105830007": "C-120F9", "106233006": "G-A1F8", "106292003": "J-07100", "107007004": "L-8B9F9", "107644003": "M-020F9", "107671003": "M-520F8", "108290001": "P5-C00F8", "108294005": "P5-D30F8", "108300008": "P5-D90F8", "108369006": "M-8FFFF", "108371006": "T-12761", "108502004": "C-80349", "108880002": "C-22AA1", "108899006": "C-B7100", "109029006": "C-A0005", "109066000": "C-A0173", "109212003": "C-B0314", "109216000": "C-B0321", "109218004": "C-B0322", "109219007": "C-B0329", "109222009": "C-B0332", "109888004": "D7-F0A02", "110265006": "DD-66A67", "110421000": "M-32210", "110451006": "M-78190", "110467000": "P1-00410", "110488009": "T-02148", "110517009": "T-11011", "110535000": "T-12403", "110536004": "T-12701", "110550009": "T-28910", "110568007": "T-48820", "110612005": "T-59490", "110621006": "T-65600", "110639002": "T-88920", "110726009": "T-DD006", "110837003": "T-DD123", "110861005": "T-DD163", "111017005": "M-78066", "111045004": "A-17200", "111084009": "C-158A3", "111095003": "C-21402", "111101002": "C-22803", "111102009": "C-22917", "111132001": "C-6A118", "111139005": "C-80120", "111158001": "C-B0337", "111159009": "C-B1085", "111160004": "C-B1086", "111161000": "C-B1151", "111162007": "C-B1211", "111287006": "D3-29042", "111289009": "D3-40208", "111973004": "F-32020", "112233002": "G-A428", "112381006": "L-35500", "112485003": "L-80136", "112486002": "L-80336", "112487006": "L-80344", "112488001": "L-80423", "112489009": "L-80510", "112490000": "L-80566", "112491001": "L-80710", "112492008": "L-80725", "112493003": "L-80772", "112494009": "L-807B5", "112674009": "M-78000", "112811009": "P1-31872", "112987001": "P1-C0020", "113011001": "P2-01510", "113160008": "S-10191", "113163005": "S-11090", "113179006": "T-02140", "113182001": "T-02452", "113197003": "T-11300", "113198008": "T-11304", "113205007": "T-11630", "113209001": "T-1179B", "113257007": "T-30000", "113259005": "T-35110", "113262008": "T-42070", "113263003": "T-45120", "113264009": "T-45230", "113269004": "T-46910", "113270003": "T-47420", "113273001": "T-48520", "113277000": "T-51300", "113278005": "T-54440", "113305005": "T-A6000", "113336002": "T-C4511", "113340006": "T-C4840", "113342003": "T-D0048", "113343008": "T-D0060", "113345001": "T-D4000", "113346000": "T-D4450", "113351006": "T-D9540", "115391007": "F-65C50", "116010006": "T-15728", "116152004": "P5-08001", "116176007": "T-C2007", "116224001": "DD-60002", "116532005": "C-84989", "116566001": "C-10098", "116593003": "C-37128", "116602009": "C-37138", "116676008": "G-C504", "116682006": "G-C50A", "117133000": "T-D3141", "117134006": "T-D3142", "117135007": "T-D3143", "117136008": "T-D3144", "117137004": "T-D3145", "117138009": "T-D3146", "117139001": "T-D3147", "117140004": "T-D3148", "117141000": "T-D3149", "117142007": "T-D314A", "117143002": "T-D314B", "117259009": "P3-40155", "117362005": "G-D301", "117590005": "T-AB001", "117610000": "P2-34201", "118242002": "F-01072", "118243007": "F-01073", "117617002": "P3-44150", "118375008": "A-04140", "118378005": "A-11101", "118433006": "F-31146", "118438002": "G-D00B", "118470002": "P1-1081B", "118495001": "T-1241F", "118538004": "G-D701", "118565006": "G-D705", "118578006": "G-D709", "118586006": "G-D750", "118634008": "T-46002", "118645006": "T-12375", "118745001": "P0-05083", "118755002": "T-32423", "118927008": "D3-80515", "119238007": "T-D0558", "119255006": "T-24454", "119281005": "T-B6070", "119295008": "G-8003", "119376003": "G-8300", "119406000": "T-D0593", "119410002": "T-D0598", "119524001": "T-1240F", "119568004": "T-45005", "119614000": "P1-14810", "119853006": "P1-48501", "120234003": "T-46659", "120576005": "T-D0634", "122448007": "T-1300D", "122456005": "A-23000", "122459003": "P1-01003", "122489005": "T-70001", "122494005": "T-11501", "122495006": "T-11502", "122496007": "T-11503", "122595009": "G-8311", "122737001": "G-8318", "122738006": "G-8319", "122739003": "G-831B", "122774002": "T-49403", "122775001": "T-49103", "122972007": "T-48581", "123037004": "T-D000A", "123851003": "T-D0662", "125074003": "L-80139", "125076001": "L-87A02", "125084002": "L-8A10B", "125091004": "L-8B943", "125097000": "L-8C306", "125099002": "L-8C336", "125101009": "L-8C338", "125112009": "M-00101", "125271003": "M-32202", "125272005": "M-32203", "125273000": "M-32204", "125274006": "M-32208", "125357009": "M-52301", "125358004": "M-52302", "125682004": "T-15516", "125701003": "C-B1184", "125707004": "C-6A161", "126065006": "A-26434", "126510002": "D0-F035F", "126838000": "D5-F131F", "127189005": "DC-721C4", "127457009": "G-8310", "127489000": "G-C52F", "127790008": "P3-00003", "127919002": "T-C4311", "127920008": "T-C4312", "127921007": "T-C4313", "127922000": "T-C4314", "127925003": "T-C43A0", "127926002": "T-C43A1", "127927006": "T-C43A2", "127930004": "T-C43A5", "127931000": "T-C43A6", "127932007": "T-C43A7", "127937001": "T-C43AC", "127938006": "T-C43AD", "127939003": "T-C43AE", "127940001": "T-C43B2", "127941002": "T-C43B3", "127954009": "T-D0684", "128241005": "D5-81002", "128252004": "T-02527", "128253009": "T-02528", "128319008": "T-A0190", "128320002": "T-A0191", "128432002": "G-DB10", "128433007": "G-DB11", "128434001": "G-DB12", "128435000": "G-DB13", "128436004": "G-DB14", "128437008": "G-DB15", "128438003": "G-DB16", "128439006": "G-DB17", "128440008": "G-DB18", "128441007": "G-DB19", "128442000": "G-DB20", "128443005": "G-DB21", "128444004": "G-DB22", "128445003": "G-DB23", "128446002": "G-DB24", "128447006": "G-DB25", "128448001": "G-DB26", "128449009": "G-DB27", "128450009": "G-DB28", "128451008": "G-DB29", "128452001": "G-DB30", "128453006": "G-DB31", "128454000": "G-DB32", "128455004": "G-DB33", "128462008": "DF-00436", "128538000": "P1-03021", "128548003": "T-49424", "128549006": "T-49426", "128551005": "D3-81922", "128552003": "G-DB34", "128553008": "T-49215", "128554002": "T-49429", "128555001": "D4-32504", "128556000": "D4-32506", "128557009": "D4-32509", "128558004": "D4-32510", "128559007": "T-47490", "128560002": "T-4942A", "128563000": "D4-31052", "128564006": "T-32602", "128565007": "T-32502", "128566008": "D4-33512", "128567004": "D4-33514", "128568009": "D4-33516", "128569001": "T-49535", "128573003": "PA-50031", "128575005": "PA-50033", "128576006": "PA-50034", "128577002": "PA-50035", "128578007": "PA-50036", "128579004": "PA-50037", "128580001": "PA-50038", "128581002": "PA-50039", "128582009": "PA-5003A", "128583004": "T-4884A", "128584005": "D4-33142", "128585006": "T-48503", "128586007": "T-32190", "128587003": "T-D930A", "128589000": "T-44007", "128591008": "G-DE02", "128592001": "G-DE04", "128593006": "G-DE06", "128594000": "G-DE08", "128595004": "T-32202", "128617001": "M-39390", "128632008": "M-80463", "128651002": "M-82040", "128696009": "M-85072", "128736003": "M-88150", "128738002": "M-88250", "128765009": "M-89830", "128947001": "G-D870", "128948006": "G-D872", "128949003": "G-D871", "128950003": "G-D873", "128951004": "G-D874", "128952006": "P1-3160A", "128953001": "P1-3160B", "128954007": "G-7292", "128955008": "G-7293", "128956009": "G-7294", "128957000": "G-7295", "128958005": "G-7296", "128959002": "G-7297", "128960007": "G-7298", "128961006": "G-7299", "128963009": "P2-71302", "128964003": "P2-71304", "128965002": "P2-71306", "128966001": "P2-71308", "128967005": "P2-71310", "128968000": "P2-71312", "128969008": "P2-71314", "128970009": "P2-71316", "128971008": "P2-71318", "128974000": "F-01602", "128975004": "F-01604", "128976003": "F-01606", "128977007": "F-01608", "128979005": "T-45416", "128981007": "A-00203", "129082007": "G-729A", "129083002": "G-729B", "129085009": "G-72BB", "129086005": "G-729C", "129087001": "G-729D", "129088006": "G-729E", "129089003": "G-729F", "129090007": "G-7304", "129091006": "G-7305", "129092004": "G-7406", "129093009": "G-7408", "129095002": "P2-7131A", "129096001": "P2-7131B", "129097005": "P2-7131C", "129098000": "P2-7131D", "129099008": "P2-7131E", "129100000": "P2-7131F", "129101001": "P2-713A0", "129102008": "P2-713A1", "129113006": "A-28051", "129226004": "G-D065", "129379006": "P0-02125", "129380009": "P0-02126", "129411004": "P0-02160", "129428001": "P0-02179", "129460009": "A-10042", "129463006": "A-1016B", "129467007": "A-16016", "129499001": "C-B1033", "129501009": "C-B1032", "129502002": "C-B1036", "129503007": "C-B1037", "129504001": "C-B1038", "129505000": "C-B1039", "129506004": "C-B103A", "129507008": "C-B103B", "129508003": "C-B103C", "129509006": "C-B103D", "129510001": "C-B103E", "129511002": "C-B103F", "129512009": "C-B1042", "129513004": "C-B1043", "129514005": "C-B1044", "129515006": "C-B1045", "129715009": "F-01710", "129716005": "F-01711", "129717001": "F-01712", "129718006": "F-01713", "129719003": "F-01714", "129720009": "F-01720", "129721008": "F-01721", "129722001": "F-01722", "129723006": "F-01723", "129726003": "F-01726", "129727007": "F-01727", "129728002": "F-01728", "129729005": "F-01729", "129730000": "F-0172A", "129731001": "F-0172B", "129734009": "F-01732", "129737002": "F-01740", "129738007": "F-01741", "129739004": "F-01742", "129740002": "F-01743", "129741003": "F-01744", "129742005": "F-01745", "129744006": "F-01751", "129745007": "F-01752", "129746008": "F-01753", "129747004": "F-01754", "129748009": "F-01760", "129749001": "F-01761", "129750001": "F-01762", "129751002": "F-01763", "129752009": "F-01764", "129753004": "F-01765", "129754005": "F-01766", "129755006": "F-01767", "129756007": "F-01768", "129757003": "F-01769", "129758008": "F-0176A", "129759000": "F-0176B", "129760005": "F-0176C", "129761009": "F-0176D", "129762002": "F-0176E", "129763007": "F-0176F", "129764001": "F-01770", "129765000": "F-01771", "129766004": "F-01772", "129767008": "F-01773", "129768003": "F-01774", "129769006": "F-01775", "129770007": "F-01776", "129772004": "F-01781", "129773009": "F-01782", "129774003": "F-01783", "129775002": "F-01784", "129776001": "F-01785", "129777005": "F-01786", "129778000": "F-01787", "129779008": "F-01788", "129780006": "F-01789", "129781005": "F-0178A", "129782003": "F-0178B", "129783008": "F-0178C", "129784002": "F-0178D", "129785001": "F-0178E", "129786000": "F-0178F", "129788004": "F-01791", "129789007": "F-01792", "129790003": "F-01793", "129791004": "F-01794", "129792006": "F-01795", "129793001": "F-01796", "129794007": "F-01797", "129795008": "F-01798", "129796009": "F-01799", "129797000": "F-0179A", "129806009": "F-017B1", "129807000": "F-017B2", "129808005": "F-017B3", "129809002": "F-017B4", "129810007": "F-017B5", "129811006": "F-017B6", "129812004": "F-017B7", "129813009": "F-017B8", "130963002": "F-8A063", "131183008": "G-A15A", "131184002": "G-A16A", "131185001": "G-A18A", "131186000": "G-A18B", "131187009": "G-A193", "131188004": "G-A194", "131189007": "G-A195", "131190003": "G-A196", "131191004": "G-A197", "131192006": "G-A198", "131197000": "G-D785", "131426006": "L-80121", "131427002": "L-80122", "131428007": "L-80123", "131429004": "L-80124", "131430009": "L-80125", "131431008": "L-80126", "131432001": "L-80127", "131433006": "L-80128", "131434000": "L-80129", "131435004": "L-8012A", "131436003": "L-8012B", "131437007": "L-8012C", "131438002": "L-8012E", "131439005": "L-8012F", "131440007": "L-80138", "131441006": "L-8013A", "131442004": "L-8013B", "131443009": "L-8013C", "131444003": "L-8013D", "131445002": "L-8013E", "131446001": "L-8013F", "131447005": "L-8014C", "131448000": "L-8014D", "131449008": "L-8014E", "131450008": "L-8014F", "131451007": "L-8015A", "131452000": "L-8015B", "131453005": "L-8015C", "131454004": "L-8015D", "131455003": "L-8015E", "131456002": "L-8015F", "131457006": "L-80161", "131458001": "L-80162", "131459009": "L-80163", "131460004": "L-80164", "131461000": "L-80165", "131462007": "L-80166", "131463002": "L-80167", "131464008": "L-80168", "131465009": "L-80169", "131466005": "L-8016A", "131467001": "L-8016B", "131468006": "L-8016C", "131469003": "L-8016D", "131470002": "L-8016E", "131471003": "L-8016F", "131472005": "L-80177", "131473000": "L-80178", "131474006": "L-80179", "131475007": "L-8017A", "131476008": "L-8017B", "131477004": "L-8017C", "131478009": "L-8017D", "131479001": "L-8017E", "131480003": "L-8017F", "131481004": "L-80180", "131482006": "L-80181", "131483001": "L-80182", "131484007": "L-80183", "131485008": "L-80184", "131486009": "L-80185", "131487000": "L-80186", "131488005": "L-80187", "131489002": "L-80188", "131490006": "L-80189", "131491005": "L-8018A", "131492003": "L-8018B", "131493008": "L-8018C", "131494002": "L-8018D", "131495001": "L-8018E", "131496000": "L-8018F", "131497009": "L-80190", "131498004": "L-80191", "131499007": "L-80192", "131500003": "L-80193", "131501004": "L-80194", "131502006": "L-80195", "131503001": "L-80196", "131504007": "L-80197", "131505008": "L-80198", "131506009": "L-80199", "131507000": "L-8019A", "131508005": "L-8019B", "131509002": "L-8019C", "131510007": "L-8019D", "131511006": "L-8019E", "131512004": "L-8019F", "131513009": "L-801A0", "131514003": "L-801A1", "131515002": "L-801A2", "131516001": "L-801A3", "131517005": "L-801A4", "131518000": "L-801A5", "131519008": "L-801A6", "131520002": "L-801A7", "131521003": "L-801A8", "131522005": "L-801A9", "131523000": "L-801AA", "131524006": "L-801AB", "131525007": "L-801AC", "131526008": "L-801AD", "131527004": "L-801AE", "131528009": "L-801AF", "131529001": "L-801B0", "131530006": "L-801B1", "131531005": "L-801B2", "131532003": "L-801B3", "131533008": "L-801B4", "131534002": "L-801B5", "131535001": "L-801B6", "131536000": "L-801B7", "131537009": "L-801B8", "131538004": "L-801B9", "131539007": "L-801BA", "131540009": "L-801BB", "131541008": "L-801BC", "131542001": "L-801BD", "131543006": "L-801BE", "131544000": "L-801BF", "131545004": "L-801C0", "131546003": "L-801C1", "131547007": "L-801C2", "131548002": "L-801C3", "131549005": "L-801C4", "131550005": "L-801C5", "131551009": "L-801C6", "131552002": "L-801C7", "131553007": "L-801C8", "131554001": "L-801C9", "131555000": "L-801CA", "131556004": "L-801CB", "131557008": "L-801CC", "131558003": "L-801CD", "131559006": "L-801CE", "131560001": "L-801CF", "131561002": "L-801D0", "131562009": "L-801D1", "131563004": "L-801D2", "131564005": "L-801D3", "131565006": "L-801D4", "131566007": "L-801D5", "131567003": "L-801D6", "131568008": "L-801D7", "131569000": "L-801D8", "131570004": "L-801D9", "131571000": "L-801DA", "131572007": "L-801DB", "131573002": "L-801DC", "131574008": "L-801DD", "131575009": "L-801DE", "131576005": "L-801DF", "131577001": "L-801E0", "131578006": "L-801E1", "131579003": "L-801E2", "131580000": "L-801E3", "131581001": "L-801E4", "131582008": "L-801E5", "131583003": "L-801E6", "131584009": "L-801E7", "131585005": "L-801EA", "131586006": "L-801EB", "131587002": "L-801EC", "131588007": "L-801ED", "131589004": "L-801EE", "131590008": "L-801EF", "131591007": "L-801F0", "131592000": "L-801F1", "131593005": "L-801F2", "131594004": "L-801F3", "131595003": "L-801F4", "131596002": "L-801F5", "131597006": "L-801F6", "131598001": "L-801F7", "131599009": "L-801F8", "131600007": "L-801F9", "131601006": "L-801FA", "131602004": "L-801FB", "131603009": "L-801FC", "131604003": "L-801FD", "131605002": "L-801FE", "131606001": "L-801FF", "131607005": "L-80217", "131608000": "L-80218", "131609008": "L-80219", "131610003": "L-8021A", "131611004": "L-8021B", "131612006": "L-8021C", "131613001": "L-8021D", "131614007": "L-8021E", "131615008": "L-8021F", "131616009": "L-80220", "131617000": "L-80221", "131618005": "L-80222", "131619002": "L-80223", "131620008": "L-80224", "131621007": "L-80225", "131622000": "L-80226", "131623005": "L-80227", "131624004": "L-80228", "131625003": "L-80229", "131626002": "L-8022A", "131627006": "L-8022B", "131628001": "L-8022C", "131629009": "L-8022D", "131630004": "L-8022E", "131631000": "L-80230", "131632007": "L-80231", "131633002": "L-80232", "131634008": "L-80233", "131635009": "L-80234", "131636005": "L-80235", "131637001": "L-80236", "131638006": "L-80237", "131639003": "L-80238", "131640001": "L-80239", "131641002": "L-80240", "131642009": "L-80241", "131643004": "L-80242", "131644005": "L-80243", "131645006": "L-80244", "131646007": "L-80245", "131647003": "L-80246", "131648008": "L-80247", "131649000": "L-80248", "131650000": "L-80249", "131651001": "L-80250", "131652008": "L-80251", "131653003": "L-80252", "131654009": "L-80253", "131655005": "L-80254", "131656006": "L-80255", "131657002": "L-80256", "131658007": "L-80257", "131659004": "L-80258", "131660009": "L-80259", "131661008": "L-80260", "131662001": "L-80261", "131663006": "L-80263", "131664000": "L-80265", "131665004": "L-80266", "131666003": "L-80267", "131667007": "L-80268", "131668002": "L-80269", "131669005": "L-80270", "131670006": "L-80271", "131671005": "L-80272", "131672003": "L-80273", "131673008": "L-80274", "131674002": "L-80275", "131675001": "L-80276", "131676000": "L-80277", "131677009": "L-80278", "131678004": "L-80279", "131679007": "L-80280", "131680005": "L-80281", "131681009": "L-80282", "131682002": "L-80283", "131683007": "L-80284", "131684001": "L-80285", "131685000": "L-80286", "131686004": "L-80287", "131687008": "L-80288", "131688003": "L-80289", "131689006": "L-80290", "131690002": "L-80291", "131691003": "L-80292", "131692005": "L-80293", "131693000": "L-80294", "131694006": "L-80295", "131695007": "L-80296", "131696008": "L-80297", "131697004": "L-80298", "131698009": "L-80299", "131699001": "L-8031A", "131700000": "L-8031B", "131701001": "L-8031C", "131702008": "L-8031D", "131703003": "L-8031E", "131704009": "L-8031F", "131705005": "L-8032A", "131706006": "L-8032B", "131707002": "L-8032C", "131708007": "L-8032D", "131709004": "L-8032E", "131710009": "L-8032F", "131711008": "L-8033A", "131712001": "L-8033B", "131713006": "L-8033C", "131714000": "L-8033D", "131715004": "L-8033E", "131716003": "L-8033F", "131717007": "L-8034A", "131718002": "L-8034B", "131719005": "L-8034C", "131720004": "L-8034D", "131721000": "L-8034E", "131722007": "L-8034F", "131723002": "L-80351", "131724008": "L-80352", "131725009": "L-80353", "131726005": "L-80354", "131727001": "L-80355", "131728006": "L-80356", "131729003": "L-80357", "131730008": "L-80358", "131731007": "L-80359", "131732000": "L-8035A", "131733005": "L-8035B", "131734004": "L-8035C", "131735003": "L-8035D", "131736002": "L-8035E", "131737006": "L-8035F", "131738001": "L-80360", "131739009": "L-80361", "131740006": "L-80362", "131741005": "L-80363", "131742003": "L-80364", "131743008": "L-80365", "131744002": "L-80366", "131745001": "L-80367", "131746000": "L-80368", "131747009": "L-80369", "131748004": "L-8036A", "131749007": "L-8036B", "131750007": "L-8036C", "131751006": "L-8036D", "131752004": "L-8036E", "131753009": "L-8036F", "131754003": "L-80370", "131755002": "L-80371", "131756001": "L-80372", "131757005": "L-80373", "131758000": "L-80374", "131759008": "L-80375", "131760003": "L-80376", "131761004": "L-80377", "131762006": "L-80378", "131763001": "L-80379", "131764007": "L-8037A", "131765008": "L-8037B", "131766009": "L-8037C", "131767000": "L-8037D", "131768005": "L-8037E", "131769002": "L-8037F", "131770001": "L-80380", "131771002": "L-80381", "131772009": "L-80382", "131773004": "L-80383", "131774005": "L-80384", "131775006": "L-80385", "131776007": "L-80386", "131777003": "L-80387", "131778008": "L-80388", "131779000": "L-80389", "131780002": "L-8038A", "131781003": "L-8038B", "131782005": "L-8038C", "131783000": "L-8038D", "131784006": "L-8038E", "131785007": "L-8038F", "131786008": "L-80390", "131787004": "L-80391", "131788009": "L-80392", "131789001": "L-80393", "131790005": "L-80394", "131791009": "L-80395", "131792002": "L-80396", "131793007": "L-80397", "131794001": "L-80398", "131795000": "L-80399", "131796004": "L-8039A", "131797008": "L-8039B", "131798003": "L-8039C", "131799006": "L-8039D", "131800005": "L-8039E", "131801009": "L-8039F", "131802002": "L-80403", "131803007": "L-80404", "131804001": "L-8040A", "131805000": "L-8040B", "131806004": "L-8040C", "131807008": "L-8040D", "131808003": "L-8040E", "131809006": "L-8040F", "131816007": "L-80420", "131819000": "L-8042D", "131822003": "L-80432", "131823008": "L-80434", "131830002": "L-80441", "131831003": "L-80442", "131832005": "L-80443", "131833000": "L-80444", "131834006": "L-80445", "131835007": "L-80446", "131836008": "L-80447", "131837004": "L-80448", "131838009": "L-80449", "131851004": "L-80466", "131852006": "L-80467", "131853001": "L-80468", "131854007": "L-80469", "131861006": "L-80470", "131862004": "L-80471", "131863009": "L-80472", "131864003": "L-80473", "131865002": "L-80474", "131866001": "L-80475", "131867005": "L-80476", "131868000": "L-80477", "131869008": "L-80478", "131870009": "L-80479", "131871008": "L-8047A", "131872001": "L-8047B", "131873006": "L-8047C", "131874000": "L-8047D", "131875004": "L-8047E", "131876003": "L-8047F", "131877007": "L-80480", "131878002": "L-80481", "131879005": "L-80482", "131880008": "L-80483", "131881007": "L-80484", "131882000": "L-80485", "131883005": "L-80486", "131884004": "L-80487", "131885003": "L-80488", "131886002": "L-80489", "131887006": "L-8048A", "131888001": "L-8048B", "131889009": "L-8048C", "131890000": "L-8048D", "131891001": "L-8048E", "131892008": "L-8048F", "131893003": "L-80490", "131894009": "L-80491", "131895005": "L-80492", "131896006": "L-80493", "131897002": "L-80494", "131898007": "L-80496", "131899004": "L-80497", "131900009": "L-80498", "131901008": "L-80499", "131902001": "L-8049A", "131903006": "L-8049B", "131904000": "L-8049C", "131905004": "L-8049D", "131906003": "L-8049E", "131907007": "L-8049F", "131908002": "L-804A1", "131909005": "L-804A2", "131910000": "L-804A3", "131911001": "L-804A4", "131912008": "L-804A5", "131913003": "L-804A6", "131914009": "L-804A7", "131915005": "L-804A8", "131916006": "L-804A9", "131917002": "L-804AA", "131919004": "L-804AC", "131920005": "L-804AD", "131921009": "L-804AE", "131922002": "L-804AF", "131923007": "L-804B1", "131924001": "L-804B2", "131925000": "L-804B3", "131926004": "L-804B4", "131927008": "L-804B5", "131928003": "L-804B6", "131929006": "L-804B7", "131930001": "L-804B8", "131931002": "L-804B9", "131932009": "L-804BA", "131933004": "L-804BB", "131934005": "L-804BC", "131935006": "L-804BD", "131936007": "L-804BE", "131937003": "L-804BF", "131938008": "L-804C1", "131939000": "L-804C2", "131940003": "L-804C3", "131941004": "L-804C4", "131942006": "L-804C5", "131943001": "L-804C6", "131944007": "L-804C7", "131945008": "L-804C8", "131946009": "L-804C9", "131947000": "L-804CA", "131948005": "L-804CB", "131949002": "L-804CC", "131950002": "L-804CD", "131951003": "L-804CE", "131952005": "L-804CF", "131953000": "L-804D1", "131954006": "L-804D2", "131955007": "L-804D3", "131956008": "L-804D4", "131957004": "L-804D5", "131958009": "L-804D6", "131959001": "L-804D7", "131960006": "L-804D9", "131961005": "L-804DA", "131962003": "L-804DB", "131963008": "L-804DC", "131964002": "L-804DE", "131965001": "L-804DF", "131966000": "L-804E1", "131967009": "L-804E2", "131968004": "L-804E3", "131969007": "L-804E4", "131970008": "L-804E5", "131971007": "L-804E6", "131972000": "L-804E7", "131973005": "L-804E8", "131974004": "L-804E9", "131975003": "L-804EA", "131976002": "L-804EB", "131977006": "L-804EC", "131978001": "L-804ED", "131979009": "L-804EE", "131980007": "L-804EF", "131981006": "L-804F1", "131982004": "L-804F2", "131983009": "L-804F3", "131984003": "L-804F4", "131985002": "L-804F5", "131986001": "L-804F6", "131987005": "L-804F7", "131988000": "L-804F8", "131989008": "L-804F9", "131990004": "L-804FA", "131991000": "L-804FB", "131992007": "L-804FC", "131993002": "L-804FE", "131994008": "L-804FF", "131998006": "L-80504", "132009005": "L-80542", "132010000": "L-80543", "132011001": "L-80544", "132012008": "L-80545", "132013003": "L-80546", "132014009": "L-80547", "132015005": "L-80548", "132016006": "L-80549", "132017002": "L-8054A", "132018007": "L-8054B", "132019004": "L-8054C", "132020005": "L-8054D", "132021009": "L-8054E", "132022002": "L-8054F", "132023007": "L-80555", "132024001": "L-80556", "132025000": "L-80557", "132026004": "L-80558", "132027008": "L-80559", "132028003": "L-8055A", "132029006": "L-8055B", "132030001": "L-8055C", "132031002": "L-8055D", "132032009": "L-8055E", "132033004": "L-8055F", "132034005": "L-8056A", "132035006": "L-8056B", "132037003": "L-8056D", "132038008": "L-8056E", "132039000": "L-8056F", "132040003": "L-8057B", "132041004": "L-8057C", "132042006": "L-8057D", "132043001": "L-8057E", "132044007": "L-8057F", "132045008": "L-80583", "132046009": "L-80584", "132047000": "L-80585", "132048005": "L-80586", "132049002": "L-80587", "132050002": "L-80588", "132051003": "L-80589", "132052005": "L-8058A", "132053000": "L-8058B", "132054006": "L-8058C", "132055007": "L-8058D", "132056008": "L-8058E", "132057004": "L-8058F", "132058009": "L-80595", "132059001": "L-80596", "132060006": "L-80597", "132061005": "L-80598", "132062003": "L-80599", "132063008": "L-8059A", "132064002": "L-8059B", "132065001": "L-8059C", "132066000": "L-8059D", "132067009": "L-8059E", "132068004": "L-8059F", "132069007": "L-805A1", "132070008": "L-805A2", "132071007": "L-805A3", "132072000": "L-805A4", "132073005": "L-805A5", "132074004": "L-805A6", "132075003": "L-805A7", "132076002": "L-805A8", "132077006": "L-805A9", "132078001": "L-805AA", "132079009": "L-805AB", "132080007": "L-805AC", "132081006": "L-805AD", "132082004": "L-805AE", "132083009": "L-805AF", "132084003": "L-805B1", "132085002": "L-805B2", "132086001": "L-805B3", "132087005": "L-805B4", "132088000": "L-805B5", "132089008": "L-805B6", "132090004": "L-805B7", "132091000": "L-805B8", "132092007": "L-805B9", "132093002": "L-805BA", "132094008": "L-805BB", "132095009": "L-805BC", "132096005": "L-805BD", "132097001": "L-805BE", "132098006": "L-805BF", "132099003": "L-805C1", "132100006": "L-805C2", "132101005": "L-805C3", "132102003": "L-805C4", "132103008": "L-805C5", "132104002": "L-805C6", "132105001": "L-805C7", "132106000": "L-805C8", "132107009": "L-805C9", "132108004": "L-805CA", "132109007": "L-805CB", "132110002": "L-805CC", "132111003": "L-805CD", "132112005": "L-805CE", "132113000": "L-805CF", "132114006": "L-805D0", "132115007": "L-805D1", "132116008": "L-805D2", "132117004": "L-805D3", "132118009": "L-805D4", "132119001": "L-805D5", "132120007": "L-805D6", "132121006": "L-805D7", "132122004": "L-805D8", "132123009": "L-805D9", "132124003": "L-805DA", "132125002": "L-805DB", "132126001": "L-805DC", "132127005": "L-805DD", "132128000": "L-805DE", "132129008": "L-805DF", "132130003": "L-805E1", "132131004": "L-805E2", "132132006": "L-805E3", "132133001": "L-805E4", "132134007": "L-805E5", "132135008": "L-805E6", "132136009": "L-805E7", "132137000": "L-805E8", "132138005": "L-805E9", "132139002": "L-805EB", "132140000": "L-805EC", "132141001": "L-805ED", "132142008": "L-805EE", "132143003": "L-805EF", "132144009": "L-805F1", "132145005": "L-805F2", "132146006": "L-805F3", "132147002": "L-805F4", "132148007": "L-805F5", "132149004": "L-805F6", "132150004": "L-805F7", "132151000": "L-805F8", "132152007": "L-805F9", "132153002": "L-805FA", "132154008": "L-805FB", "132155009": "L-805FC", "132156005": "L-805FD", "132157001": "L-805FE", "132158006": "L-805FF", "132159003": "L-8060A", "132160008": "L-8060B", "132161007": "L-8060C", "132162000": "L-8060D", "132163005": "L-8060E", "132164004": "L-8060F", "132165003": "L-80613", "132166002": "L-80614", "132167006": "L-80615", "132168001": "L-80616", "132169009": "L-80617", "132170005": "L-80618", "132171009": "L-80619", "132173007": "L-8061B", "132174001": "L-8061C", "132175000": "L-8061D", "132176004": "L-8061E", "132178003": "L-80623", "132179006": "L-80624", "132180009": "L-80625", "132181008": "L-80626", "132182001": "L-80627", "132183006": "L-80628", "132184000": "L-80629", "132185004": "L-8062A", "132186003": "L-8062B", "132187007": "L-8062C", "132188002": "L-8062D", "132189005": "L-8062E", "132190001": "L-8062F", "132191002": "L-80634", "132192009": "L-80635", "132193004": "L-80636", "132194005": "L-80637", "132195006": "L-80638", "132196007": "L-80639", "132197003": "L-8063A", "132198008": "L-8063B", "132199000": "L-8063C", "132200002": "L-8063D", "132201003": "L-8063E", "132202005": "L-8063F", "132203000": "L-80645", "132204006": "L-80646", "132205007": "L-80647", "132206008": "L-80648", "132207004": "L-80649", "132208009": "L-8064A", "132209001": "L-8064B", "132210006": "L-8064C", "132211005": "L-8064D", "132212003": "L-8064E", "132213008": "L-8064F", "132214002": "L-8065A", "132215001": "L-8065B", "132216000": "L-8065C", "132217009": "L-8065D", "132218004": "L-8065E", "132219007": "L-8065F", "132220001": "L-80664", "132221002": "L-80665", "132222009": "L-80666", "132223004": "L-80667", "132224005": "L-80668", "132225006": "L-80669", "132226007": "L-8066A", "132227003": "L-8066B", "132228008": "L-8066C", "132229000": "L-8066D", "132230005": "L-8066E", "132231009": "L-8066F", "132232002": "L-80670", "132233007": "L-80671", "132234001": "L-80672", "132235000": "L-80673", "132236004": "L-80674", "132237008": "L-80675", "132238003": "L-80676", "132239006": "L-80677", "132240008": "L-80678", "132241007": "L-80679", "132242000": "L-8067A", "132243005": "L-8067B", "132244004": "L-8067C", "132245003": "L-8067D", "132246002": "L-8067E", "132247006": "L-8067F", "132248001": "L-80680", "132249009": "L-80681", "132250009": "L-80682", "132251008": "L-80683", "132252001": "L-80684", "132253006": "L-80685", "132254000": "L-80686", "132255004": "L-80687", "132256003": "L-80688", "132257007": "L-80689", "132258002": "L-8068A", "132259005": "L-8068B", "132260000": "L-8068C", "132261001": "L-8068D", "132262008": "L-8068E", "132263003": "L-8068F", "132264009": "L-80690", "132265005": "L-80691", "132266006": "L-80692", "132267002": "L-80693", "132268007": "L-80694", "132269004": "L-80695", "132270003": "L-80696", "132271004": "L-80697", "132272006": "L-80698", "132273001": "L-80699", "132274007": "L-8069A", "132275008": "L-8069B", "132276009": "L-8069C", "132277000": "L-8069D", "132278005": "L-8069E", "132279002": "L-8069F", "132280004": "L-806A1", "132281000": "L-806A2", "132282007": "L-806A3", "132283002": "L-806A4", "132284008": "L-806A5", "132285009": "L-806A6", "132286005": "L-806A7", "132287001": "L-806A8", "132288006": "L-806A9", "132289003": "L-806AA", "132290007": "L-806AB", "132291006": "L-806AC", "132292004": "L-806AD", "132293009": "L-806AE", "132294003": "L-806AF", "132295002": "L-806B1", "132296001": "L-806B2", "132297005": "L-806B3", "132298000": "L-806B4", "132299008": "L-806B5", "132300000": "L-806B6", "132301001": "L-806B7", "132302008": "L-806B8", "132303003": "L-806B9", "132304009": "L-806BA", "132305005": "L-806BB", "132306006": "L-806BC", "132307002": "L-806BD", "132308007": "L-806BE", "132309004": "L-806BF", "132310009": "L-806C1", "132311008": "L-806C2", "132312001": "L-806C3", "132313006": "L-806C4", "132314000": "L-806C5", "132315004": "L-806C6", "132316003": "L-806C7", "132317007": "L-806C8", "132318002": "L-806C9", "132319005": "L-806CA", "132320004": "L-806CB", "132321000": "L-806CC", "132322007": "L-806CD", "132323002": "L-806CE", "132324008": "L-806CF", "132325009": "L-806D1", "132326005": "L-806D2", "132327001": "L-806D3", "132328006": "L-806D4", "132329003": "L-806D5", "132330008": "L-806D6", "132331007": "L-806D7", "132332000": "L-806D8", "132333005": "L-806D9", "132334004": "L-806DA", "132335003": "L-806DB", "132336002": "L-806DC", "132337006": "L-806DD", "132338001": "L-806DE", "132339009": "L-806DF", "132340006": "L-806E1", "132341005": "L-806E2", "132342003": "L-806E3", "132343008": "L-806E4", "132344002": "L-806E5", "132345001": "L-806E6", "132346000": "L-806E7", "132347009": "L-806E8", "132348004": "L-806E9", "132349007": "L-806EA", "132350007": "L-806EB", "132351006": "L-806EC", "132352004": "L-806ED", "132353009": "L-806EE", "132354003": "L-806EF", "132355002": "L-806F1", "132356001": "L-806F2", "132357005": "L-806F3", "132358000": "L-806F4", "132359008": "L-806F5", "132360003": "L-806F6", "132361004": "L-806F8", "132362006": "L-806F9", "132363001": "L-806FA", "132364007": "L-806FB", "132365008": "L-806FC", "132366009": "L-806FD", "132367000": "L-806FE", "132368005": "L-806FF", "132369002": "L-8077A", "132371002": "L-807E2", "132372009": "L-807E3", "132373004": "L-807E4", "132374005": "L-807E5", "132376007": "L-807E7", "132377003": "L-807E8", "132378008": "L-807E9", "132379000": "L-807EA", "132380002": "L-807EB", "132381003": "L-807EC", "132382005": "L-807ED", "132383000": "L-807EE", "132384006": "L-807EF", "132385007": "L-807F1", "132386008": "L-807F2", "132387004": "L-808A1", "132388009": "L-808A2", "132389001": "L-808A3", "132390005": "L-808A4", "132391009": "L-808A5", "132392002": "L-808A6", "132393007": "L-808A7", "132394001": "L-808A8", "132395000": "L-808A9", "132396004": "L-808AA", "132397008": "L-808AB", "132398003": "L-808AC", "132399006": "L-808AD", "132400004": "L-808AE", "132401000": "L-808AF", "132402007": "L-808B1", "132403002": "L-808B2", "132404008": "L-808B3", "132405009": "L-808B4", "132406005": "L-808B5", "132407001": "L-808B6", "132408006": "L-808B7", "132409003": "L-808B8", "132410008": "L-808B9", "132411007": "L-808BA", "132412000": "L-808BB", "132413005": "L-808BC", "132414004": "L-808BD", "132415003": "L-808BE", "132416002": "L-808BF", "132417006": "L-808C1", "132418001": "L-808C2", "132419009": "L-808C3", "132420003": "L-808C4", "132421004": "L-808C5", "132422006": "L-808C6", "132423001": "L-808C7", "132424007": "L-808C8", "132426009": "L-808CA", "132427000": "L-808CB", "132428005": "L-808CC", "132429002": "L-808CD", "132430007": "L-808CE", "132431006": "L-808CF", "132432004": "L-808D1", "132433009": "L-808D2", "132434003": "L-808D3", "132435002": "L-808D4", "132436001": "L-808D5", "132437005": "L-808D6", "132438000": "L-808D7", "132439008": "L-808D8", "132440005": "L-808D9", "132441009": "L-808DA", "132442002": "L-808DB", "132443007": "L-808DC", "132444001": "L-808DD", "132445000": "L-808DE", "132446004": "L-808DF", "132447008": "L-808E1", "132448003": "L-808E2", "132449006": "L-808E3", "132450006": "L-808E4", "132451005": "L-808E5", "132452003": "L-808E6", "132453008": "L-808E7", "132454002": "L-808E8", "132455001": "L-808E9", "132456000": "L-808EA", "132457009": "L-808EB", "132458004": "L-808EC", "132459007": "L-808ED", "132460002": "L-808EE", "132461003": "L-808EF", "132462005": "L-808F1", "132463000": "L-808F2", "132464006": "L-808F3", "132465007": "L-808F4", "132466008": "L-808F5", "132467004": "L-808F6", "132468009": "L-808F8", "132469001": "L-808F9", "132470000": "L-808FA", "132471001": "L-808FB", "132472008": "L-808FC", "132473003": "L-808FD", "132474009": "L-808FE", "132475005": "L-808FF", "132476006": "L-80916", "132477002": "L-80917", "132478007": "L-80918", "132479004": "L-80919", "132480001": "L-80920", "132481002": "L-80921", "132482009": "L-80922", "132483004": "L-80923", "132484005": "L-80924", "132485006": "L-80925", "132486007": "L-80926", "132487003": "L-80927", "132488008": "L-80928", "132489000": "L-80929", "132490009": "L-80930", "132491008": "L-80931", "132492001": "L-80932", "132493006": "L-80933", "132494000": "L-80934", "132495004": "L-80935", "132496003": "L-80936", "132497007": "L-80937", "132498002": "L-80938", "132499005": "L-80939", "132500001": "L-80940", "132501002": "L-80941", "132502009": "L-80942", "132503004": "L-80943", "132504005": "L-80944", "132505006": "L-80945", "132506007": "L-80946", "132507003": "L-80947", "132508008": "L-80948", "132509000": "L-80949", "132510005": "L-80950", "132511009": "L-80951", "132512002": "L-80952", "132513007": "L-80953", "132514001": "L-80954", "132515000": "L-80955", "132516004": "L-80956", "132517008": "L-80957", "132518003": "L-80958", "132519006": "L-80959", "132520000": "L-80960", "132521001": "L-80961", "132522008": "L-80962", "132523003": "L-80963", "132524009": "L-80964", "132525005": "L-80965", "132526006": "L-80966", "132527002": "L-80967", "132528007": "L-80968", "132529004": "L-80969", "132530009": "L-80970", "132531008": "L-80971", "132532001": "L-80972", "132533006": "L-80973", "132534000": "L-80974", "132535004": "L-80975", "132536003": "L-80976", "132537007": "L-80977", "132538002": "L-80978", "132539005": "L-80979", "132540007": "L-80980", "132541006": "L-80981", "132542004": "L-80982", "132543009": "L-80983", "132544003": "L-80984", "132545002": "L-80985", "132546001": "L-80986", "132547005": "L-80987", "132548000": "L-80988", "132549008": "L-80989", "132550008": "L-80990", "132551007": "L-80991", "132552000": "L-80992", "132553005": "L-80993", "132554004": "L-80994", "132555003": "L-80995", "132556002": "L-80996", "132557006": "L-80997", "132558001": "L-80998", "132559009": "L-80999", "132560004": "L-809A1", "132561000": "L-809A2", "132562007": "L-809A3", "132563002": "L-809A4", "132564008": "L-809A5", "132565009": "L-809A6", "132566005": "L-809A7", "132567001": "L-809A8", "132568006": "L-809A9", "132569003": "L-809AA", "132570002": "L-809AB", "132571003": "L-809AC", "132572005": "L-809AD", "132573000": "L-809AE", "132574006": "L-809AF", "132575007": "L-809B1", "132576008": "L-809B2", "132577004": "L-809B3", "132578009": "L-809B4", "132579001": "L-809B5", "132580003": "L-809B6", "132581004": "L-809B7", "132582006": "L-809B8", "132583001": "L-809B9", "132584007": "L-809BA", "132585008": "L-809BB", "132586009": "L-809BC", "132587000": "L-809BD", "132588005": "L-809BE", "132589002": "L-809BF", "132590006": "L-809C1", "132591005": "L-809C2", "132592003": "L-809C3", "132593008": "L-809C4", "132594002": "L-809C5", "132595001": "L-809C6", "132596000": "L-809C7", "132597009": "L-809C8", "132598004": "L-809C9", "132599007": "L-809CA", "132600005": "L-809CB", "132601009": "L-809CC", "132602002": "L-809CD", "132603007": "L-809CE", "132604001": "L-809CF", "132605000": "L-809D1", "132606004": "L-809D2", "132607008": "L-809D3", "132608003": "L-809D4", "132609006": "L-809D5", "132610001": "L-809D6", "132611002": "L-809D7", "132612009": "L-809D8", "132613004": "L-809D9", "132614005": "L-809DA", "132615006": "L-809DB", "132616007": "L-809DC", "132617003": "L-809DD", "132618008": "L-809DE", "132619000": "L-809DF", "132620006": "L-809E1", "132621005": "L-809E2", "132622003": "L-809E3", "132623008": "L-809E4", "132624002": "L-809E5", "132625001": "L-809E6", "132626000": "L-809E7", "132627009": "L-809E8", "132629007": "L-809EA", "132630002": "L-809EB", "132631003": "L-809EC", "132632005": "L-809ED", "132633000": "L-809EE", "132634006": "L-809EF", "132635007": "L-809F1", "132636008": "L-809F2", "132637004": "L-809F3", "132638009": "L-809F4", "132639001": "L-809F5", "132640004": "L-809F6", "132641000": "L-809F7", "132642007": "L-809F8", "132643002": "L-809F9", "132644008": "L-809FA", "132645009": "L-809FB", "132646005": "L-809FC", "132647001": "L-809FD", "132648006": "L-809FE", "132649003": "L-809FF", "132650003": "L-80A70", "132651004": "L-80A71", "132652006": "L-80A73", "132653001": "L-80A74", "132654007": "L-80A75", "132655008": "L-80A76", "132656009": "L-80A77", "132657000": "L-80A78", "132658005": "L-80A79", "132659002": "L-80A80", "132660007": "L-80A81", "132661006": "L-80A83", "132662004": "L-80A84", "132663009": "L-80A85", "132664003": "L-80A86", "132665002": "L-80A87", "132666001": "L-80A88", "132667005": "L-80A89", "132668000": "L-80A90", "132669008": "L-80A91", "132670009": "L-80A92", "132671008": "L-80A93", "132672001": "L-80A94", "132673006": "L-80A95", "132675004": "L-80A97", "132676003": "L-80A99", "132677007": "L-80AA1", "132678002": "L-80AA2", "132679005": "L-80AA3", "132680008": "L-80AA4", "132681007": "L-80B01", "132682000": "L-80B02", "132684004": "L-80B04", "132685003": "L-80B05", "132686002": "L-80B06", "132687006": "L-80B07", "132688001": "L-80B08", "132689009": "L-80B09", "132690000": "L-80B10", "132697002": "L-80B17", "132698007": "L-80B18", "132699004": "L-80B19", "132701004": "L-80B22", "132702006": "L-80B23", "132703001": "L-80B24", "132704007": "L-80B25", "132705008": "L-80B26", "132706009": "L-80B27", "132707000": "L-80B2A", "132708005": "L-80B2B", "132709002": "L-80B2C", "132710007": "L-80B2D", "132711006": "L-80B2E", "132712004": "L-80B2F", "132716001": "L-80B33", "132717005": "L-80B34", "132718000": "L-80B35", "132719008": "L-80B36", "132720002": "L-80B37", "132721003": "L-80B38", "132722005": "L-80B39", "132723000": "L-80B3A", "132724006": "L-80B40", "132731005": "L-80B47", "132732003": "L-80B48", "132733008": "L-80B49", "132734002": "L-80B4A", "132735001": "L-80B4B", "132736000": "L-80B50", "132737009": "L-80B51", "132738004": "L-80B52", "132739007": "L-80B53", "132740009": "L-80B54", "132741008": "L-80B55", "132742001": "L-80B56", "132743006": "L-80B57", "132744000": "L-80B58", "132745004": "L-80B59", "132746003": "L-80B5A", "132747007": "L-80B5B", "132748002": "L-80B5C", "132749005": "L-80B5D", "132750005": "L-80B5E", "132751009": "L-80B5F", "132757008": "L-80B65", "132758003": "L-80B66", "132759006": "L-80B67", "132760001": "L-80B68", "132761002": "L-80B69", "132762009": "L-80B6A", "132763004": "L-80B6B", "132764005": "L-80B6C", "132765006": "L-80B6D", "132766007": "L-80B6E", "132767003": "L-80B6F", "132768008": "L-80B70", "132769000": "L-80B71", "132770004": "L-80B80", "132771000": "L-80B81", "132772007": "L-80B82", "132773002": "L-80B83", "132774008": "L-80B84", "132775009": "L-80B85", "132776005": "L-80B86", "132777001": "L-80B87", "132778006": "L-80B88", "132779003": "L-80B89", "132780000": "L-80B8A", "132781001": "L-80B8B", "132782008": "L-80B8C", "132783003": "L-80B8D", "132784009": "L-80B8E", "132785005": "L-80B8F", "132786006": "L-80B90", "132787002": "L-80B91", "132788007": "L-80B92", "132789004": "L-80B93", "132790008": "L-80B94", "132791007": "L-80B95", "132792000": "L-80B96", "132793005": "L-80B97", "132794004": "L-80B98", "132795003": "L-80B99", "132796002": "L-80B9A", "132797006": "L-80B9B", "132798001": "L-80B9C", "132799009": "L-80B9D", "132800008": "L-80B9E", "132801007": "L-80B9F", "132802000": "L-80BA1", "132803005": "L-80BA2", "132804004": "L-80BA3", "132805003": "L-80BA4", "132806002": "L-80BA5", "132807006": "L-80BA6", "132808001": "L-80BA7", "132809009": "L-80BA8", "132810004": "L-80BA9", "132811000": "L-80BB1", "132812007": "L-80BB2", "132813002": "L-80BB3", "132814008": "L-80BB4", "132815009": "L-80BB5", "132843000": "L-80BE6", "132844006": "L-80BE7", "132845007": "L-80BE8", "132846008": "L-80BE9", "132849001": "L-80BF6", "132851002": "L-80BF8", "132852009": "L-80BF9", "132853004": "L-80C01", "132854005": "L-80C02", "132855006": "L-80C22", "132856007": "L-80C23", "132857003": "L-80C24", "132858008": "L-80C25", "132859000": "L-80C29", "132860005": "L-80C30", "132861009": "L-80C31", "132888004": "L-86B36", "132901006": "L-86B49", "132951001": "L-8A111", "132952008": "L-8A112", "132953003": "L-8A113", "132954009": "L-8A115", "132955005": "L-8A116", "132956006": "L-8A117", "132957002": "L-8A118", "132960009": "L-8A125", "132961008": "L-8A126", "132962001": "L-8A127", "132963006": "L-8A128", "132964000": "L-8A129", "132965004": "L-8A12A", "132966003": "L-8A12B", "132967007": "L-8A12C", "132968002": "L-8A12D", "132969005": "L-8A12E", "132970006": "L-8A12F", "132971005": "L-8A130", "132972003": "L-8A131", "132973008": "L-8A132", "132974002": "L-8A133", "132975001": "L-8A134", "132976000": "L-8A135", "132977009": "L-8A136", "132978004": "L-8A137", "132979007": "L-8A138", "132980005": "L-8A139", "132981009": "L-8A13A", "132982002": "L-8A13B", "132983007": "L-8A13C", "132984001": "L-8A13D", "132985000": "L-8A13E", "132986004": "L-8A13F", "132990002": "L-8A14A", "132991003": "L-8A14B", "132992005": "L-8A14C", "132993000": "L-8A14D", "132994006": "L-8A150", "132995007": "L-8A151", "132996008": "L-8A152", "132997004": "L-8A153", "132998009": "L-8A154", "132999001": "L-8A155", "133000000": "L-8A156", "133001001": "L-8A157", "133002008": "L-8A158", "133003003": "L-8A159", "133004009": "L-8A15A", "133005005": "L-8A15B", "133006006": "L-8A15C", "133007002": "L-8A15D", "133008007": "L-8A15E", "133009004": "L-8A15F", "133010009": "L-8A160", "133011008": "L-8A161", "133012001": "L-8A162", "133013006": "L-8A163", "133014000": "L-8A164", "133015004": "L-8A165", "133016003": "L-8A166", "133017007": "L-8A167", "133018002": "L-8A168", "133019005": "L-8A169", "133020004": "L-8A16A", "133021000": "L-8A16B", "133022007": "L-8A16C", "133023002": "L-8A16D", "133024008": "L-8A16E", "133025009": "L-8A16F", "133026005": "L-8A170", "133027001": "L-8A171", "133028006": "L-8A172", "133029003": "L-8A173", "133030008": "L-8A174", "133031007": "L-8A175", "133032000": "L-8A176", "133033005": "L-8A177", "133034004": "L-8A178", "133035003": "L-8A179", "133036002": "L-8A17A", "133037006": "L-8A17B", "133038001": "L-8A17C", "133039009": "L-8A17D", "133040006": "L-8A17E", "133041005": "L-8A17F", "133042003": "L-8A180", "133043008": "L-8A181", "133044002": "L-8A182", "133045001": "L-8A183", "133046000": "L-8A184", "133047009": "L-8A185", "133048004": "L-8A186", "133049007": "L-8A187", "133050007": "L-8A188", "133051006": "L-8A189", "133052004": "L-8A18A", "133053009": "L-8A18B", "133054003": "L-8A18C", "133055002": "L-8A18D", "133056001": "L-8A18E", "133057005": "L-8A18F", "133058000": "L-8A190", "133059008": "L-8A191", "133060003": "L-8A192", "133061004": "L-8A193", "133062006": "L-8A194", "133063001": "L-8A195", "133064007": "L-8A196", "133065008": "L-8A197", "133066009": "L-8A198", "133067000": "L-8A199", "133068005": "L-8A19A", "133069002": "L-8A19B", "133070001": "L-8A19C", "133071002": "L-8A19E", "133072009": "L-8A19F", "133073004": "L-8A1A1", "133074005": "L-8A1A2", "133075006": "L-8A1A3", "133076007": "L-8A1A4", "133077003": "L-8A1A5", "133078008": "L-8A1A6", "133079000": "L-8A1A7", "133080002": "L-8A1A8", "133081003": "L-8A1A9", "133082005": "L-8A1AA", "133083000": "L-8A1AB", "133084006": "L-8A1AC", "133085007": "L-8A1AD", "133086008": "L-8A1AE", "133087004": "L-8A1AF", "133088009": "L-8A1B1", "133089001": "L-8A1B2", "133090005": "L-8A1B4", "133091009": "L-8A1B5", "133092002": "L-8A1B6", "133093007": "L-8A1B7", "133094001": "L-8A1B8", "133095000": "L-8A1B9", "133096004": "L-8A1BA", "133097008": "L-8A1BB", "133098003": "L-8A1BC", "133099006": "L-8A1BD", "133100003": "L-8A1BE", "133101004": "L-8A1BF", "133102006": "L-8A1C1", "133103001": "L-8A1C2", "133104007": "L-8A1C3", "133105008": "L-8A1C4", "133106009": "L-8A1C5", "133107000": "L-8A1C6", "133108005": "L-8A1C7", "133109002": "L-8A1C8", "133110007": "L-8A1C9", "133111006": "L-8A1CA", "133112004": "L-8A1CB", "133113009": "L-8A1CC", "133114003": "L-8A1CD", "133115002": "L-8A1CE", "133116001": "L-8A1CF", "133117005": "L-8A1D1", "133118000": "L-8A1D2", "133119008": "L-8A1D3", "133120002": "L-8A1D4", "133121003": "L-8A1D5", "133122005": "L-8A1D6", "133123000": "L-8A1D7", "133124006": "L-8A1D8", "133125007": "L-8A1D9", "133126008": "L-8A1DA", "133127004": "L-8A1DB", "133128009": "L-8A1DC", "133129001": "L-8A1DD", "133130006": "L-8A1DE", "133131005": "L-8A1DF", "133132003": "L-8A1E1", "133133008": "L-8A1E2", "133134002": "L-8A1E3", "133135001": "L-8A1E4", "133136000": "L-8A1E5", "133137009": "L-8A1E6", "133138004": "L-8A1E7", "133139007": "L-8A1E8", "133140009": "L-8A1E9", "133141008": "L-8A1EA", "133142001": "L-8A1EB", "133143006": "L-8A1EC", "133144000": "L-8A1ED", "133145004": "L-8A1EE", "133146003": "L-8A1EF", "133147007": "L-8A1F1", "133148002": "L-8A1F2", "133149005": "L-8A1F3", "133150005": "L-8A1F4", "133151009": "L-8A1F5", "133152002": "L-8A1F6", "133153007": "L-8A1F7", "133154001": "L-8A1F8", "133155000": "L-8A1FA", "133156004": "L-8A1FB", "133157008": "L-8A1FC", "133158003": "L-8A1FD", "133159006": "L-8A1FE", "133160001": "L-8A1FF", "133161002": "L-8B105", "133162009": "L-8B106", "133163004": "L-8B107", "133164005": "L-8B108", "133165006": "L-8B109", "133166007": "L-8B111", "133167003": "L-8B112", "133168008": "L-8B113", "133169000": "L-8B114", "133170004": "L-8B115", "133171000": "L-8B116", "133172007": "L-8B117", "133173002": "L-8B118", "133174008": "L-8B119", "133175009": "L-8B121", "133176005": "L-8B122", "133177001": "L-8B123", "133178006": "L-8B124", "133179003": "L-8B125", "133180000": "L-8B126", "133181001": "L-8B127", "133182008": "L-8B128", "133183003": "L-8B129", "133184009": "L-8B130", "133185005": "L-8B131", "133186006": "L-8B132", "133187002": "L-8B133", "133188007": "L-8B134", "133189004": "L-8B135", "133190008": "L-8B136", "133191007": "L-8B137", "133192000": "L-8B139", "133193005": "L-8B140", "133194004": "L-8B141", "133195003": "L-8B142", "133196002": "L-8B143", "133197006": "L-8B144", "133198001": "L-8B145", "133199009": "L-8B146", "133200007": "L-8B147", "133201006": "L-8B148", "133202004": "L-8B149", "133203009": "L-8B150", "133204003": "L-8B151", "133205002": "L-8B152", "133206001": "L-8B153", "133207005": "L-8B155", "133208000": "L-8B156", "133209008": "L-8B157", "133210003": "L-8B158", "133211004": "L-8B159", "133212006": "L-8B160", "133213001": "L-8B161", "133214007": "L-8B162", "133215008": "L-8B163", "133216009": "L-8B164", "133217000": "L-8B165", "133218005": "L-8B166", "133219002": "L-8B167", "133220008": "L-8B168", "133221007": "L-8B169", "133222000": "L-8B170", "133223005": "L-8B171", "133224004": "L-8B172", "133225003": "L-8B173", "133226002": "L-8B174", "133227006": "L-8B175", "133228001": "L-8B176", "133229009": "L-8B177", "133230004": "L-8B178", "133231000": "L-8B958", "133232007": "L-8B959", "133233002": "L-8B95A", "133234008": "L-8B95B", "133235009": "L-8B95C", "133236005": "L-8B95D", "133237001": "L-8B95E", "133238006": "L-8B95F", "133239003": "L-8B961", "133240001": "L-8B962", "133241002": "L-8B963", "133242009": "L-8B964", "133243004": "L-8B966", "133244005": "L-8B967", "133245006": "L-8B968", "133246007": "L-8B969", "133247003": "L-8B96A", "133248008": "L-8B96B", "133249000": "L-8B96C", "133250000": "L-8B96D", "133251001": "L-8B96E", "133252008": "L-8B96F", "133253003": "L-8B971", "133254009": "L-8B972", "133255005": "L-8B973", "133256006": "L-8B974", "133257002": "L-8B975", "133258007": "L-8B976", "133259004": "L-8B977", "133260009": "L-8B978", "133261008": "L-8B979", "133262001": "L-8B97A", "133263006": "L-8B97B", "133264000": "L-8B97C", "133265004": "L-8B97D", "133266003": "L-8B97E", "133267007": "L-8B97F", "133268002": "L-8B983", "133269005": "L-8B984", "133270006": "L-8B985", "133271005": "L-8B987", "133272003": "L-8B988", "133273008": "L-8B989", "133274002": "L-8B98A", "133275001": "L-8B98B", "133276000": "L-8B98C", "133277009": "L-8B98D", "133278004": "L-8B98E", "133279007": "L-8B98F", "133280005": "L-8B990", "133281009": "L-8B991", "133282002": "L-8B992", "133283007": "L-8B993", "133284001": "L-8B994", "133285000": "L-8B995", "133286004": "L-8B996", "133287008": "L-8B998", "133288003": "L-8B999", "133289006": "L-8B99A", "133290002": "L-8B99B", "133291003": "L-8B99C", "133292005": "L-8B99D", "133293000": "L-8B99E", "133294006": "L-8B99F", "133295007": "L-8B9A0", "133296008": "L-8B9A1", "133297004": "L-8B9A2", "133298009": "L-8B9A3", "133299001": "L-8B9A4", "133300009": "L-8B9A5", "133301008": "L-8B9A6", "133302001": "L-8B9A7", "133303006": "L-8B9A8", "133304000": "L-8B9A9", "133305004": "L-8B9AA", "133306003": "L-8B9AB", "133307007": "L-8B9AC", "133308002": "L-8B9AD", "133309005": "L-8B9AE", "133310000": "L-8B9AF", "133311001": "L-8B9B0", "133312008": "L-8B9B1", "133313003": "L-8B9B2", "133314009": "L-8B9B3", "133315005": "L-8B9B4", "133316006": "L-8B9B5", "133317002": "L-8B9B6", "133318007": "L-8B9B7", "133319004": "L-8B9B8", "133320005": "L-8B9B9", "133321009": "L-8B9BA", "133322002": "L-8B9BB", "133323007": "L-8B9BC", "133324001": "L-8B9BD", "133325000": "L-8B9BE", "133326004": "L-8B9BF", "133327008": "L-8B9C0", "133328003": "L-8B9C1", "133329006": "L-8B9C2", "133330001": "L-8B9C3", "133331002": "L-8B9C4", "133332009": "L-8B9C5", "133333004": "L-8B9C6", "133334005": "L-8B9C7", "133335006": "L-8B9C8", "133336007": "L-8B9C9", "133337003": "L-8B9CA", "133338008": "L-8B9CB", "133339000": "L-8B9CC", "133340003": "L-8B9CD", "133341004": "L-8B9CE", "133342006": "L-8B9CF", "133343001": "L-8B9D0", "133344007": "L-8B9D1", "133345008": "L-8B9D2", "133346009": "L-8B9D3", "133347000": "L-8B9D4", "133348005": "L-8B9D5", "133349002": "L-8B9D6", "133350002": "L-8B9D7", "133351003": "L-8B9D8", "133352005": "L-8B9D9", "133353000": "L-8B9DA", "133354006": "L-8B9DB", "133355007": "L-8B9DC", "133356008": "L-8B9DD", "133357004": "L-8B9DE", "133358009": "L-8B9DF", "133359001": "L-8B9E0", "133360006": "L-8B9E1", "133361005": "L-8B9E2", "133362003": "L-8B9E3", "133363008": "L-8B9E4", "133364002": "L-8B9E5", "133365001": "L-8B9E6", "133366000": "L-8B9E7", "133367009": "L-8B9E8", "133368004": "L-8B9E9", "133369007": "L-8B9EA", "133370008": "L-8B9EB", "133371007": "L-8B9EC", "133372000": "L-8B9ED", "133373005": "L-8B9EE", "133374004": "L-8B9EF", "133375003": "L-8B9F0", "133376002": "L-8B9F1", "133377006": "L-8B9F2", "133378001": "L-8B9F3", "133379009": "L-8B9F4", "133380007": "L-8B9F5", "133381006": "L-8B9F6", "133382004": "L-8B9F7", "133383009": "L-8B9FA", "133384003": "L-8B9FB", "133385002": "L-8B9FC", "133386001": "L-8B9FD", "133387005": "L-8B9FE", "133388000": "L-8B9FF", "133389008": "L-8BA00", "133390004": "L-8BA01", "133391000": "L-8BA02", "133392007": "L-8BA03", "133393002": "L-8BA04", "133394008": "L-8BA05", "133395009": "L-8BA06", "133396005": "L-8BA07", "133397001": "L-8BA08", "133398006": "L-8BA09", "133399003": "L-8BA0A", "133400005": "L-8BA0B", "133401009": "L-8BA0C", "133402002": "L-8BA0D", "133403007": "L-8BA0E", "133404001": "L-8BA0F", "133405000": "L-8BA10", "133406004": "L-8BA11", "133407008": "L-8BA12", "133408003": "L-8BA13", "133409006": "L-8BA14", "133410001": "L-8BA15", "133411002": "L-8BA16", "133412009": "L-8BA17", "133413004": "L-8BA19", "133414005": "L-8BA1A", "133415006": "L-8BA1B", "133416007": "L-8BA1C", "133417003": "L-8BA1D", "133418008": "L-8BA1E", "133419000": "L-8BA1F", "133420006": "L-8BA20", "133421005": "L-8BA21", "133422003": "L-8BA22", "133423008": "L-8BA23", "133424002": "L-8BA24", "133425001": "L-8BA25", "133426000": "L-8BA26", "133427009": "L-8BA27", "133428004": "L-8BA28", "133429007": "L-8BA29", "133430002": "L-8BA2A", "133431003": "L-8BA2B", "133432005": "L-8BA2C", "133433000": "L-8BA2D", "133434006": "L-8BA2E", "133435007": "L-8BA2F", "133436008": "L-8BA30", "133437004": "L-8BA31", "133438009": "L-8BA32", "133439001": "L-8BA33", "133440004": "L-8BA34", "133441000": "L-8BA35", "133442007": "L-8BA36", "133443002": "L-8BA37", "133444008": "L-8BA38", "133445009": "L-8BA39", "133446005": "L-8BA3A", "133447001": "L-8BA3B", "133448006": "L-8BA3C", "133449003": "L-8BA3D", "133450003": "L-8BA3E", "133451004": "L-8BA3F", "133452006": "L-8BA40", "133453001": "L-8BA41", "133454007": "L-8BA42", "133455008": "L-8BA43", "133456009": "L-8BA44", "133457000": "L-8BA45", "133458005": "L-8BA46", "133459002": "L-8BA47", "133460007": "L-8BA48", "133461006": "L-8BA49", "133462004": "L-8BA4A", "133463009": "L-8BA4B", "133464003": "L-8BA4C", "133465002": "L-8BA4D", "133466001": "L-8BA4E", "133467005": "L-8BA4F", "133468000": "L-8BA50", "133469008": "L-8BA51", "133470009": "L-8BA52", "133471008": "L-8BA53", "133472001": "L-8BA54", "133473006": "L-8BA55", "133474000": "L-8BA56", "133475004": "L-8BA57", "133476003": "L-8BA58", "133477007": "L-8BA59", "133478002": "L-8BA5A", "133479005": "L-8BA5B", "133480008": "L-8BA5C", "133481007": "L-8BA5D", "133482000": "L-8BA5E", "133483005": "L-8BA5F", "133484004": "L-8BA60", "133485003": "L-8BA61", "133486002": "L-8BA62", "133487006": "L-8BA63", "133488001": "L-8BA64", "133489009": "L-8BA65", "133490000": "L-8BA66", "133491001": "L-8BA67", "133492008": "L-8BA68", "133493003": "L-8BA69", "133494009": "L-8BA6A", "133495005": "L-8BA6B", "133496006": "L-8BA6C", "133497002": "L-8BA6D", "133498007": "L-8BA6E", "133499004": "L-8BA6F", "133500008": "L-8BA70", "133501007": "L-8BA71", "133502000": "L-8BA72", "133503005": "L-8BA73", "133504004": "L-8BA74", "133505003": "L-8BA75", "133506002": "L-8BA76", "133507006": "L-8BA77", "133508001": "L-8BA78", "133509009": "L-8BA79", "133510004": "L-8BA7A", "133511000": "L-8BA7B", "133512007": "L-8BA7C", "133513002": "L-8BA7D", "133514008": "L-8BA7E", "133515009": "L-8BA7F", "133516005": "L-8BA80", "133517001": "L-8BA81", "133518006": "L-8BA82", "133519003": "L-8BA83", "133520009": "L-8BA84", "133521008": "L-8BA85", "133522001": "L-8BA86", "133523006": "L-8BA87", "133524000": "L-8BA88", "133525004": "L-8BA89", "133526003": "L-8BA8A", "133527007": "L-8BA8B", "133528002": "L-8BA8C", "133529005": "L-8BA8D", "133530000": "L-8BA8E", "133531001": "L-8BA8F", "133532008": "L-8BA90", "133533003": "L-8BA91", "133534009": "L-8BA92", "133535005": "L-8BA93", "133536006": "L-8BA94", "133537002": "L-8BA95", "133538007": "L-8BA96", "133539004": "L-8BA97", "133540002": "L-8BA98", "133541003": "L-8BA99", "133542005": "L-8BA9A", "133543000": "L-8BA9B", "133544006": "L-8BA9C", "133545007": "L-8BA9D", "133546008": "L-8BA9E", "133547004": "L-8BA9F", "133548009": "L-8BAA0", "133549001": "L-8BAA1", "133550001": "L-8BAA2", "133551002": "L-8BAA3", "133552009": "L-8BAA4", "133553004": "L-8BAA5", "133554005": "L-8BAA6", "133555006": "L-8BAA7", "133556007": "L-8BAA8", "133557003": "L-8BAA9", "133558008": "L-8BAAA", "133559000": "L-8BAAB", "133560005": "L-8BAAC", "133561009": "L-8BAAD", "133562002": "L-8BAAE", "133563007": "L-8BAAF", "133564001": "L-8BAB0", "133565000": "L-8BAB1", "133566004": "L-8BAB2", "133567008": "L-8BAB3", "133568003": "L-8BAB4", "133569006": "L-8BAB5", "133570007": "L-8BAB6", "133571006": "L-8BAB7", "133572004": "L-8BAB8", "133573009": "L-8BAB9", "133574003": "L-8BABA", "133575002": "L-8BABB", "133576001": "L-8BABC", "133577005": "L-8BABD", "133578000": "L-8BABE", "133579008": "L-8BABF", "133580006": "L-8BAC0", "133581005": "L-8BAC1", "133582003": "L-8BAC2", "133583008": "L-8BAC3", "133584002": "L-8BAC4", "133585001": "L-8BAC5", "133586000": "L-8BAC6", "133587009": "L-8BAC7", "133588004": "L-8BAC8", "133589007": "L-8BAC9", "133590003": "L-8BACA", "133591004": "L-8BACB", "133592006": "L-8BACC", "133593001": "L-8BACD", "133594007": "L-8BACE", "133595008": "L-8BACF", "133596009": "L-8BAD0", "133597000": "L-8BAD1", "133598005": "L-8BAD2", "133599002": "L-8BAD3", "133600004": "L-8BAD4", "133601000": "L-8BAD5", "133602007": "L-8BAD6", "133603002": "L-8BAD7", "133604008": "L-8BAD8", "133605009": "L-8BAD9", "133606005": "L-8BADA", "133607001": "L-8BADB", "133608006": "L-8BADC", "133609003": "L-8BADD", "133610008": "L-8BADE", "133611007": "L-8BADF", "133612000": "L-8BAE0", "133613005": "L-8BAE1", "133614004": "L-8BAE2", "133615003": "L-8BAE3", "133616002": "L-8BAE4", "133617006": "L-8BAE5", "133618001": "L-8BAE6", "133619009": "L-8BAE7", "133620003": "L-8BAE9", "133621004": "L-8BAEA", "133622006": "L-8BAEB", "133623001": "L-8BAEC", "133624007": "L-8BAED", "133625008": "L-8BAEE", "133626009": "L-8BAEF", "133627000": "L-8BAF0", "133628005": "L-8BAF1", "133629002": "L-8BAF2", "133630007": "L-8BAF3", "133631006": "L-8BAF4", "133632004": "L-8BAF5", "133633009": "L-8BAF6", "133634003": "L-8BAF7", "133635002": "L-8BAF8", "133636001": "L-8BAF9", "133637005": "L-8BAFA", "133638000": "L-8BAFB", "133639008": "L-8BAFC", "133640005": "L-8BAFD", "133641009": "L-8BAFE", "133642002": "L-8BAFF", "133643007": "L-8BB00", "133644001": "L-8BB01", "133645000": "L-8BB02", "133646004": "L-8BB03", "133647008": "L-8BB04", "133648003": "L-8BB05", "133649006": "L-8BB06", "133650006": "L-8BB07", "133651005": "L-8BB09", "133652003": "L-8BB0A", "133653008": "L-8BB0B", "133654002": "L-8BB0C", "133655001": "L-8BB0E", "133656000": "L-8BB0F", "133657009": "L-8BB10", "133658004": "L-8BB11", "133659007": "L-8BB12", "133660002": "L-8BB13", "133661003": "L-8BB14", "133662005": "L-8BB15", "133663000": "L-8BB16", "133664006": "L-8BB17", "133665007": "L-8BB18", "133666008": "L-8BB19", "133667004": "L-8BB1A", "133668009": "L-8BB1B", "133669001": "L-8BB1C", "133670000": "L-8BB1D", "133671001": "L-8BB1E", "133672008": "L-8BB1F", "133673003": "L-8BB20", "133674009": "L-8BB21", "133675005": "L-8BB22", "133676006": "L-8BB23", "133677002": "L-8BB24", "133678007": "L-8BB25", "133679004": "L-8BB26", "133680001": "L-8BB27", "133681002": "L-8BB28", "133682009": "L-8BB29", "133683004": "L-8BB2A", "133684005": "L-8BB2B", "133685006": "L-8BB2C", "133686007": "L-8BB2D", "133687003": "L-8BB2E", "133688008": "L-8BB2F", "133689000": "L-8BB30", "133690009": "L-8BB31", "133691008": "L-8BB32", "133692001": "L-8BB33", "133693006": "L-8BB34", "133694000": "L-8BB35", "133695004": "L-8BB36", "133696003": "L-8BB37", "133697007": "L-8BB38", "133698002": "L-8BB39", "133699005": "L-8BB3A", "133700006": "L-8BB3B", "133701005": "L-8BB3C", "133702003": "L-8BB3D", "133703008": "L-8BB3E", "133704002": "L-8BB3F", "133705001": "L-8BB40", "133706000": "L-8BB41", "133707009": "L-8BB42", "133708004": "L-8BB43", "133709007": "L-8BB44", "133710002": "L-8BB45", "133711003": "L-8BB46", "133712005": "L-8BB47", "133713000": "L-8BB48", "133714006": "L-8BB49", "133715007": "L-8BB4A", "133716008": "L-8BB4B", "133717004": "L-8BB4C", "133718009": "L-8BB4D", "133719001": "L-8BB4E", "133720007": "L-8BB4F", "133721006": "L-8BB50", "133722004": "L-8BB51", "133723009": "L-8BB52", "133724003": "L-8BB53", "133725002": "L-8BB54", "133727005": "L-8BB56", "133728000": "L-8BB57", "133729008": "L-8BB58", "133730003": "L-8BB59", "133731004": "L-8BB5A", "133732006": "L-8BB5B", "133733001": "L-8BB5C", "133734007": "L-8BB5D", "133735008": "L-8BB5E", "133736009": "L-8BB5F", "133737000": "L-8BB60", "133738005": "L-8BB61", "133739002": "L-8BB62", "133740000": "L-8BB63", "133741001": "L-8BB64", "133742008": "L-8BB65", "133743003": "L-8BB66", "133744009": "L-8BB67", "133745005": "L-8BB68", "133746006": "L-8BB69", "133747002": "L-8BB6A", "133748007": "L-8BB6B", "133749004": "L-8BB6C", "133750004": "L-8BB6D", "133751000": "L-8BB6E", "133752007": "L-8BB6F", "133753002": "L-8BB70", "133754008": "L-8BB71", "133755009": "L-8BB72", "133756005": "L-8BB73", "133757001": "L-8BB74", "133758006": "L-8BB75", "133759003": "L-8BB76", "133760008": "L-8BB77", "133761007": "L-8BB78", "133762000": "L-8BB79", "133763005": "L-8BB7A", "133764004": "L-8BB7B", "133765003": "L-8BB7C", "133766002": "L-8BB7D", "133767006": "L-8BB7E", "133768001": "L-8BB7F", "133769009": "L-8BB80", "133770005": "L-8BB81", "133771009": "L-8BB82", "133772002": "L-8BB83", "133773007": "L-8BB84", "133774001": "L-8BB85", "133775000": "L-8BB86", "133776004": "L-8BB87", "133777008": "L-8BB88", "133778003": "L-8BB89", "133779006": "L-8BB8A", "133780009": "L-8BB8B", "133781008": "L-8BB8C", "133782001": "L-8BB8D", "133783006": "L-8BB8E", "133784000": "L-8BB8F", "133785004": "L-8BB90", "133786003": "L-8BB91", "133787007": "L-8BB92", "133788002": "L-8BB93", "133789005": "L-8BB94", "133790001": "L-8BB95", "133791002": "L-8BB96", "133792009": "L-8BB97", "133793004": "L-8BB98", "133794005": "L-8BB99", "133795006": "L-8BB9A", "133796007": "L-8BB9B", "133797003": "L-8BB9C", "133798008": "L-8BB9D", "133799000": "L-8BB9E", "133800001": "L-8BB9F", "133801002": "L-8BC00", "133802009": "L-8BC01", "133803004": "L-8BC03", "133804005": "L-8BC04", "133805006": "L-8BC05", "133806007": "L-8BC06", "133807003": "L-8BC07", "133808008": "L-8BC08", "133809000": "L-8BC09", "133810005": "L-8BC10", "133811009": "L-8BC11", "133812002": "L-8BC12", "133813007": "L-8BC13", "133814001": "L-8BC14", "133815000": "L-8BC15", "133816004": "L-8BC16", "133817008": "L-8BC17", "133818003": "L-8BC18", "133819006": "L-8BC19", "133820000": "L-8BC20", "133821001": "L-8BC21", "133822008": "L-8BC22", "133823003": "L-8BC23", "133824009": "L-8BC24", "133825005": "L-8BC25", "133826006": "L-8BC26", "133827002": "L-8BC27", "133828007": "L-8BC28", "133829004": "L-8BC29", "133830009": "L-8BC30", "133831008": "L-8BC31", "133832001": "L-8BC32", "133833006": "L-8BC33", "133834000": "L-8BC34", "133835004": "L-8BC35", "133836003": "L-8BC36", "133837007": "L-8BC37", "133838002": "L-8BC38", "133839005": "L-8BC39", "133840007": "L-8BC40", "133841006": "L-8BC41", "133842004": "L-8BC42", "133855003": "M-78731", "133874006": "P1-86C50", "133875007": "P1-93506", "133882006": "P2-71317", "133884007": "P5-B3402", "133885008": "P5-B3404", "133886009": "P5-B3406", "133887000": "P5-B3408", "133888005": "P5-B3410", "133889002": "P5-B3412", "133890006": "P5-B3414", "133910006": "PA-5003B", "133911005": "PA-5003C", "133912003": "PA-5003D", "133913008": "PA-5003E", "133914002": "PA-5003F", "133943005": "T-D2340", "133944004": "T-D2342", "133945003": "T-D4211", "133946002": "T-D4212", "134198009": "G-C150", "134223000": "R-41727", "134328007": "R-000F0", "143824007": "T-C4147", "143925009": "T-C4155", "144026003": "T-C4156", "146799005": "R-F1FA8", "155237005": "T-C421D", "155338003": "T-C4102", "158965000": "J-0016E", "158971006": "J-00172", "159016003": "J-00187", "160270001": "R-20773", "160274005": "R-2087E", "160303001": "G-0157", "160476009": "F-02455", "160573003": "F-02573", "161045001": "F-0351E", "161432005": "G-0239", "161445009": "G-023F", "161453001": "G-0244", "161501007": "G-0269", "161505003": "G-026D", "161622006": "G-02BD", "161656000": "G-02D0", "161763005": "G-0304", "161765003": "G-0305", "161798008": "G-0319", "161806007": "G-031E", "161807003": "G-031F", "161901003": "F-0600C", "161971004": "F-A265A", "162164007": "F-03753", "162290004": "F-F1722", "162467007": "R-209F6", "162499001": "R-20A12", "164150006": "R-20099", "164854000": "F-000B7", "164929001": "F-000C3", "164931005": "F-03204", "165076002": "F-000FF", "165079009": "P0-006E4", "165082004": "F-00101", "165084003": "F-00103", "165816005": "F-0331B", "166612004": "F-0169D", "167364008": "T-C4254", "167464007": "T-C4255", "167664004": "T-C4263", "167864002": "T-C4018", "167965000": "T-C421E", "168159002": "T-C4238", "168360002": "T-C4019", "168456004": "P0-003EB", "168460001": "T-C4244", "168537006": "P5-009FA", "168557005": "T-C401A", "169014003": "P5-0600F", "169167001": "P5-D0061", "169254007": "F-01BF8", "169413002": "P0-007AC", "170745003": "F-02F14", "170746002": "F-02F15", "170747006": "F-02F16", "170887008": "T-D161E", "171224000": "F-03C97", "172049005": "P1-4834A", "174822005": "P1-31003", "174826008": "P1-31919", "174830006": "P0-0530F", "174836000": "P1-31037", "174900004": "P1-38803", "180640008": "G-D13E", "180933005": "T-A1604", "181131000": "T-04009", "181347005": "T-47402", "181349008": "T-47403", "181351007": "T-4704C", "181469002": "T-00009", "181491009": "T-02408", "181536004": "T-D077A", "181553006": "T-0282E", "181563003": "T-02848", "181564009": "T-02849", "181768009": "T-D03C2", "181900008": "T-116EE", "181901007": "T-116EF", "182329002": "T-D03C9", "182744004": "P2-77110", "182833002": "F-04460", "183973000": "T-D002F", "193570009": "DA-73402", "194828000": "D3-13012", "194842008": "D3-13001", "194843003": "D3-13013", "194983005": "D3-29025", "194996006": "T-48403", "195020003": "D3-20003", "195042002": "R-F81AE", "195060002": "D3-31351", "195073003": "T-48405", "195164009": "T-48406", "195295006": "D3-80505", "195328002": "T-48404", "195416006": "T-484A4", "195496005": "T-48407", "195675009": "F-30004", "195879000": "T-14001", "195967001": "D2-00036", "196446004": "T-C4307", "196516004": "T-C437C", "196587000": "T-C4306", "196662004": "T-C4308", "196751009": "T-C4309", "196821008": "T-C4305", "197157006": "P0-0099D", "197315008": "D5-80822", "200936003": "D1-100FF", "201101007": "R-F8714", "204317008": "D4-31012", "206034008": "T-4630D", "213262007": "F-01FBA", "218728005": "D3-83001", "223366009": "J-00552", "224727009": "A-00435", "224944003": "R-40333", "225728007": "R-300E3", "225761000": "R-40B16", "225908003": "F-009EA", "228366006": "F-931D4", "228736002": "A-010FB", "228739009": "A-010FE", "228745001": "A-01105", "228748004": "A-040ED", "228761004": "A-0110F", "228790005": "R-429DF", "228791009": "R-429E0", "228792002": "R-429EB", "228793007": "R-429EC", "229033006": "P5-D0072", "230690007": "D3-8900D", "231249005": "P1-C0208", "232077005": "DA-7930D", "232717009": "P1-3301A", "233022006": "P1-31028", "233134001": "P1-31088", "233139006": "P1-31089", "233159005": "P1-31C03", "233170003": "P1-3157D", "233199008": "P0-057E8", "233224003": "P1-36956", "233230003": "P1-3696A", "233817007": "D3-1301F", "233819005": "D3-13020", "233823002": "D3-13021", "233981004": "D3-80027", "233982006": "D3-80002", "234021009": "D3-80033", "234171009": "D3-04006", "236423003": "D7-11007", "236886002": "P1-8330D", "237380007": "P1-48011", "237473006": "DD-66544", "237495005": "DB-80106", "237897009": "D6-34737", "238108007": "F-029F7", "238810007": "D0-30017", "239503002": "P1-189C2", "240946003": "P0-05AFA", "240977001": "P1-031C8", "241213007": "P5-30031", "241439007": "P5-0A006", "241443006": "P5-0A00A", "241466007": "P5-B001D", "241539009": "P5-0801C", "241547009": "P5-08025", "241553009": "P5-0802B", "241615005": "P5-0900D", "241620005": "P5-09011", "241663008": "P5-0903A", "241686001": "P5-00027", "241687005": "P1-C0012", "241695009": "P1-C001A", "243147009": "P2-2290D", "243154003": "P2-22914", "243156001": "P2-22916", "243776001": "PA-2011E", "243898001": "T-D0059", "243902007": "T-D005D", "243903002": "T-D005E", "243904008": "T-D005F", "243905009": "T-D007C", "243906005": "T-D007D", "243908006": "T-D007F", "243909003": "T-D008B", "243910008": "T-D008C", "243911007": "T-D008D", "243912000": "T-D008E", "243913005": "T-D008F", "243914004": "T-D0091", "243915003": "T-D0092", "243916002": "T-D0093", "243917006": "T-D0094", "243918001": "T-D0095", "243920003": "T-D0097", "243921004": "T-D0098", "243922006": "T-D0099", "243923001": "T-D009A", "243925008": "T-D009C", "243926009": "T-D009D", "243927000": "T-D009E", "243977002": "T-D4434", "244089006": "T-0214D", "244097004": "T-0215D", "244106003": "T-02425", "244107007": "T-02426", "244111001": "T-0242A", "244117002": "T-02536", "244118007": "T-02537", "244169007": "T-D0315", "244251006": "T-43002", "244252004": "T-43003", "244411005": "T-4940E", "244415001": "T-4941A", "244453006": "T-A800B", "245100002": "T-12204", "245321008": "T-C4235", "245322001": "T-C4236", "245323006": "T-C4237", "245324000": "T-C4216", "245328002": "T-C4217", "245341003": "T-C4379", "245344006": "T-C4411", "245346008": "T-C447A", "245544005": "P1-31018", "245616001": "T-54641", "245619008": "T-54621", "245620002": "T-54611", "245631005": "T-54741", "245639007": "T-54781", "245814000": "T-5493D", "245823002": "T-5494D", "245831007": "T-53012", "245849007": "T-D0169", "246090004": "G-C189", "246092007": "G-A60B", "246101005": "G-0180", "246112005": "G-C197", "246205007": "G-C1C6", "246206008": "F-02A3B", "246244004": "G-D775", "246262008": "G-C1E3", "246345001": "G-C1F9", "246432004": "R-42009", "246464006": "R-42019", "246489000": "G-C11C", "247049005": "F-035A5", "247094004": "F-035F3", "247095003": "F-035FD", "247441003": "F-4410C", "247472004": "D0-00165", "248243004": "F-03D1D", "248300009": "F-03D38", "248366000": "F-03D8C", "248523006": "F-54005", "248536006": "F-03E55", "248584002": "F-21334", "248585001": "F-21303", "248808008": "F-009E4", "248983002": "R-20658", "249192005": "F-00AA0", "249599008": "F-5012A", "249602003": "F-5012D", "249708006": "T-C4582", "250431005": "F-00E6D", "250767002": "F-0212C", "250881009": "F-021FF", "250907009": "F-02220", "250909007": "F-02225", "250924003": "F-02236", "250929008": "F-0224E", "250949004": "F-0227A", "250964004": "F-022A1", "251011009": "F-0231F", "251012002": "F-02320", "251013007": "F-02321", "251014001": "F-02322", "251050008": "F-0238B", "251053005": "F-0238D", "251055003": "F-3014D", "251056002": "F-3014E", "251057006": "F-3014F", "251081004": "F-023F7", "251120003": "D3-33122", "251124007": "D3-33112", "251135002": "F-38056", "251159007": "D3-31704", "251175005": "D3-30904", "251271006": "F-02692", "251786004": "F-02FA4", "251795007": "F-02FB4", "251797004": "F-A2143", "251799001": "F-02FB7", "252064005": "F-0319E", "252068008": "F-031A2", "252129004": "F-031F7", "252416005": "P3-00045", "252130009": "F-031F8", "252131008": "F-031F9", "252418006": "P5-B3004", "252420009": "P5-B3005", "252421008": "P5-B3006", "252426003": "P5-3003A", "252427007": "P5-30107", "252432008": "P5-D3008", "252680004": "P5-D0063", "253001006": "D0-F00E0", "253276007": "D4-31005", "253551005": "D4-31166", "253590009": "D3-29082", "253591008": "D4-31611", "253639004": "D3-4020B", "253678000": "D4-32030", "253728007": "D4-3252B", "253729004": "D4-3252C", "253730009": "D4-3252D", "254582000": "D5-F1404", "254626006": "D2-F1105", "254634000": "D2-F110E", "254637007": "D2-F1007", "254651007": "D0-F0005", "254819008": "D0-F1017", "254845004": "D7-F0815", "254900004": "D7-F0465", "254938000": "DA-0001F", "255029007": "DB-F0107", "255046005": "DF-004BC", "255072001": "D5-20002", "255208005": "R-40356", "255209002": "R-40357", "255218000": "R-40365", "255227004": "G-A39A", "255235001": "R-411C0", "255236000": "F-32021", "255238004": "R-40377", "255253007": "R-4038D", "255282008": "M-020FA", "255288007": "R-403A7", "255321001": "R-403CC", "255378009": "R-40411", "255380003": "R-40416", "255423002": "R-40448", "255460003": "G-C028", "255465008": "R-4047B", "255482005": "R-40491", "255496004": "R-4049E", "255499006": "R-404A0", "255503000": "R-404A4", "255507004": "R-404A8", "255508009": "R-404A9", "255509001": "R-404AA", "255511005": "R-404AC", "255518004": "R-404B3", "255521002": "R-404B6", "255523004": "R-404B7", "255524005": "R-404B8", "255525006": "R-404B9", "255526007": "R-404BA", "255530005": "R-404BC", "255531009": "R-404BD", "255532002": "R-404BE", "255533007": "R-404BF", "255543005": "R-404C7", "255549009": "R-404CC", "255551008": "R-404CE", "255561001": "R-404D5", "255566006": "R-404DA", "255590007": "R-404ED", "255593009": "R-404F0", "255594003": "R-404F1", "255603008": "R-404F9", "255604002": "R-404FA", "255605001": "R-404FB", "255606000": "R-404FC", "255609007": "R-404FE", "255619001": "R-40507", "255631004": "C-5008C", "255632006": "R-F1216", "255641001": "F-61117", "255667006": "F-61118", "255792001": "C-2280A", "255793006": "C-2280B", "255794000": "C-2280C", "255795004": "C-2280D", "255796003": "C-2280E", "255797007": "C-2280F", "255798002": "C-22810", "255799005": "C-22816", "255800009": "C-22817", "255801008": "C-22818", "255802001": "C-22819", "255803006": "C-2281A", "255804000": "C-2281B", "255805004": "C-2281C", "255806003": "C-2281D", "255807007": "C-2281E", "255808002": "C-2281F", "255810000": "C-2282A", "255811001": "C-2282B", "255813003": "C-2282C", "256235009": "R-40C16", "256496006": "F-611FC", "256501007": "F-61202", "256506002": "F-61207", "256526003": "F-6121C", "256579008": "C-14314", "256674009": "T-D008A", "256779006": "T-F1412", "256875007": "T-F1413", "257327003": "A-12018", "257362008": "A-25501", "257363003": "A-25502", "257409000": "A-14611", "257771002": "R-41C37", "257833000": "P1-10997", "257834006": "P1-10998", "257835007": "P1-10999", "257837004": "P1-1099B", "257912008": "P0-021AB", "257950002": "R-41C8D", "258083009": "R-41D27", "258090004": "R-41D2D", "258104002": "R-41D41", "258153002": "F-021E1", "258177008": "P5-09051", "258181008": "R-41D8B", "258214002": "G-C16B", "258215001": "R-41DA8", "258219007": "R-41DAC", "258224005": "R-41DB0", "258228008": "R-41DB4", "258245003": "R-41DC5", "258270003": "R-41DDC", "258433009": "G-803C", "258562007": "G-81A0", "258661006": "G-81EA", "259153006": "C-20830", "259170003": "C-21216", "259221006": "C-2102B", "260245000": "R-40271", "260360000": "G-A37A", "260376009": "R-40750", "260385009": "R-40759", "260388006": "R-4075C", "260395002": "R-40765", "260408008": "G-A205", "260409000": "R-40771", "260413007": "R-40775", "260426006": "R-40782", "260427002": "R-40783", "260450008": "R-40799", "260473000": "R-407B0", "260492003": "R-40809", "260493008": "R-4080A", "260496000": "R-4080D", "260497009": "R-4080E", "260499007": "R-40810", "260506009": "R-40816", "260521003": "R-40819", "260585005": "G-D05F", "260590008": "G-D067", "260601006": "G-D071", "260674002": "G-C048", "260753009": "G-C05F", "260787004": "A-00004", "260858005": "G-C093", "260867005": "R-40861", "260870009": "G-C09C", "260893003": "G-C0AE", "260905004": "G-C0B2", "260911001": "G-C0B7", "261004008": "R-408C3", "261039008": "R-40928", "261061003": "R-40939", "261073003": "R-40940", "261074009": "R-40941", "261089000": "R-4094A", "261129000": "G-A10A", "261197005": "R-409E2", "261198000": "R-409E3", "261199008": "R-409E4", "261249004": "F-61165", "261250004": "F-61166", "261459001": "G-D0C6", "261537001": "P1-31015", "261613009": "R-41177", "261617005": "R-4117B", "261665006": "R-41198", "261712009": "C-100EA", "262003004": "C-70841", "262008008": "R-4135B", "262061000": "R-413B7", "262068006": "R-413C5", "262202000": "R-41531", "262301009": "A-00D7B", "262502001": "R-41AEA", "263654008": "R-42037", "263677008": "R-42047", "263706005": "R-4205A", "263707001": "R-4205B", "263720003": "P0-021B2", "263816006": "R-420AE", "263943000": "R-4210B", "263972004": "T-A1509", "264045001": "R-42142", "264068005": "R-4214B", "264114003": "R-4215C", "264159006": "R-42175", "264208000": "R-4218D", "264217000": "R-42191", "264293000": "T-41065", "264481007": "T-4942D", "264579008": "R-423C3", "264844003": "T-32613", "264845002": "T-32614", "264846001": "T-32615", "264847005": "T-32616", "264848000": "T-32617", "264849008": "T-32618", "264850008": "T-32619", "264853005": "T-3261C", "264908009": "R-424A6", "265483003": "P5-3003F", "265484009": "P5-30041", "266706003": "P2-31209", "266894000": "G-032F", "266897007": "G-011E", "266919005": "F-9321F", "266995000": "G-0335", "267011001": "R-20767", "267036007": "F-201B3", "268384009": "F-042BA", "268400002": "P2-3120A", "268445003": "P5-B005A", "268461001": "F-9B75C", "268951004": "R-207D7", "270492004": "D3-30001", "271593001": "F-06001", "271594007": "D3-00006", "271649006": "F-008EC", "271650006": "F-008ED", "271767006": "F-41506", "271782001": "F-A5561", "271801002": "F-5005E", "271807003": "D0-00058", "271824009": "F-21331", "271921002": "F-00033", "271989003": "D7-90010", "271993009": "P5-009BF", "272113006": "R-407E0", "272114000": "R-407E1", "272123002": "R-407E7", "272163001": "R-40826", "272180002": "A-00916", "272224001": "A-00927", "272287005": "A-04036", "272466003": "R-4087B", "272476000": "R-40885", "272479007": "R-40888", "272517003": "R-40899", "272518008": "R-4089A", "272519000": "R-4089B", "272657006": "T-D075D", "272673000": "T-D016E", "272710004": "T-D0170", "272737002": "G-C581", "272741003": "G-C171", "272998002": "T-48725", "273099000": "T-48726", "273202007": "T-48727", "273249006": "G-E048", "273944007": "C-842F4", "273948005": "R-F6E36", "274022008": "P1-34001", "274060004": "T-4667C", "274143007": "T-4667D", "274231001": "T-4668A", "274303007": "R-202A9", "274329007": "T-4667E", "274331003": "P1-4830F", "274640006": "F-03261", "274662006": "F-A0846", "274668005": "F-37015", "275035006": "P1-32006", "275514001": "F-300FA", "275552000": "G-0069", "276214006": "R-427CE", "276334009": "F-13006", "276755008": "F-03DE9", "276772001": "F-03DFE", "276774000": "F-03E02", "276780008": "F-03E0D", "276781007": "F-03E0E", "276901002": "F-03E86", "277016007": "C-23805", "277132007": "P0-0000E", "277381004": "F-00078", "277591006": "P1-03106", "277592004": "P1-03107", "277630003": "T-32601", "277631004": "T-32603", "277634007": "T-32503", "277635008": "T-32504", "277671009": "R-400B2", "277956007": "T-D054F", "277957003": "T-D0567", "277958008": "T-D056A", "277959000": "T-D056B", "277960005": "T-D056C", "277961009": "T-D056D", "277962002": "T-D056E", "278201002": "G-C032", "278307001": "R-40553", "278318001": "R-40554", "278528006": "F-017C0", "278571002": "T-C46AA", "278672000": "T-C46AB", "278983006": "T-D051D", "279046003": "A-80002", "279047007": "F-A2632", "279084009": "F-37006", "279141006": "T-C4145", "279142004": "T-C4146", "279143009": "T-C4154", "279144003": "T-C4201", "279145002": "T-C4202", "279170002": "T-35111", "279174006": "T-35313", "279189002": "T-C4641", "279215006": "T-A0036", "279271008": "T-C4642", "279317000": "T-35014", "279336005": "T-A4904", "279478000": "T-75181", "279479008": "T-81001", "279549004": "T-21301", "279609001": "T-C4423", "279706003": "T-D05E4", "279784003": "T-C4452", "279795009": "T-C4401", "279866008": "T-C4453", "279867004": "T-81206", "280062008": "T-D3412", "280216006": "T-C4465", "280314006": "T-C4466", "280371009": "T-A0109", "280387007": "T-01041", "280401006": "T-D0721", "280402004": "T-C4467", "280416009": "F-01E06", "280556009": "T-C4445", "280639005": "T-C4446", "280677004": "T-AA62D", "280711000": "T-12847", "280734009": "T-11531", "280824006": "T-C4473", "280906005": "C-50315", "280915003": "T-C447D", "280999005": "T-C447E", "281130003": "T-D0765", "281134007": "T-D305A", "281157001": "T-4000E", "281159003": "T-4105E", "281227003": "T-C447F", "281231009": "T-D0767", "281268007": "M-09024", "281320004": "T-C4481", "281379000": "R-41FD9", "281392002": "T-D3208", "281393007": "T-D3209", "281394001": "T-D320A", "281496003": "T-D6007", "281642007": "T-0265D", "281676003": "T-C4563", "281691001": "P0-005ED", "281765006": "T-C4522", "281847004": "T-C4523", "282031000": "T-C4565", "282044005": "T-46807", "282258000": "R-422F4", "284355001": "T-3260A", "284356000": "T-3260B", "284357009": "T-3260C", "284358004": "T-3260D", "284470004": "D3-30A03", "284639000": "T-48832", "285285000": "F-00E5C", "285425001": "T-C4218", "285427009": "T-C4219", "285429007": "T-C421A", "285570007": "P0-00593", "285645000": "DF-00577", "286558002": "A-11C08", "286866000": "R-421A4", "287272002": "D3-10008", "287572003": "P1-48142", "288546009": "T-D07CB", "288563008": "R-42517", "289894009": "F-840B3", "289925000": "F-61779", "290006006": "F-61790", "290069002": "F-8A074", "290084006": "F-8A084", "290113009": "D7-90565", "290119008": "F-8A09C", "292094009": "DF-10780", "292095005": "DF-10781", "293637006": "DF-10F41", "293638001": "DF-10F42", "297120004": "A-00BA2", "297171002": "T-D00F7", "297172009": "T-D00F8", "297173004": "T-D00F9", "297174005": "T-D00FA", "297968009": "F-40031", "298336006": "F-100EC", "299716001": "T-41068", "299993000": "T-C4417", "300571009": "F-03FC9", "300577008": "F-03FCD", "300841009": "R-428E7", "300842002": "G-C2FE", "300995000": "D3-13025", "301121007": "F-30172", "301766008": "F-A004A", "301939004": "F-0123A", "302343007": "P1-48502", "302396003": "P1-40C19", "302924003": "D7-9002A", "303110006": "R-422A4", "303111005": "R-422A5", "303270005": "T-50007", "303337002": "T-C5001", "303402001": "T-71019", "303623000": "T-C4867", "303653007": "P5-08067", "303680000": "P5-0807F", "303713004": "T-C4866", "303827001": "P5-00A0D", "303960004": "C-50434", "304059001": "R-427E6", "304121006": "A-04459", "304283002": "R-42806", "304292004": "J-00556", "304367000": "R-42808", "304495004": "P0-00820", "304915008": "G-E002", "305437000": "T-3500E", "306783000": "T-1273F", "307047009": "F-00BB8", "307152002": "R-40FB8", "307153007": "R-40FB9", "307154001": "R-40FBA", "307279007": "P1-3200A", "307280005": "P0-004BA", "307429007": "R-410C3", "307486002": "R-4112F", "307502000": "D5-F0519", "308064009": "G-0102", "308546005": "D3-80016", "308689002": "F-20172", "308696000": "P5-39106", "309050000": "G-80A5", "309051001": "G-80A6", "309058007": "G-832D", "309059004": "G-8339", "309312004": "T-D021B", "309343006": "J-004E8", "309390008": "J-0050A", "309523001": "F-02A48", "309546004": "G-833D", "309547008": "G-833F", "309548003": "G-8346", "309587003": "F-8A057", "309602000": "R-41FFC", "309606002": "R-41FFF", "309649001": "R-2073F", "309825002": "R-42018", "309901009": "R-3023A", "309902002": "R-3023B", "309903007": "R-3023C", "309904001": "R-3023D", "309907008": "R-30240", "309910001": "R-30243", "309913004": "R-30246", "309914005": "R-30247", "309915006": "R-30248", "309918008": "R-3024B", "309923008": "R-30250", "309925001": "R-30252", "309927009": "R-30254", "309933000": "R-3025A", "309934006": "R-3025B", "309935007": "R-3025C", "309936008": "R-3025D", "309937004": "R-3025E", "309938009": "R-3025F", "309939001": "R-30260", "309940004": "R-30261", "309941000": "R-30262", "309942007": "R-30263", "309943002": "R-30264", "309944008": "R-30265", "309948006": "R-30269", "309949003": "R-3026A", "309950003": "R-3026B", "309954007": "R-3026F", "309956009": "R-30270", "309958005": "R-30275", "309959002": "R-30276", "309964003": "R-3027B", "309966001": "R-3027D", "309967005": "R-3027E", "309968000": "R-3027F", "309969008": "R-30280", "309970009": "R-30281", "309971008": "R-30282", "309972001": "R-30283", "309974000": "R-30285", "309978002": "R-30289", "309979005": "R-3028A", "309980008": "R-3028B", "309983005": "R-3028E", "309984004": "R-3028F", "309985003": "R-30290", "309989009": "R-30294", "309991001": "R-30296", "309992008": "R-30297", "309993003": "R-30298", "309994009": "R-30299", "309995005": "R-3029A", "309996006": "R-3029B", "310030000": "R-421D4", "310076001": "R-421EB", "310101009": "R-42203", "310105000": "R-42207", "310123008": "R-42219", "310127009": "R-4221D", "310128004": "R-4221E", "310158005": "R-4223B", "310159002": "R-4223C", "310169008": "R-42246", "310200001": "R-4225D", "310464005": "R-302A2", "310651003": "T-D078C", "310652005": "T-D078D", "310787001": "T-D03C3", "310805002": "C-2282E", "311731000": "F-616D8", "312004007": "R-42E61", "312064005": "C-50309", "312288001": "T-D000F", "312500006": "T-C4003", "312501005": "T-C4004", "312502003": "T-D200A", "312503008": "T-C4005", "312522004": "T-35008", "312535008": "T-20101", "312779009": "T-D006D", "312965008": "P0-0526F", "313376005": "R-207AD", "314116003": "D3-13014", "314122007": "P0-006F0", "314186008": "D3-83602", "314348007": "R-20839", "314395006": "T-02164", "314439003": "F-00E11", "314440001": "F-00E14", "314451001": "F-00E1F", "314452008": "F-00E21", "314453003": "F-00E22", "314730000": "T-C4414", "314736006": "T-C463E", "314796009": "T-127A7", "314900004": "C-2282D", "317665004": "T-1153E", "317766009": "T-1153F", "320917000": "C-6A102", "330888007": "C-B0295", "333111009": "R-F748A", "337915000": "L-85003", "339648008": "A-10DBC", "341036005": "A-120DD", "342706005": "A-1009E", "344088002": "A-105E3", "344575009": "A-10703", "344994008": "P2-35002", "346322006": "C-80609", "346441008": "C-8060A", "346553009": "C-80477", "347379006": "C-70434", "349358000": "C-B02C9", "350086004": "C-B02CC", "353842007": "C-B1130", "353903006": "C-B0382", "353912008": "C-B038B", "353946009": "C-B03AD", "353962003": "C-B03BC", "354064008": "C-B02C5", "354088005": "C-B03C3", "354094002": "C-B03C9", "360038009": "P0-021D6", "360066001": "A-11FCD", "360129009": "A-040CB", "360156006": "R-42453", "360271000": "P0-021FD", "360465008": "D3-2906A", "360481003": "D4-31303", "360568007": "T-D07EA", "360592004": "T-48081", "360955006": "T-2300C", "360992006": "T-C4601", "360993001": "T-C4602", "361078006": "T-AB959", "361097006": "T-40003", "362072009": "T-4940B", "362892003": "T-D060D", "362916000": "T-D149C", "363354003": "DF-0040E", "363406005": "DF-0044A", "363443007": "DF-0046D", "363537007": "T-28812", "363563002": "M-300F2", "363589002": "G-C2D0", "363654007": "T-D14AE", "363675004": "R-40641", "363676003": "R-40642", "363679005": "P0-0099A", "363698007": "G-C0E3", "363703001": "G-C0E8", "363704007": "G-C0E9", "363713009": "G-C0F2", "363871006": "F-04317", "364062005": "F-043E6", "364091008": "F-04403", "364092001": "F-04404", "364320009": "F-0452A", "364393001": "F-045CE", "364528001": "F-046D8", "365416000": "F-38035", "365853002": "F-01969", "365981007": "F-93109", "366188009": "F-30117", "367336001": "P0-0058E", "367450005": "R-4235F", "367567000": "T-D03B4", "367577003": "T-02106", "367578008": "T-02488", "367624001": "T-F680F", "367643001": "M-3340A", "368479001": "T-49217", "368481004": "T-49218", "368536000": "T-18774", "368550005": "T-C4752", "369790002": "G-F616", "369791003": "G-F617", "369792005": "G-F618", "369991007": "G-F749", "370129005": "G-C036", "370359005": "F-38095", "370367002": "F-201B6", "370388006": "F-00D5F", "370512004": "DD-661D2", "370951003": "F-02087", "371013005": "T-C430A", "371036001": "D7-76202", "371195002": "T-D0821", "371240000": "G-A11A", "371242008": "G-A11B", "371243003": "G-A11C", "371244009": "G-A11D", "371246006": "G-A11E", "371250004": "G-A12A", "371251000": "G-A12B", "371252007": "G-A12C", "371253002": "G-A12D", "371254008": "G-A12E", "371304004": "T-0262C", "371311000": "T-02008", "371398005": "T-D0801", "371422002": "G-0338", "371439000": "R-00254", "371469007": "R-00258", "371524004": "R-42B89", "371564000": "L-877FB", "371565004": "L-877FC", "371572003": "P0-006F1", "371785003": "R-002CC", "371786002": "R-00359", "371787006": "R-0038C", "371788001": "R-00310", "371789009": "R-00311", "371790000": "R-00303", "371791001": "R-00361", "371794009": "R-002F0", "371795005": "R-00312", "371796006": "R-002FD", "371797002": "R-0036F", "371798007": "R-00306", "371799004": "R-0030A", "371800000": "R-00379", "371801001": "R-00304", "371802008": "R-00383", "371803003": "R-00334", "371804009": "R-00313", "371805005": "R-00372", "371807002": "R-0038F", "371808007": "R-00368", "371809004": "R-00366", "371810009": "R-00365", "371811008": "R-00369", "371812001": "R-00367", "371813006": "R-002C8", "371814000": "R-002C7", "371815004": "R-002C9", "371816003": "R-002CA", "371817007": "R-002CB", "371824008": "R-00336", "371829003": "R-00360", "371835003": "R-00308", "371837006": "R-0032D", "371838001": "R-002E5", "371839009": "R-00394", "371840006": "R-00385", "371841005": "R-00309", "371842003": "R-00307", "371843008": "R-002E7", "371845001": "R-002D3", "371846000": "R-0035D", "371847009": "R-003A9", "371848004": "R-0035C", "371849007": "R-0032C", "371850007": "R-002D2", "371851006": "R-002D0", "371852004": "R-002CF", "371853009": "R-002F5", "371854003": "R-0036C", "371855002": "R-00398", "371856001": "R-0033F", "371857005": "R-00340", "371858000": "R-0033E", "371859008": "R-00342", "371860003": "R-0033D", "371861004": "R-00328", "371862006": "R-002F3", "371863001": "R-0039F", "371864007": "R-00381", "371865008": "R-00382", "371866009": "R-0037F", "371867000": "R-0037E", "371868005": "R-00327", "371869002": "R-0032F", "371870001": "R-00370", "371871002": "R-00373", "371872009": "R-003A1", "371873004": "R-00314", "371874005": "R-002E3", "371875006": "R-002FB", "371876007": "R-002F7", "371877003": "R-002F8", "371879000": "R-002C4", "371880002": "R-002C5", "371883000": "R-00348", "371884006": "R-00363", "371885007": "R-00362", "371886008": "R-00364", "371887004": "R-00338", "371888009": "R-00397", "371889001": "R-00337", "371890005": "R-00377", "371892002": "R-002F2", "371893007": "R-0036B", "371894001": "R-002E2", "371895000": "R-002EF", "371896004": "R-0037C", "371897008": "R-0037A", "371898003": "R-0031B", "371899006": "R-0031A", "371900001": "R-00320", "371901002": "R-0031E", "371902009": "R-00399", "371903004": "R-0039A", "371904005": "R-0031F", "371905006": "R-0031C", "371906007": "R-0037B", "371907003": "R-0034A", "371908008": "R-00349", "371909000": "R-00315", "371910005": "R-002D9", "371911009": "R-00318", "371912002": "R-002E1", "371913007": "R-00355", "371914001": "R-00353", "371915000": "R-002FC", "371916004": "R-0036A", "371917008": "R-00346", "371918003": "R-00388", "371919006": "R-00347", "371920000": "R-00387", "371922008": "R-00335", "371923003": "R-00329", "371924009": "R-00330", "371925005": "R-00333", "371926006": "R-0030C", "371928007": "R-00345", "371931008": "R-002E9", "371933006": "R-0038B", "371934000": "R-0039B", "371951007": "R-003AA", "371952000": "R-00376", "371953005": "R-0035B", "371954004": "R-0035E", "372073000": "T-A010F", "372074006": "T-14122", "372242005": "T-AA092", "372249001": "R-00274", "372276001": "R-00288", "372460008": "G-D173", "372463005": "G-D17C", "372464004": "G-D17D", "372480009": "C-00211", "372558009": "F-61606", "372578001": "F-616E7", "372580007": "F-616EB", "372602008": "F-616FE", "372607002": "F-61716", "372614000": "F-6171D", "372656001": "F-6188F", "372664007": "R-F2B1D", "372665008": "F-61898", "372666009": "F-61899", "372677003": "C-0023B", "372681003": "F-618A5", "372682005": "F-618A6", "372693007": "F-618AE", "372695000": "F-618AF", "372700007": "F-618B5", "372703009": "R-F2B1F", "372722000": "C-0024C", "372724004": "F-61916", "372735009": "C-0024E", "372784001": "F-61955", "372787008": "F-61957", "372788003": "C-00257", "372790002": "F-61959", "372798009": "R-F2B23", "372806008": "F-61969", "372813008": "F-6196E", "372855004": "F-61995", "372862008": "F-6199A", "372863003": "F-6199B", "372872006": "F-619A3", "372881000": "F-619AA", "372901004": "R-F2B27", "372906009": "F-619EF", "373061006": "R-002F6", "373062004": "R-002FA", "373066001": "R-0038D", "373067005": "R-00339", "373068000": "R-0038A", "373095005": "R-002ED", "373098007": "R-00317", "373099004": "R-00319", "373100007": "R-0032E", "373102004": "R-003AC", "373104003": "R-002E6", "373105002": "R-002E4", "373108000": "R-00357", "373110003": "R-00300", "373111004": "R-0035A", "373112006": "R-00302", "373113001": "R-0036E", "373115008": "R-0036D", "373116009": "D3-29096", "373121007": "R-00378", "373122000": "R-00344", "373123005": "R-0030D", "373124004": "R-00343", "373125003": "R-002C6", "373126002": "R-0032A", "373127006": "R-00331", "373128001": "R-00316", "373129009": "R-00341", "373131000": "R-0033B", "373132007": "R-0033C", "373133002": "R-00301", "373134008": "R-002CD", "373135009": "R-002D1", "373136005": "R-0030B", "373137001": "R-0030F", "373138006": "R-00389", "373140001": "R-0033A", "373141002": "R-00356", "373142009": "R-002F1", "373143004": "R-00371", "373147003": "R-00321", "373148008": "R-0037D", "373150000": "R-003CA", "373151001": "R-003CB", "373156006": "R-003D0", "373162001": "R-003D6", "373163006": "R-003D7", "373164000": "R-003D8", "373165004": "R-003D9", "373166003": "R-003DB", "373167007": "R-003DA", "373169005": "R-003DD", "373170006": "R-003DC", "373171005": "R-003DE", "373172003": "R-003BA", "373173008": "R-003B8", "373174002": "R-003B9", "373175001": "R-003BB", "373176000": "R-003BC", "373177009": "R-003BD", "373178004": "R-003BE", "373179007": "R-003BF", "373180005": "R-003C0", "373182002": "R-003C3", "373183007": "R-003C2", "373184001": "R-003C4", "373185000": "R-003C5", "373186004": "R-003C6", "373187008": "R-003C7", "373189006": "R-003C8", "373190002": "R-003C9", "373197004": "R-00286", "373204007": "R-003C1", "373206009": "C-00216", "373219008": "F-617EF", "373228009": "F-617F7", "373246003": "F-6180B", "373250005": "F-6180F", "373254001": "F-61814", "373260001": "F-6181B", "373262009": "C-0021C", "373263004": "F-6181D", "373265006": "F-6181F", "373270004": "C-0021D", "373278006": "F-61861", "373288007": "F-6186A", "373294004": "F-6186F", "373297006": "C-00231", "373304005": "F-61878", "373337007": "F-618FE", "373372005": "F-02900", "373464007": "F-6182F", "373476007": "F-6183C", "373477003": "F-6183D", "373488009": "F-61848", "373526007": "F-618D6", "373529000": "F-618D7", "373530005": "F-618D8", "373646006": "F-61968", "373682001": "F-619B7", "373738000": "F-61639", "373746004": "F-61642", "373757009": "F-6165A", "373780001": "F-6169A", "373808002": "R-41560", "373825000": "R-408F2", "373846009": "R-41561", "373847000": "R-41562", "373933003": "R-424BE", "373945007": "D3-90008", "384668003": "F-02B9B", "384692006": "P5-C018A", "385294005": "T-61007", "385356007": "R-00443", "385380006": "R-00461", "385382003": "R-00463", "385385001": "R-00465", "385420005": "F-61D54", "385474004": "L-8B946", "385484003": "C-22830", "385524004": "R-41F90", "385651009": "G-D30B", "385655000": "G-D30F", "385656004": "G-D316", "385673002": "G-D217", "386045008": "T-0130A", "386053000": "P0-009B4", "386103008": "T-D048E", "386124003": "R-10041", "386125002": "R-10042", "386131004": "R-10043", "386132006": "R-10044", "386134007": "R-10045", "386135008": "R-10046", "386136009": "R-10047", "386137000": "R-10048", "386138005": "R-10049", "386139002": "R-10050", "386140000": "R-10051", "386439008": "P0-001A3", "386509000": "P0-0409B", "386530009": "F-02B35", "386616007": "F-201BD", "386661006": "F-0A44A", "386693003": "C-68165", "386760001": "P1-C0037", "386761002": "P1-C0038", "386802000": "P0-05CCA", "386839004": "F-61AC5", "386841003": "F-61AC9", "386842005": "F-61ACA", "386910003": "F-61B21", "387056004": "C-00286", "387085005": "F-61C76", "387124009": "F-61C97", "387146001": "F-61A26", "387150008": "F-61A28", "387176008": "F-61A3F", "387218008": "F-61A66", "387239001": "F-61A76", "387258005": "F-61A7F", "387264003": "R-F2B2C", "387286002": "F-61A95", "387305002": "F-61AA3", "387341002": "F-61AC4", "387351001": "F-61AFE", "387358007": "F-61B05", "387362001": "F-B2135", "387368002": "F-61B0A", "387372003": "C-12016", "387423006": "F-61B48", "387448009": "F-61BB2", "387480006": "F-61BD0", "387560008": "F-61C65", "387713003": "P0-009C3", "387736007": "P1-48145", "388168008": "L-8BA18", "388249000": "L-8C3FB", "388254009": "L-8C3FD", "388393002": "L-8B1FB", "388445009": "L-000A9", "388490000": "L-881FC", "388626009": "L-000F9", "389080008": "T-A0095", "389081007": "T-A0096", "389156006": "A-00FAD", "392001008": "A-00E8A", "392004000": "A-00E8B", "392007007": "A-00E8C", "392012008": "A-00FBE", "392021009": "P1-030C4", "394774009": "R-42501", "394775005": "R-42502", "395112001": "F-00F4E", "395511002": "R-0045B", "395742005": "C-14512", "395787009": "C-B110E", "395789007": "C-B112D", "395865006": "C-11906", "395889004": "F-66005", "395894004": "C-B10FB", "396017000": "F-B022C", "396339007": "M-35001", "396345004": "C-002B1", "396482007": "R-10075", "396487001": "P1-65359", "396488006": "L-80453", "396505009": "L-80A45", "396631001": "F-048E0", "396646008": "R-10076", "396647004": "R-10077", "396649001": "R-10078", "396652009": "R-10079", "396654005": "R-1007A", "396655006": "R-1007B", "396656007": "R-1007C", "397138000": "F-037BB", "397140005": "F-037BC", "397141009": "F-037BD", "397143007": "F-037BF", "397144001": "F-037C0", "397145000": "F-037C1", "397199005": "G-8430", "397247004": "A-2B201", "397263007": "F-048FA", "397363009": "G-035B", "397364003": "G-035A", "397405001": "G-035C", "397406000": "G-035D", "397407009": "G-035E", "397408004": "G-035F", "397409007": "G-0360", "397410002": "G-0361", "397411003": "G-0362", "397412005": "G-0363", "397413000": "G-0364", "397414006": "G-0365", "397415007": "G-0366", "397417004": "G-0367", "397418009": "G-0368", "397419001": "G-0369", "397421006": "G-036A", "397423009": "G-036C", "397425002": "G-036D", "397427005": "G-036B", "397435008": "G-036E", "397437000": "G-036F", "397439002": "G-0370", "397516006": "P1-A3835", "397522002": "A-00FCA", "397559001": "A-040F7", "397755005": "A-1450C", "397898000": "G-D320", "398010007": "P1-0558A", "398013009": "A-1450B", "398161000": "R-305C3", "398164008": "DF-0070B", "398201009": "G-D321", "398239001": "P1-0512E", "398325003": "DF-0068E", "398665005": "F-A558A", "398705004": "F-61D6F", "398909004": "D0-51006", "398979000": "F-037AB", "398994001": "G-A191", "398996004": "R-1028E", "398998003": "G-039C", "399000008": "R-10296", "399001007": "G-5216", "399002000": "R-10299", "399003005": "R-10281", "399004004": "R-10246", "399005003": "R-10298", "399006002": "R-10212", "399007006": "G-037C", "399009009": "G-03AC", "399011000": "R-102D1", "399012007": "G-5220", "399013002": "R-1026D", "399020009": "D3-20021", "399022001": "R-1029F", "399023006": "G-0380", "399024000": "R-10295", "399025004": "R-10282", "399026003": "R-102B1", "399027007": "G-038F", "399028002": "R-10270", "399030000": "G-0374", "399033003": "R-10202", "399036006": "G-039A", "399037002": "R-1028F", "399038007": "R-10210", "399039004": "G-038D", "399048009": "G-038A", "399051002": "G-037E", "399055006": "R-102D7", "399058008": "G-0382", "399059000": "R-10216", "399061009": "R-10241", "399062002": "G-0386", "399063007": "G-0377", "399064001": "G-03A2", "399065000": "R-1026B", "399067008": "R-102CD", "399070007": "G-038B", "399071006": "R-102C3", "399073009": "R-10276", "399074003": "G-5207", "399075002": "G-5208", "399080006": "R-10288", "399082003": "R-10277", "399083008": "R-10280", "399086000": "G-0392", "399089007": "G-5210", "399093001": "G-0391", "399097000": "P1-0512A", "399098005": "R-102A3", "399099002": "R-10230", "399101009": "R-1024B", "399103007": "R-10275", "399104001": "G-0387", "399106004": "G-03A0", "399108003": "G-5206", "399109006": "G-0375", "399110001": "R-102C2", "399118008": "G-5223", "399125001": "R-102AC", "399127009": "R-102A9", "399129007": "R-1027D", "399130002": "R-102AF", "399132005": "R-10252", "399133000": "G-037A", "399135007": "R-10220", "399136008": "G-5209", "399138009": "R-1029E", "399139001": "G-0396", "399140004": "G-037B", "399142007": "R-10261", "399145009": "G-03A1", "399146005": "R-10279", "399148006": "R-1026C", "399152006": "R-10284", "399154007": "G-0381", "399155008": "G-0394", "399156009": "R-1028A", "399157000": "R-1029A", "399159002": "G-5225", "399160007": "R-10204", "399161006": "R-102D2", "399162004": "R-10242", "399163009": "R-102D6", "399166001": "R-4099D", "399167005": "G-037D", "399168000": "R-1027F", "399169008": "R-1028B", "399171008": "R-1029B", "399173006": "R-10236", "399179005": "R-1028D", "399181007": "R-1029C", "399182000": "R-102C1", "399184004": "R-10238", "399188001": "R-102D0", "399192008": "R-1024A", "399195005": "G-039D", "399196006": "R-10244", "399197002": "R-102D3", "399198007": "R-10232", "399199004": "R-1027B", "399200001": "G-039F", "399201002": "R-10283", "399206007": "R-1028C", "399209000": "R-102D5", "399211009": "G-03AA", "399212002": "R-1026A", "399214001": "G-A19C", "399215000": "R-102B0", "399218003": "R-10263", "399220000": "R-10515", "399225005": "R-10250", "399226006": "R-102D4", "399227002": "R-10286", "399229004": "G-0385", "399232001": "G-A19B", "399234000": "R-102A0", "399235004": "G-0383", "399236003": "R-10234", "399237007": "R-10262", "399238002": "G-0388", "399239005": "G-0398", "399241006": "R-102AA", "399242004": "R-102C6", "399243009": "R-102A2", "399245002": "R-1026F", "399246001": "R-10266", "399247005": "R-102A7", "399251007": "R-10292", "399255003": "R-10256", "399260004": "R-10224", "399261000": "G-03A5", "399263002": "R-10264", "399264008": "G-0373", "399265009": "R-102CF", "399266005": "G-037F", "399267001": "G-038C", "399268006": "G-5224", "399270002": "R-102AB", "399271003": "G-039B", "399272005": "R-102C5", "399273000": "G-5212", "399277004": "R-1027C", "399278009": "R-10268", "399280003": "R-10285", "399281004": "R-10274", "399282006": "G-0389", "399284007": "R-10297", "399285008": "R-1027E", "399287000": "G-0376", "399288005": "R-10248", "399290006": "R-102A1", "399292003": "R-102A4", "399293008": "G-0379", "399294002": "D7-90035", "399296000": "R-102A8", "399297009": "G-5222", "399300004": "G-5221", "399301000": "G-0390", "399303002": "R-10272", "399306005": "G-0397", "399307001": "F-00FBE", "399308006": "R-10291", "399309003": "G-0378", "399310008": "G-039E", "399311007": "R-10278", "399312000": "R-10208", "399313005": "R-102A6", "399316002": "R-102C8", "399318001": "R-10287", "399320003": "R-10271", "399321004": "G-5215", "399325008": "R-10254", "399326009": "D7-10012", "399327000": "R-10293", "399330007": "R-102AD", "399331006": "P5-0808E", "399332004": "R-10289", "399335002": "R-102C4", "399339008": "G-0395", "399341009": "R-1027A", "399342002": "R-10290", "399344001": "R-10267", "399348003": "R-10206", "399349006": "R-102A5", "399351005": "R-102C7", "399352003": "R-10228", "399354002": "G-0384", "399355001": "R-1026E", "399356000": "R-40985", "399358004": "R-10269", "399360002": "R-10257", "399362005": "R-10265", "399365007": "R-1029D", "399366008": "R-10516", "399367004": "G-038E", "399368009": "R-10226", "399370000": "R-10294", "399371001": "G-0399", "399372008": "R-10273", "399384005": "T-D0823", "399707004": "R-41563", "400047006": "D3-8005B", "400210000": "DF-003E5", "401303003": "D3-15119", "401314000": "D3-1511A", "402603005": "D0-2202B", "403598008": "F-A219C", "403618004": "D0-3002F", "404029005": "DF-006C1", "404640003": "F-06017", "404684003": "R-005AE", "404713008": "C-B10C4", "404846007": "C-B014D", "405269005": "R-305CE", "405277009": "J-005E6", "405279007": "J-005E8", "405738005": "G-A12F", "405739002": "G-A132", "406452004": "C-13036", "406660008": "L-8C339", "406663005": "L-8B102", "406711007": "L-8A106", "406714004": "L-8A10C", "406715003": "L-8A10D", "406721004": "L-8A10F", "406722006": "L-8C33A", "406723001": "L-93791", "406725008": "L-88106", "406733009": "L-001DE", "406951002": "C-22836", "406952009": "C-22837", "406953004": "C-2283A", "406955006": "C-2283C", "406957003": "C-2283E", "406958008": "C-2283F", "406959000": "C-22840", "406960005": "C-22847", "406961009": "C-2284A", "406964001": "C-2284B", "406965000": "C-2284C", "406966004": "C-2284D", "406967008": "C-2284E", "406968003": "C-2284F", "406969006": "C-22850", "406971006": "C-2285B", "406972004": "C-2285C", "406973009": "C-2285D", "406974003": "C-2285E", "406975002": "C-2285F", "406976001": "C-22860", "406977005": "C-2286A", "406980006": "C-2286C", "406981005": "C-2286D", "406982003": "C-2286E", "406983008": "C-2286F", "406985001": "C-2287A", "406986000": "C-2287B", "406988004": "F-61DA5", "406989007": "C-2287D", "406990003": "C-2287E", "406991004": "C-2287F", "406992006": "C-22880", "406993001": "C-2288A", "406995008": "C-2288D", "407402001": "L-8A105", "407559004": "F-03F6E", "407744008": "A-010D2", "407976008": "C-B0415", "408379005": "F-04A13", "408551003": "R-214DD", "408573005": "F-04AB2", "408574004": "F-04AB3", "408643008": "D0-F0369", "408645001": "DF-00736", "408678008": "DD-67703", "408703009": "R-101B0", "408704003": "R-101B2", "408705002": "R-101AF", "408706001": "R-101AD", "408707005": "R-101B3", "408709008": "R-101B5", "408710003": "R-101B6", "408714007": "R-101BA", "408715008": "R-101BB", "408716009": "R-101BC", "408720008": "R-101C0", "408723005": "R-101C3", "408724004": "R-101C4", "408725003": "R-101C5", "408726002": "R-101C6", "408730004": "G-C32C", "408732007": "G-C32E", "408734008": "R-10229", "408742009": "R-10223", "408744005": "R-1022D", "408745006": "R-10227", "409105003": "C-B10A5", "409477004": "C-B0493", "409484007": "C-B0303", "409549005": "F-61E5A", "409586006": "F-04BA9", "409595003": "F-61E79", "409599009": "F-0061F", "409600007": "R-41E4D", "409603009": "R-41E4E", "409604003": "R-41E4F", "409605002": "R-41E50", "409615008": "T-D04AC", "409673008": "F-04BC1", "409688003": "R-305D3", "409712001": "D3-1081C", "409774005": "M-0100C", "409783000": "R-10239", "409897002": "R-10219", "409898007": "R-1021A", "409899004": "R-1021C", "409900009": "R-1021E", "409901008": "R-1021D", "409902001": "R-1021F", "409903006": "R-1021B", "409905004": "L-80108", "409906003": "L-8B947", "409908002": "L-8B948", "409914009": "L-8880B", "409926004": "L-88107", "410006001": "P2-015A2", "410429000": "D3-3002F", "410430005": "D2-60262", "410434001": "R-1022A", "410435000": "R-1022B", "410436004": "R-1022C", "410437008": "R-1022E", "410438003": "R-1022F", "410439006": "R-10231", "410461001": "R-1020E", "410462008": "R-1020F", "410463003": "R-10211", "410464009": "R-10213", "410465005": "R-10215", "410466006": "R-10217", "410467002": "R-10218", "410516002": "G-A46B", "410652009": "R-005B3", "410668003": "G-D7FE", "410674003": "G-A1FF", "410675002": "G-C340", "410679008": "G-A206", "410685001": "R-1023E", "410686000": "R-1023B", "410687009": "R-1023D", "410688004": "R-1023A", "410689007": "R-1023C", "410726006": "T-D0829", "410937004": "F-61E2A", "412155002": "F-61DF9", "412228003": "F-61E1C", "412248005": "C-37152", "412548006": "F-61F48", "413322009": "F-04B88", "413464008": "S-0004E", "413488005": "L-8880C", "413490006": "S-0004B", "413530006": "R-102DD", "413581001": "S-0004C", "413582008": "S-00051", "413600007": "S-00052", "413773004": "S-0003D", "413815006": "P0-05DA0", "413854007": "J-0714B", "413896006": "R-10258", "413912008": "R-102DA", "413975003": "R-1025E", "413985002": "R-102BA", "413996005": "R-1025B", "414088005": "R-102B3", "414089002": "R-102B5", "414135002": "R-10260", "414165007": "R-102AE", "414298005": "R-102C0", "414368000": "R-1025A", "414369008": "R-10259", "414415007": "R-102B7", "414416008": "R-102B8", "414417004": "R-102B6", "414481008": "S-0003E", "414485004": "R-305D6", "414493004": "R-102CA", "414497003": "R-102BE", "414545008": "D3-10030", "414576002": "R-102B9", "414582004": "P1-A3846", "414599003": "R-1025F", "414617007": "R-102B2", "414722000": "R-1024F", "414723005": "R-10251", "414752008": "S-00043", "414795007": "D3-1070D", "415070008": "R-102B4", "415076002": "G-03D3", "415144009": "R-10253", "415145005": "R-10255", "415229000": "S-0004D", "415506007": "J-0714A", "415582006": "M-3400A", "415637004": "R-102BB", "415646005": "R-102BD", "415670009": "R-102C9", "415684004": "G-A47B", "415690000": "F-400A9", "415704007": "C-B1133", "415770004": "R-102BF", "415814008": "R-1025D", "415815009": "R-1025C", "415816005": "R-102DB", "415817001": "R-102DC", "416061003": "R-FAB5E", "416152001": "R-FAB53", "416190007": "R-FAB5C", "416319003": "R-FAB54", "416323006": "P5-0A00D", "416430001": "R-FAB5B", "416471007": "G-03E5", "416550000": "R-FAB55", "416567007": "R-FAB5A", "416631005": "R-FAB58", "416775004": "R-FAB56", "416804009": "T-D9713", "416840006": "L-88108", "416885007": "L-8077B", "416940007": "P0-099CB", "416949008": "R-FAB57", "417012009": "L-8B103", "417136005": "A-10029", "417277001": "L-8880D", "417324009": "F-CB902", "417437006": "R-FAB52", "417696007": "C-6A148", "417746004": "DF-00777", "418326009": "F-D7011", "418363000": "F-A21A7", "418433008": "R-305EB", "418760000": "F-6205D", "418799008": "R-005E0", "418903008": "P5-00A25", "419099009": "F-04DA1", "419176008": "T-D04F2", "419416005": "P5-00A34", "419442005": "C-21047", "419475002": "F-04D55", "419545005": "P5-00A5C", "419670003": "M-33415", "419775003": "F-04D54", "419804008": "C-B1134", "420050001": "F-04D53", "420223003": "R-305EA", "420287000": "R-F2C86", "420300004": "F-3018B", "420303002": "F-C0101", "420572009": "A-17454", "420800007": "T-C4753", "420827006": "A-00FF4", "420913000": "F-3018D", "421060004": "T-D04FF", "421148003": "F-620E8", "421335007": "A-17452", "421624008": "T-C471E", "421704003": "F-3018C", "421861001": "T-C4722", "421974008": "R-41564", "421988007": "T-C471F", "422061002": "DA-7931D", "422293003": "F-3018E", "422534007": "R-40A95", "422540000": "C-B07DC", "422568001": "R-40A92", "422587007": "F-04E95", "422598008": "C-B07E1", "422653006": "T-54282", "422670003": "R-40A88", "422685009": "P2-3110A", "422763008": "C-B07E2", "422789008": "C-B07E7", "422795009": "R-40A93", "422855001": "C-B07DB", "422861003": "R-40A89", "422915004": "A-010D8", "422934004": "C-127A5", "422954003": "R-40A98", "422975006": "C-B07DF", "422980002": "C-B07E8", "422996004": "R-40A99", "423091003": "R-40A8A", "423185002": "T-54302", "423249007": "C-114AA", "423331005": "T-54432", "423498000": "C-B07DD", "423543007": "C-B07DE", "423546004": "C-B07E4", "423578007": "C-1018D", "423720000": "R-40A94", "423764008": "C-135A4", "423926000": "L-804C0", "423937004": "T-54462", "424045003": "D4-31B68", "424064009": "P2-31107", "424079002": "C-163AA", "424086005": "R-40A90", "424111008": "L-804B0", "424118002": "C-163AD", "424225000": "P2-31108", "424299003": "C-163AB", "424318009": "C-163AC", "424361007": "G-C350", "424399000": "T-54292", "424444005": "P2-31109", "424570009": "C-B1135", "424575004": "T-54452", "424622008": "F-04ECE", "424655003": "R-40A8F", "424705003": "L-801E8", "424708001": "C-B07E0", "424789007": "C-B07E5", "424811006": "R-40A8B", "424875009": "C-1018C", "424877001": "T-54272", "424952003": "DF-007B5", "424962005": "R-40A8C", "424979004": "P0-05DE2", "425030002": "R-40A91", "425035007": "R-40A96", "425042007": "R-40A97", "425106001": "T-54442", "425118005": "L-804A0", "425141002": "F-04ECF", "425157002": "R-40A8D", "425181009": "L-8B949", "425188003": "R-40A8E", "425236000": "C-B07E3", "425253007": "L-80495", "425364008": "C-127A4", "425647002": "T-D0859", "425704008": "P0-02241", "425767004": "P5-C0641", "425808002": "P2-3120C", "426005005": "P5-080C2", "426252008": "P5-0905E", "426347000": "P0-00C29", "426439001": "R-3060E", "426571006": "L-8810A", "426865009": "P0-02242", "426940008": "P5-30045", "427136006": "L-8A114", "427667007": "T-A0149", "427732000": "F-04F74", "427751006": "F-04F76", "427858005": "G-0401", "427886002": "P1-36993", "427986001": "G-4044", "427989008": "F-380B2", "427990004": "F-04F84", "428053000": "G-0416", "428196007": "D3-10711", "428247006": "R-40AA7", "428417006": "F-380B3", "428420003": "F-04F92", "428531008": "F-04F9F", "428549008": "F-38793", "428550008": "F-38287", "428552000": "F-04FA0", "428604001": "P0-05E3D", "428613004": "P1-080B4", "428628004": "F-04FA5", "428630002": "F-04FA6", "428685003": "P2-3110B", "428691001": "R-40AA8", "428750005": "F-38794", "428752002": "G-044D", "428813002": "P2-31011", "428824000": "R-215D5", "428825004": "R-215D6", "428832008": "F-04FB4", "428920008": "F-04FB8", "428927006": "R-215D9", "428995007": "P3-05013", "429024007": "G-0477", "429058004": "R-215DC", "429060002": "P7-00044", "429157007": "F-04FCA", "429160000": "F-04FCC", "429162008": "F-04FCD", "429163003": "P2-3120E", "429198000": "D3-0200B", "429232006": "R-215DE", "429296007": "C-B07EC", "429382003": "F-04FD3", "429391004": "R-215E0", "429477006": "R-215E1", "429479009": "P0-099EB", "429483009": "F-04FD8", "429551001": "G-4045", "429557002": "G-4046", "429559004": "D3-13037", "429560009": "A-1002A", "429561008": "D3-0400A", "429576000": "F-04FE3", "429616001": "P1-30A31", "429619008": "F-04FE5", "429620002": "P0-00C6B", "429622005": "F-38279", "429710001": "D4-31124", "429733000": "F-33019", "429740004": "G-04C5", "429884006": "P5-B300C", "430028007": "F-6220F", "430091005": "G-04E3", "430276001": "C-163B0", "430346005": "T-1A403", "430757002": "T-4858F", "430821002": "C-12916", "430854000": "P3-4500A", "430855004": "T-1A404", "430856003": "G-8439", "430861001": "G-843A", "430862008": "F-62219", "430863003": "F-6221A", "430864009": "F-6221B", "430970004": "G-843B", "431196006": "G-843C", "431491007": "T-7000B", "431510009": "C-2141B", "431511008": "P5-D300B", "431609005": "P0-00CA7", "431852008": "P5-B300F", "431938005": "T-7000C", "432062000": "C-80012", "432554001": "F-05018", "432655005": "F-05019", "432678004": "F-0501A", "433139009": "P5-0907F", "433231002": "P5-B3090", "433232009": "P0-05F95", "433233004": "P5-B3050", "433235006": "P5-B8215", "433236007": "P5-B3012", "433338005": "F-62231", "433452008": "P3-40003", "433454009": "P3-40004", "433455005": "P3-40005", "433456006": "P3-40006", "433457002": "P3-40009", "433465004": "P3-4000A", "433466003": "A-0101B", "433469005": "F-62232", "433470006": "P3-4000B", "433471005": "F-62233", "433472003": "A-0101D", "433473008": "F-62234", "433474002": "F-62235", "434161005": "F-05028", "434162003": "C-2141C", "434295000": "F-62238", "434464009": "A-0101E", "434472006": "P3-4000D", "434473001": "A-0101F", "434474007": "P3-4000E", "434475008": "P3-4000F", "434479002": "P3-40011", "434533009": "A-01021", "434708008": "A-01022", "434711009": "A-01023", "434746001": "A-01024", "434822004": "A-01025", "438949009": "F-05036", "439470001": "D1-50666", "439858009": "P5-B0128", "440223009": "C-178FF", "440252007": "PA-30029", "440258006": "P0-06072", "440565004": "R-21604", "440935004": "P0-099F5", "441480003": "S-8000A", "441505008": "R-40AA9", "441509002": "R-00728", "441548002": "R-30616", "441555000": "R-40AAA", "441662001": "R-3061B", "441672003": "R-40AAC", "441676000": "P0-00E0B", "441752004": "P2-00161", "441850003": "T-D0874", "441901008": "M-32704", "441950002": "R-3061D", "441994008": "R-3061E", "442100006": "T-540ED", "442123009": "P1-3180D", "442170005": "T-50153", "442274007": "T-540EE", "442441009": "R-40AB0", "442580003": "R-40AB2", "442581004": "R-40AB3", "442582006": "R-40AB4", "442583001": "R-40AB5", "442585008": "R-40AB6", "442586009": "R-40AB7", "442587000": "R-40AB8", "442588005": "R-40AB9", "442589002": "R-40ABA", "442590006": "R-40ABB", "442591005": "R-40ABC", "442592003": "R-40ABD", "442593008": "R-40ABE", "442595001": "R-40AC0", "442596000": "R-40AC1", "442597009": "R-40AC2", "442598004": "R-40AC3", "442599007": "R-40AC4", "442600005": "R-40AC5", "442601009": "R-40AC6", "442602002": "R-40AC7", "442603007": "R-40AC8", "442604001": "R-40AC9", "442605000": "R-40ACA", "442606004": "R-40ACB", "442607008": "R-40ACC", "442608003": "R-40ACD", "442609006": "R-40ACE", "442610001": "R-40ACF", "442611002": "R-40AD0", "442612009": "R-40AD1", "442621005": "R-40AD2", "442622003": "R-40AD3", "442623008": "R-40AD4", "442624002": "R-40AD5", "442625001": "R-40AD6", "442626000": "R-40AD7", "442627009": "R-40AD8", "442628004": "R-40AD9", "442629007": "R-40ADA", "442630002": "R-40ADB", "442631003": "R-40ADC", "442632005": "R-40ADD", "442636008": "R-40ADE", "442637004": "R-40ADF", "442638009": "R-40AE0", "442639001": "R-40AE1", "442641000": "R-40AE3", "442643002": "R-40AE4", "442644008": "R-40AE5", "442645009": "R-40AE6", "442657000": "R-40AE8", "442658005": "R-40AE9", "442659002": "R-40AEA", "442660007": "R-40AEB", "442661006": "R-40AEC", "442674000": "R-40AEE", "442675004": "R-40AEF", "442685003": "D5-000C0", "442688001": "F-05166", "442690000": "R-40AF0", "442691001": "F-05167", "442700003": "F-0516A", "442704007": "F-0516C", "442707000": "F-0516E", "442711006": "F-05170", "442714003": "F-05173", "442721003": "R-40AF1", "442726008": "F-05179", "442729001": "R-40AF2", "442730006": "R-40AF3", "442738004": "R-40AF4", "442739007": "R-40AF5", "442740009": "R-40AF6", "442741008": "R-40AF7", "442742001": "R-40AF8", "442743006": "R-40AF9", "442744000": "R-40AFA", "442745004": "R-40AFB", "442746003": "R-40AFC", "442747007": "R-40AFD", "442748002": "R-40AFE", "442755000": "F-0517E", "443082005": "G-0577", "443083000": "G-0578", "443096004": "T-D0877", "443100003": "R-40AFF", "443113009": "T-D0878", "443115002": "F-8612F", "443160001": "G-0579", "443162009": "R-40B00", "443163004": "R-40B01", "443167003": "T-42102", "443168008": "F-0518A", "443208000": "M-2460C", "443260009": "T-D0879", "443271005": "P5-080FF", "443281009": "T-42304", "443283007": "T-D087A", "443297004": "T-D087B", "443298009": "T-D087C", "443325000": "R-0077C", "443326004": "T-D087D", "443327008": "T-D087E", "443328003": "T-D087F", "443329006": "M-20102", "443379009": "D4-31125", "443444008": "M-2460D", "443445009": "M-20103", "443461006": "DD-66228", "443482000": "D3-0200C", "443499004": "G-057B", "443500008": "G-057C", "443501007": "R-421AA", "443562002": "G-057D", "443591004": "T-F6858", "443609003": "G-057E", "443625008": "T-D0880", "443635002": "G-E479", "443640005": "R-40B0A", "443696003": "T-D0881", "443698002": "R-40B0E", "443705001": "T-F6859", "443714006": "T-48505", "443724003": "T-D0882", "443726001": "T-D0883", "443789005": "T-D0884", "443808008": "T-C430B", "443809000": "T-D0885", "443829004": "P0-06135", "443895001": "G-0584", "443907004": "T-D0886", "443989003": "P1-36994", "444001009": "P1-36995", "444034006": "P1-36996", "444161008": "G-0586", "444177009": "T-D0887", "444178004": "P1-36997", "444329004": "T-D0888", "444361000": "R-40B10", "444371003": "R-40B11", "444379001": "R-40B12", "444389002": "R-40B1B", "444392003": "R-40B1C", "444408007": "DF-00BB4", "444469002": "R-40B21", "444471002": "F-051DF", "444474005": "F-051E0", "444488009": "F-051E3", "444489001": "F-051E4", "444496004": "F-051E5", "444503000": "F-051E6", "444504006": "F-051E7", "444505007": "F-051E8", "444808002": "D7-F047C", "444850002": "G-D1E4", "444883009": "C-101E8", "444923006": "C-101E9", "444968003": "P5-08123", "445084008": "A-010DA", "445169002": "A-010DC", "445185007": "P1-103D3", "445254006": "A-010DD", "445278001": "A-010DE", "445279009": "A-010DF", "445282004": "A-00D87", "445316008": "A-0010F", "445340000": "A-010E0", "445391002": "A-010E1", "445465004": "A-010E2", "445601002": "A-00118", "445621001": "A-0011A", "445622008": "A-0011B", "445623003": "A-0011C", "445624009": "A-0011D", "445625005": "A-0011E", "445633006": "A-0011F", "445634000": "A-00120", "445635004": "A-00121", "445663002": "A-00123", "445671003": "A-00124", "445679001": "A-00125", "445683001": "A-00126", "445685008": "A-00127", "445769006": "R-F2CB6", "445907001": "P0-00F46", "446078004": "P0-00F6A", "446315002": "P5-70694", "446406008": "R-40B32", "446534003": "C-163B6", "446536001": "C-163B8", "446800006": "C-145AA", "446871009": "C-145AB", "447122006": "R-F2CD4", "447125008": "C-163B9", "447126009": "C-163BA", "447127000": "C-163BB", "447128005": "C-163BC", "447134003": "C-114AB", "447295008": "R-40644", "447482001": "L-87830", "447553000": "C-101ED", "447612001": "L-87831", "447996002": "P0-06211", "448169003": "L-00376", "448216007": "DF-00BEA", "448442005": "P2-22933", "448771007": "L-88124", "448895004": "P1-0329D", "449310008": "L-88423", "450960006": "T-D6515", "456992002": "C-E0273", "456995000": "C-E0269", "456997008": "C-E0267", "456999006": "C-E0265", "457000009": "C-E026A", "464557001": "R-FCBB8", "464983000": "R-FCE69", "465380004": "R-FDF65", "466556008": "R-FCF46", "467354001": "R-FDF5C", "468192005": "R-FDB79", "468440006": "R-FD5EB", "468886001": "R-FCDDB", "469266003": "R-FCAEF", "470091001": "R-FECEC", "470204007": "R-FD178", "473188002": "DF-1147C", "609638001": "P1-12033", "698247007": "R-FAE6C", "698348000": "R-FAED1", "699453001": "R-FB322", "699503005": "R-FB354", "699505003": "R-FB356", "699507006": "R-FB358", "699508001": "R-FB359", "699509009": "R-FB35A", "699510004": "R-FB35B", "699511000": "R-FB35C", "699891005": "R-FB4D8", "699886009": "R-FB4D3", "699893008": "R-FB4DA", "699900002": "R-FB4E1", "699909001": "R-FB4EA", "699914002": "R-FB4EF", "699915001": "R-FB4F0", "699919007": "R-FB4F4", "699935000": "R-FB504", "700032006": "R-FB565", "700423003": "R-FB79B", "701933006": "R-FCC16", "702369008": "R-FB829", "702391001": "R-FB83F", "702569007": "R-FB8F1", "702767007": "R-FB9B7", "703707001": "R-FBD63", "703842006": "R-FBDEA", "705541005": "R-FEAEC", "706247001": "R-FCCF2", "706342009": "R-FE0C7", "706440002": "R-FEEFF", "706484002": "R-FDCFF", "706683002": "R-FEEC3", "706699008": "R-FE814", "707009005": "R-FC4CC", "707010000": "R-FC4CD", "707011001": "R-FC4CE", "707012008": "R-FC4CF", "707013003": "R-FC4D0", "707014009": "R-FC4D1", "707015005": "R-FC4D2", "707016006": "R-FC4D3", "707017002": "R-FC4D4", "707018007": "R-FC4D5", "707021009": "R-FC4D8", "707022002": "R-FC4D9", "707023007": "R-FC4DA", "707024001": "R-FC4DB", "707025000": "R-FC4DC", "707026004": "R-FC4DD", "707028003": "R-FC4DF", "707029006": "R-FC4E0", "707030001": "R-FC4E1", "707031002": "R-FC4E2", "707032009": "R-FC4E3", "707033004": "R-FC4E4", "707035006": "R-FC4E6", "707036007": "R-FC4E7", "707037003": "R-FC4E8", "707038008": "R-FC4E9", "707039000": "R-FC4EA", "707041004": "R-FC4EC", "707042006": "R-FC4ED", "707043001": "R-FC4EE", "707044007": "R-FC4EF", "707045008": "R-FC4F0", "707046009": "R-FC4F1", "707047000": "R-FC4F2", "707048005": "R-FC4F3", "707049002": "R-FC4F4", "707052005": "R-FC4F7", "707054006": "R-FC4F9", "707055007": "R-FC4FA", "707056008": "R-FC4FB", "707057004": "R-FC4FC", "707058009": "R-FC4FD", "707059001": "R-FC4FE", "707060006": "R-FC4FF", "707061005": "R-FC500", "707062003": "R-FC501", "707063008": "R-FC502", "707064002": "R-FC503", "707065001": "R-FC504", "707066000": "R-FC505", "707067009": "R-FC506", "707068004": "R-FC507", "707266006": "R-FC5CD", "707357005": "R-FC628", "708174004": "R-FF0C4", "709280007": "A-A23F4", "709853007": "L-DA692", "710864009": "D3-80086", "711101009": "R-FF2E7", "711329002": "DF-11510", "712714000": "C-F06BC", "712736002": "C-D6858", "714754004": "T-F6724", "714759009": "T-F6713", "714797009": "P3-78326", "715056000": "T-D08DC", "716659002": "R-FF982", "716891004": "R0-00017", "716892006": "R-FFFF2", "716893001": "R-FFFDC", "716894007": "R-FFFBE", "716895008": "R0-00020", "716896009": "R0-00000", "716897000": "R-FFFD6", "716898005": "R-FFFB1", "716899002": "R-FFFB7", "716900007": "R-FFFD0", "716901006": "R-FFFFC", "716902004": "R0-00018", "716903009": "R-FFFC4", "716904003": "R-FFFE2", "716905002": "R0-00001", "716906001": "R0-0001E", "716907005": "R-FFFC2", "716908000": "R-FFFE0", "716909008": "R0-00004", "716910003": "R0-00027", "716911004": "R-FFFB6", "716912006": "R-FFFD5", "716913001": "R-FFFF4", "716914007": "R0-00013", "716915008": "R-FFFC9", "716916009": "R-FFFAB", "716917000": "R0-0000F", "716918005": "R-FFFE6", "716919002": "R-FFFCD", "716920008": "R-FFFB0", "716921007": "R0-0000C", "716922000": "R-FFFE9", "716923005": "R-FFFD4", "716924004": "R-FFFB5", "716925003": "R0-0001B", "716926002": "R-FFFFD", "716927006": "R-FFFDF", "716928001": "R-FFFC1", "716929009": "R-FFFA9", "716930004": "R0-00006", "716931000": "R-FFFE5", "716932007": "R-FFFF3", "716933002": "R0-00014", "716934008": "R-FFFB3", "716935009": "R-FFFD3", "716936005": "R0-00003", "716937001": "R0-00025", "716938006": "R-FFFC0", "716939003": "R-FFFDD", "716940001": "R-FFFEA", "716941002": "R0-0000B", "717025007": "R0-00024", "717027004": "R-FFFD9", "717193008": "R-FFB4A", "719178004": "R0-0039D", "721904001": "R0-00B43", "722859001": "R0-012CB", "723265000": "R0-01469", "321000119108": "R-FAC46", "1251000119106": "R-FAC47", "2171000124100": "D4-510C6", "2181000124102": "D4-510C8", "2191000124104": "D4-510C4", "2201000124101": "D4-510C3", "2211000124103": "D4-510C7", "2221000124106": "D4-510BF", "2231000124109": "D4-510BE", "2241000124104": "D4-510C9", "2251000124102": "D4-510BD", "2261000124100": "D4-510C5", "2271000124107": "D4-510B9", "2281000124105": "D4-510B6", "2291000124108": "D4-510B4", "2301000124109": "D4-510B7", "2311000124107": "D4-510BC", "2321000124104": "D4-510AF", "2331000124101": "D4-510BB", "2341000124106": "D4-510AE", "2351000124108": "D4-510B8", "2361000124105": "D4-510BA", "2371000124103": "D4-51089", "2381000124100": "D4-5108E", "2391000124102": "D4-51088", "2401000124100": "D4-510AC", "2411000124102": "D4-510AD", "2421000124105": "D4-510AA", "2431000124108": "D4-5108A", "2441000124103": "D4-5108D", "2451000124101": "D4-5108C", "2461000124104": "D4-510A9", "2471000124106": "D4-5108B", "2481000124109": "D4-5108F", "2491000124107": "D4-510AB", "2501000124104": "D4-510A8", "2511000124101": "D4-51090", "2521000124109": "D4-5109F", "2531000124107": "D4-51058", "2541000124102": "D4-5106B", "2551000124100": "D4-5105F", "2561000124103": "D4-5105B", "2571000124105": "D4-5105E", "2581000124108": "D4-51087", "2591000124106": "D4-5105A", "2601000124103": "D4-5105D", "2611000124100": "D4-5106D", "2621000124108": "D4-51073", "2631000124106": "D4-51059", "2641000124101": "D4-5106E", "2651000124104": "D4-5106C", "2661000124102": "D4-51071", "2671000124109": "D4-5105C", "2681000124107": "D4-5106F", "5811000122108": "C-E0241", } mapping["SRT"] = { "T-B7000": "111002", "C-B1123": "125001", "C-B1021": "187006", "S-101A9": "270002", "A-12010": "271003", "T-C4730": "283001", "L-80861": "300004", "T-02483": "315003", "T-32830": "345000", "D3-10800": "368009", "L-80156": "400003", "C-22972": "432003", "C-B1010": "439007", "T-A7093": "461002", "T-59440": "485005", "L-80833": "507002", "G-A443": "524008", "L-80902": "583000", "T-32410": "589001", "L-80703": "606003", "T-D1213": "661005", "L-80213": "684003", "A-17230": "739006", "T-D1000": "774007", "G-A140": "795002", "C-80330": "796001", "C-29020": "873008", "C-B0325": "925002", "L-80175": "944009", "T-26000": "955009", "T-48780": "976004", "L-80438": "1006005", "T-D1400": "1101003", "L-80462": "1118004", "C-16600": "1166006", "C-81100": "1182007", "T-13640": "1193009", "P0-30450": "1194003", "A-17222": "1211003", "T-A1110": "1231004", "F-10310": "1240000", "L-80419": "1247002", "G-A316": "1250004", "T-24440": "1307006", "G-A371": "1312007", "C-22921": "1346008", "C-114B1": "1368003", "D3-89100": "1386000", "L-80821": "1420005", "T-C46A0": "1439000", "G-A160": "1483009", "L-80715": "1514007", "M-01470": "1522000", "T-117BB": "1537001", "T-11730": "1626008", "G-F212": "1663004", "F-61470": "1710001", "T-C6510": "1732005", "L-80461": "1789009", "L-80A40": "1809004", "T-55255": "1849007", "D4-48014": "1896004", "T-02200": "1902009", "T-42510": "1918003", "M-95913": "1929004", "L-80840": "1974006", "C-131A2": "2008008", "T-C5140": "2048000", "T-02214": "2059009", "L-80770": "2062007", "C-22898": "2088005", "M-87203": "2092003", "T-22000": "2095001", "M-91200": "2099007", "L-80341": "2124007", "C-22831": "2159007", "T-42370": "2160002", "S-10154": "2272004", "A-04830": "2282003", "C-14600": "2309006", "T-72100": "2334006", "T-54410": "2400006", "M-88003": "2424003", "T-1173B": "2620004", "C-115A2": "2705002", "T-83400": "2739003", "T-A7010": "2748008", "T-12711": "2812003", "T-46600": "2841007", "C-21624": "2869004", "C-B1302": "2942001", "M-85403": "2985005", "C-122A5": "3027009", "C-B1207": "3040004", "T-A0140": "3058005", "L-80345": "3099004", "T-29000": "3120008", "T-46180": "3159004", "L-80146": "3216001", "T-43107": "3227004", "T-28220": "3236000", "T-C4660": "3243006", "L-80568": "3260001", "F-63390": "3325005", "L-80778": "3347005", "L-80A15": "3354004", "C-A6700": "3361000", "M-04100": "3415004", "J-06173": "3430008", "L-80347": "3566006", "G-A108": "3583002", "L-80A08": "3653002", "L-80876": "3674001", "C-13000": "3829006", "M-83143": "3839000", "T-C4110": "3916005", "L-80707": "3921008", "T-46210": "3924000", "C-127A2": "3932008", "T-A2594": "3937002", "T-AA940": "3954005", "T-A2920": "3960005", "L-80A30": "3995008", "L-80450": "3997000", "T-81230": "4019005", "L-80A57": "4042003", "M-03000": "4147007", "T-49620": "4258007", "T-14050": "4317002", "C-81120": "4382004", "F-20250": "4386001", "T-E0000": "4421005", "T-F6845": "4432005", "P2-10700": "4525004", "D3-33000": "4554005", "D3-12700": "4557003", "P0-10210": "4563007", "L-80346": "4574003", "T-02812": "4578000", "T-24100": "4596009", "M-82113": "4631006", "C-22963": "4656000", "T-02305": "4658004", "C-B1012": "4693006", "D7-90420": "4754008", "C-B1208": "4832001", "T-C4800": "4942000", "T-A3230": "4958002", "L-80439": "4960000", "C-22923": "5043000", "T-D3213": "5076001", "T-54230": "5140004", "L-80333": "5164003", "L-80643": "5227002", "M-85030": "5244003", "T-02304": "5272005", "T-C4361": "5296000", "L-80800": "5306005", "T-11640": "5329002", "T-A2570": "5366008", "T-C4690": "5394000", "C-144A6": "5405008", "L-80206": "5438004", "C-22901": "5442001", "F-21301": "5467003", "C-14300": "5540006", "T-AA610": "5665001", "C-B1022": "5692007", "G-A530": "5712003", "T-D1603": "5713008", "T-C4240": "5727003", "T-D3400": "5798000", "P1-48350": "5884001", "L-80777": "5916008", "T-48420": "5928000", "C-B1222": "5931004", "T-1172B": "6004007", "G-A485": "6041008", "L-80563": "6053007", "T-54730": "6062009", "G-D112": "6064005", "L-807C8": "6103004", "L-80151": "6112002", "T-55320": "6217003", "L-80422": "6220006", "T-1115A": "6229007", "C-B1176": "6257000", "C-156A6": "6301006", "T-C4680": "6413002", "T-13610": "6423006", "C-51000": "6425004", "L-80325": "6431001", "D3-31290": "6456007", "T-43122": "6511003", "C-B1065": "6516008", "T-35002": "6530003", "T-59345": "6533001", "T-46130": "6538005", "M-54000": "6574001", "M-72175": "6660000", "C-22841": "6701008", "D7-90428": "6703006", "G-D028": "6706003", "P1-86180": "6708002", "C-22947": "6725000", "G-A002": "6736007", "F-31150": "6797001", "P1-30350": "6832004", "T-A4950": "6866008", "T-39010": "6871001", "T-C0200": "6969002", "C-B1013": "6973004", "G-A397": "7087005", "T-54220": "7121006", "C-B0300": "7140000", "C-B1209": "7281000", "C-B0156": "7292004", "D4-32014": "7305005", "C-22924": "7434003", "P5-D6000": "7562007", "T-D8800": "7569003", "T-117A0": "7610001", "L-80409": "7623008", "T-47400": "7657000", "C-158A6": "7770004", "G-A101": "7771000", "T-42500": "7832008", "L-80141": "7843000", "T-15610": "7844006", "T-02531": "7991003", "T-53010": "8001006", "T-45530": "8012006", "T-32540": "8017000", "L-80463": "8089006", "T-42110": "8128003", "C-135A3": "8202008", "T-D8600": "8205005", "T-32850": "8225009", "C-180A5": "8227001", "T-C4490": "8334002", "C-22934": "8342001", "C-97520": "8348002", "L-807A1": "8351009", "T-C4560": "8356004", "G-D231": "8359006", "M-89400": "8360001", "T-1A170": "8361002", "L-80A20": "8419007", "C-22865": "8429000", "L-80564": "8516002", "S-32070": "8517006", "T-C4400": "8568009", "P1-05052": "8592001", "T-A8500": "8598002", "T-48510": "8629005", "P0-10010": "8715000", "D3-29020": "8722008", "L-80606": "8763002", "T-47630": "8821006", "C-22935": "8836009", "C-B1182": "8858006", "T-54490": "8873007", "T-48620": "8887007", "C-22946": "8926000", "T-C4810": "8928004", "T-12282": "8931003", "L-80605": "8970009", "L-80106": "8989009", "T-48720": "8993003", "F-32040": "8997002", "C-22907": "9010006", "D0-22100": "9014002", "T-59420": "9040008", "L-80801": "9131007", "L-80642": "9135003", "T-1178B": "9188009", "C-97580": "9190005", "L-80209": "9230001", "P3-05000": "9265001", "L-80142": "9277006", "C-160A3": "9351000", "T-48330": "9454009", "L-80843": "9528004", "T-48611": "9642004", "T-C4280": "9659009", "D7-51010": "9713002", "C-6A180": "9721008", "G-A214": "9726003", "L-80740": "9761009", "T-45190": "9775002", "T-C8000": "9875009", "D4-30000": "9904008", "S-10131": "9947008", "F-10110": "9964006", "L-80824": "10040000", "T-47340": "10119003", "L-80A56": "10136006", "T-62000": "10200004", "T-C4140": "10209003", "C-22806": "10247008", "C-84085": "10249006", "L-80601": "10261003", "T-46700": "10293006", "F-32400": "10337008", "L-80729": "10369004", "M-80502": "10376009", "T-A3800": "10517005", "L-80754": "10544000", "D3-31744": "10626002", "M-97313": "10639003", "L-80A17": "10701001", "C-A2010": "10712001", "C-162A3": "10738001", "C-22958": "10740006", "C-B1142": "10781003", "G-A200": "10828004", "L-807C4": "10842007", "P1-03176": "10849003", "F-10320": "10904000", "F-64460": "10944007", "T-A3200": "11000004", "T-11780": "11068009", "C-22944": "11069001", "G-A171": "11070000", "T-A6620": "11089000", "C-6A16A": "11136004", "F-33750": "11157007", "L-80567": "11161001", "C-22821": "11201005", "T-45520": "11279006", "L-80873": "11477006", "C-13321": "11496005", "F-10130": "11554009", "T-02302": "11584001", "T-A0103": "11628009", "C-22906": "11645004", "M-82003": "11671000", "T-D4240": "11708003", "T-54270": "11712009", "C-10120": "11713004", "G-4022": "11723008", "C-22927": "11727009", "T-C46A1": "11740004", "L-80711": "11746005", "C-22871": "11780008", "D3-29010": "11851006", "G-A114": "11896004", "T-C4365": "11899006", "L-80324": "11967001", "S-101AA": "11993008", "T-11940": "11994002", "C-22943": "12001002", "C-22807": "12030009", "T-46980": "12052000", "L-80882": "12091005", "C-22933": "12119009", "T-48170": "12123001", "G-D109": "12130007", "L-80805": "12131006", "M-95800": "12169001", "T-C4760": "12196003", "C-B0317": "12335007", "L-80430": "12360007", "L-80731": "12390000", "M-78060": "12402003", "L-80609": "12407009", "C-12000": "12503006", "C-13900": "12597001", "T-12740": "12611008", "T-46010": "12691009", "C-22968": "12710003", "T-C4852": "12728001", "T-A0100": "12738006", "P1-14020": "12745006", "T-43212": "12800002", "C-B0326": "12801003", "F-10210": "12852001", "T-11301": "12872006", "T-1242A": "12881000", "T-D6000": "12921003", "T-A7020": "12958003", "C-10122": "12977001", "T-117B0": "12989004", "T-17010": "13024002", "T-32840": "13050003", "P1-03151": "13091001", "C-A7220": "13132007", "T-D8640": "13190002", "D4-31000": "13213009", "C-142A5": "13237009", "L-80841": "13248002", "L-80915": "13284009", "M-58000": "13331008", "T-47600": "13363002", "T-32004": "13383001", "T-32650": "13418002", "T-C4100": "13482005", "L-80455": "13487004", "L-80131": "13544004", "T-AA910": "13561001", "T-F1820": "13576009", "T-43200": "13647002", "T-75000": "13648007", "C-22301": "13652007", "L-D9814": "13653002", "P1-36957": "13662000", "C-22808": "13744001", "F-01380": "13791008", "T-11166": "13881006", "C-15211": "13931001", "L-80339": "13934009", "L-80802": "13942005", "T-A2860": "13958008", "T-C1000": "14016003", "L-80579": "14063001", "C-158A7": "14071002", "A-11100": "14106009", "M-32410": "14156004", "F-10346": "14205002", "L-80848": "14245006", "T-11920": "14293000", "M-76100": "14350002", "G-A111": "14414005", "C-52500": "14443002", "F-10226": "14502000", "T-11307": "14510004", "C-178A8": "14529005", "M-96503": "14537002", "C-22894": "14544006", "C-162A7": "14691008", "T-A3500": "14738005", "T-59000": "14742008", "P1-03130": "14766002", "T-54770": "14770005", "M-80006": "14799000", "F-61380": "14804005", "T-11610": "14806007", "L-80815": "14876008", "T-A7091": "14892003", "F-20010": "14910006", "T-F7001": "14944004", "C-22801": "14958002", "T-D8500": "14975008", "M-92203": "14990007", "L-80A52": "15020009", "T-A8780": "15119000", "A-80230": "15158005", "L-80830": "15171008", "P1-86520": "15415002", "T-54450": "15422005", "T-D4400": "15425007", "L-80663": "15443006", "M-02520": "15454001", "T-87000": "15497006", "G-4043": "15508007", "C-22908": "15529003", "T-14172": "15665001", "T-45270": "15672000", "M-31790": "15690004", "C-63A10": "15698006", "T-46668": "15763003", "T-AA220": "15775008", "T-65000": "15776009", "T-42000": "15825003", "A-2C090": "15869005", "C-22892": "15896008", "T-22100": "15924003", "L-80541": "15961007", "L-80742": "15966002", "L-80212": "16015002", "T-C4470": "16050005", "T-C4740": "16051009", "T-C46A4": "16228004", "T-32637": "16239001", "T-02151": "16251004", "P5-B0000": "16310003", "A-12000": "16349000", "D8-20100": "16356006", "L-80A10": "16528000", "D4-31B24": "16567006", "T-02111": "16621002", "T-A2300": "16630005", "P5-39010": "16736007", "C-22846": "16788000", "T-51305": "16811007", "C-22945": "16836001", "D2-81180": "16838000", "G-D164": "16857009", "F-52840": "16932000", "C-22805": "16943008", "T-15430": "16953009", "F-18010": "16973004", "T-D2220": "16982005", "C-B1140": "17069007", "T-47160": "17137000", "C-22918": "17172002", "T-45600": "17232002", "D3-31740": "17338001", "T-43211": "17269004", "D3-31500": "17366009", "T-45730": "17388009", "T-11308": "17399006", "T-54640": "17505006", "G-A265": "17589002", "C-B1000": "17600005", "G-A460": "17621005", "T-49330": "17623008", "P3-02000": "17636008", "L-80898": "17663009", "C-22A07": "17693003", "L-80651": "17717005", "T-C5000": "17861009", "C-113A1": "17910003", "M-52200": "17941002", "S-10115": "17945006", "T-02621": "17957002", "M-52500": "18016009", "T-18427": "18033002", "P5-40060": "18102001", "T-46422": "18112008", "M-55420": "18115005", "T-11B00": "18149002", "M-57610": "18165001", "L-80524": "18212001", "F-B3000": "18220004", "T-A8040": "18234004", "T-14140": "18346003", "T-52110": "18444004", "T-C3070": "18457007", "T-D9550": "18525008", "T-A1120": "18545000", "D4-31810": "18546004", "P2-35000": "18590009", "T-AA110": "18619003", "T-14120": "18686000", "T-82006": "18857001", "T-91000": "18911002", "P1-C0220": "18946005", "T-23050": "18962004", "C-815E1": "19041007", "L-80750": "19078005", "P5-D2000": "19086005", "T-04003": "19100000", "M-10000": "19130008", "M-30400": "19227008", "D2-61100": "19242006", "D6-90800": "19346006", "L-80427": "19356005", "A-04034": "19443004", "C-B1206": "19495007", "G-A321": "19648000", "M-82110": "19665009", "T-D4210": "19695001", "T-49230": "19715009", "L-80581": "19770007", "M-02530": "19776001", "D2-50000": "19829001", "C-13518": "19893005", "M-95403": "19897006", "A-26800": "19923001", "M-78800": "19928005", "G-A561": "19939008", "D5-80600": "19943007", "M-52240": "19952003", "L-80654": "20044005", "T-49350": "20115005", "C-22858": "20230008", "T-98000": "20233005", "F-A4580": "20262006", "L-80580": "20280002", "T-15311": "20292002", "T-11227": "20298003", "M-02260": "20446002", "T-49240": "20699002", "M-52120": "20717008", "D3-29040": "20721001", "T-12412": "20760004", "T-40050": "20982000", "M-84403": "21008007", "L-80610": "21021000", "L-80837": "21039009", "T-C5330": "21058000", "G-A472": "21114003", "T-12435": "21133008", "F-00100": "21134002", "L-80851": "21150005", "T-A8570": "21161002", "L-80214": "21208000", "F-13060": "21278004", "L-80431": "21295007", "T-58400": "21306003", "M-80453": "21326004", "D3-83660": "21379009", "D7-90434": "21381006", "T-11190": "21387005", "L-80894": "21418008", "T-45170": "21479005", "T-A0090": "21483005", "L-80148": "21553004", "C-114A4": "21572004", "C-107A1": "21576001", "C-22844": "21592006", "G-A425": "21594007", "L-80A14": "21637005", "T-02108": "21672008", "M-91803": "21708004", "L-80A07": "21726001", "T-1A200": "21793004", "T-46427": "21807003", "T-32400": "21814001", "T-D6221": "21844003", "A-26920": "21870002", "T-C46A5": "21875007", "L-80116": "21921002", "C-22959": "21951008", "M-95903": "21964009", "T-53000": "21974007", "C-22896": "22021002", "M-83240": "22024005", "M-32390": "22036004", "M-32201": "22039006", "D7-90370": "22049009", "T-46460": "22083002", "T-54280": "22120004", "T-02471": "22180002", "T-28630": "22270008", "T-45200": "22286001", "D3-15000": "22298006", "F-18002": "22325002", "T-12340": "22356005", "T-54720": "22445006", "L-80540": "22506004", "M-80123": "22687000", "T-13100": "22688005", "M-85733": "22694002", "L-80884": "22697009", "L-80416": "22720009", "C-22913": "22749001", "T-43230": "22765000", "P1-38200": "22778000", "T-13310": "22823000", "P1-48840": "22890008", "P5-11000": "22891007", "C-22854": "22931006", "T-D2000": "22943007", "T-AB700": "22945000", "C-22827": "22968009", "C-B1083": "22979004", "C-B0333": "23053002", "T-45240": "23074001", "F-20130": "23141003", "T-58650": "23153004", "L-807D0": "23159000", "C-12500": "23172004", "T-A1280": "23180006", "T-C4624": "23198005", "T-81270": "23213005", "T-117C0": "23215003", "T-54330": "23226009", "F-10336": "23242002", "T-A2710": "23347006", "T-12430": "23416004", "T-54340": "23427002", "T-49660": "23438002", "T-B3000": "23451007", "M-40000": "23583003", "L-80137": "23629009", "P1-67D40": "23719005", "M-80500": "23730008", "T-02155": "23747009", "T-46410": "23771002", "C-180A2": "23788009", "L-80A00": "23826000", "L-80730": "23995009", "DA-73410": "24010005", "G-A142": "24020000", "G-A100": "24028007", "T-14165": "24062007", "D0-10130": "24079001", "T-12600": "24097009", "C-10110": "24099007", "L-80573": "24111007", "P5-B0008": "24135002", "T-15710": "24136001", "T-04100": "24142002", "F-10100": "24154002", "T-87600": "24162005", "C-22886": "24167004", "C-21919": "24215009", "L-80878": "24299002", "C-146A9": "24301009", "L-80530": "24319000", "M-44150": "24389009", "G-A147": "24422004", "T-02113": "24483006", "G-A003": "24484000", "C-B1221": "24511001", "C-22937": "24516006", "T-02642": "24527008", "T-11106": "24532009", "T-54400": "24573005", "P3-41910": "24587005", "L-80550": "24840008", "C-136A2": "24853006", "G-A491": "24863003", "T-42230": "24865005", "T-C4460": "24889003", "C-B0347": "24891006", "C-22956": "24900003", "T-11120": "24924006", "L-80A54": "24967003", "P2-67017": "24977001", "A-26430": "25062003", "F-A2700": "25064002", "C-22843": "25079009", "C-22909": "25091000", "L-80702": "25097001", "G-A477": "25126001", "L-80765": "25171009", "G-F517": "25173007", "S-101A1": "25211005", "T-A8000": "25238003", "L-80831": "25243005", "T-C4130": "25247006", "L-80823": "25264009", "M-32000": "25322007", "L-80320": "25327001", "T-AB300": "25342003", "C-22A06": "25351006", "L-80464": "25369002", "C-12217": "25419009", "F-32052": "25437005", "T-C4362": "25447008", "T-39050": "25489000", "A-04110": "25510005", "D3-31700": "25569003", "G-4042": "25594002", "L-80306": "25660007", "T-C4250": "25683005", "T-54300": "25748002", "F-64210": "25761002", "T-02831": "25763004", "L-80426": "25813002", "L-80539": "25856007", "G-D209": "25876001", "M-80503": "25910003", "C-22824": "25941002", "T-32820": "25943004", "T-72000": "25990002", "T-A6040": "25991003", "M-34000": "26036001", "P2-31102": "26046004", "L-80A53": "26057009", "F-A4600": "26079004", "L-80143": "26105007", "T-51130": "26140008", "F-38278": "26141007", "D4-31010": "26146002", "C-16400": "26194003", "G-A110": "26216008", "L-80846": "26229008", "T-A2830": "26230003", "G-A660": "26242008", "G-A139": "26283006", "L-80809": "26332008", "C-A7000": "26370007", "L-80A16": "26382003", "T-AA079": "26386000", "A-25350": "26412008", "T-12200": "26444007", "T-11218": "26493002", "C-68030": "26523005", "L-80176": "26525003", "F-10349": "26527006", "L-807A3": "26639007", "G-D140": "26643006", "L-80433": "26699009", "T-49630": "26703007", "T-02665": "26795005", "T-49550": "26805005", "T-47240": "26818002", "L-80407": "26837006", "T-D7000": "26893007", "DD-33500": "26947005", "L-80411": "26973000", "C-22813": "27016007", "C-144A3": "27054007", "A-13500": "27065002", "C-172A5": "27081007", "T-A7070": "27088001", "M-81203": "27090000", "C-22890": "27120008", "L-80A18": "27125003", "G-F175": "27167007", "T-46970": "27175001", "P1-48520": "27315000", "D3-31742": "27337007", "P1-C0200": "27372005", "L-80889": "27385008", "T-D4600": "27398004", "D7-90310": "27431007", "L-80720": "27444002", "P5-00100": "27483000", "A-04200": "27606000", "T-A8150": "27612005", "L-807B3": "27615007", "D4-31B16": "27637000", "C-22A04": "27671009", "T-48502": "27706005", "G-7155": "27789000", "A-2C140": "27812008", "C-22872": "27844007", "T-54650": "27855007", "P3-05050": "27872000", "D3-32102": "27885002", "T-02135": "27887005", "M-03010": "27925004", "T-D4200": "27947004", "T-15770": "27949001", "T-54000": "28035005", "C-B0331": "28121005", "T-42520": "28205006", "T-63000": "28231008", "C-136A5": "28243009", "T-60610": "28273000", "T-C4332": "28330007", "T-AB100": "28347008", "L-80215": "28360002", "T-A5250": "28390009", "T-54500": "28480000", "L-80172": "28483003", "C-22814": "28622002", "T-1177B": "28693002", "T-25201": "28700002", "T-AA200": "28726007", "L-80174": "28744004", "L-80744": "28751008", "T-C4780": "28870006", "M-80703": "28899001", "D0-71000": "28926001", "M-52000": "28960008", "T-48000": "29092000", "M-50080": "29185008", "C-B1061": "29218008", "L-80534": "29223008", "L-80653": "29235007", "C-22A08": "29252006", "C-22899": "29342009", "C-B1251": "29348008", "T-02523": "29353003", "DA-26000": "29426003", "T-AA860": "29445007", "C-B1018": "29460005", "M-52101": "29483008", "C-22951": "29522004", "T-AA400": "29534007", "T-B6100": "29565003", "T-46940": "29660000", "T-46110": "29700009", "T-D9800": "29707007", "T-D2500": "29836001", "T-1234A": "29850006", "F-37000": "29857009", "T-F1800": "29870000", "L-80554": "29881002", "F-39800": "30017007", "T-D9400": "30021000", "T-C4512": "30024008", "L-80216": "30089001", "T-A5271": "30114003", "P1-31846": "30123000", "M-82013": "30156004", "T-1A190": "30180000", "D4-31150": "30288003", "T-58000": "30315005", "L-807C7": "30347000", "L-80113": "30384003", "T-A1700": "30399003", "L-80594": "30448006", "C-72000": "30492008", "T-12450": "30518006", "L-80886": "30565000", "T-02481": "30598005", "T-13600": "30608006", "T-54630": "30618001", "L-80659": "30634003", "L-80525": "30720007", "G-A145": "30730003", "DC-72130": "30746006", "T-C4120": "30793004", "G-A249": "30807003", "L-85B00": "30996001", "T-A2400": "31065004", "L-80875": "31077009", "T-28770": "31094006", "G-A572": "31099001", "M-32700": "31113003", "T-45250": "31145008", "T-32330": "31162003", "T-C4863": "31171007", "M-92200": "31186001", "C-B1122": "31192007", "C-22952": "31260003", "L-80764": "31281003", "C-80460": "31306009", "T-D8650": "31329001", "D7-76200": "31351009", "L-80752": "31377001", "T-55200": "31389004", "L-80791": "31392000", "T-A3100": "31428008", "T-88000": "31435000", "C-B1175": "31527000", "L-80465": "31633003", "T-AA050": "31636006", "T-11140": "31640002", "M-74880": "31653004", "T-47440": "31677005", "T-48770": "31688004", "T-A7061": "31701002", "C-22891": "31714001", "P2-36110": "31724009", "T-14171": "31764008", "C-10520": "31811003", "M-02000": "31842008", "D7-90554": "31845005", "T-12281": "31934006", "C-B1183": "31953001", "L-80881": "31971008", "T-54290": "31982000", "D3-80650": "31996006", "M-81400": "32048006", "T-45100": "32062004", "T-48214": "32114007", "L-80342": "32145006", "F-10318": "32185000", "L-80522": "32297006", "F-39780": "32318003", "T-D9310": "32361000", "G-A170": "32381004", "G-A121": "32400000", "P1-31D00": "32413006", "T-D0070": "32457005", "C-106A1": "32505007", "L-807D3": "32591006", "T-59460": "32622004", "M-52210": "32651000", "L-807B4": "32670005", "T-42400": "32672002", "L-80577": "32683006", "T-59100": "32713005", "T-48810": "32764006", "C-B0338": "32836007", "T-56000": "32849002", "T-48910": "32859001", "M-85103": "32913002", "L-80134": "32938007", "M-85303": "32968003", "T-A6080": "33060004", "G-A144": "33096000", "L-80535": "33212007", "C-80135": "33252009", "C-B1091": "33271006", "T-32633": "33272004", "P5-30100": "33367005", "L-807C2": "33401005", "L-80721": "33458006", "P1-48820": "33496007", "L-80511": "33551003", "T-04005": "33564002", "F-103A0": "33586001", "M-52400": "33593002", "T-32310": "33626005", "T-02650": "33712006", "T-A6630": "33723005", "T-C4720": "33770006", "C-B1095": "33785000", "T-46520": "33795007", "G-A128": "33843005", "M-72105": "33889003", "T-A1502": "33930006", "F-10316": "34026001", "F-10348": "34106002", "F-10410": "34108001", "C-173A7": "34127007", "C-22911": "34128002", "L-80457": "34200004", "T-35400": "34202007", "G-D104": "34206005", "F-10380": "34296003", "T-1243A": "34318004", "T-48003": "34340008", "M-88303": "34360000", "T-59600": "34402009", "T-D6500": "34411009", "T-58600": "34516001", "P1-86100": "34536000", "L-80538": "34595003", "L-8B941": "34618005", "T-C4611": "34625003", "T-46960": "34635009", "C-22883": "34700000", "T-60600": "34707002", "L-80865": "34752004", "A-26864": "34759008", "C-10330": "34763001", "T-C4770": "34775006", "L-80891": "34870009", "M-90160": "34882000", "T-02156": "34926004", "T-117AB": "34959001", "T-83000": "35039007", "C-22815": "35094004", "P5-D0050": "35202002", "L-80118": "35229007", "T-13660": "35259002", "D3-90100": "35304003", "C-B1031": "35321007", "C-131A3": "35337001", "C-22A00": "35352008", "L-8A102": "35354009", "T-48600": "35532006", "M-35060": "35566002", "M-97651": "35601003", "C-22842": "35609001", "P5-D3304": "35621002", "T-A2861": "35664009", "T-C4851": "35721009", "C-22942": "35724001", "T-02853": "35739000", "P5-B3121": "35757004", "T-A1600": "35764002", "T-C4480": "35783009", "L-807A0": "35802007", "T-48890": "35819009", "P1-08080": "35860002", "C-B1109": "35884005", "T-02530": "35900000", "M-81403": "35917007", "T-A1820": "35918002", "T-A1500": "35951006", "C-124B4": "35978008", "T-11660": "36054005", "M-91501": "36060005", "L-80A05": "36074003", "T-C4626": "36086000", "L-80591": "36111002", "D2-80300": "36118008", "T-02121": "36141000", "T-51210": "36152006", "T-A2610": "36169008", "F-6ACA0": "36176003", "L-80658": "36187006", "T-C4500": "36251007", "L-80776": "36274006", "L-80300": "36295001", "T-51200": "36360002", "T-42220": "36371001", "L-807D7": "36438004", "T-12540": "36455000", "T-11930": "36470004", "T-54240": "36492000", "L-80562": "36570001", "L-86B02": "36571002", "C-22864": "36572009", "T-A9090": "36582005", "L-80741": "36611001", "C-B1152": "36641004", "T-43112": "36672000", "T-46100": "36765005", "L-88121": "36855005", "C-22919": "36879007", "C-B1105": "36900006", "P1-33530": "36969009", "T-11650": "36978003", "L-80910": "37024005", "T-A2840": "37035000", "M-44140": "37058002", "T-02141": "37108007", "L-80718": "37116003", "T-D7010": "37117007", "P1-32502": "37153009", "G-D160": "37161004", "G-A180": "37197008", "C-149A1": "37225000", "T-46440": "37274004", "M-55160": "37279009", "T-11211": "37285002", "T-1167B": "37414007", "L-80870": "37453003", "T-B1200": "37512009", "C-22822": "37575004", "T-02136": "37671003", "F-32056": "37706002", "G-D144": "37737002", "D3-33140": "37760005", "T-12390": "37783008", "D5-80140": "37871000", "T-A8820": "37899009", "T-C6020": "38000004", "S-101A2": "38048003", "F-D5000": "38082009", "DA-74110": "38101003", "L-80735": "38184008", "T-54010": "38199008", "G-D106": "38239002", "T-90020": "38242008", "T-D0010": "38266002", "C-22964": "38271009", "D3-02000": "38341003", "C-B0344": "38344006", "T-02213": "38407007", "C-B1181": "38424001", "L-80842": "38449002", "C-22914": "38543004", "A-81080": "38586004", "C-22936": "38707008", "M-94003": "38713004", "G-A143": "38717003", "T-1118B": "38754007", "T-58200": "38848004", "T-D2700": "38864007", "T-D0011": "38866009", "T-54790": "38896004", "C-22825": "38902009", "T-AA820": "38934000", "T-46350": "38991005", "T-54520": "38994002", "M-91203": "39000009", "DA-74100": "39021009", "T-35200": "39057004", "C-B1089": "39200002", "C-12200": "39290007", "T-A8110": "39322007", "L-807D8": "39348004", "T-15001": "39352004", "T-59666": "39477002", "T-54160": "39481002", "F-CB962": "39525005", "L-80435": "39532001", "F-70102": "39539005", "T-28000": "39607008", "T-02487": "39687006", "T-15680": "39723000", "T-28230": "39743006", "C-22861": "39777001", "A-2C141": "39790008", "T-54420": "39844006", "L-80350": "39855006", "L-80877": "39882003", "T-01000": "39937001", "T-11620": "39976000", "T-54510": "40005008", "T-28825": "40020002", "T-02132": "40069000", "C-22852": "40076005", "L-80832": "40121001", "T-A2020": "40146001", "F-10340": "40199007", "T-C4623": "40242007", "P1-31917": "40250003", "T-47260": "40254007", "T-11511": "40265002", "G-A640": "40266001", "T-48940": "40300007", "C-6A16B": "40342009", "A-04010": "40388003", "L-80816": "40400008", "P1-31602": "40403005", "G-A118": "40415009", "L-80A31": "40547002", "C-105A1": "40565003", "P2-22902": "40617009", "T-AA180": "40638003", "T-C4632": "40684008", "T-94000": "40689003", "P5-B3000": "40701008", "C-B0327": "40710000", "C-22876": "40718007", "L-80913": "40727008", "M-78260": "40772000", "D2-60302": "40779009", "C-22863": "40808006", "T-B6300": "40867004", "L-80893": "40898002", "T-1171B": "40908007", "C-114A5": "40937006", "T-D8200": "40983000", "L-80418": "41092008", "T-12717": "41111004", "T-C4613": "41145006", "T-92000": "41216001", "L-80812": "41263004", "T-AA500": "41296002", "D5-80400": "41309000", "T-02131": "41310005", "T-14163": "41313007", "L-80713": "41320000", "D3-12002": "41334000", "P5-D9020": "41440006", "L-80722": "41538003", "C-80150": "41549009", "T-02631": "41550009", "L-80561": "41561001", "L-807A2": "41584008", "F-B2700": "41598000", "T-11309": "41601005", "T-D1160": "41695006", "M-36700": "41699000", "L-80340": "41706005", "L-80436": "41738000", "C-22965": "41750006", "L-80429": "41754002", "C-181A3": "41758004", "T-43000": "41801008", "P5-D6500": "41842006", "T-43202": "41879009", "M-85023": "41919003", "C-13700": "41967008", "P1-31600": "41976001", "L-80500": "42018006", "L-30606": "42024000", "M-52470": "42182000", "C-22809": "42248000", "L-80728": "42250008", "L-807B2": "42252000", "T-46510": "42258001", "T-93020": "42320003", "D3-16010": "42343007", "D7-90364": "42385006", "D7-11010": "42399005", "C-B1300": "42417005", "G-A466": "42425007", "T-C4621": "42472007", "T-D1460": "42575006", "T-D8030": "42694008", "T-A4000": "42695009", "M-02100": "42700002", "L-80410": "42724005", "C-B1070": "42728008", "G-A166": "42798000", "L-80734": "42902003", "T-A2760": "42932006", "L-80608": "42948007", "T-D3160": "42973007", "T-AA862": "43045000", "T-02102": "43067004", "T-02300": "43081002", "C-22915": "43106008", "D0-10100": "43116000", "T-45320": "43119007", "L-80A09": "43219001", "C-116A3": "43239002", "T-54780": "43281008", "M-32310": "43299000", "L-80531": "43500007", "M-18000": "43526002", "L-80A13": "43529009", "C-B0312": "43538006", "C-22912": "43549000", "T-54670": "43622005", "G-A122": "43674008", "F-BB370": "43706004", "T-D3200": "43799004", "T-48530": "43863001", "T-47500": "43899006", "F-F7100": "43914001", "D0-40100": "43982006", "D3-31715": "44103008", "M-41610": "44132006", "L-80115": "44230005", "D3-29001": "44241007", "PA-50030": "44324008", "C-22849": "44488008", "P5-06000": "44491008", "T-25000": "44567001", "P1-48304": "44578009", "C-11400": "44588005", "M-88900": "44598004", "T-11221": "44612009", "T-32550": "44627009", "L-80714": "44696006", "T-28600": "44714003", "D7-90435": "44771000", "P1-31920": "44777001", "T-29100": "44788007", "D3-30000": "44808001", "P1-C0030": "44812007", "T-47650": "44830000", "L-80312": "44835005", "L-80A58": "44855006", "T-A9630": "44909008", "T-C4700": "44914007", "T-14020": "44947003", "T-47200": "44984001", "T-11034": "45001002", "D3-04000": "45007003", "T-D1600": "45048000", "C-22851": "45106005", "T-21000": "45206002", "P1-05535": "45211000", "C-15600": "45215009", "D3-23000": "45227007", "T-54690": "45234009", "L-80149": "45284002", "T-61100": "45289007", "T-81000": "45292006", "T-11760": "45296009", "P5-D0040": "45316007", "T-44100": "45341000", "P2-68060": "45460008", "C-22962": "45475000", "D4-31120": "45503006", "M-78266": "45559001", "L-80762": "45561005", "T-02212": "45591000", "L-80880": "45625009", "T-47300": "45631007", "L-80571": "45635003", "T-28820": "45653009", "L-80334": "45690005", "L-80405": "45790002", "T-B2000": "45793000", "F-20030": "45804006", "C-B1220": "45849009", "S-10164": "45929001", "T-02612": "45981001", "T-48920": "46027005", "T-35100": "46030003", "G-A119": "46053002", "T-C4170": "46055009", "P2-31010": "46136006", "C-22802": "46139004", "T-C4592": "46157003", "M-90300": "46212000", "L-807D4": "46239008", "T-52210": "46353006", "T-1228A": "46385009", "L-80332": "46392004", "L-80451": "46408008", "C-10004": "46602004", "P2-4A000": "46662001", "G-D172": "46713006", "M-88500": "46720004", "L-80912": "46725009", "T-28080": "46750007", "T-D2600": "46862004", "DD-13000": "46866001", "C-22974": "47030008", "T-54470": "47055002", "L-80780": "47075006", "P5-B8500": "47079000", "T-C4300": "47109002", "C-B0345": "47192000", "T-02833": "47224004", "M-88211": "47284001", "G-C002": "47429007", "P1-32504": "47432005", "T-C4850": "47471008", "C-22877": "47486002", "M-85040": "47488001", "L-80814": "47542005", "C-132A8": "47588004", "G-D101": "47625008", "M-52450": "47631006", "L-80712": "47659007", "L-80879": "47699005", "T-12423": "47728000", "C-B1150": "47729008", "L-80574": "47795006", "L-80417": "47842004", "C-80490": "47898004", "T-32636": "47962008", "T-53130": "47975008", "T-C4410": "47985009", "C-22932": "47995002", "T-02500": "48014002", "T-C4822": "48193007", "T-59438": "48338005", "C-151B2": "48341001", "T-48610": "48345005", "T-74250": "48367006", "P1-26100": "48387007", "L-80505": "48394005", "T-54380": "48402004", "M-52100": "48434008", "L-80536": "48470006", "T-52000": "48477009", "L-80803": "48524002", "P5-B0111": "48526000", "C-22885": "48540004", "T-D4120": "48544008", "C-A6530": "48603004", "F-0B320": "48694002", "L-80309": "48697009", "C-80160": "48698004", "L-80145": "48702000", "D3-29012": "48724000", "C-145A5": "48895003", "T-C4150": "48918001", "F-BA070": "48988008", "T-15720": "49076000", "T-48435": "49082002", "L-80644": "49240006", "T-54800": "49330006", "G-A104": "49370004", "T-C4420": "49394004", "T-1164B": "49400002", "L-80904": "49421002", "M-88503": "49430005", "D3-31520": "49436004", "T-51120": "49460000", "L-80576": "49462008", "G-A127": "49530007", "G-A402": "49608001", "T-11950": "49668003", "C-22A11": "49687009", "F-24100": "49727002", "M-01000": "49755003", "T-A1740": "49841001", "T-32620": "49848007", "T-49250": "49852007", "L-30000": "49872002", "C-913A4": "49992008", "C-60700": "49998007", "T-11240": "50016007", "T-43100": "50018008", "C-22889": "50062004", "L-80874": "50125003", "T-C4622": "50193000", "C-A1204": "50318003", "T-44400": "50408007", "L-80A59": "50441005", "T-D4110": "50519007", "T-F1810": "50536004", "C-14700": "50672002", "P1-C0010": "50697003", "DE-38100": "50711007", "L-80308": "50717006", "T-13450": "50755001", "P0-10800": "50849002", "M-74220": "50916005", "D3-26000": "50920009", "L-80173": "50959000", "M-37000": "50960005", "L-80459": "51023000", "T-02217": "51098001", "T-41000": "51114001", "T-13630": "51159009", "T-D3000": "51185008", "T-48540": "51249003", "T-11510": "51282000", "T-11160": "51283005", "T-12310": "51299004", "T-B4000": "51345006", "M-75500": "51398009", "C-10940": "51420009", "G-A102": "51440002", "M-88903": "51549004", "C-22874": "51567006", "D2-04460": "51599000", "M-32320": "51668007", "T-54660": "51678005", "P1-A3102": "51683002", "L-80A42": "51692004", "T-12287": "51698000", "F-10240": "51795009", "C-136B6": "51800004", "F-10326": "51845000", "T-F6800": "51852003", "L-80144": "51937006", "T-54700": "51943008", "C-85800": "52017007", "F-10220": "52019005", "T-02870": "52034004", "T-18010": "52082005", "G-A203": "52101004", "L-80900": "52105008", "A-26810": "52124006", "L-80806": "52253003", "T-49340": "52359001", "T-11156": "52374004", "C-B1111": "52408003", "P3-40140": "52432005", "T-43121": "52433000", "T-11220": "52509009", "T-C4841": "52554005", "T-D2300": "52612000", "T-12746": "52687003", "T-D4010": "52731004", "C-129A2": "52745005", "C-21403": "52836003", "M-32360": "52856002", "T-02641": "52876008", "T-A1710": "52943005", "L-80705": "52946002", "L-807C5": "52952001", "T-02854": "52953006", "M-01100": "52988006", "L-80120": "53031002", "T-D8040": "53036007", "T-C4320": "53074004", "T-32500": "53085002", "T-A1720": "53118009", "T-D8000": "53120007", "M-52130": "53151000", "L-80709": "53228008", "T-A8060": "53238003", "C-128A2": "53315004", "T-21300": "53342003", "A-04000": "53350007", "L-80338": "53360003", "F-8A030": "53430007", "L-80523": "53431006", "P5-C0000": "53438000", "T-59900": "53505006", "C-22812": "53511009", "T-A9605": "53520000", "T-45400": "53549008", "L-80458": "53567001", "P5-D5000": "53585008", "T-48500": "53603007", "P2-22010": "53617003", "T-15290": "53620006", "M-88103": "53654007", "T-43210": "53655008", "C-127A3": "53700003", "T-29200": "53727004", "T-11720": "53733008", "D3-13040": "53741008", "T-D9440": "53840002", "T-D6407": "53843000", "L-807C9": "53922000", "C-B1213": "53951001", "P1-0D300": "53958007", "T-14161": "53967007", "M-32340": "54002007", "T-61300": "54019009", "T-55000": "54066008", "L-80415": "54098002", "G-F211": "54102005", "T-A1520": "54165005", "C-22832": "54221006", "L-80660": "54232006", "T-42100": "54247002", "T-C4600": "54268001", "G-D002": "54300008", "T-45308": "54409005", "C-22961": "54432009", "T-02401": "54440003", "F-63750": "54446009", "L-80424": "54447000", "T-02431": "54468004", "M-35063": "54493002", "P5-32130": "54640009", "L-80408": "54699009", "T-11AD0": "54735007", "C-22811": "54791001", "L-80779": "54858000", "F-32110": "54993008", "G-A555": "55011004", "T-11102": "55024004", "L-807C0": "55058007", "T-22200": "55060009", "C-142B2": "55117002", "L-80414": "55167009", "M-75300": "55199003", "T-A2850": "55233005", "C-B1205": "55494003", "T-12714": "55499008", "L-80211": "55530007", "M-35300": "55584005", "F-01000": "55607006", "C-B1088": "55673009", "T-11512": "55678000", "C-80450": "55745002", "C-B1090": "55814006", "C-22888": "55831004", "D3-90000": "55855009", "F-10330": "55864004", "M-97323": "55921005", "T-C5300": "55940004", "L-80763": "55959002", "M-36050": "56021002", "T-A8410": "56052001", "L-80529": "56084008", "L-80437": "56086005", "T-A8070": "56193007", "M-38000": "56208002", "L-80773": "56243001", "D3-10000": "56265001", "T-B1000": "56329008", "A-13600": "56353002", "T-48740": "56400007", "T-11750": "56401006", "T-D9700": "56459004", "M-91220": "56468002", "C-145A4": "56609000", "P1-03154": "56757003", "D3-29051": "56786000", "T-43205": "56789007", "T-49650": "56849005", "G-A437": "56851009", "T-11210": "56873002", "L-80A41": "56917006", "F-60710": "56953008", "L-80781": "56984005", "T-42300": "57034009", "D3-15100": "57054005", "L-80766": "57120006", "C-20005": "57126000", "A-00110": "57134006", "M-84013": "57141000", "G-0002": "57177007", "G-A174": "57183005", "DA-74120": "57190000", "G-A123": "57195005", "P1-30530": "57238002", "G-D003": "57257006", "L-80743": "57349006", "T-32831": "57383004", "T-43120": "57396003", "L-80771": "57429001", "P2-22500": "57485005", "M-74200": "57597008", "L-80593": "57613003", "T-14030": "57651003", "T-96000": "57671007", "T-02218": "57726007", "C-22857": "57753006", "M-32221": "57754000", "T-43125": "57823005", "T-54250": "57826002", "L-80872": "57849000", "T-46400": "57850000", "L-80862": "57947002", "T-32150": "58095006", "G-D102": "58100008", "L-80844": "58108001", "L-80811": "58116005", "T-C4230": "58130000", "F-39200": "58190003", "L-80440": "58264006", "C-17800": "58281002", "L-80604": "58311005", "F-20020": "58322009", "L-80753": "58341007", "C-155A2": "58541008", "T-D2310": "58602004", "C-22839": "58631000", "T-54740": "58646007", "D3-17100": "58718002", "T-12980": "58742003", "C-22954": "58755002", "T-1163B": "58820006", "L-80887": "58888001", "T-45800": "59011009", "C-A7021": "59057006", "T-11133": "59066005", "C-A7430": "59082006", "F-62750": "59094002", "T-02508": "59112000", "D3-33110": "59118001", "G-A328": "59135002", "L-80335": "59210004", "P1-48830": "59214008", "P2-35440": "59218006", "D3-40230": "59282003", "F-61080": "59351004", "T-43110": "59438005", "T-C4000": "59441001", "L-80774": "59492009", "T-C4160": "59503006", "L-80849": "59528003", "L-807B1": "59643008", "T-32100": "59652004", "L-80572": "59667000", "T-45410": "59749000", "T-A7081": "59752008", "C-16700": "59801003", "T-40000": "59820001", "C-135A2": "59844004", "F-32030": "59972007", "L-807A5": "59975009", "F-81890": "60001007", "T-14110": "60005003", "T-49010": "60028002", "D2-80100": "60046008", "C-138A9": "60057003", "F-10120": "60074003", "T-A2781": "60105000", "DA-76000": "60113004", "G-A366": "60132005", "T-45540": "60176003", "T-59470": "60184004", "G-D107": "60213007", "T-C4614": "60227002", "D3-29022": "60234000", "L-80836": "60252000", "P3-40150": "60287000", "C-22853": "60441008", "C-B1124": "60459006", "T-02850": "60496002", "L-80911": "60517007", "C-A7001": "60533005", "D3-29021": "60573004", "G-A120": "60583000", "S-10161": "60614009", "F-01860": "60621009", "D4-31310": "60732002", "T-49530": "60734001", "C-22957": "60739006", "F-32050": "60797005", "T-D1206": "60819002", "T-42350": "60835009", "T-11130": "60911003", "C-22902": "60920007", "T-02501": "60944009", "L-80620": "60958006", "T-C4670": "60965003", "T-C4002": "60996007", "T-A0610": "61005006", "G-F213": "61026006", "L-80533": "61036003", "C-22926": "61068006", "L-80630": "61083001", "C-2A000": "61088005", "T-AA813": "61242005", "T-02811": "61248009", "L-80835": "61286000", "L-80896": "61320006", "T-17860": "61352006", "G-A172": "61397002", "L-80864": "61405001", "PA-00620": "61420007", "D3-12001": "61490001", "T-C4440": "61492009", "P5-B0700": "61593002", "T-11134": "61671002", "T-D9000": "61685007", "T-1A180": "61695000", "C-173A5": "61716009", "T-02107": "61719002", "PA-00500": "61746007", "L-80A51": "61753003", "C-80401": "61773008", "T-1151F": "61853006", "T-54750": "61868007", "T-54320": "61897005", "C-A0900": "61946003", "D4-31400": "61959006", "T-A5100": "61962009", "A-10150": "61968008", "L-80565": "61973002", "D3-33150": "62026008", "M-90503": "62064005", "D4-31A00": "62067003", "L-80845": "62137007", "L-80112": "62153005", "M-52103": "62189002", "L-80888": "62228004", "S-10116": "62296006", "G-A137": "62372003", "T-12420": "62413002", "C-B0316": "62442005", "G-A374": "62482003", "T-11770": "62487009", "C-B1011": "62517004", "T-1193B": "62551000", "T-15317": "62555009", "T-C4360": "62683002", "T-AA830": "62736007", "L-80807": "62790004", "T-B1100": "62818001", "G-A117": "62824007", "T-50110": "62834003", "T-48286": "62869001", "T-A2980": "62872008", "T-02506": "63029009", "M-78280": "63130001", "G-A332": "63161005", "M-89803": "63264007", "L-80761": "63269002", "A-12020": "63289001", "C-168A4": "63360001", "L-80834": "63390008", "D3-33120": "63467002", "P3-67350": "63476009", "T-48930": "63507001", "A-12210": "63562005", "M-94403": "63634009", "P1-36858": "63697000", "C-16200": "63754004", "T-04080": "63762007", "C-22905": "63929007", "L-80A32": "63972001", "T-71000": "64033007", "T-C4370": "64038003", "C-22878": "64112001", "T-48710": "64131007", "L-80208": "64158000", "T-12730": "64234005", "P5-00032": "64318009", "T-46310": "64468002", "C-B1100": "64488003", "C-A6710": "64520006", "T-C4612": "64556009", "DF-00000": "64572001", "L-80323": "64591001", "T-1274B": "64605006", "DA-75300": "64634000", "T-14166": "64658001", "T-11BF0": "64688005", "D3-02500": "64715009", "F-33300": "64730000", "T-93000": "64739004", "DC-60000": "64779008", "T-11710": "64864005", "G-A648": "64957009", "C-22975": "64991008", "C-141A1": "65054007", "F-61620": "65123005", "M-02570": "65124004", "L-80307": "65187008", "T-35310": "65197004", "T-A1000": "65216001", "P1-86E70": "65240009", "T-C4820": "65266007", "L-80150": "65344003", "C-2A400": "65345002", "T-C4620": "65349008", "T-45110": "65355003", "P5-B8310": "65388005", "T-AA260": "65431007", "C-22897": "65445001", "L-80326": "65492002", "A-2C152": "65577000", "C-22953": "65580004", "T-54620": "65624003", "S-10121": "65656005", "P1-30351": "65659003", "T-C4340": "65690001", "M-80323": "65692009", "L-80A55": "65694005", "G-A324": "65709003", "C-22829": "65730007", "P1-03000": "65801008", "A-25500": "65818007", "M-90100": "65877006", "T-D0300": "66019005", "DE-38010": "66071002", "F-32330": "66130006", "L-80425": "66168008", "T-02414": "66288003", "T-54350": "66303006", "L-80147": "66314009", "P5-D0042": "66377006", "G-A103": "66459002", "L-80738": "66495005", "T-46421": "66559000", "C-F3302": "66562002", "T-02450": "66643007", "D3-31710": "66657009", "L-80727": "66712005", "T-A1650": "66720007", "G-D001": "66739002", "T-59200": "66754008", "G-A107": "66787007", "T-11910": "66794005", "F-24210": "66857006", "C-81590": "66859009", "L-80130": "66911005", "C-12700": "66925006", "T-02152": "66934001", "T-AA621": "67046006", "L-80782": "67088002", "P3-50480": "67122001", "T-41100": "67170007", "P1-31612": "67338003", "D3-83300": "67362008", "L-80311": "67414001", "C-80131": "67440007", "L-80133": "67448000", "T-12780": "67453005", "T-1192B": "67459009", "C-80110": "67507000", "L-80310": "67515002", "M-72170": "67617000", "P1-31604": "67629009", "L-80813": "67684001", "C-B1081": "67690002", "T-A6640": "67701001", "L-80575": "67720004", "D3-04001": "67763001", "T-54710": "67834006", "T-47100": "67937003", "T-C4331": "67941004", "C-22928": "67956008", "A-26440": "67966000", "L-80883": "67977006", "T-47700": "68053000", "T-54210": "68085002", "L-80A33": "68086001", "T-C4710": "68171009", "A-12030": "68183006", "F-24442": "68235000", "D4-33622": "68237008", "C-22804": "68263003", "A-27500": "68276009", "T-32210": "68300000", "T-C4144": "68339009", "T-D9100": "68367000", "M-80103": "68453008", "P5-31500": "68457009", "C-22833": "68459007", "G-A169": "68493006", "D5-41170": "68496003", "T-D4140": "68505006", "L-80526": "68512002", "T-A2030": "68523003", "L-80200": "68552000", "C-130A3": "68580003", "T-02142": "68598004", "C-114A6": "68630002", "T-02104": "68698007", "T-AA310": "68703001", "T-49110": "68705008", "T-43111": "68787002", "P5-D1000": "68796002", "T-C4442": "68878000", "T-C4513": "68881005", "PA-10130": "68894007", "T-C4210": "68915008", "C-B1087": "68967007", "F-25040": "68978004", "L-80452": "69067004", "C-B1180": "69076006", "C-130A1": "69089000", "T-45010": "69105007", "C-22862": "69133007", "P2-35200": "69158002", "P1-05035": "69245005", "L-80903": "69249004", "T-C4630": "69255009", "T-46200": "69327007", "D4-01046": "69408002", "T-46423": "69421009", "L-80553": "69461005", "L-80850": "69474004", "L-80724": "69529009", "T-D1100": "69536005", "L-80863": "69592005", "L-80590": "69602006", "T-C4750": "69691007", "T-57000": "69695003", "T-B6000": "69748006", "C-B0324": "69783005", "A-28040": "69805005", "T-47410": "69833005", "C-B1096": "69839009", "L-80A06": "69855002", "L-80775": "69862006", "T-65010": "69930009", "D3-87780": "69954004", "L-80700": "69986009", "T-A5160": "70007007", "T-26100": "70074004", "T-A2880": "70105001", "F-63600": "70106000", "D4-31220": "70142008", "T-60650": "70150004", "C-B1099": "70154008", "T-A2730": "70215001", "G-7154": "70232002", "T-32640": "70238003", "T-48814": "70253006", "T-15750": "70258002", "T-45900": "70382005", "L-80205": "70431006", "L-80428": "70457009", "C-22828": "70520000", "C-146B1": "70544003", "T-02632": "70559009", "M-87303": "70594002", "L-80A11": "70653001", "T-02100": "70762009", "T-47040": "70791007", "F-32070": "70822001", "T-F1300": "70847004", "T-02652": "70887009", "T-11170": "70925003", "M-32260": "70984001", "D3-40300": "70995007", "C-15000": "71128006", "T-62023": "71133005", "M-01460": "71173004", "L-80736": "71175006", "M-90201": "71232009", "T-83200": "71252005", "T-48411": "71271007", "T-12710": "71341001", "A-17450": "71384000", "P0-00000": "71388002", "T-1A120": "71400007", "C-127A1": "71425003", "T-75110": "71553001", "T-48160": "71585003", "T-13001": "71616004", "C-155A1": "71633006", "C-B1082": "71636003", "C-105A2": "71647005", "P5-40010": "71651007", "T-49640": "71758008", "C-81560": "71759000", "T-23000": "71836000", "T-59300": "71854001", "D3-31720": "71908006", "L-80607": "71923001", "C-22922": "71957009", "T-03000": "71966008", "T-12700": "72001000", "T-02432": "72005009", "C-B1084": "72015003", "T-45210": "72021004", "D3-81100": "72092001", "T-48340": "72107004", "C-B1023": "72159005", "F-61A90": "72164009", "M-52300": "72166006", "T-11303": "72184008", "L-80322": "72329005", "C-22879": "72371006", "L-80412": "72394007", "T-D3300": "72410000", "C-163A8": "72454006", "T-28300": "72481006", "M-84803": "72495009", "A-11206": "72506001", "T-32632": "72542009", "C-22826": "72572003", "T-13620": "72573008", "T-59442": "72592005", "G-D108": "72607000", "P1-C0B00": "72641008", "L-80348": "72648002", "T-280D0": "72674008", "T-1175B": "72692000", "T-D9200": "72696002", "C-14800": "72717003", "T-54310": "72876007", "T-02613": "72939005", "P2-36102": "73002000", "L-80578": "73005003", "L-80A44": "73049001", "T-32634": "73050001", "T-04020": "73056007", "T-02520": "73058008", "C-B1041": "73065000", "T-11740": "73071006", "T-11150": "73117003", "T-42580": "73166001", "L-80331": "73191001", "C-B0318": "73212002", "M-88610": "73219006", "C-22A02": "73251007", "L-80A19": "73271003", "L-80820": "73318001", "L-80760": "73319009", "T-11513": "73400003", "P1-32000": "73544002", "T-48430": "73580002", "T-46710": "73634005", "L-80661": "73648005", "S-10151": "73678001", "C-B1231": "73685002", "D3-28102": "73774007", "T-32200": "73829009", "C-22971": "73892005", "T-02120": "73897004", "T-14150": "73930003", "T-48813": "73931004", "T-54680": "73937000", "C-67770": "73949004", "T-02814": "73958006", "T-1165B": "73959003", "D3-33200": "74021003", "T-32832": "74031005", "T-15009": "74135004", "T-47660": "74156002", "T-02424": "74160004", "L-80847": "74173000", "T-C4260": "74203007", "T-51004": "74262004", "M-83153": "74280008", "T-93010": "74308000", "T-54370": "74344005", "M-80413": "74364000", "T-11149": "74386004", "T-1176B": "74401007", "L-80640": "74517004", "L-80716": "74536009", "M-02560": "74551000", "C-B0341": "74554008", "L-80656": "74568001", "D3-31121": "74615001", "C-50013": "74626007", "T-15460": "74670003", "L-80207": "74745008", "T-11110": "74872008", "L-80520": "74899005", "L-80560": "74921000", "M-52102": "74937006", "C-10080": "74947009", "T-A1630": "74968005", "L-80527": "74970001", "T-C4143": "75040000", "T-A1220": "75042008", "D3-81660": "75053002", "T-02480": "75093004", "T-1166B": "75095006", "PA-00600": "75118006", "T-1242B": "75129005", "T-26500": "75245000", "G-A600": "75294000", "T-11219": "75319007", "F-31000": "75367002", "T-42340": "75397005", "F-61070": "75399008", "L-807C6": "75494002", "T-47020": "75531005", "G-A373": "75540009", "T-C5100": "75573002", "C-166A2": "75696008", "L-80650": "75709004", "M-35000": "75753009", "T-12800": "75772009", "F-CB250": "75777003", "T-1195B": "75782005", "T-43124": "75902001", "L-80751": "75911001", "C-22967": "75956008", "G-C020": "75958009", "C-781E0": "75959001", "G-4041": "75976002", "C-22916": "76001002", "T-46420": "76015000", "P1-31876": "76025005", "C-22929": "76048000", "T-02306": "76072005", "T-45430": "76117006", "C-B0328": "76155001", "F-20240": "76171001", "M-72000": "76197007", "T-117CB": "76206002", "T-02420": "76261009", "D3-29050": "76267008", "D5-81210": "76281005", "T-C4633": "76290003", "L-80456": "76302002", "L-80914": "76351004", "L-80521": "76364003", "T-04004": "76365002", "F-38277": "76388001", "C-22859": "76439002", "L-80454": "76467006", "L-80132": "76497003", "T-D8810": "76505004", "L-80717": "76554006", "L-80153": "76604009", "C-22866": "76605005", "P1-30352": "76611008", "C-22875": "76633005", "D7-90382": "76649007", "T-C4475": "76659008", "T-C4842": "76704003", "T-AA650": "76710003", "T-02525": "76723005", "L-807C3": "76724004", "T-04000": "76752008", "T-82000": "76784001", "T-C4220": "76838003", "T-39000": "76848001", "T-43105": "76862008", "T-C4456": "76878005", "M-92603": "76909002", "C-22903": "76925007", "P5-D7000": "76927004", "L-80808": "76994004", "C-111A1": "77004003", "T-F1320": "77012006", "C-22941": "77073008", "T-54430": "77130001", "S-32000": "77176002", "L-80706": "77213006", "L-80611": "77236002", "D7-90452": "77296004", "C-B1223": "77313009", "P5-009A0": "77343006", "F-84000": "77386006", "A-12024": "77444004", "P5-08000": "77477000", "T-D2100": "77568009", "T-35410": "77583004", "T-D1620": "77621008", "F-B1810": "77671006", "A-12062": "77720000", "T-C4474": "77778009", "T-04002": "77831004", "T-70060": "78014005", "C-158A5": "78023008", "T-F1100": "78067005", "T-AA700": "78076003", "M-85012": "78197004", "L-807D6": "78214003", "L-80804": "78246003", "D9-30400": "78267003", "T-A2500": "78277001", "G-D103": "78421000", "T-44200": "78480002", "C-B1108": "78481003", "L-80171": "78541007", "C-B1067": "78570003", "L-8B100": "78678003", "C-B1017": "78686003", "C-22955": "78869007", "T-D3050": "78904004", "T-C3000": "78961009", "T-11515": "78972004", "L-80602": "78994007", "L-80100": "79058000", "A-30360": "79068005", "T-44010": "79142001", "T-B6200": "79163004", "C-159A2": "79197006", "T-02143": "79283007", "L-80726": "79295007", "T-02202": "79313003", "T-15200": "79361005", "G-A599": "79458005", "C-131A1": "79477007", "T-02211": "79502000", "C-113A2": "79523006", "T-12280": "79601000", "L-80343": "79603002", "C-B1216": "79610008", "D3-29011": "79619009", "T-AA770": "79652003", "M-36300": "79654002", "F-32340": "79692001", "T-64500": "79741001", "A-18041": "79811009", "L-80655": "79814001", "T-C4650": "79926007", "T-02109": "79951008", "T-A2750": "80049006", "T-1191B": "80064006", "L-80612": "80084005", "L-80600": "80131009", "T-54480": "80140008", "T-12770": "80144004", "T-AA810": "80243003", "T-04030": "80248007", "T-45160": "80272002", "F-70210": "80274001", "C-22856": "80305003", "F-37150": "80313002", "T-A2870": "80434005", "T-A1800": "80447000", "D5-81220": "80515008", "L-80892": "80576000", "T-D4001": "80581009", "T-A1900": "80621003", "T-A8130": "80622005", "T-54260": "80647007", "C-172A8": "80751004", "T-C4860": "80769008", "L-80413": "80777007", "L-80170": "80835003", "P5-40030": "80865008", "T-C4631": "80867000", "T-32000": "80891009", "C-00224": "80917008", "A-61000": "80919006", "F-01500": "80943009", "L-80657": "80979001", "T-AA630": "81016008", "T-44000": "81040000", "T-C4200": "81105003", "T-42200": "81128002", "T-C4290": "81132008", "L-80154": "81267004", "M-73310": "81274009", "F-00001": "81323004", "C-22A01": "81397005", "T-55300": "81502006", "L-80723": "81529001", "L-807D2": "81607005", "C-B1066": "81621007", "G-A138": "81654009", "M-95401": "81669005", "T-13300": "81727001", "T-AA000": "81745001", "C-B1203": "81761004", "M-02550": "81827009", "C-A6500": "81839001", "L-80A21": "81866001", "C-F3310": "81911001", "T-02545": "81992007", "PA-20110": "82078001", "L-80885": "82206008", "C-677C0": "82264009", "G-A545": "82280004", "G-A385": "82334004", "T-C4350": "82365008", "L-80327": "82440005", "A-26836": "82449006", "T-32300": "82471001", "T-12771": "82474009", "T-15690": "82561000", "C-F5000": "82566005", "C-80400": "82573000", "T-54460": "82628004", "L-88120": "82676003", "T-D0310": "82680008", "C-22895": "82682000", "T-11790": "82687006", "M-85003": "82711006", "F-32100": "82799009", "T-D4900": "82849001", "L-80622": "82909008", "T-1174B": "82965004", "T-47690": "83018002", "F-61760": "83036002", "A-26400": "83059008", "L-80160": "83173002", "L-80733": "83216009", "L-80895": "83236005", "T-A2200": "83251001", "F-12100": "83323007", "D4-32012": "83330001", "T-C4458": "83380007", "T-49410": "83419000", "S-10181": "83420006", "P1-30022": "83422003", "C-B0342": "83423008", "L-80793": "83504004", "T-C6010": "83555006", "G-B102": "83578000", "C-17200": "83598005", "C-22920": "83600004", "T-D4425": "83670000", "D4-31040": "83799000", "C-12013": "83881004", "L-80119": "83996001", "T-1194B": "84020006", "L-80537": "84081007", "D3-16000": "84114007", "C-22845": "84217005", "T-C4610": "84219008", "F-01360": "84229001", "L-80592": "84232003", "T-AB200": "84301002", "L-80532": "84315000", "M-02120": "84360004", "T-02153": "84365009", "L-80871": "84367001", "C-6A16E": "84386009", "T-487A0": "84421000", "T-02821": "84507004", "L-80708": "84514002", "L-80603": "84528008", "L-807D5": "84548001", "T-02841": "84607009", "T-E0100": "84640000", "T-32833": "84654008", "C-22A03": "84656005", "L-807D1": "84660008", "T-32156": "84712000", "DA-30000": "84757009", "T-A0500": "84782009", "L-80A43": "84797007", "C-A6540": "84812008", "L-80135": "84839000", "C-15300": "84847000", "L-80105": "84923006", "T-12410": "85050009", "C-22873": "85066006", "T-D7020": "85119005", "L-80719": "85144002", "C-22848": "85190005", "T-45700": "85234005", "T-46120": "85235006", "C-80430": "85272000", "D3-12003": "85284003", "T-1A007": "85293002", "L-80662": "85315007", "T-C4843": "85380009", "T-46640": "85383006", "M-32350": "85431000", "T-48400": "85439003", "T-D8700": "85562004", "C-22A05": "85596006", "D3-91030": "85598007", "P5-D3300": "85606007", "T-A3700": "85637007", "M-32200": "85659009", "C-B1200": "85693008", "T-12350": "85710004", "M-32240": "85726003", "T-D0050": "85756007", "T-01530": "85803001", "T-51600": "85816001", "T-15420": "85856004", "D3-20000": "85898001", "C-22838": "85981002", "M-80003": "86049000", "T-45300": "86117002", "A-32110": "86122002", "T-A5272": "86136007", "P1-03100": "86273004", "F-21000": "86290005", "D4-31110": "86299006", "C-68000": "86308005", "T-D4130": "86367003", "A-17350": "86407004", "T-02219": "86409001", "L-80652": "86440008", "C-113A3": "86521004", "C-22869": "86541009", "T-47740": "86547008", "T-46500": "86570000", "C-B0323": "86584005", "L-80732": "86593006", "T-280A0": "86598002", "M-85002": "86616005", "L-80582": "86694007", "T-02114": "86719006", "C-22823": "86750008", "L-80822": "86767001", "L-80321": "86920006", "T-80010": "86969008", "G-A351": "87017008", "L-80810": "87029004", "L-80528": "87061000", "F-10390": "87068006", "L-80737": "87111007", "T-21342": "87166008", "L-80897": "87219003", "T-12750": "87342007", "D3-12400": "87343002", "D7-90560": "87386002", "T-11670": "87391001", "C-B1225": "87410002", "C-116A2": "87437000", "C-B0335": "87445005", "T-A2970": "87463005", "T-40200": "87483006", "T-A0102": "87563008", "T-C2000": "87612001", "T-95000": "87644002", "G-A151": "87687004", "T-54360": "87704003", "T-02512": "87706001", "F-BB000": "87708000", "F-12300": "87731000", "M-84903": "87737001", "T-80020": "87759004", "T-1A000": "87784001", "C-B1210": "87853006", "T-32600": "87878005", "M-90203": "87913009", "T-73000": "87953007", "C-B1121": "87958003", "L-80337": "87962009", "G-D221": "87982008", "C-12300": "88014003", "T-02150": "88089004", "C-B1016": "88166005", "T-54170": "88176008", "M-95813": "88195001", "T-32810": "88210001", "F-10216": "88241000", "T-14040": "88340001", "C-29000": "88376000", "T-A2700": "88442005", "G-A405": "88446008", "T-14167": "88454005", "C-B1171": "88473009", "C-13500": "88480006", "C-13200": "88488004", "T-45510": "88556005", "T-42310": "88593004", "F-39790": "88619007", "C-22904": "88625006", "C-22867": "88660000", "L-807A4": "88779009", "L-80157": "88807001", "T-54610": "88824007", "T-A8640": "88882009", "T-1A080": "88921000", "T-D1120": "88986008", "C-22966": "89028002", "L-80A12": "89065000", "M-95400": "89084002", "T-42210": "89093001", "D3-00200": "89138009", "C-22887": "89139001", "C-22882": "89148006", "A-17310": "89149003", "D7-90530": "89164003", "C-10005": "89177007", "T-20001": "89187006", "T-A2820": "89202009", "C-144A4": "89272005", "T-A3400": "89278009", "D3-12004": "89323001", "T-11514": "89340005", "L-80790": "89450005", "C-10072": "89457008", "T-D1200": "89545001", "T-11100": "89546000", "T-54760": "89552004", "C-22855": "89577003", "C-B0319": "89595000", "T-54390": "89625000", "L-80421": "89648005", "L-80349": "89665001", "L-80210": "89708009", "D3-28005": "89736004", "M-85203": "89740008", "T-02666": "89784008", "P1-31850": "89814007", "C-B1224": "89818005", "T-74000": "89837001", "C-22868": "89856006", "T-C4330": "89858007", "T-C6000": "89890002", "L-80570": "89928000", "T-46740": "90024005", "L-80406": "90050009", "G-A182": "90069004", "F-32120": "90096001", "L-807B0": "90101001", "T-48410": "90219004", "T-D4230": "90290004", "T-35250": "90315007", "T-35210": "90318009", "T-90010": "90418005", "L-80901": "90444005", "P1-78320": "90470006", "D3-10510": "90539001", "T-35120": "90561006", "T-28830": "90572001", "T-13650": "90588001", "T-C4001": "90606007", "L-80158": "90612002", "C-B1068": "90617008", "C-B0348": "90733003", "G-A270": "90734009", "C-B0315": "90745007", "T-48840": "90771006", "D3-22100": "90828009", "L-8057A": "90885005", "F-32010": "90892000", "T-46820": "91079009", "T-43201": "91083009", "T-32834": "91085002", "P2-34122": "91096005", "T-35300": "91134007", "T-AB600": "91207004", "T-1243B": "91238003", "C-22881": "91295002", "DE-00020": "91302008", "T-C4580": "91394001", "T-11196": "91397008", "L-80860": "91429002", "T-D8104": "91470000", "T-48501": "91539005", "L-80792": "91553005", "P1-28160": "91602002", "C-22973": "91606004", "T-11180": "91609006", "T-D3136": "91691001", "T-F7040": "91707000", "T-AB500": "91716001", "T-D0080": "91720002", "T-D0005": "91723000", "T-461A0": "91732003", "T-40230": "91747007", "T-43115": "91748002", "T-43117": "91750005", "T-43118": "91751009", "T-43119": "91752002", "T-43127": "91753007", "T-43128": "91754001", "T-43129": "91755000", "T-4312A": "91756004", "T-4312B": "91757008", "T-4312C": "91758003", "T-4312D": "91759006", "T-4312E": "91760001", "T-43213": "91761002", "T-43214": "91762009", "T-43215": "91763004", "T-D0062": "91772007", "T-D00A3": "91806002", "T-D00AB": "91830000", "D7-F0810": "92248004", "D7-F0902": "92652009", "DC-F4113": "93143009", "D3-F0620": "93473009", "D2-F1103": "93880001", "D4-31154": "94150003", "D1-F0106": "94222008", "D2-F1106": "94391008", "DA-73460": "95217000", "D7-F1000": "95315005", "D0-00050": "95324001", "D0-B0300": "95376002", "D0-B0310": "95377006", "D0-B0311": "95378001", "D0-B0312": "95379009", "D0-B0314": "95380007", "D0-B0320": "95381006", "D0-B0324": "95382004", "D0-B0326": "95383009", "D0-B0330": "95384003", "D0-B0334": "95385002", "D0-B0338": "95386001", "D0-B0339": "95387005", "D0-B0340": "95388000", "D0-B0342": "95389008", "D0-B0346": "95390004", "D0-B0350": "95391000", "D0-B0352": "95392007", "D0-B0354": "95393002", "D0-B0356": "95394008", "D0-B0360": "95395009", "D0-B0364": "95396005", "D0-B0370": "95397001", "D0-B0380": "95398006", "D0-B0382": "95399003", "D0-B0390": "95400005", "D0-B0394": "95401009", "D0-B03A0": "95402002", "D0-B03A2": "95403007", "D0-B03A4": "95404001", "C-62960": "96218000", "C-64090": "96227004", "C-640A0": "96229001", "C-640B0": "96230006", "C-6A190": "96265006", "C-80800": "96302009", "C-81300": "96308008", "C-97301": "96328007", "C-B0302": "96388005", "C-B1218": "96390006", "T-14668": "102292000", "T-35020": "102298001", "A-10141": "102304005", "A-25600": "102312002", "A-25610": "102313007", "A-25612": "102314001", "A-25614": "102315000", "A-25616": "102316004", "A-26802": "102317008", "A-26912": "102319006", "A-27322": "102320000", "A-2B210": "102321001", "A-2C600": "102322008", "A-2C602": "102323003", "A-2C604": "102324009", "A-2C606": "102325005", "A-32475": "102378009", "F-00453": "102459008", "F-00454": "102460003", "F-10317": "102535000", "F-10319": "102536004", "F-10450": "102538003", "F-10460": "102539006", "F-10470": "102540008", "F-10480": "102541007", "F-37012": "102589003", "F-38002": "102594003", "F-84094": "102874004", "F-84430": "102877006", "G-0202": "103321005", "G-7290": "103335007", "G-A185": "103339001", "G-A186": "103340004", "G-A187": "103341000", "G-A188": "103342007", "G-A189": "103343002", "G-A1A1": "103344008", "G-A1A2": "103345009", "G-A1A3": "103346005", "G-A1A4": "103347001", "G-A1A5": "103348006", "G-A1A6": "103349003", "G-A1B2": "103353001", "G-A1B3": "103354007", "G-A220": "103355008", "G-A556": "103361006", "G-D027": "103381007", "G-D032": "103382000", "G-D033": "103383005", "G-D052": "103386002", "G-D054": "103387006", "G-D210": "103390000", "G-D216": "103391001", "P0-00002": "103693007", "P1-00018": "103709008", "P1-05536": "103712006", "P1-05537": "103713001", "P1-05538": "103714007", "P1-05539": "103715008", "P1-05550": "103716009", "P3-40160": "104157003", "P3-50495": "104210008", "P5-0A100": "105371005", "P5-39015": "105372003", "P5-39191": "105373008", "P5-B3002": "105376000", "S-20570": "105501005", "F-61002": "105590001", "C-120F9": "105830007", "G-A1F8": "106233006", "J-07100": "106292003", "L-8B9F9": "107007004", "M-020F9": "107644003", "M-520F8": "107671003", "P5-C00F8": "108290001", "P5-D30F8": "108294005", "P5-D90F8": "108300008", "M-8FFFF": "108369006", "T-12761": "108371006", "C-80349": "108502004", "C-22AA1": "108880002", "C-B7100": "108899006", "C-A0005": "109029006", "C-A0173": "109066000", "C-B0314": "109212003", "C-B0321": "109216000", "C-B0322": "109218004", "C-B0329": "109219007", "C-B0332": "109222009", "D7-F0A02": "109888004", "DD-66A67": "110265006", "M-32210": "110421000", "M-78190": "110451006", "P1-00410": "110467000", "T-02148": "110488009", "T-11011": "110517009", "T-12403": "110535000", "T-12701": "110536004", "T-28910": "110550009", "T-48820": "110568007", "T-59490": "110612005", "T-65600": "110621006", "T-88920": "110639002", "T-DD006": "110726009", "T-DD123": "110837003", "T-DD163": "110861005", "M-78066": "111017005", "A-17200": "111045004", "C-158A3": "111084009", "C-21402": "111095003", "C-22803": "111101002", "C-22917": "111102009", "C-6A118": "111132001", "C-80120": "111139005", "C-B0337": "111158001", "C-B1085": "111159009", "C-B1086": "111160004", "C-B1151": "111161000", "C-B1211": "111162007", "D3-29042": "111287006", "D3-40208": "111289009", "F-32020": "111973004", "G-A428": "112233002", "L-35500": "112381006", "L-80136": "112485003", "L-80336": "112486002", "L-80344": "112487006", "L-80423": "112488001", "L-80510": "112489009", "L-80566": "112490000", "L-80710": "112491001", "L-80725": "112492008", "L-80772": "112493003", "L-807B5": "112494009", "M-78000": "112674009", "P1-31872": "112811009", "P1-C0020": "112987001", "P2-01510": "113011001", "S-10191": "113160008", "S-11090": "113163005", "T-02140": "113179006", "T-02452": "113182001", "T-11300": "113197003", "T-11304": "113198008", "T-11630": "113205007", "T-1179B": "113209001", "T-30000": "113257007", "T-35110": "113259005", "T-42070": "113262008", "T-45120": "113263003", "T-45230": "113264009", "T-46910": "113269004", "T-47420": "113270003", "T-48520": "113273001", "T-51300": "113277000", "T-54440": "113278005", "T-A6000": "113305005", "T-C4511": "113336002", "T-C4840": "113340006", "T-D0048": "113342003", "T-D0060": "113343008", "T-D4000": "113345001", "T-D4450": "113346000", "T-D9540": "113351006", "F-65C50": "115391007", "T-15728": "116010006", "P5-08001": "116152004", "T-C2007": "116176007", "DD-60002": "116224001", "C-84989": "116532005", "C-10098": "116566001", "C-37128": "116593003", "C-37138": "116602009", "G-C504": "116676008", "G-C50A": "116682006", "T-D3141": "117133000", "T-D3142": "117134006", "T-D3143": "117135007", "T-D3144": "117136008", "T-D3145": "117137004", "T-D3146": "117138009", "T-D3147": "117139001", "T-D3148": "117140004", "T-D3149": "117141000", "T-D314A": "117142007", "T-D314B": "117143002", "P3-40155": "117259009", "G-D301": "117362005", "T-AB001": "117590005", "P2-34201": "117610000", "F-01072": "118242002", "F-01073": "118243007", "P3-44150": "117617002", "A-04140": "118375008", "A-11101": "118378005", "F-31146": "118433006", "G-D00B": "118438002", "P1-1081B": "118470002", "T-1241F": "118495001", "G-D701": "118538004", "G-D705": "118565006", "G-D709": "118578006", "G-D750": "118586006", "T-46002": "118634008", "T-12375": "118645006", "P0-05083": "118745001", "T-32423": "118755002", "D3-80515": "118927008", "T-D0558": "119238007", "T-24454": "119255006", "T-B6070": "119281005", "G-8003": "119295008", "G-8300": "119376003", "T-D0593": "119406000", "T-D0598": "119410002", "T-1240F": "119524001", "T-45005": "119568004", "P1-14810": "119614000", "P1-48501": "119853006", "T-46659": "120234003", "T-D0634": "120576005", "T-1300D": "122448007", "A-23000": "122456005", "P1-01003": "122459003", "T-70001": "122489005", "T-11501": "122494005", "T-11502": "122495006", "T-11503": "122496007", "G-8311": "122595009", "G-8318": "122737001", "G-8319": "122738006", "G-831B": "122739003", "T-49403": "122774002", "T-49103": "122775001", "T-48581": "122972007", "T-D000A": "123037004", "T-D0662": "123851003", "L-80139": "125074003", "L-87A02": "125076001", "L-8A10B": "125084002", "L-8B943": "125091004", "L-8C306": "125097000", "L-8C336": "125099002", "L-8C338": "125101009", "M-00101": "125112009", "M-32202": "125271003", "M-32203": "125272005", "M-32204": "125273000", "M-32208": "125274006", "M-52301": "125357009", "M-52302": "125358004", "T-15516": "125682004", "C-B1184": "125701003", "C-6A161": "125707004", "A-26434": "126065006", "D0-F035F": "126510002", "D5-F131F": "126838000", "DC-721C4": "127189005", "G-8310": "127457009", "G-C52F": "127489000", "P3-00003": "127790008", "T-C4311": "127919002", "T-C4312": "127920008", "T-C4313": "127921007", "T-C4314": "127922000", "T-C43A0": "127925003", "T-C43A1": "127926002", "T-C43A2": "127927006", "T-C43A5": "127930004", "T-C43A6": "127931000", "T-C43A7": "127932007", "T-C43AC": "127937001", "T-C43AD": "127938006", "T-C43AE": "127939003", "T-C43B2": "127940001", "T-C43B3": "127941002", "T-D0684": "127954009", "D5-81002": "128241005", "T-02527": "128252004", "T-02528": "128253009", "T-A0190": "128319008", "T-A0191": "128320002", "G-DB10": "128432002", "G-DB11": "128433007", "G-DB12": "128434001", "G-DB13": "128435000", "G-DB14": "128436004", "G-DB15": "128437008", "G-DB16": "128438003", "G-DB17": "128439006", "G-DB18": "128440008", "G-DB19": "128441007", "G-DB20": "128442000", "G-DB21": "128443005", "G-DB22": "128444004", "G-DB23": "128445003", "G-DB24": "128446002", "G-DB25": "128447006", "G-DB26": "128448001", "G-DB27": "128449009", "G-DB28": "128450009", "G-DB29": "128451008", "G-DB30": "128452001", "G-DB31": "128453006", "G-DB32": "128454000", "G-DB33": "128455004", "DF-00436": "128462008", "P1-03021": "128538000", "T-49424": "128548003", "T-49426": "128549006", "D3-81922": "128551005", "G-DB34": "128552003", "T-49215": "128553008", "T-49429": "128554002", "D4-32504": "128555001", "D4-32506": "128556000", "D4-32509": "128557009", "D4-32510": "128558004", "T-47490": "128559007", "T-4942A": "128560002", "D4-31052": "128563000", "T-32602": "128564006", "T-32502": "128565007", "D4-33512": "128566008", "D4-33514": "128567004", "D4-33516": "128568009", "T-49535": "128569001", "PA-50031": "128573003", "PA-50033": "128575005", "PA-50034": "128576006", "PA-50035": "128577002", "PA-50036": "128578007", "PA-50037": "128579004", "PA-50038": "128580001", "PA-50039": "128581002", "PA-5003A": "128582009", "T-4884A": "128583004", "D4-33142": "128584005", "T-48503": "128585006", "T-32190": "128586007", "T-D930A": "128587003", "T-44007": "128589000", "G-DE02": "128591008", "G-DE04": "128592001", "G-DE06": "128593006", "G-DE08": "128594000", "T-32202": "128595004", "M-39390": "128617001", "M-80463": "128632008", "M-82040": "128651002", "M-85072": "128696009", "M-88150": "128736003", "M-88250": "128738002", "M-89830": "128765009", "G-D870": "128947001", "G-D872": "128948006", "G-D871": "128949003", "G-D873": "128950003", "G-D874": "128951004", "P1-3160A": "128952006", "P1-3160B": "128953001", "G-7292": "128954007", "G-7293": "128955008", "G-7294": "128956009", "G-7295": "128957000", "G-7296": "128958005", "G-7297": "128959002", "G-7298": "128960007", "G-7299": "128961006", "P2-71302": "128963009", "P2-71304": "128964003", "P2-71306": "128965002", "P2-71308": "128966001", "P2-71310": "128967005", "P2-71312": "128968000", "P2-71314": "128969008", "P2-71316": "128970009", "P2-71318": "128971008", "F-01602": "128974000", "F-01604": "128975004", "F-01606": "128976003", "F-01608": "128977007", "T-45416": "128979005", "A-00203": "128981007", "G-729A": "129082007", "G-729B": "129083002", "G-72BB": "129085009", "G-729C": "129086005", "G-729D": "129087001", "G-729E": "129088006", "G-729F": "129089003", "G-7304": "129090007", "G-7305": "129091006", "G-7406": "129092004", "G-7408": "129093009", "P2-7131A": "129095002", "P2-7131B": "129096001", "P2-7131C": "129097005", "P2-7131D": "129098000", "P2-7131E": "129099008", "P2-7131F": "129100000", "P2-713A0": "129101001", "P2-713A1": "129102008", "A-28051": "129113006", "G-D065": "129226004", "P0-02125": "129379006", "P0-02126": "129380009", "P0-02160": "129411004", "P0-02179": "129428001", "A-10042": "129460009", "A-1016B": "129463006", "A-16016": "129467007", "C-B1033": "129499001", "C-B1032": "129501009", "C-B1036": "129502002", "C-B1037": "129503007", "C-B1038": "129504001", "C-B1039": "129505000", "C-B103A": "129506004", "C-B103B": "129507008", "C-B103C": "129508003", "C-B103D": "129509006", "C-B103E": "129510001", "C-B103F": "129511002", "C-B1042": "129512009", "C-B1043": "129513004", "C-B1044": "129514005", "C-B1045": "129515006", "F-01710": "129715009", "F-01711": "129716005", "F-01712": "129717001", "F-01713": "129718006", "F-01714": "129719003", "F-01720": "129720009", "F-01721": "129721008", "F-01722": "129722001", "F-01723": "129723006", "F-01726": "129726003", "F-01727": "129727007", "F-01728": "129728002", "F-01729": "129729005", "F-0172A": "129730000", "F-0172B": "129731001", "F-01732": "129734009", "F-01740": "129737002", "F-01741": "129738007", "F-01742": "129739004", "F-01743": "129740002", "F-01744": "129741003", "F-01745": "129742005", "F-01751": "129744006", "F-01752": "129745007", "F-01753": "129746008", "F-01754": "129747004", "F-01760": "129748009", "F-01761": "129749001", "F-01762": "129750001", "F-01763": "129751002", "F-01764": "129752009", "F-01765": "129753004", "F-01766": "129754005", "F-01767": "129755006", "F-01768": "129756007", "F-01769": "129757003", "F-0176A": "129758008", "F-0176B": "129759000", "F-0176C": "129760005", "F-0176D": "129761009", "F-0176E": "129762002", "F-0176F": "129763007", "F-01770": "129764001", "F-01771": "129765000", "F-01772": "129766004", "F-01773": "129767008", "F-01774": "129768003", "F-01775": "129769006", "F-01776": "129770007", "F-01781": "129772004", "F-01782": "129773009", "F-01783": "129774003", "F-01784": "129775002", "F-01785": "129776001", "F-01786": "129777005", "F-01787": "129778000", "F-01788": "129779008", "F-01789": "129780006", "F-0178A": "129781005", "F-0178B": "129782003", "F-0178C": "129783008", "F-0178D": "129784002", "F-0178E": "129785001", "F-0178F": "129786000", "F-01791": "129788004", "F-01792": "129789007", "F-01793": "129790003", "F-01794": "129791004", "F-01795": "129792006", "F-01796": "129793001", "F-01797": "129794007", "F-01798": "129795008", "F-01799": "129796009", "F-0179A": "129797000", "F-017B1": "129806009", "F-017B2": "129807000", "F-017B3": "129808005", "F-017B4": "129809002", "F-017B5": "129810007", "F-017B6": "129811006", "F-017B7": "129812004", "F-017B8": "129813009", "F-8A063": "130963002", "G-A15A": "131183008", "G-A16A": "131184002", "G-A18A": "131185001", "G-A18B": "131186000", "G-A193": "131187009", "G-A194": "131188004", "G-A195": "131189007", "G-A196": "131190003", "G-A197": "131191004", "G-A198": "131192006", "G-D785": "131197000", "L-80121": "131426006", "L-80122": "131427002", "L-80123": "131428007", "L-80124": "131429004", "L-80125": "131430009", "L-80126": "131431008", "L-80127": "131432001", "L-80128": "131433006", "L-80129": "131434000", "L-8012A": "131435004", "L-8012B": "131436003", "L-8012C": "131437007", "L-8012E": "131438002", "L-8012F": "131439005", "L-80138": "131440007", "L-8013A": "131441006", "L-8013B": "131442004", "L-8013C": "131443009", "L-8013D": "131444003", "L-8013E": "131445002", "L-8013F": "131446001", "L-8014C": "131447005", "L-8014D": "131448000", "L-8014E": "131449008", "L-8014F": "131450008", "L-8015A": "131451007", "L-8015B": "131452000", "L-8015C": "131453005", "L-8015D": "131454004", "L-8015E": "131455003", "L-8015F": "131456002", "L-80161": "131457006", "L-80162": "131458001", "L-80163": "131459009", "L-80164": "131460004", "L-80165": "131461000", "L-80166": "131462007", "L-80167": "131463002", "L-80168": "131464008", "L-80169": "131465009", "L-8016A": "131466005", "L-8016B": "131467001", "L-8016C": "131468006", "L-8016D": "131469003", "L-8016E": "131470002", "L-8016F": "131471003", "L-80177": "131472005", "L-80178": "131473000", "L-80179": "131474006", "L-8017A": "131475007", "L-8017B": "131476008", "L-8017C": "131477004", "L-8017D": "131478009", "L-8017E": "131479001", "L-8017F": "131480003", "L-80180": "131481004", "L-80181": "131482006", "L-80182": "131483001", "L-80183": "131484007", "L-80184": "131485008", "L-80185": "131486009", "L-80186": "131487000", "L-80187": "131488005", "L-80188": "131489002", "L-80189": "131490006", "L-8018A": "131491005", "L-8018B": "131492003", "L-8018C": "131493008", "L-8018D": "131494002", "L-8018E": "131495001", "L-8018F": "131496000", "L-80190": "131497009", "L-80191": "131498004", "L-80192": "131499007", "L-80193": "131500003", "L-80194": "131501004", "L-80195": "131502006", "L-80196": "131503001", "L-80197": "131504007", "L-80198": "131505008", "L-80199": "131506009", "L-8019A": "131507000", "L-8019B": "131508005", "L-8019C": "131509002", "L-8019D": "131510007", "L-8019E": "131511006", "L-8019F": "131512004", "L-801A0": "131513009", "L-801A1": "131514003", "L-801A2": "131515002", "L-801A3": "131516001", "L-801A4": "131517005", "L-801A5": "131518000", "L-801A6": "131519008", "L-801A7": "131520002", "L-801A8": "131521003", "L-801A9": "131522005", "L-801AA": "131523000", "L-801AB": "131524006", "L-801AC": "131525007", "L-801AD": "131526008", "L-801AE": "131527004", "L-801AF": "131528009", "L-801B0": "131529001", "L-801B1": "131530006", "L-801B2": "131531005", "L-801B3": "131532003", "L-801B4": "131533008", "L-801B5": "131534002", "L-801B6": "131535001", "L-801B7": "131536000", "L-801B8": "131537009", "L-801B9": "131538004", "L-801BA": "131539007", "L-801BB": "131540009", "L-801BC": "131541008", "L-801BD": "131542001", "L-801BE": "131543006", "L-801BF": "131544000", "L-801C0": "131545004", "L-801C1": "131546003", "L-801C2": "131547007", "L-801C3": "131548002", "L-801C4": "131549005", "L-801C5": "131550005", "L-801C6": "131551009", "L-801C7": "131552002", "L-801C8": "131553007", "L-801C9": "131554001", "L-801CA": "131555000", "L-801CB": "131556004", "L-801CC": "131557008", "L-801CD": "131558003", "L-801CE": "131559006", "L-801CF": "131560001", "L-801D0": "131561002", "L-801D1": "131562009", "L-801D2": "131563004", "L-801D3": "131564005", "L-801D4": "131565006", "L-801D5": "131566007", "L-801D6": "131567003", "L-801D7": "131568008", "L-801D8": "131569000", "L-801D9": "131570004", "L-801DA": "131571000", "L-801DB": "131572007", "L-801DC": "131573002", "L-801DD": "131574008", "L-801DE": "131575009", "L-801DF": "131576005", "L-801E0": "131577001", "L-801E1": "131578006", "L-801E2": "131579003", "L-801E3": "131580000", "L-801E4": "131581001", "L-801E5": "131582008", "L-801E6": "131583003", "L-801E7": "131584009", "L-801EA": "131585005", "L-801EB": "131586006", "L-801EC": "131587002", "L-801ED": "131588007", "L-801EE": "131589004", "L-801EF": "131590008", "L-801F0": "131591007", "L-801F1": "131592000", "L-801F2": "131593005", "L-801F3": "131594004", "L-801F4": "131595003", "L-801F5": "131596002", "L-801F6": "131597006", "L-801F7": "131598001", "L-801F8": "131599009", "L-801F9": "131600007", "L-801FA": "131601006", "L-801FB": "131602004", "L-801FC": "131603009", "L-801FD": "131604003", "L-801FE": "131605002", "L-801FF": "131606001", "L-80217": "131607005", "L-80218": "131608000", "L-80219": "131609008", "L-8021A": "131610003", "L-8021B": "131611004", "L-8021C": "131612006", "L-8021D": "131613001", "L-8021E": "131614007", "L-8021F": "131615008", "L-80220": "131616009", "L-80221": "131617000", "L-80222": "131618005", "L-80223": "131619002", "L-80224": "131620008", "L-80225": "131621007", "L-80226": "131622000", "L-80227": "131623005", "L-80228": "131624004", "L-80229": "131625003", "L-8022A": "131626002", "L-8022B": "131627006", "L-8022C": "131628001", "L-8022D": "131629009", "L-8022E": "131630004", "L-80230": "131631000", "L-80231": "131632007", "L-80232": "131633002", "L-80233": "131634008", "L-80234": "131635009", "L-80235": "131636005", "L-80236": "131637001", "L-80237": "131638006", "L-80238": "131639003", "L-80239": "131640001", "L-80240": "131641002", "L-80241": "131642009", "L-80242": "131643004", "L-80243": "131644005", "L-80244": "131645006", "L-80245": "131646007", "L-80246": "131647003", "L-80247": "131648008", "L-80248": "131649000", "L-80249": "131650000", "L-80250": "131651001", "L-80251": "131652008", "L-80252": "131653003", "L-80253": "131654009", "L-80254": "131655005", "L-80255": "131656006", "L-80256": "131657002", "L-80257": "131658007", "L-80258": "131659004", "L-80259": "131660009", "L-80260": "131661008", "L-80261": "131662001", "L-80263": "131663006", "L-80265": "131664000", "L-80266": "131665004", "L-80267": "131666003", "L-80268": "131667007", "L-80269": "131668002", "L-80270": "131669005", "L-80271": "131670006", "L-80272": "131671005", "L-80273": "131672003", "L-80274": "131673008", "L-80275": "131674002", "L-80276": "131675001", "L-80277": "131676000", "L-80278": "131677009", "L-80279": "131678004", "L-80280": "131679007", "L-80281": "131680005", "L-80282": "131681009", "L-80283": "131682002", "L-80284": "131683007", "L-80285": "131684001", "L-80286": "131685000", "L-80287": "131686004", "L-80288": "131687008", "L-80289": "131688003", "L-80290": "131689006", "L-80291": "131690002", "L-80292": "131691003", "L-80293": "131692005", "L-80294": "131693000", "L-80295": "131694006", "L-80296": "131695007", "L-80297": "131696008", "L-80298": "131697004", "L-80299": "131698009", "L-8031A": "131699001", "L-8031B": "131700000", "L-8031C": "131701001", "L-8031D": "131702008", "L-8031E": "131703003", "L-8031F": "131704009", "L-8032A": "131705005", "L-8032B": "131706006", "L-8032C": "131707002", "L-8032D": "131708007", "L-8032E": "131709004", "L-8032F": "131710009", "L-8033A": "131711008", "L-8033B": "131712001", "L-8033C": "131713006", "L-8033D": "131714000", "L-8033E": "131715004", "L-8033F": "131716003", "L-8034A": "131717007", "L-8034B": "131718002", "L-8034C": "131719005", "L-8034D": "131720004", "L-8034E": "131721000", "L-8034F": "131722007", "L-80351": "131723002", "L-80352": "131724008", "L-80353": "131725009", "L-80354": "131726005", "L-80355": "131727001", "L-80356": "131728006", "L-80357": "131729003", "L-80358": "131730008", "L-80359": "131731007", "L-8035A": "131732000", "L-8035B": "131733005", "L-8035C": "131734004", "L-8035D": "131735003", "L-8035E": "131736002", "L-8035F": "131737006", "L-80360": "131738001", "L-80361": "131739009", "L-80362": "131740006", "L-80363": "131741005", "L-80364": "131742003", "L-80365": "131743008", "L-80366": "131744002", "L-80367": "131745001", "L-80368": "131746000", "L-80369": "131747009", "L-8036A": "131748004", "L-8036B": "131749007", "L-8036C": "131750007", "L-8036D": "131751006", "L-8036E": "131752004", "L-8036F": "131753009", "L-80370": "131754003", "L-80371": "131755002", "L-80372": "131756001", "L-80373": "131757005", "L-80374": "131758000", "L-80375": "131759008", "L-80376": "131760003", "L-80377": "131761004", "L-80378": "131762006", "L-80379": "131763001", "L-8037A": "131764007", "L-8037B": "131765008", "L-8037C": "131766009", "L-8037D": "131767000", "L-8037E": "131768005", "L-8037F": "131769002", "L-80380": "131770001", "L-80381": "131771002", "L-80382": "131772009", "L-80383": "131773004", "L-80384": "131774005", "L-80385": "131775006", "L-80386": "131776007", "L-80387": "131777003", "L-80388": "131778008", "L-80389": "131779000", "L-8038A": "131780002", "L-8038B": "131781003", "L-8038C": "131782005", "L-8038D": "131783000", "L-8038E": "131784006", "L-8038F": "131785007", "L-80390": "131786008", "L-80391": "131787004", "L-80392": "131788009", "L-80393": "131789001", "L-80394": "131790005", "L-80395": "131791009", "L-80396": "131792002", "L-80397": "131793007", "L-80398": "131794001", "L-80399": "131795000", "L-8039A": "131796004", "L-8039B": "131797008", "L-8039C": "131798003", "L-8039D": "131799006", "L-8039E": "131800005", "L-8039F": "131801009", "L-80403": "131802002", "L-80404": "131803007", "L-8040A": "131804001", "L-8040B": "131805000", "L-8040C": "131806004", "L-8040D": "131807008", "L-8040E": "131808003", "L-8040F": "131809006", "L-80420": "131816007", "L-8042D": "131819000", "L-80432": "131822003", "L-80434": "131823008", "L-80441": "131830002", "L-80442": "131831003", "L-80443": "131832005", "L-80444": "131833000", "L-80445": "131834006", "L-80446": "131835007", "L-80447": "131836008", "L-80448": "131837004", "L-80449": "131838009", "L-80466": "131851004", "L-80467": "131852006", "L-80468": "131853001", "L-80469": "131854007", "L-80470": "131861006", "L-80471": "131862004", "L-80472": "131863009", "L-80473": "131864003", "L-80474": "131865002", "L-80475": "131866001", "L-80476": "131867005", "L-80477": "131868000", "L-80478": "131869008", "L-80479": "131870009", "L-8047A": "131871008", "L-8047B": "131872001", "L-8047C": "131873006", "L-8047D": "131874000", "L-8047E": "131875004", "L-8047F": "131876003", "L-80480": "131877007", "L-80481": "131878002", "L-80482": "131879005", "L-80483": "131880008", "L-80484": "131881007", "L-80485": "131882000", "L-80486": "131883005", "L-80487": "131884004", "L-80488": "131885003", "L-80489": "131886002", "L-8048A": "131887006", "L-8048B": "131888001", "L-8048C": "131889009", "L-8048D": "131890000", "L-8048E": "131891001", "L-8048F": "131892008", "L-80490": "131893003", "L-80491": "131894009", "L-80492": "131895005", "L-80493": "131896006", "L-80494": "131897002", "L-80496": "131898007", "L-80497": "131899004", "L-80498": "131900009", "L-80499": "131901008", "L-8049A": "131902001", "L-8049B": "131903006", "L-8049C": "131904000", "L-8049D": "131905004", "L-8049E": "131906003", "L-8049F": "131907007", "L-804A1": "131908002", "L-804A2": "131909005", "L-804A3": "131910000", "L-804A4": "131911001", "L-804A5": "131912008", "L-804A6": "131913003", "L-804A7": "131914009", "L-804A8": "131915005", "L-804A9": "131916006", "L-804AA": "131917002", "L-804AC": "131919004", "L-804AD": "131920005", "L-804AE": "131921009", "L-804AF": "131922002", "L-804B1": "131923007", "L-804B2": "131924001", "L-804B3": "131925000", "L-804B4": "131926004", "L-804B5": "131927008", "L-804B6": "131928003", "L-804B7": "131929006", "L-804B8": "131930001", "L-804B9": "131931002", "L-804BA": "131932009", "L-804BB": "131933004", "L-804BC": "131934005", "L-804BD": "131935006", "L-804BE": "131936007", "L-804BF": "131937003", "L-804C1": "131938008", "L-804C2": "131939000", "L-804C3": "131940003", "L-804C4": "131941004", "L-804C5": "131942006", "L-804C6": "131943001", "L-804C7": "131944007", "L-804C8": "131945008", "L-804C9": "131946009", "L-804CA": "131947000", "L-804CB": "131948005", "L-804CC": "131949002", "L-804CD": "131950002", "L-804CE": "131951003", "L-804CF": "131952005", "L-804D1": "131953000", "L-804D2": "131954006", "L-804D3": "131955007", "L-804D4": "131956008", "L-804D5": "131957004", "L-804D6": "131958009", "L-804D7": "131959001", "L-804D9": "131960006", "L-804DA": "131961005", "L-804DB": "131962003", "L-804DC": "131963008", "L-804DE": "131964002", "L-804DF": "131965001", "L-804E1": "131966000", "L-804E2": "131967009", "L-804E3": "131968004", "L-804E4": "131969007", "L-804E5": "131970008", "L-804E6": "131971007", "L-804E7": "131972000", "L-804E8": "131973005", "L-804E9": "131974004", "L-804EA": "131975003", "L-804EB": "131976002", "L-804EC": "131977006", "L-804ED": "131978001", "L-804EE": "131979009", "L-804EF": "131980007", "L-804F1": "131981006", "L-804F2": "131982004", "L-804F3": "131983009", "L-804F4": "131984003", "L-804F5": "131985002", "L-804F6": "131986001", "L-804F7": "131987005", "L-804F8": "131988000", "L-804F9": "131989008", "L-804FA": "131990004", "L-804FB": "131991000", "L-804FC": "131992007", "L-804FE": "131993002", "L-804FF": "131994008", "L-80504": "131998006", "L-80542": "132009005", "L-80543": "132010000", "L-80544": "132011001", "L-80545": "132012008", "L-80546": "132013003", "L-80547": "132014009", "L-80548": "132015005", "L-80549": "132016006", "L-8054A": "132017002", "L-8054B": "132018007", "L-8054C": "132019004", "L-8054D": "132020005", "L-8054E": "132021009", "L-8054F": "132022002", "L-80555": "132023007", "L-80556": "132024001", "L-80557": "132025000", "L-80558": "132026004", "L-80559": "132027008", "L-8055A": "132028003", "L-8055B": "132029006", "L-8055C": "132030001", "L-8055D": "132031002", "L-8055E": "132032009", "L-8055F": "132033004", "L-8056A": "132034005", "L-8056B": "132035006", "L-8056D": "132037003", "L-8056E": "132038008", "L-8056F": "132039000", "L-8057B": "132040003", "L-8057C": "132041004", "L-8057D": "132042006", "L-8057E": "132043001", "L-8057F": "132044007", "L-80583": "132045008", "L-80584": "132046009", "L-80585": "132047000", "L-80586": "132048005", "L-80587": "132049002", "L-80588": "132050002", "L-80589": "132051003", "L-8058A": "132052005", "L-8058B": "132053000", "L-8058C": "132054006", "L-8058D": "132055007", "L-8058E": "132056008", "L-8058F": "132057004", "L-80595": "132058009", "L-80596": "132059001", "L-80597": "132060006", "L-80598": "132061005", "L-80599": "132062003", "L-8059A": "132063008", "L-8059B": "132064002", "L-8059C": "132065001", "L-8059D": "132066000", "L-8059E": "132067009", "L-8059F": "132068004", "L-805A1": "132069007", "L-805A2": "132070008", "L-805A3": "132071007", "L-805A4": "132072000", "L-805A5": "132073005", "L-805A6": "132074004", "L-805A7": "132075003", "L-805A8": "132076002", "L-805A9": "132077006", "L-805AA": "132078001", "L-805AB": "132079009", "L-805AC": "132080007", "L-805AD": "132081006", "L-805AE": "132082004", "L-805AF": "132083009", "L-805B1": "132084003", "L-805B2": "132085002", "L-805B3": "132086001", "L-805B4": "132087005", "L-805B5": "132088000", "L-805B6": "132089008", "L-805B7": "132090004", "L-805B8": "132091000", "L-805B9": "132092007", "L-805BA": "132093002", "L-805BB": "132094008", "L-805BC": "132095009", "L-805BD": "132096005", "L-805BE": "132097001", "L-805BF": "132098006", "L-805C1": "132099003", "L-805C2": "132100006", "L-805C3": "132101005", "L-805C4": "132102003", "L-805C5": "132103008", "L-805C6": "132104002", "L-805C7": "132105001", "L-805C8": "132106000", "L-805C9": "132107009", "L-805CA": "132108004", "L-805CB": "132109007", "L-805CC": "132110002", "L-805CD": "132111003", "L-805CE": "132112005", "L-805CF": "132113000", "L-805D0": "132114006", "L-805D1": "132115007", "L-805D2": "132116008", "L-805D3": "132117004", "L-805D4": "132118009", "L-805D5": "132119001", "L-805D6": "132120007", "L-805D7": "132121006", "L-805D8": "132122004", "L-805D9": "132123009", "L-805DA": "132124003", "L-805DB": "132125002", "L-805DC": "132126001", "L-805DD": "132127005", "L-805DE": "132128000", "L-805DF": "132129008", "L-805E1": "132130003", "L-805E2": "132131004", "L-805E3": "132132006", "L-805E4": "132133001", "L-805E5": "132134007", "L-805E6": "132135008", "L-805E7": "132136009", "L-805E8": "132137000", "L-805E9": "132138005", "L-805EB": "132139002", "L-805EC": "132140000", "L-805ED": "132141001", "L-805EE": "132142008", "L-805EF": "132143003", "L-805F1": "132144009", "L-805F2": "132145005", "L-805F3": "132146006", "L-805F4": "132147002", "L-805F5": "132148007", "L-805F6": "132149004", "L-805F7": "132150004", "L-805F8": "132151000", "L-805F9": "132152007", "L-805FA": "132153002", "L-805FB": "132154008", "L-805FC": "132155009", "L-805FD": "132156005", "L-805FE": "132157001", "L-805FF": "132158006", "L-8060A": "132159003", "L-8060B": "132160008", "L-8060C": "132161007", "L-8060D": "132162000", "L-8060E": "132163005", "L-8060F": "132164004", "L-80613": "132165003", "L-80614": "132166002", "L-80615": "132167006", "L-80616": "132168001", "L-80617": "132169009", "L-80618": "132170005", "L-80619": "132171009", "L-8061B": "132173007", "L-8061C": "132174001", "L-8061D": "132175000", "L-8061E": "132176004", "L-80623": "132178003", "L-80624": "132179006", "L-80625": "132180009", "L-80626": "132181008", "L-80627": "132182001", "L-80628": "132183006", "L-80629": "132184000", "L-8062A": "132185004", "L-8062B": "132186003", "L-8062C": "132187007", "L-8062D": "132188002", "L-8062E": "132189005", "L-8062F": "132190001", "L-80634": "132191002", "L-80635": "132192009", "L-80636": "132193004", "L-80637": "132194005", "L-80638": "132195006", "L-80639": "132196007", "L-8063A": "132197003", "L-8063B": "132198008", "L-8063C": "132199000", "L-8063D": "132200002", "L-8063E": "132201003", "L-8063F": "132202005", "L-80645": "132203000", "L-80646": "132204006", "L-80647": "132205007", "L-80648": "132206008", "L-80649": "132207004", "L-8064A": "132208009", "L-8064B": "132209001", "L-8064C": "132210006", "L-8064D": "132211005", "L-8064E": "132212003", "L-8064F": "132213008", "L-8065A": "132214002", "L-8065B": "132215001", "L-8065C": "132216000", "L-8065D": "132217009", "L-8065E": "132218004", "L-8065F": "132219007", "L-80664": "132220001", "L-80665": "132221002", "L-80666": "132222009", "L-80667": "132223004", "L-80668": "132224005", "L-80669": "132225006", "L-8066A": "132226007", "L-8066B": "132227003", "L-8066C": "132228008", "L-8066D": "132229000", "L-8066E": "132230005", "L-8066F": "132231009", "L-80670": "132232002", "L-80671": "132233007", "L-80672": "132234001", "L-80673": "132235000", "L-80674": "132236004", "L-80675": "132237008", "L-80676": "132238003", "L-80677": "132239006", "L-80678": "132240008", "L-80679": "132241007", "L-8067A": "132242000", "L-8067B": "132243005", "L-8067C": "132244004", "L-8067D": "132245003", "L-8067E": "132246002", "L-8067F": "132247006", "L-80680": "132248001", "L-80681": "132249009", "L-80682": "132250009", "L-80683": "132251008", "L-80684": "132252001", "L-80685": "132253006", "L-80686": "132254000", "L-80687": "132255004", "L-80688": "132256003", "L-80689": "132257007", "L-8068A": "132258002", "L-8068B": "132259005", "L-8068C": "132260000", "L-8068D": "132261001", "L-8068E": "132262008", "L-8068F": "132263003", "L-80690": "132264009", "L-80691": "132265005", "L-80692": "132266006", "L-80693": "132267002", "L-80694": "132268007", "L-80695": "132269004", "L-80696": "132270003", "L-80697": "132271004", "L-80698": "132272006", "L-80699": "132273001", "L-8069A": "132274007", "L-8069B": "132275008", "L-8069C": "132276009", "L-8069D": "132277000", "L-8069E": "132278005", "L-8069F": "132279002", "L-806A1": "132280004", "L-806A2": "132281000", "L-806A3": "132282007", "L-806A4": "132283002", "L-806A5": "132284008", "L-806A6": "132285009", "L-806A7": "132286005", "L-806A8": "132287001", "L-806A9": "132288006", "L-806AA": "132289003", "L-806AB": "132290007", "L-806AC": "132291006", "L-806AD": "132292004", "L-806AE": "132293009", "L-806AF": "132294003", "L-806B1": "132295002", "L-806B2": "132296001", "L-806B3": "132297005", "L-806B4": "132298000", "L-806B5": "132299008", "L-806B6": "132300000", "L-806B7": "132301001", "L-806B8": "132302008", "L-806B9": "132303003", "L-806BA": "132304009", "L-806BB": "132305005", "L-806BC": "132306006", "L-806BD": "132307002", "L-806BE": "132308007", "L-806BF": "132309004", "L-806C1": "132310009", "L-806C2": "132311008", "L-806C3": "132312001", "L-806C4": "132313006", "L-806C5": "132314000", "L-806C6": "132315004", "L-806C7": "132316003", "L-806C8": "132317007", "L-806C9": "132318002", "L-806CA": "132319005", "L-806CB": "132320004", "L-806CC": "132321000", "L-806CD": "132322007", "L-806CE": "132323002", "L-806CF": "132324008", "L-806D1": "132325009", "L-806D2": "132326005", "L-806D3": "132327001", "L-806D4": "132328006", "L-806D5": "132329003", "L-806D6": "132330008", "L-806D7": "132331007", "L-806D8": "132332000", "L-806D9": "132333005", "L-806DA": "132334004", "L-806DB": "132335003", "L-806DC": "132336002", "L-806DD": "132337006", "L-806DE": "132338001", "L-806DF": "132339009", "L-806E1": "132340006", "L-806E2": "132341005", "L-806E3": "132342003", "L-806E4": "132343008", "L-806E5": "132344002", "L-806E6": "132345001", "L-806E7": "132346000", "L-806E8": "132347009", "L-806E9": "132348004", "L-806EA": "132349007", "L-806EB": "132350007", "L-806EC": "132351006", "L-806ED": "132352004", "L-806EE": "132353009", "L-806EF": "132354003", "L-806F1": "132355002", "L-806F2": "132356001", "L-806F3": "132357005", "L-806F4": "132358000", "L-806F5": "132359008", "L-806F6": "132360003", "L-806F8": "132361004", "L-806F9": "132362006", "L-806FA": "132363001", "L-806FB": "132364007", "L-806FC": "132365008", "L-806FD": "132366009", "L-806FE": "132367000", "L-806FF": "132368005", "L-8077A": "132369002", "L-807E2": "132371002", "L-807E3": "132372009", "L-807E4": "132373004", "L-807E5": "132374005", "L-807E7": "132376007", "L-807E8": "132377003", "L-807E9": "132378008", "L-807EA": "132379000", "L-807EB": "132380002", "L-807EC": "132381003", "L-807ED": "132382005", "L-807EE": "132383000", "L-807EF": "132384006", "L-807F1": "132385007", "L-807F2": "132386008", "L-808A1": "132387004", "L-808A2": "132388009", "L-808A3": "132389001", "L-808A4": "132390005", "L-808A5": "132391009", "L-808A6": "132392002", "L-808A7": "132393007", "L-808A8": "132394001", "L-808A9": "132395000", "L-808AA": "132396004", "L-808AB": "132397008", "L-808AC": "132398003", "L-808AD": "132399006", "L-808AE": "132400004", "L-808AF": "132401000", "L-808B1": "132402007", "L-808B2": "132403002", "L-808B3": "132404008", "L-808B4": "132405009", "L-808B5": "132406005", "L-808B6": "132407001", "L-808B7": "132408006", "L-808B8": "132409003", "L-808B9": "132410008", "L-808BA": "132411007", "L-808BB": "132412000", "L-808BC": "132413005", "L-808BD": "132414004", "L-808BE": "132415003", "L-808BF": "132416002", "L-808C1": "132417006", "L-808C2": "132418001", "L-808C3": "132419009", "L-808C4": "132420003", "L-808C5": "132421004", "L-808C6": "132422006", "L-808C7": "132423001", "L-808C8": "132424007", "L-808CA": "132426009", "L-808CB": "132427000", "L-808CC": "132428005", "L-808CD": "132429002", "L-808CE": "132430007", "L-808CF": "132431006", "L-808D1": "132432004", "L-808D2": "132433009", "L-808D3": "132434003", "L-808D4": "132435002", "L-808D5": "132436001", "L-808D6": "132437005", "L-808D7": "132438000", "L-808D8": "132439008", "L-808D9": "132440005", "L-808DA": "132441009", "L-808DB": "132442002", "L-808DC": "132443007", "L-808DD": "132444001", "L-808DE": "132445000", "L-808DF": "132446004", "L-808E1": "132447008", "L-808E2": "132448003", "L-808E3": "132449006", "L-808E4": "132450006", "L-808E5": "132451005", "L-808E6": "132452003", "L-808E7": "132453008", "L-808E8": "132454002", "L-808E9": "132455001", "L-808EA": "132456000", "L-808EB": "132457009", "L-808EC": "132458004", "L-808ED": "132459007", "L-808EE": "132460002", "L-808EF": "132461003", "L-808F1": "132462005", "L-808F2": "132463000", "L-808F3": "132464006", "L-808F4": "132465007", "L-808F5": "132466008", "L-808F6": "132467004", "L-808F8": "132468009", "L-808F9": "132469001", "L-808FA": "132470000", "L-808FB": "132471001", "L-808FC": "132472008", "L-808FD": "132473003", "L-808FE": "132474009", "L-808FF": "132475005", "L-80916": "132476006", "L-80917": "132477002", "L-80918": "132478007", "L-80919": "132479004", "L-80920": "132480001", "L-80921": "132481002", "L-80922": "132482009", "L-80923": "132483004", "L-80924": "132484005", "L-80925": "132485006", "L-80926": "132486007", "L-80927": "132487003", "L-80928": "132488008", "L-80929": "132489000", "L-80930": "132490009", "L-80931": "132491008", "L-80932": "132492001", "L-80933": "132493006", "L-80934": "132494000", "L-80935": "132495004", "L-80936": "132496003", "L-80937": "132497007", "L-80938": "132498002", "L-80939": "132499005", "L-80940": "132500001", "L-80941": "132501002", "L-80942": "132502009", "L-80943": "132503004", "L-80944": "132504005", "L-80945": "132505006", "L-80946": "132506007", "L-80947": "132507003", "L-80948": "132508008", "L-80949": "132509000", "L-80950": "132510005", "L-80951": "132511009", "L-80952": "132512002", "L-80953": "132513007", "L-80954": "132514001", "L-80955": "132515000", "L-80956": "132516004", "L-80957": "132517008", "L-80958": "132518003", "L-80959": "132519006", "L-80960": "132520000", "L-80961": "132521001", "L-80962": "132522008", "L-80963": "132523003", "L-80964": "132524009", "L-80965": "132525005", "L-80966": "132526006", "L-80967": "132527002", "L-80968": "132528007", "L-80969": "132529004", "L-80970": "132530009", "L-80971": "132531008", "L-80972": "132532001", "L-80973": "132533006", "L-80974": "132534000", "L-80975": "132535004", "L-80976": "132536003", "L-80977": "132537007", "L-80978": "132538002", "L-80979": "132539005", "L-80980": "132540007", "L-80981": "132541006", "L-80982": "132542004", "L-80983": "132543009", "L-80984": "132544003", "L-80985": "132545002", "L-80986": "132546001", "L-80987": "132547005", "L-80988": "132548000", "L-80989": "132549008", "L-80990": "132550008", "L-80991": "132551007", "L-80992": "132552000", "L-80993": "132553005", "L-80994": "132554004", "L-80995": "132555003", "L-80996": "132556002", "L-80997": "132557006", "L-80998": "132558001", "L-80999": "132559009", "L-809A1": "132560004", "L-809A2": "132561000", "L-809A3": "132562007", "L-809A4": "132563002", "L-809A5": "132564008", "L-809A6": "132565009", "L-809A7": "132566005", "L-809A8": "132567001", "L-809A9": "132568006", "L-809AA": "132569003", "L-809AB": "132570002", "L-809AC": "132571003", "L-809AD": "132572005", "L-809AE": "132573000", "L-809AF": "132574006", "L-809B1": "132575007", "L-809B2": "132576008", "L-809B3": "132577004", "L-809B4": "132578009", "L-809B5": "132579001", "L-809B6": "132580003", "L-809B7": "132581004", "L-809B8": "132582006", "L-809B9": "132583001", "L-809BA": "132584007", "L-809BB": "132585008", "L-809BC": "132586009", "L-809BD": "132587000", "L-809BE": "132588005", "L-809BF": "132589002", "L-809C1": "132590006", "L-809C2": "132591005", "L-809C3": "132592003", "L-809C4": "132593008", "L-809C5": "132594002", "L-809C6": "132595001", "L-809C7": "132596000", "L-809C8": "132597009", "L-809C9": "132598004", "L-809CA": "132599007", "L-809CB": "132600005", "L-809CC": "132601009", "L-809CD": "132602002", "L-809CE": "132603007", "L-809CF": "132604001", "L-809D1": "132605000", "L-809D2": "132606004", "L-809D3": "132607008", "L-809D4": "132608003", "L-809D5": "132609006", "L-809D6": "132610001", "L-809D7": "132611002", "L-809D8": "132612009", "L-809D9": "132613004", "L-809DA": "132614005", "L-809DB": "132615006", "L-809DC": "132616007", "L-809DD": "132617003", "L-809DE": "132618008", "L-809DF": "132619000", "L-809E1": "132620006", "L-809E2": "132621005", "L-809E3": "132622003", "L-809E4": "132623008", "L-809E5": "132624002", "L-809E6": "132625001", "L-809E7": "132626000", "L-809E8": "132627009", "L-809EA": "132629007", "L-809EB": "132630002", "L-809EC": "132631003", "L-809ED": "132632005", "L-809EE": "132633000", "L-809EF": "132634006", "L-809F1": "132635007", "L-809F2": "132636008", "L-809F3": "132637004", "L-809F4": "132638009", "L-809F5": "132639001", "L-809F6": "132640004", "L-809F7": "132641000", "L-809F8": "132642007", "L-809F9": "132643002", "L-809FA": "132644008", "L-809FB": "132645009", "L-809FC": "132646005", "L-809FD": "132647001", "L-809FE": "132648006", "L-809FF": "132649003", "L-80A70": "132650003", "L-80A71": "132651004", "L-80A73": "132652006", "L-80A74": "132653001", "L-80A75": "132654007", "L-80A76": "132655008", "L-80A77": "132656009", "L-80A78": "132657000", "L-80A79": "132658005", "L-80A80": "132659002", "L-80A81": "132660007", "L-80A83": "132661006", "L-80A84": "132662004", "L-80A85": "132663009", "L-80A86": "132664003", "L-80A87": "132665002", "L-80A88": "132666001", "L-80A89": "132667005", "L-80A90": "132668000", "L-80A91": "132669008", "L-80A92": "132670009", "L-80A93": "132671008", "L-80A94": "132672001", "L-80A95": "132673006", "L-80A97": "132675004", "L-80A99": "132676003", "L-80AA1": "132677007", "L-80AA2": "132678002", "L-80AA3": "132679005", "L-80AA4": "132680008", "L-80B01": "132681007", "L-80B02": "132682000", "L-80B04": "132684004", "L-80B05": "132685003", "L-80B06": "132686002", "L-80B07": "132687006", "L-80B08": "132688001", "L-80B09": "132689009", "L-80B10": "132690000", "L-80B17": "132697002", "L-80B18": "132698007", "L-80B19": "132699004", "L-80B22": "132701004", "L-80B23": "132702006", "L-80B24": "132703001", "L-80B25": "132704007", "L-80B26": "132705008", "L-80B27": "132706009", "L-80B2A": "132707000", "L-80B2B": "132708005", "L-80B2C": "132709002", "L-80B2D": "132710007", "L-80B2E": "132711006", "L-80B2F": "132712004", "L-80B33": "132716001", "L-80B34": "132717005", "L-80B35": "132718000", "L-80B36": "132719008", "L-80B37": "132720002", "L-80B38": "132721003", "L-80B39": "132722005", "L-80B3A": "132723000", "L-80B40": "132724006", "L-80B47": "132731005", "L-80B48": "132732003", "L-80B49": "132733008", "L-80B4A": "132734002", "L-80B4B": "132735001", "L-80B50": "132736000", "L-80B51": "132737009", "L-80B52": "132738004", "L-80B53": "132739007", "L-80B54": "132740009", "L-80B55": "132741008", "L-80B56": "132742001", "L-80B57": "132743006", "L-80B58": "132744000", "L-80B59": "132745004", "L-80B5A": "132746003", "L-80B5B": "132747007", "L-80B5C": "132748002", "L-80B5D": "132749005", "L-80B5E": "132750005", "L-80B5F": "132751009", "L-80B65": "132757008", "L-80B66": "132758003", "L-80B67": "132759006", "L-80B68": "132760001", "L-80B69": "132761002", "L-80B6A": "132762009", "L-80B6B": "132763004", "L-80B6C": "132764005", "L-80B6D": "132765006", "L-80B6E": "132766007", "L-80B6F": "132767003", "L-80B70": "132768008", "L-80B71": "132769000", "L-80B80": "132770004", "L-80B81": "132771000", "L-80B82": "132772007", "L-80B83": "132773002", "L-80B84": "132774008", "L-80B85": "132775009", "L-80B86": "132776005", "L-80B87": "132777001", "L-80B88": "132778006", "L-80B89": "132779003", "L-80B8A": "132780000", "L-80B8B": "132781001", "L-80B8C": "132782008", "L-80B8D": "132783003", "L-80B8E": "132784009", "L-80B8F": "132785005", "L-80B90": "132786006", "L-80B91": "132787002", "L-80B92": "132788007", "L-80B93": "132789004", "L-80B94": "132790008", "L-80B95": "132791007", "L-80B96": "132792000", "L-80B97": "132793005", "L-80B98": "132794004", "L-80B99": "132795003", "L-80B9A": "132796002", "L-80B9B": "132797006", "L-80B9C": "132798001", "L-80B9D": "132799009", "L-80B9E": "132800008", "L-80B9F": "132801007", "L-80BA1": "132802000", "L-80BA2": "132803005", "L-80BA3": "132804004", "L-80BA4": "132805003", "L-80BA5": "132806002", "L-80BA6": "132807006", "L-80BA7": "132808001", "L-80BA8": "132809009", "L-80BA9": "132810004", "L-80BB1": "132811000", "L-80BB2": "132812007", "L-80BB3": "132813002", "L-80BB4": "132814008", "L-80BB5": "132815009", "L-80BE6": "132843000", "L-80BE7": "132844006", "L-80BE8": "132845007", "L-80BE9": "132846008", "L-80BF6": "132849001", "L-80BF8": "132851002", "L-80BF9": "132852009", "L-80C01": "132853004", "L-80C02": "132854005", "L-80C22": "132855006", "L-80C23": "132856007", "L-80C24": "132857003", "L-80C25": "132858008", "L-80C29": "132859000", "L-80C30": "132860005", "L-80C31": "132861009", "L-86B36": "132888004", "L-86B49": "132901006", "L-8A111": "132951001", "L-8A112": "132952008", "L-8A113": "132953003", "L-8A115": "132954009", "L-8A116": "132955005", "L-8A117": "132956006", "L-8A118": "132957002", "L-8A125": "132960009", "L-8A126": "132961008", "L-8A127": "132962001", "L-8A128": "132963006", "L-8A129": "132964000", "L-8A12A": "132965004", "L-8A12B": "132966003", "L-8A12C": "132967007", "L-8A12D": "132968002", "L-8A12E": "132969005", "L-8A12F": "132970006", "L-8A130": "132971005", "L-8A131": "132972003", "L-8A132": "132973008", "L-8A133": "132974002", "L-8A134": "132975001", "L-8A135": "132976000", "L-8A136": "132977009", "L-8A137": "132978004", "L-8A138": "132979007", "L-8A139": "132980005", "L-8A13A": "132981009", "L-8A13B": "132982002", "L-8A13C": "132983007", "L-8A13D": "132984001", "L-8A13E": "132985000", "L-8A13F": "132986004", "L-8A14A": "132990002", "L-8A14B": "132991003", "L-8A14C": "132992005", "L-8A14D": "132993000", "L-8A150": "132994006", "L-8A151": "132995007", "L-8A152": "132996008", "L-8A153": "132997004", "L-8A154": "132998009", "L-8A155": "132999001", "L-8A156": "133000000", "L-8A157": "133001001", "L-8A158": "133002008", "L-8A159": "133003003", "L-8A15A": "133004009", "L-8A15B": "133005005", "L-8A15C": "133006006", "L-8A15D": "133007002", "L-8A15E": "133008007", "L-8A15F": "133009004", "L-8A160": "133010009", "L-8A161": "133011008", "L-8A162": "133012001", "L-8A163": "133013006", "L-8A164": "133014000", "L-8A165": "133015004", "L-8A166": "133016003", "L-8A167": "133017007", "L-8A168": "133018002", "L-8A169": "133019005", "L-8A16A": "133020004", "L-8A16B": "133021000", "L-8A16C": "133022007", "L-8A16D": "133023002", "L-8A16E": "133024008", "L-8A16F": "133025009", "L-8A170": "133026005", "L-8A171": "133027001", "L-8A172": "133028006", "L-8A173": "133029003", "L-8A174": "133030008", "L-8A175": "133031007", "L-8A176": "133032000", "L-8A177": "133033005", "L-8A178": "133034004", "L-8A179": "133035003", "L-8A17A": "133036002", "L-8A17B": "133037006", "L-8A17C": "133038001", "L-8A17D": "133039009", "L-8A17E": "133040006", "L-8A17F": "133041005", "L-8A180": "133042003", "L-8A181": "133043008", "L-8A182": "133044002", "L-8A183": "133045001", "L-8A184": "133046000", "L-8A185": "133047009", "L-8A186": "133048004", "L-8A187": "133049007", "L-8A188": "133050007", "L-8A189": "133051006", "L-8A18A": "133052004", "L-8A18B": "133053009", "L-8A18C": "133054003", "L-8A18D": "133055002", "L-8A18E": "133056001", "L-8A18F": "133057005", "L-8A190": "133058000", "L-8A191": "133059008", "L-8A192": "133060003", "L-8A193": "133061004", "L-8A194": "133062006", "L-8A195": "133063001", "L-8A196": "133064007", "L-8A197": "133065008", "L-8A198": "133066009", "L-8A199": "133067000", "L-8A19A": "133068005", "L-8A19B": "133069002", "L-8A19C": "133070001", "L-8A19E": "133071002", "L-8A19F": "133072009", "L-8A1A1": "133073004", "L-8A1A2": "133074005", "L-8A1A3": "133075006", "L-8A1A4": "133076007", "L-8A1A5": "133077003", "L-8A1A6": "133078008", "L-8A1A7": "133079000", "L-8A1A8": "133080002", "L-8A1A9": "133081003", "L-8A1AA": "133082005", "L-8A1AB": "133083000", "L-8A1AC": "133084006", "L-8A1AD": "133085007", "L-8A1AE": "133086008", "L-8A1AF": "133087004", "L-8A1B1": "133088009", "L-8A1B2": "133089001", "L-8A1B4": "133090005", "L-8A1B5": "133091009", "L-8A1B6": "133092002", "L-8A1B7": "133093007", "L-8A1B8": "133094001", "L-8A1B9": "133095000", "L-8A1BA": "133096004", "L-8A1BB": "133097008", "L-8A1BC": "133098003", "L-8A1BD": "133099006", "L-8A1BE": "133100003", "L-8A1BF": "133101004", "L-8A1C1": "133102006", "L-8A1C2": "133103001", "L-8A1C3": "133104007", "L-8A1C4": "133105008", "L-8A1C5": "133106009", "L-8A1C6": "133107000", "L-8A1C7": "133108005", "L-8A1C8": "133109002", "L-8A1C9": "133110007", "L-8A1CA": "133111006", "L-8A1CB": "133112004", "L-8A1CC": "133113009", "L-8A1CD": "133114003", "L-8A1CE": "133115002", "L-8A1CF": "133116001", "L-8A1D1": "133117005", "L-8A1D2": "133118000", "L-8A1D3": "133119008", "L-8A1D4": "133120002", "L-8A1D5": "133121003", "L-8A1D6": "133122005", "L-8A1D7": "133123000", "L-8A1D8": "133124006", "L-8A1D9": "133125007", "L-8A1DA": "133126008", "L-8A1DB": "133127004", "L-8A1DC": "133128009", "L-8A1DD": "133129001", "L-8A1DE": "133130006", "L-8A1DF": "133131005", "L-8A1E1": "133132003", "L-8A1E2": "133133008", "L-8A1E3": "133134002", "L-8A1E4": "133135001", "L-8A1E5": "133136000", "L-8A1E6": "133137009", "L-8A1E7": "133138004", "L-8A1E8": "133139007", "L-8A1E9": "133140009", "L-8A1EA": "133141008", "L-8A1EB": "133142001", "L-8A1EC": "133143006", "L-8A1ED": "133144000", "L-8A1EE": "133145004", "L-8A1EF": "133146003", "L-8A1F1": "133147007", "L-8A1F2": "133148002", "L-8A1F3": "133149005", "L-8A1F4": "133150005", "L-8A1F5": "133151009", "L-8A1F6": "133152002", "L-8A1F7": "133153007", "L-8A1F8": "133154001", "L-8A1FA": "133155000", "L-8A1FB": "133156004", "L-8A1FC": "133157008", "L-8A1FD": "133158003", "L-8A1FE": "133159006", "L-8A1FF": "133160001", "L-8B105": "133161002", "L-8B106": "133162009", "L-8B107": "133163004", "L-8B108": "133164005", "L-8B109": "133165006", "L-8B111": "133166007", "L-8B112": "133167003", "L-8B113": "133168008", "L-8B114": "133169000", "L-8B115": "133170004", "L-8B116": "133171000", "L-8B117": "133172007", "L-8B118": "133173002", "L-8B119": "133174008", "L-8B121": "133175009", "L-8B122": "133176005", "L-8B123": "133177001", "L-8B124": "133178006", "L-8B125": "133179003", "L-8B126": "133180000", "L-8B127": "133181001", "L-8B128": "133182008", "L-8B129": "133183003", "L-8B130": "133184009", "L-8B131": "133185005", "L-8B132": "133186006", "L-8B133": "133187002", "L-8B134": "133188007", "L-8B135": "133189004", "L-8B136": "133190008", "L-8B137": "133191007", "L-8B139": "133192000", "L-8B140": "133193005", "L-8B141": "133194004", "L-8B142": "133195003", "L-8B143": "133196002", "L-8B144": "133197006", "L-8B145": "133198001", "L-8B146": "133199009", "L-8B147": "133200007", "L-8B148": "133201006", "L-8B149": "133202004", "L-8B150": "133203009", "L-8B151": "133204003", "L-8B152": "133205002", "L-8B153": "133206001", "L-8B155": "133207005", "L-8B156": "133208000", "L-8B157": "133209008", "L-8B158": "133210003", "L-8B159": "133211004", "L-8B160": "133212006", "L-8B161": "133213001", "L-8B162": "133214007", "L-8B163": "133215008", "L-8B164": "133216009", "L-8B165": "133217000", "L-8B166": "133218005", "L-8B167": "133219002", "L-8B168": "133220008", "L-8B169": "133221007", "L-8B170": "133222000", "L-8B171": "133223005", "L-8B172": "133224004", "L-8B173": "133225003", "L-8B174": "133226002", "L-8B175": "133227006", "L-8B176": "133228001", "L-8B177": "133229009", "L-8B178": "133230004", "L-8B958": "133231000", "L-8B959": "133232007", "L-8B95A": "133233002", "L-8B95B": "133234008", "L-8B95C": "133235009", "L-8B95D": "133236005", "L-8B95E": "133237001", "L-8B95F": "133238006", "L-8B961": "133239003", "L-8B962": "133240001", "L-8B963": "133241002", "L-8B964": "133242009", "L-8B966": "133243004", "L-8B967": "133244005", "L-8B968": "133245006", "L-8B969": "133246007", "L-8B96A": "133247003", "L-8B96B": "133248008", "L-8B96C": "133249000", "L-8B96D": "133250000", "L-8B96E": "133251001", "L-8B96F": "133252008", "L-8B971": "133253003", "L-8B972": "133254009", "L-8B973": "133255005", "L-8B974": "133256006", "L-8B975": "133257002", "L-8B976": "133258007", "L-8B977": "133259004", "L-8B978": "133260009", "L-8B979": "133261008", "L-8B97A": "133262001", "L-8B97B": "133263006", "L-8B97C": "133264000", "L-8B97D": "133265004", "L-8B97E": "133266003", "L-8B97F": "133267007", "L-8B983": "133268002", "L-8B984": "133269005", "L-8B985": "133270006", "L-8B987": "133271005", "L-8B988": "133272003", "L-8B989": "133273008", "L-8B98A": "133274002", "L-8B98B": "133275001", "L-8B98C": "133276000", "L-8B98D": "133277009", "L-8B98E": "133278004", "L-8B98F": "133279007", "L-8B990": "133280005", "L-8B991": "133281009", "L-8B992": "133282002", "L-8B993": "133283007", "L-8B994": "133284001", "L-8B995": "133285000", "L-8B996": "133286004", "L-8B998": "133287008", "L-8B999": "133288003", "L-8B99A": "133289006", "L-8B99B": "133290002", "L-8B99C": "133291003", "L-8B99D": "133292005", "L-8B99E": "133293000", "L-8B99F": "133294006", "L-8B9A0": "133295007", "L-8B9A1": "133296008", "L-8B9A2": "133297004", "L-8B9A3": "133298009", "L-8B9A4": "133299001", "L-8B9A5": "133300009", "L-8B9A6": "133301008", "L-8B9A7": "133302001", "L-8B9A8": "133303006", "L-8B9A9": "133304000", "L-8B9AA": "133305004", "L-8B9AB": "133306003", "L-8B9AC": "133307007", "L-8B9AD": "133308002", "L-8B9AE": "133309005", "L-8B9AF": "133310000", "L-8B9B0": "133311001", "L-8B9B1": "133312008", "L-8B9B2": "133313003", "L-8B9B3": "133314009", "L-8B9B4": "133315005", "L-8B9B5": "133316006", "L-8B9B6": "133317002", "L-8B9B7": "133318007", "L-8B9B8": "133319004", "L-8B9B9": "133320005", "L-8B9BA": "133321009", "L-8B9BB": "133322002", "L-8B9BC": "133323007", "L-8B9BD": "133324001", "L-8B9BE": "133325000", "L-8B9BF": "133326004", "L-8B9C0": "133327008", "L-8B9C1": "133328003", "L-8B9C2": "133329006", "L-8B9C3": "133330001", "L-8B9C4": "133331002", "L-8B9C5": "133332009", "L-8B9C6": "133333004", "L-8B9C7": "133334005", "L-8B9C8": "133335006", "L-8B9C9": "133336007", "L-8B9CA": "133337003", "L-8B9CB": "133338008", "L-8B9CC": "133339000", "L-8B9CD": "133340003", "L-8B9CE": "133341004", "L-8B9CF": "133342006", "L-8B9D0": "133343001", "L-8B9D1": "133344007", "L-8B9D2": "133345008", "L-8B9D3": "133346009", "L-8B9D4": "133347000", "L-8B9D5": "133348005", "L-8B9D6": "133349002", "L-8B9D7": "133350002", "L-8B9D8": "133351003", "L-8B9D9": "133352005", "L-8B9DA": "133353000", "L-8B9DB": "133354006", "L-8B9DC": "133355007", "L-8B9DD": "133356008", "L-8B9DE": "133357004", "L-8B9DF": "133358009", "L-8B9E0": "133359001", "L-8B9E1": "133360006", "L-8B9E2": "133361005", "L-8B9E3": "133362003", "L-8B9E4": "133363008", "L-8B9E5": "133364002", "L-8B9E6": "133365001", "L-8B9E7": "133366000", "L-8B9E8": "133367009", "L-8B9E9": "133368004", "L-8B9EA": "133369007", "L-8B9EB": "133370008", "L-8B9EC": "133371007", "L-8B9ED": "133372000", "L-8B9EE": "133373005", "L-8B9EF": "133374004", "L-8B9F0": "133375003", "L-8B9F1": "133376002", "L-8B9F2": "133377006", "L-8B9F3": "133378001", "L-8B9F4": "133379009", "L-8B9F5": "133380007", "L-8B9F6": "133381006", "L-8B9F7": "133382004", "L-8B9FA": "133383009", "L-8B9FB": "133384003", "L-8B9FC": "133385002", "L-8B9FD": "133386001", "L-8B9FE": "133387005", "L-8B9FF": "133388000", "L-8BA00": "133389008", "L-8BA01": "133390004", "L-8BA02": "133391000", "L-8BA03": "133392007", "L-8BA04": "133393002", "L-8BA05": "133394008", "L-8BA06": "133395009", "L-8BA07": "133396005", "L-8BA08": "133397001", "L-8BA09": "133398006", "L-8BA0A": "133399003", "L-8BA0B": "133400005", "L-8BA0C": "133401009", "L-8BA0D": "133402002", "L-8BA0E": "133403007", "L-8BA0F": "133404001", "L-8BA10": "133405000", "L-8BA11": "133406004", "L-8BA12": "133407008", "L-8BA13": "133408003", "L-8BA14": "133409006", "L-8BA15": "133410001", "L-8BA16": "133411002", "L-8BA17": "133412009", "L-8BA19": "133413004", "L-8BA1A": "133414005", "L-8BA1B": "133415006", "L-8BA1C": "133416007", "L-8BA1D": "133417003", "L-8BA1E": "133418008", "L-8BA1F": "133419000", "L-8BA20": "133420006", "L-8BA21": "133421005", "L-8BA22": "133422003", "L-8BA23": "133423008", "L-8BA24": "133424002", "L-8BA25": "133425001", "L-8BA26": "133426000", "L-8BA27": "133427009", "L-8BA28": "133428004", "L-8BA29": "133429007", "L-8BA2A": "133430002", "L-8BA2B": "133431003", "L-8BA2C": "133432005", "L-8BA2D": "133433000", "L-8BA2E": "133434006", "L-8BA2F": "133435007", "L-8BA30": "133436008", "L-8BA31": "133437004", "L-8BA32": "133438009", "L-8BA33": "133439001", "L-8BA34": "133440004", "L-8BA35": "133441000", "L-8BA36": "133442007", "L-8BA37": "133443002", "L-8BA38": "133444008", "L-8BA39": "133445009", "L-8BA3A": "133446005", "L-8BA3B": "133447001", "L-8BA3C": "133448006", "L-8BA3D": "133449003", "L-8BA3E": "133450003", "L-8BA3F": "133451004", "L-8BA40": "133452006", "L-8BA41": "133453001", "L-8BA42": "133454007", "L-8BA43": "133455008", "L-8BA44": "133456009", "L-8BA45": "133457000", "L-8BA46": "133458005", "L-8BA47": "133459002", "L-8BA48": "133460007", "L-8BA49": "133461006", "L-8BA4A": "133462004", "L-8BA4B": "133463009", "L-8BA4C": "133464003", "L-8BA4D": "133465002", "L-8BA4E": "133466001", "L-8BA4F": "133467005", "L-8BA50": "133468000", "L-8BA51": "133469008", "L-8BA52": "133470009", "L-8BA53": "133471008", "L-8BA54": "133472001", "L-8BA55": "133473006", "L-8BA56": "133474000", "L-8BA57": "133475004", "L-8BA58": "133476003", "L-8BA59": "133477007", "L-8BA5A": "133478002", "L-8BA5B": "133479005", "L-8BA5C": "133480008", "L-8BA5D": "133481007", "L-8BA5E": "133482000", "L-8BA5F": "133483005", "L-8BA60": "133484004", "L-8BA61": "133485003", "L-8BA62": "133486002", "L-8BA63": "133487006", "L-8BA64": "133488001", "L-8BA65": "133489009", "L-8BA66": "133490000", "L-8BA67": "133491001", "L-8BA68": "133492008", "L-8BA69": "133493003", "L-8BA6A": "133494009", "L-8BA6B": "133495005", "L-8BA6C": "133496006", "L-8BA6D": "133497002", "L-8BA6E": "133498007", "L-8BA6F": "133499004", "L-8BA70": "133500008", "L-8BA71": "133501007", "L-8BA72": "133502000", "L-8BA73": "133503005", "L-8BA74": "133504004", "L-8BA75": "133505003", "L-8BA76": "133506002", "L-8BA77": "133507006", "L-8BA78": "133508001", "L-8BA79": "133509009", "L-8BA7A": "133510004", "L-8BA7B": "133511000", "L-8BA7C": "133512007", "L-8BA7D": "133513002", "L-8BA7E": "133514008", "L-8BA7F": "133515009", "L-8BA80": "133516005", "L-8BA81": "133517001", "L-8BA82": "133518006", "L-8BA83": "133519003", "L-8BA84": "133520009", "L-8BA85": "133521008", "L-8BA86": "133522001", "L-8BA87": "133523006", "L-8BA88": "133524000", "L-8BA89": "133525004", "L-8BA8A": "133526003", "L-8BA8B": "133527007", "L-8BA8C": "133528002", "L-8BA8D": "133529005", "L-8BA8E": "133530000", "L-8BA8F": "133531001", "L-8BA90": "133532008", "L-8BA91": "133533003", "L-8BA92": "133534009", "L-8BA93": "133535005", "L-8BA94": "133536006", "L-8BA95": "133537002", "L-8BA96": "133538007", "L-8BA97": "133539004", "L-8BA98": "133540002", "L-8BA99": "133541003", "L-8BA9A": "133542005", "L-8BA9B": "133543000", "L-8BA9C": "133544006", "L-8BA9D": "133545007", "L-8BA9E": "133546008", "L-8BA9F": "133547004", "L-8BAA0": "133548009", "L-8BAA1": "133549001", "L-8BAA2": "133550001", "L-8BAA3": "133551002", "L-8BAA4": "133552009", "L-8BAA5": "133553004", "L-8BAA6": "133554005", "L-8BAA7": "133555006", "L-8BAA8": "133556007", "L-8BAA9": "133557003", "L-8BAAA": "133558008", "L-8BAAB": "133559000", "L-8BAAC": "133560005", "L-8BAAD": "133561009", "L-8BAAE": "133562002", "L-8BAAF": "133563007", "L-8BAB0": "133564001", "L-8BAB1": "133565000", "L-8BAB2": "133566004", "L-8BAB3": "133567008", "L-8BAB4": "133568003", "L-8BAB5": "133569006", "L-8BAB6": "133570007", "L-8BAB7": "133571006", "L-8BAB8": "133572004", "L-8BAB9": "133573009", "L-8BABA": "133574003", "L-8BABB": "133575002", "L-8BABC": "133576001", "L-8BABD": "133577005", "L-8BABE": "133578000", "L-8BABF": "133579008", "L-8BAC0": "133580006", "L-8BAC1": "133581005", "L-8BAC2": "133582003", "L-8BAC3": "133583008", "L-8BAC4": "133584002", "L-8BAC5": "133585001", "L-8BAC6": "133586000", "L-8BAC7": "133587009", "L-8BAC8": "133588004", "L-8BAC9": "133589007", "L-8BACA": "133590003", "L-8BACB": "133591004", "L-8BACC": "133592006", "L-8BACD": "133593001", "L-8BACE": "133594007", "L-8BACF": "133595008", "L-8BAD0": "133596009", "L-8BAD1": "133597000", "L-8BAD2": "133598005", "L-8BAD3": "133599002", "L-8BAD4": "133600004", "L-8BAD5": "133601000", "L-8BAD6": "133602007", "L-8BAD7": "133603002", "L-8BAD8": "133604008", "L-8BAD9": "133605009", "L-8BADA": "133606005", "L-8BADB": "133607001", "L-8BADC": "133608006", "L-8BADD": "133609003", "L-8BADE": "133610008", "L-8BADF": "133611007", "L-8BAE0": "133612000", "L-8BAE1": "133613005", "L-8BAE2": "133614004", "L-8BAE3": "133615003", "L-8BAE4": "133616002", "L-8BAE5": "133617006", "L-8BAE6": "133618001", "L-8BAE7": "133619009", "L-8BAE9": "133620003", "L-8BAEA": "133621004", "L-8BAEB": "133622006", "L-8BAEC": "133623001", "L-8BAED": "133624007", "L-8BAEE": "133625008", "L-8BAEF": "133626009", "L-8BAF0": "133627000", "L-8BAF1": "133628005", "L-8BAF2": "133629002", "L-8BAF3": "133630007", "L-8BAF4": "133631006", "L-8BAF5": "133632004", "L-8BAF6": "133633009", "L-8BAF7": "133634003", "L-8BAF8": "133635002", "L-8BAF9": "133636001", "L-8BAFA": "133637005", "L-8BAFB": "133638000", "L-8BAFC": "133639008", "L-8BAFD": "133640005", "L-8BAFE": "133641009", "L-8BAFF": "133642002", "L-8BB00": "133643007", "L-8BB01": "133644001", "L-8BB02": "133645000", "L-8BB03": "133646004", "L-8BB04": "133647008", "L-8BB05": "133648003", "L-8BB06": "133649006", "L-8BB07": "133650006", "L-8BB09": "133651005", "L-8BB0A": "133652003", "L-8BB0B": "133653008", "L-8BB0C": "133654002", "L-8BB0E": "133655001", "L-8BB0F": "133656000", "L-8BB10": "133657009", "L-8BB11": "133658004", "L-8BB12": "133659007", "L-8BB13": "133660002", "L-8BB14": "133661003", "L-8BB15": "133662005", "L-8BB16": "133663000", "L-8BB17": "133664006", "L-8BB18": "133665007", "L-8BB19": "133666008", "L-8BB1A": "133667004", "L-8BB1B": "133668009", "L-8BB1C": "133669001", "L-8BB1D": "133670000", "L-8BB1E": "133671001", "L-8BB1F": "133672008", "L-8BB20": "133673003", "L-8BB21": "133674009", "L-8BB22": "133675005", "L-8BB23": "133676006", "L-8BB24": "133677002", "L-8BB25": "133678007", "L-8BB26": "133679004", "L-8BB27": "133680001", "L-8BB28": "133681002", "L-8BB29": "133682009", "L-8BB2A": "133683004", "L-8BB2B": "133684005", "L-8BB2C": "133685006", "L-8BB2D": "133686007", "L-8BB2E": "133687003", "L-8BB2F": "133688008", "L-8BB30": "133689000", "L-8BB31": "133690009", "L-8BB32": "133691008", "L-8BB33": "133692001", "L-8BB34": "133693006", "L-8BB35": "133694000", "L-8BB36": "133695004", "L-8BB37": "133696003", "L-8BB38": "133697007", "L-8BB39": "133698002", "L-8BB3A": "133699005", "L-8BB3B": "133700006", "L-8BB3C": "133701005", "L-8BB3D": "133702003", "L-8BB3E": "133703008", "L-8BB3F": "133704002", "L-8BB40": "133705001", "L-8BB41": "133706000", "L-8BB42": "133707009", "L-8BB43": "133708004", "L-8BB44": "133709007", "L-8BB45": "133710002", "L-8BB46": "133711003", "L-8BB47": "133712005", "L-8BB48": "133713000", "L-8BB49": "133714006", "L-8BB4A": "133715007", "L-8BB4B": "133716008", "L-8BB4C": "133717004", "L-8BB4D": "133718009", "L-8BB4E": "133719001", "L-8BB4F": "133720007", "L-8BB50": "133721006", "L-8BB51": "133722004", "L-8BB52": "133723009", "L-8BB53": "133724003", "L-8BB54": "133725002", "L-8BB56": "133727005", "L-8BB57": "133728000", "L-8BB58": "133729008", "L-8BB59": "133730003", "L-8BB5A": "133731004", "L-8BB5B": "133732006", "L-8BB5C": "133733001", "L-8BB5D": "133734007", "L-8BB5E": "133735008", "L-8BB5F": "133736009", "L-8BB60": "133737000", "L-8BB61": "133738005", "L-8BB62": "133739002", "L-8BB63": "133740000", "L-8BB64": "133741001", "L-8BB65": "133742008", "L-8BB66": "133743003", "L-8BB67": "133744009", "L-8BB68": "133745005", "L-8BB69": "133746006", "L-8BB6A": "133747002", "L-8BB6B": "133748007", "L-8BB6C": "133749004", "L-8BB6D": "133750004", "L-8BB6E": "133751000", "L-8BB6F": "133752007", "L-8BB70": "133753002", "L-8BB71": "133754008", "L-8BB72": "133755009", "L-8BB73": "133756005", "L-8BB74": "133757001", "L-8BB75": "133758006", "L-8BB76": "133759003", "L-8BB77": "133760008", "L-8BB78": "133761007", "L-8BB79": "133762000", "L-8BB7A": "133763005", "L-8BB7B": "133764004", "L-8BB7C": "133765003", "L-8BB7D": "133766002", "L-8BB7E": "133767006", "L-8BB7F": "133768001", "L-8BB80": "133769009", "L-8BB81": "133770005", "L-8BB82": "133771009", "L-8BB83": "133772002", "L-8BB84": "133773007", "L-8BB85": "133774001", "L-8BB86": "133775000", "L-8BB87": "133776004", "L-8BB88": "133777008", "L-8BB89": "133778003", "L-8BB8A": "133779006", "L-8BB8B": "133780009", "L-8BB8C": "133781008", "L-8BB8D": "133782001", "L-8BB8E": "133783006", "L-8BB8F": "133784000", "L-8BB90": "133785004", "L-8BB91": "133786003", "L-8BB92": "133787007", "L-8BB93": "133788002", "L-8BB94": "133789005", "L-8BB95": "133790001", "L-8BB96": "133791002", "L-8BB97": "133792009", "L-8BB98": "133793004", "L-8BB99": "133794005", "L-8BB9A": "133795006", "L-8BB9B": "133796007", "L-8BB9C": "133797003", "L-8BB9D": "133798008", "L-8BB9E": "133799000", "L-8BB9F": "133800001", "L-8BC00": "133801002", "L-8BC01": "133802009", "L-8BC03": "133803004", "L-8BC04": "133804005", "L-8BC05": "133805006", "L-8BC06": "133806007", "L-8BC07": "133807003", "L-8BC08": "133808008", "L-8BC09": "133809000", "L-8BC10": "133810005", "L-8BC11": "133811009", "L-8BC12": "133812002", "L-8BC13": "133813007", "L-8BC14": "133814001", "L-8BC15": "133815000", "L-8BC16": "133816004", "L-8BC17": "133817008", "L-8BC18": "133818003", "L-8BC19": "133819006", "L-8BC20": "133820000", "L-8BC21": "133821001", "L-8BC22": "133822008", "L-8BC23": "133823003", "L-8BC24": "133824009", "L-8BC25": "133825005", "L-8BC26": "133826006", "L-8BC27": "133827002", "L-8BC28": "133828007", "L-8BC29": "133829004", "L-8BC30": "133830009", "L-8BC31": "133831008", "L-8BC32": "133832001", "L-8BC33": "133833006", "L-8BC34": "133834000", "L-8BC35": "133835004", "L-8BC36": "133836003", "L-8BC37": "133837007", "L-8BC38": "133838002", "L-8BC39": "133839005", "L-8BC40": "133840007", "L-8BC41": "133841006", "L-8BC42": "133842004", "M-78731": "133855003", "P1-86C50": "133874006", "P1-93506": "133875007", "P2-71317": "133882006", "P5-B3402": "133884007", "P5-B3404": "133885008", "P5-B3406": "133886009", "P5-B3408": "133887000", "P5-B3410": "133888005", "P5-B3412": "133889002", "P5-B3414": "133890006", "PA-5003B": "133910006", "PA-5003C": "133911005", "PA-5003D": "133912003", "PA-5003E": "133913008", "PA-5003F": "133914002", "T-D2340": "133943005", "T-D2342": "133944004", "T-D4211": "133945003", "T-D4212": "133946002", "G-C150": "134198009", "R-41727": "134223000", "R-000F0": "134328007", "T-C4147": "143824007", "T-C4155": "143925009", "T-C4156": "144026003", "R-F1FA8": "146799005", "T-C421D": "155237005", "T-C4102": "155338003", "J-0016E": "158965000", "J-00172": "158971006", "J-00187": "159016003", "R-20773": "160270001", "R-2087E": "160274005", "G-0157": "160303001", "F-02455": "160476009", "F-02573": "160573003", "F-0351E": "161045001", "G-0239": "161432005", "G-023F": "161445009", "G-0244": "161453001", "G-0269": "161501007", "G-026D": "161505003", "G-02BD": "161622006", "G-02D0": "161656000", "G-0304": "161763005", "G-0305": "161765003", "G-0319": "161798008", "G-031E": "161806007", "G-031F": "161807003", "F-0600C": "161901003", "F-A265A": "161971004", "F-03753": "162164007", "F-F1722": "162290004", "R-209F6": "162467007", "R-20A12": "162499001", "R-20099": "164150006", "F-000B7": "164854000", "F-000C3": "164929001", "F-03204": "164931005", "F-000FF": "165076002", "P0-006E4": "165079009", "F-00101": "165082004", "F-00103": "165084003", "F-0331B": "165816005", "F-0169D": "166612004", "T-C4254": "167364008", "T-C4255": "167464007", "T-C4263": "167664004", "T-C4018": "167864002", "T-C421E": "167965000", "T-C4238": "168159002", "T-C4019": "168360002", "P0-003EB": "168456004", "T-C4244": "168460001", "P5-009FA": "168537006", "T-C401A": "168557005", "P5-0600F": "169014003", "P5-D0061": "169167001", "F-01BF8": "169254007", "P0-007AC": "169413002", "F-02F14": "170745003", "F-02F15": "170746002", "F-02F16": "170747006", "T-D161E": "170887008", "F-03C97": "171224000", "P1-4834A": "172049005", "P1-31003": "174822005", "P1-31919": "174826008", "P0-0530F": "174830006", "P1-31037": "174836000", "P1-38803": "174900004", "G-D13E": "180640008", "T-A1604": "180933005", "T-04009": "181131000", "T-47402": "181347005", "T-47403": "181349008", "T-4704C": "181351007", "T-00009": "181469002", "T-02408": "181491009", "T-D077A": "181536004", "T-0282E": "181553006", "T-02848": "181563003", "T-02849": "181564009", "T-D03C2": "181768009", "T-116EE": "181900008", "T-116EF": "181901007", "T-D03C9": "182329002", "P2-77110": "182744004", "F-04460": "182833002", "T-D002F": "183973000", "DA-73402": "193570009", "D3-13012": "194828000", "D3-13001": "194842008", "D3-13013": "194843003", "D3-29025": "194983005", "T-48403": "194996006", "D3-20003": "195020003", "R-F81AE": "195042002", "D3-31351": "195060002", "T-48405": "195073003", "T-48406": "195164009", "D3-80505": "195295006", "T-48404": "195328002", "T-484A4": "195416006", "T-48407": "195496005", "F-30004": "195675009", "T-14001": "195879000", "D2-00036": "195967001", "T-C4307": "196446004", "T-C437C": "196516004", "T-C4306": "196587000", "T-C4308": "196662004", "T-C4309": "196751009", "T-C4305": "196821008", "P0-0099D": "197157006", "D5-80822": "197315008", "D1-100FF": "200936003", "R-F8714": "201101007", "D4-31012": "204317008", "T-4630D": "206034008", "F-01FBA": "213262007", "D3-83001": "218728005", "J-00552": "223366009", "A-00435": "224727009", "R-40333": "224944003", "R-300E3": "225728007", "R-40B16": "225761000", "F-009EA": "225908003", "F-931D4": "228366006", "A-010FB": "228736002", "A-010FE": "228739009", "A-01105": "228745001", "A-040ED": "228748004", "A-0110F": "228761004", "R-429DF": "228790005", "R-429E0": "228791009", "R-429EB": "228792002", "R-429EC": "228793007", "P5-D0072": "229033006", "D3-8900D": "230690007", "P1-C0208": "231249005", "DA-7930D": "232077005", "P1-3301A": "232717009", "P1-31028": "233022006", "P1-31088": "233134001", "P1-31089": "233139006", "P1-31C03": "233159005", "P1-3157D": "233170003", "P0-057E8": "233199008", "P1-36956": "233224003", "P1-3696A": "233230003", "D3-1301F": "233817007", "D3-13020": "233819005", "D3-13021": "233823002", "D3-80027": "233981004", "D3-80002": "233982006", "D3-80033": "234021009", "D3-04006": "234171009", "D7-11007": "236423003", "P1-8330D": "236886002", "P1-48011": "237380007", "DD-66544": "237473006", "DB-80106": "237495005", "D6-34737": "237897009", "F-029F7": "238108007", "D0-30017": "238810007", "P1-189C2": "239503002", "P0-05AFA": "240946003", "P1-031C8": "240977001", "P5-30031": "241213007", "P5-0A006": "241439007", "P5-0A00A": "241443006", "P5-B001D": "241466007", "P5-0801C": "241539009", "P5-08025": "241547009", "P5-0802B": "241553009", "P5-0900D": "241615005", "P5-09011": "241620005", "P5-0903A": "241663008", "P5-00027": "241686001", "P1-C0012": "241687005", "P1-C001A": "241695009", "P2-2290D": "243147009", "P2-22914": "243154003", "P2-22916": "243156001", "PA-2011E": "243776001", "T-D0059": "243898001", "T-D005D": "243902007", "T-D005E": "243903002", "T-D005F": "243904008", "T-D007C": "243905009", "T-D007D": "243906005", "T-D007F": "243908006", "T-D008B": "243909003", "T-D008C": "243910008", "T-D008D": "243911007", "T-D008E": "243912000", "T-D008F": "243913005", "T-D0091": "243914004", "T-D0092": "243915003", "T-D0093": "243916002", "T-D0094": "243917006", "T-D0095": "243918001", "T-D0097": "243920003", "T-D0098": "243921004", "T-D0099": "243922006", "T-D009A": "243923001", "T-D009C": "243925008", "T-D009D": "243926009", "T-D009E": "243927000", "T-D4434": "243977002", "T-0214D": "244089006", "T-0215D": "244097004", "T-02425": "244106003", "T-02426": "244107007", "T-0242A": "244111001", "T-02536": "244117002", "T-02537": "244118007", "T-D0315": "244169007", "T-43002": "244251006", "T-43003": "244252004", "T-4940E": "244411005", "T-4941A": "244415001", "T-A800B": "244453006", "T-12204": "245100002", "T-C4235": "245321008", "T-C4236": "245322001", "T-C4237": "245323006", "T-C4216": "245324000", "T-C4217": "245328002", "T-C4379": "245341003", "T-C4411": "245344006", "T-C447A": "245346008", "P1-31018": "245544005", "T-54641": "245616001", "T-54621": "245619008", "T-54611": "245620002", "T-54741": "245631005", "T-54781": "245639007", "T-5493D": "245814000", "T-5494D": "245823002", "T-53012": "245831007", "T-D0169": "245849007", "G-C189": "246090004", "G-A60B": "246092007", "G-0180": "246101005", "G-C197": "246112005", "G-C1C6": "246205007", "F-02A3B": "246206008", "G-D775": "246244004", "G-C1E3": "246262008", "G-C1F9": "246345001", "R-42009": "246432004", "R-42019": "246464006", "G-C11C": "246489000", "F-035A5": "247049005", "F-035F3": "247094004", "F-035FD": "247095003", "F-4410C": "247441003", "D0-00165": "247472004", "F-03D1D": "248243004", "F-03D38": "248300009", "F-03D8C": "248366000", "F-54005": "248523006", "F-03E55": "248536006", "F-21334": "248584002", "F-21303": "248585001", "F-009E4": "248808008", "R-20658": "248983002", "F-00AA0": "249192005", "F-5012A": "249599008", "F-5012D": "249602003", "T-C4582": "249708006", "F-00E6D": "250431005", "F-0212C": "250767002", "F-021FF": "250881009", "F-02220": "250907009", "F-02225": "250909007", "F-02236": "250924003", "F-0224E": "250929008", "F-0227A": "250949004", "F-022A1": "250964004", "F-0231F": "251011009", "F-02320": "251012002", "F-02321": "251013007", "F-02322": "251014001", "F-0238B": "251050008", "F-0238D": "251053005", "F-3014D": "251055003", "F-3014E": "251056002", "F-3014F": "251057006", "F-023F7": "251081004", "D3-33122": "251120003", "D3-33112": "251124007", "F-38056": "251135002", "D3-31704": "251159007", "D3-30904": "251175005", "F-02692": "251271006", "F-02FA4": "251786004", "F-02FB4": "251795007", "F-A2143": "251797004", "F-02FB7": "251799001", "F-0319E": "252064005", "F-031A2": "252068008", "F-031F7": "252129004", "P3-00045": "252416005", "F-031F8": "252130009", "F-031F9": "252131008", "P5-B3004": "252418006", "P5-B3005": "252420009", "P5-B3006": "252421008", "P5-3003A": "252426003", "P5-30107": "252427007", "P5-D3008": "252432008", "P5-D0063": "252680004", "D0-F00E0": "253001006", "D4-31005": "253276007", "D4-31166": "253551005", "D3-29082": "253590009", "D4-31611": "253591008", "D3-4020B": "253639004", "D4-32030": "253678000", "D4-3252B": "253728007", "D4-3252C": "253729004", "D4-3252D": "253730009", "D5-F1404": "254582000", "D2-F1105": "254626006", "D2-F110E": "254634000", "D2-F1007": "254637007", "D0-F0005": "254651007", "D0-F1017": "254819008", "D7-F0815": "254845004", "D7-F0465": "254900004", "DA-0001F": "254938000", "DB-F0107": "255029007", "DF-004BC": "255046005", "D5-20002": "255072001", "R-40356": "255208005", "R-40357": "255209002", "R-40365": "255218000", "G-A39A": "255227004", "R-411C0": "255235001", "F-32021": "255236000", "R-40377": "255238004", "R-4038D": "255253007", "M-020FA": "255282008", "R-403A7": "255288007", "R-403CC": "255321001", "R-40411": "255378009", "R-40416": "255380003", "R-40448": "255423002", "G-C028": "255460003", "R-4047B": "255465008", "R-40491": "255482005", "R-4049E": "255496004", "R-404A0": "255499006", "R-404A4": "255503000", "R-404A8": "255507004", "R-404A9": "255508009", "R-404AA": "255509001", "R-404AC": "255511005", "R-404B3": "255518004", "R-404B6": "255521002", "R-404B7": "255523004", "R-404B8": "255524005", "R-404B9": "255525006", "R-404BA": "255526007", "R-404BC": "255530005", "R-404BD": "255531009", "R-404BE": "255532002", "R-404BF": "255533007", "R-404C7": "255543005", "R-404CC": "255549009", "R-404CE": "255551008", "R-404D5": "255561001", "R-404DA": "255566006", "R-404ED": "255590007", "R-404F0": "255593009", "R-404F1": "255594003", "R-404F9": "255603008", "R-404FA": "255604002", "R-404FB": "255605001", "R-404FC": "255606000", "R-404FE": "255609007", "R-40507": "255619001", "C-5008C": "255631004", "R-F1216": "255632006", "F-61117": "255641001", "F-61118": "255667006", "C-2280A": "255792001", "C-2280B": "255793006", "C-2280C": "255794000", "C-2280D": "255795004", "C-2280E": "255796003", "C-2280F": "255797007", "C-22810": "255798002", "C-22816": "255799005", "C-22817": "255800009", "C-22818": "255801008", "C-22819": "255802001", "C-2281A": "255803006", "C-2281B": "255804000", "C-2281C": "255805004", "C-2281D": "255806003", "C-2281E": "255807007", "C-2281F": "255808002", "C-2282A": "255810000", "C-2282B": "255811001", "C-2282C": "255813003", "R-40C16": "256235009", "F-611FC": "256496006", "F-61202": "256501007", "F-61207": "256506002", "F-6121C": "256526003", "C-14314": "256579008", "T-D008A": "256674009", "T-F1412": "256779006", "T-F1413": "256875007", "A-12018": "257327003", "A-25501": "257362008", "A-25502": "257363003", "A-14611": "257409000", "R-41C37": "257771002", "P1-10997": "257833000", "P1-10998": "257834006", "P1-10999": "257835007", "P1-1099B": "257837004", "P0-021AB": "257912008", "R-41C8D": "257950002", "R-41D27": "258083009", "R-41D2D": "258090004", "R-41D41": "258104002", "F-021E1": "258153002", "P5-09051": "258177008", "R-41D8B": "258181008", "G-C16B": "258214002", "R-41DA8": "258215001", "R-41DAC": "258219007", "R-41DB0": "258224005", "R-41DB4": "258228008", "R-41DC5": "258245003", "R-41DDC": "258270003", "G-803C": "258433009", "G-81A0": "258562007", "G-81EA": "258661006", "C-20830": "259153006", "C-21216": "259170003", "C-2102B": "259221006", "R-40271": "260245000", "G-A37A": "260360000", "R-40750": "260376009", "R-40759": "260385009", "R-4075C": "260388006", "R-40765": "260395002", "G-A205": "260408008", "R-40771": "260409000", "R-40775": "260413007", "R-40782": "260426006", "R-40783": "260427002", "R-40799": "260450008", "R-407B0": "260473000", "R-40809": "260492003", "R-4080A": "260493008", "R-4080D": "260496000", "R-4080E": "260497009", "R-40810": "260499007", "R-40816": "260506009", "R-40819": "260521003", "G-D05F": "260585005", "G-D067": "260590008", "G-D071": "260601006", "G-C048": "260674002", "G-C05F": "260753009", "A-00004": "260787004", "G-C093": "260858005", "R-40861": "260867005", "G-C09C": "260870009", "G-C0AE": "260893003", "G-C0B2": "260905004", "G-C0B7": "260911001", "R-408C3": "261004008", "R-40928": "261039008", "R-40939": "261061003", "R-40940": "261073003", "R-40941": "261074009", "R-4094A": "261089000", "G-A10A": "261129000", "R-409E2": "261197005", "R-409E3": "261198000", "R-409E4": "261199008", "F-61165": "261249004", "F-61166": "261250004", "G-D0C6": "261459001", "P1-31015": "261537001", "R-41177": "261613009", "R-4117B": "261617005", "R-41198": "261665006", "C-100EA": "261712009", "C-70841": "262003004", "R-4135B": "262008008", "R-413B7": "262061000", "R-413C5": "262068006", "R-41531": "262202000", "A-00D7B": "262301009", "R-41AEA": "262502001", "R-42037": "263654008", "R-42047": "263677008", "R-4205A": "263706005", "R-4205B": "263707001", "P0-021B2": "263720003", "R-420AE": "263816006", "R-4210B": "263943000", "T-A1509": "263972004", "R-42142": "264045001", "R-4214B": "264068005", "R-4215C": "264114003", "R-42175": "264159006", "R-4218D": "264208000", "R-42191": "264217000", "T-41065": "264293000", "T-4942D": "264481007", "R-423C3": "264579008", "T-32613": "264844003", "T-32614": "264845002", "T-32615": "264846001", "T-32616": "264847005", "T-32617": "264848000", "T-32618": "264849008", "T-32619": "264850008", "T-3261C": "264853005", "R-424A6": "264908009", "P5-3003F": "265483003", "P5-30041": "265484009", "P2-31209": "266706003", "G-032F": "266894000", "G-011E": "266897007", "F-9321F": "266919005", "G-0335": "266995000", "R-20767": "267011001", "F-201B3": "267036007", "F-042BA": "268384009", "P2-3120A": "268400002", "P5-B005A": "268445003", "F-9B75C": "268461001", "R-207D7": "268951004", "D3-30001": "270492004", "F-06001": "271593001", "D3-00006": "271594007", "F-008EC": "271649006", "F-008ED": "271650006", "F-41506": "271767006", "F-A5561": "271782001", "F-5005E": "271801002", "D0-00058": "271807003", "F-21331": "271824009", "F-00033": "271921002", "D7-90010": "271989003", "P5-009BF": "271993009", "R-407E0": "272113006", "R-407E1": "272114000", "R-407E7": "272123002", "R-40826": "272163001", "A-00916": "272180002", "A-00927": "272224001", "A-04036": "272287005", "R-4087B": "272466003", "R-40885": "272476000", "R-40888": "272479007", "R-40899": "272517003", "R-4089A": "272518008", "R-4089B": "272519000", "T-D075D": "272657006", "T-D016E": "272673000", "T-D0170": "272710004", "G-C581": "272737002", "G-C171": "272741003", "T-48725": "272998002", "T-48726": "273099000", "T-48727": "273202007", "G-E048": "273249006", "C-842F4": "273944007", "R-F6E36": "273948005", "P1-34001": "274022008", "T-4667C": "274060004", "T-4667D": "274143007", "T-4668A": "274231001", "R-202A9": "274303007", "T-4667E": "274329007", "P1-4830F": "274331003", "F-03261": "274640006", "F-A0846": "274662006", "F-37015": "274668005", "P1-32006": "275035006", "F-300FA": "275514001", "G-0069": "275552000", "R-427CE": "276214006", "F-13006": "276334009", "F-03DE9": "276755008", "F-03DFE": "276772001", "F-03E02": "276774000", "F-03E0D": "276780008", "F-03E0E": "276781007", "F-03E86": "276901002", "C-23805": "277016007", "P0-0000E": "277132007", "F-00078": "277381004", "P1-03106": "277591006", "P1-03107": "277592004", "T-32601": "277630003", "T-32603": "277631004", "T-32503": "277634007", "T-32504": "277635008", "R-400B2": "277671009", "T-D054F": "277956007", "T-D0567": "277957003", "T-D056A": "277958008", "T-D056B": "277959000", "T-D056C": "277960005", "T-D056D": "277961009", "T-D056E": "277962002", "G-C032": "278201002", "R-40553": "278307001", "R-40554": "278318001", "F-017C0": "278528006", "T-C46AA": "278571002", "T-C46AB": "278672000", "T-D051D": "278983006", "A-80002": "279046003", "F-A2632": "279047007", "F-37006": "279084009", "T-C4145": "279141006", "T-C4146": "279142004", "T-C4154": "279143009", "T-C4201": "279144003", "T-C4202": "279145002", "T-35111": "279170002", "T-35313": "279174006", "T-C4641": "279189002", "T-A0036": "279215006", "T-C4642": "279271008", "T-35014": "279317000", "T-A4904": "279336005", "T-75181": "279478000", "T-81001": "279479008", "T-21301": "279549004", "T-C4423": "279609001", "T-D05E4": "279706003", "T-C4452": "279784003", "T-C4401": "279795009", "T-C4453": "279866008", "T-81206": "279867004", "T-D3412": "280062008", "T-C4465": "280216006", "T-C4466": "280314006", "T-A0109": "280371009", "T-01041": "280387007", "T-D0721": "280401006", "T-C4467": "280402004", "F-01E06": "280416009", "T-C4445": "280556009", "T-C4446": "280639005", "T-AA62D": "280677004", "T-12847": "280711000", "T-11531": "280734009", "T-C4473": "280824006", "C-50315": "280906005", "T-C447D": "280915003", "T-C447E": "280999005", "T-D0765": "281130003", "T-D305A": "281134007", "T-4000E": "281157001", "T-4105E": "281159003", "T-C447F": "281227003", "T-D0767": "281231009", "M-09024": "281268007", "T-C4481": "281320004", "R-41FD9": "281379000", "T-D3208": "281392002", "T-D3209": "281393007", "T-D320A": "281394001", "T-D6007": "281496003", "T-0265D": "281642007", "T-C4563": "281676003", "P0-005ED": "281691001", "T-C4522": "281765006", "T-C4523": "281847004", "T-C4565": "282031000", "T-46807": "282044005", "R-422F4": "282258000", "T-3260A": "284355001", "T-3260B": "284356000", "T-3260C": "284357009", "T-3260D": "284358004", "D3-30A03": "284470004", "T-48832": "284639000", "F-00E5C": "285285000", "T-C4218": "285425001", "T-C4219": "285427009", "T-C421A": "285429007", "P0-00593": "285570007", "DF-00577": "285645000", "A-11C08": "286558002", "R-421A4": "286866000", "D3-10008": "287272002", "P1-48142": "287572003", "T-D07CB": "288546009", "R-42517": "288563008", "F-840B3": "289894009", "F-61779": "289925000", "F-61790": "290006006", "F-8A074": "290069002", "F-8A084": "290084006", "D7-90565": "290113009", "F-8A09C": "290119008", "DF-10780": "292094009", "DF-10781": "292095005", "DF-10F41": "293637006", "DF-10F42": "293638001", "A-00BA2": "297120004", "T-D00F7": "297171002", "T-D00F8": "297172009", "T-D00F9": "297173004", "T-D00FA": "297174005", "F-40031": "297968009", "F-100EC": "298336006", "T-41068": "299716001", "T-C4417": "299993000", "F-03FC9": "300571009", "F-03FCD": "300577008", "R-428E7": "300841009", "G-C2FE": "300842002", "D3-13025": "300995000", "F-30172": "301121007", "F-A004A": "301766008", "F-0123A": "301939004", "P1-48502": "302343007", "P1-40C19": "302396003", "D7-9002A": "302924003", "R-422A4": "303110006", "R-422A5": "303111005", "T-50007": "303270005", "T-C5001": "303337002", "T-71019": "303402001", "T-C4867": "303623000", "P5-08067": "303653007", "P5-0807F": "303680000", "T-C4866": "303713004", "P5-00A0D": "303827001", "C-50434": "303960004", "R-427E6": "304059001", "A-04459": "304121006", "R-42806": "304283002", "J-00556": "304292004", "R-42808": "304367000", "P0-00820": "304495004", "G-E002": "304915008", "T-3500E": "305437000", "T-1273F": "306783000", "F-00BB8": "307047009", "R-40FB8": "307152002", "R-40FB9": "307153007", "R-40FBA": "307154001", "P1-3200A": "307279007", "P0-004BA": "307280005", "R-410C3": "307429007", "R-4112F": "307486002", "D5-F0519": "307502000", "G-0102": "308064009", "D3-80016": "308546005", "F-20172": "308689002", "P5-39106": "308696000", "G-80A5": "309050000", "G-80A6": "309051001", "G-832D": "309058007", "G-8339": "309059004", "T-D021B": "309312004", "J-004E8": "309343006", "J-0050A": "309390008", "F-02A48": "309523001", "G-833D": "309546004", "G-833F": "309547008", "G-8346": "309548003", "F-8A057": "309587003", "R-41FFC": "309602000", "R-41FFF": "309606002", "R-2073F": "309649001", "R-42018": "309825002", "R-3023A": "309901009", "R-3023B": "309902002", "R-3023C": "309903007", "R-3023D": "309904001", "R-30240": "309907008", "R-30243": "309910001", "R-30246": "309913004", "R-30247": "309914005", "R-30248": "309915006", "R-3024B": "309918008", "R-30250": "309923008", "R-30252": "309925001", "R-30254": "309927009", "R-3025A": "309933000", "R-3025B": "309934006", "R-3025C": "309935007", "R-3025D": "309936008", "R-3025E": "309937004", "R-3025F": "309938009", "R-30260": "309939001", "R-30261": "309940004", "R-30262": "309941000", "R-30263": "309942007", "R-30264": "309943002", "R-30265": "309944008", "R-30269": "309948006", "R-3026A": "309949003", "R-3026B": "309950003", "R-3026F": "309954007", "R-30270": "309956009", "R-30275": "309958005", "R-30276": "309959002", "R-3027B": "309964003", "R-3027D": "309966001", "R-3027E": "309967005", "R-3027F": "309968000", "R-30280": "309969008", "R-30281": "309970009", "R-30282": "309971008", "R-30283": "309972001", "R-30285": "309974000", "R-30289": "309978002", "R-3028A": "309979005", "R-3028B": "309980008", "R-3028E": "309983005", "R-3028F": "309984004", "R-30290": "309985003", "R-30294": "309989009", "R-30296": "309991001", "R-30297": "309992008", "R-30298": "309993003", "R-30299": "309994009", "R-3029A": "309995005", "R-3029B": "309996006", "R-421D4": "310030000", "R-421EB": "310076001", "R-42203": "310101009", "R-42207": "310105000", "R-42219": "310123008", "R-4221D": "310127009", "R-4221E": "310128004", "R-4223B": "310158005", "R-4223C": "310159002", "R-42246": "310169008", "R-4225D": "310200001", "R-302A2": "310464005", "T-D078C": "310651003", "T-D078D": "310652005", "T-D03C3": "310787001", "C-2282E": "310805002", "F-616D8": "311731000", "R-42E61": "312004007", "C-50309": "312064005", "T-D000F": "312288001", "T-C4003": "312500006", "T-C4004": "312501005", "T-D200A": "312502003", "T-C4005": "312503008", "T-35008": "312522004", "T-20101": "312535008", "T-D006D": "312779009", "P0-0526F": "312965008", "R-207AD": "313376005", "D3-13014": "314116003", "P0-006F0": "314122007", "D3-83602": "314186008", "R-20839": "314348007", "T-02164": "314395006", "F-00E11": "314439003", "F-00E14": "314440001", "F-00E1F": "314451001", "F-00E21": "314452008", "F-00E22": "314453003", "T-C4414": "314730000", "T-C463E": "314736006", "T-127A7": "314796009", "C-2282D": "314900004", "T-1153E": "317665004", "T-1153F": "317766009", "C-6A102": "320917000", "C-B0295": "330888007", "R-F748A": "333111009", "L-85003": "337915000", "A-10DBC": "339648008", "A-120DD": "341036005", "A-1009E": "342706005", "A-105E3": "344088002", "A-10703": "344575009", "P2-35002": "344994008", "C-80609": "346322006", "C-8060A": "346441008", "C-80477": "346553009", "C-70434": "347379006", "C-B02C9": "349358000", "C-B02CC": "350086004", "C-B1130": "353842007", "C-B0382": "353903006", "C-B038B": "353912008", "C-B03AD": "353946009", "C-B03BC": "353962003", "C-B02C5": "354064008", "C-B03C3": "354088005", "C-B03C9": "354094002", "P0-021D6": "360038009", "A-11FCD": "360066001", "A-040CB": "360129009", "R-42453": "360156006", "P0-021FD": "360271000", "D3-2906A": "360465008", "D4-31303": "360481003", "T-D07EA": "360568007", "T-48081": "360592004", "T-2300C": "360955006", "T-C4601": "360992006", "T-C4602": "360993001", "T-AB959": "361078006", "T-40003": "361097006", "T-4940B": "362072009", "T-D060D": "362892003", "T-D149C": "362916000", "DF-0040E": "363354003", "DF-0044A": "363406005", "DF-0046D": "363443007", "T-28812": "363537007", "M-300F2": "363563002", "G-C2D0": "363589002", "T-D14AE": "363654007", "R-40641": "363675004", "R-40642": "363676003", "P0-0099A": "363679005", "G-C0E3": "363698007", "G-C0E8": "363703001", "G-C0E9": "363704007", "G-C0F2": "363713009", "F-04317": "363871006", "F-043E6": "364062005", "F-04403": "364091008", "F-04404": "364092001", "F-0452A": "364320009", "F-045CE": "364393001", "F-046D8": "364528001", "F-38035": "365416000", "F-01969": "365853002", "F-93109": "365981007", "F-30117": "366188009", "P0-0058E": "367336001", "R-4235F": "367450005", "T-D03B4": "367567000", "T-02106": "367577003", "T-02488": "367578008", "T-F680F": "367624001", "M-3340A": "367643001", "T-49217": "368479001", "T-49218": "368481004", "T-18774": "368536000", "T-C4752": "368550005", "G-F616": "369790002", "G-F617": "369791003", "G-F618": "369792005", "G-F749": "369991007", "G-C036": "370129005", "F-38095": "370359005", "F-201B6": "370367002", "F-00D5F": "370388006", "DD-661D2": "370512004", "F-02087": "370951003", "T-C430A": "371013005", "D7-76202": "371036001", "T-D0821": "371195002", "G-A11A": "371240000", "G-A11B": "371242008", "G-A11C": "371243003", "G-A11D": "371244009", "G-A11E": "371246006", "G-A12A": "371250004", "G-A12B": "371251000", "G-A12C": "371252007", "G-A12D": "371253002", "G-A12E": "371254008", "T-0262C": "371304004", "T-02008": "371311000", "T-D0801": "371398005", "G-0338": "371422002", "R-00254": "371439000", "R-00258": "371469007", "R-42B89": "371524004", "L-877FB": "371564000", "L-877FC": "371565004", "P0-006F1": "371572003", "R-002CC": "371785003", "R-00359": "371786002", "R-0038C": "371787006", "R-00310": "371788001", "R-00311": "371789009", "R-00303": "371790000", "R-00361": "371791001", "R-002F0": "371794009", "R-00312": "371795005", "R-002FD": "371796006", "R-0036F": "371797002", "R-00306": "371798007", "R-0030A": "371799004", "R-00379": "371800000", "R-00304": "371801001", "R-00383": "371802008", "R-00334": "371803003", "R-00313": "371804009", "R-00372": "371805005", "R-0038F": "371807002", "R-00368": "371808007", "R-00366": "371809004", "R-00365": "371810009", "R-00369": "371811008", "R-00367": "371812001", "R-002C8": "371813006", "R-002C7": "371814000", "R-002C9": "371815004", "R-002CA": "371816003", "R-002CB": "371817007", "R-00336": "371824008", "R-00360": "371829003", "R-00308": "371835003", "R-0032D": "371837006", "R-002E5": "371838001", "R-00394": "371839009", "R-00385": "371840006", "R-00309": "371841005", "R-00307": "371842003", "R-002E7": "371843008", "R-002D3": "371845001", "R-0035D": "371846000", "R-003A9": "371847009", "R-0035C": "371848004", "R-0032C": "371849007", "R-002D2": "371850007", "R-002D0": "371851006", "R-002CF": "371852004", "R-002F5": "371853009", "R-0036C": "371854003", "R-00398": "371855002", "R-0033F": "371856001", "R-00340": "371857005", "R-0033E": "371858000", "R-00342": "371859008", "R-0033D": "371860003", "R-00328": "371861004", "R-002F3": "371862006", "R-0039F": "371863001", "R-00381": "371864007", "R-00382": "371865008", "R-0037F": "371866009", "R-0037E": "371867000", "R-00327": "371868005", "R-0032F": "371869002", "R-00370": "371870001", "R-00373": "371871002", "R-003A1": "371872009", "R-00314": "371873004", "R-002E3": "371874005", "R-002FB": "371875006", "R-002F7": "371876007", "R-002F8": "371877003", "R-002C4": "371879000", "R-002C5": "371880002", "R-00348": "371883000", "R-00363": "371884006", "R-00362": "371885007", "R-00364": "371886008", "R-00338": "371887004", "R-00397": "371888009", "R-00337": "371889001", "R-00377": "371890005", "R-002F2": "371892002", "R-0036B": "371893007", "R-002E2": "371894001", "R-002EF": "371895000", "R-0037C": "371896004", "R-0037A": "371897008", "R-0031B": "371898003", "R-0031A": "371899006", "R-00320": "371900001", "R-0031E": "371901002", "R-00399": "371902009", "R-0039A": "371903004", "R-0031F": "371904005", "R-0031C": "371905006", "R-0037B": "371906007", "R-0034A": "371907003", "R-00349": "371908008", "R-00315": "371909000", "R-002D9": "371910005", "R-00318": "371911009", "R-002E1": "371912002", "R-00355": "371913007", "R-00353": "371914001", "R-002FC": "371915000", "R-0036A": "371916004", "R-00346": "371917008", "R-00388": "371918003", "R-00347": "371919006", "R-00387": "371920000", "R-00335": "371922008", "R-00329": "371923003", "R-00330": "371924009", "R-00333": "371925005", "R-0030C": "371926006", "R-00345": "371928007", "R-002E9": "371931008", "R-0038B": "371933006", "R-0039B": "371934000", "R-003AA": "371951007", "R-00376": "371952000", "R-0035B": "371953005", "R-0035E": "371954004", "T-A010F": "372073000", "T-14122": "372074006", "T-AA092": "372242005", "R-00274": "372249001", "R-00288": "372276001", "G-D173": "372460008", "G-D17C": "372463005", "G-D17D": "372464004", "C-00211": "372480009", "F-61606": "372558009", "F-616E7": "372578001", "F-616EB": "372580007", "F-616FE": "372602008", "F-61716": "372607002", "F-6171D": "372614000", "F-6188F": "372656001", "R-F2B1D": "372664007", "F-61898": "372665008", "F-61899": "372666009", "C-0023B": "372677003", "F-618A5": "372681003", "F-618A6": "372682005", "F-618AE": "372693007", "F-618AF": "372695000", "F-618B5": "372700007", "R-F2B1F": "372703009", "C-0024C": "372722000", "F-61916": "372724004", "C-0024E": "372735009", "F-61955": "372784001", "F-61957": "372787008", "C-00257": "372788003", "F-61959": "372790002", "R-F2B23": "372798009", "F-61969": "372806008", "F-6196E": "372813008", "F-61995": "372855004", "F-6199A": "372862008", "F-6199B": "372863003", "F-619A3": "372872006", "F-619AA": "372881000", "R-F2B27": "372901004", "F-619EF": "372906009", "R-002F6": "373061006", "R-002FA": "373062004", "R-0038D": "373066001", "R-00339": "373067005", "R-0038A": "373068000", "R-002ED": "373095005", "R-00317": "373098007", "R-00319": "373099004", "R-0032E": "373100007", "R-003AC": "373102004", "R-002E6": "373104003", "R-002E4": "373105002", "R-00357": "373108000", "R-00300": "373110003", "R-0035A": "373111004", "R-00302": "373112006", "R-0036E": "373113001", "R-0036D": "373115008", "D3-29096": "373116009", "R-00378": "373121007", "R-00344": "373122000", "R-0030D": "373123005", "R-00343": "373124004", "R-002C6": "373125003", "R-0032A": "373126002", "R-00331": "373127006", "R-00316": "373128001", "R-00341": "373129009", "R-0033B": "373131000", "R-0033C": "373132007", "R-00301": "373133002", "R-002CD": "373134008", "R-002D1": "373135009", "R-0030B": "373136005", "R-0030F": "373137001", "R-00389": "373138006", "R-0033A": "373140001", "R-00356": "373141002", "R-002F1": "373142009", "R-00371": "373143004", "R-00321": "373147003", "R-0037D": "373148008", "R-003CA": "373150000", "R-003CB": "373151001", "R-003D0": "373156006", "R-003D6": "373162001", "R-003D7": "373163006", "R-003D8": "373164000", "R-003D9": "373165004", "R-003DB": "373166003", "R-003DA": "373167007", "R-003DD": "373169005", "R-003DC": "373170006", "R-003DE": "373171005", "R-003BA": "373172003", "R-003B8": "373173008", "R-003B9": "373174002", "R-003BB": "373175001", "R-003BC": "373176000", "R-003BD": "373177009", "R-003BE": "373178004", "R-003BF": "373179007", "R-003C0": "373180005", "R-003C3": "373182002", "R-003C2": "373183007", "R-003C4": "373184001", "R-003C5": "373185000", "R-003C6": "373186004", "R-003C7": "373187008", "R-003C8": "373189006", "R-003C9": "373190002", "R-00286": "373197004", "R-003C1": "373204007", "C-00216": "373206009", "F-617EF": "373219008", "F-617F7": "373228009", "F-6180B": "373246003", "F-6180F": "373250005", "F-61814": "373254001", "F-6181B": "373260001", "C-0021C": "373262009", "F-6181D": "373263004", "F-6181F": "373265006", "C-0021D": "373270004", "F-61861": "373278006", "F-6186A": "373288007", "F-6186F": "373294004", "C-00231": "373297006", "F-61878": "373304005", "F-618FE": "373337007", "F-02900": "373372005", "F-6182F": "373464007", "F-6183C": "373476007", "F-6183D": "373477003", "F-61848": "373488009", "F-618D6": "373526007", "F-618D7": "373529000", "F-618D8": "373530005", "F-61968": "373646006", "F-619B7": "373682001", "F-61639": "373738000", "F-61642": "373746004", "F-6165A": "373757009", "F-6169A": "373780001", "R-41560": "373808002", "R-408F2": "373825000", "R-41561": "373846009", "R-41562": "373847000", "R-424BE": "373933003", "D3-90008": "373945007", "F-02B9B": "384668003", "P5-C018A": "384692006", "T-61007": "385294005", "R-00443": "385356007", "R-00461": "385380006", "R-00463": "385382003", "R-00465": "385385001", "F-61D54": "385420005", "L-8B946": "385474004", "C-22830": "385484003", "R-41F90": "385524004", "G-D30B": "385651009", "G-D30F": "385655000", "G-D316": "385656004", "G-D217": "385673002", "T-0130A": "386045008", "P0-009B4": "386053000", "T-D048E": "386103008", "R-10041": "386124003", "R-10042": "386125002", "R-10043": "386131004", "R-10044": "386132006", "R-10045": "386134007", "R-10046": "386135008", "R-10047": "386136009", "R-10048": "386137000", "R-10049": "386138005", "R-10050": "386139002", "R-10051": "386140000", "P0-001A3": "386439008", "P0-0409B": "386509000", "F-02B35": "386530009", "F-201BD": "386616007", "F-0A44A": "386661006", "C-68165": "386693003", "P1-C0037": "386760001", "P1-C0038": "386761002", "P0-05CCA": "386802000", "F-61AC5": "386839004", "F-61AC9": "386841003", "F-61ACA": "386842005", "F-61B21": "386910003", "C-00286": "387056004", "F-61C76": "387085005", "F-61C97": "387124009", "F-61A26": "387146001", "F-61A28": "387150008", "F-61A3F": "387176008", "F-61A66": "387218008", "F-61A76": "387239001", "F-61A7F": "387258005", "R-F2B2C": "387264003", "F-61A95": "387286002", "F-61AA3": "387305002", "F-61AC4": "387341002", "F-61AFE": "387351001", "F-61B05": "387358007", "F-B2135": "387362001", "F-61B0A": "387368002", "C-12016": "387372003", "F-61B48": "387423006", "F-61BB2": "387448009", "F-61BD0": "387480006", "F-61C65": "387560008", "P0-009C3": "387713003", "P1-48145": "387736007", "L-8BA18": "388168008", "L-8C3FB": "388249000", "L-8C3FD": "388254009", "L-8B1FB": "388393002", "L-000A9": "388445009", "L-881FC": "388490000", "L-000F9": "388626009", "T-A0095": "389080008", "T-A0096": "389081007", "A-00FAD": "389156006", "A-00E8A": "392001008", "A-00E8B": "392004000", "A-00E8C": "392007007", "A-00FBE": "392012008", "P1-030C4": "392021009", "R-42501": "394774009", "R-42502": "394775005", "F-00F4E": "395112001", "R-0045B": "395511002", "C-14512": "395742005", "C-B110E": "395787009", "C-B112D": "395789007", "C-11906": "395865006", "F-66005": "395889004", "C-B10FB": "395894004", "F-B022C": "396017000", "M-35001": "396339007", "C-002B1": "396345004", "R-10075": "396482007", "P1-65359": "396487001", "L-80453": "396488006", "L-80A45": "396505009", "F-048E0": "396631001", "R-10076": "396646008", "R-10077": "396647004", "R-10078": "396649001", "R-10079": "396652009", "R-1007A": "396654005", "R-1007B": "396655006", "R-1007C": "396656007", "F-037BB": "397138000", "F-037BC": "397140005", "F-037BD": "397141009", "F-037BF": "397143007", "F-037C0": "397144001", "F-037C1": "397145000", "G-8430": "397199005", "A-2B201": "397247004", "F-048FA": "397263007", "G-035B": "397363009", "G-035A": "397364003", "G-035C": "397405001", "G-035D": "397406000", "G-035E": "397407009", "G-035F": "397408004", "G-0360": "397409007", "G-0361": "397410002", "G-0362": "397411003", "G-0363": "397412005", "G-0364": "397413000", "G-0365": "397414006", "G-0366": "397415007", "G-0367": "397417004", "G-0368": "397418009", "G-0369": "397419001", "G-036A": "397421006", "G-036C": "397423009", "G-036D": "397425002", "G-036B": "397427005", "G-036E": "397435008", "G-036F": "397437000", "G-0370": "397439002", "P1-A3835": "397516006", "A-00FCA": "397522002", "A-040F7": "397559001", "A-1450C": "397755005", "G-D320": "397898000", "P1-0558A": "398010007", "A-1450B": "398013009", "R-305C3": "398161000", "DF-0070B": "398164008", "G-D321": "398201009", "P1-0512E": "398239001", "DF-0068E": "398325003", "F-A558A": "398665005", "F-61D6F": "398705004", "D0-51006": "398909004", "F-037AB": "398979000", "G-A191": "398994001", "R-1028E": "398996004", "G-039C": "398998003", "R-10296": "399000008", "G-5216": "399001007", "R-10299": "399002000", "R-10281": "399003005", "R-10246": "399004004", "R-10298": "399005003", "R-10212": "399006002", "G-037C": "399007006", "G-03AC": "399009009", "R-102D1": "399011000", "G-5220": "399012007", "R-1026D": "399013002", "D3-20021": "399020009", "R-1029F": "399022001", "G-0380": "399023006", "R-10295": "399024000", "R-10282": "399025004", "R-102B1": "399026003", "G-038F": "399027007", "R-10270": "399028002", "G-0374": "399030000", "R-10202": "399033003", "G-039A": "399036006", "R-1028F": "399037002", "R-10210": "399038007", "G-038D": "399039004", "G-038A": "399048009", "G-037E": "399051002", "R-102D7": "399055006", "G-0382": "399058008", "R-10216": "399059000", "R-10241": "399061009", "G-0386": "399062002", "G-0377": "399063007", "G-03A2": "399064001", "R-1026B": "399065000", "R-102CD": "399067008", "G-038B": "399070007", "R-102C3": "399071006", "R-10276": "399073009", "G-5207": "399074003", "G-5208": "399075002", "R-10288": "399080006", "R-10277": "399082003", "R-10280": "399083008", "G-0392": "399086000", "G-5210": "399089007", "G-0391": "399093001", "P1-0512A": "399097000", "R-102A3": "399098005", "R-10230": "399099002", "R-1024B": "399101009", "R-10275": "399103007", "G-0387": "399104001", "G-03A0": "399106004", "G-5206": "399108003", "G-0375": "399109006", "R-102C2": "399110001", "G-5223": "399118008", "R-102AC": "399125001", "R-102A9": "399127009", "R-1027D": "399129007", "R-102AF": "399130002", "R-10252": "399132005", "G-037A": "399133000", "R-10220": "399135007", "G-5209": "399136008", "R-1029E": "399138009", "G-0396": "399139001", "G-037B": "399140004", "R-10261": "399142007", "G-03A1": "399145009", "R-10279": "399146005", "R-1026C": "399148006", "R-10284": "399152006", "G-0381": "399154007", "G-0394": "399155008", "R-1028A": "399156009", "R-1029A": "399157000", "G-5225": "399159002", "R-10204": "399160007", "R-102D2": "399161006", "R-10242": "399162004", "R-102D6": "399163009", "R-4099D": "399166001", "G-037D": "399167005", "R-1027F": "399168000", "R-1028B": "399169008", "R-1029B": "399171008", "R-10236": "399173006", "R-1028D": "399179005", "R-1029C": "399181007", "R-102C1": "399182000", "R-10238": "399184004", "R-102D0": "399188001", "R-1024A": "399192008", "G-039D": "399195005", "R-10244": "399196006", "R-102D3": "399197002", "R-10232": "399198007", "R-1027B": "399199004", "G-039F": "399200001", "R-10283": "399201002", "R-1028C": "399206007", "R-102D5": "399209000", "G-03AA": "399211009", "R-1026A": "399212002", "G-A19C": "399214001", "R-102B0": "399215000", "R-10263": "399218003", "R-10515": "399220000", "R-10250": "399225005", "R-102D4": "399226006", "R-10286": "399227002", "G-0385": "399229004", "G-A19B": "399232001", "R-102A0": "399234000", "G-0383": "399235004", "R-10234": "399236003", "R-10262": "399237007", "G-0388": "399238002", "G-0398": "399239005", "R-102AA": "399241006", "R-102C6": "399242004", "R-102A2": "399243009", "R-1026F": "399245002", "R-10266": "399246001", "R-102A7": "399247005", "R-10292": "399251007", "R-10256": "399255003", "R-10224": "399260004", "G-03A5": "399261000", "R-10264": "399263002", "G-0373": "399264008", "R-102CF": "399265009", "G-037F": "399266005", "G-038C": "399267001", "G-5224": "399268006", "R-102AB": "399270002", "G-039B": "399271003", "R-102C5": "399272005", "G-5212": "399273000", "R-1027C": "399277004", "R-10268": "399278009", "R-10285": "399280003", "R-10274": "399281004", "G-0389": "399282006", "R-10297": "399284007", "R-1027E": "399285008", "G-0376": "399287000", "R-10248": "399288005", "R-102A1": "399290006", "R-102A4": "399292003", "G-0379": "399293008", "D7-90035": "399294002", "R-102A8": "399296000", "G-5222": "399297009", "G-5221": "399300004", "G-0390": "399301000", "R-10272": "399303002", "G-0397": "399306005", "F-00FBE": "399307001", "R-10291": "399308006", "G-0378": "399309003", "G-039E": "399310008", "R-10278": "399311007", "R-10208": "399312000", "R-102A6": "399313005", "R-102C8": "399316002", "R-10287": "399318001", "R-10271": "399320003", "G-5215": "399321004", "R-10254": "399325008", "D7-10012": "399326009", "R-10293": "399327000", "R-102AD": "399330007", "P5-0808E": "399331006", "R-10289": "399332004", "R-102C4": "399335002", "G-0395": "399339008", "R-1027A": "399341009", "R-10290": "399342002", "R-10267": "399344001", "R-10206": "399348003", "R-102A5": "399349006", "R-102C7": "399351005", "R-10228": "399352003", "G-0384": "399354002", "R-1026E": "399355001", "R-40985": "399356000", "R-10269": "399358004", "R-10257": "399360002", "R-10265": "399362005", "R-1029D": "399365007", "R-10516": "399366008", "G-038E": "399367004", "R-10226": "399368009", "R-10294": "399370000", "G-0399": "399371001", "R-10273": "399372008", "T-D0823": "399384005", "R-41563": "399707004", "D3-8005B": "400047006", "DF-003E5": "400210000", "D3-15119": "401303003", "D3-1511A": "401314000", "D0-2202B": "402603005", "F-A219C": "403598008", "D0-3002F": "403618004", "DF-006C1": "404029005", "F-06017": "404640003", "R-005AE": "404684003", "C-B10C4": "404713008", "C-B014D": "404846007", "R-305CE": "405269005", "J-005E6": "405277009", "J-005E8": "405279007", "G-A12F": "405738005", "G-A132": "405739002", "C-13036": "406452004", "L-8C339": "406660008", "L-8B102": "406663005", "L-8A106": "406711007", "L-8A10C": "406714004", "L-8A10D": "406715003", "L-8A10F": "406721004", "L-8C33A": "406722006", "L-93791": "406723001", "L-88106": "406725008", "L-001DE": "406733009", "C-22836": "406951002", "C-22837": "406952009", "C-2283A": "406953004", "C-2283C": "406955006", "C-2283E": "406957003", "C-2283F": "406958008", "C-22840": "406959000", "C-22847": "406960005", "C-2284A": "406961009", "C-2284B": "406964001", "C-2284C": "406965000", "C-2284D": "406966004", "C-2284E": "406967008", "C-2284F": "406968003", "C-22850": "406969006", "C-2285B": "406971006", "C-2285C": "406972004", "C-2285D": "406973009", "C-2285E": "406974003", "C-2285F": "406975002", "C-22860": "406976001", "C-2286A": "406977005", "C-2286C": "406980006", "C-2286D": "406981005", "C-2286E": "406982003", "C-2286F": "406983008", "C-2287A": "406985001", "C-2287B": "406986000", "F-61DA5": "406988004", "C-2287D": "406989007", "C-2287E": "406990003", "C-2287F": "406991004", "C-22880": "406992006", "C-2288A": "406993001", "C-2288D": "406995008", "L-8A105": "407402001", "F-03F6E": "407559004", "A-010D2": "407744008", "C-B0415": "407976008", "F-04A13": "408379005", "R-214DD": "408551003", "F-04AB2": "408573005", "F-04AB3": "408574004", "D0-F0369": "408643008", "DF-00736": "408645001", "DD-67703": "408678008", "R-101B0": "408703009", "R-101B2": "408704003", "R-101AF": "408705002", "R-101AD": "408706001", "R-101B3": "408707005", "R-101B5": "408709008", "R-101B6": "408710003", "R-101BA": "408714007", "R-101BB": "408715008", "R-101BC": "408716009", "R-101C0": "408720008", "R-101C3": "408723005", "R-101C4": "408724004", "R-101C5": "408725003", "R-101C6": "408726002", "G-C32C": "408730004", "G-C32E": "408732007", "R-10229": "408734008", "R-10223": "408742009", "R-1022D": "408744005", "R-10227": "408745006", "C-B10A5": "409105003", "C-B0493": "409477004", "C-B0303": "409484007", "F-61E5A": "409549005", "F-04BA9": "409586006", "F-61E79": "409595003", "F-0061F": "409599009", "R-41E4D": "409600007", "R-41E4E": "409603009", "R-41E4F": "409604003", "R-41E50": "409605002", "T-D04AC": "409615008", "F-04BC1": "409673008", "R-305D3": "409688003", "D3-1081C": "409712001", "M-0100C": "409774005", "R-10239": "409783000", "R-10219": "409897002", "R-1021A": "409898007", "R-1021C": "409899004", "R-1021E": "409900009", "R-1021D": "409901008", "R-1021F": "409902001", "R-1021B": "409903006", "L-80108": "409905004", "L-8B947": "409906003", "L-8B948": "409908002", "L-8880B": "409914009", "L-88107": "409926004", "P2-015A2": "410006001", "D3-3002F": "410429000", "D2-60262": "410430005", "R-1022A": "410434001", "R-1022B": "410435000", "R-1022C": "410436004", "R-1022E": "410437008", "R-1022F": "410438003", "R-10231": "410439006", "R-1020E": "410461001", "R-1020F": "410462008", "R-10211": "410463003", "R-10213": "410464009", "R-10215": "410465005", "R-10217": "410466006", "R-10218": "410467002", "G-A46B": "410516002", "R-005B3": "410652009", "G-D7FE": "410668003", "G-A1FF": "410674003", "G-C340": "410675002", "G-A206": "410679008", "R-1023E": "410685001", "R-1023B": "410686000", "R-1023D": "410687009", "R-1023A": "410688004", "R-1023C": "410689007", "T-D0829": "410726006", "F-61E2A": "410937004", "F-61DF9": "412155002", "F-61E1C": "412228003", "C-37152": "412248005", "F-61F48": "412548006", "F-04B88": "413322009", "S-0004E": "413464008", "L-8880C": "413488005", "S-0004B": "413490006", "R-102DD": "413530006", "S-0004C": "413581001", "S-00051": "413582008", "S-00052": "413600007", "S-0003D": "413773004", "P0-05DA0": "413815006", "J-0714B": "413854007", "R-10258": "413896006", "R-102DA": "413912008", "R-1025E": "413975003", "R-102BA": "413985002", "R-1025B": "413996005", "R-102B3": "414088005", "R-102B5": "414089002", "R-10260": "414135002", "R-102AE": "414165007", "R-102C0": "414298005", "R-1025A": "414368000", "R-10259": "414369008", "R-102B7": "414415007", "R-102B8": "414416008", "R-102B6": "414417004", "S-0003E": "414481008", "R-305D6": "414485004", "R-102CA": "414493004", "R-102BE": "414497003", "D3-10030": "414545008", "R-102B9": "414576002", "P1-A3846": "414582004", "R-1025F": "414599003", "R-102B2": "414617007", "R-1024F": "414722000", "R-10251": "414723005", "S-00043": "414752008", "D3-1070D": "414795007", "R-102B4": "415070008", "G-03D3": "415076002", "R-10253": "415144009", "R-10255": "415145005", "S-0004D": "415229000", "J-0714A": "415506007", "M-3400A": "415582006", "R-102BB": "415637004", "R-102BD": "415646005", "R-102C9": "415670009", "G-A47B": "415684004", "F-400A9": "415690000", "C-B1133": "415704007", "R-102BF": "415770004", "R-1025D": "415814008", "R-1025C": "415815009", "R-102DB": "415816005", "R-102DC": "415817001", "R-FAB5E": "416061003", "R-FAB53": "416152001", "R-FAB5C": "416190007", "R-FAB54": "416319003", "P5-0A00D": "416323006", "R-FAB5B": "416430001", "G-03E5": "416471007", "R-FAB55": "416550000", "R-FAB5A": "416567007", "R-FAB58": "416631005", "R-FAB56": "416775004", "T-D9713": "416804009", "L-88108": "416840006", "L-8077B": "416885007", "P0-099CB": "416940007", "R-FAB57": "416949008", "L-8B103": "417012009", "A-10029": "417136005", "L-8880D": "417277001", "F-CB902": "417324009", "R-FAB52": "417437006", "C-6A148": "417696007", "DF-00777": "417746004", "F-D7011": "418326009", "F-A21A7": "418363000", "R-305EB": "418433008", "F-6205D": "418760000", "R-005E0": "418799008", "P5-00A25": "418903008", "F-04DA1": "419099009", "T-D04F2": "419176008", "P5-00A34": "419416005", "C-21047": "419442005", "F-04D55": "419475002", "P5-00A5C": "419545005", "M-33415": "419670003", "F-04D54": "419775003", "C-B1134": "419804008", "F-04D53": "420050001", "R-305EA": "420223003", "R-F2C86": "420287000", "F-3018B": "420300004", "F-C0101": "420303002", "A-17454": "420572009", "T-C4753": "420800007", "A-00FF4": "420827006", "F-3018D": "420913000", "T-D04FF": "421060004", "F-620E8": "421148003", "A-17452": "421335007", "T-C471E": "421624008", "F-3018C": "421704003", "T-C4722": "421861001", "R-41564": "421974008", "T-C471F": "421988007", "DA-7931D": "422061002", "F-3018E": "422293003", "R-40A95": "422534007", "C-B07DC": "422540000", "R-40A92": "422568001", "F-04E95": "422587007", "C-B07E1": "422598008", "T-54282": "422653006", "R-40A88": "422670003", "P2-3110A": "422685009", "C-B07E2": "422763008", "C-B07E7": "422789008", "R-40A93": "422795009", "C-B07DB": "422855001", "R-40A89": "422861003", "A-010D8": "422915004", "C-127A5": "422934004", "R-40A98": "422954003", "C-B07DF": "422975006", "C-B07E8": "422980002", "R-40A99": "422996004", "R-40A8A": "423091003", "T-54302": "423185002", "C-114AA": "423249007", "T-54432": "423331005", "C-B07DD": "423498000", "C-B07DE": "423543007", "C-B07E4": "423546004", "C-1018D": "423578007", "R-40A94": "423720000", "C-135A4": "423764008", "L-804C0": "423926000", "T-54462": "423937004", "D4-31B68": "424045003", "P2-31107": "424064009", "C-163AA": "424079002", "R-40A90": "424086005", "L-804B0": "424111008", "C-163AD": "424118002", "P2-31108": "424225000", "C-163AB": "424299003", "C-163AC": "424318009", "G-C350": "424361007", "T-54292": "424399000", "P2-31109": "424444005", "C-B1135": "424570009", "T-54452": "424575004", "F-04ECE": "424622008", "R-40A8F": "424655003", "L-801E8": "424705003", "C-B07E0": "424708001", "C-B07E5": "424789007", "R-40A8B": "424811006", "C-1018C": "424875009", "T-54272": "424877001", "DF-007B5": "424952003", "R-40A8C": "424962005", "P0-05DE2": "424979004", "R-40A91": "425030002", "R-40A96": "425035007", "R-40A97": "425042007", "T-54442": "425106001", "L-804A0": "425118005", "F-04ECF": "425141002", "R-40A8D": "425157002", "L-8B949": "425181009", "R-40A8E": "425188003", "C-B07E3": "425236000", "L-80495": "425253007", "C-127A4": "425364008", "T-D0859": "425647002", "P0-02241": "425704008", "P5-C0641": "425767004", "P2-3120C": "425808002", "P5-080C2": "426005005", "P5-0905E": "426252008", "P0-00C29": "426347000", "R-3060E": "426439001", "L-8810A": "426571006", "P0-02242": "426865009", "P5-30045": "426940008", "L-8A114": "427136006", "T-A0149": "427667007", "F-04F74": "427732000", "F-04F76": "427751006", "G-0401": "427858005", "P1-36993": "427886002", "G-4044": "427986001", "F-380B2": "427989008", "F-04F84": "427990004", "G-0416": "428053000", "D3-10711": "428196007", "R-40AA7": "428247006", "F-380B3": "428417006", "F-04F92": "428420003", "F-04F9F": "428531008", "F-38793": "428549008", "F-38287": "428550008", "F-04FA0": "428552000", "P0-05E3D": "428604001", "P1-080B4": "428613004", "F-04FA5": "428628004", "F-04FA6": "428630002", "P2-3110B": "428685003", "R-40AA8": "428691001", "F-38794": "428750005", "G-044D": "428752002", "P2-31011": "428813002", "R-215D5": "428824000", "R-215D6": "428825004", "F-04FB4": "428832008", "F-04FB8": "428920008", "R-215D9": "428927006", "P3-05013": "428995007", "G-0477": "429024007", "R-215DC": "429058004", "P7-00044": "429060002", "F-04FCA": "429157007", "F-04FCC": "429160000", "F-04FCD": "429162008", "P2-3120E": "429163003", "D3-0200B": "429198000", "R-215DE": "429232006", "C-B07EC": "429296007", "F-04FD3": "429382003", "R-215E0": "429391004", "R-215E1": "429477006", "P0-099EB": "429479009", "F-04FD8": "429483009", "G-4045": "429551001", "G-4046": "429557002", "D3-13037": "429559004", "A-1002A": "429560009", "D3-0400A": "429561008", "F-04FE3": "429576000", "P1-30A31": "429616001", "F-04FE5": "429619008", "P0-00C6B": "429620002", "F-38279": "429622005", "D4-31124": "429710001", "F-33019": "429733000", "G-04C5": "429740004", "P5-B300C": "429884006", "F-6220F": "430028007", "G-04E3": "430091005", "C-163B0": "430276001", "T-1A403": "430346005", "T-4858F": "430757002", "C-12916": "430821002", "P3-4500A": "430854000", "T-1A404": "430855004", "G-8439": "430856003", "G-843A": "430861001", "F-62219": "430862008", "F-6221A": "430863003", "F-6221B": "430864009", "G-843B": "430970004", "G-843C": "431196006", "T-7000B": "431491007", "C-2141B": "431510009", "P5-D300B": "431511008", "P0-00CA7": "431609005", "P5-B300F": "431852008", "T-7000C": "431938005", "C-80012": "432062000", "F-05018": "432554001", "F-05019": "432655005", "F-0501A": "432678004", "P5-0907F": "433139009", "P5-B3090": "433231002", "P0-05F95": "433232009", "P5-B3050": "433233004", "P5-B8215": "433235006", "P5-B3012": "433236007", "F-62231": "433338005", "P3-40003": "433452008", "P3-40004": "433454009", "P3-40005": "433455005", "P3-40006": "433456006", "P3-40009": "433457002", "P3-4000A": "433465004", "A-0101B": "433466003", "F-62232": "433469005", "P3-4000B": "433470006", "F-62233": "433471005", "A-0101D": "433472003", "F-62234": "433473008", "F-62235": "433474002", "F-05028": "434161005", "C-2141C": "434162003", "F-62238": "434295000", "A-0101E": "434464009", "P3-4000D": "434472006", "A-0101F": "434473001", "P3-4000E": "434474007", "P3-4000F": "434475008", "P3-40011": "434479002", "A-01021": "434533009", "A-01022": "434708008", "A-01023": "434711009", "A-01024": "434746001", "A-01025": "434822004", "F-05036": "438949009", "D1-50666": "439470001", "P5-B0128": "439858009", "C-178FF": "440223009", "PA-30029": "440252007", "P0-06072": "440258006", "R-21604": "440565004", "P0-099F5": "440935004", "S-8000A": "441480003", "R-40AA9": "441505008", "R-00728": "441509002", "R-30616": "441548002", "R-40AAA": "441555000", "R-3061B": "441662001", "R-40AAC": "441672003", "P0-00E0B": "441676000", "P2-00161": "441752004", "T-D0874": "441850003", "M-32704": "441901008", "R-3061D": "441950002", "R-3061E": "441994008", "T-540ED": "442100006", "P1-3180D": "442123009", "T-50153": "442170005", "T-540EE": "442274007", "R-40AB0": "442441009", "R-40AB2": "442580003", "R-40AB3": "442581004", "R-40AB4": "442582006", "R-40AB5": "442583001", "R-40AB6": "442585008", "R-40AB7": "442586009", "R-40AB8": "442587000", "R-40AB9": "442588005", "R-40ABA": "442589002", "R-40ABB": "442590006", "R-40ABC": "442591005", "R-40ABD": "442592003", "R-40ABE": "442593008", "R-40AC0": "442595001", "R-40AC1": "442596000", "R-40AC2": "442597009", "R-40AC3": "442598004", "R-40AC4": "442599007", "R-40AC5": "442600005", "R-40AC6": "442601009", "R-40AC7": "442602002", "R-40AC8": "442603007", "R-40AC9": "442604001", "R-40ACA": "442605000", "R-40ACB": "442606004", "R-40ACC": "442607008", "R-40ACD": "442608003", "R-40ACE": "442609006", "R-40ACF": "442610001", "R-40AD0": "442611002", "R-40AD1": "442612009", "R-40AD2": "442621005", "R-40AD3": "442622003", "R-40AD4": "442623008", "R-40AD5": "442624002", "R-40AD6": "442625001", "R-40AD7": "442626000", "R-40AD8": "442627009", "R-40AD9": "442628004", "R-40ADA": "442629007", "R-40ADB": "442630002", "R-40ADC": "442631003", "R-40ADD": "442632005", "R-40ADE": "442636008", "R-40ADF": "442637004", "R-40AE0": "442638009", "R-40AE1": "442639001", "R-40AE3": "442641000", "R-40AE4": "442643002", "R-40AE5": "442644008", "R-40AE6": "442645009", "R-40AE8": "442657000", "R-40AE9": "442658005", "R-40AEA": "442659002", "R-40AEB": "442660007", "R-40AEC": "442661006", "R-40AEE": "442674000", "R-40AEF": "442675004", "D5-000C0": "442685003", "F-05166": "442688001", "R-40AF0": "442690000", "F-05167": "442691001", "F-0516A": "442700003", "F-0516C": "442704007", "F-0516E": "442707000", "F-05170": "442711006", "F-05173": "442714003", "R-40AF1": "442721003", "F-05179": "442726008", "R-40AF2": "442729001", "R-40AF3": "442730006", "R-40AF4": "442738004", "R-40AF5": "442739007", "R-40AF6": "442740009", "R-40AF7": "442741008", "R-40AF8": "442742001", "R-40AF9": "442743006", "R-40AFA": "442744000", "R-40AFB": "442745004", "R-40AFC": "442746003", "R-40AFD": "442747007", "R-40AFE": "442748002", "F-0517E": "442755000", "G-0577": "443082005", "G-0578": "443083000", "T-D0877": "443096004", "R-40AFF": "443100003", "T-D0878": "443113009", "F-8612F": "443115002", "G-0579": "443160001", "R-40B00": "443162009", "R-40B01": "443163004", "T-42102": "443167003", "F-0518A": "443168008", "M-2460C": "443208000", "T-D0879": "443260009", "P5-080FF": "443271005", "T-42304": "443281009", "T-D087A": "443283007", "T-D087B": "443297004", "T-D087C": "443298009", "R-0077C": "443325000", "T-D087D": "443326004", "T-D087E": "443327008", "T-D087F": "443328003", "M-20102": "443329006", "D4-31125": "443379009", "M-2460D": "443444008", "M-20103": "443445009", "DD-66228": "443461006", "D3-0200C": "443482000", "G-057B": "443499004", "G-057C": "443500008", "R-421AA": "443501007", "G-057D": "443562002", "T-F6858": "443591004", "G-057E": "443609003", "T-D0880": "443625008", "G-E479": "443635002", "R-40B0A": "443640005", "T-D0881": "443696003", "R-40B0E": "443698002", "T-F6859": "443705001", "T-48505": "443714006", "T-D0882": "443724003", "T-D0883": "443726001", "T-D0884": "443789005", "T-C430B": "443808008", "T-D0885": "443809000", "P0-06135": "443829004", "G-0584": "443895001", "T-D0886": "443907004", "P1-36994": "443989003", "P1-36995": "444001009", "P1-36996": "444034006", "G-0586": "444161008", "T-D0887": "444177009", "P1-36997": "444178004", "T-D0888": "444329004", "R-40B10": "444361000", "R-40B11": "444371003", "R-40B12": "444379001", "R-40B1B": "444389002", "R-40B1C": "444392003", "DF-00BB4": "444408007", "R-40B21": "444469002", "F-051DF": "444471002", "F-051E0": "444474005", "F-051E3": "444488009", "F-051E4": "444489001", "F-051E5": "444496004", "F-051E6": "444503000", "F-051E7": "444504006", "F-051E8": "444505007", "D7-F047C": "444808002", "G-D1E4": "444850002", "C-101E8": "444883009", "C-101E9": "444923006", "P5-08123": "444968003", "A-010DA": "445084008", "A-010DC": "445169002", "P1-103D3": "445185007", "A-010DD": "445254006", "A-010DE": "445278001", "A-010DF": "445279009", "A-00D87": "445282004", "A-0010F": "445316008", "A-010E0": "445340000", "A-010E1": "445391002", "A-010E2": "445465004", "A-00118": "445601002", "A-0011A": "445621001", "A-0011B": "445622008", "A-0011C": "445623003", "A-0011D": "445624009", "A-0011E": "445625005", "A-0011F": "445633006", "A-00120": "445634000", "A-00121": "445635004", "A-00123": "445663002", "A-00124": "445671003", "A-00125": "445679001", "A-00126": "445683001", "A-00127": "445685008", "R-F2CB6": "445769006", "P0-00F46": "445907001", "P0-00F6A": "446078004", "P5-70694": "446315002", "R-40B32": "446406008", "C-163B6": "446534003", "C-163B8": "446536001", "C-145AA": "446800006", "C-145AB": "446871009", "R-F2CD4": "447122006", "C-163B9": "447125008", "C-163BA": "447126009", "C-163BB": "447127000", "C-163BC": "447128005", "C-114AB": "447134003", "R-40644": "447295008", "L-87830": "447482001", "C-101ED": "447553000", "L-87831": "447612001", "P0-06211": "447996002", "L-00376": "448169003", "DF-00BEA": "448216007", "P2-22933": "448442005", "L-88124": "448771007", "P1-0329D": "448895004", "L-88423": "449310008", "T-D6515": "450960006", "C-E0273": "456992002", "C-E0269": "456995000", "C-E0267": "456997008", "C-E0265": "456999006", "C-E026A": "457000009", "R-FCBB8": "464557001", "R-FCE69": "464983000", "R-FDF65": "465380004", "R-FCF46": "466556008", "R-FDF5C": "467354001", "R-FDB79": "468192005", "R-FD5EB": "468440006", "R-FCDDB": "468886001", "R-FCAEF": "469266003", "R-FECEC": "470091001", "R-FD178": "470204007", "DF-1147C": "473188002", "P1-12033": "609638001", "R-FAE6C": "698247007", "R-FAED1": "698348000", "R-FB322": "699453001", "R-FB354": "699503005", "R-FB356": "699505003", "R-FB358": "699507006", "R-FB359": "699508001", "R-FB35A": "699509009", "R-FB35B": "699510004", "R-FB35C": "699511000", "R-FB4D8": "699891005", "R-FB4D3": "699886009", "R-FB4DA": "699893008", "R-FB4E1": "699900002", "R-FB4EA": "699909001", "R-FB4EF": "699914002", "R-FB4F0": "699915001", "R-FB4F4": "699919007", "R-FB504": "699935000", "R-FB565": "700032006", "R-FB79B": "700423003", "R-FCC16": "701933006", "R-FB829": "702369008", "R-FB83F": "702391001", "R-FB8F1": "702569007", "R-FB9B7": "702767007", "R-FBD63": "703707001", "R-FBDEA": "703842006", "R-FEAEC": "705541005", "R-FCCF2": "706247001", "R-FE0C7": "706342009", "R-FEEFF": "706440002", "R-FDCFF": "706484002", "R-FEEC3": "706683002", "R-FE814": "706699008", "R-FC4CC": "707009005", "R-FC4CD": "707010000", "R-FC4CE": "707011001", "R-FC4CF": "707012008", "R-FC4D0": "707013003", "R-FC4D1": "707014009", "R-FC4D2": "707015005", "R-FC4D3": "707016006", "R-FC4D4": "707017002", "R-FC4D5": "707018007", "R-FC4D8": "707021009", "R-FC4D9": "707022002", "R-FC4DA": "707023007", "R-FC4DB": "707024001", "R-FC4DC": "707025000", "R-FC4DD": "707026004", "R-FC4DF": "707028003", "R-FC4E0": "707029006", "R-FC4E1": "707030001", "R-FC4E2": "707031002", "R-FC4E3": "707032009", "R-FC4E4": "707033004", "R-FC4E6": "707035006", "R-FC4E7": "707036007", "R-FC4E8": "707037003", "R-FC4E9": "707038008", "R-FC4EA": "707039000", "R-FC4EC": "707041004", "R-FC4ED": "707042006", "R-FC4EE": "707043001", "R-FC4EF": "707044007", "R-FC4F0": "707045008", "R-FC4F1": "707046009", "R-FC4F2": "707047000", "R-FC4F3": "707048005", "R-FC4F4": "707049002", "R-FC4F7": "707052005", "R-FC4F9": "707054006", "R-FC4FA": "707055007", "R-FC4FB": "707056008", "R-FC4FC": "707057004", "R-FC4FD": "707058009", "R-FC4FE": "707059001", "R-FC4FF": "707060006", "R-FC500": "707061005", "R-FC501": "707062003", "R-FC502": "707063008", "R-FC503": "707064002", "R-FC504": "707065001", "R-FC505": "707066000", "R-FC506": "707067009", "R-FC507": "707068004", "R-FC5CD": "707266006", "R-FC628": "707357005", "R-FF0C4": "708174004", "A-A23F4": "709280007", "L-DA692": "709853007", "D3-80086": "710864009", "R-FF2E7": "711101009", "DF-11510": "711329002", "C-F06BC": "712714000", "C-D6858": "712736002", "T-F6724": "714754004", "T-F6713": "714759009", "P3-78326": "714797009", "T-D08DC": "715056000", "R-FF982": "716659002", "R0-00017": "716891004", "R-FFFF2": "716892006", "R-FFFDC": "716893001", "R-FFFBE": "716894007", "R0-00020": "716895008", "R0-00000": "716896009", "R-FFFD6": "716897000", "R-FFFB1": "716898005", "R-FFFB7": "716899002", "R-FFFD0": "716900007", "R-FFFFC": "716901006", "R0-00018": "716902004", "R-FFFC4": "716903009", "R-FFFE2": "716904003", "R0-00001": "716905002", "R0-0001E": "716906001", "R-FFFC2": "716907005", "R-FFFE0": "716908000", "R0-00004": "716909008", "R0-00027": "716910003", "R-FFFB6": "716911004", "R-FFFD5": "716912006", "R-FFFF4": "716913001", "R0-00013": "716914007", "R-FFFC9": "716915008", "R-FFFAB": "716916009", "R0-0000F": "716917000", "R-FFFE6": "716918005", "R-FFFCD": "716919002", "R-FFFB0": "716920008", "R0-0000C": "716921007", "R-FFFE9": "716922000", "R-FFFD4": "716923005", "R-FFFB5": "716924004", "R0-0001B": "716925003", "R-FFFFD": "716926002", "R-FFFDF": "716927006", "R-FFFC1": "716928001", "R-FFFA9": "716929009", "R0-00006": "716930004", "R-FFFE5": "716931000", "R-FFFF3": "716932007", "R0-00014": "716933002", "R-FFFB3": "716934008", "R-FFFD3": "716935009", "R0-00003": "716936005", "R0-00025": "716937001", "R-FFFC0": "716938006", "R-FFFDD": "716939003", "R-FFFEA": "716940001", "R0-0000B": "716941002", "R0-00024": "717025007", "R-FFFD9": "717027004", "R-FFB4A": "717193008", "R0-0039D": "719178004", "R0-00B43": "721904001", "R0-012CB": "722859001", "R0-01469": "723265000", "R-FAC46": "321000119108", "R-FAC47": "1251000119106", "D4-510C6": "2171000124100", "D4-510C8": "2181000124102", "D4-510C4": "2191000124104", "D4-510C3": "2201000124101", "D4-510C7": "2211000124103", "D4-510BF": "2221000124106", "D4-510BE": "2231000124109", "D4-510C9": "2241000124104", "D4-510BD": "2251000124102", "D4-510C5": "2261000124100", "D4-510B9": "2271000124107", "D4-510B6": "2281000124105", "D4-510B4": "2291000124108", "D4-510B7": "2301000124109", "D4-510BC": "2311000124107", "D4-510AF": "2321000124104", "D4-510BB": "2331000124101", "D4-510AE": "2341000124106", "D4-510B8": "2351000124108", "D4-510BA": "2361000124105", "D4-51089": "2371000124103", "D4-5108E": "2381000124100", "D4-51088": "2391000124102", "D4-510AC": "2401000124100", "D4-510AD": "2411000124102", "D4-510AA": "2421000124105", "D4-5108A": "2431000124108", "D4-5108D": "2441000124103", "D4-5108C": "2451000124101", "D4-510A9": "2461000124104", "D4-5108B": "2471000124106", "D4-5108F": "2481000124109", "D4-510AB": "2491000124107", "D4-510A8": "2501000124104", "D4-51090": "2511000124101", "D4-5109F": "2521000124109", "D4-51058": "2531000124107", "D4-5106B": "2541000124102", "D4-5105F": "2551000124100", "D4-5105B": "2561000124103", "D4-5105E": "2571000124105", "D4-51087": "2581000124108", "D4-5105A": "2591000124106", "D4-5105D": "2601000124103", "D4-5106D": "2611000124100", "D4-51073": "2621000124108", "D4-51059": "2631000124106", "D4-5106E": "2641000124101", "D4-5106C": "2651000124104", "D4-51071": "2661000124102", "D4-5105C": "2671000124109", "D4-5106F": "2681000124107", "C-E0241": "5811000122108", } pydicom-pydicom-20aa4b7/src/pydicom/sr/codedict.py000066400000000000000000000263231515706620200222430ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Access code dictionary information""" from itertools import chain import inspect from typing import cast, Any from collections.abc import KeysView, Iterable from pydicom.sr.coding import Code from pydicom.sr._concepts_dict import concepts as CONCEPTS from pydicom.sr._cid_dict import name_for_cid, cid_concepts as CID_CONCEPTS # Reverse lookup for cid names cid_for_name = {v: k for k, v in name_for_cid.items()} def _filtered(source: Iterable[str], filters: Iterable[str]) -> list[str]: """Return a sorted list of filtered str. Parameters ---------- source : Iterable[str] The iterable of str to be filtered. filters : Iterable[str] An iterable containing patterns for which values are to be included in the results. Returns ------- List[str] A sorted list of unique values from `source`, filtered by including case-insensitive partial or full matches against the values in `filters`. """ if not filters: return sorted(set(source)) filters = [f.lower() for f in filters] return sorted( set(val for val in source if any((f in val.lower()) for f in filters)) ) CIDValueType = dict[str, tuple[str, list[int]]] ConceptsType = dict[str, CIDValueType] SnomedMappingType = dict[str, dict[str, str]] class Collection: """Interface for a collection of concepts, such as SNOMED-CT, or a DICOM CID. .. versionadded:: 3.0 """ repr_format = "{} = {}" def __init__(self, name: str) -> None: """Create a new collection. Parameters ---------- name : str The name of the collection, should either be a key in the ``sr._concepts_dict.concepts`` :class:`dict` or a CID name for a CID in ``sr._cid_dict.cid_concepts`` such as ``"CID1234"``. """ if not name.upper().startswith("CID"): self._name = name # dict[str, dict[str, tuple(str, list[int])]] # {'ACEInhibitor': {'41549009': ('ACE inhibitor', [3760])}, self._scheme_data = CONCEPTS[name] else: self._name = f"CID{name[3:]}" # dict[str, list[str]] # {'SCT': ['Pericardium', 'Pleura', 'LeftPleura', 'RightPleura']} self._cid_data = CID_CONCEPTS[int(name[3:])] self._concepts: dict[str, Code] = {} @property def concepts(self) -> dict[str, Code]: """Return a :class:`dict` of {SR identifiers: codes}""" if not self._concepts: self._concepts = {name: getattr(self, name) for name in self.dir()} return self._concepts def __contains__(self, item: str | Code) -> bool: """Checks whether a given code is a member of the collection. Parameters ---------- item : pydicom.sr.coding.Code | str The code to check for as either the code or the corresponding keyword. Returns ------- bool Whether the collection contains the `code` """ if isinstance(item, str): try: code = getattr(self, item) except AttributeError: return False else: code = item return code in self.concepts.values() def __dir__(self) -> list[str]: """Return a list of available concept keywords. List of attributes is used, for example, in auto-completion in editors or command-line environments. """ meths = {v[0] for v in inspect.getmembers(type(self), inspect.isroutine)} props = {v[0] for v in inspect.getmembers(type(self), inspect.isdatadescriptor)} sr_names = set(self.dir()) return sorted(props | meths | sr_names) def dir(self, *filters: str) -> list[str]: """Return an sorted list of concept keywords based on a partial match. Parameters ---------- filters : str Zero or more string arguments to the function. Used for case-insensitive match to any part of the SR keyword. Returns ------- list of str The matching keywords. If no `filters` are used then all keywords are returned. """ # CID_CONCEPTS: Dict[int, Dict[str, List[str]]] if self.is_cid: return _filtered(chain.from_iterable(self._cid_data.values()), filters) return _filtered(self._scheme_data, filters) def __getattr__(self, name: str) -> Code: """Return the :class:`~pydicom.sr.Code` corresponding to `name`. Parameters ---------- name : str A camel case version of the concept's code meaning, such as ``"FontanelOfSkull" in the SCT coding scheme. Returns ------- pydicom.sr.Code The :class:`~pydicom.sr.Code` corresponding to `name`. """ if self.name.startswith("CID"): # Try DICOM's CID collections matches = [ scheme for scheme, keywords in self._cid_data.items() if name in keywords ] if not matches: raise AttributeError( f"No matching code for keyword '{name}' in {self.name}" ) if len(matches) > 1: # Shouldn't happen, but just in case raise RuntimeError( f"Multiple schemes found to contain the keyword '{name}' in " f"{self.name}: {', '.join(matches)}" ) scheme = matches[0] identifiers = cast(CIDValueType, CONCEPTS[scheme][name]) if len(identifiers) == 1: code, val = list(identifiers.items())[0] else: cid = int(self.name[3:]) _matches = [ (code, val) for code, val in identifiers.items() if cid in val[1] ] if len(_matches) > 1: # Shouldn't happen, but just in case codes = ", ".join(v[0] for v in _matches) raise RuntimeError( f"Multiple codes found for keyword '{name}' in {self.name}: " f"{codes}" ) code, val = _matches[0] return Code(value=code, meaning=val[0], scheme_designator=scheme) # Try concept collections such as SCT, DCM, etc try: entries = cast(CIDValueType, self._scheme_data[name]) except KeyError: raise AttributeError( f"No matching code for keyword '{name}' in scheme '{self.name}'" ) if len(entries) > 1: # val is {"code": ("meaning", [cid1, cid2, ...], "code": ...} code_values = ", ".join(entries.keys()) raise RuntimeError( f"Multiple codes found for keyword '{name}' in scheme '{self.name}': " f"{code_values}" ) code = list(entries.keys())[0] # get first and only meaning, cids = entries[code] return Code(value=code, meaning=meaning, scheme_designator=self.name) @property def is_cid(self) -> bool: """Return ``True`` if the collection is one of the DICOM CIDs""" return self.name.startswith("CID") @property def name(self) -> str: """Return the name of the collection.""" return self._name def __repr__(self) -> str: """Return a representation of the collection.""" concepts = [ self.repr_format.format(name, concept) for name, concept in self.concepts.items() ] return f"{self.name}\n" + "\n".join(concepts) @property def scheme_designator(self) -> str: """Return the scheme designator for the collection.""" return self.name def __str__(self) -> str: """Return a string representation of the collection.""" len_names = max(len(n) for n in self.concepts.keys()) + 2 len_codes = max(len(c[0]) for c in self.concepts.values()) + 2 len_schemes = max(len(c[1]) for c in self.concepts.values()) + 2 # Ensure each column is at least X characters wide len_names = max(len_names, 11) len_codes = max(len_codes, 6) len_schemes = max(len_schemes, 8) if self.is_cid: fmt = f"{{:{len_names}}} {{:{len_codes}}} {{:{len_schemes}}} {{}}" s = [self.name] s.append(fmt.format("Attribute", "Code", "Scheme", "Meaning")) s.append(fmt.format("---------", "----", "------", "-------")) s.append( "\n".join( fmt.format(name, *concept) for name, concept in self.concepts.items() ) ) else: fmt = f"{{:{len_names}}} {{:{len_codes}}} {{}}" s = [f"Scheme: {self.name}"] s.append(fmt.format("Attribute", "Code", "Meaning")) s.append(fmt.format("---------", "----", "-------")) s.append( "\n".join( fmt.format(name, concept[0], concept[2]) for name, concept in self.concepts.items() ) ) return "\n".join(s) def trait_names(self) -> list[str]: """Return a list of valid names for auto-completion code. Used in IPython, so that data element names can be found and offered for autocompletion on the IPython command line. """ return dir(self) class Concepts: """Management class for the available concept collections. .. versionadded:: 3.0 """ def __init__(self, collections: list[Collection]) -> None: """Create a new concepts management class instance. Parameters ---------- collections : list[Collection] A list of the available concept collections. """ self._collections = {c.name: c for c in collections} @property def collections(self) -> KeysView[str]: """Return the names of the available concept collections.""" return self._collections.keys() def __getattr__(self, name: str) -> Any: """Return the concept collection corresponding to `name`. Parameters ---------- name : str The scheme designator or CID name for the collection to be returned. """ if name.upper().startswith("CID"): name = f"CID{name[3:]}" if name in self._collections: return self._collections[name] raise AttributeError( f"'{type(self).__name__}' object has no attribute '{name}'" ) def schemes(self) -> list[str]: """Return a list of available scheme designations.""" return [c for c in self._collections.keys() if not c.startswith("CID")] def CIDs(self) -> list[str]: """Return a list of available CID names.""" return [c for c in self._collections.keys() if c.startswith("CID")] # Named concept collections like SNOMED-CT, etc _collections = [Collection(designator) for designator in CONCEPTS] # DICOM CIDs _collections.extend(Collection(f"CID{cid}") for cid in name_for_cid) codes = Concepts(_collections) pydicom-pydicom-20aa4b7/src/pydicom/sr/coding.py000066400000000000000000000040571515706620200217300ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. from typing import NamedTuple, Any from pydicom.sr._snomed_dict import mapping as snomed_mapping class Code(NamedTuple): """Namedtuple for representation of a coded concept consisting of the actual code *value*, the coding *scheme designator*, the code *meaning* (and optionally the coding *scheme version*). ..versionadded: 1.4 """ value: str scheme_designator: str meaning: str scheme_version: str | None = None def __hash__(self) -> int: return hash(self.scheme_designator + self.value) def __eq__(self, other: Any) -> Any: if self.scheme_designator == "SRT" and self.value in snomed_mapping["SRT"]: self_mapped = Code( value=snomed_mapping["SRT"][self.value], meaning="", scheme_designator="SCT", scheme_version=self.scheme_version, ) else: self_mapped = Code( value=self.value, meaning="", scheme_designator=self.scheme_designator, scheme_version=self.scheme_version, ) if other.scheme_designator == "SRT" and other.value in snomed_mapping["SRT"]: other_mapped = Code( value=snomed_mapping["SRT"][other.value], meaning="", scheme_designator="SCT", scheme_version=other.scheme_version, ) else: other_mapped = Code( value=other.value, meaning="", scheme_designator=other.scheme_designator, scheme_version=other.scheme_version, ) return ( self_mapped.value == other_mapped.value and self_mapped.scheme_designator == other_mapped.scheme_designator and self_mapped.scheme_version == other_mapped.scheme_version ) def __ne__(self, other: Any) -> Any: return not (self == other) Code.__new__.__defaults__ = (None,) pydicom-pydicom-20aa4b7/src/pydicom/tag.py000066400000000000000000000211311515706620200206040ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Define Tag class to hold a DICOM (group, element) tag and related functions. The 4 bytes of the DICOM tag are stored as an 'int'. Tags are stored as a single number and separated to (group, element) as required. """ # NOTE: Tags must be not be stored as a tuple internally, as some code logic # (e.g. in filewriter.write_AT) checks if a value is a multi-value # element from contextlib import contextmanager import traceback from typing import Any, TypeAlias from collections.abc import Iterator @contextmanager def tag_in_exception(tag: "BaseTag") -> Iterator[None]: """Use `tag` within a context. Used to include the tag details in the traceback message when an exception is raised within the context. Parameters ---------- tag : BaseTag The tag to use in the context. """ try: yield except Exception as exc: stack_trace = traceback.format_exc() msg = f"With tag {tag} got exception: {exc}\n{stack_trace}" raise type(exc)(msg) from exc # Type that can be used where a parameter is a tag or keyword TagType: TypeAlias = "int | str | tuple[int, int] | BaseTag" TagListType = list[int] | list[str] | list[tuple[int, int]] | list["BaseTag"] def Tag(arg: TagType, arg2: int | None = None) -> "BaseTag": """Create a :class:`BaseTag`. General function for creating a :class:`BaseTag` in any of the standard forms: * ``Tag(0x00100015)`` * ``Tag((0x10, 0x50))`` * ``Tag(0x0010, 0x0015)`` * ``Tag("PatientName")`` Parameters ---------- arg : int or str or 2-tuple of int * If :class:`int` then either the group number or the combined group and element numbers of the tag * If :class:`str` then the corresponding element's keyword * If :class:`tuple` then the (group, element) numbers as (:class:`int`, :class:`int`). arg2 : int, optional The element number of the DICOM tag, required when `arg` only contains the group number of the tag. Returns ------- BaseTag """ if isinstance(arg, BaseTag): return arg if arg2 is not None: # act as if was passed a single tuple arg = (arg, arg2) # type: ignore[assignment] long_value: int | None if isinstance(arg, tuple | list): if len(arg) != 2: raise ValueError("Tag must be an int or a 2-tuple") valid = False if isinstance(arg[0], str): valid = isinstance(arg[1], str) if valid: arg = (int(arg[0], 16), int(arg[1], 16)) elif isinstance(arg[0], int): valid = isinstance(arg[1], int) if not valid: raise TypeError( f"Unable to create an element tag from '{arg}': both " "arguments must be the same type and str or int" ) if arg[0] > 0xFFFF or arg[1] > 0xFFFF: raise OverflowError( f"Unable to create an element tag from '{arg}': the group " "and element values are limited to a maximum of 2-bytes each" ) long_value = (arg[0] << 16) | arg[1] # Single str parameter elif isinstance(arg, str): try: long_value = int(arg, 16) if long_value > 0xFFFFFFFF: raise OverflowError( f"Unable to create an element tag from '{long_value}': " "the combined group and element values are limited to a " "maximum of 4-bytes" ) except ValueError: # Try a DICOM keyword from pydicom.datadict import tag_for_keyword long_value = tag_for_keyword(arg) if long_value is None: raise ValueError( f"Unable to create an element tag from '{arg}': " "unknown DICOM element keyword or an invalid int" ) # Single int parameter else: long_value = arg if long_value > 0xFFFFFFFF: raise OverflowError( f"Unable to create an element tag from '{long_value}': the " "combined group and element values are limited to a maximum " "of 4-bytes" ) if long_value < 0: raise ValueError( f"Unable to create an element tag from '{long_value}': tags must " "be positive" ) return BaseTag(long_value) class BaseTag(int): """Represents a DICOM element (group, element) tag. Tags are represented as an :class:`int`. """ # Override comparisons so can convert "other" to Tag as necessary # See Ordering Comparisons at: # https://docs.python.org/3/whatsnew/3.0.html#ordering-comparisons def __le__(self, other: Any) -> Any: """Return ``True`` if `self` is less than or equal to `other`.""" return self == other or self < other def __lt__(self, other: Any) -> Any: """Return ``True`` if `self` is less than `other`.""" # Check if comparing with another Tag object; if not, create a temp one if not isinstance(other, int): try: other = Tag(other) except Exception: raise TypeError("Cannot compare Tag with non-Tag item") return int(self) < int(other) def __ge__(self, other: Any) -> Any: """Return ``True`` if `self` is greater than or equal to `other`.""" return self == other or self > other def __gt__(self, other: Any) -> Any: """Return ``True`` if `self` is greater than `other`.""" return not (self == other or self < other) def __eq__(self, other: Any) -> Any: """Return ``True`` if `self` equals `other`.""" # Check if comparing with another Tag object; if not, create a temp one if not isinstance(other, int): try: other = Tag(other) except Exception: return False return int(self) == int(other) def __ne__(self, other: Any) -> Any: """Return ``True`` if `self` does not equal `other`.""" return not self == other # For python 3, any override of __cmp__ or __eq__ # immutable requires explicit redirect of hash function # to the parent class # See https://docs.python.org/3/reference/datamodel.html#object.__hash__ __hash__ = int.__hash__ def __str__(self) -> str: """Return the tag value as a hex string '(gggg,eeee)'.""" return f"({self.group:04X},{self.element:04X})" __repr__ = __str__ @property def json_key(self) -> str: """Return the tag value as a JSON key string 'GGGGEEEE'.""" return f"{self.group:04X}{self.element:04X}" @property def group(self) -> int: """Return the tag's group number as :class:`int`.""" return self >> 16 @property def element(self) -> int: """Return the tag's element number as :class:`int`.""" return self & 0xFFFF elem = element # alternate syntax @property def is_private(self) -> bool: """Return ``True`` if the tag is private (has an odd group number).""" return self.group % 2 == 1 @property def is_private_creator(self) -> bool: """Return ``True`` if the tag is a private creator.""" return self.is_private and 0x0010 <= self.element < 0x0100 @property def private_creator(self) -> "BaseTag": """Return the private creator tag for the given tag. The result is meaningless if this is not a private tag. .. versionadded:: 2.4 """ return BaseTag((self & 0xFFFF0000) | self.element >> 8) def TupleTag(group_elem: tuple[int, int]) -> BaseTag: """Fast factory for :class:`BaseTag` object with known safe (group, elem) :class:`tuple` """ long_value = group_elem[0] << 16 | group_elem[1] return BaseTag(long_value) # Define some special tags: # See DICOM Standard Part 5, Section 7.5 # start of Sequence Item ItemTag = TupleTag((0xFFFE, 0xE000)) # end of Sequence Item ItemDelimiterTag = TupleTag((0xFFFE, 0xE00D)) # end of Sequence of undefined length SequenceDelimiterTag = TupleTag((0xFFFE, 0xE0DD)) # (0028,0103) *Pixel Representation* TAG_PIXREP = BaseTag(0x00280103) # (0008,0005) *Specific Character Set* TAG_CHARSET = BaseTag(0x00080005) # The first and third values of the following elements are always US # even if the VR is SS (PS3.3 C.7.6.3.1.5, C.11.1, C.11.2). # (0028,1101-1103) RGB Palette Color LUT Descriptor # (0028,3002) LUT Descriptor _LUT_DESCRIPTOR_TAGS = (0x00281101, 0x00281102, 0x00281103, 0x00283002) pydicom-pydicom-20aa4b7/src/pydicom/uid.py000066400000000000000000001130251515706620200206160ustar00rootroot00000000000000# Copyright 2008-2022 pydicom authors. See LICENSE file for details. """Functions for handling DICOM unique identifiers (UIDs)""" import hashlib import re import secrets import uuid from pydicom import config from pydicom._uid_dict import UID_dictionary from pydicom.config import disable_value_validation from pydicom.valuerep import STR_VR_REGEXES, validate_value class UID(str): """Human friendly UIDs as a Python :class:`str` subclass. **Private Transfer Syntaxes** If creating a private transfer syntax UID, then you must also use :meth:`~pydicom.UID.set_private_encoding` to set the corresponding dataset encoding. Examples -------- General usage:: >>> from pydicom.uid import UID >>> uid = UID('1.2.840.10008.1.2.4.50') >>> uid '1.2.840.10008.1.2.4.50' >>> uid.is_implicit_VR False >>> uid.is_little_endian True >>> uid.is_transfer_syntax True >>> uid.name 'JPEG Baseline (Process 1)' >>> uid.keyword JPEGBaseline8Bit Setting the encoding to explicit VR little endian for a private transfer syntax:: >>> uid = UID("1.2.3.4") >>> uid.set_private_encoding(False, True) """ _PRIVATE_TS_ENCODING: tuple[bool, bool] def __new__( cls: type["UID"], val: str, validation_mode: int | None = None ) -> "UID": """Setup new instance of the class. Parameters ---------- val : str or pydicom.uid.UID The UID string to use to create the UID object. validation_mode : int Defines if values are validated and how validation errors are handled. Returns ------- pydicom.uid.UID The UID object. """ if isinstance(val, str): if validation_mode is None: validation_mode = config.settings.reading_validation_mode validate_value("UI", val, validation_mode) uid = super().__new__(cls, val.strip()) if hasattr(val, "_PRIVATE_TS_ENCODING"): uid._PRIVATE_TS_ENCODING = val._PRIVATE_TS_ENCODING return uid raise TypeError("A UID must be created from a string") @property def is_implicit_VR(self) -> bool: """Return ``True`` if an implicit VR transfer syntax UID.""" if self.is_transfer_syntax: if not self.is_private: # Implicit VR Little Endian if self == "1.2.840.10008.1.2": return True # Explicit VR Little Endian # Explicit VR Big Endian # Deflated Explicit VR Little Endian # All encapsulated transfer syntaxes return False return self._PRIVATE_TS_ENCODING[0] raise ValueError("UID is not a transfer syntax.") @property def is_little_endian(self) -> bool: """Return ``True`` if a little endian transfer syntax UID.""" if self.is_transfer_syntax: if not self.is_private: # Explicit VR Big Endian if self == "1.2.840.10008.1.2.2": return False # Explicit VR Little Endian # Implicit VR Little Endian # Deflated Explicit VR Little Endian # All encapsulated transfer syntaxes return True return self._PRIVATE_TS_ENCODING[1] raise ValueError("UID is not a transfer syntax.") @property def is_transfer_syntax(self) -> bool: """Return ``True`` if a transfer syntax UID.""" if not self.is_private: return self.type == "Transfer Syntax" return hasattr(self, "_PRIVATE_TS_ENCODING") @property def is_deflated(self) -> bool: """Return ``True`` if a deflated transfer syntax UID.""" if self.is_transfer_syntax: # Deflated Explicit VR Little Endian if self == "1.2.840.10008.1.2.1.99": return True # Explicit VR Little Endian # Implicit VR Little Endian # Explicit VR Big Endian # All encapsulated transfer syntaxes return False raise ValueError("UID is not a transfer syntax.") @property def is_encapsulated(self) -> bool: """Return ``True`` if an encasulated transfer syntax UID.""" return self.is_compressed @property def is_compressed(self) -> bool: """Return ``True`` if a compressed transfer syntax UID.""" if self.is_transfer_syntax: # Explicit VR Little Endian # Implicit VR Little Endian # Explicit VR Big Endian # Deflated Explicit VR Little Endian if self in [ "1.2.840.10008.1.2", "1.2.840.10008.1.2.1", "1.2.840.10008.1.2.2", "1.2.840.10008.1.2.1.99", ]: return False # All encapsulated transfer syntaxes return True raise ValueError("UID is not a transfer syntax.") @property def keyword(self) -> str: """Return the UID keyword from the UID dictionary.""" if str(self) in UID_dictionary: return UID_dictionary[self][4] return "" @property def name(self) -> str: """Return the UID name from the UID dictionary.""" uid_string = str(self) if uid_string in UID_dictionary: return UID_dictionary[self][0] return uid_string @property def type(self) -> str: """Return the UID type from the UID dictionary.""" if str(self) in UID_dictionary: return UID_dictionary[self][1] return "" @property def info(self) -> str: """Return the UID info from the UID dictionary.""" if str(self) in UID_dictionary: return UID_dictionary[self][2] return "" @property def is_retired(self) -> bool: """Return ``True`` if the UID is retired, ``False`` otherwise or if private. """ if str(self) in UID_dictionary: return bool(UID_dictionary[self][3]) return False @property def is_private(self) -> bool: """Return ``True`` if the UID isn't an officially registered DICOM UID. """ return self[:14] != "1.2.840.10008." @property def is_valid(self) -> bool: """Return ``True`` if `self` is a valid UID, ``False`` otherwise.""" if len(self) <= 64 and re.match(RE_VALID_UID, self): return True return False def set_private_encoding(self, implicit_vr: bool, little_endian: bool) -> None: """Set the corresponding dataset encoding for a privately defined transfer syntax. .. versionadded:: 3.0 Parameters ---------- implicit_vr : bool ``True`` if the corresponding dataset encoding uses implicit VR, ``False`` for explicit VR. little_endian : bool ``True`` if the corresponding dataset encoding uses little endian byte order, ``False`` for big endian byte order. """ self._PRIVATE_TS_ENCODING = (implicit_vr, little_endian) # Many thanks to the Medical Connections for offering free # valid UIDs (https://www.medicalconnections.co.uk/FreeUID.html) # Their service was used to obtain the following root UID for pydicom: PYDICOM_ROOT_UID = "1.2.826.0.1.3680043.8.498." """pydicom's root UID ``'1.2.826.0.1.3680043.8.498.'``""" PYDICOM_IMPLEMENTATION_UID = UID(f"{PYDICOM_ROOT_UID}1") """ pydicom's (0002,0012) *Implementation Class UID* ``'1.2.826.0.1.3680043.8.498.1'`` """ # Regexes for valid UIDs and valid UID prefixes RE_VALID_UID = STR_VR_REGEXES["UI"] """Regex for a valid UID""" RE_VALID_UID_PREFIX = re.compile(r"^(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*\.$") """Regex for a valid UID prefix""" with disable_value_validation(): # Pre-defined Transfer Syntax UIDs (for convenience) ImplicitVRLittleEndian = UID("1.2.840.10008.1.2") """1.2.840.10008.1.2""" ExplicitVRLittleEndian = UID("1.2.840.10008.1.2.1") """1.2.840.10008.1.2.1""" DeflatedExplicitVRLittleEndian = UID("1.2.840.10008.1.2.1.99") """1.2.840.10008.1.2.1.99""" ExplicitVRBigEndian = UID("1.2.840.10008.1.2.2") """1.2.840.10008.1.2.2""" JPEGBaseline8Bit = UID("1.2.840.10008.1.2.4.50") """1.2.840.10008.1.2.4.50""" JPEGExtended12Bit = UID("1.2.840.10008.1.2.4.51") """1.2.840.10008.1.2.4.51""" JPEGLossless = UID("1.2.840.10008.1.2.4.57") """1.2.840.10008.1.2.4.57""" JPEGLosslessSV1 = UID("1.2.840.10008.1.2.4.70") """1.2.840.10008.1.2.4.70""" JPEGLSLossless = UID("1.2.840.10008.1.2.4.80") """1.2.840.10008.1.2.4.80""" JPEGLSNearLossless = UID("1.2.840.10008.1.2.4.81") """1.2.840.10008.1.2.4.81""" JPEG2000Lossless = UID("1.2.840.10008.1.2.4.90") """1.2.840.10008.1.2.4.90""" JPEG2000 = UID("1.2.840.10008.1.2.4.91") """1.2.840.10008.1.2.4.91""" JPEG2000MCLossless = UID("1.2.840.10008.1.2.4.92") """1.2.840.10008.1.2.4.92""" JPEG2000MC = UID("1.2.840.10008.1.2.4.93") """1.2.840.10008.1.2.4.93""" MPEG2MPML = UID("1.2.840.10008.1.2.4.100") """1.2.840.10008.1.2.4.100""" MPEG2MPMLF = UID("1.2.840.10008.1.2.4.100.1") """1.2.840.10008.1.2.4.100.1""" MPEG2MPHL = UID("1.2.840.10008.1.2.4.101") """1.2.840.10008.1.2.4.101""" MPEG2MPHLF = UID("1.2.840.10008.1.2.4.101.1") """1.2.840.10008.1.2.4.101.1""" MPEG4HP41 = UID("1.2.840.10008.1.2.4.102") """1.2.840.10008.1.2.4.102""" MPEG4HP41F = UID("1.2.840.10008.1.2.4.102.1") """1.2.840.10008.1.2.4.102.1""" MPEG4HP41BD = UID("1.2.840.10008.1.2.4.103") """1.2.840.10008.1.2.4.103""" MPEG4HP41BDF = UID("1.2.840.10008.1.2.4.103.1") """1.2.840.10008.1.2.4.103.1""" MPEG4HP422D = UID("1.2.840.10008.1.2.4.104") """1.2.840.10008.1.2.4.104""" MPEG4HP422DF = UID("1.2.840.10008.1.2.4.104.1") """1.2.840.10008.1.2.4.104.1""" MPEG4HP423D = UID("1.2.840.10008.1.2.4.105") """1.2.840.10008.1.2.4.105""" MPEG4HP423DF = UID("1.2.840.10008.1.2.4.105.1") """1.2.840.10008.1.2.4.105.1""" MPEG4HP42STEREO = UID("1.2.840.10008.1.2.4.106") """1.2.840.10008.1.2.4.106""" MPEG4HP42STEREOF = UID("1.2.840.10008.1.2.4.106.1") """1.2.840.10008.1.2.4.106.1""" HEVCMP51 = UID("1.2.840.10008.1.2.4.107") """1.2.840.10008.1.2.4.107""" HEVCM10P51 = UID("1.2.840.10008.1.2.4.108") """1.2.840.10008.1.2.4.108""" HTJ2KLossless = UID("1.2.840.10008.1.2.4.201") """1.2.840.10008.1.2.4.201""" HTJ2KLosslessRPCL = UID("1.2.840.10008.1.2.4.202") """1.2.840.10008.1.2.4.202""" HTJ2K = UID("1.2.840.10008.1.2.4.203") """1.2.840.10008.1.2.4.203""" JPIPHTJ2KReferenced = UID("1.2.840.10008.1.2.4.204") """1.2.840.10008.1.2.4.204""" JPIPHTJ2KReferencedDeflate = UID("1.2.840.10008.1.2.4.205") """1.2.840.10008.1.2.4.205""" RLELossless = UID("1.2.840.10008.1.2.5") """1.2.840.10008.1.2.5""" SMPTEST211020UncompressedProgressiveActiveVideo = UID("1.2.840.10008.1.2.7.1") """1.2.840.10008.1.2.7.1""" SMPTEST211020UncompressedInterlacedActiveVideo = UID("1.2.840.10008.1.2.7.2") """1.2.840.10008.1.2.7.2""" SMPTEST211030PCMDigitalAudio = UID("1.2.840.10008.1.2.7.3") """1.2.840.10008.1.2.7.3""" AllTransferSyntaxes = [ ImplicitVRLittleEndian, ExplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, JPEG2000MCLossless, JPEG2000MC, MPEG2MPML, MPEG2MPMLF, MPEG2MPHL, MPEG2MPHLF, MPEG4HP41, MPEG4HP41F, MPEG4HP41BD, MPEG4HP41BDF, MPEG4HP422D, MPEG4HP422DF, MPEG4HP423D, MPEG4HP423DF, MPEG4HP42STEREO, MPEG4HP42STEREOF, HEVCMP51, HEVCM10P51, HTJ2KLossless, HTJ2KLosslessRPCL, HTJ2K, JPIPHTJ2KReferenced, JPIPHTJ2KReferencedDeflate, RLELossless, SMPTEST211020UncompressedProgressiveActiveVideo, SMPTEST211020UncompressedInterlacedActiveVideo, SMPTEST211030PCMDigitalAudio, ] """All non-retired transfer syntaxes and *Explicit VR Big Endian*.""" JPEGTransferSyntaxes = [ JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, ] """JPEG (ISO/IEC 10918-1) transfer syntaxes""" JPEGLSTransferSyntaxes = [JPEGLSLossless, JPEGLSNearLossless] """JPEG-LS (ISO/IEC 14495-1) transfer syntaxes.""" JPEG2000TransferSyntaxes = [ JPEG2000Lossless, JPEG2000, JPEG2000MCLossless, JPEG2000MC, HTJ2KLossless, HTJ2KLosslessRPCL, HTJ2K, ] """JPEG 2000 (ISO/IEC 15444-1) transfer syntaxes.""" MPEGTransferSyntaxes = [ MPEG2MPML, MPEG2MPMLF, MPEG2MPHL, MPEG2MPHLF, MPEG4HP41, MPEG4HP41F, MPEG4HP41BD, MPEG4HP41BDF, MPEG4HP422D, MPEG4HP422DF, MPEG4HP423D, MPEG4HP423DF, MPEG4HP42STEREO, MPEG4HP42STEREOF, HEVCMP51, HEVCM10P51, ] """MPEG transfer syntaxes.""" RLETransferSyntaxes = [RLELossless] """RLE transfer syntaxes.""" UncompressedTransferSyntaxes = [ ExplicitVRLittleEndian, ImplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, ] """Uncompressed (native) transfer syntaxes.""" PrivateTransferSyntaxes = [] """Private transfer syntaxes added using the :func:`~pydicom.uid.register_transfer_syntax` function. """ def register_transfer_syntax( uid: str | UID, implicit_vr: bool | None = None, little_endian: bool | None = None, ) -> UID: """Register a private transfer syntax with the :mod:`~pydicom.uid` module so it can be used when reading datasets with :func:`~pydicom.filereader.dcmread`. .. versionadded: 3.0 Parameters ---------- uid : str | pydicom.uid.UID A UID which may or may not have had the corresponding dataset encoding set using :meth:`~pydicom.uid.UID.set_private_encoding`. implicit_vr : bool, optional If ``True`` then the transfer syntax uses implicit VR encoding, otherwise if ``False`` then it uses explicit VR encoding. Required when `uid` has not had the encoding set using :meth:`~pydicom.uid.UID.set_private_encoding`. little_endian : bool, optional If ``True`` then the transfer syntax uses little endian encoding, otherwise if ``False`` then it uses big endian encoding. Required when `uid` has not had the encoding set using :meth:`~pydicom.uid.UID.set_private_encoding`. Returns ------- pydicom.uid.UID The registered UID. """ uid = UID(uid) if None in (implicit_vr, little_endian) and not uid.is_transfer_syntax: raise ValueError( "The corresponding dataset encoding for 'uid' must be set using " "the 'implicit_vr' and 'little_endian' arguments" ) if implicit_vr is not None and little_endian is not None: uid.set_private_encoding(implicit_vr, little_endian) if uid not in PrivateTransferSyntaxes: PrivateTransferSyntaxes.append(uid) return uid _MAX_PREFIX_LENGTH = 54 def generate_uid( prefix: str | None = PYDICOM_ROOT_UID, entropy_srcs: list[str] | None = None, ) -> UID: """Return a 64 character UID which starts with `prefix`. .. versionchanged:: 3.0 * When `entropy_srcs` is ``None`` the suffix is now generated using :func:`~secrets.randbelow` * The maximum length of `prefix` is now 54 characters Parameters ---------- prefix : str or None, optional The UID prefix to use when creating the UID. Default is the *pydicom* root UID ``'1.2.826.0.1.3680043.8.498.'``. If `prefix` is ``None`` then a prefix of ``'2.25.'`` will be used with the integer form of a UUID generated using the :func:`uuid.uuid4` algorithm. entropy_srcs : list of str, optional If `prefix` is used then the `prefix` will be appended with a SHA512 hash of the supplied :class:`list` which means the result is deterministic and should make the original data unrecoverable. If `entropy_srcs` isn't used then a random number from :func:`secrets.randbelow` will be appended to the `prefix`. If `prefix` is ``None`` then `entropy_srcs` has no effect. Returns ------- pydicom.uid.UID A DICOM UID of up to 64 characters. Raises ------ ValueError If `prefix` is invalid or greater than 54 characters. Examples -------- >>> from pydicom.uid import generate_uid >>> generate_uid() 1.2.826.0.1.3680043.8.498.22463838056059845879389038257786771680 >>> generate_uid(prefix=None) 2.25.167161297070865690102504091919570542144 >>> generate_uid(entropy_srcs=['lorem', 'ipsum']) 1.2.826.0.1.3680043.8.498.87507166259346337659265156363895084463 >>> generate_uid(entropy_srcs=['lorem', 'ipsum']) 1.2.826.0.1.3680043.8.498.87507166259346337659265156363895084463 References ---------- * DICOM Standard, Part 5, :dcm:`Chapters 9` and :dcm:`Annex B` * ISO/IEC 9834-8/`ITU-T X.667 `_ """ if prefix is None: # UUID -> as 128-bit int -> max 39 characters long return UID(f"2.25.{uuid.uuid4().int}") if len(prefix) > _MAX_PREFIX_LENGTH: raise ValueError( f"The 'prefix' should be no more than {_MAX_PREFIX_LENGTH} characters long" ) if not re.match(RE_VALID_UID_PREFIX, prefix): raise ValueError( "The 'prefix' is not valid for use with a UID, see Part 5, Section " "9.1 of the DICOM Standard" ) if entropy_srcs is None: maximum = 10 ** (64 - len(prefix)) # randbelow is in [0, maximum) # {prefix}.0, and {prefix}0 are both valid return UID(f"{prefix}{secrets.randbelow(maximum)}"[:64]) hash_val = hashlib.sha512("".join(entropy_srcs).encode("utf-8")) # Convert this to an int with the maximum available digits return UID(f"{prefix}{int(hash_val.hexdigest(), 16)}"[:64]) # Only auto-generated Storage SOP Class UIDs below - do not edit manually MediaStorageDirectoryStorage = UID("1.2.840.10008.1.3.10") """1.2.840.10008.1.3.10""" ComputedRadiographyImageStorage = UID("1.2.840.10008.5.1.4.1.1.1") """1.2.840.10008.5.1.4.1.1.1""" DigitalXRayImageStorageForPresentation = UID("1.2.840.10008.5.1.4.1.1.1.1") """1.2.840.10008.5.1.4.1.1.1.1""" DigitalXRayImageStorageForProcessing = UID("1.2.840.10008.5.1.4.1.1.1.1.1") """1.2.840.10008.5.1.4.1.1.1.1.1""" DigitalMammographyXRayImageStorageForPresentation = UID("1.2.840.10008.5.1.4.1.1.1.2") """1.2.840.10008.5.1.4.1.1.1.2""" DigitalMammographyXRayImageStorageForProcessing = UID("1.2.840.10008.5.1.4.1.1.1.2.1") """1.2.840.10008.5.1.4.1.1.1.2.1""" DigitalIntraOralXRayImageStorageForPresentation = UID("1.2.840.10008.5.1.4.1.1.1.3") """1.2.840.10008.5.1.4.1.1.1.3""" DigitalIntraOralXRayImageStorageForProcessing = UID("1.2.840.10008.5.1.4.1.1.1.3.1") """1.2.840.10008.5.1.4.1.1.1.3.1""" EncapsulatedPDFStorage = UID("1.2.840.10008.5.1.4.1.1.104.1") """1.2.840.10008.5.1.4.1.1.104.1""" EncapsulatedCDAStorage = UID("1.2.840.10008.5.1.4.1.1.104.2") """1.2.840.10008.5.1.4.1.1.104.2""" EncapsulatedSTLStorage = UID("1.2.840.10008.5.1.4.1.1.104.3") """1.2.840.10008.5.1.4.1.1.104.3""" EncapsulatedOBJStorage = UID("1.2.840.10008.5.1.4.1.1.104.4") """1.2.840.10008.5.1.4.1.1.104.4""" EncapsulatedMTLStorage = UID("1.2.840.10008.5.1.4.1.1.104.5") """1.2.840.10008.5.1.4.1.1.104.5""" GrayscaleSoftcopyPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.1") """1.2.840.10008.5.1.4.1.1.11.1""" SegmentedVolumeRenderingVolumetricPresentationStateStorage = UID( "1.2.840.10008.5.1.4.1.1.11.10" ) """1.2.840.10008.5.1.4.1.1.11.10""" MultipleVolumeRenderingVolumetricPresentationStateStorage = UID( "1.2.840.10008.5.1.4.1.1.11.11" ) """1.2.840.10008.5.1.4.1.1.11.11""" VariableModalityLUTSoftcopyPresentationStateStorage = UID( "1.2.840.10008.5.1.4.1.1.11.12" ) """1.2.840.10008.5.1.4.1.1.11.12""" ColorSoftcopyPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.2") """1.2.840.10008.5.1.4.1.1.11.2""" PseudoColorSoftcopyPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.3") """1.2.840.10008.5.1.4.1.1.11.3""" BlendingSoftcopyPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.4") """1.2.840.10008.5.1.4.1.1.11.4""" XAXRFGrayscaleSoftcopyPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.5") """1.2.840.10008.5.1.4.1.1.11.5""" GrayscalePlanarMPRVolumetricPresentationStateStorage = UID( "1.2.840.10008.5.1.4.1.1.11.6" ) """1.2.840.10008.5.1.4.1.1.11.6""" CompositingPlanarMPRVolumetricPresentationStateStorage = UID( "1.2.840.10008.5.1.4.1.1.11.7" ) """1.2.840.10008.5.1.4.1.1.11.7""" AdvancedBlendingPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.8") """1.2.840.10008.5.1.4.1.1.11.8""" VolumeRenderingVolumetricPresentationStateStorage = UID("1.2.840.10008.5.1.4.1.1.11.9") """1.2.840.10008.5.1.4.1.1.11.9""" XRayAngiographicImageStorage = UID("1.2.840.10008.5.1.4.1.1.12.1") """1.2.840.10008.5.1.4.1.1.12.1""" EnhancedXAImageStorage = UID("1.2.840.10008.5.1.4.1.1.12.1.1") """1.2.840.10008.5.1.4.1.1.12.1.1""" XRayRadiofluoroscopicImageStorage = UID("1.2.840.10008.5.1.4.1.1.12.2") """1.2.840.10008.5.1.4.1.1.12.2""" EnhancedXRFImageStorage = UID("1.2.840.10008.5.1.4.1.1.12.2.1") """1.2.840.10008.5.1.4.1.1.12.2.1""" PositronEmissionTomographyImageStorage = UID("1.2.840.10008.5.1.4.1.1.128") """1.2.840.10008.5.1.4.1.1.128""" LegacyConvertedEnhancedPETImageStorage = UID("1.2.840.10008.5.1.4.1.1.128.1") """1.2.840.10008.5.1.4.1.1.128.1""" XRay3DAngiographicImageStorage = UID("1.2.840.10008.5.1.4.1.1.13.1.1") """1.2.840.10008.5.1.4.1.1.13.1.1""" XRay3DCraniofacialImageStorage = UID("1.2.840.10008.5.1.4.1.1.13.1.2") """1.2.840.10008.5.1.4.1.1.13.1.2""" BreastTomosynthesisImageStorage = UID("1.2.840.10008.5.1.4.1.1.13.1.3") """1.2.840.10008.5.1.4.1.1.13.1.3""" BreastProjectionXRayImageStorageForPresentation = UID("1.2.840.10008.5.1.4.1.1.13.1.4") """1.2.840.10008.5.1.4.1.1.13.1.4""" BreastProjectionXRayImageStorageForProcessing = UID("1.2.840.10008.5.1.4.1.1.13.1.5") """1.2.840.10008.5.1.4.1.1.13.1.5""" EnhancedPETImageStorage = UID("1.2.840.10008.5.1.4.1.1.130") """1.2.840.10008.5.1.4.1.1.130""" BasicStructuredDisplayStorage = UID("1.2.840.10008.5.1.4.1.1.131") """1.2.840.10008.5.1.4.1.1.131""" IntravascularOpticalCoherenceTomographyImageStorageForPresentation = UID( "1.2.840.10008.5.1.4.1.1.14.1" ) """1.2.840.10008.5.1.4.1.1.14.1""" IntravascularOpticalCoherenceTomographyImageStorageForProcessing = UID( "1.2.840.10008.5.1.4.1.1.14.2" ) """1.2.840.10008.5.1.4.1.1.14.2""" CTImageStorage = UID("1.2.840.10008.5.1.4.1.1.2") """1.2.840.10008.5.1.4.1.1.2""" EnhancedCTImageStorage = UID("1.2.840.10008.5.1.4.1.1.2.1") """1.2.840.10008.5.1.4.1.1.2.1""" LegacyConvertedEnhancedCTImageStorage = UID("1.2.840.10008.5.1.4.1.1.2.2") """1.2.840.10008.5.1.4.1.1.2.2""" NuclearMedicineImageStorage = UID("1.2.840.10008.5.1.4.1.1.20") """1.2.840.10008.5.1.4.1.1.20""" CTDefinedProcedureProtocolStorage = UID("1.2.840.10008.5.1.4.1.1.200.1") """1.2.840.10008.5.1.4.1.1.200.1""" CTPerformedProcedureProtocolStorage = UID("1.2.840.10008.5.1.4.1.1.200.2") """1.2.840.10008.5.1.4.1.1.200.2""" ProtocolApprovalStorage = UID("1.2.840.10008.5.1.4.1.1.200.3") """1.2.840.10008.5.1.4.1.1.200.3""" XADefinedProcedureProtocolStorage = UID("1.2.840.10008.5.1.4.1.1.200.7") """1.2.840.10008.5.1.4.1.1.200.7""" XAPerformedProcedureProtocolStorage = UID("1.2.840.10008.5.1.4.1.1.200.8") """1.2.840.10008.5.1.4.1.1.200.8""" InventoryStorage = UID("1.2.840.10008.5.1.4.1.1.201.1") """1.2.840.10008.5.1.4.1.1.201.1""" UltrasoundMultiFrameImageStorage = UID("1.2.840.10008.5.1.4.1.1.3.1") """1.2.840.10008.5.1.4.1.1.3.1""" ParametricMapStorage = UID("1.2.840.10008.5.1.4.1.1.30") """1.2.840.10008.5.1.4.1.1.30""" MRImageStorage = UID("1.2.840.10008.5.1.4.1.1.4") """1.2.840.10008.5.1.4.1.1.4""" EnhancedMRImageStorage = UID("1.2.840.10008.5.1.4.1.1.4.1") """1.2.840.10008.5.1.4.1.1.4.1""" MRSpectroscopyStorage = UID("1.2.840.10008.5.1.4.1.1.4.2") """1.2.840.10008.5.1.4.1.1.4.2""" EnhancedMRColorImageStorage = UID("1.2.840.10008.5.1.4.1.1.4.3") """1.2.840.10008.5.1.4.1.1.4.3""" LegacyConvertedEnhancedMRImageStorage = UID("1.2.840.10008.5.1.4.1.1.4.4") """1.2.840.10008.5.1.4.1.1.4.4""" RTImageStorage = UID("1.2.840.10008.5.1.4.1.1.481.1") """1.2.840.10008.5.1.4.1.1.481.1""" RTPhysicianIntentStorage = UID("1.2.840.10008.5.1.4.1.1.481.10") """1.2.840.10008.5.1.4.1.1.481.10""" RTSegmentAnnotationStorage = UID("1.2.840.10008.5.1.4.1.1.481.11") """1.2.840.10008.5.1.4.1.1.481.11""" RTRadiationSetStorage = UID("1.2.840.10008.5.1.4.1.1.481.12") """1.2.840.10008.5.1.4.1.1.481.12""" CArmPhotonElectronRadiationStorage = UID("1.2.840.10008.5.1.4.1.1.481.13") """1.2.840.10008.5.1.4.1.1.481.13""" TomotherapeuticRadiationStorage = UID("1.2.840.10008.5.1.4.1.1.481.14") """1.2.840.10008.5.1.4.1.1.481.14""" RoboticArmRadiationStorage = UID("1.2.840.10008.5.1.4.1.1.481.15") """1.2.840.10008.5.1.4.1.1.481.15""" RTRadiationRecordSetStorage = UID("1.2.840.10008.5.1.4.1.1.481.16") """1.2.840.10008.5.1.4.1.1.481.16""" RTRadiationSalvageRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.17") """1.2.840.10008.5.1.4.1.1.481.17""" TomotherapeuticRadiationRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.18") """1.2.840.10008.5.1.4.1.1.481.18""" CArmPhotonElectronRadiationRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.19") """1.2.840.10008.5.1.4.1.1.481.19""" RTDoseStorage = UID("1.2.840.10008.5.1.4.1.1.481.2") """1.2.840.10008.5.1.4.1.1.481.2""" RoboticRadiationRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.20") """1.2.840.10008.5.1.4.1.1.481.20""" RTRadiationSetDeliveryInstructionStorage = UID("1.2.840.10008.5.1.4.1.1.481.21") """1.2.840.10008.5.1.4.1.1.481.21""" RTTreatmentPreparationStorage = UID("1.2.840.10008.5.1.4.1.1.481.22") """1.2.840.10008.5.1.4.1.1.481.22""" EnhancedRTImageStorage = UID("1.2.840.10008.5.1.4.1.1.481.23") """1.2.840.10008.5.1.4.1.1.481.23""" EnhancedContinuousRTImageStorage = UID("1.2.840.10008.5.1.4.1.1.481.24") """1.2.840.10008.5.1.4.1.1.481.24""" RTPatientPositionAcquisitionInstructionStorage = UID("1.2.840.10008.5.1.4.1.1.481.25") """1.2.840.10008.5.1.4.1.1.481.25""" RTStructureSetStorage = UID("1.2.840.10008.5.1.4.1.1.481.3") """1.2.840.10008.5.1.4.1.1.481.3""" RTBeamsTreatmentRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.4") """1.2.840.10008.5.1.4.1.1.481.4""" RTPlanStorage = UID("1.2.840.10008.5.1.4.1.1.481.5") """1.2.840.10008.5.1.4.1.1.481.5""" RTBrachyTreatmentRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.6") """1.2.840.10008.5.1.4.1.1.481.6""" RTTreatmentSummaryRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.7") """1.2.840.10008.5.1.4.1.1.481.7""" RTIonPlanStorage = UID("1.2.840.10008.5.1.4.1.1.481.8") """1.2.840.10008.5.1.4.1.1.481.8""" RTIonBeamsTreatmentRecordStorage = UID("1.2.840.10008.5.1.4.1.1.481.9") """1.2.840.10008.5.1.4.1.1.481.9""" DICOSCTImageStorage = UID("1.2.840.10008.5.1.4.1.1.501.1") """1.2.840.10008.5.1.4.1.1.501.1""" DICOSDigitalXRayImageStorageForPresentation = UID("1.2.840.10008.5.1.4.1.1.501.2.1") """1.2.840.10008.5.1.4.1.1.501.2.1""" DICOSDigitalXRayImageStorageForProcessing = UID("1.2.840.10008.5.1.4.1.1.501.2.2") """1.2.840.10008.5.1.4.1.1.501.2.2""" DICOSThreatDetectionReportStorage = UID("1.2.840.10008.5.1.4.1.1.501.3") """1.2.840.10008.5.1.4.1.1.501.3""" DICOS2DAITStorage = UID("1.2.840.10008.5.1.4.1.1.501.4") """1.2.840.10008.5.1.4.1.1.501.4""" DICOS3DAITStorage = UID("1.2.840.10008.5.1.4.1.1.501.5") """1.2.840.10008.5.1.4.1.1.501.5""" DICOSQuadrupoleResonanceStorage = UID("1.2.840.10008.5.1.4.1.1.501.6") """1.2.840.10008.5.1.4.1.1.501.6""" UltrasoundImageStorage = UID("1.2.840.10008.5.1.4.1.1.6.1") """1.2.840.10008.5.1.4.1.1.6.1""" EnhancedUSVolumeStorage = UID("1.2.840.10008.5.1.4.1.1.6.2") """1.2.840.10008.5.1.4.1.1.6.2""" PhotoacousticImageStorage = UID("1.2.840.10008.5.1.4.1.1.6.3") """1.2.840.10008.5.1.4.1.1.6.3""" EddyCurrentImageStorage = UID("1.2.840.10008.5.1.4.1.1.601.1") """1.2.840.10008.5.1.4.1.1.601.1""" EddyCurrentMultiFrameImageStorage = UID("1.2.840.10008.5.1.4.1.1.601.2") """1.2.840.10008.5.1.4.1.1.601.2""" RawDataStorage = UID("1.2.840.10008.5.1.4.1.1.66") """1.2.840.10008.5.1.4.1.1.66""" SpatialRegistrationStorage = UID("1.2.840.10008.5.1.4.1.1.66.1") """1.2.840.10008.5.1.4.1.1.66.1""" SpatialFiducialsStorage = UID("1.2.840.10008.5.1.4.1.1.66.2") """1.2.840.10008.5.1.4.1.1.66.2""" DeformableSpatialRegistrationStorage = UID("1.2.840.10008.5.1.4.1.1.66.3") """1.2.840.10008.5.1.4.1.1.66.3""" SegmentationStorage = UID("1.2.840.10008.5.1.4.1.1.66.4") """1.2.840.10008.5.1.4.1.1.66.4""" SurfaceSegmentationStorage = UID("1.2.840.10008.5.1.4.1.1.66.5") """1.2.840.10008.5.1.4.1.1.66.5""" TractographyResultsStorage = UID("1.2.840.10008.5.1.4.1.1.66.6") """1.2.840.10008.5.1.4.1.1.66.6""" RealWorldValueMappingStorage = UID("1.2.840.10008.5.1.4.1.1.67") """1.2.840.10008.5.1.4.1.1.67""" SurfaceScanMeshStorage = UID("1.2.840.10008.5.1.4.1.1.68.1") """1.2.840.10008.5.1.4.1.1.68.1""" SurfaceScanPointCloudStorage = UID("1.2.840.10008.5.1.4.1.1.68.2") """1.2.840.10008.5.1.4.1.1.68.2""" SecondaryCaptureImageStorage = UID("1.2.840.10008.5.1.4.1.1.7") """1.2.840.10008.5.1.4.1.1.7""" MultiFrameSingleBitSecondaryCaptureImageStorage = UID("1.2.840.10008.5.1.4.1.1.7.1") """1.2.840.10008.5.1.4.1.1.7.1""" MultiFrameGrayscaleByteSecondaryCaptureImageStorage = UID("1.2.840.10008.5.1.4.1.1.7.2") """1.2.840.10008.5.1.4.1.1.7.2""" MultiFrameGrayscaleWordSecondaryCaptureImageStorage = UID("1.2.840.10008.5.1.4.1.1.7.3") """1.2.840.10008.5.1.4.1.1.7.3""" MultiFrameTrueColorSecondaryCaptureImageStorage = UID("1.2.840.10008.5.1.4.1.1.7.4") """1.2.840.10008.5.1.4.1.1.7.4""" VLEndoscopicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.1") """1.2.840.10008.5.1.4.1.1.77.1.1""" VideoEndoscopicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.1.1") """1.2.840.10008.5.1.4.1.1.77.1.1.1""" VLMicroscopicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.2") """1.2.840.10008.5.1.4.1.1.77.1.2""" VideoMicroscopicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.2.1") """1.2.840.10008.5.1.4.1.1.77.1.2.1""" VLSlideCoordinatesMicroscopicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.3") """1.2.840.10008.5.1.4.1.1.77.1.3""" VLPhotographicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.4") """1.2.840.10008.5.1.4.1.1.77.1.4""" VideoPhotographicImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.4.1") """1.2.840.10008.5.1.4.1.1.77.1.4.1""" OphthalmicPhotography8BitImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.5.1") """1.2.840.10008.5.1.4.1.1.77.1.5.1""" OphthalmicPhotography16BitImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.5.2") """1.2.840.10008.5.1.4.1.1.77.1.5.2""" StereometricRelationshipStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.5.3") """1.2.840.10008.5.1.4.1.1.77.1.5.3""" OphthalmicTomographyImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.5.4") """1.2.840.10008.5.1.4.1.1.77.1.5.4""" WideFieldOphthalmicPhotographyStereographicProjectionImageStorage = UID( "1.2.840.10008.5.1.4.1.1.77.1.5.5" ) """1.2.840.10008.5.1.4.1.1.77.1.5.5""" WideFieldOphthalmicPhotography3DCoordinatesImageStorage = UID( "1.2.840.10008.5.1.4.1.1.77.1.5.6" ) """1.2.840.10008.5.1.4.1.1.77.1.5.6""" OphthalmicOpticalCoherenceTomographyEnFaceImageStorage = UID( "1.2.840.10008.5.1.4.1.1.77.1.5.7" ) """1.2.840.10008.5.1.4.1.1.77.1.5.7""" OphthalmicOpticalCoherenceTomographyBscanVolumeAnalysisStorage = UID( "1.2.840.10008.5.1.4.1.1.77.1.5.8" ) """1.2.840.10008.5.1.4.1.1.77.1.5.8""" VLWholeSlideMicroscopyImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.6") """1.2.840.10008.5.1.4.1.1.77.1.6""" DermoscopicPhotographyImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.7") """1.2.840.10008.5.1.4.1.1.77.1.7""" ConfocalMicroscopyImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.8") """1.2.840.10008.5.1.4.1.1.77.1.8""" ConfocalMicroscopyTiledPyramidalImageStorage = UID("1.2.840.10008.5.1.4.1.1.77.1.9") """1.2.840.10008.5.1.4.1.1.77.1.9""" LensometryMeasurementsStorage = UID("1.2.840.10008.5.1.4.1.1.78.1") """1.2.840.10008.5.1.4.1.1.78.1""" AutorefractionMeasurementsStorage = UID("1.2.840.10008.5.1.4.1.1.78.2") """1.2.840.10008.5.1.4.1.1.78.2""" KeratometryMeasurementsStorage = UID("1.2.840.10008.5.1.4.1.1.78.3") """1.2.840.10008.5.1.4.1.1.78.3""" SubjectiveRefractionMeasurementsStorage = UID("1.2.840.10008.5.1.4.1.1.78.4") """1.2.840.10008.5.1.4.1.1.78.4""" VisualAcuityMeasurementsStorage = UID("1.2.840.10008.5.1.4.1.1.78.5") """1.2.840.10008.5.1.4.1.1.78.5""" SpectaclePrescriptionReportStorage = UID("1.2.840.10008.5.1.4.1.1.78.6") """1.2.840.10008.5.1.4.1.1.78.6""" OphthalmicAxialMeasurementsStorage = UID("1.2.840.10008.5.1.4.1.1.78.7") """1.2.840.10008.5.1.4.1.1.78.7""" IntraocularLensCalculationsStorage = UID("1.2.840.10008.5.1.4.1.1.78.8") """1.2.840.10008.5.1.4.1.1.78.8""" MacularGridThicknessAndVolumeReportStorage = UID("1.2.840.10008.5.1.4.1.1.79.1") """1.2.840.10008.5.1.4.1.1.79.1""" OphthalmicVisualFieldStaticPerimetryMeasurementsStorage = UID( "1.2.840.10008.5.1.4.1.1.80.1" ) """1.2.840.10008.5.1.4.1.1.80.1""" OphthalmicThicknessMapStorage = UID("1.2.840.10008.5.1.4.1.1.81.1") """1.2.840.10008.5.1.4.1.1.81.1""" CornealTopographyMapStorage = UID("1.2.840.10008.5.1.4.1.1.82.1") """1.2.840.10008.5.1.4.1.1.82.1""" BasicTextSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.11") """1.2.840.10008.5.1.4.1.1.88.11""" EnhancedSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.22") """1.2.840.10008.5.1.4.1.1.88.22""" ComprehensiveSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.33") """1.2.840.10008.5.1.4.1.1.88.33""" Comprehensive3DSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.34") """1.2.840.10008.5.1.4.1.1.88.34""" ExtensibleSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.35") """1.2.840.10008.5.1.4.1.1.88.35""" ProcedureLogStorage = UID("1.2.840.10008.5.1.4.1.1.88.40") """1.2.840.10008.5.1.4.1.1.88.40""" MammographyCADSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.50") """1.2.840.10008.5.1.4.1.1.88.50""" KeyObjectSelectionDocumentStorage = UID("1.2.840.10008.5.1.4.1.1.88.59") """1.2.840.10008.5.1.4.1.1.88.59""" ChestCADSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.65") """1.2.840.10008.5.1.4.1.1.88.65""" XRayRadiationDoseSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.67") """1.2.840.10008.5.1.4.1.1.88.67""" RadiopharmaceuticalRadiationDoseSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.68") """1.2.840.10008.5.1.4.1.1.88.68""" ColonCADSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.69") """1.2.840.10008.5.1.4.1.1.88.69""" ImplantationPlanSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.70") """1.2.840.10008.5.1.4.1.1.88.70""" AcquisitionContextSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.71") """1.2.840.10008.5.1.4.1.1.88.71""" SimplifiedAdultEchoSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.72") """1.2.840.10008.5.1.4.1.1.88.72""" PatientRadiationDoseSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.73") """1.2.840.10008.5.1.4.1.1.88.73""" PlannedImagingAgentAdministrationSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.74") """1.2.840.10008.5.1.4.1.1.88.74""" PerformedImagingAgentAdministrationSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.75") """1.2.840.10008.5.1.4.1.1.88.75""" EnhancedXRayRadiationDoseSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.76") """1.2.840.10008.5.1.4.1.1.88.76""" WaveformAnnotationSRStorage = UID("1.2.840.10008.5.1.4.1.1.88.77") """1.2.840.10008.5.1.4.1.1.88.77""" TwelveLeadECGWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.1.1") """1.2.840.10008.5.1.4.1.1.9.1.1""" GeneralECGWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.1.2") """1.2.840.10008.5.1.4.1.1.9.1.2""" AmbulatoryECGWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.1.3") """1.2.840.10008.5.1.4.1.1.9.1.3""" General32bitECGWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.1.4") """1.2.840.10008.5.1.4.1.1.9.1.4""" HemodynamicWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.2.1") """1.2.840.10008.5.1.4.1.1.9.2.1""" CardiacElectrophysiologyWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.3.1") """1.2.840.10008.5.1.4.1.1.9.3.1""" BasicVoiceAudioWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.4.1") """1.2.840.10008.5.1.4.1.1.9.4.1""" GeneralAudioWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.4.2") """1.2.840.10008.5.1.4.1.1.9.4.2""" ArterialPulseWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.5.1") """1.2.840.10008.5.1.4.1.1.9.5.1""" RespiratoryWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.6.1") """1.2.840.10008.5.1.4.1.1.9.6.1""" MultichannelRespiratoryWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.6.2") """1.2.840.10008.5.1.4.1.1.9.6.2""" RoutineScalpElectroencephalogramWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.7.1") """1.2.840.10008.5.1.4.1.1.9.7.1""" ElectromyogramWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.7.2") """1.2.840.10008.5.1.4.1.1.9.7.2""" ElectrooculogramWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.7.3") """1.2.840.10008.5.1.4.1.1.9.7.3""" SleepElectroencephalogramWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.7.4") """1.2.840.10008.5.1.4.1.1.9.7.4""" BodyPositionWaveformStorage = UID("1.2.840.10008.5.1.4.1.1.9.8.1") """1.2.840.10008.5.1.4.1.1.9.8.1""" ContentAssessmentResultsStorage = UID("1.2.840.10008.5.1.4.1.1.90.1") """1.2.840.10008.5.1.4.1.1.90.1""" MicroscopyBulkSimpleAnnotationsStorage = UID("1.2.840.10008.5.1.4.1.1.91.1") """1.2.840.10008.5.1.4.1.1.91.1""" RTBrachyApplicationSetupDeliveryInstructionStorage = UID("1.2.840.10008.5.1.4.34.10") """1.2.840.10008.5.1.4.34.10""" RTBeamsDeliveryInstructionStorage = UID("1.2.840.10008.5.1.4.34.7") """1.2.840.10008.5.1.4.34.7""" HangingProtocolStorage = UID("1.2.840.10008.5.1.4.38.1") """1.2.840.10008.5.1.4.38.1""" ColorPaletteStorage = UID("1.2.840.10008.5.1.4.39.1") """1.2.840.10008.5.1.4.39.1""" GenericImplantTemplateStorage = UID("1.2.840.10008.5.1.4.43.1") """1.2.840.10008.5.1.4.43.1""" ImplantAssemblyTemplateStorage = UID("1.2.840.10008.5.1.4.44.1") """1.2.840.10008.5.1.4.44.1""" ImplantTemplateGroupStorage = UID("1.2.840.10008.5.1.4.45.1") """1.2.840.10008.5.1.4.45.1""" pydicom-pydicom-20aa4b7/src/pydicom/util/000077500000000000000000000000001515706620200204365ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/util/__init__.py000066400000000000000000000000001515706620200225350ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/util/codify.py000066400000000000000000000417541515706620200223000ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """ Produce runnable python code which can recreate DICOM objects or files. Can run as a script to produce code for an entire file, or import and use specific functions to provide code for pydicom DICOM classes """ # Run this from the same directory as a "base" dicom file and # this code will output to screen the dicom parameters like: # ds.PatientName = 'TEST' # etc for all parameters in the file. # This can then be pasted into a python file and parameters edited as necessary # to create a DICOM file from scratch import argparse import os.path import re import sys from typing import cast from collections.abc import Callable from collections import deque import pydicom from pydicom.datadict import dictionary_keyword from pydicom.dataelem import DataElement from pydicom.dataset import Dataset from pydicom.tag import BaseTag from pydicom.valuerep import BYTES_VR, AMBIGUOUS_VR, VR from pydicom.cli.main import filespec_help, filespec_parser line_term = "\n" # Precompiled search patterns for camel_to_underscore() first_cap_re = re.compile("(.)([A-Z][a-z]+)") all_cap_re = re.compile("([a-z0-9])([A-Z])") def camel_to_underscore(name: str) -> str: """Convert name from CamelCase to lower_case_with_underscores""" # From https://stackoverflow.com/questions/1175208 s1 = first_cap_re.sub(r"\1_\2", name) return all_cap_re.sub(r"\1_\2", s1).lower() def tag_repr(tag: BaseTag) -> str: """String of tag value as (0xgggg, 0xeeee)""" return f"(0x{tag.group:04X}, 0x{tag.element:04X})" def default_name_filter(name: str) -> str: """Callable to reduce some names in code to more readable short form :arg name: a sequence variable name or sequence item name :return: a shorter version of name if a known conversion, else return original name """ name = camel_to_underscore(name) name = name.replace("control_point", "cp") name = name.replace("reference", "ref") name = name.replace("fraction_group", "frxn_gp") return name # Functions to produce python code def code_imports() -> str: """Code the import statements needed by other codify results :return: a string of import statement lines """ line1 = "import pydicom" line2 = "from pydicom.dataset import Dataset, FileMetaDataset" line3 = "from pydicom.sequence import Sequence" return line_term.join((line1, line2, line3)) def code_dataelem( dataelem: DataElement, dataset_name: str = "ds", exclude_size: int | None = None, include_private: bool = False, var_names: deque | None = None, ) -> str: """Code lines for a single DICOM data element Parameters ---------- dataelem : DataElement The DataElement instance to turn into code dataset_name : str The variable name of the Dataset containing `dataelem` exclude_size : int | None If specified, values longer than this (in bytes) will only have a commented string for a value, causing a syntax error when the code is run, and thus prompting the user to remove or fix that line. var_names: deque | None Used internally to ensure unique variable names in nested sequences. Returns ------- str A string containing code to recreate the data element If the data element is a sequence, calls code_sequence """ if dataelem.VR == VR.SQ: return code_sequence( dataelem, dataset_name, exclude_size, include_private, var_names=var_names ) # If in DICOM dictionary, set using the keyword # If not (e.g. is private element), set using add_new method have_keyword = True try: keyword = dictionary_keyword(dataelem.tag) except KeyError: have_keyword = False # If the value representation of the data element is AT (Attribute Tag), # then format it as a tag if dataelem.VR == "AT": valuerep = tag_repr(dataelem.value) else: valuerep = repr(dataelem.value) if exclude_size: if ( dataelem.VR in (BYTES_VR | AMBIGUOUS_VR) - {VR.US_SS} and not isinstance(dataelem.value, int | float) and len(dataelem.value) > exclude_size ): valuerep = f"# XXX Array of {len(dataelem.value)} bytes excluded" if have_keyword: line = f"{dataset_name}.{keyword} = {valuerep}" else: tag = tag_repr(dataelem.tag) vr = dataelem.VR line = f"{dataset_name}.add_new({tag}, '{vr}', {valuerep})" return line def code_sequence( dataelem: DataElement, dataset_name: str = "ds", exclude_size: int | None = None, include_private: bool = False, name_filter: Callable[[str], str] = default_name_filter, var_names: deque | None = None, ) -> str: """Code lines for recreating a Sequence data element Parameters ---------- dataelem : DataElement The DataElement instance whose value is the Sequence dataset_name : str Variable name of the dataset containing the Sequence exclude_size : int, optional If not ``None``, values longer than this (in bytes) will only have a commented string for a value, causing a syntax error when the code is run, and thus prompting the user to remove or fix that line. include_private: bool If ``False`` (default) private elements are skipped, otherwise private data elements will be coded. name_filter: Callable[[str], str] A callable taking a sequence name or sequence item name, and returning a shorter name for easier code reading var_names: deque | None Used internally to ensure unique variable names in nested sequences. Returns ------- str A string containing code lines to recreate a DICOM sequence """ # Normally var_names is given from code_dataset, but for some tests need # to initialize it if var_names is None: var_names = deque() def unique_name(name: str) -> str: name_count = ( cast(deque, var_names).count(name) - 1 ) # type:ignore[redundant-cast] return name if name_count == 0 else name + f"_{name_count}" lines = [] seq = dataelem.value seq_name = dataelem.name seq_item_name = seq_name.replace(" Sequence", "") try: seq_keyword = dictionary_keyword(dataelem.tag) except KeyError: seq_keyword = f"Tag{dataelem.tag:08x}" # Create comment line to document the start of Sequence lines.append("") lines.append("# " + seq_name) # Code line to create a new Sequence object seq_var = name_filter(seq_keyword) var_names.append(seq_var) orig_seq_var = seq_var seq_var = unique_name(seq_var) lines.append(seq_var + " = Sequence()") # Code line to add the sequence to its parent lines.append(dataset_name + "." + seq_keyword + " = " + seq_var) # Code lines to add sequence items to the Sequence for i, ds in enumerate(seq): # Determine index to use. If seq item has a data element with 'Index', # use that; if one with 'Number', use that, else start at 1 index_keyword = seq_keyword.replace("Sequence", "") + "Index" number_keyword = seq_keyword.replace("Sequence", "") + "Number" if hasattr(ds, index_keyword): index_str = str(getattr(ds, index_keyword)) elif hasattr(ds, number_keyword): index_str = str(getattr(ds, number_keyword)) else: index_str = str(i + 1) # Code comment line to mark start of sequence item lines.append("") lines.append("# " + seq_name + ": " + seq_item_name + " " + index_str) # Determine the variable name to use for the sequence item (dataset) ds_name = orig_seq_var.replace("_sequence", "") + index_str # Append "_#" if name already in use (in parent sequences) var_names.append(ds_name) ds_name = unique_name(ds_name) # Code the sequence item dataset code_item = code_dataset( ds, ds_name, exclude_size, include_private, var_names=var_names ) # Remove variable name from stored list, this dataset complete var_names.pop() # Code dataset creation and appending that to sequence, then the rest # This keeps the logic close together, rather than after many items set code_split = code_item.splitlines() lines.append(code_split[0]) # " = Dataset()" lines.append(f"{seq_var}.append({ds_name})") lines.extend(code_split[1:]) # Remove sequence variable name we've used var_names.pop() # Join the lines and return a single string return line_term.join(lines) def code_dataset( ds: Dataset, dataset_name: str = "ds", exclude_size: int | None = None, include_private: bool = False, is_file_meta: bool = False, var_names: deque | None = None, ) -> str: """Return Python code for creating `ds`. Parameters ---------- ds : pydicom.dataset.Dataset The dataset to codify. dataset_name : str, optional The Python variable name to use for the dataset, default ``'ds'``. exclude_size : int, optional If not ``None``, values longer than this (in bytes) will only have a commented string for a value, causing a syntax error when the code is run, and thus prompting the user to remove or fix that line. include_private : bool, optional If ``False`` (default) private elements are skipped, otherwise private data elements will be coded. is_file_meta : bool, optional ``True`` if `ds` contains file meta information elements. var_names: deque, optional Used internally to ensure unique variable names in nested sequences. Returns ------- str The codified dataset. """ if var_names is None: var_names = deque() lines = [] ds_class = " = FileMetaDataset()" if is_file_meta else " = Dataset()" lines.append(dataset_name + ds_class) for dataelem in ds: # If a private data element and flag says so, skip it and go to next if not include_private and dataelem.tag.is_private: continue # Otherwise code the line and add it to the lines list code_line = code_dataelem( dataelem, dataset_name, exclude_size, include_private, var_names=var_names ) lines.append(code_line) # Add blank line if just coded a sequence if dataelem.VR == VR.SQ: lines.append("") # If sequence was end of this dataset, remove the extra blank line if len(lines) and lines[-1] == "": lines.pop() # Join all the code lines and return them return line_term.join(lines) def code_file( filename: str, exclude_size: int | None = None, include_private: bool = False ) -> str: """Write a complete source code file to recreate a DICOM file Parameters ---------- filename : str Complete path and filename of a DICOM file to convert exclude_size : int |None If not None, values longer than this (in bytes) will only have a commented string for a value, causing a syntax error when the code is run, and thus prompting the user to remove or fix that line. include_private : bool If ``False`` (default), private elements are skipped If ``True``, private data elements will be coded. Returns ------- str A string containing code lines to recreate the entire DICOM file """ ds = pydicom.dcmread(filename, force=True) return code_file_from_dataset(ds, exclude_size, include_private) def code_file_from_dataset( ds: Dataset, exclude_size: int | None = None, include_private: bool = False ) -> str: """Write a complete source code file to recreate a DICOM file Parameters ---------- ds : Dataset A pydicom Dataset to convert exclude_size : int |None If not None, values longer than this (in bytes) will only have a commented string for a value, causing a syntax error when the code is run, and thus prompting the user to remove or fix that line. include_private : bool If ``False`` (default), private elements are skipped If ``True``, private data elements will be coded. Returns ------- str A string containing code lines to recreate the entire DICOM file """ lines = [] # Code a nice header for the python file filename = ds.get("filename") identifier = f"DICOM file '{filename}'" if filename else "non-file dataset" lines.append("# -*- coding: utf-8 -*-") lines.append(f"# Coded version of {identifier}") lines.append("# Produced by pydicom codify utility script") # Code the necessary imports lines.append(code_imports()) lines.append("") # Code the file_meta information if hasattr(ds, "file_meta"): lines.append("# File meta info data elements") code_meta = code_dataset( ds.file_meta, "file_meta", exclude_size, include_private, is_file_meta=True, ) lines.append(code_meta) lines.append("") # Code the main dataset lines.append("# Main data elements") code_ds = code_dataset( ds, exclude_size=exclude_size, include_private=include_private ) lines.append(code_ds) lines.append("") # Add the file meta to the dataset, and set transfer syntax if hasattr(ds, "file_meta"): lines.append("ds.file_meta = file_meta") implicit_vr, little_endian = ds.original_encoding lines.append(f"ds.set_original_encoding({implicit_vr}, {little_endian})") # Return the complete code string return line_term.join(lines) def set_parser_arguments( parser: argparse.ArgumentParser, default_exclude_size: int ) -> None: parser.add_argument( "filespec", help=filespec_help, type=filespec_parser, ) parser.add_argument( "outfile", nargs="?", type=argparse.FileType("w", encoding="UTF-8"), help=( "Filename to write Python code to, if not specified then code is " "written to stdout" ), default=sys.stdout, ) parser.add_argument( "-e", "--exclude-size", type=int, default=default_exclude_size, help=( "Exclude binary data larger than specified (default: " f"{default_exclude_size} bytes)" ), ) parser.add_argument( "-p", "--include-private", action="store_true", help="Include private data elements (default is to exclude them)", ) parser.add_argument( "-s", "--save-as", help=( "Specify the filename for ds.save_as(save_filename); " "otherwise the input name + '_from_codify' will be used" ), ) def do_codify(args: argparse.Namespace) -> None: # Convert the requested dataset to python/pydicom code lines if len(args.filespec) != 1: raise NotImplementedError("Codify can only work on a single DICOM file input") ds, element = args.filespec[0] filename = ds.filename if element and not isinstance(element, Dataset): raise NotImplementedError( f"Codify can only code a Dataset, not a {type(element)}" ) code_str = code_file_from_dataset( element or ds, args.exclude_size, args.include_private ) # If requested, write a code line to save the dataset if args.save_as: save_as_filename = args.save_as else: base, _ = os.path.splitext(filename) save_as_filename = base + "_from_codify" + ".dcm" save_line = f"\nds.save_as(r'{save_as_filename}', enforce_file_format=True)" code_str += save_line # Write the code lines to specified file or to standard output # For test_util, captured output .name throws error, ignore it: try: if args.outfile.name != "": print(f"Writing code to file '{args.outfile.name}'") except AttributeError: pass args.outfile.write(code_str) def main(default_exclude_size: int, args: list[str] | None = None) -> None: """Create Python code according to user options Parameters: ----------- default_exclude_size : int Values longer than this will be coded as a commented syntax error args : List[str], optional Command-line arguments to parse. If ``None`` then :attr:`sys.argv` is used. """ parser = argparse.ArgumentParser( description="Produce python/pydicom code from a DICOM file", epilog=( "Binary data (e.g. pixels) larger than --exclude-size " f"(default {default_exclude_size} bytes) is not included. A " "dummy line with a syntax error is produced. " "Private data elements are not included by default." ), ) set_parser_arguments(parser, default_exclude_size) do_codify(parser.parse_args(args)) if __name__ == "__main__": # pragma: no cover main(default_exclude_size=100) pydicom-pydicom-20aa4b7/src/pydicom/util/dump.py000066400000000000000000000074671515706620200217730ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Utility functions used in debugging writing and reading""" from io import BytesIO import os import sys from typing import BinaryIO, TYPE_CHECKING from pydicom.valuerep import VR if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset def print_character(ordchr: int) -> str: """Return a printable character, or '.' for non-printable ones.""" if 31 < ordchr < 126 and ordchr != 92: return chr(ordchr) return "." def filedump( filename: str | bytes | os.PathLike, start_address: int = 0, stop_address: int | None = None, ) -> str: """Dump out the contents of a file to a standard hex dump 16 bytes wide""" with open(filename, "rb") as f: return hexdump(f, start_address, stop_address) def datadump( data: bytes, start_address: int = 0, stop_address: int | None = None ) -> str: """Return a hex string representation of `data`.""" return hexdump(BytesIO(data), start_address, stop_address) def hexdump( f: BinaryIO, start_address: int = 0, stop_address: int | None = None, show_address: bool = True, ) -> str: """Return a formatted string of hex bytes and characters in data. This is a utility function for debugging file writing. Parameters ---------- f : BinaryIO The file-like to dump. start_address : int, optional The offset where the dump should start (default ``0``) stop_address : int, optional The offset where the dump should end, by default the entire file will be dumped. show_address : bool, optional If ``True`` (default) then include the offset of each line of output. Returns ------- str """ s = [] # Determine the maximum number of characters for the offset max_offset_len = len(f"{f.seek(0, 2):X}") if stop_address: max_offset_len = len(f"{stop_address:X}") f.seek(start_address) while True: offset = f.tell() if stop_address and offset > stop_address: break data = f.read(16) if not data: break current = [] if show_address: # Offset at the start of the current line current.append(f"{offset:0{max_offset_len}X} ") # Add hex version of the current line b = " ".join([f"{x:02X}" for x in data]) current.append(f"{b:<49}") # if fewer than 16 bytes, pad out to length # Append the ASCII version of the current line (or . if not ASCII) current.append("".join([print_character(x) for x in data])) s.append("".join(current)) return "\n".join(s) def pretty_print( ds: "Dataset", indent_level: int = 0, indent_chars: str = " " ) -> None: """Print a dataset directly, with indented levels. This is just like Dataset._pretty_str, but more useful for debugging as it prints each item immediately rather than composing a string, making it easier to immediately see where an error in processing a dataset starts. """ indent = indent_chars * indent_level next_indent = indent_chars * (indent_level + 1) for elem in ds: if elem.VR == VR.SQ: # a sequence print(f"{indent}{elem.tag} {elem.name} -- {len(elem.value)} item(s)") for dataset in elem.value: pretty_print(dataset, indent_level + 1) print(next_indent + "---------") else: print(indent + repr(elem)) if __name__ == "__main__": # pragma: no cover filename = sys.argv[1] start_address = 0 stop_address = None if len(sys.argv) > 2: # then have start address start_address = eval(sys.argv[2]) if len(sys.argv) > 3: stop_address = eval(sys.argv[3]) print(filedump(filename, start_address, stop_address)) pydicom-pydicom-20aa4b7/src/pydicom/util/fixer.py000066400000000000000000000102101515706620200221170ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Code to fix non-standard dicom issues in files """ from typing import TYPE_CHECKING, Any from pydicom import config from pydicom import datadict from pydicom import values from pydicom.valuerep import VR if TYPE_CHECKING: # pragma: no cover from pydicom.dataelem import RawDataElement def fix_separator_callback( raw_elem: "RawDataElement", **kwargs: Any ) -> "RawDataElement": """Used by fix_separator as the callback function from read_dataset""" return_val = raw_elem try_replace = False # If elements are implicit VR, attempt to determine the VR if raw_elem.VR is None: try: vr = datadict.dictionary_VR(raw_elem.tag) # Not in the dictionary, process if flag says to do so except KeyError: try_replace = kwargs["process_unknown_VRs"] else: try_replace = vr in kwargs["for_VRs"] else: try_replace = raw_elem.VR in kwargs["for_VRs"] if try_replace: # Note value has not been decoded yet when this function called, # so need to replace backslash as bytes new_value = None if raw_elem.value is not None: if kwargs["invalid_separator"] == b" ": stripped_val = raw_elem.value.strip() strip_count = len(raw_elem.value) - len(stripped_val) new_value = ( stripped_val.replace(kwargs["invalid_separator"], b"\\") + b" " * strip_count ) else: new_value = raw_elem.value.replace(kwargs["invalid_separator"], b"\\") return_val = raw_elem._replace(value=new_value) return return_val def fix_separator( invalid_separator: bytes, for_VRs: tuple[str, ...] = ("DS", "IS"), process_unknown_VRs: bool = True, ) -> None: """A callback function to fix RawDataElement values using some other separator than the dicom standard backslash character Parameters ---------- invalid_separator : bytes A single byte to replace with dicom backslash, in raw data element values before they have been decoded or processed by pydicom for_VRs : list, optional A list of VRs for which the replacement will be done. If the VR is unknown (for example, if a private element), then process_unknown_VR is used to determine whether to replace or not. process_unknown_VRs: bool, optional If True (default) then attempt the fix even if the VR is not known. Returns ------- No return value. However, the callback function will return either the original RawDataElement instance, or a fixed one. """ config.data_element_callback = fix_separator_callback config.data_element_callback_kwargs = { "invalid_separator": invalid_separator, "for_VRs": for_VRs, "process_unknown_VRs": process_unknown_VRs, } def fix_mismatch_callback( raw_elem: "RawDataElement", **kwargs: Any ) -> "RawDataElement": if raw_elem.VR is None: return raw_elem try: values.convert_value(raw_elem.VR, raw_elem) except ValueError: for vr in kwargs["with_VRs"]: try: values.convert_value(vr, raw_elem) except ValueError: pass else: raw_elem = raw_elem._replace(VR=vr) return raw_elem def fix_mismatch(with_VRs: tuple[str, ...] = (VR.PN, VR.DS, VR.IS)) -> None: """A callback function to check that RawDataElements are translatable with their provided VRs. If not, re-attempt translation using some other translators. Parameters ---------- with_VRs : Tuple[str] A tuple of VR strings to attempt if the raw data element value cannot be translated with the raw data element's VR. Default ``('PN', 'DS', 'IS')``. Returns ------- No return value. The callback function will return either the original RawDataElement instance, or one with a fixed VR. """ config.data_element_callback = fix_mismatch_callback config.data_element_callback_kwargs = {"with_VRs": with_VRs} pydicom-pydicom-20aa4b7/src/pydicom/util/hexutil.py000066400000000000000000000030111515706620200224650ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Miscellaneous utility routines relating to hex and byte strings""" from binascii import a2b_hex, b2a_hex from pydicom.charset import default_encoding def hex2bytes(hexstring: str | bytes) -> bytes: """Return bytestring for a string of hex bytes separated by whitespace This is useful for creating specific byte sequences for testing, using python's implied concatenation for strings with comments allowed. Examples -------- :: hex_string = ( "08 00 32 10 " # (0008,1032) SQ "Procedure Code Sequence" "08 00 00 00 " # length 8 "fe ff 00 e0 " # (FFFE,E000) Item Tag ) byte_string = hex2bytes(hex_string) Note in the example that all lines except the first must start with a space, alternatively the space could end the previous line. """ # This works in both 3.x and 2.x because the first conditional evaluates to # true in 2.x so the difference in bytes constructor doesn't matter if isinstance(hexstring, bytes): return a2b_hex(hexstring.replace(b" ", b"")) if isinstance(hexstring, str): return a2b_hex(bytes(hexstring.replace(" ", ""), default_encoding)) raise TypeError("argument shall be bytes or string type") def bytes2hex(byte_string: bytes) -> str: """Return a hex string representation of encoded bytes.""" s = b2a_hex(byte_string).decode() return " ".join(s[i : i + 2] for i in range(0, len(s), 2)) pydicom-pydicom-20aa4b7/src/pydicom/util/leanread.py000066400000000000000000000143051515706620200225660ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Read a dicom media file""" import os from struct import Struct, unpack from types import TracebackType from typing import cast, BinaryIO from collections.abc import Iterator, Callable from pydicom.misc import size_in_bytes from pydicom.datadict import dictionary_VR from pydicom.tag import TupleTag, ItemTag from pydicom.uid import UID from pydicom.valuerep import EXPLICIT_VR_LENGTH_32 extra_length_VRs_b = tuple(vr.encode("ascii") for vr in EXPLICIT_VR_LENGTH_32) ExplicitVRLittleEndian = b"1.2.840.10008.1.2.1" ImplicitVRLittleEndian = b"1.2.840.10008.1.2" DeflatedExplicitVRLittleEndian = b"1.2.840.10008.1.2.1.99" ExplicitVRBigEndian = b"1.2.840.10008.1.2.2" _ElementType = tuple[tuple[int, int], bytes | None, int, bytes | None, int] class dicomfile: """Context-manager based DICOM file object with data element iteration""" def __init__(self, filename: str | bytes | os.PathLike) -> None: self.fobj = fobj = open(filename, "rb") # Read the DICOM preamble, if present self.preamble: bytes | None = fobj.read(0x80) dicom_prefix = fobj.read(4) if dicom_prefix != b"DICM": self.preamble = None fobj.seek(0) def __enter__(self) -> "dicomfile": return self def __exit__( self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None, ) -> bool | None: self.fobj.close() return None def __iter__(self) -> Iterator[_ElementType]: # Need the transfer_syntax later tsyntax: UID | None = None # Yield the file meta info elements file_meta = data_element_generator( self.fobj, is_implicit_VR=False, is_little_endian=True, stop_when=lambda group, elem: group != 2, ) for elem in file_meta: if elem[0] == (0x0002, 0x0010): value = cast(bytes, elem[3]) tsyntax = UID(value.strip(b" \0").decode("ascii")) yield elem # Continue to yield elements from the main data if not tsyntax: raise NotImplementedError("No transfer syntax in file meta info") ds_gen = data_element_generator( self.fobj, tsyntax.is_implicit_VR, tsyntax.is_little_endian ) for elem in ds_gen: yield elem def data_element_generator( fp: BinaryIO, is_implicit_VR: bool, is_little_endian: bool, stop_when: Callable[[int, int], bool] | None = None, defer_size: str | int | float | None = None, ) -> Iterator[_ElementType]: """:return: (tag, VR, length, value, value_tell, is_implicit_VR, is_little_endian) """ endian_chr = "<" if is_little_endian else ">" if is_implicit_VR: element_struct = Struct(endian_chr + "HHL") else: # Explicit VR # tag, VR, 2-byte length (or 0 if special VRs) element_struct = Struct(endian_chr + "HH2sH") extra_length_struct = Struct(endian_chr + "L") # for special VRs extra_length_unpack = extra_length_struct.unpack # for lookup speed # Make local variables so have faster lookup fp_read = fp.read fp_tell = fp.tell element_struct_unpack = element_struct.unpack defer_size = size_in_bytes(defer_size) while True: # Read tag, VR, length, get ready to read value bytes_read = fp_read(8) if len(bytes_read) < 8: return # at end of file if is_implicit_VR: # must reset VR each time; could have set last iteration (e.g. SQ) vr = None group, elem, length = element_struct_unpack(bytes_read) else: # explicit VR group, elem, vr, length = element_struct_unpack(bytes_read) if vr in extra_length_VRs_b: length = extra_length_unpack(fp_read(4))[0] # Positioned to read the value, but may not want to -- check stop_when value_tell = fp_tell() if stop_when is not None: if stop_when(group, elem): rewind_length = 8 if not is_implicit_VR and vr in extra_length_VRs_b: rewind_length += 4 fp.seek(value_tell - rewind_length) return # Reading the value # First case (most common): reading a value with a defined length if length != 0xFFFFFFFF: if defer_size is not None and length > defer_size: # Flag as deferred by setting value to None, and skip bytes value = None fp.seek(fp_tell() + length) else: value = fp_read(length) # import pdb;pdb.set_trace() yield ((group, elem), vr, length, value, value_tell) # Second case: undefined length - must seek to delimiter, # unless is SQ type, in which case is easier to parse it, because # undefined length SQs and items of undefined lengths can be nested # and it would be error-prone to read to the correct outer delimiter else: # Try to look up type to see if is a SQ # if private tag, won't be able to look it up in dictionary, # in which case just ignore it and read the bytes unless it is # identified as a Sequence if vr is None: try: vr = dictionary_VR((group, elem)).encode("ascii") except KeyError: # Look ahead to see if it consists of items and # is thus a SQ next_tag = TupleTag( cast( tuple[int, int], unpack(endian_chr + "HH", fp_read(4)), ) ) # Rewind the file fp.seek(fp_tell() - 4) if next_tag == ItemTag: vr = b"SQ" if vr == b"SQ": yield ((group, elem), vr, length, None, value_tell) else: raise NotImplementedError( "This reader does not handle undefined length except for SQ" ) pydicom-pydicom-20aa4b7/src/pydicom/valuerep.py000066400000000000000000002127311515706620200216640ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Special classes for DICOM value representations (VR)""" import datetime from decimal import Decimal from enum import Enum, unique import re from math import floor, isfinite, log10 from typing import Optional, Any, cast from collections.abc import Callable, Sequence, Iterator # don't import datetime_conversion directly from pydicom import config from pydicom.misc import warn_and_log # can't import from charset or get circular import default_encoding = "iso8859" # Delimiters for text strings and person name that reset the encoding. # See PS3.5, Section 6.1.2.5.3 # Note: We use character codes for Python 3 # because those are the types yielded if iterating over a byte string. # Characters/Character codes for text VR delimiters: LF, CR, TAB, FF TEXT_VR_DELIMS = {0x0D, 0x0A, 0x09, 0x0C} # Character/Character code for PN delimiter: name part separator '^' # (the component separator '=' is handled separately) PN_DELIMS = {0x5E} # maximum allowed value length for string VRs # VRs with a maximum length of 2^32 (UR and UT) are not checked MAX_VALUE_LEN = { "AE": 16, "CS": 16, "DS": 16, "IS": 12, "LO": 64, "LT": 10240, "SH": 16, "ST": 1024, "UI": 64, } def _range_regex(regex: str) -> str: """Compose a regex that allows ranges of the given regex, as defined for VRs DA, DT and TM in PS 3.4, C.2.2.2.5. """ return rf"^{regex}$|^\-{regex} ?$|^{regex}\- ?$|^{regex}\-{regex} ?$" # regular expressions to match valid values for some VRs VR_REGEXES = { "AE": r"^[\x20-\x7e]*$", "AS": r"^\d\d\d[DWMY]$", "CS": r"^[A-Z0-9 _]*$", "DS": r"^ *[+\-]?(\d+|\d+\.\d*|\.\d+)([eE][+\-]?\d+)? *$", "IS": r"^ *[+\-]?\d+ *$", "DA": _range_regex(r"\d{4}(0[1-9]|1[0-2])([0-2]\d|3[01])"), "DT": _range_regex( r"\d{4}((0[1-9]|1[0-2])(([0-2]\d|3[01])(([01]\d|2[0-3])" r"([0-5]\d((60|[0-5]\d)(\.\d{1,6} ?)?)?)?)?)?)?([+-][01]\d\d\d)?" ), "TM": _range_regex(r"([01]\d|2[0-3])([0-5]\d((60|[0-5]\d)(\.\d{1,6} ?)?)?)?"), "UI": r"^(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*$", "UR": r"^[A-Za-z_\d:/?#\[\]@!$&'()*+,;=%\-.~]* *$", } STR_VR_REGEXES = {vr: re.compile(regex) for (vr, regex) in VR_REGEXES.items()} BYTE_VR_REGEXES = {vr: re.compile(regex.encode()) for (vr, regex) in VR_REGEXES.items()} def validate_type( vr: str, value: Any, types: type | tuple[type, type] ) -> tuple[bool, str]: """Checks for valid types for a given VR. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. types: Type or Tuple[Type] The type or tuple of types supported for the given VR. Returns ------- A tuple of a boolean validation result and the error message. """ if value is not None and not isinstance(value, types): return False, ( f"A value of type '{type(value).__name__}' cannot be " f"assigned to a tag with VR {vr}." ) return True, "" def validate_vr_length(vr: str, value: Any) -> tuple[bool, str]: """Validate the value length for a given VR. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ max_length = MAX_VALUE_LEN.get(vr, 0) if max_length > 0: value_length = len(value) if value_length > max_length: return False, ( f"The value length ({value_length}) exceeds the " f"maximum length of {max_length} allowed for VR {vr}." ) return True, "" def validate_type_and_length(vr: str, value: Any) -> tuple[bool, str]: """Validate the correct type and the value length for a given VR. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ valid, msg = validate_type(vr, value, (str, bytes)) if not valid: return valid, msg return validate_vr_length(vr, value) def validate_regex(vr: str, value: Any) -> tuple[bool, str]: """Validate the value for a given VR for allowed characters using a regular expression. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ if value: regex: Any newline: str | int if isinstance(value, str): regex = STR_VR_REGEXES[vr] newline = "\n" else: regex = BYTE_VR_REGEXES[vr] newline = 10 # newline character if not re.match(regex, value) or value and value[-1] == newline: return False, f"Invalid value for VR {vr}: {value!r}." return True, "" def validate_type_and_regex(vr: str, value: Any) -> tuple[bool, str]: """Validate that the value is of type :class:`str` or :class:`bytes` and that the value matches the VR-specific regular expression. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ valid, msg = validate_type(vr, value, (str, bytes)) if not valid: return valid, msg return validate_regex(vr, value) def validate_date_time(vr: str, value: Any, date_time_type: type) -> tuple[bool, str]: """Checks for valid values for date/time related VRs. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. date_time_type: type The specific type supported for the given VR (additional to str/bytes). Returns ------- A tuple of a boolean validation result and the error message. """ if value and isinstance(value, date_time_type): return True, "" return validate_type_and_regex(vr, value) def validate_length_and_type_and_regex(vr: str, value: Any) -> tuple[bool, str]: """Validate the value for a given VR for maximum length, for the correct value type, and for allowed characters using a regular expression. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ valid, msg = validate_type(vr, value, (str, bytes)) if not valid: return valid, msg is_valid_len, msg1 = validate_vr_length(vr, value) is_valid_expr, msg2 = validate_regex(vr, value) msg = " ".join([msg1, msg2]).strip() if msg: msg += ( " Please see for allowed values for each VR." ) return is_valid_len and is_valid_expr, msg def validate_pn_component_length(vr: str, value: Any) -> tuple[bool, str]: """Validate the PN component value for the maximum length. Parameters ---------- vr : str Ignored. value : str The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ if len(value) > 64: return False, ( f"The PN component length ({len(value)}) exceeds the " f"maximum allowed length of 64." ) return True, "" def validate_pn(vr: str, value: Any) -> tuple[bool, str]: """Validate the value for VR PN for the maximum number of components and for the maximum length of each component. Parameters ---------- vr : str Ignored. value : str The value to validate. Returns ------- A tuple of a boolean validation result and the error message. """ if not value or isinstance(value, PersonName): return True, "" valid, msg = validate_type(vr, value, (str, bytes)) if not valid: return valid, msg components: Sequence[str | bytes] if isinstance(value, bytes): components = value.split(b"=") else: components = value.split("=") if len(components) > 3: return False, ( f"The number of PN components length ({len(components)}) exceeds " f"the maximum allowed number of 3." ) for comp in components: valid, msg = validate_pn_component_length("PN", comp) if not valid: return False, msg return True, "" def validate_pn_component(value: str | bytes) -> None: """Validate the value of a single component of VR PN for maximum length. Parameters ---------- value : str or bytes The component value to validate. Raises ------ ValueError If the validation fails and the validation mode is set to `RAISE`. """ validate_value( "PN", value, config.settings.writing_validation_mode, validate_pn_component_length, ) VALUE_LENGTH = {"US": 2, "SS": 2, "UL": 4, "SL": 4, "UV": 8, "SV": 8, "FL": 4, "FD": 8} def validate_number( vr: str, value: Any, min_value: int, max_value: int ) -> tuple[bool, str]: """Validate the value for a numerical VR for type and allowed range. Parameters ---------- vr : str The value representation to validate against. value : Any The value to validate. min_value : int The minimum allowed value. max_value : int The maximum allowed value. Returns ------- A tuple of a boolean validation result and the error message. """ valid, msg = validate_type(vr, value, (int, bytes)) if not valid: return valid, msg if isinstance(value, int): if value < min_value or value > max_value: return False, ( f"Invalid value: a value for a tag with VR {vr} must be " f"between {min_value} and {max_value}." ) elif len(value) % VALUE_LENGTH[vr]: return False, ( f"Invalid value length {len(value)}: the value length for a tag " f"with VR {vr} must be a multiple of {VALUE_LENGTH[vr]}." ) return True, "" VALIDATORS = { "AE": validate_length_and_type_and_regex, "AS": validate_type_and_regex, "CS": validate_length_and_type_and_regex, "DA": lambda vr, value: validate_date_time(vr, value, datetime.date), "DS": validate_length_and_type_and_regex, "DT": lambda vr, value: validate_date_time(vr, value, datetime.datetime), "FD": lambda vr, value: validate_type(vr, value, (float, int)), "FL": lambda vr, value: validate_type(vr, value, (float, int)), "IS": validate_length_and_type_and_regex, "LO": validate_type_and_length, "LT": validate_type_and_length, "OB": lambda vr, value: validate_type(vr, value, (bytes, bytearray)), "OD": lambda vr, value: validate_type(vr, value, (bytes, bytearray)), "OF": lambda vr, value: validate_type(vr, value, (bytes, bytearray)), "OL": lambda vr, value: validate_type(vr, value, (bytes, bytearray)), "OW": lambda vr, value: validate_type(vr, value, (bytes, bytearray)), "OV": lambda vr, value: validate_type(vr, value, (bytes, bytearray)), "PN": validate_pn, "SH": validate_type_and_length, "SL": lambda vr, value: validate_number(vr, value, -0x80000000, 0x7FFFFFFF), "SS": lambda vr, value: validate_number(vr, value, -0x8000, 0x7FFF), "ST": validate_type_and_length, "SV": lambda vr, value: validate_number( vr, value, -0x8000000000000000, 0x7FFFFFFFFFFFFFFF ), "TM": lambda vr, value: validate_date_time(vr, value, datetime.time), "UI": validate_length_and_type_and_regex, "UL": lambda vr, value: validate_number(vr, value, 0, 0xFFFFFFFF), "US": lambda vr, value: validate_number(vr, value, 0, 0xFFFF), "UR": validate_type_and_regex, "UV": lambda vr, value: validate_number(vr, value, 0, 0xFFFFFFFFFFFFFFFF), } def validate_value( vr: str, value: Any, validation_mode: int, validator: Callable[[str, Any], tuple[bool, str]] | None = None, ) -> None: """Validate the given value against the DICOM standard. Parameters ---------- vr : str The VR of the tag the value is added to. value : Any The value to be validated. validation_mode : int Defines if values are validated and how validation errors are handled. validator : Callable or None Function that does the actual validation. If not given, the validator is taken from the VR-specific validator table instead. Raises ------ ValueError If the validation fails and the validation mode is set to `RAISE`. """ if validation_mode == config.IGNORE: return if value is not None: validator = validator or VALIDATORS.get(vr) if validator is not None: is_valid, msg = validator(vr, value) if not is_valid: if validation_mode == config.RAISE: raise ValueError(msg) warn_and_log(msg) @unique class VR(str, Enum): """DICOM Data Element's Value Representation (VR)""" # Standard VRs from Table 6.2-1 in Part 5 AE = "AE" AS = "AS" AT = "AT" CS = "CS" DA = "DA" DS = "DS" DT = "DT" FD = "FD" FL = "FL" IS = "IS" LO = "LO" LT = "LT" OB = "OB" OD = "OD" OF = "OF" OL = "OL" OW = "OW" OV = "OV" PN = "PN" SH = "SH" SL = "SL" SQ = "SQ" SS = "SS" ST = "ST" SV = "SV" TM = "TM" UC = "UC" UI = "UI" UL = "UL" UN = "UN" UR = "UR" US = "US" UT = "UT" UV = "UV" # Ambiguous VRs from Tables 6-1, 7-1 and 8-1 in Part 6 US_SS_OW = "US or SS or OW" US_SS = "US or SS" US_OW = "US or OW" OB_OW = "OB or OW" def __str__(self) -> str: return str.__str__(self) # Standard VRs from Table 6.2-1 in Part 5 STANDARD_VR = { VR.AE, VR.AS, VR.AT, VR.CS, VR.DA, VR.DS, VR.DT, VR.FD, VR.FL, VR.IS, VR.LO, VR.LT, VR.OB, VR.OD, VR.OF, VR.OL, VR.OW, VR.OV, VR.PN, VR.SH, VR.SL, VR.SQ, VR.SS, VR.ST, VR.SV, VR.TM, VR.UC, VR.UI, VR.UL, VR.UN, VR.UR, VR.US, VR.UT, VR.UV, } # Ambiguous VRs from Tables 6-1, 7-1 and 8-1 in Part 6 AMBIGUOUS_VR = {VR.US_SS_OW, VR.US_SS, VR.US_OW, VR.OB_OW} # Character Repertoire for VRs # Allowed character repertoire for str-like VRs, based off of the information # in Section 6.1.2 and Table 6.2-1 in Part 5 # Basic G0 set of ISO 646 (ISO-IR 6) only DEFAULT_CHARSET_VR = { VR.AE, VR.AS, VR.CS, VR.DA, VR.DS, VR.DT, VR.IS, VR.TM, VR.UI, VR.UR, } # Basic G0 set of ISO 646 or extensible/replaceable by # (0008,0005) *Specific Character Set* CUSTOMIZABLE_CHARSET_VR = {VR.LO, VR.LT, VR.PN, VR.SH, VR.ST, VR.UC, VR.UT} # Corresponding Python built-in for each VR # For some VRs this is more a "fallback" class-like behavioural definition # than actual, and note that some VRs such as IS and DS are present in # multiple sets BYTES_VR = {VR.OB, VR.OD, VR.OF, VR.OL, VR.OV, VR.OW, VR.UN} FLOAT_VR = {VR.DS, VR.FD, VR.FL} INT_VR = {VR.AT, VR.IS, VR.SL, VR.SS, VR.SV, VR.UL, VR.US, VR.UV} LIST_VR = {VR.SQ} STR_VR = DEFAULT_CHARSET_VR | CUSTOMIZABLE_CHARSET_VR # These VRs may have backslash characters or encoded backslashes in the # value based off of the information in Table 6.2-1 in Part 5 # DataElements with ambiguous VRs may use `bytes` values and so are allowed # to have backslashes (except 'US or SS') ALLOW_BACKSLASH = {VR.LT, VR.ST, VR.UT, VR.US_SS_OW, VR.US_OW, VR.OB_OW} | BYTES_VR # VRs which may have a value more than 1024 bytes or characters long # Used to flag which values may need shortening during printing LONG_VALUE_VR = {VR.LT, VR.UC, VR.UT} | BYTES_VR | AMBIGUOUS_VR # VRs that use 2 byte length fields for Explicit VR from Table 7.1-2 in Part 5 # All other explicit VRs and all implicit VRs use 4 byte length fields EXPLICIT_VR_LENGTH_16 = { VR.AE, VR.AS, VR.AT, VR.CS, VR.DA, VR.DS, VR.DT, VR.FL, VR.FD, VR.IS, VR.LO, VR.LT, VR.PN, VR.SH, VR.SL, VR.SS, VR.ST, VR.TM, VR.UI, VR.UL, VR.US, } EXPLICIT_VR_LENGTH_32 = STANDARD_VR - EXPLICIT_VR_LENGTH_16 # VRs that are allowed to be buffers BUFFERABLE_VRS = (BYTES_VR | {VR.OB_OW}) - {VR.UN} class _DateTimeBase: """Base class for DT, DA and TM element sub-classes.""" original_string: str # Add pickling support for the mutable additions def __getstate__(self) -> dict[str, Any]: return self.__dict__.copy() def __setstate__(self, state: dict[str, Any]) -> None: self.__dict__.update(state) def __reduce_ex__(self, protocol: int) -> tuple[Any, ...]: # type: ignore[override] # Python 3.8 - protocol: SupportsIndex (added in 3.8) # datetime.time, and datetime.datetime return Tuple[Any, ...] # datetime.date doesn't define __reduce_ex__ reduce_ex = cast(tuple[Any, ...], super().__reduce_ex__(protocol)) return reduce_ex + (self.__getstate__(),) def __str__(self) -> str: if hasattr(self, "original_string"): return self.original_string return super().__str__() def __repr__(self) -> str: return f'"{self}"' class DA(_DateTimeBase, datetime.date): """Store value for an element with VR **DA** as :class:`datetime.date`. Note that the :class:`datetime.date` base class is immutable. """ def __new__( # type: ignore[misc] cls: type["DA"], *args: Any, **kwargs: Any ) -> Optional["DA"]: """Create an instance of DA object. Raise an exception if the string cannot be parsed or the argument is otherwise incompatible. The arguments (``*args`` and ``**kwargs``) are either the ones inherited from :class:`datetime.date`, or the first argument is a string conformant to the DA definition in the DICOM Standard, Part 5, :dcm:`Table 6.2-1`, or it is a :class:`datetime.date` object, or an object of type :class:`~pydicom.valuerep.DA`. """ if not args or args[0] is None: return None val = args[0] if isinstance(val, str): if val.strip() == "": return None # empty date if len(val) == 8: year = int(val[0:4]) month = int(val[4:6]) day = int(val[6:8]) return super().__new__(cls, year, month, day) if len(val) == 10 and val[4] == "." and val[7] == ".": # ACR-NEMA Standard 300, predecessor to DICOM # for compatibility with a few old pydicom example files year = int(val[0:4]) month = int(val[5:7]) day = int(val[8:10]) return super().__new__(cls, year, month, day) if isinstance(val, datetime.date): return super().__new__(cls, val.year, val.month, val.day) try: return super().__new__(cls, *args, **kwargs) except Exception as exc: raise ValueError(f"Unable to convert '{val}' to 'DA' object") from exc def __init__(self, *args: Any, **kwargs: Any) -> None: """Create a new **DA** element value.""" val = args[0] if isinstance(val, str): self.original_string = val elif isinstance(val, DA) and hasattr(val, "original_string"): self.original_string = val.original_string elif isinstance(val, datetime.date): self.original_string = f"{val.year}{val.month:02}{val.day:02}" class DT(_DateTimeBase, datetime.datetime): """Store value for an element with VR **DT** as :class:`datetime.datetime`. Note that the :class:`datetime.datetime` base class is immutable. """ _regex_dt = re.compile(r"((\d{4,14})(\.(\d{1,6}))?)([+-]\d{4})?") @staticmethod def _utc_offset(value: str) -> datetime.timezone: """Return the UTC Offset suffix as a :class:`datetime.timezone`. Parameters ---------- value : str The value of the UTC offset suffix, such as ``'-1000'`` or ``'+0245'``. Returns ------- datetime.timezone """ # Format is &ZZXX, & = '+' or '-', ZZ is hours, XX is minutes hour = int(value[1:3]) * 60 # Convert hours to minutes minute = int(value[3:5]) # In minutes offset = (hour + minute) * 60 # Convert minutes to seconds offset = -offset if value[0] == "-" else offset return datetime.timezone(datetime.timedelta(seconds=offset), name=value) def __new__( # type: ignore[misc] cls: type["DT"], *args: Any, **kwargs: Any ) -> Optional["DT"]: """Create an instance of DT object. Raise an exception if the string cannot be parsed or the argument is otherwise incompatible. The arguments (``*args`` and ``**kwargs``) are either the ones inherited from :class:`datetime.datetime`, or the first argument is a string conformant to the DT definition in the DICOM Standard, Part 5, :dcm:`Table 6.2-1`, or it is a :class:`datetime.datetime` object, or an object of type :class:`~pydicom.valuerep.DT`. """ if not args or args[0] is None: return None val = args[0] if isinstance(val, str): if val.strip() == "": return None match = cls._regex_dt.match(val) if not match or len(val) > 26: raise ValueError( f"Unable to convert non-conformant value '{val}' to 'DT' object" ) dt_match = match.group(2) args = ( int(dt_match[0:4]), # year 1 if len(dt_match) < 6 else int(dt_match[4:6]), # month 1 if len(dt_match) < 8 else int(dt_match[6:8]), # day ) kwargs = { "hour": 0 if len(dt_match) < 10 else int(dt_match[8:10]), "minute": 0 if len(dt_match) < 12 else int(dt_match[10:12]), "second": 0 if len(dt_match) < 14 else int(dt_match[12:14]), "microsecond": 0, } if len(dt_match) >= 14 and match.group(4): kwargs["microsecond"] = int(match.group(4).rstrip().ljust(6, "0")) # Timezone offset tz_match = match.group(5) kwargs["tzinfo"] = cls._utc_offset(tz_match) if tz_match else None # DT may include a leap second which isn't allowed by datetime if kwargs["second"] == 60: warn_and_log( "'datetime.datetime' doesn't allow a value of '60' for " "the seconds component, changing to '59'" ) kwargs["second"] = 59 return super().__new__(cls, *args, **kwargs) if isinstance(val, datetime.datetime): return super().__new__( cls, *val.timetuple()[:6], val.microsecond, val.tzinfo ) try: return super().__new__(cls, *args, **kwargs) except Exception as exc: raise ValueError(f"Unable to convert '{val}' to 'DT' object") from exc def __init__(self, *args: Any, **kwargs: Any) -> None: """Create a new **DT** element value.""" val = args[0] if isinstance(val, str): self.original_string = val elif isinstance(val, DT) and hasattr(val, "original_string"): self.original_string = val.original_string elif isinstance(val, datetime.datetime): self.original_string = ( f"{val.year:04}{val.month:02}{val.day:02}" f"{val.hour:02}{val.minute:02}{val.second:02}" ) # milliseconds are seldom used, add them only if needed if val.microsecond > 0: self.original_string += f".{val.microsecond:06}" if val.tzinfo is not None: # offset: Optional[datetime.timedelta] offset = val.tzinfo.utcoffset(val) if offset is not None: offset_min = offset.days * 24 * 60 + offset.seconds // 60 sign = "+" if offset_min >= 0 else "-" offset_min = abs(offset_min) self.original_string += ( f"{sign}{offset_min // 60:02}{offset_min % 60:02}" ) class TM(_DateTimeBase, datetime.time): """Store value for an element with VR **TM** as :class:`datetime.time`. Note that the :class:`datetime.time` base class is immutable. """ _RE_TIME = re.compile( r"(?P^([01][0-9]|2[0-3]))" r"((?P([0-5][0-9]))" r"((?P([0-5][0-9]|60))" r"(\.(?P([0-9]{1,6})?))?)?)?$" ) def __new__( # type: ignore[misc] cls: type["TM"], *args: Any, **kwargs: Any ) -> Optional["TM"]: """Create an instance of TM object from a string. Raise an exception if the string cannot be parsed or the argument is otherwise incompatible. The arguments (``*args`` and ``**kwargs``) are either the ones inherited from :class:`datetime.time`, or the first argument is a string conformant to the TM definition in the DICOM Standard, Part 5, :dcm:`Table 6.2-1`, or it is a :class:`datetime.time` object, or an object of type :class:`~pydicom.valuerep.TM`. """ if not args or args[0] is None: return None val = args[0] if isinstance(val, str): if val.strip() == "": return None # empty time match = cls._RE_TIME.match(val) if not match: raise ValueError( f"Unable to convert non-conformant value '{val}' to 'TM' object" ) hour = int(match.group("h")) minute = 0 if match.group("m") is None else int(match.group("m")) second = 0 if match.group("s") is None else int(match.group("s")) if second == 60: warn_and_log( "'datetime.time' doesn't allow a value of '60' for the " "seconds component, changing to '59'" ) second = 59 microsecond = 0 if match.group("ms"): microsecond = int(match.group("ms").rstrip().ljust(6, "0")) return super().__new__(cls, hour, minute, second, microsecond) if isinstance(val, datetime.time): return super().__new__( cls, val.hour, val.minute, val.second, val.microsecond ) try: return super().__new__(cls, *args, **kwargs) except Exception as exc: raise ValueError(f"Unable to convert '{val}' to 'TM' object") from exc def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__() val = args[0] if isinstance(val, str): self.original_string = val elif isinstance(val, TM) and hasattr(val, "original_string"): self.original_string = val.original_string elif isinstance(val, datetime.time): self.original_string = f"{val.hour:02}{val.minute:02}{val.second:02}" # milliseconds are seldom used, add them only if needed if val.microsecond > 0: self.original_string += f".{val.microsecond:06}" def is_valid_ds(s: str) -> bool: """Check whether this string is a valid decimal string. Valid decimal strings must be 16 characters or fewer, and contain only characters from a limited set. Parameters ---------- s: str String to test. Returns ------- bool True if the string is a valid decimal string. Otherwise False. """ return validate_length_and_type_and_regex("DS", s)[0] def format_number_as_ds(val: float | Decimal) -> str: """Truncate a float's representation to give a valid Decimal String (DS). DICOM's decimal string (DS) representation is limited to strings with 16 characters and a limited set of characters. This function represents a float that satisfies these constraints while retaining as much precision as possible. Some floats are represented using scientific notation to make more efficient use of the limited number of characters. Note that this will incur a loss of precision if the number cannot be represented with 16 characters. Furthermore, non-finite floats (infs and nans) cannot be represented as decimal strings and will cause an error to be raised. Parameters ---------- val: float | Decimal The floating point value whose representation is required. Returns ------- str String representation of the float satisfying the constraints of the decimal string representation. Raises ------ ValueError If val does not represent a finite value """ if not isinstance(val, float | Decimal): raise TypeError("'val' must be of type float or decimal.Decimal") if not isfinite(val): raise ValueError( f"Cannot encode non-finite floats as DICOM decimal strings. Got '{val}'" ) valstr = str(val) # In the simple case, the default python string representation # will do if len(valstr) <= 16: return valstr # Decide whether to use scientific notation logval = log10(cast(float | Decimal, abs(val))) # Characters needed for '-' at start sign_chars = 1 if val < 0.0 else 0 # Numbers larger than 1e14 cannot be correctly represented by truncating # their string representations to 16 chars, e.g pi * 10^13 would become # '314159265358979.', which may not be universally understood. This limit # is 1e13 for negative numbers because of the minus sign. # For negative exponents, the point of equal precision between scientific # and standard notation is 1e-4 e.g. '0.00031415926535' and # '3.1415926535e-04' are both 16 chars use_scientific = logval < -4 or logval >= (14 - sign_chars) if use_scientific: # In principle, we could have a number where the exponent # needs three digits to be represented (bigger than this cannot be # represented by floats). Due to floating point limitations # this is best checked for by doing the string conversion remaining_chars = 10 - sign_chars trunc_str = f"{val:.{remaining_chars}e}" if len(trunc_str) > 16: trunc_str = f"{val:.{remaining_chars - 1}e}" return trunc_str else: if logval >= 1.0: # chars remaining for digits after sign, digits left of '.' and '.' remaining_chars = 14 - sign_chars - int(floor(logval)) else: remaining_chars = 14 - sign_chars return f"{val:.{remaining_chars}f}" class DSfloat(float): """Store value for an element with VR **DS** as :class:`float`. If constructed from an empty string, return the empty string, not an instance of this class. Parameters ---------- val: str | int | float | Decimal Value to store as a DS. auto_format: bool If True, automatically format the string representation of this number to ensure it satisfies the constraints in the DICOM standard. Note that this will lead to loss of precision for some numbers. """ auto_format: bool def __new__( # type: ignore[misc] cls: type["DSfloat"], val: None | str | int | float | Decimal, auto_format: bool = False, validation_mode: int | None = None, ) -> "str | DSfloat | None": if val is None: return val if isinstance(val, str) and val.strip() == "": return val return super().__new__(cls, val) def __init__( self, val: str | int | float | Decimal, auto_format: bool = False, validation_mode: int | None = None, ) -> None: """Store the original string if one given, for exact write-out of same value later. """ if validation_mode is None: validation_mode = config.settings.reading_validation_mode self.original_string: str # ... also if user changes a data element value, then will get # a different object, because float is immutable. has_attribute = hasattr(val, "original_string") pre_checked = False if isinstance(val, str): self.original_string = val.strip() elif isinstance(val, DSfloat | DSdecimal): if val.auto_format: auto_format = True # override input parameter pre_checked = True if has_attribute: self.original_string = val.original_string self.auto_format = auto_format if self.auto_format and not pre_checked: # If auto_format is True, keep the float value the same, but change # the string representation stored in original_string if necessary if hasattr(self, "original_string"): if not is_valid_ds(self.original_string): self.original_string = format_number_as_ds( float(self.original_string) ) else: self.original_string = format_number_as_ds(self) if validation_mode == config.RAISE and not self.auto_format: if len(str(self)) > 16: raise OverflowError( "Values for elements with a VR of 'DS' must be <= 16 " "characters long, but the float provided requires > 16 " "characters to be accurately represented. Use a smaller " "string, set 'config.settings.reading_validation_mode' to " "'WARN' to override the length check, or " "explicitly construct a DS object with 'auto_format' " "set to True" ) if not is_valid_ds(str(self)): # This will catch nan and inf raise ValueError( f'Value "{self}" is not valid for elements with a VR of DS' ) def __eq__(self, other: Any) -> Any: """Override to allow string equality comparisons.""" if isinstance(other, str): return str(self) == other return super().__eq__(other) def __hash__(self) -> int: return super().__hash__() def __ne__(self, other: Any) -> Any: return not self == other def __str__(self) -> str: if hasattr(self, "original_string") and not self.auto_format: return self.original_string # Issue #937 (Python 3.8 compatibility) return repr(self)[1:-1] def __repr__(self) -> str: if hasattr(self, "original_string"): return f"'{self.original_string}'" return f"'{super().__repr__()}'" class DSdecimal(Decimal): """Store value for an element with VR **DS** as :class:`decimal.Decimal`. Parameters ---------- val: str | int | float | Decimal Value to store as a DS. auto_format: bool If True, automatically format the string representation of this number to ensure it satisfies the constraints in the DICOM standard. Note that this will lead to loss of precision for some numbers. Notes ----- If constructed from an empty string, returns the empty string, not an instance of this class. """ auto_format: bool def __new__( # type: ignore[misc] cls: type["DSdecimal"], val: None | str | int | float | Decimal, auto_format: bool = False, validation_mode: int | None = None, ) -> "str | DSdecimal | None": """Create an instance of DS object, or return a blank string if one is passed in, e.g. from a type 2 DICOM blank value. Parameters ---------- val : str or numeric A string or a number type which can be converted to a decimal. """ if val is None: return val if isinstance(val, str) and val.strip() == "": return val if isinstance(val, float) and not config.allow_DS_float: raise TypeError( "'DS' cannot be instantiated with a float value unless " "'config.allow_DS_float' is set to True. You should convert " "the value to a string with the desired number of digits, " "or use 'Decimal.quantize()' and pass a 'Decimal' instance." ) return super().__new__(cls, val) def __init__( self, val: str | int | float | Decimal, auto_format: bool = False, validation_mode: int | None = None, ) -> None: """Store the original string if one given, for exact write-out of same value later. E.g. if set ``'1.23e2'``, :class:`~decimal.Decimal` would write ``'123'``, but :class:`DS` will use the original. """ if validation_mode is None: validation_mode = config.settings.reading_validation_mode self.original_string: str # ... also if user changes a data element value, then will get # a different Decimal, as Decimal is immutable. pre_checked = False if isinstance(val, str): self.original_string = val.strip() elif isinstance(val, DSfloat | DSdecimal): if val.auto_format: auto_format = True # override input parameter pre_checked = True if hasattr(val, "original_string"): self.original_string = val.original_string self.auto_format = auto_format if self.auto_format and not pre_checked: # If auto_format is True, keep the float value the same, but change # the string representation stored in original_string if necessary if hasattr(self, "original_string"): if not is_valid_ds(self.original_string): self.original_string = format_number_as_ds( float(self.original_string) ) else: self.original_string = format_number_as_ds(self) if validation_mode != config.IGNORE: if len(repr(self).strip("'")) > 16: msg = ( "Values for elements with a VR of 'DS' values must be " "<= 16 characters long. Use a smaller string, set " "'config.settings.reading_validation_mode' to " "'WARN' to override the length check, use " "'Decimal.quantize()' and initialize " "with a 'Decimal' instance, or explicitly construct a DS " "instance with 'auto_format' set to True" ) if validation_mode == config.RAISE: raise OverflowError(msg) warn_and_log(msg) elif not is_valid_ds(repr(self).strip("'")): # This will catch nan and inf msg = f'Value "{self}" is not valid for elements with a VR of DS' if validation_mode == config.RAISE: raise ValueError(msg) warn_and_log(msg) def __eq__(self, other: Any) -> Any: """Override to allow string equality comparisons.""" if isinstance(other, str): return str(self) == other return super().__eq__(other) def __hash__(self) -> int: return super().__hash__() def __ne__(self, other: Any) -> Any: return not self == other def __str__(self) -> str: has_str = hasattr(self, "original_string") if has_str and len(self.original_string) <= 16: return self.original_string return super().__str__() def __repr__(self) -> str: if hasattr(self, "original_string"): return f"'{self.original_string}'" return f"'{self}'" # CHOOSE TYPE OF DS DSclass: Any if config.use_DS_decimal: DSclass = DSdecimal else: DSclass = DSfloat def DS( val: None | str | int | float | Decimal, auto_format: bool = False, validation_mode: int | None = None, ) -> None | str | DSfloat | DSdecimal: """Factory function for creating DS class instances. Checks for blank string; if so, returns that, else calls :class:`DSfloat` or :class:`DSdecimal` to create the class instance. This avoids overriding ``DSfloat.__new__()`` (which carries a time penalty for large arrays of DS). Similarly the string clean and check can be avoided and :class:`DSfloat` called directly if a string has already been processed. """ if val is None: return val if validation_mode is None: validation_mode = config.settings.reading_validation_mode if isinstance(val, str): if val.strip() == "": return val validate_value("DS", val, validation_mode) if config.use_DS_decimal: return DSdecimal(val, auto_format, validation_mode) return DSfloat(val, auto_format, validation_mode) class ISfloat(float): """Store value for an element with VR **IS** as :class:`float`. Stores original integer string for exact rewriting of the string originally read or stored. Note: By the DICOM standard, IS can only be an :class:`int`, however, it is not uncommon to see float IS values. This class is used if the config settings allow non-strict reading. Generally, use :class:`~pydicom.valuerep.IS` to create IS values, this is returned instead if the value cannot be represented as an :class:`int`. See :class:`~pydicom.valuerep.IS` for details of the parameters and return values. """ def __new__( # type: ignore[misc] cls: type["ISfloat"], val: str | float | Decimal, validation_mode: int | None = None, ) -> float | str: if isinstance(val, str) and val.strip() == "": return "" return super().__new__(cls, val) def __init__( self, val: str | float | Decimal, validation_mode: int | None = None ) -> None: # If a string passed, then store it if isinstance(val, str): self.original_string = val.strip() elif isinstance(val, IS | ISfloat) and hasattr(val, "original_string"): self.original_string = val.original_string if validation_mode: msg = f'Value "{self}" is not valid for elements with a VR of IS' if validation_mode == config.WARN: warn_and_log(msg) elif validation_mode == config.RAISE: msg += "\nSet reading_validation_mode to WARN or IGNORE to bypass" raise TypeError(msg) class IS(int): """Store value for an element with VR **IS** as :class:`int`. Stores original integer string for exact rewriting of the string originally read or stored. """ def __new__( # type: ignore[misc] cls: type["IS"], val: None | str | int | float | Decimal, validation_mode: int | None = None, ) -> "str | IS | ISfloat | None": """Create instance if new integer string""" if val is None: return val if validation_mode is None: validation_mode = config.settings.reading_validation_mode if isinstance(val, str): if val.strip() == "": return val validate_value("IS", val, validation_mode) try: newval: IS | ISfloat = super().__new__(cls, val) except ValueError: # accept float strings when no integer loss, e.g. "1.0" newval = super().__new__(cls, float(val)) # If a float or Decimal was passed in, check for non-integer, # i.e. could lose info if converted to int # If so, create an ISfloat instead (if allowed by settings) if isinstance(val, float | Decimal | str) and newval != float(val): newval = ISfloat(val, validation_mode) # Checks in case underlying int is >32 bits, DICOM does not allow this if not -(2**31) <= newval < 2**31 and validation_mode == config.RAISE: raise OverflowError( "Elements with a VR of IS must have a value between -2**31 " "and (2**31 - 1). Set " "'config.settings.reading_validation_mode' to " "'WARN' to override the value check" ) return newval def __init__( self, val: str | int | float | Decimal, validation_mode: int | None = None ) -> None: # If a string passed, then store it if isinstance(val, str): self.original_string = val.strip() elif isinstance(val, IS) and hasattr(val, "original_string"): self.original_string = val.original_string def __eq__(self, other: Any) -> Any: """Override to allow string equality comparisons.""" if isinstance(other, str): return str(self) == other return super().__eq__(other) def __hash__(self) -> int: return super().__hash__() def __ne__(self, other: Any) -> Any: return not self == other def __str__(self) -> str: if hasattr(self, "original_string"): return self.original_string # Issue #937 (Python 3.8 compatibility) return repr(self)[1:-1] def __repr__(self) -> str: return f"'{super().__repr__()}'" def _verify_encodings(encodings: str | Sequence[str] | None) -> tuple[str, ...] | None: """Checks the encoding to ensure proper format""" if encodings is None: return None if isinstance(encodings, str): return (encodings,) return tuple(encodings) def _decode_personname( components: Sequence[bytes], encodings: Sequence[str] ) -> tuple[str, ...]: """Return a list of decoded person name components. Parameters ---------- components : list of bytes The list of the up to three encoded person name components encodings : list of str The Python encodings uses to decode `components`. Returns ------- text type The unicode string representing the person name. If the decoding of some component parts is not possible using the given encodings, they are decoded with the first encoding using replacement characters for bytes that cannot be decoded. """ from pydicom.charset import decode_bytes comps = [decode_bytes(c, encodings, PN_DELIMS) for c in components] # Remove empty elements from the end to avoid trailing '=' while len(comps) and not comps[-1]: comps.pop() return tuple(comps) def _encode_personname(components: Sequence[str], encodings: Sequence[str]) -> bytes: """Encode a list of text string person name components. Parameters ---------- components : list of str The list of the up to three unicode person name components encodings : list of str The Python encodings uses to encode `components`. Returns ------- byte string The byte string that can be written as a PN DICOM tag value. If the encoding of some component parts is not possible using the given encodings, they are encoded with the first encoding using replacement bytes for characters that cannot be encoded. """ from pydicom.charset import encode_string encoded_comps = [] for comp in components: groups = [encode_string(group, encodings) for group in comp.split("^")] encoded_comp = b"^".join(groups) encoded_comps.append(encoded_comp) # Remove empty elements from the end while len(encoded_comps) and not encoded_comps[-1]: encoded_comps.pop() return b"=".join(encoded_comps) class PersonName: """Representation of the value for an element with VR **PN**.""" def __new__( # type: ignore[misc] cls: type["PersonName"], *args: Any, **kwargs: Any ) -> Optional["PersonName"]: if len(args) and args[0] is None: return None return super().__new__(cls) def __init__( self, val: "bytes | str | PersonName", encodings: Sequence[str] | None = None, original_string: bytes | None = None, validation_mode: int | None = None, ) -> None: """Create a new ``PersonName``. Parameters ---------- val: str, bytes, PersonName The value to use for the **PN** element. encodings: list of str, optional A list of the encodings used for the value. original_string: bytes, optional When creating a ``PersonName`` using a decoded string, this is the original encoded value. Notes ----- A :class:`PersonName` may also be constructed by specifying individual components using the :meth:`from_named_components` and :meth:`from_named_components_veterinary` class methods. """ self.original_string: bytes self._components: tuple[str, ...] | None = None self.encodings: tuple[str, ...] | None if validation_mode is None: validation_mode = config.settings.reading_validation_mode self.validation_mode = validation_mode if isinstance(val, PersonName): encodings = val.encodings self.original_string = val.original_string self._components = tuple(str(val).split("=")) elif isinstance(val, bytes): # this is the raw byte string - decode it on demand self.original_string = val validate_value("PN", val, validation_mode) self._components = None else: # val: str # `val` is the decoded person name value # `original_string` should be the original encoded value self.original_string = cast(bytes, original_string) # if we don't have the byte string at this point, we at least # validate the length of the string components validate_value( "PN", original_string if original_string else val, validation_mode ) components = val.split("=") # Remove empty elements from the end to avoid trailing '=' while len(components) and not components[-1]: components.pop() self._components = tuple(components) # if the encoding is not given, leave it as undefined (None) self.encodings = _verify_encodings(encodings) def _create_dict(self) -> dict[str, str]: """Creates a dictionary of person name group and component names. Used exclusively for `formatted` for backwards compatibility. """ parts = [ "family_name", "given_name", "middle_name", "name_prefix", "name_suffix", "ideographic", "phonetic", ] return {c: getattr(self, c, "") for c in parts} @property def components(self) -> tuple[str, ...]: """Returns up to three decoded person name components as a :class:`tuple` of :class:`str`. Returns ------- Tuple[str, ...] The (alphabetic, ideographic, phonetic) components of the decoded person name. Any of the components may be absent. """ if self._components is None: groups = self.original_string.split(b"=") encodings = self.encodings or [default_encoding] self._components = _decode_personname(groups, encodings) return self._components def _name_part(self, i: int) -> str: """Return the `i`th part of the name.""" try: return self.components[0].split("^")[i] except IndexError: return "" @property def family_name(self) -> str: """Return the first (family name) group of the alphabetic person name representation as a unicode string """ return self._name_part(0) @property def given_name(self) -> str: """Return the second (given name) group of the alphabetic person name representation as a unicode string """ return self._name_part(1) @property def middle_name(self) -> str: """Return the third (middle name) group of the alphabetic person name representation as a unicode string """ return self._name_part(2) @property def name_prefix(self) -> str: """Return the fourth (name prefix) group of the alphabetic person name representation as a unicode string """ return self._name_part(3) @property def name_suffix(self) -> str: """Return the fifth (name suffix) group of the alphabetic person name representation as a unicode string """ return self._name_part(4) @property def alphabetic(self) -> str: """Return the first (alphabetic) person name component as a unicode string """ try: return self.components[0] except IndexError: return "" @property def ideographic(self) -> str: """Return the second (ideographic) person name component as a unicode string """ try: return self.components[1] except IndexError: return "" @property def phonetic(self) -> str: """Return the third (phonetic) person name component as a unicode string """ try: return self.components[2] except IndexError: return "" def __eq__(self, other: Any) -> Any: """Return ``True`` if `other` equals the current name.""" return str(self) == other def __ne__(self, other: Any) -> Any: """Return ``True`` if `other` doesn't equal the current name.""" return not self == other def __str__(self) -> str: """Return a string representation of the name.""" return "=".join(self.components).__str__() def __iter__(self) -> Iterator[str]: """Iterate through the name.""" yield from self.__str__() def __len__(self) -> int: """Return the length of the person name.""" return len(self.__str__()) def __contains__(self, x: Any) -> bool: """Return ``True`` if `x` is in the name.""" return x in self.__str__() def __repr__(self) -> str: """Return a representation of the name.""" return "=".join(self.components).__repr__() def __hash__(self) -> int: """Return a hash of the name.""" return hash(self.components) def decode(self, encodings: Sequence[str] | None = None) -> "PersonName": """Return the patient name decoded by the given `encodings`. Parameters ---------- encodings : list of str, optional The list of encodings used for decoding the byte string. If not given, the initial encodings set in the object are used. Returns ------- valuerep.PersonName A person name object that will return the decoded string with the given encodings on demand. If the encodings are not given, the current object is returned. """ # in the common case (encoding did not change) we decode on demand if encodings is None or encodings == self.encodings: return self # the encoding was unknown or incorrect - create a new # PersonName object with the changed encoding encodings = _verify_encodings(encodings) if self.original_string is None: # if the original encoding was not set, we set it now self.original_string = _encode_personname( self.components, self.encodings or [default_encoding] ) # now that we have the byte length, we re-validate the value validate_value("PN", self.original_string, self.validation_mode) return PersonName(self.original_string, encodings) def encode(self, encodings: Sequence[str] | None = None) -> bytes: """Return the patient name decoded by the given `encodings`. Parameters ---------- encodings : list of str, optional The list of encodings used for encoding the unicode string. If not given, the initial encodings set in the object are used. Returns ------- bytes The person name encoded with the given encodings as a byte string. If no encoding is given, the original byte string is returned, if available, otherwise each group of the patient name is encoded with the first matching of the given encodings. """ encodings = _verify_encodings(encodings) or self.encodings # if the encoding is not the original encoding, we have to return # a re-encoded string (without updating the original string) if encodings != self.encodings and self.encodings is not None: return _encode_personname(self.components, cast(Sequence[str], encodings)) if self.original_string is None: # if the original encoding was not set, we set it now self.original_string = _encode_personname( self.components, encodings or [default_encoding] ) return self.original_string def family_comma_given(self) -> str: """Return the name as "Family, Given".""" return f"{self.family_name}, {self.given_name}" def formatted(self, format_str: str) -> str: """Return the name as a :class:`str` formatted using `format_str`.""" return format_str % self._create_dict() def __bool__(self) -> bool: """Return ``True`` if the name is not empty.""" if not self.original_string: return bool(self.components) and ( len(self.components) > 1 or bool(self.components[0]) ) return bool(self.original_string) @staticmethod def _encode_component_groups( alphabetic_group: Sequence[str | bytes], ideographic_group: Sequence[str | bytes], phonetic_group: Sequence[str | bytes], encodings: list[str] | None = None, ) -> bytes: """Creates a byte string for a person name from lists of parts. Each of the three component groups (alphabetic, ideographic, phonetic) are supplied as a list of components. Parameters ---------- alphabetic_group: Sequence[str | bytes] List of components for the alphabetic group. ideographic_group: Sequence[str | bytes] List of components for the ideographic group. phonetic_group: Sequence[str | bytes] List of components for the phonetic group. encodings: list[str] | None A list of encodings used for the other input parameters. Returns ------- bytes: Bytes string representation of the person name. Raises ------ ValueError: If any of the input strings contain disallowed characters: '\\' (single backslash), '^', '='. """ from pydicom.charset import encode_string, decode_bytes def enc(s: str) -> bytes: return encode_string(s, encodings or [default_encoding]) def dec(s: bytes) -> str: return decode_bytes(s, encodings or [default_encoding], set()) encoded_component_sep = enc("^") encoded_group_sep = enc("=") disallowed_chars = ["\\", "=", "^"] def standardize_encoding(val: str | bytes) -> bytes: # Return a byte encoded string regardless of the input type # This allows the user to supply a mixture of str and bytes # for different parts of the input if isinstance(val, bytes): val_enc = val val_dec = dec(val) else: val_enc = enc(val) val_dec = val # Check for disallowed chars in the decoded string for c in disallowed_chars: if c in val_dec: raise ValueError(f"Strings may not contain the {c} character") # Return the encoded string return val_enc def make_component_group(components: Sequence[str | bytes]) -> bytes: encoded_components = [standardize_encoding(c) for c in components] joined_components = encoded_component_sep.join(encoded_components) return joined_components.rstrip(encoded_component_sep) component_groups: list[bytes] = [ make_component_group(alphabetic_group), make_component_group(ideographic_group), make_component_group(phonetic_group), ] joined_groups: bytes = encoded_group_sep.join(component_groups) joined_groups = joined_groups.rstrip(encoded_group_sep) return joined_groups @classmethod def from_named_components( cls, family_name: str | bytes = "", given_name: str | bytes = "", middle_name: str | bytes = "", name_prefix: str | bytes = "", name_suffix: str | bytes = "", family_name_ideographic: str | bytes = "", given_name_ideographic: str | bytes = "", middle_name_ideographic: str | bytes = "", name_prefix_ideographic: str | bytes = "", name_suffix_ideographic: str | bytes = "", family_name_phonetic: str | bytes = "", given_name_phonetic: str | bytes = "", middle_name_phonetic: str | bytes = "", name_prefix_phonetic: str | bytes = "", name_suffix_phonetic: str | bytes = "", encodings: list[str] | None = None, ) -> "PersonName": """Construct a PersonName from explicit named components. The DICOM standard describes human names using five components: family name, given name, middle name, name prefix, and name suffix. Any component may be an empty string (the default) if not used. A component may contain multiple space-separated words if there are, for example, multiple given names, middle names, or titles. Additionally, each component may be represented in ideographic or phonetic form in addition to (or instead of) alphabetic form. For more information see the following parts of the DICOM standard: - :dcm:`Value Representations ` - :dcm:`PN Examples ` - :dcm:`PN Precise semantics ` Example ------- A case with multiple given names and suffixes (DICOM standard, part 5, sect 6.2.1.1): >>> pn = PersonName.from_named_components( family_name='Adams', given_name='John Robert Quincy', name_prefix='Rev.', name_suffix='B.A. M.Div.' ) A Korean case with phonetic and ideographic representations (PS3.5-2008 section I.2 p. 108): >>> pn = PersonName.from_named_components( family_name='Hong', given_name='Gildong', family_name_ideographic='洪', given_name_ideographic='吉洞', family_name_phonetic='홍', given_name_phonetic='길동', encodings=[default_encoding, 'euc_kr'] ) Parameters ---------- family_name: str | bytes Family name in alphabetic form. given_name: str | bytes Given name in alphabetic form. middle_name: str | bytes Middle name in alphabetic form. name_prefix: str | bytes Name prefix in alphabetic form, e.g. 'Mrs.', 'Dr.', 'Sr.', 'Rev.'. name_suffix: str | bytes Name prefix in alphabetic form, e.g. 'M.D.', 'B.A., M.Div.', 'Chief Executive Officer'. family_name_ideographic: str | bytes Family name in ideographic form. given_name_ideographic: str | bytes Given name in ideographic form. middle_name_ideographic: str | bytes Middle name in ideographic form. name_prefix_ideographic: str | bytes Name prefix in ideographic form. name_suffix_ideographic: str | bytes Name suffix in ideographic form. family_name_phonetic: str | bytes Family name in phonetic form. given_name_phonetic: str | bytes Given name in phonetic form. middle_name_phonetic: str | bytes Middle name in phonetic form. name_prefix_phonetic: str | bytes Name prefix in phonetic form. name_suffix_phonetic: str | bytes Name suffix in phonetic form. encodings: list[str] | None A list of encodings used for the other input parameters. Returns ------- PersonName: PersonName constructed from the supplied components. Notes ----- Strings may not contain the following characters: '^', '=', or the backslash character. """ alphabetic_group: list[str | bytes] = [ family_name, given_name, middle_name, name_prefix, name_suffix, ] # Ideographic component group ideographic_group: list[str | bytes] = [ family_name_ideographic, given_name_ideographic, middle_name_ideographic, name_prefix_ideographic, name_suffix_ideographic, ] # Phonetic component group phonetic_group: list[str | bytes] = [ family_name_phonetic, given_name_phonetic, middle_name_phonetic, name_prefix_phonetic, name_suffix_phonetic, ] encoded_value: bytes = cls._encode_component_groups( alphabetic_group, ideographic_group, phonetic_group, encodings, ) return cls(encoded_value, encodings=encodings) @classmethod def from_named_components_veterinary( cls, responsible_party_name: str | bytes = "", patient_name: str | bytes = "", responsible_party_name_ideographic: str | bytes = "", patient_name_ideographic: str | bytes = "", responsible_party_name_phonetic: str | bytes = "", patient_name_phonetic: str | bytes = "", encodings: list[str] | None = None, ) -> "PersonName": """Construct a PersonName from explicit named components following the veterinary usage convention. The DICOM standard describes names for veterinary use with two components: responsible party family name OR responsible party organization name, and patient name. Any component may be an empty string (the default) if not used. A component may contain multiple space-separated words if necessary. Additionally, each component may be represented in ideographic or phonetic form in addition to (or instead of) alphabetic form. For more information see the following parts of the DICOM standard: - :dcm:`Value Representations ` - :dcm:`PN Examples ` - :dcm:`PN Precise semantics ` Example ------- A horse whose responsible organization is named "ABC Farms", and whose name is "Running On Water" >>> pn = PersonName.from_named_components_veterinary( responsible_party_name='ABC Farms', patient_name='Running on Water' ) Parameters ---------- responsible_party_name: str | bytes Name of the responsible party in alphabetic form. This may be either the family name of the responsible party, or the name of the responsible organization. patient_name: str | bytes Patient name in alphabetic form. responsible_party_name_ideographic: str | bytes Name of the responsible party in ideographic form. patient_name_ideographic: str | bytes Patient name in ideographic form. responsible_party_name_phonetic: str | bytes Name of the responsible party in phonetic form. patient_name_phonetic: str | bytes Patient name in phonetic form. encodings: list[str] | None A list of encodings used for the other input parameters Returns ------- PersonName: PersonName constructed from the supplied components Notes ----- Strings may not contain the following characters: '^', '=', or the backslash character. """ alphabetic_group: list[str | bytes] = [ responsible_party_name, patient_name, ] ideographic_group: list[str | bytes] = [ responsible_party_name_ideographic, patient_name_ideographic, ] phonetic_group: list[str | bytes] = [ responsible_party_name_phonetic, patient_name_phonetic, ] encoded_value: bytes = cls._encode_component_groups( alphabetic_group, ideographic_group, phonetic_group, encodings ) return cls(encoded_value, encodings=encodings) pydicom-pydicom-20aa4b7/src/pydicom/values.py000066400000000000000000000652521515706620200213440ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Functions for converting values of DICOM data elements to proper python types """ import re from io import BytesIO from struct import unpack, calcsize from typing import Union, cast, Any, TypeVar from collections.abc import MutableSequence, Callable # don't import datetime_conversion directly from pydicom import config from pydicom.charset import default_encoding, decode_bytes from pydicom.config import logger, have_numpy from pydicom.dataelem import empty_value_for_VR, RawDataElement from pydicom.errors import BytesLengthException from pydicom.filereader import read_sequence from pydicom.multival import MultiValue from pydicom.sequence import Sequence from pydicom.tag import Tag, TupleTag, BaseTag import pydicom.uid import pydicom.valuerep # don't import DS directly as can be changed by config from pydicom.valuerep import ( DA, DT, TM, TEXT_VR_DELIMS, IS, CUSTOMIZABLE_CHARSET_VR, VR as VR_, validate_value, ) if have_numpy: import numpy from pydicom.valuerep import PersonName _T = TypeVar("_T") def multi_string( val: str, valtype: Callable[[str], _T] | None = None ) -> _T | MutableSequence[_T]: """Split a string by delimiters if there are any Parameters ---------- val : str The string to split up. valtype : type or callable, optional Default :class:`str`, but can be e.g. :class:`~pydicom.uid.UID` to overwrite to a specific type. Returns ------- valtype or MultiValue[valtype] The split value as `valtype` or a :class:`~pydicom.multival.MultiValue` of `valtype`. """ if valtype is None: valtype = cast(Callable[[str], _T], str) # Remove trailing padding and null bytes items = val.rstrip(" \x00").split("\\") return valtype(items[0]) if len(items) == 1 else MultiValue(valtype, items) def convert_tag(byte_string: bytes, is_little_endian: bool, offset: int = 0) -> BaseTag: """Return a decoded :class:`BaseTag` from the encoded `byte_string`. `byte_string` must be at least 4 bytes long. Parameters ---------- byte_string : bytes The encoded tag. is_little_endian : bool ``True`` if the encoding is little endian, ``False`` otherwise. offset : int, optional The byte offset in `byte_string` to the start of the tag. Returns ------- BaseTag The decoded tag. Raises ------ ValueError If `byte_string` is too short. """ if len(byte_string) < 4: raise ValueError("byte string too short - must be at least 4 bytes long.") fmt = "HH" value = cast(tuple[int, int], unpack(fmt, byte_string[offset : offset + 4])) return TupleTag(value) def convert_AE_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> str | MutableSequence[str]: """Return a decoded 'AE' value. Elements with VR of 'AE' have non-significant leading and trailing spaces. Parameters ---------- byte_string : bytes The encoded 'AE' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- str The decoded 'AE' value without non-significant spaces. """ # Differs from convert_string because leading spaces are non-significant values = byte_string.decode(default_encoding).split("\\") values = [s.strip() for s in values] if len(values) == 1: return values[0] return MultiValue(str, values) def convert_ATvalue( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> BaseTag | MutableSequence[BaseTag]: """Return a decoded 'AT' value. Parameters ---------- byte_string : bytes The encoded 'AT' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- BaseTag or MultiValue of BaseTag The decoded value(s). """ length = len(byte_string) if length == 4: return convert_tag(byte_string, is_little_endian) # length > 4 if length % 4 != 0: logger.warning( f"Expected length to be multiple of 4 for VR 'AT', got length {length}" ) length -= length % 4 return MultiValue( Tag, [ convert_tag(byte_string, is_little_endian, offset=x) for x in range(0, length, 4) ], ) def _DA_from_str(value: str) -> DA: return DA(value.rstrip()) def convert_DA_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> str | DA | MutableSequence[str] | MutableSequence[DA]: """Return a decoded 'DA' value. Parameters ---------- byte_string : bytes The encoded 'DA' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- str or MultiValue of str or valuerep.DA or MultiValue of valuerep.DA If :attr:`~pydicom.config.datetime_conversion` is ``True`` then returns either :class:`~pydicom.valuerep.DA` or a :class:`list` of ``DA``, otherwise returns :class:`str` or ``list`` of ``str``. """ if config.datetime_conversion: splitup = byte_string.decode(default_encoding).split("\\") if len(splitup) == 1: return _DA_from_str(splitup[0]) return MultiValue(_DA_from_str, splitup) return convert_string(byte_string, is_little_endian, struct_format) def convert_DS_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> Union[ pydicom.valuerep.DSclass, MutableSequence[pydicom.valuerep.DSclass], "numpy.float64", "numpy.ndarray", ]: """Return a decoded 'DS' value. .. versionchanged:: 2.0 The option to return numpy values was added. Parameters ---------- byte_string : bytes The encoded 'DS' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- :class:`~pydicom.valuerep.DSfloat`, :class:`~pydicom.valuerep.DSdecimal`, :class:`numpy.float64`, MultiValue of DSfloat/DSdecimal or :class:`numpy.ndarray` of :class:`numpy.float64` If :attr:`~pydicom.config.use_DS_decimal` is ``False`` (default), returns a :class:`~pydicom.valuerep.DSfloat` or list of them If :attr:`~pydicom.config.use_DS_decimal` is ``True``, returns a :class:`~pydicom.valuerep.DSdecimal` or list of them If :data:`~pydicom.config.use_DS_numpy` is ``True``, returns a :class:`numpy.float64` or a :class:`numpy.ndarray` of them Raises ------ ValueError If :data:`~pydicom.config.use_DS_numpy` is ``True`` and the string contains non-valid characters ImportError If :data:`~pydicom.config.use_DS_numpy` is ``True`` and numpy is not available """ num_string = byte_string.decode(default_encoding) # Below, go directly to DS class instance # rather than factory DS, but need to # ensure last string doesn't have # blank padding (use strip()) if config.use_DS_numpy: if not have_numpy: raise ImportError("use_DS_numpy set but numpy not installed") # Check for valid characters. Numpy ignores many regex = r"[ \\0-9\.+eE-]*\Z" if re.match(regex, num_string) is None: raise ValueError( "DS: char(s) not in repertoire: '{}'".format( re.sub(regex[:-2], "", num_string) ) ) value = numpy.fromstring(num_string, dtype="f8", sep="\\") if len(value) == 1: # Don't use array for one number return value[0] return value return multi_string(num_string.strip(), valtype=pydicom.valuerep.DSclass) def _DT_from_str(value: str) -> DT: value = value.rstrip() length = len(value) if length < 4 or length > 26: logger.warning(f"Expected length between 4 and 26, got length {length}") return DT(value) def convert_DT_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> str | DT | MutableSequence[str] | MutableSequence[DT]: """Return a decoded 'DT' value. Parameters ---------- byte_string : bytes The encoded 'DT' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- str or MultiValue of str or valuerep.DT or MultiValue of DT If :attr:`~pydicom.config.datetime_conversion` is ``True`` then returns :class:`~pydicom.valuerep.DT` or a :class:`list` of ``DT``, otherwise returns :class:`str` or ``list`` of ``str``. """ if config.datetime_conversion: splitup = byte_string.decode(default_encoding).split("\\") if len(splitup) == 1: return _DT_from_str(splitup[0]) return MultiValue(_DT_from_str, splitup) return convert_string(byte_string, is_little_endian, struct_format) def convert_IS_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> Union[IS, MutableSequence[IS], "numpy.int64", "numpy.ndarray"]: """Return a decoded 'IS' value. .. versionchanged:: 2.0 The option to return numpy values was added. Parameters ---------- byte_string : bytes The encoded 'IS' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- :class:`~pydicom.valuerep.IS` or MultiValue of them, or :class:`numpy.int64` or :class:`~numpy.ndarray` of them If :data:`~pydicom.config.use_IS_numpy` is ``False`` (default), returns a single :class:`~pydicom.valuerep.IS` or a list of them If :data:`~pydicom.config.use_IS_numpy` is ``True``, returns a single :class:`numpy.int64` or a :class:`~numpy.ndarray` of them Raises ------ ValueError If :data:`~pydicom.config.use_IS_numpy` is ``True`` and the string contains non-valid characters ImportError If :data:`~pydicom.config.use_IS_numpy` is ``True`` and numpy is not available """ num_string = byte_string.decode(default_encoding) if config.use_IS_numpy: if not have_numpy: raise ImportError("use_IS_numpy set but numpy not installed") # Check for valid characters. Numpy ignores many regex = r"[ \\0-9\.+-]*\Z" if re.match(regex, num_string) is None: raise ValueError( "IS: char(s) not in repertoire: '{}'".format( re.sub(regex[:-2], "", num_string) ) ) value = numpy.fromstring(num_string, dtype="i8", sep=chr(92)) # 92:'\' if len(value) == 1: # Don't use array for one number return cast("numpy.int64", value[0]) return cast("numpy.ndarray", value) return multi_string(num_string, valtype=pydicom.valuerep.IS) def convert_numbers( byte_string: bytes, is_little_endian: bool, struct_format: str ) -> str | int | float | MutableSequence[int] | MutableSequence[float]: """Return a decoded numerical VR value. Given an encoded DICOM Element value, use `struct_format` and the endianness of the data to decode it. Parameters ---------- byte_string : bytes The encoded numerical VR element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str The format of the numerical data encoded in `byte_string`. Should be a valid format for :func:`struct.unpack()` without the endianness. Returns ------- str If there is no encoded data in `byte_string` then an empty string will be returned. value If `byte_string` encodes a single value then it will be returned. list If `byte_string` encodes multiple values then a list of the decoded values will be returned. """ endianChar = "><"[is_little_endian] # "=" means use 'standard' size, needed on 64-bit systems. bytes_per_value = calcsize("=" + struct_format) length = len(byte_string) if length % bytes_per_value != 0: raise BytesLengthException( "Expected total bytes to be an even multiple of bytes per value. " f"Instead received " f"{repr(byte_string) if len(byte_string) <= 256 else 'bytes'} " f"with length {length} and " f"struct format '{struct_format}' which corresponds to bytes per " f"value of {bytes_per_value}." ) format_string = f"{endianChar}{length // bytes_per_value}{struct_format}" value: tuple[int, ...] | tuple[float, ...] = unpack(format_string, byte_string) # if the number is empty, then return the empty # string rather than empty list if len(value) == 0: return "" if len(value) == 1: return value[0] # convert from tuple to a list so can modify if need to return list(value) def convert_OBvalue( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> bytes: """Return encoded 'OB' value as :class:`bytes`.""" return byte_string def convert_OWvalue( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> bytes: """Return the encoded 'OW' value as :class:`bytes`. No byte swapping will be performed. """ # for now, Maybe later will have own routine return convert_OBvalue(byte_string, is_little_endian) def convert_OVvalue( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> bytes: """Return the encoded 'OV' value as :class:`bytes`. No byte swapping will be performed. """ # for now, Maybe later will have own routine return convert_OBvalue(byte_string, is_little_endian) def convert_PN( byte_string: bytes, encodings: list[str] | None = None ) -> PersonName | MutableSequence[PersonName]: """Return a decoded 'PN' value. Parameters ---------- byte_string : bytes The encoded 'PN' element value. encodings : list of str, optional A list of the character encoding schemes used to encode the 'PN' value. Returns ------- valuerep.PersonName or MultiValue of PersonName The decoded 'PN' value(s). """ encodings = encodings or [default_encoding] def get_valtype(x: str) -> PersonName: person_name = PersonName(x, encodings) # Using an already decoded string in PersonName constructor leaves # the original string as undefined, let's set it through encode person_name.encode() return person_name.decode() stripped_string = byte_string.rstrip(b"\x00 ") decoded_value = decode_bytes(stripped_string, encodings, TEXT_VR_DELIMS) value_split = decoded_value.split("\\") if len(value_split) == 1: return get_valtype(value_split[0]) return MultiValue(get_valtype, value_split) def convert_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> str | MutableSequence[str]: """Return a decoded string VR value. String VRs are 'AE', AS', 'CS' and optionally (depending on :ref:`pydicom.config `) 'DA', 'DT', and 'TM'. Parameters ---------- byte_string : bytes The encoded text VR element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- str or MultiValue of str The decoded value(s). """ return multi_string(byte_string.decode(default_encoding)) def convert_text( byte_string: bytes, encodings: list[str] | None = None, vr: str | None = None ) -> str | MutableSequence[str]: """Return a decoded text VR value. Text VRs are 'SH', 'LO' and 'UC'. Parameters ---------- byte_string : bytes The encoded text VR element value. encodings : list of str, optional A list of the character encoding schemes used to encode the value. vr : str The value representation of the element. Needed for validation. Returns ------- str or list of str The decoded value(s). """ def handle_value(v: str) -> str: if vr is not None: validate_value(vr, v, config.settings.reading_validation_mode) return v.rstrip("\0 ") encodings = encodings or [default_encoding] decoded_string = decode_bytes(byte_string, encodings, TEXT_VR_DELIMS) values = decoded_string.split("\\") as_strings = [handle_value(value) for value in values] if len(as_strings) == 1: return as_strings[0] return MultiValue(str, as_strings) def convert_single_string( byte_string: bytes, encodings: list[str] | None = None, vr: str | None = None, ) -> str: """Return decoded text, ignoring backslashes and trailing spaces. Parameters ---------- byte_string : bytes The encoded string. encodings : list of str, optional A list of the character encoding schemes used to encode the text. vr : str The value representation of the element. Needed for validation. Returns ------- str The decoded text. """ encodings = encodings or [default_encoding] value = decode_bytes(byte_string, encodings, TEXT_VR_DELIMS) if vr is not None: validate_value(vr, value, config.settings.reading_validation_mode) return value.rstrip("\0 ") def convert_SQ( byte_string: bytes, is_implicit_VR: bool, is_little_endian: bool, encoding: list[str] | None = None, offset: int = 0, ) -> Sequence: """Return a decoded 'SQ' value. Parameters ---------- byte_string : bytes The encoded 'SQ' element value. is_implicit_VR : bool ``True`` if the value is encoded as implicit VR, ``False`` otherwise. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. encoding : list of str, optional The character encoding scheme(s) used to encoded any text VR elements within the sequence value. ``'iso8859'`` is used by default. offset : int, optional The byte offset in `byte_string` to the start of the sequence value. Returns ------- sequence.Sequence The decoded sequence. """ encodings = encoding or [default_encoding] fp = BytesIO(byte_string) seq = read_sequence( fp, is_implicit_VR, is_little_endian, len(byte_string), encodings, offset ) return seq def _TM_from_str(value: str) -> TM: value = value.rstrip() length = len(value) if (length < 2 or length > 16) and length != 0: logger.warning(f"Expected length between 2 and 16, got length {length}") return TM(value) def convert_TM_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> str | TM | MutableSequence[str] | MutableSequence[TM]: """Return a decoded 'TM' value. Parameters ---------- byte_string : bytes The encoded 'TM' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- str or list of str or valuerep.TM or list of valuerep.TM If :attr:`~pydicom.config.datetime_conversion` is ``True`` then returns either :class:`~pydicom.valuerep.TM` or a :class:`list` of ``TM``, otherwise returns :class:`str` or ``list`` of ``str``. """ if config.datetime_conversion: splitup = byte_string.decode(default_encoding).split("\\") if len(splitup) == 1: return _TM_from_str(splitup[0]) return MultiValue(_TM_from_str, splitup) return convert_string(byte_string, is_little_endian) def convert_UI( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> pydicom.uid.UID | MutableSequence[pydicom.uid.UID]: """Return a decoded 'UI' value. Elements with VR of 'UI' may have a non-significant trailing null ``0x00``. Parameters ---------- byte_string : bytes The encoded 'UI' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- uid.UID or list of uid.UID The decoded 'UI' element value without trailing nulls or spaces. """ # Convert to str and remove any trailing nulls or spaces value = byte_string.decode(default_encoding) return multi_string(value.rstrip("\0 "), pydicom.uid.UID) def convert_UN( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> bytes: """Return the encoded 'UN' value as :class:`bytes`.""" return byte_string def convert_UR_string( byte_string: bytes, is_little_endian: bool, struct_format: str | None = None ) -> str: """Return a decoded 'UR' value. Elements with VR of 'UR' may not be multi-valued and trailing spaces are non-significant. Parameters ---------- byte_string : bytes The encoded 'UR' element value. is_little_endian : bool ``True`` if the value is encoded as little endian, ``False`` otherwise. struct_format : str, optional Not used. Returns ------- bytes or str The encoded 'UR' element value without any trailing spaces. """ return byte_string.decode(default_encoding).rstrip() def convert_value( VR: str, raw_data_element: RawDataElement, encodings: str | MutableSequence[str] | None = None, ) -> Any | MutableSequence[Any]: """Return the element value decoded using the appropriate decoder. Parameters ---------- VR : str The element's VR. raw_data_element : pydicom.dataelem.RawDataElement The encoded element value. encodings : list of str, optional A list of the character encoding schemes used to encode any text elements. Returns ------- type or MultiValue of type The element value decoded using the appropriate decoder. """ if VR not in converters: # `VR` characters are in the ascii alphabet ranges 65 - 90, 97 - 122 char_range = list(range(65, 91)) + list(range(97, 123)) # If the VR characters are outside that range then print hex values if ord(VR[0]) not in char_range or ord(VR[1]) not in char_range: VR = " ".join([f"0x{ord(ch):02x}" for ch in VR]) raise NotImplementedError(f"Unknown Value Representation '{VR}'") if raw_data_element.length == 0: return empty_value_for_VR(VR) # Look up the function to convert that VR # Dispatch two cases: a plain converter, # or a number one which needs a format string VR = cast(VR_, VR) if isinstance(converters[VR], tuple): converter, num_format = cast(tuple, converters[VR]) else: converter = converters[VR] num_format = None # Ensure that encodings is a list encodings = encodings or [default_encoding] if isinstance(encodings, str): encodings = [encodings] byte_string = raw_data_element.value is_little_endian = raw_data_element.is_little_endian is_implicit_VR = raw_data_element.is_implicit_VR # Not only two cases. Also need extra info if is a raw sequence # Pass all encodings to the converter if needed try: if VR == VR_.PN: return converter(byte_string, encodings) if VR in CUSTOMIZABLE_CHARSET_VR: # SH, LO, ST, LT, UC, UT - PN already done return converter(byte_string, encodings, VR) if VR != VR_.SQ: return converter(byte_string, is_little_endian, num_format) # SQ return converter( byte_string, is_implicit_VR, is_little_endian, encodings, raw_data_element.value_tell, ) except ValueError: if config.settings.reading_validation_mode == config.RAISE: # The user really wants an exception here raise logger.debug( f"Unable to convert tag {raw_data_element.tag} with VR {VR} using " "the standard value converter" ) for vr in [val for val in convert_retry_VR_order if val != VR]: try: return convert_value(vr, raw_data_element, encodings) except Exception: pass logger.debug( f"Could not convert value for tag {raw_data_element.tag} with " "any VR in the 'convert_retry_VR_order' list" ) return raw_data_element.value convert_retry_VR_order = [ VR_.SH, VR_.UL, VR_.SL, VR_.US, VR_.SS, VR_.FL, VR_.FD, VR_.OF, VR_.OB, VR_.UI, VR_.DA, VR_.TM, VR_.PN, VR_.IS, VR_.DS, VR_.LT, VR_.SQ, VR_.UN, VR_.AT, VR_.OW, VR_.DT, VR_.UT, ] # converters map a VR to the function # to read the value(s). for convert_numbers, # the converter maps to a tuple # (function, struct_format) # (struct_format in python struct module style) converters = { VR_.AE: convert_AE_string, VR_.AS: convert_string, VR_.AT: convert_ATvalue, VR_.CS: convert_string, VR_.DA: convert_DA_string, VR_.DS: convert_DS_string, VR_.DT: convert_DT_string, VR_.FD: (convert_numbers, "d"), VR_.FL: (convert_numbers, "f"), VR_.IS: convert_IS_string, VR_.LO: convert_text, VR_.LT: convert_single_string, VR_.OB: convert_OBvalue, VR_.OD: convert_OBvalue, VR_.OF: convert_OWvalue, VR_.OL: convert_OBvalue, VR_.OW: convert_OWvalue, VR_.OV: convert_OVvalue, VR_.PN: convert_PN, VR_.SH: convert_text, VR_.SL: (convert_numbers, "l"), VR_.SQ: convert_SQ, VR_.SS: (convert_numbers, "h"), VR_.ST: convert_single_string, VR_.SV: (convert_numbers, "q"), VR_.TM: convert_TM_string, VR_.UC: convert_text, VR_.UI: convert_UI, VR_.UL: (convert_numbers, "L"), VR_.UN: convert_UN, VR_.UR: convert_UR_string, VR_.US: (convert_numbers, "H"), VR_.UT: convert_single_string, VR_.UV: (convert_numbers, "Q"), VR_.OB_OW: convert_OBvalue, VR_.US_SS: convert_OWvalue, VR_.US_OW: convert_OWvalue, VR_.US_SS_OW: convert_OWvalue, } pydicom-pydicom-20aa4b7/src/pydicom/waveforms/000077500000000000000000000000001515706620200214725ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/src/pydicom/waveforms/__init__.py000066400000000000000000000001201515706620200235740ustar00rootroot00000000000000from pydicom.waveforms.numpy_handler import generate_multiplex, multiplex_array pydicom-pydicom-20aa4b7/src/pydicom/waveforms/numpy_handler.py000066400000000000000000000205171515706620200247160ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Use the `numpy `_ package to convert supported *Waveform Data* to a :class:`numpy.ndarray`. .. versionadded:: 2.1 **Supported data** The numpy handler supports the conversion of data in the (5400,0100) *Waveform Sequence* element to an :class:`~numpy.ndarray` provided the related :dcm:`Waveform` module elements have values given in the table below. +-------------+------------------------------+------+-------------------------+ | Element | Supported | +-------------+------------------------------+------+ values | | Tag | Keyword | Type | | +=============+==============================+======+=========================+ | (003A,0005) | NumberOfWaveformChannels | 1 | N > 0 | +-------------+------------------------------+------+-------------------------+ | (003A,0010) | NumberOfWaveformSamples | 1 | N > 0 | +-------------+------------------------------+------+-------------------------+ | (5400,1004) | WaveformBitsAllocated | 1 | 8, 16, 32, 64 | +-------------+------------------------------+------+-------------------------+ | (5400,1006) | WaveformSampleInterpretation | 1 | SB, UB, MB, AB, SS, US, | | | | | SL, UL, SV, UV | +-------------+------------------------------+------+-------------------------+ """ from typing import TYPE_CHECKING, cast from collections.abc import Generator try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False if TYPE_CHECKING: # pragma: no cover from pydicom.dataset import Dataset HANDLER_NAME = "Numpy Waveform" DEPENDENCIES = {"numpy": ("https://numpy.org/", "NumPy")} WAVEFORM_DTYPES = { (8, "SB"): "int8", (8, "UB"): "uint8", (8, "MB"): "uint8", (8, "AB"): "uint8", (16, "SS"): "int16", (16, "US"): "uint16", (32, "SL"): "int32", (32, "UL"): "uint32", (64, "SV"): "int64", (64, "UV"): "uint64", } def is_available() -> bool: """Return ``True`` if the handler has its dependencies met. .. versionadded:: 2.1 """ return HAVE_NP def generate_multiplex( ds: "Dataset", as_raw: bool = True ) -> Generator["np.ndarray", None, None]: """Yield an :class:`~numpy.ndarray` for each multiplex group in the *Waveform Sequence*. .. versionadded:: 2.1 Parameters ---------- ds : pydicom.dataset.Dataset The :class:`Dataset` containing a :dcm:`Waveform ` module and the *Waveform Sequence* to be converted. as_raw : bool, optional If ``True`` (default), then yield the raw unitless waveform data. If ``False`` then attempt to convert the raw data for each channel to the quantity specified by the corresponding (003A,0210) *Channel Sensitivity* unit. Yields ------ np.ndarray The waveform data for a multiplex group as an :class:`~numpy.ndarray` with shape (samples, channels). """ if "WaveformSequence" not in ds: raise AttributeError( "No (5400,0100) Waveform Sequence element found in the dataset" ) for ii, item in enumerate(cast(list["Dataset"], ds.WaveformSequence)): required_elements = [ "NumberOfWaveformChannels", "NumberOfWaveformSamples", "WaveformBitsAllocated", "WaveformSampleInterpretation", "WaveformData", ] missing = [elem for elem in required_elements if elem not in item] if missing: raise AttributeError( f"Unable to convert the waveform multiplex group with index " f"{ii} as the following required elements are missing from " f"the sequence item: {', '.join(missing)}" ) # Determine the expected length of the data (without padding) bytes_per_sample = cast(int, item.WaveformBitsAllocated) // 8 nr_samples = cast(int, item.NumberOfWaveformSamples) nr_channels = cast(int, item.NumberOfWaveformChannels) bits_allocated = cast(int, item.WaveformBitsAllocated) sample_interpretation = cast(str, item.WaveformSampleInterpretation) expected_len = nr_samples * nr_channels * bytes_per_sample # Waveform Data is ordered as (C = channel, S = sample): # C1S1, C2S1, ..., CnS1, C1S2, ..., CnS2, ..., C1Sm, ..., CnSm dtype = WAVEFORM_DTYPES[(bits_allocated, sample_interpretation)] arr = np.frombuffer(cast(bytes, item.WaveformData)[:expected_len], dtype=dtype) # Reshape to (samples, channels) and make writeable arr = np.copy(arr.reshape(nr_samples, nr_channels)) if not as_raw: # Apply correction factor (if possible) arr = arr.astype("float") seq = cast(list["Dataset"], item.ChannelDefinitionSequence) for jj, ch in enumerate(seq): baseline = ch.get("ChannelBaseline", 0.0) sensitivity = ch.get("ChannelSensitivity", 1.0) correction = ch.get("ChannelSensitivityCorrectionFactor", 1.0) arr[..., jj] = arr[..., jj] * sensitivity * correction + baseline yield arr def multiplex_array(ds: "Dataset", index: int, as_raw: bool = True) -> "np.ndarray": """Return an :class:`~numpy.ndarray` for the multiplex group in the *Waveform Sequence* at `index`. .. versionadded:: 2.1 Parameters ---------- ds : pydicom.dataset.Dataset The :class:`Dataset` containing a :dcm:`Waveform ` module and the *Waveform Sequence* to be converted. index : int The index of the multiplex group to return. as_raw : bool, optional If ``True`` (default), then return the raw unitless waveform data. If ``False`` then attempt to convert the raw data for each channel to the quantity specified by the corresponding (003A,0210) *Channel Sensitivity* unit. Returns ------- np.ndarray The waveform data for a multiplex group as an :class:`~numpy.ndarray` with shape (samples, channels). """ if "WaveformSequence" not in ds: raise AttributeError( "No (5400,0100) Waveform Sequence element found in the dataset" ) item = cast(list["Dataset"], ds.WaveformSequence)[index] required_elements = [ "NumberOfWaveformChannels", "NumberOfWaveformSamples", "WaveformBitsAllocated", "WaveformSampleInterpretation", "WaveformData", ] missing = [elem for elem in required_elements if elem not in item] if missing: raise AttributeError( f"Unable to convert the waveform multiplex group with index " f"{index} as the following required elements are missing from " f"the sequence item: {', '.join(missing)}" ) # Determine the expected length of the data (without padding) bytes_per_sample = cast(int, item.WaveformBitsAllocated) // 8 nr_samples = cast(int, item.NumberOfWaveformSamples) nr_channels = cast(int, item.NumberOfWaveformChannels) bits_allocated = cast(int, item.WaveformBitsAllocated) sample_interpretation = cast(str, item.WaveformSampleInterpretation) expected_len = nr_samples * nr_channels * bytes_per_sample # Waveform Data is ordered as (C = channel, S = sample): # C1S1, C2S1, ..., CnS1, C1S2, ..., CnS2, ..., C1Sm, ..., CnSm dtype = WAVEFORM_DTYPES[(bits_allocated, sample_interpretation)] arr = np.frombuffer(cast(bytes, item.WaveformData)[:expected_len], dtype=dtype) # Reshape to (samples, channels) and make writeable arr = np.copy(arr.reshape(nr_samples, nr_channels)) if not as_raw: # Apply correction factor (if possible) arr = arr.astype("float") seq = cast(list["Dataset"], item.ChannelDefinitionSequence) for jj, ch in enumerate(seq): baseline = ch.get("ChannelBaseline", 0.0) sensitivity = ch.get("ChannelSensitivity", 1.0) correction = ch.get("ChannelSensitivityCorrectionFactor", 1.0) arr[..., jj] = arr[..., jj] * sensitivity * correction + baseline return cast("np.ndarray", arr) pydicom-pydicom-20aa4b7/tests/000077500000000000000000000000001515706620200163705ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/tests/__init__.py000066400000000000000000000000001515706620200204670ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/tests/_write_stds.py000066400000000000000000000053341515706620200212750ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Snippets for what a particular dataset (including nested sequences) should look like after writing in different expl/impl Vr and endian combos, as well as undefined length sequences and items """ # Implicit VR, little endian, SQ's with defined lengths impl_LE_deflen_std_hex = ( b"10 00 10 00 " # (0010,0010) Patient's Name b"0c 00 00 00 " # length 12 b"4e 61 6d 65 5e 50 61 74 69 65 6e 74 " # "Name^Patient" b"20 00 13 00 " # instance number with no value b"00 00 00 00 " # length 0 b"06 30 39 00 " # (3006,0039) ROI Contour Sequence b"5a 00 00 00 " # length 90 b"fe ff 00 e0 " # (FFFE,E000) Item Tag b"52 00 00 00 " # length 82 b"06 30 40 00 " # (3006,0040) Contour Sequence b"4a 00 00 00 " # length 74 b"fe ff 00 e0 " # (FFFE,E000) Item Tag b"1a 00 00 00 " # length 26 b"06 30 48 00 " # (3006,0048) Contour Number b"02 00 00 00 " # length 2 b"31 20 " # "1 " b"06 30 50 00 " # (3006,0050) Contour Data b"08 00 00 00 " # length 8 b"32 5c 34 5c 38 5c 31 36 " # "2\4\8\16" b"fe ff 00 e0 " # (FFFE,E000) Item Tag b"20 00 00 00 " # length 32 b"06 30 48 00 " # (3006,0048) Contour Number b"02 00 00 00 " # length 2 b"32 20 " # "2 " b"06 30 50 00 " # (3006,0050) Contour Data b"0e 00 00 00 " # length 14 b"33 32 5c 36 34 5c 31 32 38 5c 31 39 36 20 " # "32\64\128\196 " ) # Implicit VR, big endian, SQ's with defined lengths # Realized after coding this that there is no Impl VR big endian in DICOM std; # however, it seems to exist as a GE private transfer syntax. # Will leave this here for now. impl_BE_deflen_std_hex = ( b"00 10 00 10 " # (0010,0010) Patient's Name b"00 00 00 0c " # length 12 b"4e 61 6d 65 5e 50 61 74 69 65 6e 74 " # "Name^Patient" b"30 06 00 39 " # (3006,0039) ROI Contour Sequence b"00 00 00 5a " # length 90 b"ff fe e0 00 " # (FFFE,E000) Item Tag b"00 00 00 52 " # length 82 b"30 06 00 40 " # (3006,0040) Contour Sequence b"00 00 00 4a " # length 74 b"ff fe e0 00 " # (FFFE,E000) Item Tag b"00 00 00 1a " # length 26 b"30 06 00 48 " # (3006,0048) Contour Number b"00 00 00 02 " # length 2 b"31 20 " # "1 " b"30 06 00 50 " # (3006,0050) Contour Data b"00 00 00 08 " # length 8 b"32 5c 34 5c 38 5c 31 36 " # "2\4\8\16" b"ff fe e0 00 " # (FFFE,E000) Item Tag b"20 00 00 00 " # length 32 b"30 06 00 48 " # (3006,0048) Contour Number b"00 00 00 02 " # length 2 b"32 20 " # "2 " b"30 06 00 50 " # (3006,0050) Contour Data b"00 00 00 0e " # length 14 b"33 32 5c 36 34 5c 31 32 38 5c 31 39 36 20 " # "32\64\128\196 " ) pydicom-pydicom-20aa4b7/tests/conftest.py000066400000000000000000000053011515706620200205660ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Fixtures used in different tests.""" import pytest from pydicom import config @pytest.fixture def enforce_valid_values(): value = config.settings.reading_validation_mode config.settings.reading_validation_mode = config.RAISE yield config.settings.reading_validation_mode = value @pytest.fixture def allow_reading_invalid_values(): value = config.settings.reading_validation_mode config.settings.reading_validation_mode = config.WARN yield config.settings.reading_validation_mode = value @pytest.fixture def ignore_reading_invalid_values(): value = config.settings.reading_validation_mode config.settings.reading_validation_mode = config.IGNORE yield config.settings.reading_validation_mode = value @pytest.fixture def enforce_writing_invalid_values(): value = config.settings.writing_validation_mode config.settings.writing_validation_mode = config.RAISE yield config.settings.writing_validation_mode = value @pytest.fixture def allow_writing_invalid_values(): value = config.settings.writing_validation_mode config.settings.writing_validation_mode = config.WARN yield config.settings.writing_validation_mode = value @pytest.fixture def no_numpy_use(): use_ds_numpy = config.use_DS_numpy use_is_numpy = config.use_IS_numpy config.use_DS_numpy = False config.use_IS_numpy = False yield config.use_DS_numpy = use_ds_numpy config.use_IS_numpy = use_is_numpy @pytest.fixture def no_datetime_conversion(): datetime_conversion = config.datetime_conversion config.datetime_conversion = False yield config.datetime_conversion = datetime_conversion @pytest.fixture def dont_replace_un_with_known_vr(): old_value = config.replace_un_with_known_vr config.replace_un_with_known_vr = False yield config.replace_un_with_known_vr = old_value @pytest.fixture def dont_replace_un_with_sq_vr(): old_value = config.settings.infer_sq_for_un_vr config.settings.infer_sq_for_un_vr = False yield config.settings.infer_sq_for_un_vr = old_value @pytest.fixture def dont_raise_on_writing_invalid_value(): old_value = config.settings.writing_validation_mode config.settings.writing_validation_mode = config.WARN yield config.settings.writing_validation_mode = old_value @pytest.fixture def raise_on_writing_invalid_value(): old_value = config.settings.writing_validation_mode config.settings.writing_validation_mode = config.RAISE yield config.settings.writing_validation_mode = old_value @pytest.fixture def disable_value_validation(): with config.disable_value_validation(): yield pydicom-pydicom-20aa4b7/tests/pixels/000077500000000000000000000000001515706620200176745ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/tests/pixels/__init__.py000066400000000000000000000000001515706620200217730ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/tests/pixels/pixels_reference.py000066400000000000000000002240621515706620200235760ustar00rootroot00000000000000from collections.abc import Callable from pathlib import Path from typing import TYPE_CHECKING, Any try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.data import get_testdata_file from pydicom.uid import ( ExplicitVRLittleEndian, ImplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, HTJ2KLossless, HTJ2KLosslessRPCL, HTJ2K, RLELossless, ) if TYPE_CHECKING: from pydicom import Dataset class PixelReference: def __init__( self, name: str, dtype: str, test: Callable[["PixelReference", "np.ndarray", dict[str, Any]], None], ) -> None: self.name = name self.dtype = dtype self._ds: Dataset self._test = test @property def ds(self) -> "Dataset": """Return the dataset containing the pixel data""" if getattr(self, "_ds", None) is None: self._ds = get_testdata_file(self.name, read=True) return self._ds @property def number_of_frames(self) -> int: """Return the expected number of frames of pixel data""" value = self.ds.get("NumberOfFrames", 1) value = int(value) if isinstance(value, str) else value if value in (None, 0): value = 1 return value @property def meta(self) -> list[str | int]: """Return a list of pixel metadata.""" attr = [ self.ds.file_meta.TransferSyntaxUID, self.ds.BitsAllocated, self.ds.BitsStored, self.ds.Rows, self.ds.Columns, self.ds.SamplesPerPixel, self.number_of_frames, self.ds.PhotometricInterpretation, self.ds[self.pixel_keyword].VR, ] if self.pixel_keyword == "PixelData": attr.append(self.ds.PixelRepresentation) return attr @property def path(self) -> Path: return Path(get_testdata_file(self.name)) @property def pixel_keyword(self) -> str: """Return the keyword used by the pixel data.""" if "PixelData" in self.ds: return "PixelData" if "FloatPixelData" in self.ds: return "FloatPixelData" if "DoubleFloatPixelData" in self.ds: return "DoubleFloatPixelData" return "" @property def shape(self) -> tuple[int, ...]: """Return the expected array shape.""" shape = [] if self.number_of_frames > 1: shape.append(self.number_of_frames) shape += [self.ds.Rows, self.ds.Columns] if self.ds.SamplesPerPixel > 1: shape.append(self.ds.SamplesPerPixel) return tuple(shape) def __str__(self) -> str: """Return a string representation of the pixel reference.""" s = [ self.name, f" Transfer Syntax: {self.ds.file_meta.TransferSyntaxUID.name}", f" BitsAllocated: {self.ds.BitsAllocated}", f" BitsStored: {self.ds.BitsStored}", f" Rows: {self.ds.Rows}", f" Columns: {self.ds.Columns}", f" SamplesPerPixel: {self.ds.SamplesPerPixel}", f" NumberOfFrames: {self.number_of_frames}", f" PhotometricInterpretation: {self.ds.PhotometricInterpretation}", f" Pixel VR: {self.ds[self.pixel_keyword].VR}", ] if self.pixel_keyword == "PixelData": s.append(f" PixelRepresentation: {self.ds.PixelRepresentation}") return "\n".join(s) def test(self, arr: "np.ndarray", **kwargs: dict[str, Any]) -> None: self._test(self, arr, **kwargs) PIXEL_REFERENCE = {} # Little endian native datasets # EXPL: ExplicitVRLittleEndian # IMPL: ImplicitVRLittleEndian # DEFL: DeflatedExplicitVRLittleEndian # tsyntax, (bits allocated, stored), (frames, rows, cols, planes), VR, PI, pixel repr. # EXPL, (1, 1), (1, 512, 512, 1), OB, MONOCHROME2, 0 def test(ref, arr, **kwargs): assert (0, 1, 1) == tuple(arr[155, 180:183]) assert (1, 0, 1, 0) == tuple(arr[155, 310:314]) assert (0, 1, 1) == tuple(arr[254, 78:81]) assert (1, 0, 0, 1, 1, 0) == tuple(arr[254, 304:310]) EXPL_1_1_1F = PixelReference("liver_1frame.dcm", "u1", test) # EXPL, (1, 1), (3, 512, 512, 1), OB, MONOCHROME2, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) assert arr.max() == 1 assert arr.min() == 0 # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert 0 == frame[0][0] assert (0, 1, 1) == tuple(frame[155, 180:183]) assert (1, 0, 1, 0) == tuple(frame[155, 310:314]) assert (0, 1, 1) == tuple(frame[254, 78:81]) assert (1, 0, 0, 1, 1, 0) == tuple(frame[254, 304:310]) # Frame 2 if index in (None, 1): frame = arr if index == 1 else arr[1] assert 1 == frame[256][256] assert 0 == frame[146, :254].max() assert (0, 1, 1, 1, 1, 1, 0, 1) == tuple(frame[146, 253:261]) assert 0 == frame[146, 261:].max() assert 0 == frame[210, :97].max() assert 1 == frame[210, 97:350].max() assert 0 == frame[210, 350:].max() # Frame 3 if index in (None, 2): frame = arr if index == 2 else arr[2] assert 0 == frame[-1][-1] assert 0 == frame[147, :249].max() assert (0, 1, 0, 1, 1, 1) == tuple(frame[147, 248:254]) assert (1, 0, 1, 0, 1, 1) == tuple(frame[147, 260:266]) assert 0 == frame[147, 283:].max() assert 0 == frame[364, :138].max() assert (0, 1, 0, 1, 1, 0, 0, 1) == tuple(frame[364, 137:145]) assert (1, 0, 0, 1, 0) == tuple(frame[364, 152:157]) assert 0 == frame[364, 157:].max() EXPL_1_1_3F = PixelReference("liver.dcm", "u1", test) # Same image cropped from 512 x 512 to 510 x 511 such that frame boundaries are # no longer aligned with byte boundaries EXPL_1_1_3F_NONALIGNED = PixelReference("liver_nonbyte_aligned.dcm", "u1", test) # DEFL, (8, 8), (1, 512, 512, 1), OB, MONOCHROME2, 0 def test(ref, arr, **kwargs): assert 41 == arr[10].min() assert 255 == arr[10].max() assert (138, 65, 65, 65, 65, 35, 35, 35) == tuple(arr[300, 255:263]) assert 65 == arr[500].min() assert 219 == arr[500].max() DEFL_8_1_1F = PixelReference("image_dfl.dcm", "u1", test) # EXPL, (8, 8), (1, 600, 800, 1), OW, PALETTE COLOR, 0 def test(ref, arr, **kwargs): assert 244 == arr[0].min() == arr[0].max() assert (1, 246, 1) == tuple(arr[300, 491:494]) assert 0 == arr[-1].min() == arr[-1].max() EXPL_8_1_1F = PixelReference("OBXXXX1A.dcm", "u1", test) # EXPL, (8, 8), (2, 600, 800, 1), OW, PALETTE COLOR, "u1" def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert 244 == frame[0].min() == frame[0].max() assert (1, 246, 1) == tuple(frame[300, 491:494]) assert 0 == frame[-1].min() == frame[-1].max() # Frame 2 is frame 1 inverted if index in (None, 1): frame = arr if index == 1 else arr[1] assert 11 == frame[0].min() == frame[0].max() assert (254, 9, 254) == tuple(frame[300, 491:494]) assert 255 == frame[-1].min() == frame[-1].max() EXPL_8_1_2F = PixelReference("OBXXXX1A_2frame.dcm", "u1", test) # EXPL, (8, 8), (1, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): assert (255, 0, 0) == tuple(arr[5, 50, :]) assert (255, 128, 128) == tuple(arr[15, 50, :]) assert (0, 255, 0) == tuple(arr[25, 50, :]) assert (128, 255, 128) == tuple(arr[35, 50, :]) assert (0, 0, 255) == tuple(arr[45, 50, :]) assert (128, 128, 255) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (64, 64, 64) == tuple(arr[75, 50, :]) assert (192, 192, 192) == tuple(arr[85, 50, :]) assert (255, 255, 255) == tuple(arr[95, 50, :]) EXPL_8_3_1F = PixelReference("SC_rgb.dcm", "u1", test) # EXPL, (8, 8), (1, 3, 3, 3), OW, RGB, 0 def test(ref, arr, **kwargs): assert arr[0].tolist() == [ [166, 141, 52], [166, 141, 52], [166, 141, 52], ] assert arr[1].tolist() == [ [63, 87, 176], [63, 87, 176], [63, 87, 176], ] assert arr[2].tolist() == [ [158, 158, 158], [158, 158, 158], [158, 158, 158], ] EXPL_8_3_1F_ODD = PixelReference("SC_rgb_small_odd.dcm", "u1", test) # EXPL, (8, 8), (1, 100, 100, 3), OB, YBR_FULL_422, 0 def test(ref, arr, **kwargs): assert (76, 85, 255) == tuple(arr[5, 50, :]) assert (166, 106, 193) == tuple(arr[15, 50, :]) assert (150, 46, 20) == tuple(arr[25, 50, :]) assert (203, 86, 75) == tuple(arr[35, 50, :]) assert (29, 255, 107) == tuple(arr[45, 50, :]) assert (142, 193, 118) == tuple(arr[55, 50, :]) assert (0, 128, 128) == tuple(arr[65, 50, :]) assert (64, 128, 128) == tuple(arr[75, 50, :]) assert (192, 128, 128) == tuple(arr[85, 50, :]) assert (255, 128, 128) == tuple(arr[95, 50, :]) EXPL_8_3_1F_YBR422 = PixelReference("SC_ybr_full_422_uncompressed.dcm", "u1", test) # EXPL, (8, 8), (1, 100, 100, 3), OB, YBR_FULL, 0 def test(ref, arr, **kwargs): if kwargs.get("as_rgb"): assert (254, 0, 0) == tuple(arr[5, 50, :]) assert (255, 127, 127) == tuple(arr[15, 50, :]) assert (0, 255, 5) == tuple(arr[25, 50, :]) assert (129, 255, 129) == tuple(arr[35, 50, :]) assert (0, 0, 254) == tuple(arr[45, 50, :]) assert (128, 127, 255) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (64, 64, 64) == tuple(arr[75, 50, :]) assert (192, 192, 192) == tuple(arr[85, 50, :]) assert (255, 255, 255) == tuple(arr[95, 50, :]) else: assert (76, 85, 255) == tuple(arr[5, 50, :]) assert (166, 106, 193) == tuple(arr[15, 50, :]) assert (150, 46, 20) == tuple(arr[25, 50, :]) assert (203, 86, 75) == tuple(arr[35, 50, :]) assert (29, 255, 107) == tuple(arr[45, 50, :]) assert (142, 193, 118) == tuple(arr[55, 50, :]) assert (0, 128, 128) == tuple(arr[65, 50, :]) assert (64, 128, 128) == tuple(arr[75, 50, :]) assert (192, 128, 128) == tuple(arr[85, 50, :]) assert (255, 128, 128) == tuple(arr[95, 50, :]) EXPL_8_3_1F_YBR = PixelReference("SC_ybr_full_uncompressed.dcm", "u1", test) # EXPL, (8, 8), (2, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert (255, 0, 0) == tuple(frame[5, 50, :]) assert (255, 128, 128) == tuple(frame[15, 50, :]) assert (0, 255, 0) == tuple(frame[25, 50, :]) assert (128, 255, 128) == tuple(frame[35, 50, :]) assert (0, 0, 255) == tuple(frame[45, 50, :]) assert (128, 128, 255) == tuple(frame[55, 50, :]) assert (0, 0, 0) == tuple(frame[65, 50, :]) assert (64, 64, 64) == tuple(frame[75, 50, :]) assert (192, 192, 192) == tuple(frame[85, 50, :]) assert (255, 255, 255) == tuple(frame[95, 50, :]) # Frame 2 is frame 1 inverted if index in (None, 1): frame = arr if index == 1 else arr[1] assert (0, 255, 255) == tuple(frame[5, 50, :]) assert (0, 127, 127) == tuple(frame[15, 50, :]) assert (255, 0, 255) == tuple(frame[25, 50, :]) assert (127, 0, 127) == tuple(frame[35, 50, :]) assert (255, 255, 0) == tuple(frame[45, 50, :]) assert (127, 127, 0) == tuple(frame[55, 50, :]) assert (255, 255, 255) == tuple(frame[65, 50, :]) assert (191, 191, 191) == tuple(frame[75, 50, :]) assert (63, 63, 63) == tuple(frame[85, 50, :]) assert (0, 0, 0) == tuple(frame[95, 50, :]) EXPL_8_3_2F = PixelReference("SC_rgb_2frame.dcm", "u1", test) # IMPL, (8, 8), (1, 256, 256, 3), OW, RGB, 0 def test(ref, arr, **kwargs): assert arr[29, 77:81].tolist() == [ [240, 243, 246], [214, 210, 213], [150, 134, 134], [244, 244, 244], ] assert arr[224:227, 253].tolist() == [ [231, 236, 238], [190, 175, 178], [215, 200, 202], ] IMPL_08_08_3_0_1F_RGB = PixelReference("SC_rgb_jpeg_dcmd.dcm", "u1", test) # EXPL, (16, 16), (1, 128, 128, 1), OW, MONOCHROME2, 1 def test(ref, arr, **kwargs): assert arr[24, 36:40].tolist() == [520, 802, 930, 1008] assert arr[40:45, 40].tolist() == [1138, 1165, 1113, 1088, 1072] EXPL_16_16_1F = PixelReference("CT_small.dcm", "i2", test) # IMPL, (16, 16), (1, 64, 64, 1), OW, MONOCHROME2, 1 def test(ref, arr, **kwargs): assert (422, 319, 361) == tuple(arr[0, 31:34]) assert (366, 363, 322) == tuple(arr[31, :3]) assert (1369, 1129, 862) == tuple(arr[-1, -3:]) # Last pixel assert 862 == arr[-1, -1] IMPL_16_1_1F = PixelReference("MR_small_implicit.dcm", "i2", test) # EXPB, (16, 12), (10, 64, 64, 1), OW, MONOCHROME2, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert (206, 197, 159) == tuple(frame[0, 31:34]) assert (49, 78, 128) == tuple(frame[31, :3]) assert (362, 219, 135) == tuple(frame[-1, -3:]) # Frame 5 if index in (None, 4): frame = arr if index == 4 else arr[4] assert (67, 82, 44) == tuple(frame[0, 31:34]) assert (37, 41, 17) == tuple(frame[31, :3]) assert (225, 380, 355) == tuple(frame[-1, -3:]) # Frame 10 if index in (None, 9): frame = arr if index == 9 else arr[9] assert (72, 86, 69) == tuple(frame[0, 31:34]) assert (25, 4, 9) == tuple(frame[31, :3]) assert (227, 300, 147) == tuple(frame[-1, -3:]) EXPB_16_1_10F = PixelReference("emri_small_big_endian.dcm", ">u2", test) # EXPB, (16, 16), (1, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): assert (65535, 0, 0) == tuple(arr[5, 50, :]) assert (65535, 32896, 32896) == tuple(arr[15, 50, :]) assert (0, 65535, 0) == tuple(arr[25, 50, :]) assert (32896, 65535, 32896) == tuple(arr[35, 50, :]) assert (0, 0, 65535) == tuple(arr[45, 50, :]) assert (32896, 32896, 65535) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (16448, 16448, 16448) == tuple(arr[75, 50, :]) assert (49344, 49344, 49344) == tuple(arr[85, 50, :]) assert (65535, 65535, 65535) == tuple(arr[95, 50, :]) EXPB_16_3_1F = PixelReference("SC_rgb_expb_16bit.dcm", ">u2", test) # EXPB, (16, 16), (2, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert (65535, 0, 0) == tuple(frame[5, 50, :]) assert (65535, 32896, 32896) == tuple(frame[15, 50, :]) assert (0, 65535, 0) == tuple(frame[25, 50, :]) assert (32896, 65535, 32896) == tuple(frame[35, 50, :]) assert (0, 0, 65535) == tuple(frame[45, 50, :]) assert (32896, 32896, 65535) == tuple(frame[55, 50, :]) assert (0, 0, 0) == tuple(frame[65, 50, :]) assert (16448, 16448, 16448) == tuple(frame[75, 50, :]) assert (49344, 49344, 49344) == tuple(frame[85, 50, :]) assert (65535, 65535, 65535) == tuple(frame[95, 50, :]) # Frame 2 is frame 1 inverted if index in (None, 1): frame = arr if index == 1 else arr[1] assert (0, 65535, 65535) == tuple(frame[5, 50, :]) assert (0, 32639, 32639) == tuple(frame[15, 50, :]) assert (65535, 0, 65535) == tuple(frame[25, 50, :]) assert (32639, 0, 32639) == tuple(frame[35, 50, :]) assert (65535, 65535, 0) == tuple(frame[45, 50, :]) assert (32639, 32639, 0) == tuple(frame[55, 50, :]) assert (65535, 65535, 65535) == tuple(frame[65, 50, :]) assert (49087, 49087, 49087) == tuple(frame[75, 50, :]) assert (16191, 16191, 16191) == tuple(frame[85, 50, :]) assert (0, 0, 0) == tuple(frame[95, 50, :]) EXPB_16_3_2F = PixelReference("SC_rgb_expb_16bit_2frame.dcm", ">u2", test) # EXPB, (32, 32), (1, 10, 10, 1), OW, MONOCHROME2, 0 def test(ref, arr, **kwargs): assert (1249000, 1249000, 1250000) == tuple(arr[0, :3]) assert (1031000, 1029000, 1027000) == tuple(arr[4, 3:6]) assert (803000, 801000, 798000) == tuple(arr[-1, -3:]) EXPB_32_1_1F = PixelReference("rtdose_expb_1frame.dcm", ">u4", test) # EXPB, (32, 32), (15, 10, 10, 1), OW, MONOCHROME2, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert (1249000, 1249000, 1250000) == tuple(frame[0, :3]) assert (1031000, 1029000, 1027000) == tuple(frame[4, 3:6]) assert (803000, 801000, 798000) == tuple(frame[-1, -3:]) # Frame 8 if index in (None, 7): frame = arr if index == 7 else arr[7] assert (1253000, 1253000, 1249000) == tuple(frame[0, :3]) assert (1026000, 1023000, 1022000) == tuple(frame[4, 3:6]) assert (803000, 803000, 803000) == tuple(frame[-1, -3:]) # Frame 15 if index in (None, 14): frame = arr if index == 14 else arr[14] assert (1249000, 1250000, 1251000) == tuple(frame[0, :3]) assert (1031000, 1031000, 1031000) == tuple(frame[4, 3:6]) assert (801000, 800000, 799000) == tuple(frame[-1, -3:]) EXPB_32_1_15F = PixelReference("rtdose_expb.dcm", ">u4", test) # EXPB, (32, 32), (1, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): assert (4294967295, 0, 0) == tuple(arr[5, 50, :]) assert (4294967295, 2155905152, 2155905152) == tuple(arr[15, 50, :]) assert (0, 4294967295, 0) == tuple(arr[25, 50, :]) assert (2155905152, 4294967295, 2155905152) == tuple(arr[35, 50, :]) assert (0, 0, 4294967295) == tuple(arr[45, 50, :]) assert (2155905152, 2155905152, 4294967295) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (1077952576, 1077952576, 1077952576) == tuple(arr[75, 50, :]) assert (3233857728, 3233857728, 3233857728) == tuple(arr[85, 50, :]) assert (4294967295, 4294967295, 4294967295) == tuple(arr[95, 50, :]) EXPB_32_3_1F = PixelReference("SC_rgb_expb_32bit.dcm", ">u4", test) # EXPB, (32, 32), (2, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert (4294967295, 0, 0) == tuple(frame[5, 50, :]) assert (4294967295, 2155905152, 2155905152) == tuple(frame[15, 50, :]) assert (0, 4294967295, 0) == tuple(frame[25, 50, :]) assert (2155905152, 4294967295, 2155905152) == tuple(frame[35, 50, :]) assert (0, 0, 4294967295) == tuple(frame[45, 50, :]) assert (2155905152, 2155905152, 4294967295) == tuple(frame[55, 50, :]) assert (0, 0, 0) == tuple(frame[65, 50, :]) assert (1077952576, 1077952576, 1077952576) == tuple(frame[75, 50, :]) assert (3233857728, 3233857728, 3233857728) == tuple(frame[85, 50, :]) assert (4294967295, 4294967295, 4294967295) == tuple(frame[95, 50, :]) # Frame 2 is frame 1 inverted if index in (None, 1): frame = arr if index == 1 else arr[1] assert (0, 4294967295, 4294967295) == tuple(frame[5, 50, :]) assert (0, 2139062143, 2139062143) == tuple(frame[15, 50, :]) assert (4294967295, 0, 4294967295) == tuple(frame[25, 50, :]) assert (2139062143, 0, 2139062143) == tuple(frame[35, 50, :]) assert (4294967295, 4294967295, 0) == tuple(frame[45, 50, :]) assert (2139062143, 2139062143, 0) == tuple(frame[55, 50, :]) assert (4294967295, 4294967295, 4294967295) == tuple(frame[65, 50, :]) assert (3217014719, 3217014719, 3217014719) == tuple(frame[75, 50, :]) assert (1061109567, 1061109567, 1061109567) == tuple(frame[85, 50, :]) assert (0, 0, 0) == tuple(frame[95, 50, :]) EXPB_32_3_2F = PixelReference("SC_rgb_expb_32bit_2frame.dcm", ">u4", test) PIXEL_REFERENCE[ExplicitVRBigEndian] = [ EXPB_1_1_1F, EXPB_1_1_3F, EXPB_8_1_1F, EXPB_8_1_2F, EXPB_8_3_1F, EXPB_8_3_1F_ODD, EXPB_8_8_3_1F_RGB, EXPB_8_3_2F, EXPB_16_1_1F, EXPB_16_1_10F, EXPB_16_3_1F, EXPB_16_3_2F, EXPB_32_1_1F, EXPB_32_1_15F, EXPB_32_3_1F, EXPB_32_3_2F, ] # RLE Lossless # RLE: RLELossless # tsyntax, (bits allocated, stored), (frames, rows, cols, planes), VR, PI, pixel repr. # RLE, (8, 8), (1, 600, 800, 1), OB, PALETTE COLOR, 0 def test(ref, arr, **kwargs): assert arr[0].min() == arr[0].max() == 244 assert tuple(arr[300, 491:494]) == (1, 246, 1) assert arr[-1].min() == arr[-1].max() == 0 RLE_8_1_1F = PixelReference("OBXXXX1A_rle.dcm", "u1", test) # RLE, (8, 8), (2, 600, 800, 1), OB, PALETTE COLOR, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) if index in (None, 0): frame = arr if index == 0 else arr[0] assert 244 == frame[0].min() == frame[0].max() == 244 assert tuple(frame[300, 491:494]) == (1, 246, 1) assert frame[-1].min() == frame[-1].max() == 0 # Frame 2 is frame 1 inverted if index in (None, 1): frame = arr if index == 1 else arr[1] assert 11 == frame[0].min() == frame[0].max() assert tuple(frame[300, 491:494]) == (254, 9, 254) assert frame[-1].min() == frame[-1].max() == 255 RLE_8_1_2F = PixelReference("OBXXXX1A_rle_2frame.dcm", "u1", test) # RLE, (8, 8), (1, 100, 100, 3), OB, PALETTE COLOR, 0 def test(ref, arr, **kwargs): assert tuple(arr[5, 50, :]) == (255, 0, 0) assert tuple(arr[15, 50, :]) == (255, 128, 128) assert tuple(arr[25, 50, :]) == (0, 255, 0) assert tuple(arr[35, 50, :]) == (128, 255, 128) assert tuple(arr[45, 50, :]) == (0, 0, 255) assert tuple(arr[55, 50, :]) == (128, 128, 255) assert tuple(arr[65, 50, :]) == (0, 0, 0) assert tuple(arr[75, 50, :]) == (64, 64, 64) assert tuple(arr[85, 50, :]) == (192, 192, 192) assert tuple(arr[95, 50, :]) == (255, 255, 255) RLE_8_3_1F = PixelReference("SC_rgb_rle.dcm", "u1", test) # RLE, (8, 8), (2, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): index = kwargs.get("index", None) # Frame 1 if index in (None, 0): frame = arr if index == 0 else arr[0] assert tuple(frame[5, 50, :]) == (255, 0, 0) assert tuple(frame[15, 50, :]) == (255, 128, 128) assert tuple(frame[25, 50, :]) == (0, 255, 0) assert tuple(frame[35, 50, :]) == (128, 255, 128) assert tuple(frame[45, 50, :]) == (0, 0, 255) assert tuple(frame[55, 50, :]) == (128, 128, 255) assert tuple(frame[65, 50, :]) == (0, 0, 0) assert tuple(frame[75, 50, :]) == (64, 64, 64) assert tuple(frame[85, 50, :]) == (192, 192, 192) assert tuple(frame[95, 50, :]) == (255, 255, 255) # Frame 2 is frame 1 inverted if index in (None, 1): frame = arr if index == 1 else arr[1] assert tuple(frame[5, 50, :]) == (0, 255, 255) assert tuple(frame[15, 50, :]) == (0, 127, 127) assert tuple(frame[25, 50, :]) == (255, 0, 255) assert tuple(frame[35, 50, :]) == (127, 0, 127) assert tuple(frame[45, 50, :]) == (255, 255, 0) assert tuple(frame[55, 50, :]) == (127, 127, 0) assert tuple(frame[65, 50, :]) == (255, 255, 255) assert tuple(frame[75, 50, :]) == (191, 191, 191) assert tuple(frame[85, 50, :]) == (63, 63, 63) assert tuple(frame[95, 50, :]) == (0, 0, 0) RLE_8_3_2F = PixelReference("SC_rgb_rle_2frame.dcm", "u1", test) # RLE, (16, 16), (1, 64, 64, 1), OB, MONOCHROME2, 1 def test(ref, arr, **kwargs): assert tuple(arr[0, 31:34]) == (422, 319, 361) assert tuple(arr[31, :3]) == (366, 363, 322) assert tuple(arr[-1, -3:]) == (1369, 1129, 862) RLE_16_1_1F = PixelReference("MR_small_RLE.dcm", " JP2 header present def test(ref, arr, **kwargs): # Decoding error with pillow, OK in gdcm, pylibjpeg assert tuple(arr[45, 140]) == (223, 32, 32) assert tuple(arr[46, 140]) == (255, 0, 0) assert tuple(arr[350, 195]) == (128, 128, 128) J2KR_08_08_3_0_1F_YBR_RCT = PixelReference("GDCMJ2K_TextGBR.dcm", "u1", test) # J2KI, (8, 8), (1, 100, 100, 3), OB, RGB, 0 def test(ref, arr, **kwargs): ref = get_testdata_file("SC_rgb_gdcm2k_uncompressed.dcm", read=True).pixel_array assert np.array_equal(arr, ref) J2KI_08_08_3_0_1F_RGB = PixelReference("SC_rgb_gdcm_KY.dcm", "u1", test) # J2KI, (8, 8), (1, 480, 640, 3), OB, YBR_ICT, 0 def test(ref, arr, **kwargs): ref = get_testdata_file("US1_UNCI.dcm", read=True).pixel_array assert np.allclose(arr, ref, atol=1) J2KI_08_08_3_0_1F_YBR_ICT = PixelReference("US1_J2KI.dcm", "u1", test) # J2KI, (16, 10), (1, 1760, 1760, 1), OB, MONOCHROME1, 0 def test(ref, arr, **kwargs): ref = get_testdata_file("RG3_UNCI.dcm", read=True).pixel_array assert np.allclose(arr, ref, atol=1) J2KI_16_10_1_0_1F_M1 = PixelReference("RG3_J2KI.dcm", " 1 bit depth ((0, 0, 0), 1, (0, 0, 0, None)), ((1, 1, 1), 1, (0.125, 1, 1, None)), # 1 bit -> 1/8 byte ((1, 1, 3), 1, (0.375, 1, 3, None)), # 3 bits -> 3/8 byte ((1, 3, 3), 1, (1.125, 2, 9, None)), # 9 bits -> 1 1/8 bytes ((2, 2, 1), 1, (0.5, 1, 4, None)), # 4 bits -> 1/2 byte ((2, 4, 1), 1, (1, 1, 8, None)), # 8 bits -> 1 byte ((3, 3, 1), 1, (1.125, 2, 9, None)), # 9 bits -> 1 1/8 bytes ((512, 512, 1), 1, (32768, 32768, 262144, None)), # Typical length ((512, 512, 3), 1, (98304, 98304, 786432, None)), ((0, 0, 0), 8, (0, 0, 0, None)), ((1, 1, 1), 8, (1, 1, 1, None)), # Odd length ((9, 1, 1), 8, (9, 9, 9, None)), # Odd length ((1, 2, 1), 8, (2, 2, 2, None)), # Even length ((512, 512, 1), 8, (262144, 262144, 262144, None)), ((512, 512, 3), 8, (786432, 786432, 786432, 524288)), ((0, 0, 0), 16, (0, 0, 0, None)), ((1, 1, 1), 16, (2, 2, 1, None)), # 16 bit data can't be odd length ((1, 2, 1), 16, (4, 4, 2, None)), ((512, 512, 1), 16, (524288, 524288, 262144, None)), ((512, 512, 3), 16, (1572864, 1572864, 786432, 1048576)), ((0, 0, 0), 32, (0, 0, 0, None)), ((1, 1, 1), 32, (4, 4, 1, None)), # 32 bit data can't be odd length ((1, 2, 1), 32, (8, 8, 2, None)), ((512, 512, 1), 32, (1048576, 1048576, 262144, None)), ((512, 512, 3), 32, (3145728, 3145728, 786432, 2097152)), ] class TestRunnerBase: """Tests for RunnerBase""" def test_init(self): """Test initial creation.""" runner = RunnerBase(RLELossless) assert runner.transfer_syntax == RLELossless assert runner.options == {"transfer_syntax_uid": RLELossless} assert runner._src_type == "UNDEFINED" def test_del_option(self): """Test for del_option()""" runner = RunnerBase(RLELossless) msg = "Deleting 'transfer_syntax_uid' is not allowed" with pytest.raises(ValueError, match=msg): runner.del_option("transfer_syntax_uid") # No exception if deleting non-existent option assert runner.get_option("foo") is None runner.del_option("foo") runner.set_option("as_rgb", True) assert runner.get_option("as_rgb") is not None runner.del_option("as_rgb") assert runner.get_option("as_rgb") is None def test_option_properties(self): """Tests for properties derived from options.""" runner = RunnerBase(ExplicitVRLittleEndian) attrs = [ "bits_allocated", "bits_stored", "columns", "photometric_interpretation", "pixel_representation", "rows", "samples_per_pixel", ] for attr in attrs: msg = f"No value for '{attr}' has been set" with pytest.raises(AttributeError, match=msg): getattr(runner, attr) runner.set_option(attr, 0) assert getattr(runner, attr) == 0 assert runner.get_option(attr) == 0 runner.del_option(attr) with pytest.raises(AttributeError, match=msg): getattr(runner, attr) # pixel_keyword not deletable msg = "No value for 'pixel_keyword' has been set" with pytest.raises(AttributeError, match=msg): runner.pixel_keyword runner.set_option("pixel_keyword", 0) assert runner.pixel_keyword == 0 # number_of_frames defaults to 1 if 0 or None msg = "No value for 'number_of_frames' has been set" with pytest.raises(AttributeError, match=msg): runner.number_of_frames msg = r"A value of '0' for \(0028,0008\) 'Number of Frames' is invalid" with pytest.warns(UserWarning, match=msg): runner.set_option("number_of_frames", 0) assert runner.number_of_frames == 1 msg = r"A value of 'None' for \(0028,0008\) 'Number of Frames' is invalid" with pytest.warns(UserWarning, match=msg): runner.set_option("number_of_frames", None) assert runner.number_of_frames == 1 assert runner.get_option("number_of_frames") == 1 runner.del_option("number_of_frames") msg = "No value for 'number_of_frames' has been set" with pytest.raises(AttributeError, match=msg): runner.number_of_frames # extended_offsets defaults to None if not set assert runner.extended_offsets is None runner.set_option("extended_offsets", 0) assert runner.extended_offsets == 0 def test_planar_configuration(self): """Tests for 'planar_configuration' option.""" # planar_configuration required for native msg = "No value for 'planar_configuration' has been set" runner = RunnerBase(ExplicitVRLittleEndian) with pytest.raises(AttributeError, match=msg): runner.planar_configuration runner.set_option("planar_configuration", 0) assert runner.planar_configuration == 0 runner.set_option("planar_configuration", 1) assert runner.planar_configuration == 1 runner.del_option("planar_configuration") with pytest.raises(AttributeError, match=msg): runner.planar_configuration # planar_configuration for encapsulated is 0 by default, otherwise set value runner = RunnerBase(JPEGBaseline8Bit) assert runner.planar_configuration == 0 runner.set_option("planar_configuration", 1) assert runner.planar_configuration == 1 runner.set_option("planar_configuration", 0) assert runner.planar_configuration == 0 runner.set_option("planar_configuration", 1) runner.del_option("planar_configuration") assert runner.planar_configuration == 0 def test_set_number_of_frames(self): """Test setting 'number_of_frames'""" runner = RunnerBase(RLELossless) msg = r"A value of 'None' for \(0028,0008\) 'Number of Frames' is invalid" with pytest.warns(UserWarning, match=msg): runner.set_option("number_of_frames", None) assert runner.number_of_frames == 1 msg = r"A value of '0' for \(0028,0008\) 'Number of Frames' is invalid" with pytest.warns(UserWarning, match=msg): runner.set_option("number_of_frames", 0) assert runner.number_of_frames == 1 runner.set_option("number_of_frames", 10) assert runner.number_of_frames == 10 with pytest.warns(UserWarning, match=msg): runner.set_option("number_of_frames", "0") assert runner.number_of_frames == 1 runner.set_option("number_of_frames", "10") assert runner.number_of_frames == 10 def test_set_photometric_interpretation(self): """Test setting 'photometric_interpretation'""" runner = RunnerBase(RLELossless) # Known photometric interpretations converted to enum instance runner.set_option("photometric_interpretation", "RGB") assert runner.photometric_interpretation == "RGB" assert isinstance(runner.photometric_interpretation, PI) runner.set_option("photometric_interpretation", "PALETTE COLOR") assert runner.photometric_interpretation == "PALETTE COLOR" assert isinstance(runner.photometric_interpretation, PI) # Unknown kept as str runner.set_option("photometric_interpretation", "FOO") assert runner.photometric_interpretation == "FOO" assert not isinstance(runner.photometric_interpretation, PI) def test_options(self): """Test the options property returns a copy of the options.""" runner = RunnerBase(RLELossless) assert runner.options is runner._opts def test_validate_options(self): """Tests for validate_options()""" # Generic option validation runner = RunnerBase(ExplicitVRLittleEndian) runner.set_option("pixel_keyword", "PixelData") msg = r"Missing required element: \(0028,0100\) 'Bits Allocated'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("bits_allocated", -1) msg = ( r"A \(0028,0100\) 'Bits Allocated' value of '-1' is invalid, it " r"must be 1 or a multiple of 8 and in the range \(1, 64\)" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("bits_allocated", 4) msg = ( r"A \(0028,0100\) 'Bits Allocated' value of '4' is invalid, it " r"must be 1 or a multiple of 8 and in the range \(1, 64\)" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("bits_allocated", 8) msg = r"Missing required element: \(0028,0101\) 'Bits Stored'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("bits_stored", -1) msg = ( r"A \(0028,0101\) 'Bits Stored' value of '-1' is invalid, it must " r"be in the range \(1, 64\) and no greater than the \(0028,0100\) " "'Bits Allocated' value of '8'" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("bits_stored", 10) msg = ( r"A \(0028,0101\) 'Bits Stored' value of '10' is invalid, it must " r"be in the range \(1, 64\) and no greater than the \(0028,0100\) " "'Bits Allocated' value of '8'" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("bits_stored", 8) msg = r"Missing required element: \(0028,0011\) 'Columns'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("columns", -1) msg = ( r"A \(0028,0011\) 'Columns' value of '-1' is invalid, it must be " r"in the range \(1, 65535\)" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("columns", 8) msg = r"Missing required element: \(0028,0004\) 'Photometric Interpretation'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("photometric_interpretation", -1) msg = r"\(0028,0004\) 'Photometric Interpretation' value '-1'" with pytest.raises(ValueError, match=msg): runner._validate_options() runner.del_option("pixel_keyword") runner.set_option("photometric_interpretation", PI.RGB) msg = "No value for 'pixel_keyword' has been set" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("pixel_keyword", "foo") msg = "Unknown 'pixel_keyword' value 'foo'" with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("pixel_keyword", "PixelData") msg = r"Missing required element: \(0028,0103\) 'Pixel Representation'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("pixel_representation", -1) msg = ( r"A \(0028,0103\) 'Pixel Representation' value of '-1' is invalid, " "it must be 0 or 1" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("pixel_representation", 0) msg = r"Missing required element: \(0028,0010\) 'Rows'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("rows", -1) msg = ( r"A \(0028,0010\) 'Rows' value of '-1' is invalid, it must be " r"in the range \(1, 65535\)" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("rows", 10) msg = r"Missing required element: \(0028,0002\) 'Samples per Pixel'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("samples_per_pixel", -1) msg = ( r"A \(0028,0002\) 'Samples per Pixel' value of '-1' is invalid, it " "must be 1 or 3" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("samples_per_pixel", 3) msg = r"Missing required element: \(0028,0006\) 'Planar Configuration'" with pytest.raises(AttributeError, match=msg): runner._validate_options() runner.set_option("planar_configuration", -1) msg = ( r"A \(0028,0006\) 'Planar Configuration' value of '-1' is invalid, " "it must be 0 or 1" ) with pytest.raises(ValueError, match=msg): runner._validate_options() runner.set_option("planar_configuration", 1) # Number of Frames may be conditionally absent runner.set_option("number_of_frames", -1) msg = ( r"A \(0028,0008\) 'Number of Frames' value of '-1' is invalid, it " "must be greater than or equal to 1" ) with pytest.raises(ValueError, match=msg): runner._validate_options() def test_validate_raises(self): """Test validate() raises exception.""" runner = RunnerBase(RLELossless) msg = r"RunnerBase.validate\(\) has not been implemented" with pytest.raises(NotImplementedError, match=msg): runner.validate() def test_set_options_ds(self): """Test _set_options_ds()""" ds = RLE_16_1_10F.ds runner = RunnerBase(RLELossless) runner._set_options_ds(ds) assert runner.samples_per_pixel == ds.SamplesPerPixel assert runner.photometric_interpretation == ds.PhotometricInterpretation assert runner.number_of_frames == ds.NumberOfFrames assert runner.rows == ds.Rows assert runner.columns == ds.Columns assert runner.bits_allocated == ds.BitsAllocated assert runner.bits_stored == ds.BitsStored assert runner.pixel_representation == ds.PixelRepresentation ds = EXPL_8_3_1F_YBR.ds assert "NumberOfFrames" not in ds runner = RunnerBase(RLELossless) runner._set_options_ds(ds) assert runner.samples_per_pixel == ds.SamplesPerPixel assert runner.photometric_interpretation == ds.PhotometricInterpretation assert runner.number_of_frames == 1 assert runner.rows == ds.Rows assert runner.columns == ds.Columns assert runner.bits_allocated == ds.BitsAllocated assert runner.bits_stored == ds.BitsStored assert runner.pixel_representation == ds.PixelRepresentation assert runner.planar_configuration == ds.PlanarConfiguration ds = dcmread(RLE_16_1_10F.path) ds.ExtendedOffsetTable = b"\x00\x01\x02\x03" ds.ExtendedOffsetTableLengths = b"\x00\x01\x02\x04" runner = RunnerBase(RLELossless) runner._set_options_ds(ds) assert runner.extended_offsets == (b"\x00\x01\x02\x03", b"\x00\x01\x02\x04") def test_src_type_properties(self): """Test is_array, is_binary, is_buffer and is_dataset""" runner = RunnerBase(RLELossless) runner._src_type = "BinaryIO" assert runner.is_binary assert not runner.is_buffer assert not runner.is_dataset assert not runner.is_array runner._src_type = "Buffer" assert not runner.is_binary assert runner.is_buffer assert not runner.is_dataset assert not runner.is_array runner._src_type = "Dataset" assert not runner.is_binary assert not runner.is_buffer assert runner.is_dataset assert not runner.is_array runner._src_type = "Array" assert not runner.is_binary assert not runner.is_buffer assert not runner.is_dataset assert runner.is_array @pytest.mark.parametrize("shape, bits, length", REFERENCE_FRAME_LENGTHS) def test_frame_length(self, shape, bits, length): """Test frame_length(unit='bytes').""" opts = { "photometric_interpretation": PI.MONOCHROME1, "rows": shape[0], "columns": shape[1], "bits_allocated": bits, "samples_per_pixel": shape[2], } native_runner = RunnerBase(ExplicitVRLittleEndian) native_runner.set_options(**opts) encaps_runner = RunnerBase(RLELossless) encaps_runner.set_options(**opts) assert length[0] == native_runner.frame_length(unit="bytes") assert length[2] == native_runner.frame_length(unit="pixels") assert length[1] == encaps_runner.frame_length(unit="bytes") assert length[2] == encaps_runner.frame_length(unit="pixels") if shape[2] == 3 and bits != 1: native_runner.set_option("photometric_interpretation", PI.YBR_FULL_422) encaps_runner.set_option("photometric_interpretation", PI.YBR_FULL_422) assert length[3] == native_runner.frame_length(unit="bytes") assert length[1] == encaps_runner.frame_length(unit="bytes") class TestCoderBase: """Tests for CoderBase""" def test_init(self): """Test creating a new CoderBase""" coder = CoderBase(ExplicitVRLittleEndian, decoder=True) assert coder.UID == ExplicitVRLittleEndian assert not coder.is_encapsulated assert coder.is_native assert {} == coder._available assert {} == coder._unavailable assert coder.missing_dependencies == [] assert coder._validate_plugins() == {} def test_add_plugin(self): """Test add_plugin()""" coder = CoderBase(RLELossless, decoder=True) coder.add_plugin("foo", ("pydicom.pixels.decoders.rle", "_decode_frame")) assert coder.is_available msg = "'CoderBase' already has a plugin named 'foo'" with pytest.raises(ValueError, match=msg): coder.add_plugin("foo", ("pydicom.pixels.decoders.rle", "_decode_frame")) coder = CoderBase(RLELossless, decoder=False) coder.add_plugin("foo", ("pydicom.pixels.decoders.rle", "_decode_frame")) assert coder.is_available msg = "'CoderBase' already has a plugin named 'foo'" with pytest.raises(ValueError, match=msg): coder.add_plugin("foo", ("pydicom.pixels.decoders.rle", "_decode_frame")) @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_add_plugin_unavailable(self): """Test adding an unavailable plugin.""" coder = CoderBase(ExplicitVRLittleEndian, decoder=True) # UID isn't supported by decoder msg = "The 'foo' plugin doesn't support 'Explicit VR Little Endian'" with pytest.raises(ValueError, match=msg): coder.add_plugin("foo", ("pydicom.pixels.decoders.rle", "_decode_frame")) # UID is supported but dependencies not met coder = CoderBase(JPEGLSLossless, decoder=True) coder.add_plugin("foo", ("pydicom.pixels.decoders.pylibjpeg", "_decode_frame")) assert "foo" not in coder._available assert "foo" in coder._unavailable coder.remove_plugin("foo") assert {} == coder._unavailable # UID isn't supported by encoder coder = CoderBase(ExplicitVRLittleEndian, decoder=False) with pytest.raises(ValueError, match=msg): coder.add_plugin( "foo", ("pydicom.pixels.encoders.pyjpegls", "_encode_frame") ) # UID is supported but dependencies not met coder = CoderBase(JPEGLSLossless, decoder=False) coder.add_plugin("foo", ("pydicom.pixels.encoders.pyjpegls", "_encode_frame")) assert "foo" not in coder._available assert "foo" in coder._unavailable coder.remove_plugin("foo") assert {} == coder._unavailable def test_add_plugin_module_import_failure(self): """Test a module import failure when adding a plugin.""" coder = CoderBase(RLELossless, decoder=True) msg = r"No module named 'badpath'" with pytest.raises(ModuleNotFoundError, match=msg): coder.add_plugin("foo", ("badpath", "_encode_frame")) assert {} == coder._available assert {} == coder._unavailable def test_add_plugin_function_missing(self): """Test decoding function missing when adding a plugin.""" coder = CoderBase(RLELossless, decoder=True) msg = ( r"module 'pydicom.pixels.decoders.rle' has no attribute 'bad_function_name'" ) with pytest.raises(AttributeError, match=msg): coder.add_plugin( "foo", ("pydicom.pixels.decoders.rle", "bad_function_name") ) assert {} == coder._available assert {} == coder._unavailable def test_remove_plugin(self): """Test removing a plugin.""" coder = CoderBase(RLELossless, decoder=True) coder.add_plugin("foo", ("pydicom.pixels.decoders.rle", "_decode_frame")) coder.add_plugin("bar", ("pydicom.pixels.decoders.rle", "_decode_frame")) assert "foo" in coder._available assert "bar" in coder._available assert {} == coder._unavailable assert coder.is_available coder.remove_plugin("foo") assert "bar" in coder._available assert coder.is_available coder.remove_plugin("bar") assert {} == coder._available assert not coder.is_available msg = r"Unable to remove 'foo', no such plugin" with pytest.raises(ValueError, match=msg): coder.remove_plugin("foo") def test_missing_dependencies(self): """Test the required decoder being unavailable.""" coder = CoderBase(RLELossless, decoder=True) coder._unavailable["foo"] = () s = coder.missing_dependencies assert "foo - plugin indicating it is unavailable" == s[0] coder._unavailable["foo"] = ("bar",) s = coder.missing_dependencies assert "foo - requires bar" == s[0] coder._unavailable["foo"] = ("numpy", "pylibjpeg") s = coder.missing_dependencies assert "foo - requires numpy and pylibjpeg" == s[0] def test_validate_plugins(self): """Tests for _validate_plugins()""" coder = CoderBase(ExplicitVRLittleEndian, decoder=True) assert coder._validate_plugins() == {} coder = CoderBase(RLELossless, decoder=True) msg = ( "Unable to decompress 'RLE Lossless' pixel data because all plugins " "are missing dependencies:" ) with pytest.raises(RuntimeError, match=msg): coder._validate_plugins() msg = "No plugin named 'foo' has been added to 'RLELosslessCoderBase'" with pytest.raises(ValueError, match=msg): coder._validate_plugins("foo") coder._available["foo"] = 0 assert coder._validate_plugins() == {"foo": 0} assert coder._validate_plugins("foo") == {"foo": 0} coder._available = {} coder._unavailable["foo"] = ("numpy", "pylibjpeg", "gdcm") msg = ( "Unable to decompress 'RLE Lossless' pixel data because the specified " "plugin is missing dependencies:\n\tfoo - requires numpy, pylibjpeg and gdcm" ) with pytest.raises(RuntimeError, match=msg): coder._validate_plugins("foo") pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_base.py000066400000000000000000002157331515706620200237170ustar00rootroot00000000000000"""Tests for pydicom.pixels.decoder.base.""" from io import BytesIO import logging from math import ceil from struct import pack, unpack from sys import byteorder import pytest from pydicom import config, dcmread from pydicom.dataset import Dataset from pydicom.encaps import get_frame, generate_frames, encapsulate from pydicom.pixels import get_decoder from pydicom.pixels.common import PhotometricInterpretation as PI from pydicom.pixels.decoders import ExplicitVRLittleEndianDecoder from pydicom.pixels.decoders.base import DecodeRunner, Decoder from pydicom.pixels.processing import convert_color_space from pydicom.uid import ( ExplicitVRLittleEndian, ImplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, JPEGBaseline8Bit, RLELossless, SMPTEST211030PCMDigitalAudio, ) try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from .pixels_reference import ( EXPL_1_1_3F_NONALIGNED, PIXEL_REFERENCE, RLE_16_1_1F, RLE_16_1_10F, EXPL_16_1_10F, EXPL_8_3_1F_YBR, EXPL_8_3_1F_YBR422, EXPL_1_1_1F, EXPB_8_1_1F, ) RLE_REFERENCE = PIXEL_REFERENCE[RLELossless] class TestDecodeRunner: """Tests for DecodeRunner.""" def test_init(self): """Test initial creation.""" # Encapsulated transfer syntax - pixel_keyword set, view_only not set runner = DecodeRunner(RLELossless) assert runner.transfer_syntax == RLELossless assert runner.get_option("pixel_keyword") == "PixelData" assert runner.get_option("as_rgb") assert runner.get_option("view_only") is None # Native transfer syntax - pixel_keyword not set, view_only set runner = DecodeRunner(ExplicitVRLittleEndian) assert runner.transfer_syntax == ExplicitVRLittleEndian assert runner.get_option("pixel_keyword") is None assert runner.get_option("as_rgb") assert not runner.get_option("view_only") def test_del_option(self): """Test for del_option()""" runner = DecodeRunner(RLELossless) for name in ("transfer_syntax_uid", "pixel_keyword"): msg = f"Deleting '{name}' is not allowed" with pytest.raises(ValueError, match=msg): runner.del_option(name) def test_set_source_dataset(self): """Test setting runner source and options via dataset.""" runner = DecodeRunner(RLELossless) runner.set_source(RLE_16_1_1F.ds) assert runner.bits_allocated == 16 assert runner.bits_stored == 16 assert runner.columns == 64 assert runner.extended_offsets is None assert runner.number_of_frames == 1 assert runner.photometric_interpretation == PI.MONOCHROME2 assert runner.pixel_keyword == "PixelData" assert runner.pixel_representation == 1 assert runner.rows == 64 assert runner.samples_per_pixel == 1 assert runner.get_option("planar_configuration") is None ds = Dataset() ds.BitsAllocated = 32 ds.BitsStored = 24 ds.Columns = 10 ds.Rows = 8 ds.SamplesPerPixel = 3 ds.NumberOfFrames = "5" ds.FloatPixelData = None ds.PlanarConfiguration = 1 ds.ExtendedOffsetTable = b"\x00\x01" ds.ExtendedOffsetTableLengths = b"\x00\x02" ds.PhotometricInterpretation = "PALETTE COLOR" runner = DecodeRunner(RLELossless) runner.set_source(ds) assert runner.is_dataset assert runner.bits_allocated == 32 assert runner.bits_stored == 24 assert runner.columns == 10 assert runner.extended_offsets == (b"\x00\x01", b"\x00\x02") assert runner.number_of_frames == 5 assert runner.photometric_interpretation == PI.PALETTE_COLOR assert runner.pixel_keyword == "FloatPixelData" assert runner.get_option("pixel_representation") is None assert runner.rows == 8 assert runner.samples_per_pixel == 3 assert runner.planar_configuration == 1 del ds.ExtendedOffsetTable ds.SamplesPerPixel = 1 del ds.PlanarConfiguration del ds.FloatPixelData ds.DoubleFloatPixelData = None runner = DecodeRunner(RLELossless) runner.set_source(ds) assert runner.extended_offsets is None assert runner.pixel_keyword == "DoubleFloatPixelData" assert runner.get_option("planar_configuration") is None ds.PixelData = None msg = ( "One and only one of 'Pixel Data', 'Float Pixel Data' or " "'Double Float Pixel Data' may be present in the dataset" ) with pytest.raises(AttributeError, match=msg): runner.set_source(ds) del ds.PixelData del ds.DoubleFloatPixelData msg = ( "The dataset has no 'Pixel Data', 'Float Pixel Data' or 'Double " "Float Pixel Data' element, no pixel data to decode" ) with pytest.raises(AttributeError, match=msg): runner.set_source(ds) ds.file_meta = Dataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian msg = ( "The dataset's transfer syntax 'Explicit VR Little Endian' doesn't " "match the pixel data decoder" ) with pytest.raises(ValueError, match=msg): runner.set_source(ds) def test_str(self): """Test str(DecodeRunner)""" runner = DecodeRunner(RLELossless) runner.set_decoders({"foo": None}) assert str(runner) == ( "DecodeRunner for 'RLE Lossless'\n" "Options\n" " transfer_syntax_uid: 1.2.840.10008.1.2.5\n" " as_rgb: True\n" " allow_excess_frames: True\n" " pixel_keyword: PixelData\n" " correct_unused_bits: True\n" "Decoders\n" " foo" ) def test_test_for_be_swap(self): """Test test_for('be_swap_ow')""" runner = DecodeRunner(ExplicitVRBigEndian) with pytest.raises(ValueError, match=r"Unknown test 'foo'"): runner._test_for("foo") runner.set_option("bits_allocated", 8) runner.set_option("pixel_keyword", "PixelData") assert runner._test_for("be_swap_ow") is False runner.set_option("be_swap_ow", True) assert runner._test_for("be_swap_ow") is True runner.set_option("be_swap_ow", False) assert runner._test_for("be_swap_ow") is False runner.set_option("pixel_vr", "OW") assert runner._test_for("be_swap_ow") is True @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") def test_pixel_dtype_unsupported_raises(self): """Test unsupported dtypes raise exception.""" runner = DecodeRunner(RLELossless) runner.set_option("bits_allocated", 24) runner.set_option("pixel_representation", 0) msg = "The data type 'u3' needed to contain the pixel data" with pytest.raises(NotImplementedError, match=msg): runner.pixel_dtype @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_pixel_dtype_no_numpy_raises(self): """Tests exception raised if numpy not available.""" runner = DecodeRunner(RLELossless) msg = "NumPy is required for 'DecodeRunner.pixel_dtype'" with pytest.raises(ImportError, match=msg): runner.pixel_dtype @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") def test_pixel_dtype(self): """Test supported dtypes.""" reference = [ (1, 0, "u1"), (1, 1, "u1"), (8, 0, "u1"), (8, 1, "i1"), (16, 0, "u2"), (16, 1, "i2"), (32, 0, "u4"), (32, 1, "i4"), ] runner = DecodeRunner(RLELossless) for bits, pixel_repr, dtype in reference: runner.set_option("bits_allocated", bits) runner.set_option("pixel_representation", pixel_repr) # Correct for endianness of system ref_dtype = np.dtype(dtype) if not (byteorder == "little"): ref_dtype = ref_dtype.newbyteorder("S") assert ref_dtype == runner.pixel_dtype @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") def test_pixel_dtype_float(self): runner = DecodeRunner(ExplicitVRLittleEndian) runner.set_option("pixel_keyword", "FloatPixelData") assert runner.pixel_dtype == np.float32 runner.set_option("pixel_keyword", "DoubleFloatPixelData") assert runner.pixel_dtype == np.float64 @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") def test_pixel_dtype_byte_swapping(self): """Test that the endianness of the system is taken into account.""" # The main problem is that our testing environments are probably # all little endian, but we'll try our best runner = DecodeRunner(RLELossless) runner.set_option("bits_allocated", 16) runner.set_option("pixel_representation", 0) # < is little, = is native, > is big if byteorder == "little": assert runner.pixel_dtype.byteorder in ["<", "="] runner._opts["transfer_syntax_uid"] = ExplicitVRBigEndian assert runner.pixel_dtype.byteorder == ">" elif byteorder == "big": assert runner.pixel_dtype.byteorder == "<" runner._opts["transfer_syntax_uid"] = ExplicitVRBigEndian assert runner.pixel_dtype.byteorder in [">", "="] def test_validate_buffer(self): """Tests for validate_buffer()""" runner = DecodeRunner(RLELossless) # Padded runner.set_source(b"\x01\x02\x03\x00") runner.set_option("bits_allocated", 8) runner.set_option("rows", 1) runner.set_option("columns", 1) runner.set_option("samples_per_pixel", 3) runner.set_option("photometric_interpretation", "RGB") runner.set_option("number_of_frames", 1) msg = ( "The number of bytes of compressed pixel data matches the " "expected number for uncompressed data - check that the " "transfer syntax has been set correctly" ) with pytest.warns(UserWarning, match=msg): runner._validate_buffer() # Unpadded runner.set_source(b"\x01\x02\x03") with pytest.warns(UserWarning, match=msg): runner._validate_buffer() runner = DecodeRunner(ExplicitVRLittleEndian) runner.set_source(b"\x00\x00") runner.set_option("bits_allocated", 8) runner.set_option("rows", 1) runner.set_option("columns", 1) runner.set_option("samples_per_pixel", 3) runner.set_option("photometric_interpretation", "RGB") runner.set_option("number_of_frames", 1) # Actual length 2 is less than expected 3 msg = ( "The number of bytes of pixel data is less than expected " r"\(2 vs 4 bytes\) - the dataset may be corrupted, have an invalid " "group 0028 element value, or the transfer syntax may be incorrect" ) with pytest.raises(ValueError, match=msg): runner._validate_buffer() # Actual length 5 is greater than expected 3 (padding 2) runner.set_source(b"\x00" * 5) msg = ( "The pixel data is 5 bytes long, which indicates it " "contains 2 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): runner._validate_buffer() # YBR_FULL_422 but has unsubsampled length # expected 18 // 3 * 2 = 12, actual 18 runner.set_option("photometric_interpretation", "YBR_FULL_422") runner.set_option("rows", 2) runner.set_option("columns", 3) runner.set_source(b"\x00" * 18) msg = ( "The number of bytes of pixel data is a third larger than expected " r"\(18 vs 12 bytes\) which indicates the set \(0028,0004\) " r"'Photometric Interpretation' value of 'YBR_FULL_422' is " "incorrect and may need to be changed to either 'RGB' or 'YBR_FULL'" ) with pytest.raises(ValueError, match=msg): runner._validate_buffer() def test_validate_options(self): """Tests for validate_options()""" # DecodeRunner-specific option validation runner = DecodeRunner(ExplicitVRLittleEndian) runner.set_option("bits_allocated", 8) runner.set_option("bits_stored", 8) runner.set_option("columns", 8) runner.set_option("photometric_interpretation", PI.RGB) runner.set_option("pixel_keyword", "PixelData") runner.set_option("pixel_representation", 0) runner.set_option("rows", 10) runner.set_option("samples_per_pixel", 3) runner.set_option("planar_configuration", 1) runner.set_option("number_of_frames", 8) runner.set_option("extended_offsets", ([1, 2], [1])) msg = ( r"The number of items in \(7FE0,0001\) 'Extended Offset Table' and " r"\(7FE0,0002\) 'Extended Offset Table Lengths' don't match - the " "extended offset table will be ignored" ) with pytest.warns(UserWarning, match=msg): runner._validate_options() runner.set_option("extended_offsets", ([0], [10])) runner._validate_options() # Float/Double Float Pixel Data runner.del_option("bits_stored") runner.set_option("pixel_keyword", "FloatPixelData") runner._validate_options() runner.set_option("pixel_keyword", "DoubleFloatPixelData") runner._validate_options() @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") def test_decode(self): """Test decode()""" runner = DecodeRunner(RLELossless) runner.set_source(RLE_16_1_10F.ds) msg = "Unable to decode as exceptions were raised by all available plugins" with pytest.raises(RuntimeError, match=msg): runner.decode(0) decoder = get_decoder(RLELossless) runner.set_decoders(decoder._validate_plugins("pydicom")) buffer = runner.decode(0) assert runner._previous[1] == runner._decoders["pydicom"] arr = np.frombuffer(buffer, dtype=runner.pixel_dtype) arr = runner.reshape(arr, as_frame=True) RLE_16_1_10F.test(arr, index=0) buffer = runner.decode(9) arr = np.frombuffer(buffer, dtype=runner.pixel_dtype) arr = runner.reshape(arr, as_frame=True) RLE_16_1_10F.test(arr, index=9) def decode1(src, opts): raise ValueError("Bad decoding, many errors") def decode2(src, opts): raise AttributeError("Also bad, not helpful") # Check that exception messages on decoder failure # Need to update the attr to avoid resetting _previous runner._decoders = {"foo": decode1, "bar": decode2} assert hasattr(runner, "_previous") msg = ( r"Unable to decode as exceptions were raised by all available plugins:" r"\n foo: Bad decoding, many errors\n bar: Also bad, not helpful" ) with pytest.raises(RuntimeError, match=msg): runner.decode(0) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") def test_iter_decode(self, caplog): """Test iter_decode()""" runner = DecodeRunner(RLELossless) runner.set_source(RLE_16_1_10F.ds) msg = "Unable to decode as exceptions were raised by all available plugins" with pytest.raises(RuntimeError, match=msg): runner.decode(0) decoder = get_decoder(RLELossless) plugins = decoder._validate_plugins("pydicom") runner.set_decoders(plugins) data = runner.iter_decode() buffer = next(data) assert runner._previous[1] == runner._decoders["pydicom"] arr = np.frombuffer(buffer, dtype=runner.pixel_dtype) arr = runner.reshape(arr, as_frame=True) RLE_16_1_10F.test(arr, index=0) for ii in range(9): buffer = next(data) arr = np.frombuffer(buffer, dtype=runner.pixel_dtype) arr = runner.reshape(arr, as_frame=True) RLE_16_1_10F.test(arr, index=9) pytest.raises(StopIteration, next, data) raise_exc = [False] def foo(src, opts): if raise_exc[0]: raise ValueError("Oops") return b"\x00\x00" runner.set_decoders({"foo": foo}) assert not hasattr(runner, "_previous") data = runner.iter_decode() assert b"\x00\x00" == next(data) assert runner._previous[1] == foo raise_exc[0] = True pytest.raises(RuntimeError, next, data) # Test decode failure during raise_exc = [False] def decode_partial(src, opts): if raise_exc[0]: raise ValueError("Whoops") return b"\x00\x00\x00\x00" def decode_all(src, opts): return b"\x03\x02\x01\x00" runner._src = encapsulate([b"\x00\x01\x02\x03"] * 10) runner.set_decoders({"foo": decode_partial}) runner.set_decoders({"foo": decode_partial, "bar": decode_all}) frame_generator = runner.iter_decode() assert next(frame_generator) == b"\x00\x00\x00\x00" raise_exc = [True] msg = ( "The decoding plugin has changed from 'foo' to 'bar' during the " "decoding process - you may get inconsistent inter-frame results, " "consider passing 'decoding_plugin=\"bar\"' instead" ) with caplog.at_level(logging.WARNING, logger="pydicom"): with pytest.warns(UserWarning, match=msg): assert next(frame_generator) == b"\x03\x02\x01\x00" assert ( "The decoding plugin 'foo' failed to decode the frame at index 1" ) in caplog.text def test_get_data(self): """Test get_data()""" src = b"\x00\x01\x02\x03\x04\x05" runner = DecodeRunner(RLELossless) runner.set_source(src) assert runner.is_buffer assert runner.get_data(src, 0, 4) == b"\x00\x01\x02\x03" assert runner.get_data(src, 3, 4) == b"\x03\x04\x05" src = BytesIO(src) runner.set_source(src) assert not runner.is_buffer assert runner.get_data(src, 0, 4) == b"\x00\x01\x02\x03" assert src.tell() == 0 assert runner.get_data(src, 3, 4) == b"\x03\x04\x05" assert src.seek(2) assert runner.get_data(src, 3, 4) == b"\x03\x04\x05" assert src.tell() == 2 def test_pixel_properties(self): """Test pixel_properties()""" runner = DecodeRunner(RLELossless) opts = { "columns": 9, "rows": 10, "samples_per_pixel": 1, "number_of_frames": 3, "pixel_keyword": "PixelData", "photometric_interpretation": PI.RGB, "pixel_representation": 0, "bits_allocated": 16, "bits_stored": 8, } runner.set_options(**opts) d = runner.pixel_properties() assert d["columns"] == 9 assert d["rows"] == 10 assert d["samples_per_pixel"] == 1 assert d["number_of_frames"] == 3 assert d["photometric_interpretation"] == PI.RGB assert d["pixel_representation"] == 0 assert d["bits_allocated"] == 16 assert d["bits_stored"] == 8 assert d["number_of_frames"] == 3 assert "planar_configuration" not in d runner.set_option("pixel_keyword", "FloatPixelData") assert "pixel_representation" not in runner.pixel_properties() runner.set_option("samples_per_pixel", 3) runner.set_option("planar_configuration", 1) assert runner.pixel_properties()["planar_configuration"] == 1 @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestDecodeRunner_Reshape: def setup_method(self): """Setup the test dataset.""" self.runner = DecodeRunner(ExplicitVRLittleEndian) self.runner.set_option("rows", 4) self.runner.set_option("columns", 5) self.runner.set_option("number_of_frames", 1) self.reference = np.asarray( [ [ # Frame 1 [[1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21]], [[2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14, 22]], [[3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14, 22], [7, 15, 23]], [[4, 12, 20], [5, 13, 21], [6, 14, 22], [7, 15, 23], [8, 16, 24]], ], [ # Frame 2 [ [25, 33, 41], [26, 34, 42], [27, 35, 43], [28, 36, 44], [29, 37, 45], ], [ [26, 34, 42], [27, 35, 43], [28, 36, 44], [29, 37, 45], [30, 38, 46], ], [ [27, 35, 43], [28, 36, 44], [29, 37, 45], [30, 38, 46], [31, 39, 47], ], [ [28, 36, 44], [29, 37, 45], [30, 38, 46], [31, 39, 47], [32, 40, 48], ], ], ] ) self.ref_1_1 = self.reference[0, :, :, 0] self.ref_1_3 = self.reference[0] self.ref_2_1 = self.reference[:, :, :, 0] self.ref_2_3 = self.reference @pytest.fixture def _1frame_1sample(self): return np.asarray([1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]) @pytest.fixture def _2frame_1sample(self): return np.asarray( [ [1, 2, 3, 4, 5, 2, 3, 4, 5, 6], [3, 4, 5, 6, 7, 4, 5, 6, 7, 8], [25, 26, 27, 28, 29, 26, 27, 28, 29, 30], [27, 28, 29, 30, 31, 28, 29, 30, 31, 32], ] ).ravel() @pytest.fixture def _1frame_3sample_0config(self): return np.asarray( [ [1, 9, 17, 2, 10, 18, 3, 11, 19, 4], [12, 20, 5, 13, 21, 2, 10, 18, 3, 11], [19, 4, 12, 20, 5, 13, 21, 6, 14, 22], [3, 11, 19, 4, 12, 20, 5, 13, 21, 6], [14, 22, 7, 15, 23, 4, 12, 20, 5, 13], [21, 6, 14, 22, 7, 15, 23, 8, 16, 24], ] ).ravel() @pytest.fixture def _1frame_3sample_1config(self): return np.asarray( [ [1, 2, 3, 4, 5, 2, 3, 4, 5, 6], # Red [3, 4, 5, 6, 7, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 10, 11, 12, 13, 14], # Green [11, 12, 13, 14, 15, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 18, 19, 20, 21, 22], # Blue [19, 20, 21, 22, 23, 20, 21, 22, 23, 24], ] ).ravel() @pytest.fixture def _2frame_3sample_0config(self): return np.asarray( [ [1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20], # Frame 1 [5, 13, 21, 2, 10, 18, 3, 11, 19, 4, 12, 20], [5, 13, 21, 6, 14, 22, 3, 11, 19, 4, 12, 20], [5, 13, 21, 6, 14, 22, 7, 15, 23, 4, 12, 20], [5, 13, 21, 6, 14, 22, 7, 15, 23, 8, 16, 24], [25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 36, 44], # Frame 2 [29, 37, 45, 26, 34, 42, 27, 35, 43, 28, 36, 44], [29, 37, 45, 30, 38, 46, 27, 35, 43, 28, 36, 44], [29, 37, 45, 30, 38, 46, 31, 39, 47, 28, 36, 44], [29, 37, 45, 30, 38, 46, 31, 39, 47, 32, 40, 48], ] ).ravel() @pytest.fixture def _2frame_3sample_1config(self): return np.asarray( [ [1, 2, 3, 4, 5, 2, 3, 4, 5, 6], # Frame 1, red [3, 4, 5, 6, 7, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 10, 11, 12, 13, 14], # Frame 1, green [11, 12, 13, 14, 15, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 18, 19, 20, 21, 22], # Frame 1, blue [19, 20, 21, 22, 23, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 26, 27, 28, 29, 30], # Frame 2, red [27, 28, 29, 30, 31, 28, 29, 30, 31, 32], [33, 34, 35, 36, 37, 34, 35, 36, 37, 38], # Frame 2, green [35, 36, 37, 38, 39, 36, 37, 38, 39, 40], [41, 42, 43, 44, 45, 42, 43, 44, 45, 46], # Frame 2, blue [43, 44, 45, 46, 47, 44, 45, 46, 47, 48], ] ).ravel() def test_reference_1frame_1sample(self): """Test the 1 frame 1 sample/pixel reference array is as expected.""" # (rows, columns) assert (4, 5) == self.ref_1_1.shape assert np.array_equal( self.ref_1_1, np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) def test_reference_1frame_3sample(self): """Test the 1 frame 3 sample/pixel reference array is as expected.""" # (rows, columns, planes) assert (4, 5, 3) == self.ref_1_3.shape # Red channel assert np.array_equal( self.ref_1_3[:, :, 0], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Green channel assert np.array_equal( self.ref_1_3[:, :, 1], np.asarray( [ [9, 10, 11, 12, 13], [10, 11, 12, 13, 14], [11, 12, 13, 14, 15], [12, 13, 14, 15, 16], ] ), ) # Blue channel assert np.array_equal( self.ref_1_3[:, :, 2], np.asarray( [ [17, 18, 19, 20, 21], [18, 19, 20, 21, 22], [19, 20, 21, 22, 23], [20, 21, 22, 23, 24], ] ), ) def test_reference_2frame_1sample(self): """Test the 2 frame 1 sample/pixel reference array is as expected.""" # (nr frames, rows, columns) assert (2, 4, 5) == self.ref_2_1.shape # Frame 1 assert np.array_equal( self.ref_2_1[0, :, :], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Frame 2 assert np.array_equal( self.ref_2_1[1, :, :], np.asarray( [ [25, 26, 27, 28, 29], [26, 27, 28, 29, 30], [27, 28, 29, 30, 31], [28, 29, 30, 31, 32], ] ), ) def test_reference_2frame_3sample(self): """Test the 2 frame 3 sample/pixel reference array is as expected.""" # (nr frames, row, columns, planes) assert (2, 4, 5, 3) == self.ref_2_3.shape # Red channel, frame 1 assert np.array_equal( self.ref_2_3[0, :, :, 0], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Green channel, frame 2 assert np.array_equal( self.ref_2_3[1, :, :, 1], np.asarray( [ [33, 34, 35, 36, 37], [34, 35, 36, 37, 38], [35, 36, 37, 38, 39], [36, 37, 38, 39, 40], ] ), ) def test_1frame_1sample(self, _1frame_1sample): """Test reshaping 1 frame, 1 sample/pixel.""" self.runner.set_option("samples_per_pixel", 1) arr = self.runner.reshape(_1frame_1sample) assert (4, 5) == arr.shape assert np.array_equal(arr, self.ref_1_1) # Test reshape to (rows, cols) is view-only buffer = arr.tobytes() out = np.frombuffer(buffer, arr.dtype) assert not out.flags.writeable out = self.runner.reshape(out) assert not out.flags.writeable def test_1frame_3sample_0conf(self, _1frame_3sample_0config): """Test reshaping 1 frame, 3 sample/pixel for 0 planar config.""" self.runner.set_option("number_of_frames", 1) self.runner.set_option("samples_per_pixel", 3) self.runner.set_option("planar_configuration", 0) arr = self.runner.reshape(_1frame_3sample_0config) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) # Test reshape to (rows, cols, planes) is view-only buffer = arr.tobytes() out = np.frombuffer(buffer, arr.dtype) assert not out.flags.writeable out = self.runner.reshape(out) assert not out.flags.writeable def test_1frame_3sample_1conf(self, _1frame_3sample_1config): """Test reshaping 1 frame, 3 sample/pixel for 1 planar config.""" self.runner.set_option("number_of_frames", 1) self.runner.set_option("samples_per_pixel", 3) self.runner.set_option("planar_configuration", 1) arr = self.runner.reshape(_1frame_3sample_1config) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) # Test reshape to (rows, cols, planes) is view-only buffer = arr.tobytes() out = np.frombuffer(buffer, arr.dtype) assert not out.flags.writeable out = self.runner.reshape(out) assert not out.flags.writeable def test_2frame_1sample(self, _1frame_1sample, _2frame_1sample): """Test reshaping 2 frame, 1 sample/pixel.""" self.runner.set_option("number_of_frames", 2) self.runner.set_option("samples_per_pixel", 1) arr = self.runner.reshape(_2frame_1sample) assert (2, 4, 5) == arr.shape assert np.array_equal(arr, self.ref_2_1) # Test reshape to (frames, rows, cols) is view-only buffer = arr.tobytes() out = np.frombuffer(buffer, arr.dtype) assert not out.flags.writeable out = self.runner.reshape(out) assert not out.flags.writeable arr = self.runner.reshape(_1frame_1sample, as_frame=True) assert (4, 5) == arr.shape assert np.array_equal(arr, self.ref_1_1) def test_2frame_3sample_0conf( self, _1frame_3sample_0config, _2frame_3sample_0config ): """Test reshaping 2 frame, 3 sample/pixel for 0 planar config.""" self.runner.set_option("number_of_frames", 2) self.runner.set_option("samples_per_pixel", 3) self.runner.set_option("planar_configuration", 0) arr = self.runner.reshape(_2frame_3sample_0config) assert (2, 4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_2_3) # Test reshape to (frames, rows, cols, planes) is view-only buffer = arr.tobytes() out = np.frombuffer(buffer, arr.dtype) assert not out.flags.writeable out = self.runner.reshape(out) assert not out.flags.writeable arr = self.runner.reshape(_1frame_3sample_0config, as_frame=True) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) def test_2frame_3sample_1conf( self, _1frame_3sample_1config, _2frame_3sample_1config ): """Test reshaping 2 frame, 3 sample/pixel for 1 planar config.""" self.runner.set_option("number_of_frames", 2) self.runner.set_option("samples_per_pixel", 3) self.runner.set_option("planar_configuration", 1) arr = self.runner.reshape(_2frame_3sample_1config) assert (2, 4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_2_3) # Test reshape to (frames, rows, cols, planes) is view-only buffer = arr.tobytes() out = np.frombuffer(buffer, arr.dtype) assert not out.flags.writeable out = self.runner.reshape(out) assert not out.flags.writeable arr = self.runner.reshape(_1frame_3sample_1config, as_frame=True) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) class TestDecoder: """Tests for Decoder""" def test_init(self): """Test creating a new Decoder""" dec = Decoder(ExplicitVRLittleEndian) assert {} == dec._available assert {} == dec._unavailable assert dec.missing_dependencies == [] assert dec._validate_plugins() == {} assert dec._decoder is True def test_properties(self): """Test Decoder properties""" dec = Decoder(RLELossless) assert RLELossless == dec.UID assert not dec.is_available assert dec.is_encapsulated assert not dec.is_native @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_missing_numpy_raises(self): """Test as_array() raises if no numpy""" dec = Decoder(RLELossless) msg = "NumPy is required when converting pixel data to an ndarray" with pytest.raises(ImportError, match=msg): dec.as_array(None) with pytest.raises(ImportError, match=msg): next(dec.iter_array(None)) def test_buffer(self): """Test as_buffer() and iter_buffer()""" # Functionality test that numpy isn't required decoder = get_decoder(RLELossless) reference = RLE_16_1_10F buffer, meta = decoder.as_buffer(reference.ds) assert isinstance(buffer, bytes | bytearray) assert isinstance(meta, dict) for buffer, meta in decoder.iter_buffer(reference.ds): assert isinstance(buffer, bytes | bytearray) assert isinstance(meta, dict) def test_validate_plugins(self): """Test _validate_plugins() with plugins available""" decoder = get_decoder(RLELossless) msg = ( "No plugin named 'foo' has been added to 'RLELosslessDecoder', " "available plugins are" ) with pytest.raises(ValueError, match=msg): decoder._validate_plugins("foo") @pytest.fixture() def enable_logging(): original = config.debugging config.debugging = True yield config.debugging = original @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestDecoder_Array: """Tests for Decoder.as_array() and Decoder.iter_array().""" def test_logging(self, enable_logging, caplog): """Test that the logging works during decode""" decoder = get_decoder(ExplicitVRLittleEndian) with caplog.at_level(logging.DEBUG, logger="pydicom"): decoder.as_array(EXPL_1_1_1F.ds) assert "DecodeRunner for 'Explicit VR Little Endian'" in caplog.text assert " as_rgb: True" in caplog.text with caplog.at_level(logging.DEBUG, logger="pydicom"): next(decoder.iter_array(EXPL_1_1_1F.ds, as_rgb=False)) assert "DecodeRunner for 'Explicit VR Little Endian'" in caplog.text assert " as_rgb: False" in caplog.text def test_bad_index_raises(self): """Test invalid 'index'""" decoder = get_decoder(ExplicitVRLittleEndian) msg = "'index' must be greater than or equal to 0" with pytest.raises(ValueError, match=msg): decoder.as_array(None, index=-1) msg = "There is insufficient pixel data to contain 11 frames" with pytest.raises(ValueError, match=msg): decoder.as_array(EXPL_16_1_10F.ds, index=10) msg = "There is insufficient pixel data to contain 2 frames" with pytest.raises(ValueError, match=msg): decoder.as_array(EXPL_8_3_1F_YBR.ds, index=1) def test_native_bitpacked_view_warns(self, caplog): """Test warning for bit packed data with `view_only`""" decoder = get_decoder(ExplicitVRLittleEndian) with caplog.at_level(logging.WARNING, logger="pydicom"): decoder.as_array(EXPL_1_1_1F.ds) assert not caplog.text with caplog.at_level(logging.WARNING, logger="pydicom"): decoder.as_array(EXPL_1_1_1F.ds, view_only=True) assert ( "Unable to return an ndarray that's a view on the original " "buffer for bit-packed pixel data" ) in caplog.text def test_native_ybr422_view_warns(self, caplog): """Test warning for YBR_FULL_422 data with `view_only`""" decoder = get_decoder(ExplicitVRLittleEndian) with caplog.at_level(logging.WARNING, logger="pydicom"): decoder.as_array(EXPL_8_3_1F_YBR422.ds) assert not caplog.text with caplog.at_level(logging.WARNING, logger="pydicom"): decoder.as_array(EXPL_8_3_1F_YBR422.ds, view_only=True, raw=True) assert ( "Unable to return an ndarray that's a view on the original " "buffer for uncompressed pixel data with a photometric " "interpretation of 'YBR_FULL_422'" ) in caplog.text def test_colorspace_change_view_warns(self, caplog): """Test warning for color space change with `view_only`""" decoder = get_decoder(ExplicitVRLittleEndian) with caplog.at_level(logging.WARNING, logger="pydicom"): decoder.as_array(EXPL_8_3_1F_YBR.ds, view_only=True) assert ( "Unable to return an ndarray that's a view on the original " "buffer if applying a color space conversion" ) in caplog.text def test_native_index(self): """Test as_array(index=X)""" decoder = get_decoder(ExplicitVRLittleEndian) reference = EXPL_16_1_10F for index in [0, 4, 9]: arr, meta = decoder.as_array(reference.ds, index=index) reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["bits_stored"] == 12 def test_native_view_only(self): """Test as_array(view_only=True)""" decoder = get_decoder(ExplicitVRLittleEndian) # Also tests Dataset `src` reference = EXPL_8_3_1F_YBR arr, meta = decoder.as_array(reference.ds, view_only=True, raw=True) assert isinstance(reference.ds.PixelData, bytes) # immutable reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert not arr.flags.writeable # read-only assert meta["photometric_interpretation"] == PI.YBR_FULL # Also tests buffer-like `src` ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } arr, _ = decoder.as_array( bytearray(ds.PixelData), # mutable raw=True, view_only=True, **opts, ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable # not read-only arr, _ = decoder.as_array( memoryview(ds.PixelData), # view of an immutable raw=True, view_only=True, **opts, ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert not arr.flags.writeable # read-only arr, _ = decoder.as_array( memoryview(bytearray(ds.PixelData)), # view of a mutable raw=True, view_only=True, **opts, ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable # not read-only # BinaryIO with open(reference.path, "rb") as f: f.seek(ds["PixelData"].file_tell) arr, _ = decoder.as_array( f, raw=True, view_only=True, **opts, ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert not arr.flags.writeable # read-only def test_native_excess_frames(self): """Test returning excess frame data""" decoder = get_decoder(ExplicitVRLittleEndian) ds = dcmread(EXPL_16_1_10F.path) ds.NumberOfFrames = 9 msg = ( "The number of bytes of pixel data is sufficient to contain 10 frames " r"which is larger than the given \(0028,0008\) 'Number of Frames' " "value of 9. The returned data will include these extra frames and if " "it's correct then you should update 'Number of Frames' accordingly, " "otherwise pass 'allow_excess_frames=False' to return only the first " "9 frames." ) with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds) assert arr.shape == (10, 64, 64) assert meta["number_of_frames"] == 10 msg = "contains 8192 bytes of excess padding" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, allow_excess_frames=False) assert arr.shape == (9, 64, 64) assert meta["number_of_frames"] == 9 def test_native_from_buffer(self): """Test decoding a dataset which uses buffered Pixel Data.""" decoder = get_decoder(ExplicitVRLittleEndian) ds = dcmread(EXPL_16_1_10F.path) ds.PixelData = BytesIO(ds.PixelData) for index in [0, 4, 9]: arr, meta = decoder.as_array(ds, index=index) EXPL_16_1_10F.test(arr, index=index) assert arr.shape == EXPL_16_1_10F.shape[1:] assert arr.dtype == EXPL_16_1_10F.dtype assert arr.flags.writeable assert meta["bits_stored"] == 12 def test_encapsulated_index(self): """Test `index` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F for index in [0, 4, 9]: arr, meta = decoder.as_array( reference.ds, index=index, decoding_plugin="pydicom" ) reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["bits_stored"] == 12 def test_encapsulated_plugin(self): """Test `decoding_plugin` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F arr, meta = decoder.as_array(reference.ds, decoding_plugin="pydicom") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["bits_stored"] == 12 def test_encapsulated_excess_frames(self): """Test returning excess frame data""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F frames = [x for x in generate_frames(reference.ds.PixelData)] frames.append(frames[-1]) src = encapsulate(frames) runner = DecodeRunner(RLELossless) runner.set_source(reference.ds) msg = ( "11 frames have been found in the encapsulated pixel data, which is " r"larger than the given \(0028,0008\) 'Number of Frames' value of 10. " "The returned data will include these extra frames and if it's correct " "then you should update 'Number of Frames' accordingly, otherwise pass " "'allow_excess_frames=False' to return only the first 10 frames." ) with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(src, **runner.options) assert arr.shape == (11, 64, 64) assert meta["number_of_frames"] == 11 runner.set_option("allow_excess_frames", False) arr, meta = decoder.as_array(src, **runner.options) assert arr.shape == (10, 64, 64) assert meta["number_of_frames"] == 10 def test_encapsulated_from_buffer(self): """Test decoding a dataset which uses buffered Pixel Data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F ds = dcmread(reference.path) ds.PixelData = BytesIO(ds.PixelData) for index in [0, 4, 9]: arr, meta = decoder.as_array(ds, index=index) reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["bits_stored"] == 12 def test_processing_colorspace(self): """Test the processing colorspace options.""" decoder = get_decoder(ExplicitVRLittleEndian) reference = EXPL_8_3_1F_YBR assert reference.ds.PhotometricInterpretation == PI.YBR_FULL msg = "'force_ybr' and 'force_rgb' cannot both be True" with pytest.raises(ValueError, match=msg): decoder.as_array(reference.ds, force_rgb=True, force_ybr=True) # as_rgb (default) arr, meta = decoder.as_array(reference.ds) reference.test(arr, as_rgb=True) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == PI.RGB # force_rgb rgb, meta = decoder.as_array( reference.ds, photometric_interpretation="RGB", force_rgb=True, ) reference.test(rgb, as_rgb=True) assert meta["photometric_interpretation"] == PI.RGB # force_ybr # Test ignores as_rgb ybr, meta = decoder.as_array(reference.ds, as_rgb=False, force_ybr=True) assert meta["photometric_interpretation"] == PI.YBR_FULL ybr2, meta = decoder.as_array(reference.ds, as_rgb=True, force_ybr=True) assert meta["photometric_interpretation"] == PI.YBR_FULL assert np.array_equal(ybr, ybr2) # Test is actually ybr + ybr = ybr` raw, meta = decoder.as_array(reference.ds, raw=True) assert meta["photometric_interpretation"] == PI.YBR_FULL out = convert_color_space(ybr, PI.YBR_FULL, PI.RGB) # Lossy conversion, equal to within 1 intensity unit assert np.allclose(out, raw, atol=1) def test_expb_ow_view_only_warns(self, caplog): """Test view_only with BE swapped OW warns""" decoder = get_decoder(ExplicitVRBigEndian) reference = EXPB_8_1_1F msg = ( "Unable to return an ndarray that's a view on the original buffer " "for 8-bit pixel data encoded as OW with 'Explicit VR Big Endian'" ) with caplog.at_level(logging.WARNING, logger="pydicom"): decoder.as_array(reference.ds, view_only=True) assert msg in caplog.text def test_expb_ow_index_invalid_raises(self): """Test invalid index with BE swapped OW raises""" decoder = get_decoder(ExplicitVRBigEndian) reference = EXPB_8_1_1F msg = "There is insufficient pixel data to contain 2 frames" with pytest.raises(ValueError, match=msg): decoder.as_array(reference.ds, index=1) def test_expb_ow(self): """Test BE swapped OW""" decoder = get_decoder(ExplicitVRBigEndian) opts = { "rows": 3, "columns": 3, "samples_per_pixel": 1, "photometric_interpretation": "MONOCHROME1", "pixel_representation": 0, "bits_allocated": 8, "bits_stored": 8, "number_of_frames": 3, "pixel_keyword": "PixelData", "pixel_vr": "OW", } src = ( # | 2_1 | 1_9 b"\x01\x00\x03\x02\x05\x04\x07\x06\x09\x08" # 2_2 | 2_3 b"\x0B\x0A\x0D\x0C\x0F\x0E\x11\x10" # 3_1 | pad | 3_9 b"\x13\x12\x15\x14\x17\x16\x19\x18\x00\x1A" ) # Test by frame - odd-length arr, _ = decoder.as_array(src, **opts, index=0) assert arr.ravel().tolist() == [0, 1, 2, 3, 4, 5, 6, 7, 8] arr, _ = decoder.as_array(src, **opts, index=1) assert arr.ravel().tolist() == [9, 10, 11, 12, 13, 14, 15, 16, 17] arr, _ = decoder.as_array(src, **opts, index=2) assert arr.ravel().tolist() == [18, 19, 20, 21, 22, 23, 24, 25, 26] # Test all - odd-length opts["number_of_frames"] = 1 arr, _ = decoder.as_array(b"\x01\x00\x03\x02\x05\x04\x07\x06\x00\x08", **opts) assert arr.ravel().tolist() == [0, 1, 2, 3, 4, 5, 6, 7, 8] # Test all - even-length opts["rows"] = 5 opts["columns"] = 2 arr, _ = decoder.as_array(b"\x01\x00\x03\x02\x05\x04\x07\x06\x09\x08", **opts) assert arr.ravel().tolist() == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Test by frame - even length opts["number_of_frames"] = 3 arr, _ = decoder.as_array(src + b"\x1D\x1C", **opts, index=0) assert arr.ravel().tolist() == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] arr, _ = decoder.as_array(src + b"\x1D\x1C", **opts, index=1) assert arr.ravel().tolist() == [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] arr, _ = decoder.as_array(src + b"\x1D\x1C", **opts, index=2) assert arr.ravel().tolist() == [20, 21, 22, 23, 24, 25, 26, 0, 28, 29] def test_iter_native_indices(self): """Test the `indices` argument with native data.""" decoder = get_decoder(ExplicitVRLittleEndian) reference = EXPL_16_1_10F indices = [0, 4, 9] func = decoder.iter_array(reference.ds, raw=True, indices=indices) for idx, (arr, meta) in enumerate(func): reference.test(arr, index=indices[idx]) assert arr.dtype == reference.dtype assert arr.flags.writeable assert arr.shape == reference.shape[1:] assert meta["bits_stored"] == 12 assert meta["number_of_frames"] == 1 assert idx == 2 def test_iter_native_view_only(self, caplog): """Test as_array(view_only=True)""" decoder = get_decoder(ExplicitVRLittleEndian) reference = EXPL_16_1_10F ds = reference.ds assert ds.BitsAllocated == 16 assert ds.BitsStored == 12 assert isinstance(ds.PixelData, bytes) # immutable func = decoder.iter_array(ds, view_only=True, raw=True) msg = ( "Unable to return an ndarray that's a view on the original buffer when " "(0028,0101) 'Bits Stored' doesn't equal (0028,0100) 'Bits Allocated' " "and 'correct_unused_bits=True'. In most cases you can pass " "'correct_unused_bits=False' instead to get a view if the uncorrected " "array is equivalent to the corrected one." ) with caplog.at_level(logging.WARNING, logger="pydicom"): arr, _ = next(func) reference.test(arr, index=0) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable # not a view due to bit-shift assert msg in caplog.text for index, (arr, _) in enumerate(func): reference.test(arr, index=index + 1) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable # not a view due to bit-shift func = decoder.iter_array( ds, view_only=True, raw=True, correct_unused_bits=False ) for index, (arr, _) in enumerate(func): reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert not arr.flags.writeable # read-only func = decoder.iter_array( bytearray(ds.PixelData), # mutable raw=True, view_only=True, rows=ds.Rows, columns=ds.Columns, samples_per_pixel=ds.SamplesPerPixel, photometric_interpretation=ds.PhotometricInterpretation, pixel_representation=ds.PixelRepresentation, bits_allocated=ds.BitsAllocated, bits_stored=ds.BitsStored, number_of_frames=ds.get("NumberOfFrames", 1), planar_configuration=ds.get("PlanarConfiguration", 0), pixel_keyword="PixelData", ) for index, (arr, _) in enumerate(func): reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable # not read-only func = decoder.iter_array( memoryview(ds.PixelData), # view of an immutable raw=True, view_only=True, rows=ds.Rows, columns=ds.Columns, samples_per_pixel=ds.SamplesPerPixel, photometric_interpretation=ds.PhotometricInterpretation, pixel_representation=ds.PixelRepresentation, bits_allocated=ds.BitsAllocated, bits_stored=ds.BitsStored, number_of_frames=ds.get("NumberOfFrames", 1), planar_configuration=ds.get("PlanarConfiguration", 0), pixel_keyword="PixelData", correct_unused_bits=False, ) for index, (arr, _) in enumerate(func): reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert not arr.flags.writeable # read-only func = decoder.iter_array( memoryview(bytearray(ds.PixelData)), # view of a mutable raw=True, view_only=True, rows=ds.Rows, columns=ds.Columns, samples_per_pixel=ds.SamplesPerPixel, photometric_interpretation=ds.PhotometricInterpretation, pixel_representation=ds.PixelRepresentation, bits_allocated=ds.BitsAllocated, bits_stored=ds.BitsStored, number_of_frames=ds.get("NumberOfFrames", 1), planar_configuration=ds.get("PlanarConfiguration", 0), pixel_keyword="PixelData", ) for index, (arr, _) in enumerate(func): reference.test(arr, index=index) assert arr.shape == reference.shape[1:] assert arr.dtype == reference.dtype assert arr.flags.writeable # not read-only def test_iter_encapsulated_indices(self): """Test the `indices` argument with encapsulated data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F indices = [0, 4, 9] func = decoder.iter_array( reference.ds, raw=True, indices=indices, decoding_plugin="pydicom" ) for idx, (arr, meta) in enumerate(func): reference.test(arr, index=indices[idx]) assert arr.dtype == reference.dtype assert arr.flags.writeable assert arr.shape == reference.shape[1:] assert meta["bits_stored"] == 12 assert meta["number_of_frames"] == 1 assert idx == 2 def test_iter_encapsulated_plugin(self): """Test `decoding_plugin` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F func = decoder.iter_array(reference.ds, decoding_plugin="pydicom") for index, (arr, _) in enumerate(func): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable assert arr.shape == reference.shape[1:] def test_iter_processing(self): """Test the processing options.""" decoder = get_decoder(ExplicitVRLittleEndian) reference = EXPL_8_3_1F_YBR assert reference.ds.PhotometricInterpretation == PI.YBR_FULL msg = "'force_ybr' and 'force_rgb' cannot both be True" with pytest.raises(ValueError, match=msg): next(decoder.iter_array(reference.ds, force_rgb=True, force_ybr=True)) # as_rgb func = decoder.iter_array(reference.ds) arr, meta = next(func) reference.test(arr, as_rgb=True) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == PI.RGB # force_rgb func = decoder.iter_array( reference.ds, photometric_interpretation="RGB", force_rgb=True, ) rgb, meta = next(func) reference.test(rgb, as_rgb=True) assert meta["photometric_interpretation"] == PI.RGB # force_ybr # Test ignores as_rgb ybr, meta = next(decoder.iter_array(reference.ds, as_rgb=False, force_ybr=True)) assert meta["photometric_interpretation"] == PI.YBR_FULL ybr2, meta = next(decoder.iter_array(reference.ds, as_rgb=True, force_ybr=True)) assert meta["photometric_interpretation"] == PI.YBR_FULL assert np.array_equal(ybr, ybr2) # Test is actually ybr + ybr = ybr` raw, meta = next(decoder.iter_array(reference.ds, raw=True)) assert meta["photometric_interpretation"] == PI.YBR_FULL out = convert_color_space(ybr, PI.YBR_FULL, PI.RGB) # Lossy conversion, equal to within 1 intensity unit assert np.allclose(out, raw, atol=1) def test_iter_ybr_to_rgb(self): """Test conversion from YBR to RGB for multi-framed data.""" decoder = get_decoder(ExplicitVRLittleEndian) ds = dcmread(EXPL_8_3_1F_YBR.path) ds.PixelData = ds.PixelData * 2 ds.NumberOfFrames = 2 assert ds.PhotometricInterpretation == PI.YBR_FULL for arr, meta in decoder.iter_array(ds): assert meta["photometric_interpretation"] == PI.RGB EXPL_8_3_1F_YBR.test(arr, as_rgb=True) def test_iter_planar_configuration(self): """Test iter_pixels() with planar configuration.""" decoder = get_decoder(ExplicitVRLittleEndian) ds = dcmread(EXPL_8_3_1F_YBR.path) ds.PixelData = ds.PixelData * 2 ds.NumberOfFrames = 2 ds.PlanarConfiguration = 1 # Always 0 when converting to an ndarray for _, meta in decoder.iter_array(ds): assert meta["planar_configuration"] == 0 @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestDecoder_Buffer: """Tests for Decoder.as_buffer() and Decoder.iter_buffer().""" def test_native_index(self): """Test `index`""" decoder = get_decoder(ExplicitVRLittleEndian) assert decoder.is_available reference = EXPL_16_1_10F for index in [0, 4, 9]: arr, meta_a = decoder.as_array(reference.ds, index=index) buffer, meta_b = decoder.as_buffer(reference.ds, index=index) assert arr.tobytes() == buffer assert meta_a == meta_b assert meta_a["number_of_frames"] == 1 msg = "There is insufficient pixel data to contain 11 frames" with pytest.raises(ValueError, match=msg): decoder.as_buffer(reference.ds, index=10) def test_native_view_only(self): """Test `view_only`""" decoder = get_decoder(ExplicitVRLittleEndian) # immutable source buffer # Also tests Dataset `src` reference = EXPL_8_3_1F_YBR arr, meta_a = decoder.as_array(reference.ds, view_only=True, raw=True) buffer, meta_b = decoder.as_buffer(reference.ds, view_only=True, raw=True) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is reference.ds.PixelData assert meta_a == meta_b # mutable source buffer # Also tests buffer-like `src` src = bytearray() src += b"\x00\x01\x02\x03\x04\x05\x06\x07\x08" opts = { "raw": True, "view_only": True, "rows": 3, "columns": 3, "samples_per_pixel": 1, "photometric_interpretation": PI.MONOCHROME1, "pixel_representation": 0, "bits_allocated": 8, "bits_stored": 8, "number_of_frames": 1, "pixel_keyword": "PixelData", } arr, _ = decoder.as_array(src, **opts) buffer, _ = decoder.as_buffer(src, **opts) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is src # view of a mutable mview = memoryview(src) arr, _ = decoder.as_array(mview, **opts) buffer, _ = decoder.as_buffer(mview, **opts) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is src # view of an immutable src = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08" mview = memoryview(src) arr, _ = decoder.as_array(mview, **opts) buffer, _ = decoder.as_buffer(mview, **opts) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is src def test_native_single_bit_nonaligned(self): """Test `as_buffer` with a single bit image whose frame boundaries are not aligned with byte boundaries.""" decoder = get_decoder(ExplicitVRLittleEndian) assert decoder.is_available reference = EXPL_1_1_3F_NONALIGNED full_buffer, _ = decoder.as_buffer(reference.ds) full_len = ceil( ( reference.ds.Rows * reference.ds.Columns * reference.ds.SamplesPerPixel * reference.ds.NumberOfFrames ) / 8 ) assert len(full_buffer) == full_len # When requesting a single frame, the returned buffer will contain some # pixels from neighnoring frames frame_1_buffer, _ = decoder.as_buffer(reference.ds, index=1) frame_length_pixels = reference.ds.Rows * reference.ds.Columns assert ( frame_1_buffer == full_buffer[frame_length_pixels // 8 : ceil(2 * frame_length_pixels / 8)] ) def test_encapsulated_index(self): """Test `index` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F for index in [0, 4, 9]: arr, _ = decoder.as_array(reference.ds, index=index) buffer, meta = decoder.as_buffer(reference.ds, index=index) assert isinstance(buffer, bytes | bytearray) assert arr.tobytes() == buffer assert meta["bits_stored"] == 12 assert meta["number_of_frames"] == 1 def test_encapsulated_plugin(self): """Test `decoding_plugin` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F arr, _ = decoder.as_array(reference.ds, decoding_plugin="pydicom") buffer, _ = decoder.as_buffer(reference.ds, decoding_plugin="pydicom") assert isinstance(buffer, bytes | bytearray) assert arr.tobytes() == buffer def test_encapsulated_invalid_decode_raises(self): """Test invalid decode raises""" decoder = Decoder(RLELossless) reference = RLE_16_1_10F def foo(src, opts): return b"\x00\x01" msg = ( "Unexpected number of bytes in the decoded frame with index 0 " r"\(2 bytes actual vs 8192 expected\)" ) decoder._available = {"foo": foo} with pytest.raises(ValueError, match=msg): decoder.as_buffer(reference.ds) msg = ( "Unexpected number of bytes in the decoded frame with index 9 " r"\(2 bytes actual vs 8192 expected\)" ) with pytest.raises(ValueError, match=msg): decoder.as_buffer(reference.ds, index=9) def test_encapsulated_excess_frames(self): """Test returning excess frame data""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F frames = [x for x in generate_frames(reference.ds.PixelData)] frames.append(frames[-1]) src = encapsulate(frames) runner = DecodeRunner(RLELossless) runner.set_source(reference.ds) msg = ( "11 frames have been found in the encapsulated pixel data, which is " r"larger than the given \(0028,0008\) 'Number of Frames' value of 10. " "The returned data will include these extra frames and if it's correct " "then you should update 'Number of Frames' accordingly, otherwise pass " "'allow_excess_frames=False' to return only the first 10 frames." ) with pytest.warns(UserWarning, match=msg): buffer, meta = decoder.as_buffer(src, **runner.options) assert len(buffer) == 11 * 64 * 64 * 2 assert meta["number_of_frames"] == 11 runner.set_option("allow_excess_frames", False) buffer, meta = decoder.as_buffer(src, **runner.options) assert len(buffer) == 10 * 64 * 64 * 2 assert meta["number_of_frames"] == 10 def test_expb_ow_index_invalid_raises(self): """Test invalid index with BE swapped OW raises""" decoder = get_decoder(ExplicitVRBigEndian) reference = EXPB_8_1_1F msg = "There is insufficient pixel data to contain 2 frames" with pytest.raises(ValueError, match=msg): decoder.as_buffer(reference.ds, index=1) def test_expb_ow_index_odd_length(self): """Test index with odd length BE swapped OW""" decoder = get_decoder(ExplicitVRBigEndian) opts = { "rows": 3, "columns": 3, "samples_per_pixel": 1, "photometric_interpretation": "MONOCHROME1", "pixel_representation": 0, "bits_allocated": 8, "bits_stored": 8, "number_of_frames": 3, "pixel_keyword": "PixelData", "pixel_vr": "OW", } src = ( # | 2_1 | 1_9 b"\x01\x00\x03\x02\x05\x04\x07\x06\x09\x08" # 2_2 | 2_3 b"\x0B\x0A\x0D\x0C\x0F\x0E\x11\x10" # 3_1 | pad | 3_9 b"\x13\x12\x15\x14\x17\x16\x19\x18\x00\x1A" ) # Includes +1 at end buffer, _ = decoder.as_buffer(src, **opts, index=0) assert buffer == b"\x01\x00\x03\x02\x05\x04\x07\x06\x09\x08" # Includes -1 at start buffer, _ = decoder.as_buffer(src, **opts, index=1) assert buffer == b"\x09\x08\x0B\x0A\x0D\x0C\x0F\x0E\x11\x10" # Includes +1 at end buffer, _ = decoder.as_buffer(src, **opts, index=2) assert buffer == b"\x13\x12\x15\x14\x17\x16\x19\x18\x00\x1A" def test_iter_native_indices(self): """Test `index`""" decoder = get_decoder(ExplicitVRLittleEndian) reference = EXPL_16_1_10F indices = [0, 4, 9] arr_func = decoder.iter_array(reference.ds, indices=indices) buf_func = decoder.iter_buffer(reference.ds, indices=indices) for idx, ((arr, _), (buffer, _)) in enumerate(zip(arr_func, buf_func)): assert isinstance(buffer, bytes | bytearray) assert arr.tobytes() == buffer assert idx == 2 def test_iter_native_view_only(self): """Test `view_only`""" decoder = get_decoder(ExplicitVRLittleEndian) # immutable source buffer # Also tests Dataset `src` reference = EXPL_8_3_1F_YBR arr, _ = next(decoder.iter_array(reference.ds, view_only=True, raw=True)) buffer, _ = next(decoder.iter_buffer(reference.ds, view_only=True, raw=True)) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is reference.ds.PixelData # mutable source buffer # Also tests buffer-like `src` src = bytearray() src += b"\x00\x01\x02\x03\x04\x05\x06\x07\x08" opts = { "raw": True, "view_only": True, "rows": 3, "columns": 3, "samples_per_pixel": 1, "photometric_interpretation": PI.MONOCHROME1, "pixel_representation": 0, "bits_allocated": 8, "bits_stored": 8, "number_of_frames": 1, "pixel_keyword": "PixelData", } arr, _ = next(decoder.iter_array(src, **opts)) buffer, _ = next(decoder.iter_buffer(src, **opts)) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is src # view of a mutable mview = memoryview(src) arr, _ = next(decoder.iter_array(mview, **opts)) buffer, _ = next(decoder.iter_buffer(mview, **opts)) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is src # view of an immutable src = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08" mview = memoryview(src) arr, _ = next(decoder.iter_array(mview, **opts)) buffer, _ = next(decoder.iter_buffer(mview, **opts)) assert isinstance(buffer, memoryview) assert arr.tobytes() == buffer assert buffer.obj is src def test_iter_encapsulated_indices(self): """Test `indices` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F indices = [0, 4, 9] arr_func = decoder.iter_array(reference.ds, indices=indices) buf_func = decoder.iter_buffer(reference.ds, indices=indices) for idx, ((arr, _), (buffer, _)) in enumerate(zip(arr_func, buf_func)): assert isinstance(buffer, bytes | bytearray) assert arr.tobytes() == buffer def test_iter_encapsulated_plugin(self): """Test `decoding_plugin` with an encapsulated pixel data.""" decoder = get_decoder(RLELossless) reference = RLE_16_1_10F arr, _ = next(decoder.iter_array(reference.ds, decoding_plugin="pydicom")) buffer, _ = next(decoder.iter_buffer(reference.ds, decoding_plugin="pydicom")) assert isinstance(buffer, bytes | bytearray) assert arr.tobytes() == buffer def test_get_decoder(): """Test get_decoder()""" uids = [ ExplicitVRLittleEndian, ImplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, RLELossless, ] for uid in uids: decoder = get_decoder(uid) assert isinstance(decoder, Decoder) assert decoder.UID == uid msg = ( "No pixel data decoders have been implemented for 'SMPTE ST 2110-30 " "PCM Digital Audio'" ) with pytest.raises(NotImplementedError, match=msg): get_decoder(SMPTEST211030PCMDigitalAudio) pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_gdcm.py000066400000000000000000000234531515706620200237130ustar00rootroot00000000000000"""Test the GDCM decoder.""" import importlib import logging import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import dcmread, config from pydicom.pixels import get_decoder from pydicom.pixels.utils import _passes_version_check from pydicom.uid import ( JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, ) from .pixels_reference import ( PIXEL_REFERENCE, JPGE_BAD, J2KR_16_13_1_1_1F_M2_MISMATCH, JLSN_08_01_1_0_1F, JLSL_08_07_1_0_1F, JPGB_08_08_3_0_1F_RGB, # has RGB component IDs JPGB_08_08_3_0_1F_YBR_FULL, # has JFIF APP marker ) HAVE_GDCM = bool(importlib.util.find_spec("gdcm")) SKIP_TEST = not HAVE_NP or not HAVE_GDCM def name(ref): return f"{ref.name}" @pytest.mark.skipif(SKIP_TEST, reason="Test is missing dependencies") class TestDecoding: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGBaseline8Bit], ids=name) def test_jpg_baseline(self, reference): """Test the decoder with JPEGBaseline8Bit.""" decoder = get_decoder(JPEGBaseline8Bit) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr, plugin="gdcm") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGExtended12Bit], ids=name) def test_jpg_extended(self, reference): """Test the decoder with JPEGExtended12Bit.""" decoder = get_decoder(JPEGExtended12Bit) if reference.ds.BitsStored == 12: msg = ( "Unable to decode as exceptions were raised by all available " "plugins:\n gdcm: GDCM does not support 'JPEG Extended' for samples " "with 12-bit precision" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array(reference.ds, decoding_plugin="gdcm") else: arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLossless], ids=name) def test_jpg_lossless(self, reference): """Test the decoder with JPEGLossless.""" decoder = get_decoder(JPEGLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLosslessSV1], ids=name) def test_jpg_lossless_sv1(self, reference): """Test the decoder with JPEGLosslessSV1.""" decoder = get_decoder(JPEGLosslessSV1) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLSLossless], ids=name) def test_jls_lossless(self, reference): """Test the decoder with JPEGLSLossless.""" decoder = get_decoder(JPEGLSLossless) if reference == JLSL_08_07_1_0_1F: msg = ( "Unable to decode as exceptions were raised by all available " "plugins:\n gdcm: Unable to decode unsigned JPEG-LS pixel " "data with a sample precision of 6 or 7" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") else: arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLSNearLossless], ids=name) def test_jls_lossy(self, reference): """Test the decoder with JPEGLSNearLossless.""" decoder = get_decoder(JPEGLSNearLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEG2000Lossless], ids=name) def test_j2k_lossless(self, reference): """Test the decoder with JPEG2000Lossless.""" decoder = get_decoder(JPEG2000Lossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEG2000], ids=name) def test_j2k(self, reference): """Test the decoder with JPEG2000.""" decoder = get_decoder(JPEG2000) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="gdcm") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable def test_bits_allocated_mismatch(self): """Test the result when bits stored <= 8 and bits allocated 16""" # The JPEG-LS codestream uses a precision of 8, so it will return # 8-bit values, however the decoding process nominally expects 16-bit decoder = get_decoder(JPEGLSNearLossless) arr, _ = decoder.as_array( JLSN_08_01_1_0_1F.ds, raw=True, decoding_plugin="gdcm", bits_allocated=16, ) JLSN_08_01_1_0_1F.test(arr) assert arr.shape == JLSN_08_01_1_0_1F.shape assert arr.dtype != JLSN_08_01_1_0_1F.dtype assert arr.dtype == np.uint16 assert arr.flags.writeable def test_bits_allocated_mismatch_as_buffer(self): """Test the result when bits stored <= 8 and bits allocated 16""" decoder = get_decoder(JPEGLSNearLossless) ds = JLSN_08_01_1_0_1F.ds buffer, meta = decoder.as_buffer( ds, raw=True, decoding_plugin="gdcm", bits_allocated=16, ) assert ds.BitsStored == 8 assert len(buffer) == ds.Rows * ds.Columns * ds.SamplesPerPixel arr = np.frombuffer(buffer, dtype="u1") arr = arr.reshape((ds.Rows, ds.Columns)) JLSN_08_01_1_0_1F.test(arr) assert arr.shape == JLSN_08_01_1_0_1F.shape assert meta["bits_allocated"] == 8 def test_jls_lossy_signed_raises(self): """Test decoding JPEG-LS signed with < 8-bits raises.""" decoder = get_decoder(JPEGLSNearLossless) ds = JLSN_08_01_1_0_1F.ds msg = ( "Unable to decode as exceptions were raised by all available plugins:\n " "gdcm: Unable to decode signed lossy JPEG-LS pixel data with a sample " "precision less than 8 bits" ) with pytest.raises(RuntimeError, match=msg): decoder.as_buffer( ds, raw=True, decoding_plugin="gdcm", bits_stored=7, pixel_representation=1, ) def test_rgb_component_ids(self): """Test decoding an incorrect photometric interpretation using cIDs.""" decoder = get_decoder(JPEGBaseline8Bit) reference = JPGB_08_08_3_0_1F_RGB msg = ( r"The \(0028,0004\) 'Photometric Interpretation' value is " "'YBR_FULL_422' however the encoded image's codestream uses " "component IDs that indicate it should be 'RGB'" ) ds = dcmread(reference.path) ds.PhotometricInterpretation = "YBR_FULL_422" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, raw=True, decoding_plugin="gdcm") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == "RGB" def test_jfif(self): """Test decoding an incorrect photometric interpretation using JFIF.""" decoder = get_decoder(JPEGBaseline8Bit) reference = JPGB_08_08_3_0_1F_YBR_FULL msg = ( r"The \(0028,0004\) 'Photometric Interpretation' value is " "'RGB' however the encoded image's codestream contains a JFIF APP " "marker which indicates it should be 'YBR_FULL_422'" ) ds = dcmread(reference.path) ds.PhotometricInterpretation = "RGB" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, raw=True, decoding_plugin="gdcm") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == "YBR_FULL_422" @pytest.fixture() def enable_debugging(): original = config.debugging config.debugging = True yield config.debugging = original @pytest.mark.skipif(SKIP_TEST, reason="Test is missing dependencies") def test_version_check(enable_debugging, caplog): """Test _passes_version_check() when the package has no __version__""" # GDCM doesn't have a __version__ attribute with caplog.at_level(logging.DEBUG, logger="pydicom"): assert _passes_version_check("gdcm", (3, 0)) is False assert "module 'gdcm' has no attribute '__version__'" in caplog.text pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_native.py000066400000000000000000001112461515706620200242650ustar00rootroot00000000000000"""Test decoding native transfer syntaxes.""" import pytest from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.pixels import get_decoder from pydicom.pixels.decoders import ( ImplicitVRLittleEndianDecoder, ExplicitVRLittleEndianDecoder, ExplicitVRBigEndianDecoder, DeflatedExplicitVRLittleEndianDecoder, ) from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, ) try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from .pixels_reference import ( PIXEL_REFERENCE, EXPL_16_1_1F_PAD, IMPL_32_1_1F, EXPL_64_1F_DOUBLE_FLOAT, ) def name(ref): return f"{ref.name}" def get_pixel_keyword(ds): if "PixelData" in ds: return "PixelData" if "FloatPixelData" in ds: return "FloatPixelData" if "DoubleFloatPixelData" in ds: return "DoubleFloatPixelData" raise ValueError("No pixel data element found") @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestAsArray: """Tests for decoder.as_array() with native transfer syntaxes""" @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl(self, reference): """Test against the reference data for explicit little.""" decoder = get_decoder(ExplicitVRLittleEndian) if reference == EXPL_16_1_1F_PAD: msg = ( "The pixel data is 8320 bytes long, which indicates it contains " "128 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): arr, _ = decoder.as_array(reference.ds, raw=True) else: arr, _ = decoder.as_array(reference.ds, raw=True) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): if reference == EXPL_16_1_1F_PAD: msg = ( "The pixel data is 8320 bytes long, which indicates it contains " "128 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): arr, _ = decoder.as_array(reference.ds, raw=True) else: arr, _ = decoder.as_array(reference.ds, raw=True, index=index) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl_binary(self, reference): """Test against the reference data for explicit little for binary IO.""" decoder = get_decoder(ExplicitVRLittleEndian) ds = reference.ds pixel_keyword = get_pixel_keyword(ds) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "bits_allocated": ds.BitsAllocated, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": pixel_keyword, } if pixel_keyword == "PixelData": opts["bits_stored"] = ds.BitsStored opts["pixel_representation"] = ds.PixelRepresentation with open(reference.path, "rb") as f: file_offset = reference.ds[pixel_keyword].file_tell f.seek(file_offset) arr, _ = decoder.as_array(f, raw=True, **opts) assert f.tell() == file_offset reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, _ = decoder.as_array(f, raw=True, index=index, **opts) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable assert f.tell() == file_offset if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ImplicitVRLittleEndian], ids=name ) def test_reference_impl(self, reference): """Test against the reference data for implicit little.""" decoder = get_decoder(ImplicitVRLittleEndian) arr, _ = decoder.as_array(reference.ds, raw=True) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, _ = decoder.as_array(reference.ds, raw=True, index=index) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[DeflatedExplicitVRLittleEndian], ids=name ) def test_reference_defl(self, reference): """Test against the reference data for deflated little.""" decoder = get_decoder(DeflatedExplicitVRLittleEndian) arr, _ = decoder.as_array(reference.ds, raw=True) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, _ = decoder.as_array(reference.ds, raw=True, index=index) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb(self, reference): """Test against the reference data for explicit big.""" decoder = get_decoder(ExplicitVRBigEndian) arr, _ = decoder.as_array(reference.ds, raw=True) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, _ = decoder.as_array(reference.ds, raw=True, index=index) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb_binary(self, reference): """Test against the reference data for explicit big using binary IO.""" decoder = get_decoder(ExplicitVRBigEndian) ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", "pixel_vr": ds["PixelData"].VR, } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr, _ = decoder.as_array(f, raw=True, **opts) assert f.tell() == file_offset reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, _ = decoder.as_array(f, raw=True, index=index, **opts) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable assert f.tell() == file_offset if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestIterArray: """Tests for Decoder.iter_array() with native transfer syntaxes""" @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl(self, reference): """Test against the reference data for explicit little.""" decoder = get_decoder(ExplicitVRLittleEndian) frame_generator = decoder.iter_array(reference.ds, raw=True) if reference == EXPL_16_1_1F_PAD: msg = ( "The pixel data is 8320 bytes long, which indicates it contains " "128 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): arr, _ = next(frame_generator) else: arr, _ = next(frame_generator) reference.test(arr, index=0) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] for index, (arr, _) in enumerate(frame_generator): reference.test(arr, index=index + 1) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl_binary(self, reference): """Test against the reference data for explicit little for binary IO.""" decoder = get_decoder(ExplicitVRLittleEndian) ds = reference.ds pixel_keyword = get_pixel_keyword(ds) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "bits_allocated": ds.BitsAllocated, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": pixel_keyword, } if pixel_keyword == "PixelData": opts["bits_stored"] = ds.BitsStored opts["pixel_representation"] = ds.PixelRepresentation with open(reference.path, "rb") as f: file_offset = reference.ds[pixel_keyword].file_tell f.seek(file_offset) frame_generator = decoder.iter_array(f, raw=True, **opts) arr, _ = next(frame_generator) reference.test(arr, index=0) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] for index, (arr, _) in enumerate(frame_generator): reference.test(arr, index=index + 1) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] assert f.tell() == file_offset @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ImplicitVRLittleEndian], ids=name ) def test_reference_impl(self, reference): """Test against the reference data for implicit little.""" decoder = get_decoder(ImplicitVRLittleEndian) for index, (arr, _) in enumerate(decoder.iter_array(reference.ds, raw=True)): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[DeflatedExplicitVRLittleEndian], ids=name ) def test_reference_defl(self, reference): """Test against the reference data for deflated little.""" decoder = get_decoder(DeflatedExplicitVRLittleEndian) for index, (arr, _) in enumerate(decoder.iter_array(reference.ds, raw=True)): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb(self, reference): """Test against the reference data for explicit big.""" decoder = get_decoder(ExplicitVRBigEndian) for index, (arr, _) in enumerate(decoder.iter_array(reference.ds, raw=True)): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb_binary(self, reference): """Test against the reference data for explicit big for binary IO.""" decoder = get_decoder(ExplicitVRBigEndian) ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", "pixel_vr": ds["PixelData"].VR, } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) for index, (arr, _) in enumerate(decoder.iter_array(f, raw=True, **opts)): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] assert f.tell() == file_offset @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestAsBuffer: """Tests for Decoder.as_buffer() with native transfer syntaxes""" @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl(self, reference): """Test against the reference data for explicit little.""" decoder = get_decoder(ExplicitVRLittleEndian) # Exclude bit-packed and YBR_FULL_422 if reference.ds.BitsAllocated == 1: return if reference.ds.PhotometricInterpretation == "YBR_FULL_422": return if reference == EXPL_16_1_1F_PAD: msg = ( "The pixel data is 8320 bytes long, which indicates it contains " "128 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): arr, _ = decoder.as_array(reference.ds, raw=True) buffer, _ = decoder.as_buffer(reference.ds) else: arr, _ = decoder.as_array(reference.ds, raw=True) buffer, _ = decoder.as_buffer(reference.ds) assert arr.tobytes() == buffer for index in range(reference.number_of_frames): if reference == EXPL_16_1_1F_PAD: msg = ( "The pixel data is 8320 bytes long, which indicates it contains " "128 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): arr, _ = decoder.as_array(reference.ds, raw=True) buffer, _ = decoder.as_buffer(reference.ds) else: arr, _ = decoder.as_array(reference.ds, raw=True, index=index) buffer, _ = decoder.as_buffer(reference.ds, index=index) assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl_binary(self, reference): """Test against the reference data for explicit little for binary IO.""" decoder = get_decoder(ExplicitVRLittleEndian) # Exclude bit-packed and YBR_FULL_422 if reference.ds.BitsAllocated == 1: return if reference.ds.PhotometricInterpretation == "YBR_FULL_422": return ds = reference.ds pixel_keyword = get_pixel_keyword(ds) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "bits_allocated": ds.BitsAllocated, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": pixel_keyword, } if pixel_keyword == "PixelData": opts["bits_stored"] = ds.BitsStored opts["pixel_representation"] = ds.PixelRepresentation with open(reference.path, "rb") as f: file_offset = reference.ds[pixel_keyword].file_tell f.seek(file_offset) arr, _ = decoder.as_array(f, raw=True, **opts) buffer, _ = decoder.as_buffer(f, **opts) assert arr.tobytes() == buffer assert f.tell() == file_offset for index in range(reference.number_of_frames): arr, _ = decoder.as_array(f, raw=True, index=index, **opts) buffer, _ = decoder.as_buffer(f, index=index, **opts) assert arr.tobytes() == buffer assert f.tell() == file_offset @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ImplicitVRLittleEndian], ids=name ) def test_reference_impl(self, reference): """Test against the reference data for implicit little.""" decoder = get_decoder(ImplicitVRLittleEndian) arr, _ = decoder.as_array(reference.ds, raw=True) buffer, _ = decoder.as_buffer(reference.ds) assert arr.tobytes() == buffer for index in range(reference.number_of_frames): arr, _ = decoder.as_array(reference.ds, raw=True, index=index) buffer, _ = decoder.as_buffer(reference.ds, index=index) assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[DeflatedExplicitVRLittleEndian], ids=name ) def test_reference_defl(self, reference): """Test against the reference data for deflated little.""" decoder = get_decoder(DeflatedExplicitVRLittleEndian) arr, _ = decoder.as_array(reference.ds, raw=True) buffer, _ = decoder.as_buffer(reference.ds) assert arr.tobytes() == buffer for index in range(reference.number_of_frames): arr, _ = decoder.as_array(reference.ds, raw=True, index=index) buffer, _ = decoder.as_buffer(reference.ds, index=index) assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb(self, reference): """Test against the reference data for explicit big.""" ds = reference.ds # Exclude bit-packed and YBR_FULL_422 if ds.BitsAllocated == 1: return if ds.PhotometricInterpretation == "YBR_FULL_422": return if ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW": return decoder = get_decoder(ExplicitVRBigEndian) arr, _ = decoder.as_array(ds, raw=True) buffer, _ = decoder.as_buffer(ds) if ds.SamplesPerPixel > 1 and ds.PlanarConfiguration == 1: # Transpose to match colour by plane arr = arr.transpose(2, 0, 1) assert arr.tobytes() == buffer for index in range(reference.number_of_frames): arr, _ = decoder.as_array(ds, raw=True, index=index) buffer, _ = decoder.as_buffer(ds, index=index) if ds.SamplesPerPixel > 1 and ds.PlanarConfiguration == 1: # Transpose to match colour by plane arr = arr.transpose(2, 0, 1) assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb_binary(self, reference): """Test against the reference data for explicit big for binary IO.""" ds = reference.ds # Exclude bit-packed and YBR_FULL_422 if ds.BitsAllocated == 1: return if ds.PhotometricInterpretation == "YBR_FULL_422": return if ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW": return decoder = get_decoder(ExplicitVRBigEndian) ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", "pixel_vr": ds["PixelData"].VR, } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr, _ = decoder.as_array(f, raw=True, **opts) assert f.tell() == file_offset buffer, _ = decoder.as_buffer(f, **opts) assert f.tell() == file_offset if ds.SamplesPerPixel > 1 and ds.PlanarConfiguration == 1: # Transpose to match colour by plane arr = arr.transpose(2, 0, 1) assert arr.tobytes() == buffer for index in range(reference.number_of_frames): arr, _ = decoder.as_array(f, raw=True, index=index, **opts) assert f.tell() == file_offset buffer, _ = decoder.as_buffer(f, index=index, **opts) assert f.tell() == file_offset if ds.SamplesPerPixel > 1 and ds.PlanarConfiguration == 1: # Transpose to match colour by plane arr = arr.transpose(2, 0, 1) assert arr.tobytes() == buffer def test_expb_8bit_ow(self): """Test big endian 8-bit data written as OW""" decoder = get_decoder(ExplicitVRBigEndian) references = [ PIXEL_REFERENCE[ExplicitVRBigEndian][2], PIXEL_REFERENCE[ExplicitVRBigEndian][3], PIXEL_REFERENCE[ExplicitVRBigEndian][5], ] for idx, reference in enumerate(references): ds = reference.ds assert ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW" arr, _ = decoder.as_array(reference.ds, raw=True) buffer, _ = decoder.as_buffer(reference.ds) if arr.size % 2 == 0: # Even length - can just byteswap after re-viewing assert arr.view(">u2").byteswap().tobytes() == buffer else: # Odd length: need to pad + 1 pixel to be able to byteswap out = np.zeros((28), dtype=arr.dtype) out[:27] = arr.ravel() assert out.view(">u2").byteswap().tobytes() == buffer def test_expb_8bit_ow_binary(self): """Test big endian 8-bit data written as OW for binary IO""" decoder = get_decoder(ExplicitVRBigEndian) references = [ PIXEL_REFERENCE[ExplicitVRBigEndian][2], PIXEL_REFERENCE[ExplicitVRBigEndian][3], PIXEL_REFERENCE[ExplicitVRBigEndian][5], ] for idx, reference in enumerate(references): ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", "pixel_vr": ds["PixelData"].VR, } assert ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW" with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr, _ = decoder.as_array(f, raw=True, **opts) assert f.tell() == file_offset buffer, _ = decoder.as_buffer(f, **opts) assert f.tell() == file_offset if arr.size % 2 == 0: # Even length - can just byteswap after re-viewing assert arr.view(">u2").byteswap().tobytes() == buffer else: # Odd length: need to pad + 1 pixel to be able to byteswap out = np.zeros((28), dtype=arr.dtype) out[:27] = arr.ravel() assert out.view(">u2").byteswap().tobytes() == buffer @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestIterBuffer: """Tests for Decoder.iter_buffer() with native transfer syntaxes""" @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl(self, reference): """Test against the reference data for explicit little.""" decoder = get_decoder(ExplicitVRLittleEndian) if reference.ds.BitsAllocated == 1: return if reference.ds.PhotometricInterpretation == "YBR_FULL_422": return arr_gen = decoder.iter_array(reference.ds, raw=True) buf_gen = decoder.iter_buffer(reference.ds) if reference == EXPL_16_1_1F_PAD: msg = ( "The pixel data is 8320 bytes long, which indicates it contains " "128 bytes of excess padding to be removed" ) with pytest.warns(UserWarning, match=msg): arr, _ = next(arr_gen) buffer, _ = next(buf_gen) else: arr, _ = next(arr_gen) buffer, _ = next(buf_gen) assert arr.tobytes() == buffer for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRLittleEndian], ids=name ) def test_reference_expl_binary(self, reference): """Test against the reference data for explicit little for binary IO.""" decoder = get_decoder(ExplicitVRLittleEndian) if reference.ds.BitsAllocated == 1: return if reference.ds.PhotometricInterpretation == "YBR_FULL_422": return ds = reference.ds pixel_keyword = get_pixel_keyword(ds) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "bits_allocated": ds.BitsAllocated, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": pixel_keyword, } if pixel_keyword == "PixelData": opts["bits_stored"] = ds.BitsStored opts["pixel_representation"] = ds.PixelRepresentation with open(reference.path, "rb") as f: file_offset = reference.ds[pixel_keyword].file_tell f.seek(file_offset) arr_gen = decoder.iter_array(f, raw=True, **opts) buf_gen = decoder.iter_buffer(f, **opts) arr, _ = next(arr_gen) assert f.tell() == file_offset buffer, _ = next(buf_gen) assert f.tell() == file_offset assert arr.tobytes() == buffer for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): assert arr.tobytes() == buffer assert f.tell() == file_offset @pytest.mark.parametrize("reference", PIXEL_REFERENCE[ImplicitVRLittleEndian]) def test_reference_impl(self, reference): """Test against the reference data for implicit little.""" decoder = get_decoder(ImplicitVRLittleEndian) arr_gen = decoder.iter_array(reference.ds, raw=True) buf_gen = decoder.iter_buffer(reference.ds) for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[DeflatedExplicitVRLittleEndian], ids=name ) def test_reference_defl(self, reference): """Test against the reference data for deflated little.""" decoder = get_decoder(DeflatedExplicitVRLittleEndian) arr_gen = decoder.iter_array(reference.ds, raw=True) buf_gen = decoder.iter_buffer(reference.ds) for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb(self, reference): """Test against the reference data for explicit big.""" ds = reference.ds if ds.BitsAllocated == 1: return if ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW": return decoder = get_decoder(ExplicitVRBigEndian) arr_gen = decoder.iter_array(ds, raw=True) buf_gen = decoder.iter_buffer(ds) for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): if ds.SamplesPerPixel > 1 and ds.PlanarConfiguration == 1: # Transpose to match colour by plane arr = arr.transpose(2, 0, 1) assert arr.tobytes() == buffer @pytest.mark.parametrize( "reference", PIXEL_REFERENCE[ExplicitVRBigEndian], ids=name ) def test_reference_expb_binary(self, reference): """Test against the reference data for explicit big for binary IO.""" ds = reference.ds if ds.BitsAllocated == 1: return if ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW": return decoder = get_decoder(ExplicitVRBigEndian) ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr_gen = decoder.iter_array(f, raw=True, **opts) buf_gen = decoder.iter_buffer(f, **opts) for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): assert f.tell() == file_offset if ds.SamplesPerPixel > 1 and ds.PlanarConfiguration == 1: # Transpose to match colour by plane arr = arr.transpose(2, 0, 1) assert arr.tobytes() == buffer def test_expb_8bit_ow(self): """Test big endian 8-bit data written as OW""" decoder = get_decoder(ExplicitVRBigEndian) references = [ PIXEL_REFERENCE[ExplicitVRBigEndian][2], PIXEL_REFERENCE[ExplicitVRBigEndian][3], PIXEL_REFERENCE[ExplicitVRBigEndian][5], ] for idx, reference in enumerate(references): ds = reference.ds assert ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW" arr_gen = decoder.iter_array(reference.ds, raw=True) buf_gen = decoder.iter_buffer(reference.ds) for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): if arr.size % 2 == 0: # Even length - can just byteswap after re-viewing assert arr.view(">u2").byteswap().tobytes() == buffer else: # Odd length: need to pad + 1 pixel to be able to byteswap out = np.zeros((arr.size + 1), dtype=arr.dtype) out[: arr.size] = arr.ravel() assert out.view(">u2").byteswap().tobytes() == buffer def test_expb_8bit_ow_binary(self): """Test big endian 8-bit data written as OW as binary IO""" decoder = get_decoder(ExplicitVRBigEndian) references = [ PIXEL_REFERENCE[ExplicitVRBigEndian][2], PIXEL_REFERENCE[ExplicitVRBigEndian][3], PIXEL_REFERENCE[ExplicitVRBigEndian][5], ] for idx, reference in enumerate(references): ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", "pixel_vr": ds["PixelData"].VR, } assert ds.BitsAllocated == 8 and ds["PixelData"].VR == "OW" with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr_gen = decoder.iter_array(f, raw=True, **opts) buf_gen = decoder.iter_buffer(f, **opts) for (arr, _), (buffer, _) in zip(arr_gen, buf_gen): assert f.tell() == file_offset if arr.size % 2 == 0: # Even length - can just byteswap after re-viewing assert arr.view(">u2").byteswap().tobytes() == buffer else: # Odd length: need to pad + 1 pixel to be able to byteswap out = np.zeros((arr.size + 1), dtype=arr.dtype) out[: arr.size] = arr.ravel() assert out.view(">u2").byteswap().tobytes() == buffer pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_pillow.py000066400000000000000000000160321515706620200243020ustar00rootroot00000000000000"""Test the pillow decoder.""" import importlib import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: from PIL import Image, features except ImportError: pass from pydicom import dcmread from pydicom.encaps import get_frame from pydicom.pixels import get_decoder from pydicom.pixels.decoders.pillow import is_available from pydicom.uid import ( JPEGBaseline8Bit, JPEGExtended12Bit, JPEG2000Lossless, JPEG2000, ) from .pixels_reference import ( PIXEL_REFERENCE, J2KR_08_08_3_0_1F_YBR_RCT, JPGB_08_08_3_0_1F_RGB, # has RGB component IDs JPGB_08_08_3_0_1F_YBR_FULL, # has JFIF APP marker J2KR_16_10_1_0_1F_M1, ) HAVE_PILLOW = bool(importlib.util.find_spec("PIL")) HAVE_LJ = features.check_codec("jpg") if HAVE_PILLOW else False HAVE_OJ = features.check_codec("jpg_2000") if HAVE_PILLOW else False SKIP_LJ = not (HAVE_NP and HAVE_LJ) SKIP_OJ = not (HAVE_NP and HAVE_OJ) def name(ref): return f"{ref.name}" def test_is_available_unknown_uid(): """Test is_available() for an unknown UID""" assert is_available("1.2.3.4") is False @pytest.mark.skipif(SKIP_LJ, reason="Test is missing dependencies") class TestLibJpegDecoder: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGBaseline8Bit], ids=name) def test_jpg_baseline(self, reference): """Test the decoder with JPEGBaseline8Bit.""" decoder = get_decoder(JPEGBaseline8Bit) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pillow") reference.test(arr, plugin="pillow") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGExtended12Bit], ids=name) def test_jpg_extended(self, reference): """Test the decoder with JPEGExtended12Bit.""" decoder = get_decoder(JPEGExtended12Bit) if reference.ds.BitsStored == 12: msg = ( "Unable to decode as exceptions were raised by all available " "plugins:\n pillow: Pillow does not support 'JPEG Extended' " "for samples with 12-bit precision" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array(reference.ds, decoding_plugin="pillow") else: arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pillow") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable def test_rgb_component_ids(self): """Test decoding an incorrect photometric interpretation using cIDs.""" decoder = get_decoder(JPEGBaseline8Bit) reference = JPGB_08_08_3_0_1F_RGB msg = ( r"The \(0028,0004\) 'Photometric Interpretation' value is " "'YBR_FULL_422' however the encoded image's codestream uses " "component IDs that indicate it should be 'RGB'" ) ds = dcmread(reference.path) ds.PhotometricInterpretation = "YBR_FULL_422" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, raw=True, decoding_plugin="pillow") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == "RGB" def test_jfif(self): """Test decoding an incorrect photometric interpretation using JFIF.""" decoder = get_decoder(JPEGBaseline8Bit) reference = JPGB_08_08_3_0_1F_YBR_FULL msg = ( r"The \(0028,0004\) 'Photometric Interpretation' value is " "'RGB' however the encoded image's codestream contains a JFIF APP " "marker which indicates it should be 'YBR_FULL_422'" ) ds = dcmread(reference.path) ds.PhotometricInterpretation = "RGB" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, raw=True, decoding_plugin="pillow") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == "YBR_FULL_422" @pytest.mark.skipif(SKIP_OJ, reason="Test is missing dependencies") class TestOpenJpegDecoder: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEG2000Lossless], ids=name) def test_j2k_lossless(self, reference): """Test the decoder with JPEG2000Lossless.""" decoder = get_decoder(JPEG2000Lossless) if reference == J2KR_08_08_3_0_1F_YBR_RCT: msg = ( "Unable to decode as exceptions were raised by all available " "plugins:\n pillow: broken data stream when reading image file" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array(reference.ds, raw=True, decoding_plugin="pillow") else: arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pillow") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEG2000], ids=name) def test_j2k(self, reference): """Test the decoder with JPEG2000.""" decoder = get_decoder(JPEG2000) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pillow") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable def test_u4_raises(self): """Test decoding greyscale with bits stored > 16 raises exception.""" decoder = get_decoder(JPEG2000Lossless) ds = dcmread(J2KR_08_08_3_0_1F_YBR_RCT.path) # Manually edit the precision in the J2K codestream data = bytearray(ds.PixelData) data[1716:1717] = b"\x10" ds.PixelData = bytes(data) msg = ( "Unable to decode as exceptions were raised by all available plugins:\n" r" pillow: only \(0028,0101\) 'Bits Stored' values of up " "to 16 are supported" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array(ds, decoding_plugin="pillow") def test_multisample_16bit_raises(self): """Test that > 8-bit RGB datasets raise exception""" decoder = get_decoder(JPEG2000Lossless) ds = J2KR_16_10_1_0_1F_M1.ds msg = ( "Unable to decode as exceptions were raised by all available plugins:\n" r" pillow: Pillow cannot decode 10-bit multi-sample data correctly" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array( ds, decoding_plugin="pillow", samples_per_pixel=3, planar_configuration=0, ) pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_pyjpegls.py000066400000000000000000000060661515706620200246370ustar00rootroot00000000000000"""Test the pyjpegls decoder.""" import importlib import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom.pixels import get_decoder from pydicom.uid import JPEGLSLossless, JPEGLSNearLossless from .pixels_reference import PIXEL_REFERENCE, JLSN_08_01_1_0_1F HAVE_PYJPEGLS = bool(importlib.util.find_spec("jpeg_ls")) SKIP_TEST = not HAVE_NP or not HAVE_PYJPEGLS def name(ref): return f"{ref.name}" @pytest.mark.skipif(SKIP_TEST, reason="Test is missing dependencies") class TestPyJpegLSDecoder: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLSLossless], ids=name) def test_jls_lossless(self, reference): """Test the decoder with JPEGLSLossless.""" decoder = get_decoder(JPEGLSLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pyjpegls") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLSNearLossless], ids=name) def test_jls_lossy(self, reference): """Test the decoder with JPEGLSNearLossless.""" decoder = get_decoder(JPEGLSNearLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pyjpegls") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable def test_bits_allocated_mismatch_as_array(self): """Test the result when bits stored <= 8 and bits allocated 16""" # The JPEG-LS codestream uses a precision of 8, so it will return # 8-bit values, however the decoding process nominally expects 16-bit decoder = get_decoder(JPEGLSNearLossless) arr, meta = decoder.as_array( JLSN_08_01_1_0_1F.ds, raw=True, decoding_plugin="pyjpegls", bits_allocated=16, ) JLSN_08_01_1_0_1F.test(arr) assert arr.shape == JLSN_08_01_1_0_1F.shape assert arr.dtype != JLSN_08_01_1_0_1F.dtype assert arr.dtype == np.uint16 assert arr.flags.writeable assert meta["bits_allocated"] == 16 assert meta["bits_stored"] == 8 def test_bits_allocated_mismatch_as_buffer(self): """Test the result when bits stored <= 8 and bits allocated 16""" decoder = get_decoder(JPEGLSNearLossless) ds = JLSN_08_01_1_0_1F.ds buffer, meta = decoder.as_buffer( ds, raw=True, decoding_plugin="pyjpegls", bits_allocated=16, ) assert ds.BitsStored == 8 assert len(buffer) == ds.Rows * ds.Columns * ds.SamplesPerPixel arr = np.frombuffer(buffer, dtype="u1") arr = arr.reshape((ds.Rows, ds.Columns)) JLSN_08_01_1_0_1F.test(arr) assert arr.shape == JLSN_08_01_1_0_1F.shape # as_buffer() returns container sized to codestream precision assert meta["bits_allocated"] == 8 assert meta["bits_stored"] == 8 pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_pylibjpeg.py000066400000000000000000000352621515706620200247670ustar00rootroot00000000000000"""Test the pylibjpeg decoder.""" import importlib import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import dcmread from pydicom.encaps import get_frame, encapsulate from pydicom.pixels import get_decoder from pydicom.pixels.decoders.pylibjpeg import is_available from pydicom.uid import ( JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, HTJ2KLossless, HTJ2KLosslessRPCL, HTJ2K, RLELossless, ) from pydicom.pixels.utils import get_j2k_parameters from .pixels_reference import ( PIXEL_REFERENCE, JPGE_BAD, J2KR_16_13_1_1_1F_M2_MISMATCH, JLSN_08_01_1_0_1F, JPGB_08_08_3_0_1F_RGB, # has RGB component IDs JPGB_08_08_3_0_1F_YBR_FULL, # has JFIF APP marker JLSL_08_07_1_0_1F, JLSL_16_15_1_1_1F, JPGB_08_08_3_0_120F_YBR_FULL_422, ) HAVE_PYLJ = bool(importlib.util.find_spec("pylibjpeg")) HAVE_LJ = bool(importlib.util.find_spec("libjpeg")) HAVE_OJ = bool(importlib.util.find_spec("openjpeg")) HAVE_RLE = bool(importlib.util.find_spec("rle")) SKIP_LJ = not (HAVE_NP and HAVE_PYLJ and HAVE_LJ) SKIP_OJ = not (HAVE_NP and HAVE_PYLJ and HAVE_OJ) SKIP_RLE = not (HAVE_NP and HAVE_PYLJ and HAVE_RLE) def name(ref): return f"{ref.name}" def test_is_available_unknown_uid(): """Test is_available() for an unknown UID""" assert is_available("1.2.3.4") is False @pytest.mark.skipif(SKIP_LJ, reason="Test is missing dependencies") class TestLibJpegDecoder: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGBaseline8Bit], ids=name) def test_jpg_baseline(self, reference): """Test the decoder with JPEGBaseline8Bit.""" decoder = get_decoder(JPEGBaseline8Bit) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGExtended12Bit], ids=name) def test_jpg_extended(self, reference): """Test the decoder with JPEGExtended12Bit.""" # Invalid spectrum end value, decode fails if reference.name == "JPEG-lossy.dcm": return decoder = get_decoder(JPEGExtended12Bit) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLossless], ids=name) def test_jpg_lossless(self, reference): """Test the decoder with JPEGLossless.""" decoder = get_decoder(JPEGLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLosslessSV1], ids=name) def test_jpg_lossless_sv1(self, reference): """Test the decoder with JPEGLosslessSV1.""" decoder = get_decoder(JPEGLosslessSV1) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLSLossless], ids=name) def test_jls_lossless(self, reference): """Test the decoder with JPEGLSLossless.""" decoder = get_decoder(JPEGLSLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEGLSNearLossless], ids=name) def test_jls_lossy(self, reference): """Test the decoder with JPEGLSNearLossless.""" decoder = get_decoder(JPEGLSNearLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable def test_jpg_extended_invalid_se_raises(self): """Test invalid scan stop raises an exception.""" decoder = get_decoder(JPEGExtended12Bit) msg = ( "Unable to decode as exceptions were raised by all available " "plugins:\n pylibjpeg: libjpeg error code '-1038' returned " r"from Decode\(\): A misplaced marker segment was found - scan " "start must be zero and scan stop must be 63 for the sequential " "operating modes" ) with pytest.raises(RuntimeError, match=msg): decoder.as_array(JPGE_BAD.ds, decoding_plugin="pylibjpeg") def test_bits_allocated_mismatch(self): """Test the result when bits stored <= 8 and bits allocated 16""" # The JPEG-LS codestream uses a precision of 8, so it will return # 8-bit values, however the decoding process nominally expects 16-bit decoder = get_decoder(JPEGLSNearLossless) arr, meta = decoder.as_array( JLSN_08_01_1_0_1F.ds, raw=True, decoding_plugin="pylibjpeg", bits_allocated=16, ) JLSN_08_01_1_0_1F.test(arr) assert arr.shape == JLSN_08_01_1_0_1F.shape assert arr.dtype != JLSN_08_01_1_0_1F.dtype assert arr.dtype == np.uint16 assert arr.flags.writeable assert meta["bits_allocated"] == 16 assert meta["bits_stored"] == 8 def test_bits_allocated_mismatch_as_buffer(self): """Test the result when bits stored <= 8 and bits allocated 16""" decoder = get_decoder(JPEGLSNearLossless) ds = JLSN_08_01_1_0_1F.ds buffer, meta = decoder.as_buffer( ds, raw=True, decoding_plugin="pylibjpeg", bits_allocated=16, ) assert ds.BitsStored == 8 assert len(buffer) == ds.Rows * ds.Columns * ds.SamplesPerPixel arr = np.frombuffer(buffer, dtype="u1") arr = arr.reshape((ds.Rows, ds.Columns)) JLSN_08_01_1_0_1F.test(arr) assert arr.shape == JLSN_08_01_1_0_1F.shape assert meta["bits_allocated"] == 8 assert meta["bits_stored"] == 8 def test_rgb_component_ids(self): """Test decoding an incorrect photometric interpretation using cIDs.""" decoder = get_decoder(JPEGBaseline8Bit) reference = JPGB_08_08_3_0_1F_RGB msg = ( r"The \(0028,0004\) 'Photometric Interpretation' value is " "'YBR_FULL_422' however the encoded image's codestream uses " "component IDs that indicate it should be 'RGB'" ) ds = dcmread(reference.path) ds.PhotometricInterpretation = "YBR_FULL_422" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == "RGB" def test_jfif(self): """Test decoding an incorrect photometric interpretation using JFIF.""" decoder = get_decoder(JPEGBaseline8Bit) reference = JPGB_08_08_3_0_1F_YBR_FULL msg = ( r"The \(0028,0004\) 'Photometric Interpretation' value is " "'RGB' however the encoded image's codestream contains a JFIF APP " "marker which indicates it should be 'YBR_FULL_422'" ) ds = dcmread(reference.path) ds.PhotometricInterpretation = "RGB" with pytest.warns(UserWarning, match=msg): arr, meta = decoder.as_array(ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr, plugin="pylibjpeg") assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable assert meta["photometric_interpretation"] == "YBR_FULL_422" def test_mixed_container_sizes(self): """Test mixed decoded pixel container sizes get upscaled.""" d8 = get_frame(JLSL_08_07_1_0_1F.ds.PixelData, 0) d16 = get_frame(JLSL_16_15_1_1_1F.ds.PixelData, 0) ds = dcmread(JLSL_08_07_1_0_1F.path) ds.PixelData = encapsulate([d8, d16]) ds.NumberOfFrames = 2 ds.BitsAllocated = 16 ds.BitsStored = 16 ds.HighBit = 15 ds.PixelRepresentation = 1 decoder = get_decoder(JPEGLSLossless) buffer, meta = decoder.as_buffer(ds, decoding_plugin="pylibjpeg") assert meta["bits_allocated"] == 16 arr = np.frombuffer(buffer, dtype="u2") arr = arr.reshape(2, ds.Rows, ds.Columns) JLSL_08_07_1_0_1F.test(arr[0], plugin="pylibjpeg") arr = arr.astype("i2") # Needs bit-shifting to convert values to signed np.left_shift(arr, 1, out=arr) np.right_shift(arr, 1, out=arr) JLSL_16_15_1_1_1F.test(arr[1], plugin="pylibjpeg") def test_iter_array_ybr_to_rgb(self): """Test conversion from YBR to RGB for multi-framed data.""" ds = JPGB_08_08_3_0_120F_YBR_FULL_422.ds assert ds.PhotometricInterpretation == "YBR_FULL_422" indices = [0, 60, -1] decoder = get_decoder(ds.file_meta.TransferSyntaxUID) func = decoder.iter_array(ds, decoding_plugin="pylibjpeg", indices=indices) for index, (arr, meta) in zip(indices, func): assert meta["photometric_interpretation"] == "RGB" JPGB_08_08_3_0_120F_YBR_FULL_422.test( arr, as_rgb=True, plugin="pylibjpeg", index=index ) def test_iter_planar_configuration(self): """Test iter_pixels() with planar configuration.""" ds = dcmread(JPGB_08_08_3_0_120F_YBR_FULL_422.path) decoder = get_decoder(ds.file_meta.TransferSyntaxUID) ds.PlanarConfiguration = 1 # Always 0 when converting to an ndarray for _, meta in decoder.iter_array(ds, decoding_plugin="pylibjpeg"): assert meta["planar_configuration"] == 0 @pytest.mark.skipif(SKIP_OJ, reason="Test is missing dependencies") class TestOpenJpegDecoder: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEG2000Lossless], ids=name) def test_j2k_lossless(self, reference): """Test the decoder with JPEG2000Lossless.""" decoder = get_decoder(JPEG2000Lossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[JPEG2000], ids=name) def test_j2k(self, reference): """Test the decoder with JPEG2000.""" decoder = get_decoder(JPEG2000) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[HTJ2KLossless], ids=name) def test_htj2k_lossless(self, reference): """Test the decoder with HTJ2KLossless.""" decoder = get_decoder(HTJ2KLossless) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[HTJ2KLosslessRPCL], ids=name) def test_htj2k_lossless_rpcl(self, reference): """Test the decoder with HTJ2KLosslessRPCL.""" decoder = get_decoder(HTJ2KLosslessRPCL) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable @pytest.mark.parametrize("reference", PIXEL_REFERENCE[HTJ2K], ids=name) def test_htj2k(self, reference): """Test the decoder with HTJ2K.""" decoder = get_decoder(HTJ2K) arr, _ = decoder.as_array(reference.ds, raw=True, decoding_plugin="pylibjpeg") reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable def test_iter_array(self): """Test J2k corrections are applied when using iter_array()""" reference = J2KR_16_13_1_1_1F_M2_MISMATCH decoder = get_decoder(JPEG2000Lossless) # Using all frames frame_gen = decoder.iter_array( reference.ds, raw=True, decoding_plugin="pylibjpeg" ) for arr, _ in frame_gen: reference.test(arr) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] # Using indices frame_gen = decoder.iter_array( reference.ds, raw=True, decoding_plugin="pylibjpeg", indices=[0] ) for arr, _ in frame_gen: reference.test(arr) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] @pytest.mark.skipif(SKIP_RLE, reason="Test is missing dependencies") class TestRleDecoder: @pytest.mark.parametrize("reference", PIXEL_REFERENCE[RLELossless], ids=name) def test_rle(self, reference): """Test the decoder with RLELossless.""" decoder = get_decoder(RLELossless) arr, meta = decoder.as_array( reference.ds, raw=True, decoding_plugin="pylibjpeg" ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable if meta["samples_per_pixel"] > 1: assert meta["planar_configuration"] == 0 buffer, meta = decoder.as_buffer( reference.ds, raw=True, decoding_plugin="pylibjpeg" ) if meta["samples_per_pixel"] > 1: assert meta["planar_configuration"] == 1 pydicom-pydicom-20aa4b7/tests/pixels/test_decoder_rle.py000066400000000000000000001011741515706620200235600ustar00rootroot00000000000000"""Tests for the RLELosslessDecoder and the pydicom RLE plugin.""" from io import BytesIO from struct import pack, unpack import pytest from pydicom import dcmread from pydicom.config import debug from pydicom.encaps import get_frame, generate_frames, encapsulate from pydicom.pixels import get_decoder from pydicom.pixels.decoders import RLELosslessDecoder from pydicom.pixels.decoders.rle import ( _rle_parse_header, _rle_decode_segment, _rle_decode_frame, ) from pydicom.uid import RLELossless, ExplicitVRLittleEndian try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from .pixels_reference import PIXEL_REFERENCE, RLE_16_1_1F, RLE_16_1_10F RLE_REFERENCE = PIXEL_REFERENCE[RLELossless] def name(ref): return f"{ref.name}" @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestAsArray: """Tests for as_array() with RLE lossless""" def setup_method(self): self.decoder = get_decoder(RLELossless) @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference(self, reference): """Test against the reference data for RLE lossless using dataset.""" arr, _ = self.decoder.as_array( reference.ds, raw=True, decoding_plugin="pydicom" ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, meta = self.decoder.as_array( reference.ds, raw=True, index=index, decoding_plugin="pydicom" ) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] if reference.ds.SamplesPerPixel > 1: # The returned array is always planar configuration 0 assert meta["planar_configuration"] == 0 @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference_binary(self, reference): """Test against the reference data for RLE lossless using binary IO.""" ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr, _ = self.decoder.as_array( f, raw=True, decoding_plugin="pydicom", **opts ) reference.test(arr) assert arr.shape == reference.shape assert arr.dtype == reference.dtype assert arr.flags.writeable for index in range(reference.number_of_frames): arr, _ = self.decoder.as_array( f, raw=True, index=index, decoding_plugin="pydicom", **opts ) reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] assert f.tell() == file_offset def test_little_endian_segment_order(self): """Test interpreting segment order as little endian.""" ds = RLE_16_1_1F.ds arr, _ = self.decoder.as_array( ds, rle_segment_order="<", decoding_plugin="pydicom" ) assert arr.dtype == RLE_16_1_1F.dtype assert arr.shape == RLE_16_1_1F.shape assert tuple(arr[0, 31:34]) == (-23039, 16129, 26881) assert tuple(arr[31, :3]) == (28161, 27393, 16897) assert tuple(arr[-1, -3:]) == (22789, 26884, 24067) assert not np.array_equal(self.decoder.as_array(ds, rle_segment_order=">"), arr) def test_index_greater_than_frames(self): """Test being able to index an extra frame.""" # Issue 1666 reference = RLE_16_1_10F # Override NumberOfFrames to 9 and try and get the 10th frame arr, _ = self.decoder.as_array( reference.ds, number_of_frames=9, index=9, decoding_plugin="pydicom" ) reference.test(arr, index=9) assert arr.dtype == reference.dtype assert arr.flags.writeable assert arr.shape == reference.shape[1:] @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestIterArray: """Tests for iter_array() with RLE lossless""" def setup_method(self): self.decoder = get_decoder(RLELossless) @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference(self, reference): """Test against the reference data for RLE lossless.""" func = self.decoder.iter_array( reference.ds, raw=True, decoding_plugin="pydicom" ) for index, (arr, meta) in enumerate(func): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] if reference.ds.SamplesPerPixel > 1: # The returned array is always planar configuration 0 assert meta["planar_configuration"] == 0 @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference_binary(self, reference): """Test against the reference data for RLE lossless for binary IO.""" ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) func = self.decoder.iter_array( f, raw=True, decoding_plugin="pydicom", **opts ) for index, (arr, _) in enumerate(func): reference.test(arr, index=index) assert arr.dtype == reference.dtype assert arr.flags.writeable if reference.number_of_frames == 1: assert arr.shape == reference.shape else: assert arr.shape == reference.shape[1:] assert f.tell() == file_offset def test_indices(self): """Test the `indices` argument.""" indices = [0, 4, 9] func = self.decoder.iter_array( RLE_16_1_10F.ds, raw=True, indices=indices, decoding_plugin="pydicom" ) for idx, (arr, _) in enumerate(func): RLE_16_1_10F.test(arr, index=indices[idx]) assert arr.dtype == RLE_16_1_10F.dtype assert arr.flags.writeable assert arr.shape == RLE_16_1_10F.shape[1:] assert idx == 2 @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestAsBuffer: """Tests for as_buffer() with RLELossless.""" def setup_method(self): self.decoder = get_decoder(RLELossless) @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference(self, reference): """Test against the reference data for RLE lossless.""" ds = reference.ds arr, _ = self.decoder.as_array( reference.ds, raw=True, decoding_plugin="pydicom" ) buffer, meta = self.decoder.as_buffer(reference.ds) frame_len = ds.Rows * ds.Columns * ds.SamplesPerPixel * ds.BitsAllocated // 8 for index in range(reference.number_of_frames): if reference.number_of_frames == 1: arr_frame = arr buffer_frame = buffer else: arr_frame = arr[index, ...] start = index * frame_len buffer_frame = buffer[start : start + frame_len] if ds.SamplesPerPixel == 1: assert arr_frame.tobytes() == buffer_frame else: assert meta["planar_configuration"] == 1 # Red arr_plane = arr_frame[..., 0].tobytes() plane_length = len(arr_plane) buf_plane = buffer_frame[:plane_length] assert arr_plane == buf_plane # Green arr_plane = arr_frame[..., 1].tobytes() buf_plane = buffer_frame[plane_length : 2 * plane_length] assert arr_plane == buf_plane # Blue arr_plane = arr_frame[..., 2].tobytes() buf_plane = buffer_frame[2 * plane_length :] assert arr_plane == buf_plane @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference_binary(self, reference): """Test against the reference data for RLE lossless for binary IO.""" ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) arr, _ = self.decoder.as_array( f, raw=True, decoding_plugin="pydicom", **opts ) assert f.tell() == file_offset buffer, _ = self.decoder.as_buffer(f, **opts) assert f.tell() == file_offset frame_len = ( ds.Rows * ds.Columns * ds.SamplesPerPixel * ds.BitsAllocated // 8 ) for index in range(reference.number_of_frames): if reference.number_of_frames == 1: arr_frame = arr buffer_frame = buffer else: arr_frame = arr[index, ...] start = index * frame_len buffer_frame = buffer[start : start + frame_len] if ds.SamplesPerPixel == 1: assert arr_frame.tobytes() == buffer_frame else: # Red arr_plane = arr_frame[..., 0].tobytes() plane_length = len(arr_plane) buf_plane = buffer_frame[:plane_length] assert arr_plane == buf_plane # Green arr_plane = arr_frame[..., 1].tobytes() buf_plane = buffer_frame[plane_length : 2 * plane_length] assert arr_plane == buf_plane # Blue arr_plane = arr_frame[..., 2].tobytes() buf_plane = buffer_frame[2 * plane_length :] assert arr_plane == buf_plane @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference_index(self, reference): """Test by `index` for RLE lossless""" ds = reference.ds for index in range(reference.number_of_frames): arr, _ = self.decoder.as_array( reference.ds, raw=True, index=index, decoding_plugin="pydicom" ) buffer, _ = self.decoder.as_buffer( reference.ds, index=index, decoding_plugin="pydicom" ) if ds.SamplesPerPixel == 1: assert arr.tobytes() == buffer else: # Red arr_plane = arr[..., 0].tobytes() plane_length = len(arr_plane) buf_plane = buffer[:plane_length] assert arr_plane == buf_plane # Green arr_plane = arr[..., 1].tobytes() buf_plane = buffer[plane_length : 2 * plane_length] assert arr_plane == buf_plane # Blue arr_plane = arr[..., 2].tobytes() buf_plane = buffer[2 * plane_length :] assert arr_plane == buf_plane @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference_index_binary(self, reference): """Test by `index` for RLE lossless for binary IO""" ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) for index in range(reference.number_of_frames): arr, _ = self.decoder.as_array( f, raw=True, index=index, decoding_plugin="pydicom", **opts ) assert f.tell() == file_offset buffer, _ = self.decoder.as_buffer( f, index=index, decoding_plugin="pydicom", **opts ) assert f.tell() == file_offset if ds.SamplesPerPixel == 1: assert arr.tobytes() == buffer else: # Red arr_plane = arr[..., 0].tobytes() plane_length = len(arr_plane) buf_plane = buffer[:plane_length] assert arr_plane == buf_plane # Green arr_plane = arr[..., 1].tobytes() buf_plane = buffer[plane_length : 2 * plane_length] assert arr_plane == buf_plane # Blue arr_plane = arr[..., 2].tobytes() buf_plane = buffer[2 * plane_length :] assert arr_plane == buf_plane @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestIterBuffer: """Tests for iter_buffer() with RLELossless.""" def setup_method(self): self.decoder = get_decoder(RLELossless) @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference(self, reference): """Test against the reference data for RLE lossless.""" arr_func = self.decoder.iter_array( reference.ds, raw=True, decoding_plugin="pydicom" ) buf_func = self.decoder.iter_buffer( reference.ds, raw=True, decoding_plugin="pydicom" ) for (arr, _), (buf, meta) in zip(arr_func, buf_func): if reference.ds.SamplesPerPixel == 3: # If samples per pixel is 3 then bytes are planar configuration 1 assert meta["planar_configuration"] == 1 # Red arr_frame = arr[..., 0].tobytes() frame_len = len(arr_frame) buf_frame = buf[:frame_len] assert arr_frame == buf_frame # Green arr_frame = arr[..., 1].tobytes() buf_frame = buf[frame_len : 2 * frame_len] assert arr_frame == buf_frame # Blue arr_frame = arr[..., 2].tobytes() buf_frame = buf[2 * frame_len :] assert arr_frame == buf_frame else: assert arr.tobytes() == buf @pytest.mark.parametrize("reference", RLE_REFERENCE, ids=name) def test_reference_binary(self, reference): """Test against the reference data for RLE lossless for binary IO.""" ds = reference.ds opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": ds.get("NumberOfFrames", 1), "planar_configuration": ds.get("PlanarConfiguration", 0), "pixel_keyword": "PixelData", } with open(reference.path, "rb") as f: file_offset = reference.ds["PixelData"].file_tell f.seek(file_offset) # Can't do two encapsulated iters at once with binary IO... arr_func = self.decoder.iter_array( f, raw=True, decoding_plugin="pydicom", **opts ) arrays = [arr for arr in arr_func] assert f.tell() == file_offset buf_func = self.decoder.iter_buffer( f, raw=True, decoding_plugin="pydicom", **opts ) for (arr, _), (buf, _) in zip(arrays, buf_func): if reference.ds.SamplesPerPixel == 3: # If samples per pixel is 3 then bytes are planar configuration 1 # Red arr_frame = arr[..., 0].tobytes() frame_len = len(arr_frame) buf_frame = buf[:frame_len] assert arr_frame == buf_frame # Green arr_frame = arr[..., 1].tobytes() buf_frame = buf[frame_len : 2 * frame_len] assert arr_frame == buf_frame # Blue arr_frame = arr[..., 2].tobytes() buf_frame = buf[2 * frame_len :] assert arr_frame == buf_frame else: assert arr.tobytes() == buf pytest.raises(StopIteration, next, buf_func) assert f.tell() == file_offset def test_indices(self): """Test the `indices` argument.""" indices = [0, 4, 9] arr_func = self.decoder.iter_array( RLE_16_1_10F.ds, raw=True, indices=indices, decoding_plugin="pydicom" ) buf_func = self.decoder.iter_buffer( RLE_16_1_10F.ds, raw=True, indices=indices, decoding_plugin="pydicom" ) for idx, ((arr, _), (buf, _)) in enumerate(zip(arr_func, buf_func)): assert arr.tobytes() == buf assert idx == 2 # RLE encodes data by first splitting a frame into 8-bit segments BAD_SEGMENT_DATA = [ # (RLE header, ds.SamplesPerPixel, ds.BitsAllocated) (b"\x00\x00\x00\x00", 1, 8), # 0 segments, 1 expected (b"\x02\x00\x00\x00", 1, 8), # 2 segments, 1 expected (b"\x02\x00\x00\x00", 3, 8), # 2 segments, 3 expected (b"\x04\x00\x00\x00", 3, 8), # 4 segments, 3 expected (b"\x01\x00\x00\x00", 1, 16), # 1 segment, 2 expected (b"\x03\x00\x00\x00", 1, 16), # 3 segments, 2 expected (b"\x05\x00\x00\x00", 3, 16), # 5 segments, 6 expected (b"\x07\x00\x00\x00", 3, 16), # 7 segments, 6 expected (b"\x03\x00\x00\x00", 1, 32), # 3 segments, 4 expected (b"\x05\x00\x00\x00", 1, 32), # 5 segments, 4 expected (b"\x0B\x00\x00\x00", 3, 32), # 11 segments, 12 expected (b"\x0D\x00\x00\x00", 3, 32), # 13 segments, 12 expected (b"\x07\x00\x00\x00", 1, 64), # 7 segments, 8 expected (b"\x09\x00\x00\x00", 1, 64), # 9 segments, 8 expected ] HEADER_DATA = [ # (Number of segments, offsets) (0, []), (1, [64]), (2, [64, 16]), (8, [64, 16, 31, 55, 62, 110, 142, 551]), (14, [64, 16, 31, 55, 62, 110, 142, 551, 641, 456, 43, 11, 6, 55]), (15, [64, 16, 31, 55, 62, 110, 142, 551, 641, 456, 43, 11, 6, 55, 9821]), ] class TestParseHeader: """Tests for _rle_parse_header().""" def test_invalid_header_length(self): """Test exception raised if header is not 64 bytes long.""" for length in [0, 1, 63, 65]: msg = r"RLE header can only be 64 bytes long" with pytest.raises(ValueError, match=msg): _rle_parse_header(b"\x00" * length) def test_invalid_nr_segments_raises(self): """Test that more than 15 segments raises exception.""" with pytest.raises(ValueError, match="invalid number of segments"): _rle_parse_header(b"\x10" + b"\x00" * 63) @pytest.mark.parametrize("nr_segments, offsets", HEADER_DATA) def test_parse_header(self, nr_segments, offsets): """Test parsing header data.""" # Encode the header header = bytearray() header.extend(pack("= 0 and n < 127: read next (n + 1) bytes literally elif n <= -1 and n >= -127: copy the next byte (-n + 1) times elif n = -128: do nothing Using uint8 (as in handler) --------------------------- if n < 128 read next (n + 1) bytes literally elif n > 128 copy the next byte (256 - n + 1) times elif n == 128 do nothing References ---------- DICOM Standard, Part 5, Annex G.3.2 """ def test_noop(self): """Test no-operation output.""" # For n == 128, do nothing # data is only noop, 0x80 = 128 data = b"\x80\x80\x80" assert bytes(_rle_decode_segment(data)) == b"" # noop at start, data after data = ( b"\x80\x80" # No operation b"\x05\x01\x02\x03\x04\x05\x06" # Literal b"\xFE\x01" # Copy b"\x80" ) assert bytes(_rle_decode_segment(data)) == ( b"\x01\x02\x03\x04\x05\x06\x01\x01\x01" ) # data at start, noop middle, data at end data = ( b"\x05\x01\x02\x03\x04\x05\x06" # Literal b"\x80" # No operation b"\xFE\x01" # Copy b"\x80" ) assert bytes(_rle_decode_segment(data)) == ( b"\x01\x02\x03\x04\x05\x06\x01\x01\x01" ) # data at start, noop end # Copy 6 bytes literally, then 3 x 0x01 data = b"\x05\x01\x02\x03\x04\x05\x06\xFE\x01\x80" assert bytes(_rle_decode_segment(data)) == ( b"\x01\x02\x03\x04\x05\x06\x01\x01\x01" ) def test_literal(self): """Test literal output.""" # For n < 128, read the next (n + 1) bytes literally # n = 0 (0x80 is 128 -> no operation) data = b"\x00\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02" # n = 1 data = b"\x01\x02\x03\x80" assert bytes(_rle_decode_segment(data)) == b"\x02\x03" # n = 127 data = b"\x7f" + b"\x40" * 128 + b"\x80" assert bytes(_rle_decode_segment(data)) == b"\x40" * 128 def test_copy(self): """Test copy output.""" # For n > 128, copy the next byte (257 - n) times # n = 255, copy x2 (0x80 is 128 -> no operation) data = b"\xFF\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02\x02" # n = 254, copy x3 data = b"\xFE\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02\x02\x02" # n = 129, copy x128 data = b"\x81\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02" * 128 @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") def test_dataset_decompress(): """Test Dataset.decompress with RLE Lossless""" ds = dcmread(RLE_16_1_1F.path) ref = ds.pixel_array ds.decompress(decoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ds.Rows * ds.Columns * (ds.BitsAllocated // 8) assert elem.is_undefined_length is False assert elem.VR == "OW" assert "NumberOfFrames" not in ds assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) pydicom-pydicom-20aa4b7/tests/pixels/test_encoder_base.py000066400000000000000000002047651515706620200237340ustar00rootroot00000000000000"""Tests for pydicom.pixels.encoders.base and Dataset.compress().""" import importlib import logging import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import config, examples from pydicom.data import get_testdata_file from pydicom.dataset import Dataset from pydicom.pixels.encoders import RLELosslessEncoder from pydicom.pixels.common import PhotometricInterpretation as PI from pydicom.pixels.encoders.base import Encoder, EncodeRunner from pydicom.pixels.utils import get_expected_length from pydicom.uid import ( UID, RLELossless, JPEGLSLossless, JPEG2000MC, JPEG2000Lossless, JPEGLSNearLossless, ) from .pixels_reference import ( PIXEL_REFERENCE, RLE_16_1_1F, EXPL_16_16_1F, ) HAVE_GDCM = bool(importlib.util.find_spec("gdcm")) HAVE_PYLJ = bool(importlib.util.find_spec("pylibjpeg")) HAVE_RLE = bool(importlib.util.find_spec("rle")) class TestEncodeRunner: """Tests for EncodeRunner.""" def test_init(self): """Test initial creation.""" runner = EncodeRunner(RLELossless) assert runner.transfer_syntax == RLELossless assert runner.get_option("pixel_keyword") == "PixelData" assert runner.get_option("byteorder") == "<" def test_set_source_dataset(self): """Test setting runner source and options via dataset.""" runner = EncodeRunner("1.2.3.4") runner.set_source(RLE_16_1_1F.ds) assert runner.bits_allocated == 16 assert runner.bits_stored == 16 assert runner.columns == 64 assert runner.number_of_frames == 1 assert runner.photometric_interpretation == PI.MONOCHROME2 assert runner.pixel_keyword == "PixelData" assert runner.pixel_representation == 1 assert runner.rows == 64 assert runner.samples_per_pixel == 1 assert runner.get_option("planar_configuration") is None assert runner.is_dataset assert runner.transfer_syntax == "1.2.3.4" assert runner.src is RLE_16_1_1F.ds.PixelData ds = Dataset() ds.BitsAllocated = 32 ds.BitsStored = 24 ds.Columns = 10 ds.Rows = 8 ds.SamplesPerPixel = 3 ds.NumberOfFrames = "5" ds.PixelData = None ds.PlanarConfiguration = 1 ds.PixelRepresentation = 0 ds.PhotometricInterpretation = "PALETTE COLOR" runner.set_source(ds) assert runner.is_dataset assert runner.bits_allocated == 32 assert runner.bits_stored == 24 assert runner.columns == 10 assert runner.number_of_frames == 5 assert runner.photometric_interpretation == PI.PALETTE_COLOR assert runner.pixel_keyword == "PixelData" assert runner.pixel_representation == 0 assert runner.rows == 8 assert runner.samples_per_pixel == 3 assert runner.planar_configuration == 1 @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_set_source_ndarray(self): """Setting runner source using an ndarray.""" runner = EncodeRunner(RLELossless) arr = np.ones((1, 2, 3), dtype="u2") assert arr.dtype.byteorder == ">" runner.set_source(arr) assert runner.is_array assert runner.src is not arr assert runner.src.dtype.byteorder == "<" assert np.array_equal(runner.src, np.ones((1, 2, 3))) def test_set_source_buffer(self): """Setting runner source using a buffer-like.""" runner = EncodeRunner(RLELossless) b = b"\x00\x01\x02\x03" runner.set_source(b) assert runner.is_buffer assert runner.src is b @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_set_source_raises(self): """Test runner.set_source() raises if unknown type.""" runner = EncodeRunner(RLELossless) msg = ( "'src' must be bytes, numpy.ndarray or pydicom.dataset.Dataset, " "not 'NoneType'" ) with pytest.raises(TypeError, match=msg): runner.set_source(None) def test_str(self): """Test str(EncodeRunner)""" runner = EncodeRunner(RLELossless) runner.set_encoders({"foo": None}) assert str(runner) == ( "EncodeRunner for 'RLE Lossless'\n" "Options\n" " transfer_syntax_uid: 1.2.840.10008.1.2.5\n" " byteorder: <\n" " pixel_keyword: PixelData\n" "Encoders\n" " foo" ) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_validate_array_dimensions(self): """Test the ndarray dimensions validation.""" runner = EncodeRunner(RLELossless) runner._src = np.ones((1,)) msg = "Unable to encode 1D ndarrays" with pytest.raises(ValueError, match=msg): runner._validate_array() runner._src = np.ones((1, 2, 3, 4, 5)) msg = "Unable to encode 5D ndarrays" with pytest.raises(ValueError, match=msg): runner._validate_array() @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_validate_array_shape(self): """Test the ndarray shape validation.""" runner = EncodeRunner(RLELossless) opts = {"rows": 1, "columns": 2, "number_of_frames": 1, "samples_per_pixel": 1} runner._src = np.ones((1, 1)) runner.set_options(**opts) msg = ( r"Mismatch between the expected ndarray shape \(1, 2\) and the " r"actual shape \(1, 1\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner._src = np.ones((2, 2)) runner.set_options(**opts) msg = ( r"Mismatch between the expected ndarray shape \(1, 2\) and the " r"actual shape \(2, 2\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner.set_option("samples_per_pixel", 3) msg = ( r"Mismatch between the expected ndarray shape \(1, 2, 3\) and the " r"actual shape \(2, 2\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner.set_option("number_of_frames", 4) msg = ( r"Mismatch between the expected ndarray shape \(4, 1, 2, 3\) and the " r"actual shape \(2, 2\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner.set_option("samples_per_pixel", 1) msg = ( r"Mismatch between the expected ndarray shape \(4, 1, 2\) and the " r"actual shape \(2, 2\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_validate_array_dtype(self): """Test the ndarray dtype validation.""" runner = EncodeRunner(RLELossless) opts = { "rows": 3, "columns": 4, "number_of_frames": 1, "samples_per_pixel": 1, "pixel_representation": 0, } runner._src = np.ones((3, 4), dtype="float32") runner.set_options(**opts) msg = ( "The ndarray's dtype 'float32' is not supported, must be a signed " "or unsigned integer type" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner._src = np.ones((3, 4), dtype="i1") msg = ( r"The ndarray's dtype 'int8' is not consistent with a \(0028,0103\) " r"'Pixel Representation' of '0' \(unsigned integers\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner.set_option("pixel_representation", 1) runner._src = np.ones((3, 4), dtype="u1") msg = ( r"The ndarray's dtype 'uint8' is not consistent with a \(0028,0103\) " r"'Pixel Representation' of '1' \(signed integers\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_validate_array_values(self): """Test the ndarray values validation.""" runner = EncodeRunner(RLELossless) opts = { "rows": 3, "columns": 4, "number_of_frames": 1, "samples_per_pixel": 1, "pixel_representation": 0, "bits_allocated": 16, } runner._src = np.ones((3, 4), dtype="u1") runner.set_options(**opts) msg = ( r"The ndarray's dtype 'uint8' is not consistent with a \(0028,0100\) " "'Bits Allocated' value of '16'" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner.set_option("bits_stored", 2) runner._src = np.ones((3, 4), dtype="u2") * 4 msg = ( "The ndarray contains values that are outside the allowable range " r"of \(0, 3\) for a \(0028,0101\) 'Bits Stored' value of '2'" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner.set_option("bits_stored", 3) runner.set_option("pixel_representation", 1) runner._src = np.ones((3, 4), dtype="i2") * 4 msg = ( "The ndarray contains values that are outside the allowable range " r"of \(-4, 3\) for a \(0028,0101\) 'Bits Stored' value of '3'" ) with pytest.raises(ValueError, match=msg): runner._validate_array() runner._src = np.ones((3, 4), dtype="i2") * -5 with pytest.raises(ValueError, match=msg): runner._validate_array() @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_validate_array_jls_lossy(self): """Test pixel value range for lossy JPEG-LS encoding.""" runner = EncodeRunner(JPEGLSNearLossless) opts = { "rows": 3, "columns": 4, "number_of_frames": 1, "samples_per_pixel": 1, "pixel_representation": 1, "bits_allocated": 16, "jls_error": 3, } # Use a minimum bits_stored of 4 so we have a usable range # min/max = (-8, 7) -> limit (-5, 4) for bits_stored in range(4, 17): opts["bits_stored"] = bits_stored arr = np.ones((3, 4), dtype="i2") minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 # Both OK arr[0, 0] = minimum + 3 arr[0, 1] = maximum - 3 runner._src = arr runner.set_options(**opts) runner._validate_array() arr = np.ones((3, 4), dtype="i2") minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 # Minimum is outside range arr[0, 0] = minimum + 2 arr[0, 1] = maximum - 3 runner._src = arr runner.set_options(**opts) msg = ( "The supported range of pixel values when performing lossy " r"JPEG-LS encoding of signed integers with a \(0028,0103\) " f"'Bits Stored' value of '{bits_stored}' and a 'jls_error' " rf"of '3' is \({minimum + 3}, {maximum - 3}\)" ) with pytest.raises(ValueError, match=msg): runner._validate_array() arr = np.ones((3, 4), dtype="i2") minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 # Maximum is outside range arr[0, 0] = minimum + 3 arr[0, 1] = maximum - 2 runner._src = arr runner.set_options(**opts) with pytest.raises(ValueError, match=msg): runner._validate_array() def test_validate_buffer(self): """Test the buffer validation.""" runner = EncodeRunner(RLELossless) opts = { "rows": 3, "columns": 4, "number_of_frames": 1, "samples_per_pixel": 1, "bits_allocated": 16, "photometric_interpretation": PI.MONOCHROME2, } runner._src = b"\x00" * 23 runner.set_options(**opts) msg = ( "The length of the uncompressed pixel data doesn't match the " "expected length - 23 bytes actual vs. 24 expected" ) with pytest.raises(ValueError, match=msg): runner._validate_buffer() runner.set_option("number_of_frames", 3) runner._src = b"\x00" * 24 msg = ( "The length of the uncompressed pixel data doesn't match the " "expected length - 24 bytes actual vs. 72 expected" ) with pytest.raises(ValueError, match=msg): runner._validate_buffer() def test_validate_encoding_profile(self): """Test the encoding profile validation.""" runner = EncodeRunner(RLELossless) opts = { "rows": 3, "columns": 4, "number_of_frames": 1, "samples_per_pixel": 3, "bits_allocated": 24, "bits_stored": 12, "pixel_representation": 0, "photometric_interpretation": PI.RGB, "planar_configuration": 0, } runner.set_options(**opts) msg = ( "One or more of the following values is not valid for pixel data " "encoded with 'RLE Lossless':\n" r" \(0028,0002\) Samples per Pixel: 3\n" r" \(0028,0006\) Photometric Interpretation: RGB\n" r" \(0028,0100\) Bits Allocated: 24\n" r" \(0028,0101\) Bits Stored: 12\n" r" \(0028,0103\) Pixel Representation: 0\n" "See Part 5, Section 8.2 of the DICOM Standard for more information" ) with pytest.raises(ValueError, match=msg): runner._validate_encoding_profile() # Test validation skipped if unknown transfer syntax runner = EncodeRunner("1.2.3.4") opts = { "rows": 3, "columns": 4, "number_of_frames": 1, "samples_per_pixel": 3, "bits_allocated": 24, "bits_stored": 12, "pixel_representation": 0, "photometric_interpretation": PI.RGB, "planar_configuration": 0, } runner.set_options(**opts) runner._validate_encoding_profile() @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestEncodeRunner_GetFrame: """Tests for EncodeRunner.get_frame).""" def setup_method(self): self.runner = EncodeRunner(JPEG2000Lossless) self.ds = ds = Dataset() ds.Rows = 1 ds.Columns = 3 ds.SamplesPerPixel = 1 ds.PixelRepresentation = 0 ds.BitsAllocated = 8 ds.BitsStored = 8 ds.NumberOfFrames = 1 ds.PhotometricInterpretation = "RGB" self.arr_3s = np.asarray( [ [[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]], [[13, 14, 15], [16, 17, 18]], [[19, 20, 21], [22, 23, 24]], ], "|u1", ) assert self.arr_3s.shape == (4, 2, 3) def test_arr_u08_1s(self): """Test processing u8/1s""" self.ds.BitsAllocated = 8 self.ds.BitsStored = 8 self.ds.SamplesPerPixel = 1 self.ds.PixelRepresentation = 0 self.ds.Rows = 1 self.ds.Columns = 3 arr = np.asarray([1, 2, 3], dtype="|u1") assert arr.dtype.itemsize == 1 self.runner._set_options_ds(self.ds) self.runner.set_source(arr) out = self.runner.get_frame(None) assert len(out) == 3 assert b"\x01\x02\x03" == out def test_arr_u08_3s(self): """Test processing u8/3s""" self.ds.BitsAllocated = 8 self.ds.BitsStored = 8 self.ds.PixelRepresentation = 0 self.ds.Rows = 4 self.ds.Columns = 2 self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 0 arr = self.arr_3s.astype("|u1") assert arr.dtype.itemsize == 1 self.runner._set_options_ds(self.ds) self.runner.set_source(arr) out = self.runner.get_frame(None) assert len(out) == 24 assert out == bytes(range(1, 25)) def test_arr_i08_1s(self): """Test processing i8/1s""" self.ds.BitsAllocated = 8 self.ds.BitsStored = 8 self.ds.SamplesPerPixel = 1 self.ds.PixelRepresentation = 1 self.ds.Rows = 1 self.ds.Columns = 3 arr = np.asarray([-128, 0, 127], dtype="|i1") assert arr.dtype.itemsize == 1 self.runner._set_options_ds(self.ds) self.runner.set_source(arr) out = self.runner.get_frame(None) assert len(out) == 3 assert out == b"\x80\x00\x7f" def test_arr_i08_3s(self): """Test processing i8/3s""" self.ds.BitsAllocated = 8 self.ds.BitsStored = 8 self.ds.PixelRepresentation = 1 self.ds.Rows = 4 self.ds.Columns = 2 self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 0 arr = self.arr_3s.astype("|i1") assert arr.dtype.itemsize == 1 self.runner._set_options_ds(self.ds) self.runner.set_source(arr) out = self.runner.get_frame(None) assert len(out) == 24 assert out == bytes(range(1, 25)) def test_arr_u16_1s(self): """Test processing u16/1s""" self.ds.BitsAllocated = 16 self.ds.BitsStored = 16 self.ds.PixelRepresentation = 0 self.ds.Rows = 1 self.ds.Columns = 3 self.ds.SamplesPerPixel = 1 for dtype in (">u2", "u2", "i2", "i2", "u4", "u4", "i4", "i4", "=2.0 and pylibjpeg-rle>=2.0" ) with pytest.raises(RuntimeError, match=msg): enc.encode(EXPL_16_16_1F.ds, encoding_plugin="pylibjpeg") @pytest.mark.skipif(not HAVE_NP, reason="Numpy unavailable") def test_specify_plugin_encoding_exception(self): """Test an encoding exception occurring with a specific plugin""" enc = RLELosslessEncoder msg = ( "Unable to encode as exceptions were raised by all available " "plugins:\n pydicom: Unsupported option \"byteorder = '>'\"" ) with pytest.raises(RuntimeError, match=msg): enc.encode(EXPL_16_16_1F.ds, encoding_plugin="pydicom", byteorder=">") @pytest.mark.skipif(not HAVE_NP or HAVE_RLE, reason="Numpy unavailable") def test_encoding_exceptions(self): """Test an encoding exception occurring in all plugins""" msg = "Unable to encode as exceptions were raised by all available plugins:\n" with pytest.raises(RuntimeError, match=msg): RLELosslessEncoder.encode(EXPL_16_16_1F.ds, byteorder=">") @pytest.fixture() def enable_logging(): original = config.debugging config.debugging = True yield config.debugging = original @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestEncoder: """Tests for Encoder and related methods.""" def setup_method(self): self.enc = RLELosslessEncoder self.ds = get_testdata_file("CT_small.dcm", read=True) self.ds_enc = get_testdata_file("MR_small_RLE.dcm", read=True) self.ds_enc_mf = get_testdata_file("emri_small_RLE.dcm", read=True) self.bytes = self.ds.PixelData self.arr = self.ds.pixel_array self.kwargs = { "rows": self.ds.Rows, "columns": self.ds.Columns, "samples_per_pixel": self.ds.SamplesPerPixel, "photometric_interpretation": self.ds.PhotometricInterpretation, "pixel_representation": self.ds.PixelRepresentation, "bits_allocated": self.ds.BitsAllocated, "bits_stored": self.ds.BitsStored, "number_of_frames": 1, } def test_init(self): """Test creating a new Encoder""" uid = UID("1.2.3") enc = Encoder(uid) assert {} == enc._available assert {} == enc._unavailable assert enc._decoder is False def test_logging(self, enable_logging, caplog): """Test that the logging works during encode""" with caplog.at_level(logging.DEBUG, logger="pydicom"): self.enc.encode(self.bytes, **self.kwargs) assert "EncodeRunner for 'RLE Lossless'" in caplog.text assert " byteorder: <" in caplog.text caplog.clear() with caplog.at_level(logging.DEBUG, logger="pydicom"): next(self.enc.iter_encode(self.bytes, **self.kwargs)) assert "EncodeRunner for 'RLE Lossless'" in caplog.text assert "Encoders" in caplog.text def test_encode_invalid_type_raises(self): """Test exception raised if passing invalid type.""" enc = RLELosslessEncoder msg = ( r"'src' must be bytes, numpy.ndarray or pydicom.dataset.Dataset, " r"not 'str'" ) with pytest.raises(TypeError, match=msg): enc.encode("abc") def test_iter_encode_invalid_type_raises(self): """Test exception raised if passing invalid type.""" enc = RLELosslessEncoder msg = ( r"'src' must be bytes, numpy.ndarray or pydicom.dataset.Dataset, " r"not 'str'" ) with pytest.raises(TypeError, match=msg): next(enc.iter_encode("abc")) # Passing bytes def test_bytes(self): """Test encoding bytes""" assert len(self.bytes) == 32768 out = self.enc.encode(self.bytes, **self.kwargs) assert len(self.bytes) > len(out) def test_bytes_specific(self): """Test encoding bytes with a specific encoder""" out = self.enc.encode(self.bytes, encoding_plugin="pydicom", **self.kwargs) assert len(out) == 21350 def test_bytes_short_raises(self): """Test encoding bytes with short data raises exception""" msg = ( "The length of the uncompressed pixel data doesn't match the " "expected length - 32767 bytes actual vs. 32768 expected" ) with pytest.raises(ValueError, match=msg): self.enc.encode(self.bytes[:-1], **self.kwargs) def test_bytes_padded(self): """Test encoding bytes with padded data""" out = self.enc.encode( self.bytes + b"\x00\x00", encoding_plugin="pydicom", **self.kwargs ) assert len(out) == 21350 def test_bytes_multiframe(self): """Test encoding multiframe bytes with idx""" self.kwargs["number_of_frames"] = 2 out = self.enc.encode( self.bytes * 2, index=0, encoding_plugin="pydicom", **self.kwargs ) assert len(out) == 21350 def test_bytes_multiframe_no_index_raises(self): """Test encoding multiframe bytes without index raises exception""" msg = ( "The 'index' of the frame to be encoded is required for " "multi-frame pixel data" ) self.kwargs["number_of_frames"] = 2 with pytest.raises(ValueError, match=msg): self.enc.encode(self.bytes * 2, **self.kwargs) msg = "'index' must be greater than or equal to 0" with pytest.raises(ValueError, match=msg): self.enc.encode( self.bytes * 2, index=-1, encoding_plugin="pydicom", **self.kwargs ) def test_bytes_iter_encode(self): """Test encoding multiframe bytes with iter_encode""" self.kwargs["number_of_frames"] = 2 gen = self.enc.iter_encode( self.bytes * 2, encoding_plugin="pydicom", **self.kwargs ) assert len(next(gen)) == 21350 assert len(next(gen)) == 21350 with pytest.raises(StopIteration): next(gen) # Passing ndarray def test_array(self): """Test encode with an array""" out = self.enc.encode(self.arr, **self.kwargs) assert len(self.arr.tobytes()) > len(out) def test_array_specific(self): """Test encoding with a specific plugin""" out = self.enc.encode(self.arr, encoding_plugin="pydicom", **self.kwargs) assert len(out) == 21350 def test_array_multiframe(self): """Test encoding a multiframe array with idx""" arr = np.stack((self.arr, self.arr)) assert arr.shape == (2, 128, 128) self.kwargs["number_of_frames"] = 2 out = self.enc.encode(arr, index=0, encoding_plugin="pydicom", **self.kwargs) assert len(out) == 21350 def test_array_invalid_dims_raises(self): """Test encoding an array with too many dimensions raises""" arr = np.zeros((1, 2, 3, 4, 5)) assert arr.shape == (1, 2, 3, 4, 5) msg = r"Unable to encode 5D ndarrays" with pytest.raises(ValueError, match=msg): self.enc.encode(arr, **self.kwargs) def test_array_multiframe_no_index_raises(self): """Test encoding a multiframe array without index raises""" arr = np.stack((self.arr, self.arr)) assert arr.shape == (2, 128, 128) self.kwargs["number_of_frames"] = 2 msg = ( "The 'index' of the frame to be encoded is required for " "multi-frame pixel data" ) with pytest.raises(ValueError, match=msg): self.enc.encode(arr, **self.kwargs) msg = "'index' must be greater than or equal to 0" with pytest.raises(ValueError, match=msg): self.enc.encode(arr, index=-1, encoding_plugin="pydicom", **self.kwargs) def test_array_iter_encode(self): """Test encoding a multiframe array with iter_encode""" arr = np.stack((self.arr, self.arr)) assert arr.shape == (2, 128, 128) self.kwargs["number_of_frames"] = 2 gen = self.enc.iter_encode(arr, encoding_plugin="pydicom", **self.kwargs) assert len(next(gen)) == 21350 assert len(next(gen)) == 21350 with pytest.raises(StopIteration): next(gen) # Passing Dataset def test_unc_dataset(self): """Test encoding an uncompressed dataset""" assert not self.ds.file_meta.TransferSyntaxUID.is_compressed out = self.enc.encode(self.ds) assert len(self.ds.PixelData) > len(out) def test_unc_dataset_specific(self): """Test encoding an uncompressed dataset with specific plugin""" assert not self.ds.file_meta.TransferSyntaxUID.is_compressed out = self.enc.encode(self.ds, encoding_plugin="pydicom") assert len(out) == 21350 def test_unc_dataset_multiframe(self): """Test encoding a multiframe uncompressed dataset""" assert not self.ds.file_meta.TransferSyntaxUID.is_compressed self.ds.NumberOfFrames = 2 self.ds.PixelData = self.ds.PixelData * 2 out = self.enc.encode(self.ds, index=0) assert len(self.ds.PixelData) > len(out) def test_unc_dataset_multiframe_no_index_raises(self): """Test encoding multiframe uncompressed dataset without index raises""" assert not self.ds.file_meta.TransferSyntaxUID.is_compressed self.ds.NumberOfFrames = 2 self.ds.PixelData = self.ds.PixelData * 2 msg = ( "The 'index' of the frame to be encoded is required for " "multi-frame pixel data" ) with pytest.raises(ValueError, match=msg): self.enc.encode(self.ds) def test_unc_iter_encode(self): """Test iter_encode with an uncompressed dataset""" self.ds.NumberOfFrames = 2 self.ds.PixelData = self.ds.PixelData * 2 gen = self.enc.iter_encode(self.ds, encoding_plugin="pydicom") out = next(gen) assert len(self.ds.PixelData) > len(out) out = next(gen) assert len(self.ds.PixelData) > len(out) with pytest.raises(StopIteration): next(gen) class TestDatasetCompress: """Tests for Dataset.compress().""" def test_compress_inplace(self): """Test encode with a dataset.""" ds = get_testdata_file("CT_small.dcm", read=True) assert ds["PixelData"].VR == "OW" ds.compress(RLELossless, encoding_plugin="pydicom") assert ds.SamplesPerPixel == 1 assert ds.file_meta.TransferSyntaxUID == RLELossless assert len(ds.PixelData) == 21370 assert "PlanarConfiguration" not in ds assert ds["PixelData"].is_undefined_length assert ds["PixelData"].VR == "OB" @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_compress_arr(self): """Test encode with an arr.""" ds = get_testdata_file("CT_small.dcm", read=True) assert hasattr(ds, "file_meta") arr = ds.pixel_array del ds.PixelData del ds.file_meta ds.compress(RLELossless, arr, encoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == RLELossless assert len(ds.PixelData) == 21370 @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_encoder_unavailable(self, monkeypatch): """Test the required encoder being unavailable.""" ds = get_testdata_file("CT_small.dcm", read=True) monkeypatch.delitem(RLELosslessEncoder._available, "pydicom") msg = ( r"The pixel data encoder for 'RLE Lossless' is unavailable because all " r"of its plugins are missing dependencies:\n" r" gdcm - requires gdcm>=3.0.10\n" r" pylibjpeg - requires numpy, pylibjpeg>=2.0 and pylibjpeg-rle>=2.0" ) with pytest.raises(RuntimeError, match=msg): ds.compress(RLELossless) def test_uid_not_supported(self): """Test the UID not having any encoders.""" ds = get_testdata_file("CT_small.dcm", read=True) msg = ( r"No pixel data encoders have been implemented for " r"'JPEG 2000 Part 2 Multi-component Image Compression'" ) with pytest.raises(NotImplementedError, match=msg): ds.compress(JPEG2000MC, encoding_plugin="pydicom") def test_encapsulate_extended(self): """Test forcing extended encapsulation.""" ds = get_testdata_file("CT_small.dcm", read=True) assert "ExtendedOffsetTable" not in ds assert "ExtendedOffsetTableLengths" not in ds ds.compress(RLELossless, encapsulate_ext=True, encoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == RLELossless assert len(ds.PixelData) == 21366 assert ds.ExtendedOffsetTable == b"\x00" * 8 assert ds.ExtendedOffsetTableLengths == b"\x66\x53" + b"\x00" * 6 @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_round_trip(self): """Test an encoding round-trip""" ds = get_testdata_file("MR_small_RLE.dcm", read=True) arr = ds.pixel_array # Setting PixelData to None frees the memory which may # sometimes be reused, causes the _pixel_id check to fail ds.PixelData = None ds._pixel_array = None ds.compress(RLELossless, arr, encoding_plugin="pydicom") assert ds.PixelData is not None assert np.array_equal(arr, ds.pixel_array) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_overriding_kwargs_raises(self): """Test unable to override using kwargs.""" ds = get_testdata_file("SC_rgb_small_odd.dcm", read=True) ds.SamplesPerPixel = 1 msg = "One or more of the following values is not valid" with pytest.raises(ValueError, match=msg): ds.compress( RLELossless, encoding_plugin="pydicom", samples_per_pixel=3, planar_configuration=0, ) def test_planar_configuration_rle(self): """Test that multi-sample data has correct planar configuration.""" ds = examples.rgb_color assert ds.SamplesPerPixel == 3 assert ds.PlanarConfiguration == 0 ds.compress(RLELossless, encoding_plugin="pydicom") assert ds.PlanarConfiguration == 0 assert ds.file_meta.TransferSyntaxUID == RLELossless @pytest.fixture def use_future(): original = config._use_future config._use_future = True yield config._use_future = original class TestFuture: def test_compress(self, use_future): ds = get_testdata_file("CT_small.dcm", read=True) ds.compress(RLELossless, encoding_plugin="pydicom") assert not hasattr(ds, "_is_little_endian") assert not hasattr(ds, "_is_implicit_VR") def test_imports_raise(self, use_future): with pytest.raises(ImportError): from pydicom.encoders import get_encoder with pytest.raises(ImportError): from pydicom.encoders import RLELosslessEncoder def test_deprecation_warning(): msg = ( "The 'pydicom.encoders' module will be removed in v4.0, please use " "'from pydicom.pixels import get_encoder' instead" ) with pytest.warns(DeprecationWarning, match=msg): from pydicom.encoders import get_encoder as get_foo pydicom-pydicom-20aa4b7/tests/pixels/test_encoder_gdcm.py000066400000000000000000000237561515706620200237330ustar00rootroot00000000000000"""Tests for encoding pixel data with GDCM.""" import pytest from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.pixels.encoders import RLELosslessEncoder from pydicom.pixels.encoders.base import EncodeRunner from pydicom.pixels.encoders.gdcm import _rle_encode as gdcm_rle_encode from pydicom.pixels.decoders.rle import _rle_decode_frame from pydicom.pixels.utils import reshape_pixel_array from pydicom.uid import RLELossless, JPEG2000, ExplicitVRLittleEndian try: import gdcm import numpy as np from gdcm import Version GDCM_VERSION = [int(c) for c in Version.GetVersion().split(".")] HAVE_GDCM = True except ImportError: HAVE_GDCM = False GDCM_VERSION = [0, 0, 0] # EXPL: Explicit VR Little Endian EXPL_8_1_1F = get_testdata_file("OBXXXX1A.dcm") EXPL_8_3_1F = get_testdata_file("SC_rgb.dcm") EXPL_16_1_1F = get_testdata_file("MR_small.dcm") EXPL_16_3_1F = get_testdata_file("SC_rgb_16bit.dcm") EXPL_32_1_1F = get_testdata_file("rtdose_1frame.dcm") EXPL_32_3_1F = get_testdata_file("SC_rgb_32bit.dcm") @pytest.mark.skipif(not HAVE_GDCM, reason="GDCM plugin is not available") class TestRLELossless: """Tests for encoding RLE Lossless.""" def test_cycle_u8_1s_1f(self): """Test an encode/decode cycle for 8-bit 1 sample/pixel.""" ds = dcmread(EXPL_8_1_1F) ref = ds.pixel_array assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 0 assert ds.PhotometricInterpretation == "PALETTE COLOR" enc = RLELosslessEncoder encoded = enc.encode(ds, idx=0, encoding_plugin="gdcm") decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) arr = np.frombuffer(decoded, "|u1") assert np.array_equal(ref.ravel(), arr) def test_cycle_u8_3s_1f(self): """Test an encode/decode cycle for 8-bit 3 sample/pixel.""" ds = dcmread(EXPL_8_3_1F) ref = ds.pixel_array assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 3 assert ds.PixelRepresentation == 0 assert ds.PhotometricInterpretation == "RGB" assert ds.PlanarConfiguration == 0 enc = RLELosslessEncoder encoded = enc.encode(ds, idx=0, encoding_plugin="gdcm") decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) arr = np.frombuffer(decoded, "|u1") # The decoded data is planar configuration 1 ds.PlanarConfiguration = 1 arr = reshape_pixel_array(ds, arr) assert np.array_equal(ref, arr) def test_cycle_i16_1s_1f(self): """Test an encode/decode cycle for 16-bit 1 sample/pixel.""" ds = dcmread(EXPL_16_1_1F) ref = ds.pixel_array assert ds.BitsAllocated == 16 assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 1 assert ds.PhotometricInterpretation == "MONOCHROME2" enc = RLELosslessEncoder encoded = enc.encode(ds, idx=0, encoding_plugin="gdcm") decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) arr = np.frombuffer(decoded, " 32-bit Bits Allocated raises exception.""" ds = dcmread(EXPL_8_1_1F) enc = RLELosslessEncoder kwargs = { "rows": ds.Rows, "columns": 100, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": 64, "bits_stored": ds.BitsStored, "number_of_frames": 1, } msg = ( r"Unable to encode as exceptions were raised by all available " "plugins:\n gdcm: Unable to encode more than 32-bit data" ) with pytest.raises(RuntimeError, match=msg): enc.encode(ds.PixelData, encoding_plugin="gdcm", validate=False, **kwargs) def test_encoding_failure_raises(self): """Test that a encoding failure result raises an exception""" kwargs = { "rows": 1, "columns": 1, "samples_per_pixel": 1, "bits_allocated": 8, "bits_stored": 8, "pixel_representation": 0, "number_of_frames": 1, "photometric_interpretation": "PALETTE COLOR", "transfer_syntax_uid": ExplicitVRLittleEndian, } runner = EncodeRunner(RLELossless) runner.set_options(**kwargs) msg = "Unexpected number of fragments found in the 'Pixel Data'" with pytest.raises(RuntimeError, match=msg): gdcm_rle_encode(b"\x00", runner) def test_no_sequence_raises(self): """Test that no sequence of fragments raises an exception""" kwargs = { "rows": 1, "columns": 1, "samples_per_pixel": 1, "bits_allocated": 8, "bits_stored": 8, "pixel_representation": 0, "number_of_frames": 1, "photometric_interpretation": "PALETTE COLOR", } runner = EncodeRunner(JPEG2000) runner.set_options(**kwargs) msg = r"ImageChangeTransferSyntax.Change\(\) returned a failure result" with pytest.raises(RuntimeError, match=msg): gdcm_rle_encode(b"\x00", runner) def test_invalid_photometric_interpretation_raises(self): """Test an invalid photometric interpretation raises exception""" kwargs = { "rows": 1, "columns": 1, "samples_per_pixel": 1, "bits_allocated": 8, "bits_stored": 8, "pixel_representation": 0, "number_of_frames": 1, "photometric_interpretation": "PALETTES COLOR", } runner = EncodeRunner(RLELossless) runner.set_options(**kwargs) msg = "Invalid photometric interpretation 'PALETTES COLOR'" with pytest.raises(ValueError, match=msg): gdcm_rle_encode(b"\x00", runner) pydicom-pydicom-20aa4b7/tests/pixels/test_encoder_pydicom.py000066400000000000000000000406061515706620200244560ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Tests for the 'pydicom' encoder plugin.""" import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import dcmread, Dataset from pydicom.data import get_testdata_file from pydicom.dataset import FileMetaDataset from pydicom.encaps import get_frame from pydicom.pixels.encoders import RLELosslessEncoder from pydicom.pixels.encoders.base import EncodeRunner from pydicom.pixels.encoders.native import _encode_frame, _encode_segment, _encode_row from pydicom.pixels.decoders.rle import _rle_decode_frame, _rle_decode_segment from pydicom.pixels.utils import reshape_pixel_array from pydicom.uid import RLELossless # EXPL: Explicit VR Little Endian # RLE: RLE Lossless # 8/8-bit, 1 sample/pixel, 1 frame EXPL_8_1_1F = get_testdata_file("OBXXXX1A.dcm") RLE_8_1_1F = get_testdata_file("OBXXXX1A_rle.dcm") # 8/8-bit, 3 sample/pixel, 1 frame EXPL_8_3_1F = get_testdata_file("SC_rgb.dcm") # 8/8-bit, 3 sample/pixel, 2 frame EXPL_8_3_2F = get_testdata_file("SC_rgb_2frame.dcm") # 16/16-bit, 1 sample/pixel, 1 frame EXPL_16_1_1F = get_testdata_file("MR_small.dcm") # 16/16-bit, 3 sample/pixel, 1 frame EXPL_16_3_1F = get_testdata_file("SC_rgb_16bit.dcm") # 32/32-bit, 1 sample/pixel, 1 frame EXPL_32_1_1F = get_testdata_file("rtdose_1frame.dcm") # 32/32-bit, 3 sample/pixel, 1 frame EXPL_32_3_1F = get_testdata_file("SC_rgb_32bit.dcm") # Tests for RLE encoding REFERENCE_ENCODE_ROW = [ # Input, output ([], b""), # Replicate run tests # 2 (min) replicate ([0] * 2, b"\xff\x00"), ([0] * 3, b"\xfe\x00"), ([0] * 64, b"\xc1\x00"), ([0] * 127, b"\x82\x00"), # 128 (max) replicate ([0] * 128, b"\x81\x00"), # 128 (max) replicate, 1 (min) literal ([0] * 129, b"\x81\x00\x00\x00"), # 128 (max) replicate, 2 (min) replicate ([0] * 130, b"\x81\x00\xff\x00"), # 128 (max) x 5 replicates ([0] * 128 * 5, b"\x81\x00" * 5), # Literal run tests # 1 (min) literal ([0], b"\x00\x00"), ([0, 1], b"\x01\x00\x01"), ([0, 1, 2], b"\x02\x00\x01\x02"), ([0, 1] * 32, b"\x3f" + b"\x00\x01" * 32), # 127 literal ([0, 1] * 63 + [2], b"\x7e" + b"\x00\x01" * 63 + b"\x02"), # 128 literal (max) ([0, 1] * 64, b"\x7f" + b"\x00\x01" * 64), # 128 (max) literal, 1 (min) literal ([0, 1] * 64 + [2], b"\x7f" + b"\x00\x01" * 64 + b"\x00\x02"), # 128 (max) x 5 literals ([0, 1] * 64 * 5, (b"\x7f" + b"\x00\x01" * 64) * 5), # Combination run tests # 1 (min) literal, 1 (min) replicate ([0, 1, 1], b"\x00\x00\xff\x01"), # 1 (min) literal, 128 (max) replicate ([0] + [1] * 128, b"\x00\x00\x81\x01"), # 128 (max) literal, 2 (min) replicate ([0, 1] * 64 + [2] * 2, b"\x7f" + b"\x00\x01" * 64 + b"\xff\x02"), # 128 (max) literal, 128 (max) replicate ([0, 1] * 64 + [2] * 128, b"\x7f" + b"\x00\x01" * 64 + b"\x81\x02"), # 2 (min) replicate, 1 (min) literal ([0, 0, 1], b"\xff\x00\x00\x01"), # 2 (min) replicate, 128 (max) literal ([0, 0] + [1, 2] * 64, b"\xff\x00\x7f" + b"\x01\x02" * 64), # 128 (max) replicate, 1 (min) literal ([0] * 128 + [1], b"\x81\x00\x00\x01"), # 128 (max) replicate, 128 (max) literal ([0] * 128 + [1, 2] * 64, b"\x81\x00\x7f" + b"\x01\x02" * 64), ] class TestEncodeRow: """Tests for rle_handler._encode_row.""" @pytest.mark.parametrize("src, output", REFERENCE_ENCODE_ROW) def test_encode(self, src, output): """Test encoding an empty row.""" assert output == _encode_row(src) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestEncodeFrame: """Tests for rle_handler._encode_frame.""" def setup_method(self): """Setup the tests.""" # Create a dataset skeleton for use in the cycle tests ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = "1.2.840.10008.1.2" ds.Rows = 2 ds.Columns = 4 ds.SamplesPerPixel = 3 ds.PlanarConfiguration = 1 self.ds = ds def test_cycle_8bit_1sample(self): """Test an encode/decode cycle for 8-bit 1 sample/pixel.""" ds = dcmread(EXPL_8_1_1F) ref = ds.pixel_array assert 8 == ds.BitsAllocated assert 1 == ds.SamplesPerPixel kwargs = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": 1, } runner = EncodeRunner(RLELossless) runner.set_options(**kwargs) encoded = _encode_frame(ds.PixelData, runner) decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) arr = np.frombuffer(decoded, "|u1") arr = reshape_pixel_array(ds, arr) assert np.array_equal(ref, arr) def test_cycle_8bit_3sample(self): """Test an encode/decode cycle for 8-bit 3 sample/pixel.""" ds = dcmread(EXPL_8_3_1F) ref = ds.pixel_array assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 3 assert ds.PixelRepresentation == 0 kwargs = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": 1, "planar_configuration": ds.PlanarConfiguration, } runner = EncodeRunner(RLELossless) runner.set_options(**kwargs) encoded = _encode_frame(ds.PixelData, runner) decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) # The decoded data is planar configuration 1 ds.PlanarConfiguration = 1 arr = np.frombuffer(decoded, "|u1") arr = reshape_pixel_array(ds, arr) assert np.array_equal(ref, arr) def test_cycle_16bit_1sample(self): """Test an encode/decode cycle for 16-bit 1 sample/pixel.""" ds = dcmread(EXPL_16_1_1F) ref = ds.pixel_array assert 16 == ds.BitsAllocated assert 1 == ds.SamplesPerPixel kwargs = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": ds.PixelRepresentation, "bits_allocated": ds.BitsAllocated, "bits_stored": ds.BitsStored, "number_of_frames": 1, } runner = EncodeRunner(RLELossless) runner.set_options(**kwargs) encoded = _encode_frame(ds.PixelData, runner) decoded = _rle_decode_frame( encoded, ds.Rows, ds.Columns, ds.SamplesPerPixel, ds.BitsAllocated ) arr = np.frombuffer(decoded, "", } runner = EncodeRunner(RLELossless) runner.set_options(**kwargs) msg = r"Unsupported option \"byteorder = '>'\"" with pytest.raises(ValueError, match=msg): _encode_frame(b"", runner) class TestEncodeSegment: """Tests for rle_handler._encode_segment.""" @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_one_row(self): """Test encoding data that contains only a single row.""" ds = dcmread(RLE_8_1_1F) pixel_data = get_frame(ds.PixelData, 0) decoded = _rle_decode_segment(pixel_data[64:]) assert ds.Rows * ds.Columns == len(decoded) arr = np.frombuffer(decoded, "uint8").reshape(ds.Rows, ds.Columns) # Re-encode a single row of the decoded data row = arr[0] assert (ds.Columns,) == row.shape encoded = _encode_segment(row.tobytes(), columns=ds.Columns) # Decode the re-encoded data and check that it's the same redecoded = _rle_decode_segment(encoded) assert ds.Columns == len(redecoded) assert decoded[: ds.Columns] == redecoded def test_cycle(self): """Test the decoded data remains the same after encoding/decoding.""" ds = dcmread(RLE_8_1_1F) pixel_data = get_frame(ds.PixelData, 0) decoded = _rle_decode_segment(pixel_data[64:]) assert ds.Rows * ds.Columns == len(decoded) # Re-encode the decoded data encoded = _encode_segment(decoded, columns=ds.Columns) # Decode the re-encoded data and check that it's the same redecoded = _rle_decode_segment(encoded) assert ds.Rows * ds.Columns == len(redecoded) assert decoded == redecoded pydicom-pydicom-20aa4b7/tests/pixels/test_encoder_pyjpegls.py000066400000000000000000001303321515706620200246430ustar00rootroot00000000000000"""Tests for encoding pixel data with pyjpegls.""" import importlib import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import Dataset, examples from pydicom.encaps import encapsulate, get_frame from pydicom.pixels.encoders import ( JPEGLSLosslessEncoder, JPEGLSNearLosslessEncoder, ) from pydicom.pixels.decoders import ( JPEGLSLosslessDecoder, JPEGLSNearLosslessDecoder, ) from pydicom.pixels.common import PhotometricInterpretation as PI from pydicom.pixels.utils import _get_jpg_parameters from pydicom.uid import JPEGLSLossless, JPEGLSNearLossless from pydicom.pixel_data_handlers.gdcm_handler import get_pixeldata HAVE_JLS = bool(importlib.util.find_spec("jpeg_ls")) HAVE_PYLJ = bool(importlib.util.find_spec("pylibjpeg")) HAVE_GDCM = bool(importlib.util.find_spec("gdcm")) SKIP_TEST = not (HAVE_NP and HAVE_JLS) @pytest.mark.skipif(SKIP_TEST, reason="Missing required dependencies") class TestJpegLSLossless: """Tests for JPEGLSLosslessEncoder with pyjpegls.""" def setup_method(self): ds = examples.ct arr = ds.pixel_array # Rescale to (0, 1) arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref = arr ds = examples.rgb_color arr = ds.pixel_array arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref3 = arr def test_arr_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # CharLS can't encode 16-bits allocated with bits stored less than 9 # the container size has to match the sample depth for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-128, 127) ref = ref.astype("int8") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_i2_spp1(self): """Test signed bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-(2**15), 2**15 - 1) ref = ref.astype("int16") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # CharLS can't encode 16-bits allocated with bits stored less than 9 # the container size has to match the sample depth for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 6 opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-128, 127) ref = ref.astype("int8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_i2_spp1(self): """Test signed bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-(2**15), 2**15 - 1) ref = ref.astype("int16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEGLSLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored in (6, 7): continue out, _ = JPEGLSLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_jls_error_raises(self): """Test 'jls_error' is ignored if using JPEG-LS Lossless""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "jls_error": 127, } ref = self.ref * (2**8 - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") msg = ( "Unable to encode as exceptions were raised by all available plugins:\n " "pyjpegls: A 'jls_error' value of '127' is being used with a " "transfer syntax of 'JPEG-LS Lossless' - did you mean to use " "'JPEG-LS Near Lossless' instead?" ) with pytest.raises(RuntimeError, match=msg): JPEGLSLosslessEncoder.encode(ref, encoding_plugin="pyjpegls", **opts) @pytest.mark.skipif(SKIP_TEST, reason="Missing required dependencies") class TestJpegLSNearLossless: """Tests for JPEGLSNearLosslessEncoder with pyjpegls.""" def setup_method(self): ds = examples.ct arr = ds.pixel_array # Rescale to (0, 1) arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref = arr ds = examples.rgb_color arr = ds.pixel_array arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref3 = arr def test_arr_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: # GDCM fails to decode low precision lossy JPEG-LS if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_arr_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_arr_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_arr_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_arr_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) # Clip within the min/max values for the given bits_stored ref = ref.clip(-(2 ** (bits_stored - 1)) + 1, 2 ** (bits_stored - 1) - 2) ref = ref.astype("int8") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) if bits_stored == 2: assert np.array_equal(out, ref) else: assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_arr_i2_spp1(self): """Test signed bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) # Clip within the min/max values for the given bits_stored ref = ref.clip(-(2 ** (bits_stored - 1)) + 1, 2 ** (bits_stored - 1) - 2) ref = ref.astype("int16") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) if bits_stored == 2: assert np.array_equal(out, ref) else: assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_buffer_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: # GDCM fails to decode low precision lossy JPEG-LS if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_buffer_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (2, 8), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_buffer_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_buffer_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (2, 16), samples per pixel 3""" ds = examples.rgb_color opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") # Planar Configuration 0 opts["planar_configuration"] = 0 for bits_stored in range(2, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 6 opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) # Planar Configuration 1 opts["planar_configuration"] = 1 for bits_stored in range(2, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( ref, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_buffer_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) # Clip within the min/max values for the given bits_stored ref = ref.clip(-(2 ** (bits_stored - 1)) + 1, 2 ** (bits_stored - 1) - 2) ref = ref.astype("int8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) if bits_stored == 2: assert np.array_equal(out, ref) else: assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) def test_buffer_i2_spp1(self): """Test signed bits allocated 16, bits stored (2, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, "jls_error": 1, } plugins = ["pyjpegls"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PYLJ: plugins.append("pylibjpeg") for bits_stored in range(2, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) # Clip within the min/max values for the given bits_stored ref = ref.clip(-(2 ** (bits_stored - 1)) + 1, 2 ** (bits_stored - 1) - 2) ref = ref.astype("int16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEGLSNearLosslessEncoder.encode( buffer, encoding_plugin="pyjpegls", **opts ) for plugin in plugins: if plugin == "gdcm" and bits_stored < 8: continue out, _ = JPEGLSNearLosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) if bits_stored == 2: assert np.array_equal(out, ref) else: assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=1) pydicom-pydicom-20aa4b7/tests/pixels/test_encoder_pylibjpeg.py000066400000000000000000001650631515706620200250040ustar00rootroot00000000000000"""Tests for encoding pixel data with pylibjpeg.""" import importlib from struct import unpack import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import dcmread, examples from pydicom.data import get_testdata_file from pydicom.encaps import encapsulate, get_frame from pydicom.pixels.encoders import ( JPEG2000LosslessEncoder, JPEG2000Encoder, ) from pydicom.pixels.decoders import ( JPEG2000LosslessDecoder, JPEG2000Decoder, ) from pydicom.pixels.encoders.pylibjpeg import is_available from pydicom.pixels.utils import as_pixel_options from pydicom.pixels.utils import get_expected_length, get_j2k_parameters from pydicom.uid import RLELossless, JPEG2000 HAVE_PYLJ = bool(importlib.util.find_spec("pylibjpeg")) HAVE_OJ = bool(importlib.util.find_spec("openjpeg")) HAVE_RLE = bool(importlib.util.find_spec("rle")) HAVE_GDCM = bool(importlib.util.find_spec("gdcm")) HAVE_PIL = bool(importlib.util.find_spec("PIL")) SKIP_RLE = not (HAVE_NP and HAVE_PYLJ and HAVE_RLE) SKIP_J2K = not (HAVE_NP and HAVE_PYLJ and HAVE_OJ) IMPL = get_testdata_file("MR_small_implicit.dcm") EXPL = get_testdata_file("OBXXXX1A.dcm") RGB = get_testdata_file("US1_UNCR.dcm") @pytest.mark.skipif(SKIP_RLE, reason="no -rle plugin") class TestRLEEncoding: def test_encode(self): """Test encoding""" ds = dcmread(EXPL) assert "PlanarConfiguration" not in ds expected = get_expected_length(ds, "bytes") assert expected == len(ds.PixelData) ref = ds.pixel_array del ds.PixelData del ds._pixel_array ds.compress(RLELossless, ref, encoding_plugin="pylibjpeg") assert expected > len(ds.PixelData) assert np.array_equal(ref, ds.pixel_array) assert ref is not ds.pixel_array def test_encode_big(self): """Test encoding big-endian src""" ds = dcmread(IMPL) ref = ds.pixel_array del ds._pixel_array ds.compress( RLELossless, ds.PixelData, byteorder=">", encoding_plugin="pylibjpeg" ) ref = ref.view(ref.dtype.newbyteorder(">")) assert np.array_equal(ref, ds.pixel_array) assert ref is not ds.pixel_array def parse_j2k(buffer): # SOC -> SIZ -> COD # soc = buffer[:2] # SOC box, 0xff 0x4f # siz = buffer[2:4] # 0xff 0x51 c_siz = buffer[40:42] nr_components = unpack(">H", c_siz)[0] o = 42 for component in range(nr_components): ssiz = buffer[o] # xrsiz = buffer[o + 1] # yrsiz = buffer[o + 2] o += 3 # Should be at the start of the COD marker # cod = buffer[o : o + 2] sg_cod = buffer[o + 5 : o + 9] nr_layers = sg_cod[1:3] mct = sg_cod[3] # 0 for none, 1 for applied param = {} if ssiz & 0x80: param["precision"] = (ssiz & 0x7F) + 1 param["is_signed"] = True else: param["precision"] = ssiz + 1 param["is_signed"] = False param["components"] = nr_components param["mct"] = bool(mct) param["layers"] = unpack(">H", nr_layers)[0] return param @pytest.mark.skipif(SKIP_J2K, reason="no -openjpeg plugin") class TestJ2KLosslessEncoding: """Tests for JPEG2000LosslessEncoder with pylibjpeg.""" def setup_method(self): ds = examples.ct arr = ds.pixel_array # Rescale to (0, 1) arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref = arr ds = dcmread(RGB) arr = ds.pixel_array arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref3 = arr def test_arr_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: # Pillow doesn't decode 9-bit J2K correctly if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u4_spp1(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") for bits_stored in range(1, 25): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**24 - 1) ref = ref.astype("uint32") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "planar_configuration": 0, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "planar_configuration": 0, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") for bits_stored in range(1, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_u4_spp3(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "planar_configuration": 0, } for bits_stored in range(1, 25): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**24 - 1) ref = ref.astype("uint32") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert np.array_equal(out, ref) def test_arr_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-128, 127) ref = ref.astype("int8") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_i2_spp1(self): """Test signed bits allocated 8, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-32768, 32767) ref = ref.astype("int16") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: # Pillow doesn't decode 9-bit J2K correctly if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_arr_i4_spp1(self): """Test signed bits allocated 8, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 32, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") for bits_stored in range(1, 25): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-8388608, 8388607) ref = ref.astype("int32") opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( ref, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 65535) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u4_spp1(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, } for bits_stored in range(1, 25): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**24 - 1) ref = ref.astype("uint32") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 4 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert np.array_equal(out, ref) def test_buffer_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "planar_configuration": 0, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 255) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "planar_configuration": 0, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") for bits_stored in range(1, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**16 - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 * 2 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_u4_spp3(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "planar_configuration": 0, } for bits_stored in range(1, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**24 - 1) ref = ref.astype("uint32") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 * 4 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert np.array_equal(out, ref) def test_buffer_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-128, 127) ref = ref.astype("int8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_i2_spp1(self): """Test signed bits allocated 16, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-(2**15), 2**15 - 1) ref = ref.astype("int16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) for plugin in plugins: if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert np.array_equal(out, ref) def test_buffer_i4_spp1(self): """Test signed bits allocated 32, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 32, } for bits_stored in range(1, 25): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) ref = ref.clip(-(2**23), 2**23 - 1) ref = ref.astype("int32") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 4 opts["bits_stored"] = bits_stored cs = JPEG2000LosslessEncoder.encode( buffer, encoding_plugin="pylibjpeg", **opts ) out, _ = JPEG2000LosslessDecoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert np.array_equal(out, ref) def test_mct(self): """Test that MCT is used correctly""" # If RGB then no MCT ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "planar_configuration": 0, } cs = JPEG2000LosslessEncoder.encode(arr, encoding_plugin="pylibjpeg", **opts) info = parse_j2k(cs) assert info["mct"] is False # If YBR_RCT then MCT opts["photometric_interpretation"] = "YBR_RCT" cs = JPEG2000LosslessEncoder.encode(arr, encoding_plugin="pylibjpeg", **opts) info = parse_j2k(cs) assert info["mct"] is True def test_lossy_kwargs_raise(self): """Test that lossy kwargs raise an exception""" ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "planar_configuration": 0, "j2k_cr": [20, 5], "j2k_psnr": [80, 200], "compression_ratios": [20, 5], "signal_noise_ratios": [80, 200], } msg = ( "Unable to encode as exceptions were raised by all available plugins:\n " "pylibjpeg: A lossy configuration option is being used with a transfer " "syntax of 'JPEG 2000 Lossless' - did you mean to use 'JPEG 2000' instead?" ) with pytest.raises(RuntimeError, match=msg): JPEG2000LosslessEncoder.encode(arr, encoding_plugin="pylibjpeg", **opts) def test_bits_stored_25_raises(self): """Test that bits stored > 24 raises an exception.""" ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "bits_stored": 25, "planar_configuration": 0, } arr = arr.astype("u4") msg = ( "Unable to encode as exceptions were raised by all available " "plugins:\n pylibjpeg: Invalid 'bits_stored' value '25', must be " r"in the range \[1, 24\]" ) with pytest.raises(RuntimeError, match=msg): JPEG2000LosslessEncoder.encode(arr, encoding_plugin="pylibjpeg", **opts) @pytest.mark.skipif(SKIP_J2K, reason="no -openjpeg plugin") class TestJ2KEncoding: """Tests for JPEG2000Encoder with pylibjpeg.""" def setup_method(self): ds = examples.ct arr = ds.pixel_array # Rescale to (0, 1) arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref = arr ds = dcmread(RGB) arr = ds.pixel_array arr = arr.astype("float32") arr -= arr.min() arr /= arr.max() self.ref3 = arr def test_arr_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) def test_arr_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: # Pillow doesn't decode 9-bit J2K correctly if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=16) def test_arr_u4_spp1(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "j2k_cr": [2], } atols = [1, 1, 1, 1, 2, 2, 2, 2] atols.extend([2, 2, 2, 4, 5, 8, 10, 16]) atols.extend([23, 31, 52, 63, 122, 2928854, 7404089, 10080970]) for bits_stored, atol in zip(range(1, 20), atols): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint32") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=atol) def test_arr_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "planar_configuration": 0, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint8") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) def test_arr_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "planar_configuration": 0, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") for bits_stored in range(1, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint16") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=16) def test_arr_u4_spp3(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "planar_configuration": 0, "j2k_cr": [2], } # 21+ bits stored gives horrible results atols = [1, 2, 2, 2, 2, 2, 2, 2] atols.extend([2, 2, 1, 1, 1, 2, 3, 4]) atols.extend([8, 15, 30, 60, 2097151, 4194303, 8388607, 16777215]) for bits_stored, atol in zip(range(1, 20), atols): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint32") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=atol) def test_arr_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 ref = ref.clip(minimum, maximum) ref = ref.astype("int8") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) def test_arr_i2_spp1(self): """Test signed bits allocated 8, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 ref = ref.clip(minimum, maximum) ref = ref.astype("int16") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: # Pillow doesn't decode 9-bit J2K correctly if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=16) def test_arr_i4_spp1(self): """Test signed bits allocated 8, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 32, "j2k_cr": [2], } atols = [1, 1, 1, 2, 2, 2, 2, 2] atols.extend([2, 2, 2, 4, 5, 9, 11, 16]) atols.extend([25, 32, 55, 67, 114, 2928849, 7404094, 10080970]) for bits_stored, atol in zip(range(1, 21), atols): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 ref = ref.clip(minimum, maximum) ref = ref.astype("int32") opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(ref, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=atol) def test_buffer_u1_spp1(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) def test_buffer_u2_spp1(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=16) def test_buffer_u4_spp1(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "j2k_cr": [2], } atols = [1, 1, 1, 1, 2, 2, 2, 2] atols.extend([2, 2, 2, 4, 5, 8, 10, 16]) atols.extend([23, 31, 52, 63, 122, 2928854, 7404089, 10080970]) for bits_stored, atol in zip(range(1, 21), atols): ref = self.ref * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint32") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 4 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=atol) def test_buffer_u1_spp3(self): """Test unsigned bits allocated 8, bits stored (1, 8), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "planar_configuration": 0, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) def test_buffer_u2_spp3(self): """Test unsigned bits allocated 16, bits stored (1, 16), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 16, "planar_configuration": 0, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") for bits_stored in range(1, 17): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 * 2 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=16) def test_buffer_u4_spp3(self): """Test unsigned bits allocated 32, bits stored (1, 24), samples per pixel 3""" ds = dcmread(RGB) opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "planar_configuration": 0, "j2k_cr": [2], } atols = [1, 2, 2, 2, 2, 2, 2, 2] atols.extend([2, 2, 1, 1, 1, 2, 3, 4]) atols.extend([8, 15, 30, 60, 2097151, 4194303, 8388607, 16777215]) for bits_stored, atol in zip(range(1, 20), atols): ref = self.ref3 * (2**bits_stored - 1) ref = ref.clip(0, 2**bits_stored - 1) ref = ref.astype("uint32") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 3 * 4 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=atol) def test_buffer_i1_spp1(self): """Test signed bits allocated 8, bits stored (1, 8), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 8, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 9): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 ref = ref.clip(minimum, maximum) ref = ref.astype("int8") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) def test_buffer_i2_spp1(self): """Test signed bits allocated 16, bits stored (1, 16), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 16, "j2k_cr": [2], } plugins = ["pylibjpeg"] if HAVE_GDCM: plugins.append("gdcm") if HAVE_PIL: plugins.append("pillow") for bits_stored in range(1, 17): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 ref = ref.clip(minimum, maximum) ref = ref.astype("int16") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 2 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) for plugin in plugins: if plugin == "pillow" and bits_stored == 9: continue out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin=plugin, **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=16) def test_buffer_i4_spp1(self): """Test signed bits allocated 32, bits stored (1, 24), samples per pixel 1""" ds = examples.ct opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": ds.PhotometricInterpretation, "pixel_representation": 1, "number_of_frames": 1, "bits_allocated": 32, "j2k_cr": [2], } atols = [1, 1, 1, 2, 2, 2, 2, 2] atols.extend([2, 2, 2, 4, 5, 9, 11, 16]) atols.extend([25, 32, 55, 67, 114, 2928849, 7404094, 10080970]) for bits_stored, atol in zip(range(1, 21), atols): ref = self.ref * (2**bits_stored - 1) ref -= 2 ** (bits_stored - 1) minimum = -(2 ** (bits_stored - 1)) maximum = 2 ** (bits_stored - 1) - 1 ref = ref.clip(minimum, maximum) ref = ref.astype("int32") buffer = ref.tobytes() assert len(buffer) == ds.Rows * ds.Columns * 4 opts["bits_stored"] = bits_stored cs = JPEG2000Encoder.encode(buffer, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=atol) def test_j2k_psnr(self): """Test compression using j2k_psnr""" ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "planar_configuration": 0, "j2k_psnr": [80], } cs = JPEG2000Encoder.encode(arr, encoding_plugin="pylibjpeg", **opts) out, _ = JPEG2000Decoder.as_array( encapsulate([cs]), decoding_plugin="pylibjpeg", **opts, ) assert not np.array_equal(out, arr) assert np.allclose(out, arr, atol=2) def test_mct(self): """Test that MCT is used correctly""" # If RGB then no MCT ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "planar_configuration": 0, "j2k_cr": [2], } cs = JPEG2000Encoder.encode(arr, encoding_plugin="pylibjpeg", **opts) info = parse_j2k(cs) assert info["mct"] is False # If YBR_ICT then MCT opts["photometric_interpretation"] = "YBR_ICT" cs = JPEG2000Encoder.encode(arr, encoding_plugin="pylibjpeg", **opts) info = parse_j2k(cs) assert info["mct"] is True def test_both_lossy_kwargs_raises(self): """Test that having both lossy kwargs raises an exception""" ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "planar_configuration": 0, "j2k_cr": [20, 5], "j2k_psnr": [80, 200], } msg = ( "Unable to encode as exceptions were raised by all available " "plugins:\n pylibjpeg: Multiple lossy configuration options are " "being used with the 'JPEG 2000' transfer syntax, please specify " "only one" ) with pytest.raises(RuntimeError, match=msg): JPEG2000Encoder.encode(arr, encoding_plugin="pylibjpeg", **opts) def test_neither_lossy_kwargs_raises(self): """Test that having neither lossy kwarg raises an exception""" ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 8, "bits_stored": 8, "planar_configuration": 0, } msg = ( "Unable to encode as exceptions were raised by all available " "plugins:\n pylibjpeg: The 'JPEG 2000' transfer syntax requires " "a lossy configuration option such as 'j2k_cr' or 'j2k_psnr'" ) with pytest.raises(RuntimeError, match=msg): JPEG2000Encoder.encode(arr, encoding_plugin="pylibjpeg", **opts) def test_bits_stored_25_raises(self): """Test that bits stored > 24 raises an exception.""" ds = dcmread(RGB) arr = ds.pixel_array opts = { "rows": ds.Rows, "columns": ds.Columns, "samples_per_pixel": ds.SamplesPerPixel, "photometric_interpretation": "RGB", "pixel_representation": 0, "number_of_frames": 1, "bits_allocated": 32, "bits_stored": 25, "planar_configuration": 0, "j2k_cr": [2], } arr = arr.astype("u4") msg = ( "Unable to encode as exceptions were raised by all available " "plugins:\n pylibjpeg: Invalid 'bits_stored' value '25', must be " r"in the range \[1, 24\]" ) with pytest.raises(RuntimeError, match=msg): JPEG2000Encoder.encode(arr, encoding_plugin="pylibjpeg", **opts) def test_is_available_unknown_uid(): """Test is_available() with an unsupported UID.""" assert is_available("1.2.3.4") is False pydicom-pydicom-20aa4b7/tests/pixels/test_processing.py000066400000000000000000002332621515706620200234710ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Tests for the pixels.processing module.""" import os from struct import unpack, pack import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: import PIL HAVE_PIL = True except ImportError: HAVE_PIL = False from pydicom import dcmread, config from pydicom.data import get_testdata_file, get_palette_files from pydicom.dataset import Dataset, FileMetaDataset from pydicom.pixels.processing import ( convert_color_space, apply_color_lut, _expand_segmented_lut, apply_icc_profile, apply_modality_lut, apply_voi_lut, apply_voi, apply_windowing, apply_presentation_lut, create_icc_transform, ) from pydicom.uid import ExplicitVRLittleEndian, ImplicitVRLittleEndian # PAL: PALETTE COLOR Photometric Interpretation # SEG: Segmented Palette Color # SUP: Supplemental Palette Color # LE, BE: little endian, big endian encoding # 8/8, 1 sample/pixel, 1 frame PAL_08_256_0_16_1F = get_testdata_file("OBXXXX1A.dcm") PAL_08_200_0_16_1F = get_testdata_file("OT-PAL-8-face.dcm") # 8/8, 1 sample/pixel, 2 frame PAL_08_256_0_16_2F = get_testdata_file("OBXXXX1A_2frame.dcm") # PALETTE COLOR with 16-bit LUTs (no indirect segments) PAL_SEG_LE_16_1F = get_testdata_file("gdcm-US-ALOKA-16.dcm") PAL_SEG_BE_16_1F = get_testdata_file("gdcm-US-ALOKA-16_big.dcm") # Supplemental palette colour + VOI windowing SUP_16_16_2F = get_testdata_file("eCT_Supplemental.dcm") # 8 bit, 3 samples/pixel, 1 and 2 frame datasets # RGB colorspace, uncompressed RGB_8_3_1F = get_testdata_file("SC_rgb.dcm") RGB_8_3_2F = get_testdata_file("SC_rgb_2frame.dcm") # MOD: Modality LUT # SEQ: Modality LUT Sequence MOD_16 = get_testdata_file("CT_small.dcm") MOD_16_SEQ = get_testdata_file("mlut_18.dcm") # VOI: VOI LUT Sequence # WIN: Windowing operation WIN_12_1F = get_testdata_file("MR-SIEMENS-DICOM-WithOverlays.dcm") VOI_08_1F = get_testdata_file("vlut_04.dcm") # ICC profile ICC_PROFILE = get_testdata_file("crayons.icc") TEST_CMS = HAVE_NP and HAVE_PIL @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestConvertColourSpace: """Tests for convert_color_space().""" def test_unknown_current_raises(self): """Test an unknown current color space raises exception.""" with pytest.raises( NotImplementedError, match="Conversion from TEST to RGB is not suppo" ): convert_color_space(np.ones((1, 2), dtype="u1"), "TEST", "RGB") def test_unknown_desired_raises(self): """Test an unknown desdired color space raises exception.""" with pytest.raises( NotImplementedError, match="Conversion from RGB to TEST is not suppo" ): convert_color_space(np.ones((1, 2), dtype="u1"), "RGB", "TEST") @pytest.mark.parametrize( "current, desired", [ ("RGB", "RGB"), ("YBR_FULL", "YBR_FULL"), ("YBR_FULL", "YBR_FULL_422"), ("YBR_FULL_422", "YBR_FULL_422"), ("YBR_FULL_422", "YBR_FULL"), ], ) def test_current_is_desired(self, current, desired): """Test that the array is unchanged when current matches desired.""" arr = np.ones((2, 3), dtype="u1") assert np.array_equal(arr, convert_color_space(arr, current, desired)) def test_rgb_ybr_rgb_single_frame(self): """Test round trip conversion of single framed pixel data.""" ds = dcmread(RGB_8_3_1F) arr = ds.pixel_array assert (255, 0, 0) == tuple(arr[5, 50, :]) assert (255, 128, 128) == tuple(arr[15, 50, :]) assert (0, 255, 0) == tuple(arr[25, 50, :]) assert (128, 255, 128) == tuple(arr[35, 50, :]) assert (0, 0, 255) == tuple(arr[45, 50, :]) assert (128, 128, 255) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (64, 64, 64) == tuple(arr[75, 50, :]) assert (192, 192, 192) == tuple(arr[85, 50, :]) assert (255, 255, 255) == tuple(arr[95, 50, :]) ybr = convert_color_space(arr, "RGB", "YBR_FULL") assert (76, 85, 255) == tuple(ybr[5, 50, :]) assert (166, 107, 192) == tuple(ybr[15, 50, :]) assert (150, 44, 21) == tuple(ybr[25, 50, :]) assert (203, 86, 75) == tuple(ybr[35, 50, :]) assert (29, 255, 107) == tuple(ybr[45, 50, :]) assert (142, 192, 118) == tuple(ybr[55, 50, :]) assert (0, 128, 128) == tuple(ybr[65, 50, :]) assert (64, 128, 128) == tuple(ybr[75, 50, :]) assert (192, 128, 128) == tuple(ybr[85, 50, :]) assert (255, 128, 128) == tuple(ybr[95, 50, :]) # Round trip -> rounding errors get compounded rgb = convert_color_space(ybr, "YBR_FULL", "RGB") # All pixels within +/- 1 units assert np.allclose(rgb, arr, atol=1) assert rgb.shape == arr.shape def test_rgb_ybr_rgb_multi_frame(self): """Test round trip conversion of multi-framed pixel data.""" ds = dcmread(RGB_8_3_2F) arr = ds.pixel_array assert (255, 0, 0) == tuple(arr[0, 5, 50, :]) assert (255, 128, 128) == tuple(arr[0, 15, 50, :]) assert (0, 255, 0) == tuple(arr[0, 25, 50, :]) assert (128, 255, 128) == tuple(arr[0, 35, 50, :]) assert (0, 0, 255) == tuple(arr[0, 45, 50, :]) assert (128, 128, 255) == tuple(arr[0, 55, 50, :]) assert (0, 0, 0) == tuple(arr[0, 65, 50, :]) assert (64, 64, 64) == tuple(arr[0, 75, 50, :]) assert (192, 192, 192) == tuple(arr[0, 85, 50, :]) assert (255, 255, 255) == tuple(arr[0, 95, 50, :]) # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) ybr = convert_color_space(arr, "RGB", "YBR_FULL") assert (76, 85, 255) == tuple(ybr[0, 5, 50, :]) assert (166, 107, 192) == tuple(ybr[0, 15, 50, :]) assert (150, 44, 21) == tuple(ybr[0, 25, 50, :]) assert (203, 86, 75) == tuple(ybr[0, 35, 50, :]) assert (29, 255, 107) == tuple(ybr[0, 45, 50, :]) assert (142, 192, 118) == tuple(ybr[0, 55, 50, :]) assert (0, 128, 128) == tuple(ybr[0, 65, 50, :]) assert (64, 128, 128) == tuple(ybr[0, 75, 50, :]) assert (192, 128, 128) == tuple(ybr[0, 85, 50, :]) assert (255, 128, 128) == tuple(ybr[0, 95, 50, :]) # Frame 2 assert (179, 171, 1) == tuple(ybr[1, 5, 50, :]) assert (89, 149, 65) == tuple(ybr[1, 15, 50, :]) assert (105, 212, 235) == tuple(ybr[1, 25, 50, :]) assert (52, 170, 181) == tuple(ybr[1, 35, 50, :]) assert (226, 1, 149) == tuple(ybr[1, 45, 50, :]) assert (113, 65, 138) == tuple(ybr[1, 55, 50, :]) assert (255, 128, 128) == tuple(ybr[1, 65, 50, :]) assert (191, 128, 128) == tuple(ybr[1, 75, 50, :]) assert (63, 128, 128) == tuple(ybr[1, 85, 50, :]) assert (0, 128, 128) == tuple(ybr[1, 95, 50, :]) # Round trip -> rounding errors get compounded rgb = convert_color_space(ybr, "YBR_FULL", "RGB") # All pixels within +/- 1 units assert np.allclose(rgb, arr, atol=1) assert rgb.shape == arr.shape def test_frame_by_frame(self): """Test processing frame-by-frame.""" ds = dcmread(RGB_8_3_2F) arr = ds.pixel_array ybr = convert_color_space(arr, "RGB", "YBR_FULL", per_frame=True) assert (76, 85, 255) == tuple(ybr[0, 5, 50, :]) assert (166, 107, 192) == tuple(ybr[0, 15, 50, :]) assert (150, 44, 21) == tuple(ybr[0, 25, 50, :]) assert (203, 86, 75) == tuple(ybr[0, 35, 50, :]) assert (29, 255, 107) == tuple(ybr[0, 45, 50, :]) assert (142, 192, 118) == tuple(ybr[0, 55, 50, :]) assert (0, 128, 128) == tuple(ybr[0, 65, 50, :]) assert (64, 128, 128) == tuple(ybr[0, 75, 50, :]) assert (192, 128, 128) == tuple(ybr[0, 85, 50, :]) assert (255, 128, 128) == tuple(ybr[0, 95, 50, :]) # Frame 2 assert (179, 171, 1) == tuple(ybr[1, 5, 50, :]) assert (89, 149, 65) == tuple(ybr[1, 15, 50, :]) assert (105, 212, 235) == tuple(ybr[1, 25, 50, :]) assert (52, 170, 181) == tuple(ybr[1, 35, 50, :]) assert (226, 1, 149) == tuple(ybr[1, 45, 50, :]) assert (113, 65, 138) == tuple(ybr[1, 55, 50, :]) assert (255, 128, 128) == tuple(ybr[1, 65, 50, :]) assert (191, 128, 128) == tuple(ybr[1, 75, 50, :]) assert (63, 128, 128) == tuple(ybr[1, 85, 50, :]) assert (0, 128, 128) == tuple(ybr[1, 95, 50, :]) def test_unsuitable_dtype_raises(self): """Test that non u1 dtypes raise an exception.""" msg = ( "Invalid ndarray.dtype 'int8' for color space conversion, " "must be 'uint8' or an equivalent" ) with pytest.raises(ValueError, match=msg): convert_color_space(np.ones((2, 3), dtype="i1"), "RGB", "YBR_FULL") msg = ( "Invalid ndarray.dtype 'uint16' for color space conversion, " "must be 'uint8'" ) with pytest.raises(ValueError, match=msg): convert_color_space(np.ones((2, 3), dtype="u2"), "RGB", "YBR_FULL") @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestModalityLUT: """Tests for apply_modality_lut().""" def test_slope_intercept(self): """Test the rescale slope/intercept transform.""" ds = dcmread(MOD_16) assert 1 == ds.RescaleSlope assert -1024 == ds.RescaleIntercept arr = ds.pixel_array out = apply_modality_lut(arr, ds) assert out.flags.writeable assert np.float64 == out.dtype assert np.array_equal(arr - 1024, out) ds.RescaleSlope = 2.5 ds.RescaleIntercept = -2048 out = apply_modality_lut(arr, ds) assert np.array_equal(arr * 2.5 - 2048, out) def test_lut_sequence(self): """Test the LUT Sequence transform.""" # Unused bits don't match interpretation! ds = dcmread(MOD_16_SEQ) assert ds.BitsAllocated == 16 assert ds.BitsStored == 12 seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor arr = ds.pixel_array assert -2048 == arr.min() assert 2047 == arr.max() out = apply_modality_lut(arr, ds) assert out.flags.writeable assert out.dtype == np.uint16 assert [32759, 32759, 49147, 49147, 32759] == list(out[0, 50:55]) assert [65535, 0, 0, 65535, 65535] == list(out[50, 50:55]) assert [65535, 0, 0, 0, 65535] == list(out[100, 50:55]) assert [32759, 32759, 49147, 49147, 32759] == list(out[150, 50:55]) assert [32759, 32759, 49147, 49147, 32759] == list(out[200, 50:55]) assert 39321 == out[185, 340] assert 45867 == out[185, 385] assert 52428 == out[228, 385] assert 58974 == out[291, 385] def test_lut_sequence_zero_entries(self): """Test that 0 entries is interpreted correctly.""" # LUTDescriptor[0] of 0 -> 65536, but only 4096 entries so any # attempt to access LUTData[4096] or higher will raise IndexError ds = dcmread(MOD_16_SEQ) seq = ds.ModalityLUTSequence[0] seq.LUTDescriptor = [0, 0, 16] assert 4096 == len(seq.LUTData) arr = np.asarray([0, 4095, 4096, 65535]) msg = r"index 4096 is out of bounds" with pytest.raises(IndexError, match=msg): apply_modality_lut(arr, ds) # LUTData with 65536 entries seq.LUTData = [0] * 65535 + [1] out = apply_modality_lut(arr, ds) assert [0, 0, 0, 1] == list(out) def test_unchanged(self): """Test no modality LUT transform.""" ds = dcmread(MOD_16) del ds.RescaleSlope del ds.RescaleIntercept arr = ds.pixel_array out = apply_modality_lut(arr, ds) assert arr is out ds.ModalityLUTSequence = [] out = apply_modality_lut(arr, ds) assert arr is out def test_lutdata_ow(self): """Test LUT Data with VR OW.""" ds = dcmread(MOD_16_SEQ) assert ds.original_encoding == (False, True) seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor seq["LUTData"].VR = "OW" seq.LUTData = pack("<4096H", *seq.LUTData) arr = ds.pixel_array assert -2048 == arr.min() assert 2047 == arr.max() out = apply_modality_lut(arr, ds) assert out.flags.writeable assert out.dtype == np.uint16 assert [32759, 32759, 49147, 49147, 32759] == list(out[0, 50:55]) assert [65535, 0, 0, 65535, 65535] == list(out[50, 50:55]) assert [65535, 0, 0, 0, 65535] == list(out[100, 50:55]) assert [32759, 32759, 49147, 49147, 32759] == list(out[150, 50:55]) assert [32759, 32759, 49147, 49147, 32759] == list(out[200, 50:55]) assert 39321 == out[185, 340] assert 45867 == out[185, 385] assert 52428 == out[228, 385] assert 58974 == out[291, 385] def test_no_endianness_raises(self): ds = dcmread(MOD_16_SEQ) assert ds.original_encoding == (False, True) seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor seq["LUTData"].VR = "OW" seq.LUTData = pack("<4096H", *seq.LUTData) arr = ds.pixel_array del ds.file_meta ds._read_little = None msg = ( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in 'FileDataset.file_meta'" ) with pytest.raises(AttributeError, match=msg): apply_modality_lut(arr, ds) def test_file_meta(self): """Test using file meta to determine endianness""" ds = dcmread(MOD_16_SEQ) seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor seq["LUTData"].VR = "OW" seq.LUTData = pack("<4096H", *seq.LUTData) arr = ds.pixel_array ds._read_little = None out = apply_modality_lut(arr, ds) assert 39321 == out[185, 340] assert 45867 == out[185, 385] assert 52428 == out[228, 385] assert 58974 == out[291, 385] def test_original_encoding(self): """Test using original encoding to determine endianness""" ds = dcmread(MOD_16_SEQ) seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor seq["LUTData"].VR = "OW" seq.LUTData = pack("<4096H", *seq.LUTData) arr = ds.pixel_array del ds.file_meta assert ds.original_encoding == (False, True) out = apply_modality_lut(arr, ds) assert 39321 == out[185, 340] assert 45867 == out[185, 385] assert 52428 == out[228, 385] assert 58974 == out[291, 385] @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestApplyColorLUT: """Tests for apply_color_lut().""" def setup_method(self): """Setup the tests""" self.o_palette = get_palette_files("pet.dcm")[0] self.n_palette = get_palette_files("pet.dcm")[0][:-3] + "tmp" def teardown_method(self): """Teardown the tests""" if os.path.exists(self.n_palette): os.rename(self.n_palette, self.o_palette) def test_neither_ds_nor_palette_raises(self): """Test missing `ds` and `palette` raise an exception.""" ds = dcmread(PAL_08_256_0_16_1F) msg = r"Either 'ds' or 'palette' is required" with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array) def test_palette_unknown_raises(self, disable_value_validation): """Test using an unknown `palette` raise an exception.""" ds = dcmread(PAL_08_256_0_16_1F) # Palette name msg = r"Unknown palette 'TEST'" with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, palette="TEST") # SOP Instance UID msg = r"Unknown palette '1.2.840.10008.1.1'" with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, palette="1.2.840.10008.1.1") def test_palette_unavailable_raises(self, disable_value_validation): """Test using a missing `palette` raise an exception.""" os.rename(self.o_palette, self.n_palette) ds = dcmread(PAL_08_256_0_16_1F) msg = r"list index out of range" with pytest.raises(IndexError, match=msg): apply_color_lut(ds.pixel_array, palette="PET") def test_supplemental_raises(self): """Test that supplemental palette color LUT raises exception.""" ds = dcmread(SUP_16_16_2F) msg = ( r"Use of this function with the Supplemental Palette Color Lookup " r"Table Module is not currently supported" ) with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, ds) def test_invalid_bit_depth_raises(self): """Test that an invalid bit depth raises an exception.""" ds = dcmread(PAL_08_256_0_16_1F) ds.RedPaletteColorLookupTableDescriptor[2] = 15 msg = r"data type ['\"]uint15['\"] not understood" with pytest.raises(TypeError, match=msg): apply_color_lut(ds.pixel_array, ds) def test_invalid_lut_bit_depth_raises(self): """Test that an invalid LUT bit depth raises an exception.""" ds = dcmread(PAL_08_256_0_16_1F) ds.RedPaletteColorLookupTableData = ds.RedPaletteColorLookupTableData[:-2] ds.GreenPaletteColorLookupTableData = ds.GreenPaletteColorLookupTableData[:-2] ds.BluePaletteColorLookupTableData = ds.BluePaletteColorLookupTableData[:-2] msg = ( r"The bit depth of the LUT data '15.9' is invalid \(only 8 or 16 " r"bits per entry allowed\)" ) with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, ds) def test_unequal_lut_length_raises(self): """Test that an unequal LUT lengths raise an exception.""" ds = dcmread(PAL_08_256_0_16_1F) ds.BluePaletteColorLookupTableData = ds.BluePaletteColorLookupTableData[:-2] msg = r"LUT data must be the same length" with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, ds) def test_no_palette_color(self): """Test that an unequal LUT lengths raise an exception.""" ds = dcmread(PAL_08_256_0_16_1F) del ds.RedPaletteColorLookupTableData msg = r"No suitable Palette Color Lookup Table Module found" with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, ds) def test_uint08_16(self): """Test uint8 Pixel Data with 16-bit LUT entries.""" ds = dcmread(PAL_08_200_0_16_1F, force=True) ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian assert 8 == ds.BitsStored assert 16 == ds.RedPaletteColorLookupTableDescriptor[2] arr = ds.pixel_array orig = arr.copy() rgb = apply_color_lut(arr, ds) assert (480, 640, 3) == rgb.shape assert [0, 0, 0] == list(rgb[0, 0, :]) assert [9216, 9216, 9216] == list(rgb[0, 4, :]) assert [18688, 18688, 18688] == list(rgb[0, 9, :]) assert [27904, 33536, 0] == list(rgb[0, 638, :]) assert [18688, 24320, 0] == list(rgb[479, 639, :]) # original `arr` is unchanged assert np.array_equal(orig, arr) def test_uint08_16_2frame(self): """Test 2 frame uint8 Pixel Data with 16-bit LUT entries.""" ds = dcmread(PAL_08_256_0_16_2F) assert 8 == ds.BitsStored assert 16 == ds.RedPaletteColorLookupTableDescriptor[2] arr = ds.pixel_array orig = arr.copy() rgb = apply_color_lut(arr, ds) assert (2, 600, 800, 3) == rgb.shape assert [9472, 15872, 24064] == list(rgb[0, 0, 0, :]) assert [34816, 43520, 54016] == list(rgb[0, 12, 12, :]) assert [65280, 65280, 65280] == list(rgb[0, 17, 110, :]) assert [0, 0, 0] == list(rgb[0, 77, 103, :]) assert [23040, 52480, 65280] == list(rgb[0, 478, 793, :]) # 2nd frame is inverse of 1st, so won't be coloured correctly ref = np.asarray( [ [26112, 26112, 26112], [54528, 54528, 54528], [54528, 54528, 54528], [16640, 16640, 16640], [49152, 45056, 22016], [34816, 43520, 54016], [5632, 9984, 14848], [62464, 2816, 2816], [3072, 5632, 8192], [3072, 5632, 8192], ] ) assert np.array_equal(ref, rgb[1, 143:153, 355, :]) # original `arr` is unchanged assert np.array_equal(orig, arr) def test_uint16_16_segmented_little(self): """Test uint16 Pixel Data with 16-bit LUT entries.""" # Endianness from file_meta ds = dcmread(PAL_SEG_LE_16_1F) assert 16 == ds.BitsStored assert 16 == ds.RedPaletteColorLookupTableDescriptor[2] arr = ds.pixel_array orig = arr.copy() rgb = apply_color_lut(arr, ds) assert (480, 640, 3) == rgb.shape assert [10280, 11565, 16705] == list(rgb[0, 0, :]) assert [10280, 11565, 16705] == list(rgb[0, 320, :]) assert [10280, 11565, 16705] == list(rgb[0, 639, :]) assert [0, 0, 0] == list(rgb[240, 0, :]) assert [257, 257, 257] == list(rgb[240, 320, :]) assert [2313, 2313, 2313] == list(rgb[240, 639, :]) assert [10280, 11565, 16705] == list(rgb[479, 0, :]) assert [10280, 11565, 16705] == list(rgb[479, 320, :]) assert [10280, 11565, 16705] == list(rgb[479, 639, :]) assert (orig == arr).all() # Endianness from original encoding ds = dcmread(PAL_SEG_LE_16_1F) assert 16 == ds.BitsStored assert 16 == ds.RedPaletteColorLookupTableDescriptor[2] arr = ds.pixel_array orig = arr.copy() del ds.file_meta rgb = apply_color_lut(arr, ds) assert (480, 640, 3) == rgb.shape assert [10280, 11565, 16705] == list(rgb[0, 0, :]) assert [10280, 11565, 16705] == list(rgb[0, 320, :]) assert [10280, 11565, 16705] == list(rgb[0, 639, :]) assert [0, 0, 0] == list(rgb[240, 0, :]) assert [257, 257, 257] == list(rgb[240, 320, :]) assert [2313, 2313, 2313] == list(rgb[240, 639, :]) assert [10280, 11565, 16705] == list(rgb[479, 0, :]) assert [10280, 11565, 16705] == list(rgb[479, 320, :]) assert [10280, 11565, 16705] == list(rgb[479, 639, :]) assert (orig == arr).all() # No endianness raises ds._read_little = None msg = ( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in 'FileDataset.file_meta'" ) with pytest.raises(AttributeError, match=msg): apply_color_lut(arr, ds) def test_uint16_16_segmented_big(self): """Test big endian uint16 Pixel Data with 16-bit LUT entries.""" ds = dcmread(PAL_SEG_BE_16_1F) assert 16 == ds.BitsStored assert 16 == ds.RedPaletteColorLookupTableDescriptor[2] arr = ds.pixel_array rgb = apply_color_lut(arr, ds) assert (480, 640, 3) == rgb.shape assert [10280, 11565, 16705] == list(rgb[0, 0, :]) assert [10280, 11565, 16705] == list(rgb[0, 320, :]) assert [10280, 11565, 16705] == list(rgb[0, 639, :]) assert [0, 0, 0] == list(rgb[240, 0, :]) assert [257, 257, 257] == list(rgb[240, 320, :]) assert [2313, 2313, 2313] == list(rgb[240, 639, :]) assert [10280, 11565, 16705] == list(rgb[479, 0, :]) assert [10280, 11565, 16705] == list(rgb[479, 320, :]) assert [10280, 11565, 16705] == list(rgb[479, 639, :]) def test_16_allocated_8_entries(self): """Test LUT with 8-bit entries in 16 bits allocated.""" ds = dcmread(PAL_08_200_0_16_1F, force=True) ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian ds.RedPaletteColorLookupTableDescriptor = [200, 0, 8] lut = pack("<200H", *list(range(0, 200))) assert 400 == len(lut) ds.RedPaletteColorLookupTableData = lut ds.GreenPaletteColorLookupTableData = lut ds.BluePaletteColorLookupTableData = lut arr = ds.pixel_array assert (56, 149) == (arr.min(), arr.max()) out = apply_color_lut(arr, ds) # Because the LUTs are mapped index to value (i.e. LUT[0] = 0, # LUT[149] = 149), the output array should equal the input array # but with three channels of identical values assert np.array_equal(arr, out[:, :, 0]) assert np.array_equal(arr, out[:, :, 1]) assert np.array_equal(arr, out[:, :, 2]) def test_alpha(self): """Test applying a color palette with an alpha channel.""" ds = dcmread(PAL_08_256_0_16_1F) ds.AlphaPaletteColorLookupTableData = b"\x00\x80" * 256 arr = ds.pixel_array rgba = apply_color_lut(arr, ds) assert (600, 800, 4) == rgba.shape assert 32768 == rgba[:, :, 3][0, 0] assert (32768 == rgba[:, :, 3]).any() def test_well_known_palette(self, disable_value_validation): """Test using a well-known palette.""" ds = dcmread(PAL_08_256_0_16_1F) # Drop it to 8-bit arr = ds.pixel_array rgb = apply_color_lut(arr, palette="PET") line = rgb[68:88, 364, :] ref = [ [249, 122, 12], [255, 130, 4], [255, 136, 16], [255, 134, 12], [253, 126, 4], [239, 112, 32], [211, 84, 88], [197, 70, 116], [177, 50, 156], [168, 40, 176], [173, 46, 164], [185, 58, 140], [207, 80, 96], [209, 82, 92], [189, 62, 132], [173, 46, 164], [168, 40, 176], [162, 34, 188], [162, 34, 188], [154, 26, 204], ] assert np.array_equal(np.asarray(ref), line) uid = apply_color_lut(arr, palette="1.2.840.10008.1.5.2") assert np.array_equal(uid, rgb) def test_first_map_positive(self): """Test a positive first mapping value.""" ds = dcmread(PAL_08_200_0_16_1F, force=True) ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian ds.RedPaletteColorLookupTableDescriptor[1] = 10 arr = ds.pixel_array rgb = apply_color_lut(arr, ds) # All IVs < 10 should be set to LUT[0] # All IVs >= 10 should be shifted down 10 entries # Original IV range is 56 to 149 -> 46 to 139 # LUT[88] -> LUT[78] = [33280, 56320, 65280] # LUT[149] -> LUT[139] = [50944, 16384, 27904] assert [33280, 56320, 65280] == list(rgb[arr == 88][0]) assert ([33280, 56320, 65280] == rgb[arr == 88]).all() assert [50944, 16384, 27904] == list(rgb[arr == 149][0]) assert ([50944, 16384, 27904] == rgb[arr == 149]).all() def test_first_map_negative(self): """Test a negative first mapping value.""" ds = dcmread(PAL_08_200_0_16_1F, force=True) ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian ds["RedPaletteColorLookupTableDescriptor"].VR = "SS" ds.RedPaletteColorLookupTableDescriptor[1] = -10 arr = ds.pixel_array rgb = apply_color_lut(arr, ds) # All IVs < -10 should be set to LUT[0] # All IVs >= -10 should be shifted up 10 entries # Original IV range is 56 to 149 -> 66 to 159 # LUT[60] -> LUT[70] = [33280 61952 65280] # LUT[130] -> LUT[140] = [60160, 25600, 37376] assert [33280, 61952, 65280] == list(rgb[arr == 60][0]) assert ([33280, 61952, 65280] == rgb[arr == 60]).all() assert [60160, 25600, 37376] == list(rgb[arr == 130][0]) assert ([60160, 25600, 37376] == rgb[arr == 130]).all() def test_unchanged(self): """Test dataset with no LUT is unchanged.""" # Regression test for #1068 ds = dcmread(MOD_16, force=True) assert "RedPaletteColorLookupTableDescriptor" not in ds msg = r"No suitable Palette Color Lookup Table Module found" with pytest.raises(ValueError, match=msg): apply_color_lut(ds.pixel_array, ds) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestExpandSegmentedLUT: """Tests for _expand_segmented_lut().""" def test_discrete(self): """Test expanding a discrete segment.""" data = (0, 1, 0) assert [0] == _expand_segmented_lut(data, "H") data = (0, 2, 0, 112) assert [0, 112] == _expand_segmented_lut(data, "H") data = (0, 2, 0, -112) assert [0, -112] == _expand_segmented_lut(data, "H") data = (0, 2, 0, 112, 0, 0) assert [0, 112] == _expand_segmented_lut(data, "H") data = (0, 2, 0, -112, 0, 0) assert [0, -112] == _expand_segmented_lut(data, "H") def test_linear(self): """Test expanding a linear segment.""" # Linear can never be the first segment # Positive slope data = (0, 2, 0, 28672, 1, 5, 49152) out = _expand_segmented_lut(data, "H") assert [0, 28672, 32768, 36864, 40960, 45056, 49152] == out data = (0, 1, -400, 1, 5, 0) out = _expand_segmented_lut(data, "H") assert [-400, -320, -240, -160, -80, 0] == out # Positive slope, floating point steps data = (0, 1, 163, 1, 48, 255) out = _expand_segmented_lut(data, "H") assert (1 + 48) == len(out) # No slope data = (0, 2, 0, 28672, 1, 5, 28672) out = _expand_segmented_lut(data, "H") assert [0, 28672, 28672, 28672, 28672, 28672, 28672] == out data = (0, 1, -100, 1, 5, -100) out = _expand_segmented_lut(data, "H") assert [-100, -100, -100, -100, -100, -100] == out # Negative slope data = (0, 2, 0, 49152, 1, 5, 28672) out = _expand_segmented_lut(data, "H") assert [0, 49152, 45056, 40960, 36864, 32768, 28672] == out data = (0, 1, 0, 1, 5, -400) out = _expand_segmented_lut(data, "H") assert [0, -80, -160, -240, -320, -400] == out def test_indirect_08(self): """Test expanding an indirect segment encoded as 8-bit.""" # No real world test data available for this # LSB, MSB ref_a = [0, 112, 128, 144, 160, 176, 192, 192, 192, 192, 192, 192] # Little endian data = (0, 2, 0, 112, 1, 5, 192, 2, 1, 4, 0, 0, 0) out = _expand_segmented_lut(data, "B") assert ref_a == out data = (0, 2, 0, 112, 2, 1, 0, 0, 0, 0) out = _expand_segmented_lut(data, ">B") assert [0, 112, 0, 112] == out # 0x0001 0x0203 is 66051 in BE 16-bit MSB, LSB data = [0, 1, 0] * 22017 + [0, 2, 1, 2] + [2, 1, 2, 3, 0, 1] out = _expand_segmented_lut(data, ">B") assert [0] * 22017 + [1, 2, 1, 2] == out def test_indirect_16(self): """Test expanding an indirect segment encoded as 16-bit.""" # Start from a discrete segment data = (0, 2, 0, 112, 1, 5, 192, 2, 2, 0, 0) out = _expand_segmented_lut(data, "H") assert [0, 112, 128, 144, 160, 176, 192] * 2 == out # Start from a linear segment data = (0, 2, 0, 112, 1, 5, 192, 2, 1, 4, 0) out = _expand_segmented_lut(data, "H") assert [0, 112, 128, 144, 160, 176, 192, 192, 192, 192, 192, 192] == out def test_palettes_spring(self): """Test expanding the SPRING palette.""" ds = dcmread(get_palette_files("spring.dcm")[0]) bs = ds.SegmentedRedPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [255] * 256 == out bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(0, 256)) == out bs = ds.SegmentedBluePaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(255, -1, -1)) == out def test_palettes_summer(self): """Test expanding the SUMMER palette.""" ds = dcmread(get_palette_files("summer.dcm")[0]) bs = ds.SegmentedRedPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [0] * 256 == out bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [255, 255, 254, 254, 253] == out[:5] assert [130, 129, 129, 128, 128] == out[-5:] bs = ds.SegmentedBluePaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [0] * 128 == out[:128] assert [246, 248, 250, 252, 254] == out[-5:] def test_palettes_fall(self): """Test expanding the FALL palette.""" ds = dcmread(get_palette_files("fall.dcm")[0]) bs = ds.SegmentedRedPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [255] * 256 == out bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(255, -1, -1)) == out bs = ds.SegmentedBluePaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [0] * 256 == out def test_palettes_winter(self): """Test expanding the WINTER palette.""" ds = dcmread(get_palette_files("winter.dcm")[0]) bs = ds.SegmentedRedPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [0] * 128 == out[:128] assert [123, 124, 125, 126, 127] == out[-5:] bs = ds.SegmentedGreenPaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert list(range(0, 256)) == out bs = ds.SegmentedBluePaletteColorLookupTableData fmt = f"<{len(bs)}B" data = unpack(fmt, bs) out = _expand_segmented_lut(data, fmt) assert [255, 255, 254, 254, 253] == out[:5] assert [130, 129, 129, 128, 128] == out[-5:] def test_first_linear_raises(self): """Test having a linear segment first raises exception.""" data = (1, 5, 49152) msg = ( r"Error expanding a segmented palette color lookup table: " r"the first segment cannot be a linear segment" ) with pytest.raises(ValueError, match=msg): _expand_segmented_lut(data, "H") def test_first_indirect_raises(self): """Test having a linear segment first raises exception.""" data = (2, 5, 2, 0) msg = ( r"Error expanding a segmented palette color lookup table: " r"the first segment cannot be an indirect segment" ) with pytest.raises(ValueError, match=msg): _expand_segmented_lut(data, "H") def test_unknown_opcode_raises(self): """Test having an unknown opcode raises exception.""" data = (3, 5, 49152) msg = ( r"Error expanding a segmented palette lookup table: " r"unknown segment type '3'" ) with pytest.raises(ValueError, match=msg): _expand_segmented_lut(data, "H") @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestApplyWindowing: """Tests for apply_windowing().""" def test_window_single_view(self): """Test windowing with a single view.""" # 12-bit unsigned ds = dcmread(WIN_12_1F) assert 16 == ds.BitsAllocated assert 12 == ds.BitsStored assert 0 == ds.PixelRepresentation ds.WindowCenter = 450 ds.WindowWidth = 790 assert 450 == ds.WindowCenter assert 790 == ds.WindowWidth arr = ds.pixel_array assert 642 == arr[326, 130] out = apply_windowing(arr, ds) assert 3046.6 == pytest.approx(out[326, 130], abs=0.1) def test_window_multi_view(self): """Test windowing with multiple views.""" ds = dcmread(WIN_12_1F) assert 16 == ds.BitsAllocated assert 12 == ds.BitsStored assert 0 == ds.PixelRepresentation if HAVE_NP and config.use_DS_numpy: expected = np.array([450, 200]) assert np.allclose(ds.WindowCenter, expected) expected = np.array([790, 443]) assert np.allclose(ds.WindowWidth, expected) else: assert [450, 200] == ds.WindowCenter assert [790, 443] == ds.WindowWidth arr = ds.pixel_array assert 642 == arr[326, 130] out = apply_windowing(arr, ds) assert 3046.6 == pytest.approx(out[326, 130], abs=0.1) out = apply_windowing(arr, ds, index=1) assert 4095.0 == pytest.approx(out[326, 130], abs=0.1) def test_window_uint8(self): """Test windowing an 8-bit unsigned array.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 0 ds.BitsStored = 8 arr = np.asarray([0, 1, 128, 254, 255], dtype="uint8") # Linear ds.WindowWidth = 1 ds.WindowCenter = 0 assert [255, 255, 255, 255, 255] == apply_windowing(arr, ds).tolist() ds.WindowWidth = 128 ds.WindowCenter = 254 assert [0, 0, 0, 128.5, 130.5] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) # Linear exact ds.VOILUTFunction = "LINEAR_EXACT" assert [0, 0, 0, 127.5, 129.5] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) # Sigmoid ds.VOILUTFunction = "SIGMOID" assert [0.1, 0.1, 4.9, 127.5, 129.5] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) def test_window_uint16(self): """Test windowing a 16-bit unsigned array.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 0 ds.BitsStored = 16 arr = np.asarray([0, 1, 32768, 65534, 65535], dtype="uint16") ds.WindowWidth = 1 ds.WindowCenter = 0 assert [65535] * 5 == apply_windowing(arr, ds).tolist() ds.WindowWidth = 32768 ds.WindowCenter = 254 assert [32260.5, 32262.5, 65535, 65535, 65535] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) ds.VOILUTFunction = "LINEAR_EXACT" assert [32259.5, 32261.5, 65535, 65535, 65535] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) ds.VOILUTFunction = "SIGMOID" assert [32259.5, 32261.5, 64319.8, 65512.3, 65512.3] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) def test_window_uint32(self): """Test windowing a 32-bit unsigned array.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 0 ds.BitsStored = 32 y_max = 2**32 - 1 arr = np.asarray([0, 1, 2**31, y_max - 1, y_max], dtype="uint32") ds.WindowWidth = 1 ds.WindowCenter = 0 assert [y_max] * 5 == apply_windowing(arr, ds).tolist() ds.WindowWidth = 342423423423 ds.WindowCenter = 757336 assert [ 2147474148.4, 2147474148.4, 2174409724, 2201345299.7, 2201345299.7, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) ds.VOILUTFunction = "LINEAR_EXACT" assert [ 2147474148.3, 2147474148.4, 2174409724, 2201345299.7, 2201345299.7, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) ds.VOILUTFunction = "SIGMOID" assert [ 2147474148.3, 2147474148.4, 2174408313.1, 2201334008.2, 2201334008.3, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) def test_window_int8(self): """Test windowing an 8-bit signed array.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 1 ds.BitsStored = 8 arr = np.asarray([-128, -127, -1, 0, 1, 126, 127], dtype="int8") # Linear ds.WindowWidth = 1 ds.WindowCenter = 0 assert [-128, -128, -128, 127, 127, 127, 127] == pytest.approx( apply_windowing(arr, ds).tolist() ) ds.WindowWidth = 128 ds.WindowCenter = -5 assert [-128, -128, 8.5, 10.5, 12.6, 127, 127] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) # Linear exact ds.VOILUTFunction = "LINEAR_EXACT" assert [-128, -128, 7.5, 9.5, 11.5, 127, 127] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) # Sigmoid ds.VOILUTFunction = "SIGMOID" assert [-122.7, -122.5, 7.5, 9.4, 11.4, 122.8, 122.9] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) def test_window_int16(self): """Test windowing an 8-bit signed array.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 1 ds.BitsStored = 16 arr = np.asarray([-128, -127, -1, 0, 1, 126, 127], dtype="int16") # Linear ds.WindowWidth = 1 ds.WindowCenter = 0 assert [-32768, -32768, -32768, 32767, 32767, 32767, 32767] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) ds.WindowWidth = 128 ds.WindowCenter = -5 assert [-32768, -32768, 2321.6, 2837.6, 3353.7, 32767, 32767] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) # Linear exact ds.VOILUTFunction = "LINEAR_EXACT" assert [-32768, -32768, 2047.5, 2559.5, 3071.5, 32767, 32767] == pytest.approx( apply_windowing(arr, ds).tolist(), abs=0.1 ) # Sigmoid ds.VOILUTFunction = "SIGMOID" assert [ -31394.1, -31351.4, 2044.8, 2554.3, 3062.5, 31692, 31724.6, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) def test_window_int32(self): """Test windowing an 32-bit signed array.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 1 ds.BitsStored = 32 arr = np.asarray([-128, -127, -1, 0, 1, 126, 127], dtype="int32") # Linear ds.WindowWidth = 1 ds.WindowCenter = 0 assert [ -(2**31), -(2**31), -(2**31), 2**31 - 1, 2**31 - 1, 2**31 - 1, 2**31 - 1, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) ds.WindowWidth = 128 ds.WindowCenter = -5 assert [ -2147483648, -2147483648, 152183880, 186002520.1, 219821160.3, 2147483647, 2147483647, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) # Linear exact ds.VOILUTFunction = "LINEAR_EXACT" assert [ -2147483648, -2147483648, 134217727.5, 167772159.5, 201326591.5, 2147483647, 2147483647, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) # Sigmoid ds.VOILUTFunction = "SIGMOID" assert [ -2057442919.3, -2054646500.7, 134043237.4, 167431657.4, 200738833.7, 2077033158.8, 2079166214.8, ] == pytest.approx(apply_windowing(arr, ds).tolist(), abs=0.1) def test_window_multi_frame(self): """Test windowing with a multiple frames.""" ds = dcmread(WIN_12_1F) assert 16 == ds.BitsAllocated assert 12 == ds.BitsStored assert 0 == ds.PixelRepresentation ds.WindowCenter = 450 ds.WindowWidth = 790 assert 450 == ds.WindowCenter assert 790 == ds.WindowWidth arr = ds.pixel_array arr = np.stack([arr, 4095 - arr]) assert (2, 484, 484) == arr.shape assert 642 == arr[0, 326, 130] assert 3453 == arr[1, 326, 130] out = apply_windowing(arr, ds) assert 3046.6 == pytest.approx(out[0, 326, 130], abs=0.1) assert 4095.0 == pytest.approx(out[1, 326, 130], abs=0.1) def test_window_rescale(self): """Test windowing after a rescale operation.""" ds = dcmread(WIN_12_1F) assert 16 == ds.BitsAllocated assert 12 == ds.BitsStored assert 0 == ds.PixelRepresentation if HAVE_NP and config.use_DS_numpy: expected = np.array([450, 200]) assert np.allclose(ds.WindowCenter, expected) expected = np.array([790, 443]) assert np.allclose(ds.WindowWidth, expected) else: assert [450, 200] == ds.WindowCenter assert [790, 443] == ds.WindowWidth ds.RescaleSlope = 1.2 ds.RescaleIntercept = 0 arr = ds.pixel_array assert 0 == arr[16, 60] assert 642 == arr[326, 130] assert 1123 == arr[316, 481] hu = apply_modality_lut(arr, ds) assert 0 == hu[16, 60] assert 770.4 == hu[326, 130] assert 1347.6 == hu[316, 481] # With rescale -> output range is 0 to 4914 out = apply_windowing(hu, ds) assert 0 == pytest.approx(out[16, 60], abs=0.1) assert 4455.6 == pytest.approx(out[326, 130], abs=0.1) assert 4914.0 == pytest.approx(out[316, 481], abs=0.1) def test_window_modality_lut(self): """Test windowing after a modality LUT operation.""" ds = dcmread(MOD_16_SEQ) ds.WindowCenter = [49147, 200] ds.WindowWidth = [790, 443] assert 16 == ds.BitsAllocated assert 12 == ds.BitsStored assert 1 == ds.PixelRepresentation # Signed assert "RescaleSlope" not in ds assert "ModalityLUTSequence" in ds seq = ds.ModalityLUTSequence[0] assert [4096, -2048, 16] == seq.LUTDescriptor arr = ds.pixel_array assert -2048 == arr.min() assert 2047 == arr.max() arr = ds.pixel_array assert 2047 == arr[16, 60] assert 1023 == arr[0, 1] hu = apply_modality_lut(arr, ds) assert 65535 == hu[16, 60] assert 49147 == hu[0, 1] out = apply_windowing(hu, ds) assert 65535.0 == pytest.approx(out[16, 60], abs=0.1) assert 32809.0 == pytest.approx(out[0, 1], abs=0.1) # Output range must be 0 to 2**16 - 1 assert 65535 == out.max() assert 0 == out.min() def test_window_bad_photometric_interp(self): """Test bad photometric interpretation raises exception.""" ds = dcmread(WIN_12_1F) ds.PhotometricInterpretation = "RGB" msg = r"only 'MONOCHROME1' and 'MONOCHROME2' are allowed" with pytest.raises(ValueError, match=msg): apply_windowing(ds.pixel_array, ds) def test_window_bad_parameters(self): """Test bad windowing parameters raise exceptions.""" ds = dcmread(WIN_12_1F) ds.WindowWidth = 0 ds.VOILUTFunction = "LINEAR" msg = r"Width must be greater than or equal to 1" with pytest.raises(ValueError, match=msg): apply_windowing(ds.pixel_array, ds) ds.VOILUTFunction = "LINEAR_EXACT" msg = r"Width must be greater than 0" with pytest.raises(ValueError, match=msg): apply_windowing(ds.pixel_array, ds) ds.VOILUTFunction = "SIGMOID" msg = r"Width must be greater than 0" with pytest.raises(ValueError, match=msg): apply_windowing(ds.pixel_array, ds) ds.VOILUTFunction = "UNKNOWN" msg = r"Unsupported \(0028,1056\) VOI LUT Function value 'UNKNOWN'" with pytest.raises(ValueError, match=msg): apply_windowing(ds.pixel_array, ds) def test_window_bad_index(self, no_numpy_use): """Test windowing with a bad view index.""" ds = dcmread(WIN_12_1F) assert 2 == len(ds.WindowWidth) arr = ds.pixel_array with pytest.raises(IndexError, match=r"list index out of range"): apply_windowing(arr, ds, index=2) def test_unchanged(self): """Test input array is unchanged if no VOI LUT""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 1 ds.BitsStored = 8 arr = np.asarray([-128, -127, -1, 0, 1, 126, 127], dtype="int8") out = apply_windowing(arr, ds) assert [-128, -127, -1, 0, 1, 126, 127] == out.tolist() ds.ModalityLUTSequence = [] out = apply_windowing(arr, ds) assert [-128, -127, -1, 0, 1, 126, 127] == out.tolist() def test_rescale_empty(self): """Test RescaleSlope and RescaleIntercept being empty.""" ds = dcmread(WIN_12_1F) ds.RescaleSlope = None ds.RescaleIntercept = None arr = ds.pixel_array assert 0 == arr[16, 60] assert 642 == arr[326, 130] assert 1123 == arr[316, 481] out = apply_windowing(arr, ds) assert 0 == pytest.approx(out[16, 60], abs=0.1) assert 3046.6 == pytest.approx(out[326, 130], abs=0.1) assert 4095.0 == pytest.approx(out[316, 481], abs=0.1) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestApplyVOI: """Tests for apply_voi().""" def test_voi_single_view(self): """Test VOI LUT with a single view.""" ds = dcmread(VOI_08_1F) assert 8 == ds.BitsAllocated assert 8 == ds.BitsStored assert 0 == ds.PixelRepresentation item = ds.VOILUTSequence[0] assert [256, 0, 16] == item.LUTDescriptor lut = item.LUTData assert 0 == lut[0] assert 19532 == lut[76] assert 45746 == lut[178] assert 65535 == lut[255] arr = ds.pixel_array assert 0 == arr[387, 448] assert 76 == arr[178, 126] assert 178 == arr[186, 389] assert 255 == arr[129, 79] out = apply_voi(arr, ds) assert 0 == out[387, 448] assert 19532 == out[178, 126] assert 45746 == out[186, 389] assert 65535 == out[129, 79] def test_voi_multi_view(self): """Test VOI LUT with multiple views.""" ds = dcmread(VOI_08_1F) assert 8 == ds.BitsAllocated assert 8 == ds.BitsStored assert 0 == ds.PixelRepresentation item0 = ds.VOILUTSequence[0] # Add another view that's the inverse ds.VOILUTSequence.append(Dataset()) item1 = ds.VOILUTSequence[1] item1.LUTDescriptor = [256, 0, 16] item1.LUTData = item0.LUTData[::-1] arr = ds.pixel_array assert 0 == arr[387, 448] assert 76 == arr[178, 126] assert 178 == arr[186, 389] assert 255 == arr[129, 79] out0 = apply_voi(arr, ds) assert 0 == out0[387, 448] assert 19532 == out0[178, 126] assert 45746 == out0[186, 389] assert 65535 == out0[129, 79] out1 = apply_voi(arr, ds, index=1) assert 65535 == out1[387, 448] assert 46003 == out1[178, 126] assert 19789 == out1[186, 389] assert 0 == out1[129, 79] def test_voi_multi_frame(self): """Test VOI with a multiple frames.""" ds = dcmread(VOI_08_1F) assert 8 == ds.BitsAllocated assert 8 == ds.BitsStored assert 0 == ds.PixelRepresentation arr = ds.pixel_array arr = np.stack([arr, 255 - arr]) assert (2, 512, 512) == arr.shape out = apply_voi(arr, ds) assert 0 == out[0, 387, 448] assert 19532 == out[0, 178, 126] assert 45746 == out[0, 186, 389] assert 65535 == out[0, 129, 79] assert 65535 == out[1, 387, 448] assert 46003 == out[1, 178, 126] assert 19789 == out[1, 186, 389] assert 0 == out[1, 129, 79] def test_voi_zero_entries(self): """Test that 0 entries is interpreted correctly.""" ds = dcmread(VOI_08_1F) seq = ds.VOILUTSequence[0] seq.LUTDescriptor = [0, 0, 16] assert 256 == len(seq.LUTData) arr = np.asarray([0, 255, 256, 65535]) msg = r"index 256 is out of bounds" with pytest.raises(IndexError, match=msg): apply_voi(arr, ds) # LUTData with 65536 entries seq.LUTData = [0] * 65535 + [1] out = apply_voi(arr, ds) assert [0, 0, 0, 1] == list(out) def test_voi_uint8(self): """Test uint VOI LUT with an 8-bit LUT.""" ds = Dataset() ds.PixelRepresentation = 0 ds.BitsStored = 8 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 8] item.LUTData = [0, 127, 128, 255] arr = np.asarray([0, 1, 128, 254, 255], dtype="uint8") out = apply_voi(arr, ds) assert "uint8" == out.dtype assert [0, 127, 255, 255, 255] == out.tolist() def test_voi_uint16(self): """Test uint VOI LUT with an 16-bit LUT.""" ds = Dataset() ds.PixelRepresentation = 0 ds.BitsStored = 16 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 16] item.LUTData = [0, 127, 32768, 65535] arr = np.asarray([0, 1, 2, 3, 255], dtype="uint16") out = apply_voi(arr, ds) assert "uint16" == out.dtype assert [0, 127, 32768, 65535, 65535] == out.tolist() def test_voi_int8(self): """Test int VOI LUT with an 8-bit LUT.""" ds = Dataset() ds.PixelRepresentation = 1 ds.BitsStored = 8 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 8] item.LUTData = [0, 127, 128, 255] arr = np.asarray([0, -1, 2, -128, 127], dtype="int8") out = apply_voi(arr, ds) assert "uint8" == out.dtype assert [0, 0, 128, 0, 255] == out.tolist() def test_voi_int16(self): """Test int VOI LUT with an 16-bit LUT.""" ds = Dataset() ds.PixelRepresentation = 0 ds.BitsStored = 16 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 16] item.LUTData = [0, 127, 32768, 65535] arr = np.asarray([0, -1, 2, -128, 255], dtype="int16") out = apply_voi(arr, ds) assert "uint16" == out.dtype assert [0, 0, 32768, 0, 65535] == out.tolist() def test_voi_bad_depth(self): """Test bad LUT depth raises exception.""" ds = dcmread(VOI_08_1F) item = ds.VOILUTSequence[0] item.LUTDescriptor[2] = 7 msg = r"'7' bits per LUT entry is not supported" with pytest.raises(NotImplementedError, match=msg): apply_voi(ds.pixel_array, ds) item.LUTDescriptor[2] = 17 msg = r"'17' bits per LUT entry is not supported" with pytest.raises(NotImplementedError, match=msg): apply_voi(ds.pixel_array, ds) def test_voi_uint16_array_float(self): """Test warning when array is float and VOI LUT with an 16-bit LUT""" ds = Dataset() ds.PixelRepresentation = 0 ds.BitsStored = 16 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 16] item.LUTData = [0, 127, 32768, 65535] arr = np.asarray([0, 1, 2, 3, 255], dtype="float64") msg = r"Applying a VOI LUT on a float input array may give incorrect results" with pytest.warns(UserWarning, match=msg): out = apply_voi(arr, ds) assert [0, 127, 32768, 65535, 65535] == out.tolist() def test_unchanged(self): """Test input array is unchanged if no VOI LUT""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 1 ds.BitsStored = 8 arr = np.asarray([-128, -127, -1, 0, 1, 126, 127], dtype="int8") out = apply_voi(arr, ds) assert [-128, -127, -1, 0, 1, 126, 127] == out.tolist() ds.VOILUTSequence = [] out = apply_voi(arr, ds) assert [-128, -127, -1, 0, 1, 126, 127] == out.tolist() def test_voi_lutdata_ow(self): """Test LUT Data with VR OW.""" ds = Dataset() ds.set_original_encoding(False, True) ds.PixelRepresentation = 0 ds.BitsStored = 16 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 16] item.LUTData = [0, 127, 32768, 65535] item.LUTData = pack("<4H", *item.LUTData) item["LUTData"].VR = "OW" arr = np.asarray([0, 1, 2, 3, 255], dtype="uint16") out = apply_voi(arr, ds) assert "uint16" == out.dtype assert [0, 127, 32768, 65535, 65535] == out.tolist() def test_file_meta(self): """Test using file meta to determine endianness""" ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.PixelRepresentation = 0 ds.BitsStored = 16 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 16] item.LUTData = [0, 127, 32768, 65535] item.LUTData = pack("<4H", *item.LUTData) item["LUTData"].VR = "OW" arr = np.asarray([0, 1, 2, 3, 255], dtype="uint16") out = apply_voi(arr, ds) assert "uint16" == out.dtype assert [0, 127, 32768, 65535, 65535] == out.tolist() def test_no_endianness_raises(self): """Test unable to determine endianness""" ds = Dataset() ds.PixelRepresentation = 0 ds.BitsStored = 16 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 16] item.LUTData = [0, 127, 32768, 65535] item.LUTData = pack("<4H", *item.LUTData) item["LUTData"].VR = "OW" arr = np.asarray([0, 1, 2, 3, 255], dtype="uint16") msg = ( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in 'Dataset.file_meta'" ) with pytest.raises(AttributeError, match=msg): apply_voi(arr, ds) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestApplyVOILUT: """Tests for apply_voi_lut()""" def test_unchanged(self): """Test input array is unchanged if no VOI LUT""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 1 ds.BitsStored = 8 arr = np.asarray([-128, -127, -1, 0, 1, 126, 127], dtype="int8") out = apply_voi_lut(arr, ds) assert [-128, -127, -1, 0, 1, 126, 127] == out.tolist() ds.VOILUTSequence = [] out = apply_voi_lut(arr, ds) assert [-128, -127, -1, 0, 1, 126, 127] == out.tolist() def test_only_windowing(self): """Test only windowing operation elements present.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 0 ds.BitsStored = 8 arr = np.asarray([0, 1, 128, 254, 255], dtype="uint8") ds.WindowWidth = 1 ds.WindowCenter = 0 assert [255, 255, 255, 255, 255] == apply_voi_lut(arr, ds).tolist() def test_only_voi(self): """Test only LUT operation elements present.""" ds = Dataset() ds.PixelRepresentation = 0 ds.BitsStored = 8 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 8] item.LUTData = [0, 127, 128, 255] arr = np.asarray([0, 1, 128, 254, 255], dtype="uint8") out = apply_voi_lut(arr, ds) assert "uint8" == out.dtype assert [0, 127, 255, 255, 255] == out.tolist() def test_voi_windowing(self): """Test both LUT and windowing operation elements present.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 0 ds.BitsStored = 8 ds.WindowWidth = 1 ds.WindowCenter = 0 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 8] item.LUTData = [0, 127, 128, 255] arr = np.asarray([0, 1, 128, 254, 255], dtype="uint8") # Defaults to LUT out = apply_voi_lut(arr, ds) assert [0, 127, 255, 255, 255] == out.tolist() out = apply_voi_lut(arr, ds, prefer_lut=False) assert [255, 255, 255, 255, 255] == out.tolist() def test_voi_windowing_empty(self): """Test empty VOI elements.""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME1" ds.PixelRepresentation = 0 ds.BitsStored = 8 ds.WindowWidth = 1 ds.WindowCenter = 0 ds.VOILUTSequence = [Dataset()] item = ds.VOILUTSequence[0] item.LUTDescriptor = [4, 0, 8] item.LUTData = [0, 127, 128, 255] arr = np.asarray([0, 1, 128, 254, 255], dtype="uint8") # Test empty VOI elements item.LUTData = None out = apply_voi_lut(arr, ds) assert [255, 255, 255, 255, 255] == out.tolist() # Test empty windowing elements ds.WindowWidth = None out = apply_voi_lut(arr, ds) assert [0, 1, 128, 254, 255] == out.tolist() @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestApplyPresentationLUT: """Tests for apply_presentation_lut()""" def test_shape(self): """Test Presentation LUT Shape""" ds = dcmread(VOI_08_1F) ds.PresentationLUTShape = "IDENTITY" arr = ds.pixel_array out = apply_presentation_lut(arr, ds) assert arr is out ds.PresentationLUTShape = "INVERSE" out = apply_presentation_lut(arr, ds) arr = arr.max() - arr assert np.array_equal(out, arr) def test_shape_unknown_raises(self): """Test an unknown Presentation LUT Shape raises an exception""" ds = dcmread(VOI_08_1F) ds.PresentationLUTShape = "FOO" msg = ( r"A \(2050,0020\) 'Presentation LUT Shape' value of 'FOO' is not supported" ) with pytest.raises(NotImplementedError, match=msg): apply_presentation_lut(ds.pixel_array, ds) def test_sequence_8bit_unsigned(self): """Test Presentation LUT Sequence with 8-bit unsigned input""" # 8 bit unsigned input ds = dcmread(VOI_08_1F) assert ds.BitsStored == 8 assert ds.PixelRepresentation == 0 ds.PresentationLUTSequence = [Dataset()] seq = ds.PresentationLUTSequence # 256 entries, 10 bit output seq[0].LUTDescriptor = [256, 0, 10] seq[0].LUTData = [int(round(x * (2**10 - 1) / 255, 0)) for x in range(0, 256)] seq[0]["LUTData"].VR = "US" arr = ds.pixel_array assert (arr.min(), arr.max()) == (0, 255) coords = [(335, 130), (285, 130), (235, 130), (185, 130), (185, 180)] coords.extend( [(185, 230), (185, 330), (185, 380), (235, 380), (285, 380), (335, 380)] ) results = [0, 25, 51, 76, 102, 127, 153, 178, 204, 229, 255] for (y, x), result in zip(coords, results): assert arr[y, x] == result out = apply_presentation_lut(arr, ds) assert out.dtype == "uint16" assert (out.min(), out.max()) == (0, 1023) results = [0, 100, 205, 305, 409, 509, 614, 714, 818, 919, 1023] for (y, x), result in zip(coords, results): assert out[y, x] == result # Reversed output seq[0].LUTData.reverse() out = apply_presentation_lut(arr, ds) assert out.dtype == "uint16" assert (out.min(), out.max()) == (0, 1023) results = [1023, 923, 818, 718, 614, 514, 409, 309, 205, 104, 0] for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 16-bit output seq[0].LUTDescriptor = [4096, 0, 16] seq[0].LUTData = [int(round(x * (2**16 - 1) / 4095, 0)) for x in range(0, 4096)] out = apply_presentation_lut(arr, ds) assert out.dtype == "uint16" assert (out.min(), out.max()) == (0, 65535) results = [ 0, 6417, 13107, 19524, 26214, 32631, 39321, 45738, 52428, 58845, 65535, ] for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 8-bit output seq[0].LUTDescriptor = [4096, 0, 8] seq[0].LUTData = [int(round(x * (2**8 - 1) / 4095, 0)) for x in range(0, 4096)] out = apply_presentation_lut(arr, ds) results = [0, 25, 51, 76, 102, 127, 153, 178, 204, 229, 255] for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 8-bit output, LUTData as 8-bit bytes seq[0].LUTDescriptor = [4096, 0, 8] seq[0]["LUTData"].VR = "OW" seq[0].LUTData = b"".join( x.to_bytes(length=1, byteorder="little") for x in seq[0].LUTData ) out = apply_presentation_lut(arr, ds) for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 8-bit output, LUTData as 16-bit bytes seq[0].LUTDescriptor = [4096, 0, 16] seq[0]["LUTData"].VR = "OW" data = [int(round(x * (2**16 - 1) / 4095, 0)) for x in range(0, 4096)] seq[0].LUTData = b"".join( x.to_bytes(length=2, byteorder="little") for x in data ) out = apply_presentation_lut(arr, ds) results = [ 0, 6417, 13107, 19524, 26214, 32631, 39321, 45738, 52428, 58845, 65535, ] for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 8-bit output, LUTData ambiguous seq[0]["LUTData"].VR = "US or OW" out = apply_presentation_lut(arr, ds) for (y, x), result in zip(coords, results): assert out[y, x] == result def test_sequence_12bit_signed(self): """Test Presentation LUT Sequence with 12-bit signed input.""" ds = dcmread(MOD_16_SEQ) assert ds.BitsStored == 12 assert ds.PixelRepresentation == 1 ds.PresentationLUTSequence = [Dataset()] seq = ds.PresentationLUTSequence # 256 entries, 10 bit output seq[0].LUTDescriptor = [256, 0, 10] seq[0].LUTData = [int(round(x * (2**10 - 1) / 255, 0)) for x in range(0, 256)] seq[0]["LUTData"].VR = "US" arr = ds.pixel_array assert (arr.min(), arr.max()) == (-2048, 2047) coords = [(335, 130), (285, 130), (235, 130), (185, 130), (185, 180)] coords.extend( [(185, 230), (185, 330), (185, 380), (235, 380), (285, 380), (335, 380)] ) results = [-2048, -1639, -1229, -820, -410, -1, 409, 818, 1228, 1637, 2047] for (y, x), result in zip(coords, results): assert arr[y, x] == result out = apply_presentation_lut(arr, ds) assert out.dtype == "uint16" assert (out.min(), out.max()) == (0, 1023) results = [0, 100, 205, 305, 409, 509, 614, 714, 818, 919, 1023] for (y, x), result in zip(coords, results): assert out[y, x] == result # Reversed output seq[0].LUTData.reverse() out = apply_presentation_lut(arr, ds) assert out.dtype == "uint16" assert (out.min(), out.max()) == (0, 1023) results = [1023, 923, 818, 718, 614, 514, 409, 309, 205, 104, 0] for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 16-bit output seq[0].LUTDescriptor = [4096, 0, 16] seq[0].LUTData = [int(round(x * (2**16 - 1) / 4095, 0)) for x in range(0, 4096)] out = apply_presentation_lut(arr, ds) assert out.dtype == "uint16" assert (out.min(), out.max()) == (0, 65535) results = [ 0, 6545, 13107, 19652, 26214, 32759, 39321, 45866, 52428, 58973, 65535, ] for (y, x), result in zip(coords, results): assert out[y, x] == result # 4096 entries, 8-bit output seq[0].LUTDescriptor = [4096, 0, 8] seq[0].LUTData = [int(round(x * (2**8 - 1) / 4095, 0)) for x in range(0, 4096)] out = apply_presentation_lut(arr, ds) results = [0, 25, 51, 76, 102, 127, 153, 178, 204, 229, 255] for (y, x), result in zip(coords, results): assert out[y, x] == result def test_sequence_bit_shift(self): """Test bit shifting read-only LUTData""" ds = dcmread(MOD_16_SEQ) assert ds.BitsStored == 12 assert ds.PixelRepresentation == 1 ds.PresentationLUTSequence = [Dataset()] seq = ds.PresentationLUTSequence # 256 entries, 10 bit output seq[0].LUTDescriptor = [256, 0, 10] seq[0].LUTData = [int(round(x * (2**10 - 1) / 255, 0)) for x in range(0, 256)] seq[0].LUTData = b"".join( x.to_bytes(length=2, byteorder="little") for x in seq[0].LUTData ) seq[0]["LUTData"].VR = "OW" out = apply_presentation_lut(ds.pixel_array, ds) results = [0, 100, 205, 305, 409, 509, 614, 714, 818, 919, 1023] coords = [(335, 130), (285, 130), (235, 130), (185, 130), (185, 180)] coords.extend( [(185, 230), (185, 330), (185, 380), (235, 380), (285, 380), (335, 380)] ) for (y, x), result in zip(coords, results): assert out[y, x] == result @pytest.mark.skipif(not TEST_CMS, reason="Numpy or PIL are not available") class TestApplyICCProfile: """Tests for apply_icc_profile()""" def setup_method(self): with open(ICC_PROFILE, "rb") as f: self.profile = f.read() def test_invalid_args_raises(self): """Test exception raised if invalid args passed.""" arr = np.empty((3, 3), dtype="u1") msg = "Either 'ds' or 'transform' must be supplied" with pytest.raises(ValueError, match=msg): apply_icc_profile(arr) msg = "Only one of 'ds' and 'transform' should be used, not both" with pytest.raises(ValueError, match=msg): apply_icc_profile(arr, ds="foo", transform="bar") def test_invalid_arr_raises(self): """Test exception raised if invalid ndarray passed.""" arr = np.empty((3, 3), dtype="u1") msg = "The ndarray must have 3 or 4 dimensions, not 2" with pytest.raises(ValueError, match=msg): apply_icc_profile(arr, Dataset()) arr = np.empty((3, 3, 2), dtype="u1") msg = ( r"Invalid ndarray shape, must be \(rows, columns, 3\) or \(frames, rows, " r"columns, 3\), not \(3, 3, 2\)" ) with pytest.raises(ValueError, match=msg): apply_icc_profile(arr, Dataset()) def test_invalid_intent_raises(self): """Test an invalid intent raises an exception.""" ds = Dataset() ds.ICCProfile = self.profile msg = "Invalid 'intent' value '-1', must be 0, 1, 2 or 3" with pytest.raises(ValueError, match=msg): apply_icc_profile(np.empty((3, 3, 3)), ds, intent=-1) def test_invalid_color_space_raises(self): """Test an invalid color_space raises an exception.""" ds = Dataset() ds.ICCProfile = b"\x00\x01" ds.ColorSpace = "ROMMRGB" arr = np.empty((3, 3, 3)) msg = ( r"The \(0028,2002\) 'Color Space' value 'ROMMRGB' is not supported by " "Pillow, please use the 'color_space' argument to specify a " "supported value" ) with pytest.raises(ValueError, match=msg): apply_icc_profile(arr, ds) msg = ( "Unsupported 'color_space' value 'ADOBERGB', must be 'sRGB', 'LAB' or " "'XYZ'" ) with pytest.raises(ValueError, match=msg): apply_icc_profile(arr, ds, color_space="ADOBERGB") def test_ds_profile(self): """Test applying the profile in a dataset""" # Single frame ds = dcmread(RGB_8_3_1F) ds.ICCProfile = self.profile arr = ds.pixel_array out = apply_icc_profile(arr.copy(), ds=ds) assert not np.array_equal(arr, out) # Multiframe ds = dcmread(RGB_8_3_2F) ds.ICCProfile = self.profile arr = ds.pixel_array out = apply_icc_profile(arr.copy(), ds) assert not np.array_equal(arr, out) def test_transform(self): """Test applying the profile in a dataset""" # Single frame transform = create_icc_transform(icc_profile=self.profile) ds = dcmread(RGB_8_3_1F) arr = ds.pixel_array arr_copy = arr.copy() out = apply_icc_profile(arr_copy, transform=transform) assert not np.array_equal(arr, out) # In-place update assert out is arr_copy # Multiframe ds = dcmread(RGB_8_3_2F) arr = ds.pixel_array arr_copy = arr.copy() out = apply_icc_profile(arr_copy, transform=transform) assert not np.array_equal(arr, out) # In-place update assert out is arr_copy @pytest.mark.skipif(not HAVE_NP or HAVE_PIL, reason="Numpy missing PIL not") def test_apply_icc_profile_no_pillow_raises(): """Test exception raised if PIL is missing.""" msg = "Pillow is required to apply an ICC profile to an ndarray" with pytest.raises(ImportError, match=msg): apply_icc_profile(np.empty((3, 3))) @pytest.mark.skipif(not TEST_CMS, reason="Numpy or PIL are not available") class TestCreateICCTransform: """Tests for create_icc_transform()""" def setup_method(self): with open(ICC_PROFILE, "rb") as f: self.profile = f.read() def test_invalid_args_raises(self): """Test exception raised if invalid args passed.""" msg = "Either 'ds' or 'icc_profile' must be supplied" with pytest.raises(ValueError, match=msg): create_icc_transform() msg = "Only one of 'ds' and 'icc_profile' should be used, not both" with pytest.raises(ValueError, match=msg): create_icc_transform(ds="foo", icc_profile="bar") def test_ds_no_profile_raises(self): """Test passing dataset without an ICC Profile raises an exception.""" msg = r"No \(0028,2000\) 'ICC Profile' element was found in 'ds'" with pytest.raises(ValueError, match=msg): create_icc_transform(ds=Dataset()) def test_invalid_intent_raises(self): """Test an invalid intent raises an exception.""" ds = Dataset() ds.ICCProfile = self.profile msg = "Invalid 'intent' value '-1', must be 0, 1, 2 or 3" with pytest.raises(ValueError, match=msg): create_icc_transform(ds, intent=-1) def test_invalid_color_space_raises(self): """Test an invalid color_space raises an exception.""" ds = Dataset() ds.ICCProfile = self.profile ds.ColorSpace = "ROMMRGB" msg = ( r"The \(0028,2002\) 'Color Space' value 'ROMMRGB' is not supported by " "Pillow, please use the 'color_space' argument to specify a " "supported value" ) with pytest.raises(ValueError, match=msg): create_icc_transform(ds) msg = ( "Unsupported 'color_space' value 'ADOBERGB', must be 'sRGB', 'LAB' or " "'XYZ'" ) with pytest.raises(ValueError, match=msg): create_icc_transform(ds, color_space="ADOBERGB") def test_transform(self): """Test creating transforms""" transform = create_icc_transform(icc_profile=self.profile) assert isinstance(transform, PIL.ImageCms.ImageCmsTransform) p = transform.output_profile assert "sRGB" in p.profile.profile_description ds = Dataset() ds.ICCProfile = self.profile transform = create_icc_transform(ds) p = transform.output_profile assert "sRGB" in p.profile.profile_description @pytest.mark.skipif(TEST_CMS, reason="Numpy or PIL are available") def test_create_icc_transform_no_pillow_raises(): """Test exception raised if PIL is missing.""" msg = "Pillow is required to create a color transformation object" with pytest.raises(ImportError, match=msg): create_icc_transform() pydicom-pydicom-20aa4b7/tests/pixels/test_utils.py000066400000000000000000002520361515706620200224550ustar00rootroot00000000000000# Copyright 2008-2024 pydicom authors. See LICENSE file for details. """Tests for the pixels.utils module.""" import importlib from io import BytesIO import logging import os import random from struct import pack from sys import byteorder import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import dcmread, config from pydicom.dataset import Dataset, FileMetaDataset from pydicom.encaps import get_frame, encapsulate from pydicom.pixels import pixel_array, iter_pixels, convert_color_space from pydicom.pixels.decoders.base import _PIXEL_DATA_DECODERS from pydicom.pixels.encoders import RLELosslessEncoder from pydicom.pixels.utils import ( as_pixel_options, _passes_version_check, _get_jpg_parameters, reshape_pixel_array, pixel_dtype, get_expected_length, get_j2k_parameters, get_nr_frames, pack_bits, set_pixel_data, unpack_bits, expand_ybr422, compress, decompress, ) from pydicom.uid import ( EnhancedMRImageStorage, ExplicitVRLittleEndian, ExplicitVRBigEndian, ImplicitVRLittleEndian, UncompressedTransferSyntaxes, RLELossless, JPEG2000Lossless, JPEG2000, JPEG2000MC, JPEGLSNearLossless, JPEGLSLossless, UID, MPEG2MPHLF, ) from .pixels_reference import ( PIXEL_REFERENCE, RLE_8_3_1F, RLE_16_1_1F, RLE_16_1_10F, RLE_32_3_2F, EXPL_16_1_10F, EXPL_16_16_1F, EXPL_8_3_1F_ODD, EXPL_8_3_1F_YBR422, IMPL_16_1_1F, JPGB_08_08_3_0_1F_RGB_NO_APP14, JPGB_08_08_3_0_1F_RGB_APP14, JPGB_08_08_3_0_1F_RGB, JPGB_08_08_3_1F_YBR_FULL, JLSL_08_08_3_0_1F_ILV0, JLSL_08_08_3_0_1F_ILV1, JLSL_08_08_3_0_1F_ILV2, JLSN_08_01_1_0_1F, J2KR_08_08_3_0_1F_YBR_RCT, EXPL_1_1_3F, EXPL_1_1_3F_NONALIGNED, ) from ..test_helpers import assert_no_warning HAVE_PYLJ = bool(importlib.util.find_spec("pylibjpeg")) HAVE_RLE = bool(importlib.util.find_spec("rle")) HAVE_JLS = bool(importlib.util.find_spec("jpeg_ls")) HAVE_LJ = bool(importlib.util.find_spec("libjpeg")) HAVE_OJ = bool(importlib.util.find_spec("openjpeg")) SKIP_RLE = not (HAVE_NP and HAVE_PYLJ and HAVE_RLE) SKIP_JPG = not (HAVE_NP and HAVE_PYLJ and HAVE_LJ) SKIP_JLS = not (HAVE_NP and HAVE_JLS) SKIP_J2K = not (HAVE_NP and HAVE_PYLJ and HAVE_OJ) @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestPixelArray: """Tests for pixel_array()""" def test_src(self): """Test the supported `src` types.""" # Explicit VR # str p = EXPL_16_1_10F.path arr = pixel_array(os.fspath(p)) EXPL_16_1_10F.test(arr) # Path arr = pixel_array(p) EXPL_16_1_10F.test(arr) # BinaryIO (io.BufferedReader) with open(p, "rb") as f: arr = pixel_array(f) EXPL_16_1_10F.test(arr) assert not f.closed # Implicit VR arr = pixel_array(IMPL_16_1_1F.path) IMPL_16_1_1F.test(arr) def test_ds_out(self): """Test the `ds_out` kwarg works as intended""" p = EXPL_16_1_10F.path ds = Dataset() arr = pixel_array(os.fspath(p), ds_out=ds) EXPL_16_1_10F.test(arr) assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 0 assert ds.file_meta.SourceApplicationEntityTitle == "gdcmanon" def test_specific_tags(self): """Test the `specific_tags` kwarg works as intended""" p = EXPL_16_1_10F.path ds = Dataset() tags = [0x00100010, 0x00080016] arr = pixel_array(os.fspath(p), ds_out=ds) EXPL_16_1_10F.test(arr) assert "PatientName" not in ds assert "SOPClassUID" not in ds arr = pixel_array(os.fspath(p), ds_out=ds, specific_tags=tags) EXPL_16_1_10F.test(arr) assert "PatientName" in ds assert ds.SOPClassUID == EnhancedMRImageStorage def test_index(self): """Test the `index` kwarg.""" for index in (0, 4, 9): arr = pixel_array(EXPL_16_1_10F.path, index=index) assert arr.shape == (64, 64) EXPL_16_1_10F.test(arr, index=index) def test_raw(self): """Test the `raw` kwarg.""" rgb = pixel_array(EXPL_8_3_1F_YBR422.path, raw=False) ybr = pixel_array(EXPL_8_3_1F_YBR422.path, raw=True) assert np.array_equal( convert_color_space(ybr, "YBR_FULL", "RGB"), rgb, ) @pytest.mark.skipif(SKIP_RLE, reason="pylibjpeg-rle not available") def test_decoding_plugin(self): """Test the `decoding_plugin` kwarg.""" arr1 = pixel_array(RLE_16_1_10F.path, decoding_plugin="pydicom") arr2 = pixel_array(RLE_16_1_10F.path, decoding_plugin="pylibjpeg") assert np.array_equal(arr1, arr2) def test_missing_file_meta(self): """Test a dataset with no file meta.""" ds = dcmread(EXPL_16_1_10F.path) b = BytesIO() del ds.file_meta ds.save_as(b) b.seek(0) msg = ( "'transfer_syntax_uid' is required if the dataset in 'src' is not " "in the DICOM File Format" ) with pytest.raises(AttributeError, match=msg): pixel_array(b) arr = pixel_array(b, transfer_syntax_uid=ExplicitVRLittleEndian) EXPL_16_1_10F.test(arr) def test_missing_required_element(self): """Test a dataset missing required elements.""" ds = dcmread(EXPL_8_3_1F_YBR422.path) b = BytesIO() del ds.Columns del ds.Rows del ds.BitsAllocated del ds.BitsStored del ds.PhotometricInterpretation del ds.SamplesPerPixel del ds.PlanarConfiguration del ds.PixelRepresentation ds.save_as(b) b.seek(0) msg = r"Missing required element: \(0028,0100\) 'Bits Allocated'" with pytest.raises(AttributeError, match=msg): pixel_array(b) msg = r"Missing required element: \(0028,0101\) 'Bits Stored'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) msg = r"Missing required element: \(0028,0011\) 'Columns'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, "bits_stored": EXPL_8_3_1F_YBR422.ds.BitsStored, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) msg = r"Missing required element: \(0028,0004\) 'Photometric Interpretation'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, "bits_stored": EXPL_8_3_1F_YBR422.ds.BitsStored, "columns": EXPL_8_3_1F_YBR422.ds.Columns, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) msg = r"Missing required element: \(0028,0103\) 'Pixel Representation'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, "bits_stored": EXPL_8_3_1F_YBR422.ds.BitsStored, "columns": EXPL_8_3_1F_YBR422.ds.Columns, "photometric_interpretation": EXPL_8_3_1F_YBR422.ds.PhotometricInterpretation, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) msg = r"Missing required element: \(0028,0010\) 'Rows'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, "bits_stored": EXPL_8_3_1F_YBR422.ds.BitsStored, "columns": EXPL_8_3_1F_YBR422.ds.Columns, "photometric_interpretation": EXPL_8_3_1F_YBR422.ds.PhotometricInterpretation, "pixel_representation": EXPL_8_3_1F_YBR422.ds.PixelRepresentation, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) msg = r"Missing required element: \(0028,0002\) 'Samples per Pixel'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, "bits_stored": EXPL_8_3_1F_YBR422.ds.BitsStored, "columns": EXPL_8_3_1F_YBR422.ds.Columns, "photometric_interpretation": EXPL_8_3_1F_YBR422.ds.PhotometricInterpretation, "pixel_representation": EXPL_8_3_1F_YBR422.ds.PixelRepresentation, "rows": EXPL_8_3_1F_YBR422.ds.Rows, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) msg = r"Missing required element: \(0028,0006\) 'Planar Configuration'" opts = { "bits_allocated": EXPL_8_3_1F_YBR422.ds.BitsAllocated, "bits_stored": EXPL_8_3_1F_YBR422.ds.BitsStored, "columns": EXPL_8_3_1F_YBR422.ds.Columns, "rows": EXPL_8_3_1F_YBR422.ds.Rows, "photometric_interpretation": EXPL_8_3_1F_YBR422.ds.PhotometricInterpretation, "samples_per_pixel": EXPL_8_3_1F_YBR422.ds.SamplesPerPixel, "pixel_representation": EXPL_8_3_1F_YBR422.ds.PixelRepresentation, } with pytest.raises(AttributeError, match=msg): pixel_array(b, **opts) def test_missing_pixel_data(self): """Test dataset missing Pixel Data""" ds = dcmread(EXPL_8_3_1F_YBR422.path) b = BytesIO() del ds.PixelData ds.save_as(b) b.seek(0) msg = ( "The dataset in 'src' has no 'Pixel Data', 'Float Pixel Data' or " "'Double Float Pixel Data' element, no pixel data to decode" ) with pytest.raises(AttributeError, match=msg): pixel_array(b) def test_extended_offsets(self): """Test that the extended offset table values are retrieved OK""" ds = EXPL_8_3_1F_YBR422.ds offsets = ( b"\x00\x00\x00\x00\x00\x00\x00\x01", b"\x00\x00\x00\x00\x00\x00\x00\x02", ) ds.ExtendedOffsetTable = offsets[0] ds.ExtendedOffsetTableLengths = offsets[1] opts = as_pixel_options(ds) assert opts["extended_offsets"] == offsets offsets = ( b"\x00\x00\x00\x00\x00\x00\x00\x03", b"\x00\x00\x00\x00\x00\x00\x00\x04", ) opts = as_pixel_options(ds, **{"extended_offsets": offsets}) assert opts["extended_offsets"] == offsets def test_dataset(self): """Test passing a dataset""" ds = EXPL_16_1_10F.ds arr = pixel_array(ds) EXPL_16_1_10F.test(arr) def test_dataset_unknown_tsyntax_raises(self): """Test no transfer syntax raises exception""" ds = dcmread(EXPL_16_1_10F.path) del ds.file_meta.TransferSyntaxUID msg = ( "Unable to decode the pixel data as the dataset's 'file_meta' has no " r"\(0002,0010\) 'Transfer Syntax UID' element" ) with pytest.raises(AttributeError, match=msg): pixel_array(ds) def test_no_matching_decoder_raises(self): """Test no matching decoding plugin raises exception.""" ds = dcmread(EXPL_16_1_10F.path) ds.file_meta.TransferSyntaxUID = MPEG2MPHLF msg = ( r"Unable to decode the pixel data as a \(0002,0010\) 'Transfer Syntax " "UID' value of 'Fragmentable MPEG2 Main Profile / High Level' is not " "supported" ) with pytest.raises(NotImplementedError, match=msg): pixel_array(ds) ds.PixelData = encapsulate([ds.PixelData]) b = BytesIO() ds.save_as(b) b.seek(0) with pytest.raises(NotImplementedError, match=msg): pixel_array(b) @pytest.mark.skipif(not HAVE_NP, reason="NumPy is not available") class TestIterPixels: """Tests for iter_pixels()""" def test_src(self): """Test the supported `src` types.""" # Explicit VR # str p = EXPL_16_1_10F.path for index, frame in enumerate(iter_pixels(os.fspath(p))): EXPL_16_1_10F.test(frame, index=index) # Path for index, frame in enumerate(iter_pixels(p)): EXPL_16_1_10F.test(frame, index=index) # BinaryIO (io.BufferedReader) with open(p, "rb") as f: for index, frame in enumerate(iter_pixels(f)): EXPL_16_1_10F.test(frame, index=index) assert not f.closed # Implicit VR for index, frame in enumerate(iter_pixels(IMPL_16_1_1F.path)): IMPL_16_1_1F.test(frame, index=index) def test_ds_out(self): """Test the `ds_out` kwarg works as intended""" p = EXPL_16_1_10F.path ds = Dataset() frame_gen = iter_pixels(p, ds_out=ds) frame = next(frame_gen) assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 0 assert ds.file_meta.SourceApplicationEntityTitle == "gdcmanon" EXPL_16_1_10F.test(frame, index=0) for index, frame in enumerate(frame_gen): EXPL_16_1_10F.test(frame, index=index + 1) def test_specific_tags(self): """Test the `specific_tags` kwarg works as intended""" p = EXPL_16_1_10F.path ds = Dataset() tags = [0x00100010, 0x00080016] frame_gen = iter_pixels(p, ds_out=ds) frame = next(frame_gen) assert "PatientName" not in ds assert "SOPClassUID" not in ds assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 0 assert ds.file_meta.SourceApplicationEntityTitle == "gdcmanon" EXPL_16_1_10F.test(frame, index=0) for index, frame in enumerate(frame_gen): EXPL_16_1_10F.test(frame, index=index + 1) frame_gen = iter_pixels(p, ds_out=ds, specific_tags=tags) frame = next(frame_gen) assert "PatientName" in ds assert ds.SOPClassUID == EnhancedMRImageStorage EXPL_16_1_10F.test(frame, index=0) for index, frame in enumerate(frame_gen): EXPL_16_1_10F.test(frame, index=index + 1) def test_indices(self): """Test the `indices` kwarg.""" p = EXPL_16_1_10F.path indices = [0, 4, 9] frame_gen = iter_pixels(p, indices=indices) count = 0 for frame in frame_gen: EXPL_16_1_10F.test(frame, index=indices[count]) count += 1 assert count == 3 def test_raw(self): """Test the `raw` kwarg.""" processed = iter_pixels(EXPL_8_3_1F_YBR422.path, raw=False) raw = iter_pixels(EXPL_8_3_1F_YBR422.path, raw=True) for rgb, ybr in zip(processed, raw): assert np.array_equal( convert_color_space(ybr, "YBR_FULL", "RGB"), rgb, ) @pytest.mark.skipif(SKIP_RLE, reason="pylibjpeg-rle not available") def test_decoding_plugin(self): """Test the `decoding_plugin` kwarg.""" pydicom_gen = iter_pixels(RLE_16_1_10F.path, decoding_plugin="pydicom") pylibjpeg_gen = iter_pixels(RLE_16_1_10F.path, decoding_plugin="pylibjpeg") for frame1, frame2 in zip(pydicom_gen, pylibjpeg_gen): assert np.array_equal(frame1, frame2) def test_dataset(self): """Test passing a dataset""" ds = EXPL_16_1_10F.ds for idx, arr in enumerate(iter_pixels(ds)): EXPL_16_1_10F.test(arr, index=idx) def test_dataset_unknown_tsyntax_raises(self): """Test no transfer syntax raises exception""" ds = dcmread(EXPL_16_1_10F.path) del ds.file_meta.TransferSyntaxUID msg = ( "Unable to decode the pixel data as the dataset's 'file_meta' has no " r"\(0002,0010\) 'Transfer Syntax UID' element" ) with pytest.raises(AttributeError, match=msg): next(iter_pixels(ds)) def test_no_matching_decoder_raises(self): """Test no matching decoding plugin raises exception.""" ds = dcmread(EXPL_16_1_10F.path) ds.file_meta.TransferSyntaxUID = MPEG2MPHLF msg = ( r"Unable to decode the pixel data as a \(0002,0010\) 'Transfer Syntax " "UID' value of 'Fragmentable MPEG2 Main Profile / High Level' is not " "supported" ) with pytest.raises(NotImplementedError, match=msg): next(iter_pixels(ds)) ds.PixelData = encapsulate([ds.PixelData]) b = BytesIO() ds.save_as(b) b.seek(0) with pytest.raises(NotImplementedError, match=msg): next(iter_pixels(b)) def test_version_check_debugging(caplog): """Test _passes_version_check() when the package is absent and debugging on""" with caplog.at_level(logging.DEBUG, logger="pydicom"): assert _passes_version_check("foo", (3, 0)) is False assert "No module named 'foo'" in caplog.text class TestGetJpgParameters: """Tests for _get_jpg_parameters()""" def test_jpg_no_app(self): """Test parsing a JPEG codestream with no APP markers.""" data = get_frame(JPGB_08_08_3_0_1F_RGB_NO_APP14.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 256 assert info["width"] == 256 assert info["components"] == 3 assert info["component_ids"] == [0, 1, 2] assert "app" not in info assert "lossy_error" not in info assert "interleave_mode" not in info def test_jpg_app(self): """Test parsing a JPEG codestream with APP markers.""" data = get_frame(JPGB_08_08_3_0_1F_RGB_APP14.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 256 assert info["width"] == 256 assert info["components"] == 3 assert info["component_ids"] == [0, 1, 2] assert info["app"][b"\xFF\xEE"] == ( b"\x41\x64\x6F\x62\x65\x00\x65\x00\x00\x00\x00\x00" ) assert "lossy_error" not in info assert "interleave_mode" not in info def test_jpg_component_ids(self): """Test parsing a JPEG codestream with ASCII component IDs.""" data = get_frame(JPGB_08_08_3_0_1F_RGB.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 100 assert info["width"] == 100 assert info["components"] == 3 assert info["component_ids"] == [82, 71, 66] # R, G, B assert isinstance(info["app"][b"\xFF\xEE"], bytes) assert "lossy_error" not in info assert "interleave_mode" not in info def test_jls_ilv0(self): """Test parsing a lossless JPEG-LS codestream with ILV 0.""" data = get_frame(JLSL_08_08_3_0_1F_ILV0.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 256 assert info["width"] == 256 assert info["components"] == 3 assert info["component_ids"] == [1, 2, 3] assert "app" not in info assert info["lossy_error"] == 0 assert info["interleave_mode"] == 0 def test_jls_ilv1(self): """Test parsing a lossless JPEG-LS codestream with ILV 1.""" data = get_frame(JLSL_08_08_3_0_1F_ILV1.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 256 assert info["width"] == 256 assert info["components"] == 3 assert info["component_ids"] == [1, 2, 3] assert "app" not in info assert info["lossy_error"] == 0 assert info["interleave_mode"] == 1 def test_jls_ilv2(self): """Test parsing a lossless JPEG-LS codestream with ILV 2.""" data = get_frame(JLSL_08_08_3_0_1F_ILV2.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 256 assert info["width"] == 256 assert info["components"] == 3 assert info["component_ids"] == [1, 2, 3] assert "app" not in info assert info["lossy_error"] == 0 assert info["interleave_mode"] == 2 def test_jls_lossy(self): """Test parsing a lossy JPEG-LS codestream.""" data = get_frame(JLSN_08_01_1_0_1F.ds.PixelData, 0) info = _get_jpg_parameters(data) assert info["precision"] == 8 assert info["height"] == 45 assert info["width"] == 10 assert info["components"] == 1 assert info["component_ids"] == [1] assert "app" not in info assert info["lossy_error"] == 2 assert info["interleave_mode"] == 0 def test_invalid(self): """Test invalid codestreams.""" assert _get_jpg_parameters(b"\x00\x00") == {} data = get_frame(JLSN_08_01_1_0_1F.ds.PixelData, 0) assert _get_jpg_parameters(data[:20]) == {} REFERENCE_DTYPE = [ # BitsAllocated, PixelRepresentation, as_float, numpy dtype string (1, 0, False, "uint8"), (1, 1, False, "uint8"), (8, 0, False, "uint8"), (8, 1, False, "int8"), (16, 0, False, "uint16"), (16, 1, False, "int16"), (32, 0, False, "uint32"), (32, 1, False, "int32"), (32, 0, True, "float32"), (64, 0, True, "float64"), ] @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_pixel_dtype_raises(): """Test that pixel_dtype raises exception without numpy.""" with pytest.raises(ImportError, match="Numpy is required to determine the dtype"): pixel_dtype(None) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestPixelDtype: """Tests for pixel_dtype().""" def setup_method(self): """Setup the test dataset.""" self.ds = Dataset() self.ds.file_meta = FileMetaDataset() self.ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian def test_unknown_pixel_representation_raises(self): """Test an unknown PixelRepresentation value raises exception.""" self.ds.BitsAllocated = 16 with pytest.warns(UserWarning): self.ds.PixelRepresentation = -1 # The bracket needs to be escaped with pytest.raises(ValueError, match=r"value of '-1' for '\(0028,0103"): pixel_dtype(self.ds) self.ds.PixelRepresentation = 2 with pytest.raises(ValueError, match=r"value of '2' for '\(0028,0103"): pixel_dtype(self.ds) def test_unknown_bits_allocated_raises(self): """Test an unknown BitsAllocated value raises exception.""" self.ds.BitsAllocated = 0 self.ds.PixelRepresentation = 0 # The bracket needs to be escaped with pytest.raises(ValueError, match=r"value of '0' for '\(0028,0100"): pixel_dtype(self.ds) self.ds.BitsAllocated = 2 with pytest.raises(ValueError, match=r"value of '2' for '\(0028,0100"): pixel_dtype(self.ds) self.ds.BitsAllocated = 15 with pytest.raises(ValueError, match=r"value of '15' for '\(0028,0100"): pixel_dtype(self.ds) def test_unsupported_dtypes(self): """Test unsupported dtypes raise exception.""" self.ds.BitsAllocated = 24 self.ds.PixelRepresentation = 0 with pytest.raises( NotImplementedError, match="data type 'uint24' needed to contain" ): pixel_dtype(self.ds) @pytest.mark.parametrize("bits, pixel_repr, as_float, dtype", REFERENCE_DTYPE) def test_supported_dtypes(self, bits, pixel_repr, as_float, dtype): """Test supported dtypes.""" self.ds.BitsAllocated = bits self.ds.PixelRepresentation = pixel_repr # Correct for endianness of system ref_dtype = np.dtype(dtype) endianness = self.ds.file_meta.TransferSyntaxUID.is_little_endian if endianness != (byteorder == "little"): ref_dtype = ref_dtype.newbyteorder("S") assert ref_dtype == pixel_dtype(self.ds, as_float=as_float) def test_byte_swapping(self): """Test that the endianness of the system is taken into account.""" # The main problem is that our testing environments are probably # all little endian, but we'll try our best self.ds.BitsAllocated = 16 self.ds.PixelRepresentation = 0 # explicit little meta = self.ds.file_meta # < is little, = is native, > is big if byteorder == "little": self.ds._read_little = True assert pixel_dtype(self.ds).byteorder in ["<", "="] meta.TransferSyntaxUID = ExplicitVRBigEndian self.ds._read_little = False assert pixel_dtype(self.ds).byteorder == ">" elif byteorder == "big": self.ds._read_little = True assert pixel_dtype(self.ds).byteorder == "<" meta.TransferSyntaxUID = ExplicitVRBigEndian self.ds._read_little = False assert pixel_dtype(self.ds).byteorder in [">", "="] def test_no_endianness_raises(self): ds = Dataset() ds.BitsAllocated = 8 ds.PixelRepresentation = 1 msg = ( "Unable to determine the endianness of the dataset, please set " "an appropriate Transfer Syntax UID in 'Dataset.file_meta'" ) with pytest.raises(AttributeError, match=msg): pixel_dtype(ds) if HAVE_NP: _arr1_1 = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8] _arr2_1 = _arr1_1[:] _arr2_1.extend( [25, 26, 27, 28, 29, 26, 27, 28, 29, 30, 27, 28, 29, 30, 31, 28, 29, 30, 31, 32] ) _arr1_3_0 = [1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5, 13, 21, 2, 10, 18, 3, 11] _arr1_3_0.extend( [19, 4, 12, 20, 5, 13, 21, 6, 14, 22, 3, 11, 19, 4, 12, 20, 5, 13, 21, 6] ) _arr1_3_0.extend( [14, 22, 7, 15, 23, 4, 12, 20, 5, 13, 21, 6, 14, 22, 7, 15, 23, 8, 16, 24] ) _arr1_3_1 = _arr1_1[:] _arr1_3_1.extend( [9, 10, 11, 12, 13, 10, 11, 12, 13, 14, 11, 12, 13, 14, 15, 12, 13, 14, 15, 16] ) _arr1_3_1.extend( [17, 18, 19, 20, 21, 18, 19, 20, 21, 22, 19, 20, 21, 22, 23, 20, 21, 22, 23, 24] ) _arr2_3_0 = _arr1_3_0[:] _arr2_3_0.extend( [25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 36, 44, 29, 37, 45, 26, 34, 42, 27, 35] ) _arr2_3_0.extend( [43, 28, 36, 44, 29, 37, 45, 30, 38, 46, 27, 35, 43, 28, 36, 44, 29, 37, 45, 30] ) _arr2_3_0.extend( [38, 46, 31, 39, 47, 28, 36, 44, 29, 37, 45, 30, 38, 46, 31, 39, 47, 32, 40, 48] ) _arr2_3_1 = _arr1_3_1[:] _arr2_3_1.extend( [25, 26, 27, 28, 29, 26, 27, 28, 29, 30, 27, 28, 29, 30, 31, 28, 29, 30, 31, 32] ) _arr2_3_1.extend( [33, 34, 35, 36, 37, 34, 35, 36, 37, 38, 35, 36, 37, 38, 39, 36, 37, 38, 39, 40] ) _arr2_3_1.extend( [41, 42, 43, 44, 45, 42, 43, 44, 45, 46, 43, 44, 45, 46, 47, 44, 45, 46, 47, 48] ) RESHAPE_ARRAYS = { "reference": np.asarray( [ [ # Frame 1 [[1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21]], [[2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14, 22]], [[3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14, 22], [7, 15, 23]], [[4, 12, 20], [5, 13, 21], [6, 14, 22], [7, 15, 23], [8, 16, 24]], ], [ # Frame 2 [ [25, 33, 41], [26, 34, 42], [27, 35, 43], [28, 36, 44], [29, 37, 45], ], [ [26, 34, 42], [27, 35, 43], [28, 36, 44], [29, 37, 45], [30, 38, 46], ], [ [27, 35, 43], [28, 36, 44], [29, 37, 45], [30, 38, 46], [31, 39, 47], ], [ [28, 36, 44], [29, 37, 45], [30, 38, 46], [31, 39, 47], [32, 40, 48], ], ], ] ), "1frame_1sample": np.asarray(_arr1_1), "2frame_1sample": np.asarray(_arr2_1), "1frame_3sample_0config": np.asarray(_arr1_3_0), "1frame_3sample_1config": np.asarray(_arr1_3_1), "2frame_3sample_0config": np.asarray(_arr2_3_0), "2frame_3sample_1config": np.asarray(_arr2_3_1), } @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_reshape_pixel_array_raises(): """Test that reshape_pixel_array raises exception without numpy.""" with pytest.raises(ImportError, match="Numpy is required to reshape"): reshape_pixel_array(None, None) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestReshapePixelArray: """Tests for reshape_pixel_array().""" def setup_method(self): """Setup the test dataset.""" self.ds = Dataset() self.ds.file_meta = FileMetaDataset() self.ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian self.ds.Rows = 4 self.ds.Columns = 5 # Expected output ref_#frames_#samples self.ref_1_1 = RESHAPE_ARRAYS["reference"][0, :, :, 0] self.ref_1_3 = RESHAPE_ARRAYS["reference"][0] self.ref_2_1 = RESHAPE_ARRAYS["reference"][:, :, :, 0] self.ref_2_3 = RESHAPE_ARRAYS["reference"] def test_reference_1frame_1sample(self): """Test the 1 frame 1 sample/pixel reference array is as expected.""" # (rows, columns) assert (4, 5) == self.ref_1_1.shape assert np.array_equal( self.ref_1_1, np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) def test_reference_1frame_3sample(self): """Test the 1 frame 3 sample/pixel reference array is as expected.""" # (rows, columns, planes) assert (4, 5, 3) == self.ref_1_3.shape # Red channel assert np.array_equal( self.ref_1_3[:, :, 0], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Green channel assert np.array_equal( self.ref_1_3[:, :, 1], np.asarray( [ [9, 10, 11, 12, 13], [10, 11, 12, 13, 14], [11, 12, 13, 14, 15], [12, 13, 14, 15, 16], ] ), ) # Blue channel assert np.array_equal( self.ref_1_3[:, :, 2], np.asarray( [ [17, 18, 19, 20, 21], [18, 19, 20, 21, 22], [19, 20, 21, 22, 23], [20, 21, 22, 23, 24], ] ), ) def test_reference_2frame_1sample(self): """Test the 2 frame 1 sample/pixel reference array is as expected.""" # (nr frames, rows, columns) assert (2, 4, 5) == self.ref_2_1.shape # Frame 1 assert np.array_equal( self.ref_2_1[0, :, :], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Frame 2 assert np.array_equal( self.ref_2_1[1, :, :], np.asarray( [ [25, 26, 27, 28, 29], [26, 27, 28, 29, 30], [27, 28, 29, 30, 31], [28, 29, 30, 31, 32], ] ), ) def test_reference_2frame_3sample(self): """Test the 2 frame 3 sample/pixel reference array is as expected.""" # (nr frames, row, columns, planes) assert (2, 4, 5, 3) == self.ref_2_3.shape # Red channel, frame 1 assert np.array_equal( self.ref_2_3[0, :, :, 0], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Green channel, frame 2 assert np.array_equal( self.ref_2_3[1, :, :, 1], np.asarray( [ [33, 34, 35, 36, 37], [34, 35, 36, 37, 38], [35, 36, 37, 38, 39], [36, 37, 38, 39, 40], ] ), ) def test_1frame_1sample(self): """Test reshaping 1 frame, 1 sample/pixel.""" self.ds.SamplesPerPixel = 1 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_1sample"]) assert (4, 5) == arr.shape assert np.array_equal(arr, self.ref_1_1) def test_1frame_3sample_0conf(self): """Test reshaping 1 frame, 3 sample/pixel for 0 planar config.""" self.ds.NumberOfFrames = 1 self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 0 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_0config"]) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) def test_1frame_3sample_1conf(self): """Test reshaping 1 frame, 3 sample/pixel for 1 planar config.""" self.ds.NumberOfFrames = 1 self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 1 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_1config"]) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) def test_2frame_1sample(self): """Test reshaping 2 frame, 1 sample/pixel.""" self.ds.NumberOfFrames = 2 self.ds.SamplesPerPixel = 1 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["2frame_1sample"]) assert (2, 4, 5) == arr.shape assert np.array_equal(arr, self.ref_2_1) def test_2frame_3sample_0conf(self): """Test reshaping 2 frame, 3 sample/pixel for 0 planar config.""" self.ds.NumberOfFrames = 2 self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 0 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["2frame_3sample_0config"]) assert (2, 4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_2_3) def test_2frame_3sample_1conf(self): """Test reshaping 2 frame, 3 sample/pixel for 1 planar config.""" self.ds.NumberOfFrames = 2 self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 1 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["2frame_3sample_1config"]) assert (2, 4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_2_3) def test_compressed_syntaxes_0conf(self): """Test the compressed syntaxes that are always 0 planar conf.""" for uid in [ "1.2.840.10008.1.2.4.50", "1.2.840.10008.1.2.4.57", "1.2.840.10008.1.2.4.70", "1.2.840.10008.1.2.4.90", "1.2.840.10008.1.2.4.91", ]: self.ds.file_meta.TransferSyntaxUID = uid self.ds.PlanarConfiguration = 1 self.ds.NumberOfFrames = 1 self.ds.SamplesPerPixel = 3 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_0config"]) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) def test_compressed_syntaxes_1conf(self): """Test the compressed syntaxes that are always 1 planar conf.""" for uid in ["1.2.840.10008.1.2.5"]: self.ds.file_meta.TransferSyntaxUID = uid self.ds.PlanarConfiguration = 0 self.ds.NumberOfFrames = 1 self.ds.SamplesPerPixel = 3 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_1config"]) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) def test_uncompressed_syntaxes(self): """Test that uncompressed syntaxes use the dataset planar conf.""" for uid in UncompressedTransferSyntaxes: self.ds.file_meta.TransferSyntaxUID = uid self.ds.PlanarConfiguration = 0 self.ds.NumberOfFrames = 1 self.ds.SamplesPerPixel = 3 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_0config"]) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) self.ds.PlanarConfiguration = 1 arr = reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_1config"]) assert (4, 5, 3) == arr.shape assert np.array_equal(arr, self.ref_1_3) def test_invalid_nr_frames_warns(self): """Test an invalid Number of Frames value shows an warning.""" self.ds.SamplesPerPixel = 1 self.ds.NumberOfFrames = 0 # Need to escape brackets with pytest.warns(UserWarning, match=r"value of 0 for \(0028,0008\)"): reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_1sample"]) def test_invalid_samples_raises(self): """Test an invalid Samples per Pixel value raises exception.""" self.ds.SamplesPerPixel = 0 # Need to escape brackets with pytest.raises(ValueError, match=r"value of 0 for \(0028,0002\)"): reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_1sample"]) def test_invalid_planar_conf_raises(self): self.ds.SamplesPerPixel = 3 self.ds.PlanarConfiguration = 2 # Need to escape brackets with pytest.raises(ValueError, match=r"value of 2 for \(0028,0006\)"): reshape_pixel_array(self.ds, RESHAPE_ARRAYS["1frame_3sample_0config"]) REFERENCE_LENGTH = [ # (frames, rows, cols, samples), bit depth, # result in (bytes, pixels, ybr_bytes) # YBR can only be 3 samples/px and > 1 bit depth # No 'NumberOfFrames' in dataset ((0, 0, 0, 0), 1, (0, 0, None)), ((0, 1, 1, 1), 1, (1, 1, None)), # 1 bit -> 1 byte ((0, 1, 1, 3), 1, (1, 3, None)), # 3 bits -> 1 byte ((0, 1, 3, 3), 1, (2, 9, None)), # 9 bits -> 2 bytes ((0, 2, 2, 1), 1, (1, 4, None)), # 4 bits -> 1 byte ((0, 2, 4, 1), 1, (1, 8, None)), # 8 bits -> 1 byte ((0, 3, 3, 1), 1, (2, 9, None)), # 9 bits -> 2 bytes ((0, 512, 512, 1), 1, (32768, 262144, None)), # Typical length ((0, 512, 512, 3), 1, (98304, 786432, None)), ((0, 0, 0, 0), 8, (0, 0, None)), ((0, 1, 1, 1), 8, (1, 1, None)), # Odd length ((0, 9, 1, 1), 8, (9, 9, None)), # Odd length ((0, 1, 2, 1), 8, (2, 2, None)), # Even length ((0, 512, 512, 1), 8, (262144, 262144, None)), ((0, 512, 512, 3), 8, (786432, 786432, 524288)), ((0, 0, 0, 0), 16, (0, 0, None)), ((0, 1, 1, 1), 16, (2, 1, None)), # 16 bit data can't be odd length ((0, 1, 2, 1), 16, (4, 2, None)), ((0, 512, 512, 1), 16, (524288, 262144, None)), ((0, 512, 512, 3), 16, (1572864, 786432, 1048576)), ((0, 0, 0, 0), 32, (0, 0, None)), ((0, 1, 1, 1), 32, (4, 1, None)), # 32 bit data can't be odd length ((0, 1, 2, 1), 32, (8, 2, None)), ((0, 512, 512, 1), 32, (1048576, 262144, None)), ((0, 512, 512, 3), 32, (3145728, 786432, 2097152)), # NumberOfFrames odd ((3, 0, 0, 0), 1, (0, 0, None)), ((3, 1, 1, 1), 1, (1, 3, None)), ((3, 1, 1, 3), 1, (2, 9, None)), ((3, 1, 3, 3), 1, (4, 27, None)), ((3, 2, 4, 1), 1, (3, 24, None)), ((3, 2, 2, 1), 1, (2, 12, None)), ((3, 3, 3, 1), 1, (4, 27, None)), ((3, 512, 512, 1), 1, (98304, 786432, None)), ((3, 512, 512, 3), 1, (294912, 2359296, 196608)), ((3, 0, 0, 0), 8, (0, 0, None)), ((3, 1, 1, 1), 8, (3, 3, None)), ((3, 9, 1, 1), 8, (27, 27, None)), ((3, 1, 2, 1), 8, (6, 6, None)), ((3, 512, 512, 1), 8, (786432, 786432, None)), ((3, 512, 512, 3), 8, (2359296, 2359296, 1572864)), ((3, 0, 0, 0), 16, (0, 0, None)), ((3, 512, 512, 1), 16, (1572864, 786432, None)), ((3, 512, 512, 3), 16, (4718592, 2359296, 3145728)), ((3, 0, 0, 0), 32, (0, 0, None)), ((3, 512, 512, 1), 32, (3145728, 786432, None)), ((3, 512, 512, 3), 32, (9437184, 2359296, 6291456)), # NumberOfFrames even ((4, 0, 0, 0), 1, (0, 0, None)), ((4, 1, 1, 1), 1, (1, 4, None)), ((4, 1, 1, 3), 1, (2, 12, None)), ((4, 1, 3, 3), 1, (5, 36, None)), ((4, 2, 4, 1), 1, (4, 32, None)), ((4, 2, 2, 1), 1, (2, 16, None)), ((4, 3, 3, 1), 1, (5, 36, None)), ((4, 512, 512, 1), 1, (131072, 1048576, None)), ((4, 512, 512, 3), 1, (393216, 3145728, 262144)), ((4, 0, 0, 0), 8, (0, 0, None)), ((4, 512, 512, 1), 8, (1048576, 1048576, None)), ((4, 512, 512, 3), 8, (3145728, 3145728, 2097152)), ((4, 0, 0, 0), 16, (0, 0, None)), ((4, 512, 512, 1), 16, (2097152, 1048576, None)), ((4, 512, 512, 3), 16, (6291456, 3145728, 4194304)), ((4, 0, 0, 0), 32, (0, 0, None)), ((4, 512, 512, 1), 32, (4194304, 1048576, None)), ((4, 512, 512, 3), 32, (12582912, 3145728, 8388608)), ] class TestGetExpectedLength: """Tests for get_expected_length().""" @pytest.mark.parametrize("shape, bits, length", REFERENCE_LENGTH) def test_length_in_bytes(self, shape, bits, length): """Test get_expected_length(ds, unit='bytes').""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME2" ds.Rows = shape[1] ds.Columns = shape[2] ds.BitsAllocated = bits if shape[0] != 0: ds.NumberOfFrames = shape[0] ds.SamplesPerPixel = shape[3] assert length[0] == get_expected_length(ds, unit="bytes") @pytest.mark.parametrize("shape, bits, length", REFERENCE_LENGTH) def test_length_in_pixels(self, shape, bits, length): """Test get_expected_length(ds, unit='pixels').""" ds = Dataset() ds.PhotometricInterpretation = "MONOCHROME2" ds.Rows = shape[1] ds.Columns = shape[2] ds.BitsAllocated = bits if shape[0] != 0: ds.NumberOfFrames = shape[0] ds.SamplesPerPixel = shape[3] assert length[1] == get_expected_length(ds, unit="pixels") @pytest.mark.parametrize("shape, bits, length", REFERENCE_LENGTH) def test_length_ybr_422(self, shape, bits, length): """Test get_expected_length for YBR_FULL_422.""" if shape[3] != 3 or bits == 1: return ds = Dataset() ds.PhotometricInterpretation = "YBR_FULL_422" ds.Rows = shape[1] ds.Columns = shape[2] ds.BitsAllocated = bits if shape[0] != 0: ds.NumberOfFrames = shape[0] ds.SamplesPerPixel = shape[3] assert length[2] == get_expected_length(ds, unit="bytes") class TestGetJ2KParameters: """Tests for get_j2k_parameters().""" def test_precision(self): """Test getting the precision for a JPEG2K bytestream.""" base = b"\xff\x4f\xff\x51" + b"\x00" * 38 # Signed for ii in range(135, 144): params = get_j2k_parameters(base + bytes([ii])) assert ii - 127 == params["precision"] assert params["is_signed"] assert params["jp2"] is False # Unsigned for ii in range(7, 16): params = get_j2k_parameters(base + bytes([ii])) assert ii + 1 == params["precision"] assert not params["is_signed"] assert params["jp2"] is False def test_not_j2k(self): """Test result when no JPEG2K SOF marker present""" base = b"\xff\x4e\xff\x51" + b"\x00" * 38 assert {} == get_j2k_parameters(base + b"\x8F") def test_no_siz(self): """Test result when no SIZ box present""" base = b"\xff\x4f\xff\x52" + b"\x00" * 38 assert {} == get_j2k_parameters(base + b"\x8F") def test_short_bytestream(self): """Test result when no SIZ box present""" assert {} == get_j2k_parameters(b"") assert {} == get_j2k_parameters(b"\xff\x4f\xff\x51" + b"\x00" * 20) def test_jp2(self): """Test result when JP2 file format is used.""" ds = J2KR_08_08_3_0_1F_YBR_RCT.ds info = get_j2k_parameters(get_frame(ds.PixelData, 0)) assert info["precision"] == 8 assert info["is_signed"] is False assert info["jp2"] is True class TestGetNrFrames: """Tests for get_nr_frames().""" def test_none(self): """Test warning when (0028,0008) 'Number of Frames' has a value of None""" ds = Dataset() ds.NumberOfFrames = None msg = ( r"A value of None for \(0028,0008\) 'Number of Frames' is " r"non-conformant. It's recommended that this value be " r"changed to 1" ) with pytest.warns(UserWarning, match=msg): assert 1 == get_nr_frames(ds) def test_zero(self): """Test warning when (0028,0008) 'Number of Frames' has a value of 0""" ds = Dataset() ds.NumberOfFrames = 0 msg = ( r"A value of 0 for \(0028,0008\) 'Number of Frames' is " r"non-conformant. It's recommended that this value be " r"changed to 1" ) with pytest.warns(UserWarning, match=msg): assert 1 == get_nr_frames(ds) def test_missing(self): """Test return value when (0028,0008) 'Number of Frames' does not exist""" ds = Dataset() with assert_no_warning(): assert 1 == get_nr_frames(ds) def test_existing(self): """Test return value when (0028,0008) 'Number of Frames' exists.""" ds = Dataset() ds.NumberOfFrames = random.randint(1, 10) with assert_no_warning(): assert ds.NumberOfFrames == get_nr_frames(ds) REFERENCE_PACK_UNPACK = [ (b"", []), (b"\x00", [0, 0, 0, 0, 0, 0, 0, 0]), (b"\x01", [1, 0, 0, 0, 0, 0, 0, 0]), (b"\x02", [0, 1, 0, 0, 0, 0, 0, 0]), (b"\x04", [0, 0, 1, 0, 0, 0, 0, 0]), (b"\x08", [0, 0, 0, 1, 0, 0, 0, 0]), (b"\x10", [0, 0, 0, 0, 1, 0, 0, 0]), (b"\x20", [0, 0, 0, 0, 0, 1, 0, 0]), (b"\x40", [0, 0, 0, 0, 0, 0, 1, 0]), (b"\x80", [0, 0, 0, 0, 0, 0, 0, 1]), (b"\xAA", [0, 1, 0, 1, 0, 1, 0, 1]), (b"\xF0", [0, 0, 0, 0, 1, 1, 1, 1]), (b"\x0F", [1, 1, 1, 1, 0, 0, 0, 0]), (b"\xFF", [1, 1, 1, 1, 1, 1, 1, 1]), # | 1st byte | 2nd byte (b"\x00\x00", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (b"\x00\x01", [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (b"\x00\x80", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x00\xFF", [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]), (b"\x01\x80", [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x80\x80", [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\xFF\x80", [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1]), ] class TestUnpackBits: """Tests for unpack_bits().""" @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") @pytest.mark.parametrize("src, output", REFERENCE_PACK_UNPACK) def test_unpack_np(self, src, output): """Test unpacking data using numpy.""" assert np.array_equal(unpack_bits(src, as_array=True), np.asarray(output)) as_bytes = pack(f"{len(output)}B", *output) assert unpack_bits(src, as_array=False) == as_bytes @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") @pytest.mark.parametrize("src, output", REFERENCE_PACK_UNPACK) def test_unpack_bytes(self, src, output): """Test unpacking data without numpy.""" as_bytes = pack(f"{len(output)}B", *output) assert unpack_bits(src, as_array=False) == as_bytes msg = r"unpack_bits\(\) requires NumPy if 'as_array = True'" with pytest.raises(ValueError, match=msg): unpack_bits(src, as_array=True) REFERENCE_PACK_PARTIAL = [ # | 1st byte | 2nd byte (b"\x00\x40", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), # 15-bits (b"\x00\x20", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x00\x10", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x00\x08", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x00\x04", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x00\x02", [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), (b"\x00\x01", [0, 0, 0, 0, 0, 0, 0, 0, 1]), # 9-bits (b"\x80", [0, 0, 0, 0, 0, 0, 0, 1]), # 8-bits (b"\x40", [0, 0, 0, 0, 0, 0, 1]), (b"\x20", [0, 0, 0, 0, 0, 1]), (b"\x10", [0, 0, 0, 0, 1]), (b"\x08", [0, 0, 0, 1]), (b"\x04", [0, 0, 1]), (b"\x02", [0, 1]), (b"\x01", [1]), (b"", []), ] @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestPackBits: """Tests for pack_bits().""" @pytest.mark.parametrize("output, input", REFERENCE_PACK_UNPACK) def test_pack(self, input, output): """Test packing data.""" assert output == pack_bits(np.asarray(input), pad=False) def test_non_binary_input(self): """Test non-binary input raises exception.""" with pytest.raises( ValueError, match=r"Only binary arrays \(containing ones or" ): pack_bits(np.asarray([0, 0, 2, 0, 0, 0, 0, 0])) def test_ndarray_input(self): """Test non 1D input gets ravelled.""" arr = np.asarray( [ [0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1], ] ) assert (3, 8) == arr.shape b = pack_bits(arr, pad=False) assert b"\x00\x55\xff" == b def test_padding(self): """Test odd length packed data is padded.""" arr = np.asarray( [ [0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1], ] ) assert 3 == len(pack_bits(arr, pad=False)) b = pack_bits(arr, pad=True) assert 4 == len(b) assert 0 == b[-1] @pytest.mark.parametrize("output, input", REFERENCE_PACK_PARTIAL) def test_pack_partial(self, input, output): """Test packing data that isn't a full byte long.""" assert output == pack_bits(np.asarray(input), pad=False) def test_functional(self): """Test against a real dataset.""" ds = EXPL_1_1_3F.ds arr = ds.pixel_array arr = arr.ravel() assert ds.PixelData == pack_bits(arr) def test_functional_nonaligned(self): """Test against a real dataset.""" ds = EXPL_1_1_3F_NONALIGNED.ds arr = ds.pixel_array arr = arr.ravel() assert ds.PixelData == pack_bits(arr) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestExpandYBR422: """Tests for expand_ybr422().""" def test_8bit(self): """Test 8-bit expansion.""" ds = EXPL_8_3_1F_YBR422.ds assert ds.PhotometricInterpretation == "YBR_FULL_422" ds.pixel_array_options(as_rgb=False) ref = ds.pixel_array expanded = expand_ybr422(ds.PixelData, ds.BitsAllocated) arr = np.frombuffer(expanded, dtype="u1") assert np.array_equal(arr, ref.ravel()) def test_16bit(self): """Test 16-bit expansion.""" # Have to make our own 16-bit data ds = EXPL_8_3_1F_YBR422.ds ref = ds.pixel_array.astype("float32") ref *= 65535 / 255 ref = ref.astype("u2") # Subsample # YY BB RR YY BB RR YY BB RR YY BB RR -> YY YY BB RR YY YY BB RR src = bytearray(ref.tobytes()) del src[2::12] del src[2::11] del src[2::10] del src[2::9] # Should be 2/3rds of the original number of bytes nr_bytes = ds.Rows * ds.Columns * ds.SamplesPerPixel * 2 assert len(src) == nr_bytes * 2 // 3 arr = np.frombuffer(expand_ybr422(src, 16), "u2") assert np.array_equal(arr, ref.ravel()) # Spot check values arr = arr.reshape(100, 100, 3) assert (19532, 21845, 65535) == tuple(arr[5, 50, :]) assert (42662, 27242, 49601) == tuple(arr[15, 50, :]) class TestCompressRLE: """Tests for compress() with RLE Lossless""" def test_compress(self): """Test compressing a dataset.""" ds = dcmread(EXPL_16_16_1F.path) assert not ds["PixelData"].is_undefined_length assert ds["PixelData"].VR == "OW" compress(ds, RLELossless, encoding_plugin="pydicom") assert ds.SamplesPerPixel == 1 assert ds.file_meta.TransferSyntaxUID == RLELossless assert len(ds.PixelData) == 21370 assert "PlanarConfiguration" not in ds assert ds["PixelData"].is_undefined_length assert ds["PixelData"].VR == "OB" assert ds._pixel_array is None assert ds._pixel_id == {} def test_no_file_meta_raises(self): """Test compressing a dataset with no file meta.""" ds = dcmread(EXPL_16_16_1F.path) assert ds["PixelData"].VR == "OW" del ds.file_meta msg = ( "Unable to determine the initial compression state of the dataset as " r"there's no \(0002,0010\) 'Transfer Syntax UID' element in the dataset's " "'file_meta' attribute" ) with pytest.raises(AttributeError, match=msg): compress(ds, RLELossless, encoding_plugin="pydicom") @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_already_compressed(self): """Test compressing an already compressed dataset.""" ds = dcmread(RLE_8_3_1F.path) arr = ds.pixel_array ds.file_meta.TransferSyntaxUID = JPEG2000 msg = "Only uncompressed datasets may be compressed" with pytest.raises(ValueError, match=msg): compress(ds, RLELossless, encoding_plugin="pydicom") # Skip compression state check if passing arr compress(ds, RLELossless, arr, encoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds["PixelData"].is_undefined_length assert ds["PixelData"].VR == "OB" assert ds._pixel_array is None assert ds._pixel_id == {} @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_compress_arr(self): """Test compressing using pixel data from an arr.""" ds = dcmread(EXPL_16_16_1F.path) assert hasattr(ds, "file_meta") arr = ds.pixel_array del ds.PixelData del ds.file_meta compress(ds, RLELossless, arr, encoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == RLELossless assert len(ds.PixelData) == 21370 assert ds._pixel_array is None assert ds._pixel_id == {} @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_encoder_unavailable(self, monkeypatch): """Test the required encoder being unavailable.""" ds = dcmread(EXPL_16_16_1F.path) monkeypatch.delitem(RLELosslessEncoder._available, "pydicom") msg = ( r"The pixel data encoder for 'RLE Lossless' is unavailable because " r"all of its plugins are missing dependencies:\n" r" gdcm - requires gdcm>=3.0.10\n" r" pylibjpeg - requires numpy, pylibjpeg>=2.0 and pylibjpeg-rle>=2.0" ) with pytest.raises(RuntimeError, match=msg): compress(ds, RLELossless) def test_uid_not_supported(self): """Test the UID not having any encoders.""" ds = dcmread(EXPL_16_16_1F.path) msg = ( r"No pixel data encoders have been implemented for " r"'JPEG 2000 Part 2 Multi-component Image Compression'" ) with pytest.raises(NotImplementedError, match=msg): compress(ds, JPEG2000MC, encoding_plugin="pydicom") def test_encapsulate_extended(self): """Test forcing extended encapsulation.""" ds = dcmread(EXPL_16_16_1F.path) assert "ExtendedOffsetTable" not in ds assert "ExtendedOffsetTableLengths" not in ds compress(ds, RLELossless, encapsulate_ext=True, encoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == RLELossless assert len(ds.PixelData) == 21366 assert ds.ExtendedOffsetTable == b"\x00" * 8 assert ds.ExtendedOffsetTableLengths == b"\x66\x53" + b"\x00" * 6 @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_round_trip(self): """Test an encoding round-trip""" ds = dcmread(RLE_16_1_1F.path) arr = ds.pixel_array # Setting PixelData to None frees the memory which may # sometimes be reused, causes the _pixel_id check to fail ds.PixelData = None ds._pixel_array = None compress(ds, RLELossless, arr, encoding_plugin="pydicom") assert ds.PixelData is not None assert np.array_equal(arr, ds.pixel_array) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_cant_override_kwargs(self): """Test we can't override using kwargs.""" ds = dcmread(EXPL_8_3_1F_ODD.path) ref = ds.pixel_array assert ds.SamplesPerPixel == 3 compress( ds, RLELossless, encoding_plugin="pydicom", samples_per_pixel=1, ) assert np.array_equal(ref, ds.pixel_array) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_instance_uid(self): """Test generating new SOP Instance UID.""" ds = dcmread(EXPL_16_16_1F.path) original = ds.SOPInstanceUID compress(ds, RLELossless, encoding_plugin="pydicom", generate_instance_uid=True) assert ds.SOPInstanceUID != original assert ds.SOPInstanceUID == ds.file_meta.MediaStorageSOPInstanceUID ds = dcmread(EXPL_16_16_1F.path) compress( ds, RLELossless, encoding_plugin="pydicom", generate_instance_uid=False ) assert ds.SOPInstanceUID == original assert ds.SOPInstanceUID == ds.file_meta.MediaStorageSOPInstanceUID @pytest.mark.skipif(SKIP_JLS, reason="JPEG-LS plugins unavailable") class TestCompressJLS: """Tests for compress() with JPEG-LS""" def test_lossless(self): """Test JPEG-LS Lossless.""" ds = dcmread(EXPL_16_16_1F.path) ref = ds.pixel_array compress(ds, JPEGLSLossless, encoding_plugin="pyjpegls") assert ds.file_meta.TransferSyntaxUID == JPEGLSLossless frame = get_frame(ds.PixelData, 0) info = _get_jpg_parameters(frame) assert info["lossy_error"] == 0 assert np.array_equal(ds.pixel_array, ref) def test_lossy(self): """Test JPEG-LS Near Lossless and the jls_error kwarg.""" ds = dcmread(EXPL_16_16_1F.path) ref = ds.pixel_array compress(ds, JPEGLSNearLossless, jls_error=3, encoding_plugin="pyjpegls") assert ds.file_meta.TransferSyntaxUID == JPEGLSNearLossless frame = get_frame(ds.PixelData, 0) info = _get_jpg_parameters(frame) assert info["lossy_error"] == 3 assert np.allclose(ds.pixel_array, ref, atol=3) @pytest.mark.skipif(SKIP_J2K, reason="JPEG 2000 plugins unavailable") class TestCompressJ2K: """Tests for compress() with JPEG 2000""" def test_lossless(self): """Test JPEG 2000 Lossless.""" ds = dcmread(EXPL_16_16_1F.path) ref = ds.pixel_array compress(ds, JPEG2000Lossless, encoding_plugin="pylibjpeg") assert ds.file_meta.TransferSyntaxUID == JPEG2000Lossless assert np.array_equal(ds.pixel_array, ref) def test_lossy(self): """Test JPEG 2000 and the j2k_cr and j2k_psnr kwargs.""" ds = dcmread(EXPL_16_16_1F.path) ref = ds.pixel_array compress(ds, JPEG2000, j2k_cr=[2], encoding_plugin="pylibjpeg") assert ds.file_meta.TransferSyntaxUID == JPEG2000 out = ds.pixel_array assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=2) ds = dcmread(EXPL_16_16_1F.path) ref = ds.pixel_array compress(ds, JPEG2000, j2k_psnr=[100], encoding_plugin="pylibjpeg") assert ds.file_meta.TransferSyntaxUID == JPEG2000 out = ds.pixel_array assert not np.array_equal(out, ref) assert np.allclose(out, ref, atol=3) @pytest.fixture() def add_dummy_decoder(): """Add a dummy decoder to the pixel data decoders""" class DummyDecoder: is_available = True def iter_array(self, ds, **kwargs): # Yield a total of 2**32 bytes arr = np.frombuffer(b"\x00" * 2**20, dtype="u1") for _ in range(2**12): yield arr, {} _PIXEL_DATA_DECODERS["1.2.3.4"] = [DummyDecoder()] yield del _PIXEL_DATA_DECODERS["1.2.3.4"] class TestDecompress: """Tests for decompress()""" def test_no_file_meta_raises(self): """Test exception raised if no file meta or transfer syntax.""" ds = dcmread(EXPL_16_16_1F.path) del ds.file_meta.TransferSyntaxUID msg = ( "Unable to determine the initial compression state as there's no " r"\(0002,0010\) 'Transfer Syntax UID' element in the dataset's 'file_meta' " "attribute" ) with pytest.raises(AttributeError, match=msg): decompress(ds) del ds.file_meta with pytest.raises(AttributeError, match=msg): decompress(ds) def test_no_pixel_data_raises(self): """Test exception raised if no pixel data.""" ds = dcmread(EXPL_16_16_1F.path) del ds.PixelData msg = ( r"Unable to decompress as the dataset has no \(7FE0,0010\) 'Pixel " "Data' element" ) with pytest.raises(AttributeError, match=msg): decompress(ds) def test_uncompressed_raises(self): """Test exception raised if already uncompressed.""" ds = dcmread(EXPL_16_16_1F.path) msg = "The dataset is already uncompressed" with pytest.raises(ValueError, match=msg): decompress(ds) @pytest.mark.skipif(not HAVE_NP, reason="Numpy is unavailable") def test_too_long_raises(self, add_dummy_decoder): """Test too much uncompressed data raises""" ds = dcmread(RLE_8_3_1F.path) uid = UID("1.2.3.4") uid.set_private_encoding(False, True) ds.file_meta.TransferSyntaxUID = uid msg = ( "Unable to decompress as the length of the uncompressed pixel data " "will be greater than the maximum allowed by the DICOM Standard" ) with pytest.raises(ValueError, match=msg): decompress(ds) @pytest.mark.skipif(SKIP_RLE, reason="RLE plugins unavailable") def test_rle_8_1f_3s(self): """Test decoding RLE Lossless - 1 frame, 3 sample (RGB)""" ds = dcmread(RLE_8_3_1F.path) ref = ds.pixel_array assert ds.BitsAllocated == 8 assert ds.PhotometricInterpretation == "RGB" decompress(ds, decoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ds.Rows * ds.Columns * (ds.BitsAllocated // 8) * 3 assert elem.is_undefined_length is False assert elem.VR == "OB" assert "NumberOfFrames" not in ds assert ds.PlanarConfiguration == 0 assert ds.PhotometricInterpretation == "RGB" assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) @pytest.mark.skipif(SKIP_RLE, reason="RLE plugins unavailable") def test_rle_16_1f_1s(self): """Test decoding RLE Lossless - 1 frame, 1 sample""" ds = dcmread(RLE_16_1_1F.path) ref = ds.pixel_array assert ds.BitsAllocated == 16 decompress(ds, decoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ds.Rows * ds.Columns * (ds.BitsAllocated // 8) assert elem.is_undefined_length is False assert elem.VR == "OW" assert "NumberOfFrames" not in ds assert "PlanarConfiguration" not in ds assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) @pytest.mark.skipif(SKIP_RLE, reason="RLE plugins unavailable") def test_rle_16_10f_1s(self): """Test decoding RLE Lossless - 10 frame, 1 sample""" ds = dcmread(RLE_16_1_10F.path) ref = ds.pixel_array assert ds.BitsAllocated == 16 assert ds.NumberOfFrames == 10 # `index` should be ignored decompress(ds, decoding_plugin="pydicom", index=1) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ( ds.Rows * ds.Columns * (ds.BitsAllocated // 8) * ds.NumberOfFrames ) assert elem.is_undefined_length is False assert elem.VR == "OW" assert "PlanarConfiguration" not in ds assert ds.NumberOfFrames == 10 assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) @pytest.mark.skipif(SKIP_RLE, reason="RLE plugins unavailable") def test_rle_32_2f_3s(self): """Test decoding RLE Lossless - 2 frame, 3 sample (RGB)""" ds = dcmread(RLE_32_3_2F.path) ref = ds.pixel_array assert ds.BitsAllocated == 32 assert ds.NumberOfFrames == 2 assert ds.PhotometricInterpretation == "RGB" decompress(ds, decoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ( ds.Rows * ds.Columns * (ds.BitsAllocated // 8) * ds.NumberOfFrames * 3 ) assert elem.is_undefined_length is False assert elem.VR == "OW" assert ds.PlanarConfiguration == 0 assert ds.PhotometricInterpretation == "RGB" assert ds.NumberOfFrames == 2 assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) @pytest.mark.skipif(SKIP_RLE, reason="RLE plugins unavailable") def test_odd_length_padded(self): """Test odd length Pixel Data gets padded to even length.""" ds = dcmread(EXPL_8_3_1F_ODD.path) assert ds.Rows * ds.Columns * ds.SamplesPerPixel % 2 == 1 compress(ds, RLELossless, encoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == RLELossless decompress(ds, decoding_plugin="pydicom") assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert len(ds.PixelData) % 2 == 0 @pytest.mark.skipif(not SKIP_J2K, reason="J2K plugin available") def test_no_decoders_raises(self): """Test exception raised if no decoders are available.""" ds = dcmread(J2KR_08_08_3_0_1F_YBR_RCT.path) msg = ( "Unable to decompress as the plugins for the 'JPEG 2000 Image " r"Compression \(Lossless Only\)' decoder are all missing dependencies:" ) with pytest.raises(RuntimeError, match=msg): decompress(ds, decoding_plugin="pylibjpeg") @pytest.mark.skipif(SKIP_J2K, reason="J2K plugins unavailable") def test_j2k_ybr_rct(self): """Test decoding J2K YBR_RCT -> RGB""" ds = dcmread(J2KR_08_08_3_0_1F_YBR_RCT.path) ref = ds.pixel_array assert ds.BitsAllocated == 8 assert ds.PhotometricInterpretation == "YBR_RCT" # as_rgb will be ignored if YBR_RCT or YBR_ICT decompress(ds, decoding_plugin="pylibjpeg", as_rgb=False) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ds.Rows * ds.Columns * (ds.BitsAllocated // 8) * 3 assert elem.is_undefined_length is False assert elem.VR == "OB" assert "NumberOfFrames" not in ds assert ds.PlanarConfiguration == 0 assert ds.PhotometricInterpretation == "RGB" assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) @pytest.mark.skipif(SKIP_JPG, reason="JPEG plugins unavailable") def test_as_rgb(self): """Test decoding J2K - 1 frame, 3 sample (YBR_RCT)""" ds = dcmread(JPGB_08_08_3_1F_YBR_FULL.path) ds.pixel_array_options(decoding_plugin="pylibjpeg") ref = ds.pixel_array # YBR -> RGB assert ds.BitsAllocated == 8 assert ds.PhotometricInterpretation == "YBR_FULL" decompress(ds, decoding_plugin="pylibjpeg", as_rgb=True) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian elem = ds["PixelData"] assert len(elem.value) == ds.Rows * ds.Columns * (ds.BitsAllocated // 8) * 3 assert elem.is_undefined_length is False assert elem.VR == "OB" assert "NumberOfFrames" not in ds assert ds.PlanarConfiguration == 0 assert ds.PhotometricInterpretation == "RGB" assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, ref) ds = dcmread(JPGB_08_08_3_1F_YBR_FULL.path) decompress(ds, decoding_plugin="pylibjpeg", as_rgb=False) assert ds.PhotometricInterpretation == "YBR_FULL" ds.pixel_array_options(as_rgb=False) rgb = convert_color_space(ds.pixel_array, "YBR_FULL", "RGB") assert np.array_equal(rgb, ref) @pytest.mark.skipif(SKIP_RLE, reason="RLE plugins unavailable") def test_instance_uid(self): """Test generating new SOP Instance UID.""" ds = dcmread(RLE_8_3_1F.path) original = ds.SOPInstanceUID decompress(ds, decoding_plugin="pydicom", generate_instance_uid=True) assert ds.SOPInstanceUID != original assert ds.SOPInstanceUID == ds.file_meta.MediaStorageSOPInstanceUID ds = dcmread(RLE_8_3_1F.path) decompress(ds, decoding_plugin="pydicom", generate_instance_uid=False) assert ds.SOPInstanceUID == original assert ds.SOPInstanceUID == ds.file_meta.MediaStorageSOPInstanceUID @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestSetPixelData: """Tests for set_pixel_data()""" def test_float_pixel_data_raises(self): """Test exception raised if float pixel data elements present""" ds = Dataset() ds.FloatPixelData = b"\x00\x00" arr = np.zeros((10, 10), dtype="uint8") msg = ( r"The dataset has an existing \(7FE0,0008\) 'Float Pixel Data' element " r"which indicates the \(0008,0016\) 'SOP Class UID' value is not suitable " "for a dataset with 'Pixel Data'. The 'Float Pixel Data' element should " "be deleted and the 'SOP Class UID' changed." ) with pytest.raises(AttributeError, match=msg): set_pixel_data(ds, arr, "MONOCHROME1", 8) del ds.FloatPixelData ds.DoubleFloatPixelData = b"\x00\x00" msg = r"The dataset has an existing \(7FE0,0009\) 'Double Float Pixel Data'" with pytest.raises(AttributeError, match=msg): set_pixel_data(ds, arr, "MONOCHROME1", 8) def test_unsupported_dtype_raises(self): """Test exception raised if dtype is unsupported""" msg = ( r"Unsupported ndarray dtype 'uint32', must be int8, int16, uint8 or uint16" ) with pytest.raises(ValueError, match=msg): set_pixel_data( Dataset(), np.zeros((10, 10), dtype="uint32"), "MONOCHROME1", 8 ) msg = ( r"Unsupported ndarray dtype 'float32', must be int8, int16, uint8 or uint16" ) with pytest.raises(ValueError, match=msg): set_pixel_data( Dataset(), np.zeros((10, 10), dtype="float32"), "MONOCHROME1", 8 ) def test_unsupported_photometric_interpretation_raises(self): """Test exception raised if dtype is unsupported""" msg = "Unsupported 'photometric_interpretation' value 'YBR_RCT'" with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.zeros((10, 10), dtype="int8"), "YBR_RCT", 8) def test_unsupported_dimension_raises(self): """Test exception raised if array dimensions are unsupported""" msg = "An ndarray with 'MONOCHROME1' data must have 2 or 3 dimensions, not 4" with pytest.raises(ValueError, match=msg): set_pixel_data( Dataset(), np.zeros((2, 10, 10, 3), dtype="int8"), "MONOCHROME1", 8 ) msg = "An ndarray with 'RGB' data must have 3 or 4 dimensions, not 2" with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.zeros((10, 10), dtype="int8"), "RGB", 8) def test_invalid_samples_raises(self): """Test mismatch between array shape and photometric interpretation raises""" msg = ( r"An ndarray with 'RGB' data must have shape \(rows, columns, 3\) or " r"\(frames, rows, columns, 3\), not \(10, 10, 10\)" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.zeros((10, 10, 10), dtype="int8"), "RGB", 8) def test_invalid_bits_stored_raises(self): """Test bits_stored outside [1, 16] raises an exception""" msg = ( "Invalid 'bits_stored' value '0', must be greater than 0 and " "less than or equal to the number of bits for the ndarray's itemsize " "'8'" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.ones((3, 3), dtype="u1"), "MONOCHROME1", 0) msg = ( "Invalid 'bits_stored' value '9', must be greater than 0 and " "less than or equal to the number of bits for the ndarray's itemsize " "'8'" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.ones((3, 3), dtype="u1"), "MONOCHROME1", 9) msg = ( "Invalid 'bits_stored' value '0', must be greater than 0 and " "less than or equal to the number of bits for the ndarray's itemsize " "'16'" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.ones((3, 3), dtype="u2"), "MONOCHROME1", 0) msg = ( "Invalid 'bits_stored' value '17', must be greater than 0 and " "less than or equal to the number of bits for the ndarray's itemsize " "'16'" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), np.ones((3, 3), dtype="u2"), "MONOCHROME1", 17) def test_invalid_arr_range_raises(self): """Test the range of values in the array matches bits_stored""" arr = np.zeros((10, 10), dtype="uint8") # The array will overflow 256 -> 0 if bits_stored 8 for bits_stored in range(1, 8): amin, amax = 0, 2**bits_stored - 1 arr[0, 0] = amax + 1 msg = ( rf"The range of values in the ndarray \[0, {amax + 1}\] is " r"greater than that allowed by the 'bits_stored' value \[0, " rf"{amax}\]" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), arr, "MONOCHROME1", bits_stored) arr = np.zeros((10, 10), dtype="uint16") for bits_stored in range(1, 16): amin, amax = 0, 2**bits_stored - 1 arr[0, 0] = amax + 1 msg = ( rf"The range of values in the ndarray \[0, {amax + 1}\] is " r"greater than that allowed by the 'bits_stored' value \[0, " rf"{amax}\]" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), arr, "MONOCHROME1", bits_stored) arr = np.zeros((10, 10), dtype="int8") for bits_stored in range(1, 8): amin, amax = -(2 ** (bits_stored - 1)), 2 ** (bits_stored - 1) - 1 arr[0, 0] = amax + 1 arr[0, 1] = amin - 1 msg = ( rf"The range of values in the ndarray \[{amin - 1}, {amax + 1}\] is " rf"greater than that allowed by the 'bits_stored' value \[{amin}, " rf"{amax}\]" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), arr, "MONOCHROME1", bits_stored) arr = np.zeros((10, 10), dtype="int16") for bits_stored in range(1, 16): amin, amax = -(2 ** (bits_stored - 1)), 2 ** (bits_stored - 1) - 1 arr[0, 0] = amax + 1 arr[0, 1] = amin - 1 msg = ( rf"The range of values in the ndarray \[{amin - 1}, {amax + 1}\] is " rf"greater than that allowed by the 'bits_stored' value \[{amin}, " rf"{amax}\]" ) with pytest.raises(ValueError, match=msg): set_pixel_data(Dataset(), arr, "MONOCHROME1", bits_stored) def test_big_endian_raises(self): """Test exception raised if big endian transfer syntax""" ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRBigEndian arr = np.zeros((10, 10), dtype="uint8") msg = ( "The dataset's transfer syntax 'Explicit VR Big Endian' is big-endian, " "which is not supported" ) with pytest.raises(NotImplementedError, match=msg): set_pixel_data(ds, arr, "MONOCHROME1", 8) def test_grayscale_8bit_unsigned(self): """Test setting unsigned 8-bit grayscale pixel data""" ds = Dataset() ds.PlanarConfiguration = 1 ds.NumberOfFrames = 2 arr = np.zeros((3, 5), dtype="u1") arr[0, 0] = 127 set_pixel_data(ds, arr, "MONOCHROME1", 7) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == 3 assert ds.Columns == 5 assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "MONOCHROME1" assert ds.PixelRepresentation == 0 assert ds.BitsAllocated == 8 assert ds.BitsStored == 7 assert ds.HighBit == 6 assert "NumberOfFrames" not in ds assert "PlanarConfiguration" not in ds elem = ds["PixelData"] assert elem.VR == "OB" assert len(elem.value) == 16 assert elem.is_undefined_length is False assert ds._pixel_array is None assert ds._pixel_id == {} assert np.array_equal(ds.pixel_array, arr) def test_grayscale_8bit_signed(self): """Test setting signed 8-bit grayscale pixel data""" ds = Dataset() ds.PlanarConfiguration = 1 ds.NumberOfFrames = 2 arr = np.zeros((3, 5), dtype="i1") arr[0, 0] = 127 arr[0, 1] = -128 set_pixel_data(ds, arr, "MONOCHROME1", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == 3 assert ds.Columns == 5 assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "MONOCHROME1" assert ds.PixelRepresentation == 1 assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.HighBit == 7 elem = ds["PixelData"] assert elem.VR == "OB" assert len(elem.value) == 16 assert np.array_equal(ds.pixel_array, arr) def test_grayscale_16bit_unsigned(self): """Test setting unsigned 16-bit grayscale pixel data""" ds = Dataset() ds.PlanarConfiguration = 1 ds.NumberOfFrames = 2 arr = np.zeros((3, 5), dtype="u2") arr[0, 0] = 65535 set_pixel_data(ds, arr, "MONOCHROME1", 16) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == 3 assert ds.Columns == 5 assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "MONOCHROME1" assert ds.PixelRepresentation == 0 assert ds.BitsAllocated == 16 assert ds.BitsStored == 16 assert ds.HighBit == 15 elem = ds["PixelData"] assert elem.VR == "OW" assert len(elem.value) == 30 assert np.array_equal(ds.pixel_array, arr) def test_grayscale_16bit_signed(self): """Test setting signed 16-bit grayscale pixel data""" ds = Dataset() ds.PlanarConfiguration = 1 ds.NumberOfFrames = 2 arr = np.zeros((3, 5), dtype="i2") arr[0, 0] = 32767 arr[0, 1] = -32768 set_pixel_data(ds, arr, "MONOCHROME1", 16) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == 3 assert ds.Columns == 5 assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "MONOCHROME1" assert ds.PixelRepresentation == 1 assert ds.BitsAllocated == 16 assert ds.BitsStored == 16 assert ds.HighBit == 15 elem = ds["PixelData"] assert elem.VR == "OW" assert len(elem.value) == 30 assert np.array_equal(ds.pixel_array, arr) def test_grayscale_multiframe(self): """Test setting multiframe pixel data""" ds = Dataset() arr = np.zeros((10, 3, 5), dtype="u1") arr[0, 0, 0] = 127 arr[9, 0, 0] = 255 set_pixel_data(ds, arr, "MONOCHROME1", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == 3 assert ds.Columns == 5 assert ds.SamplesPerPixel == 1 assert ds.PhotometricInterpretation == "MONOCHROME1" assert ds.PixelRepresentation == 0 assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.HighBit == 7 assert ds.NumberOfFrames == 10 assert "PlanarConfiguration" not in ds elem = ds["PixelData"] assert elem.VR == "OB" assert len(elem.value) == 150 assert elem.is_undefined_length is False assert np.array_equal(ds.pixel_array, arr) def test_rgb_8bit_unsigned(self): """Test setting unsigned 8-bit RGB pixel data""" ds = Dataset() ds.NumberOfFrames = 2 arr = np.zeros((3, 5, 3), dtype="u1") arr[0, 0] = [127, 255, 0] set_pixel_data(ds, arr, "RGB", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == 3 assert ds.Columns == 5 assert ds.SamplesPerPixel == 3 assert ds.PhotometricInterpretation == "RGB" assert ds.PixelRepresentation == 0 assert ds.BitsAllocated == 8 assert ds.BitsStored == 8 assert ds.HighBit == 7 assert ds.PlanarConfiguration == 0 assert "NumberOfFrames" not in ds elem = ds["PixelData"] assert elem.VR == "OB" assert len(elem.value) == 46 assert np.array_equal(ds.pixel_array, arr) def test_rgb_YBR_FULL_422(self): """Test setting multiframe pixel data""" ref = dcmread(EXPL_8_3_1F_YBR422.path) arr = pixel_array(ref, raw=True) ds = Dataset() set_pixel_data(ds, arr, "YBR_FULL_422", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == ref.Rows assert ds.Columns == ref.Columns assert ds.SamplesPerPixel == ref.SamplesPerPixel assert ds.PhotometricInterpretation == "YBR_FULL_422" assert ds.PixelRepresentation == ref.PixelRepresentation assert ds.BitsAllocated == ref.BitsAllocated assert ds.BitsStored == ref.BitsStored assert ds.HighBit == ref.HighBit assert ds.PlanarConfiguration == ref.PlanarConfiguration elem = ds["PixelData"] assert elem.VR == "OB" assert len(elem.value) == ( ds.Rows * ds.Columns * ds.BitsAllocated // 8 * ds.SamplesPerPixel // 3 * 2 ) assert elem.is_undefined_length is False assert np.array_equal(pixel_array(ds, raw=True), arr) def test_transfer_syntax(self): """Test setting the transfer syntax""" ds = Dataset() set_pixel_data(ds, np.zeros((3, 5, 3), dtype="u1"), "RGB", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian del ds.file_meta.TransferSyntaxUID ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian set_pixel_data(ds, np.zeros((3, 5, 3), dtype="u1"), "RGB", 8) assert ds.file_meta.TransferSyntaxUID == ImplicitVRLittleEndian ds.file_meta.TransferSyntaxUID = JPEG2000Lossless set_pixel_data(ds, np.zeros((3, 5, 3), dtype="u1"), "RGB", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian def test_dataset_set_pixel_data(self): """Functionality test for Dataset.set_pixel_data()""" ref = dcmread(EXPL_8_3_1F_YBR422.path) arr = ref.pixel_array ds = Dataset() ds.set_pixel_data(arr, "RGB", 8) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.Rows == ref.Rows assert ds.Columns == ref.Columns assert ds.SamplesPerPixel == ref.SamplesPerPixel assert ds.PhotometricInterpretation == "RGB" assert ds.PixelRepresentation == ref.PixelRepresentation assert ds.BitsAllocated == ref.BitsAllocated assert ds.BitsStored == ref.BitsStored assert ds.HighBit == ref.HighBit assert ds.PlanarConfiguration == ref.PlanarConfiguration assert np.array_equal(ds.pixel_array, arr) def test_sop_instance(self): """Test generate_instance_uid kwarg""" ds = Dataset() ds.SOPInstanceUID = "1.2.3.4" set_pixel_data(ds, np.zeros((3, 5, 3), dtype="u1"), "RGB", 8) uid = ds.SOPInstanceUID assert uid != "1.2.3.4" set_pixel_data( ds, np.zeros((3, 5, 3), dtype="u1"), "RGB", 8, generate_instance_uid=False ) assert ds.SOPInstanceUID == uid pydicom-pydicom-20aa4b7/tests/test_JPEG_LS_transfer_syntax.py000066400000000000000000000161011515706620200244350ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. import os import sys import pytest import pydicom from pydicom.filereader import dcmread from pydicom.data import get_testdata_file pillow_missing_message = "pillow is not available in this test environment" pillow_present_message = "pillow is being tested" gdcm_missing_message = "GDCM is not available in this test environment" numpy_missing_message = "numpy is not available in this test environment" jpeg_ls_missing_message = "jpeg_ls is not available in this test environment" try: from pydicom.pixel_data_handlers import numpy_handler HAVE_NP = numpy_handler.HAVE_NP except ImportError: HAVE_NP = False numpy_handler = None try: from pydicom.pixel_data_handlers import pillow_handler HAVE_PIL = pillow_handler.HAVE_PIL HAVE_JPEG = pillow_handler.HAVE_JPEG HAVE_JPEG2K = pillow_handler.HAVE_JPEG2K except ImportError: HAVE_PIL = False pillow_handler = None HAVE_JPEG = False HAVE_JPEG2K = False try: from pydicom.pixel_data_handlers import jpeg_ls_handler HAVE_JPEGLS = jpeg_ls_handler.HAVE_JPEGLS except ImportError: jpeg_ls_handler = None HAVE_JPEGLS = False try: from pydicom.pixel_data_handlers import gdcm_handler HAVE_GDCM = gdcm_handler.HAVE_GDCM except ImportError: gdcm_handler = None HAVE_GDCM = False mr_name = get_testdata_file("MR_small.dcm") jpeg_ls_lossless_name = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") emri_name = get_testdata_file("emri_small.dcm") emri_jpeg_ls_lossless = get_testdata_file("emri_small_jpeg_ls_lossless.dcm") dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() class Test_JPEG_LS_Lossless_transfer_syntax: def setup_method(self, method): self.jpeg_ls_lossless = dcmread(jpeg_ls_lossless_name) self.jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.mr_small = dcmread(mr_name) self.mr_small.pixel_array_options(use_v2_backend=True) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.emri_small = dcmread(emri_name) self.emri_small.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers def teardown_method(self, method): pydicom.config.pixel_data_handlers = self.original_handlers @pytest.mark.skipif(not HAVE_NP, reason=numpy_missing_message) def test_read_mr_with_numpy(self): pydicom.config.pixel_data_handlers = [numpy_handler] msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'1.2.840.10008.1.2.4.80' \(JPEG-LS Lossless Image Compression\) " r"as there are no pixel data handlers available." ) with pytest.raises(NotImplementedError, match=msg): self.jpeg_ls_lossless.pixel_array @pytest.mark.skipif(not HAVE_NP, reason=numpy_missing_message) def test_read_emri_with_numpy(self): pydicom.config.pixel_data_handlers = [numpy_handler] msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'1.2.840.10008.1.2.4.80' \(JPEG-LS Lossless Image Compression\) " r"as there are no pixel data handlers available." ) with pytest.raises(NotImplementedError, match=msg): self.emri_jpeg_ls_lossless.pixel_array @pytest.mark.skipif(not HAVE_PIL, reason=pillow_missing_message) def test_read_mr_with_pillow(self): pydicom.config.pixel_data_handlers = [pillow_handler] msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'1.2.840.10008.1.2.4.80' \(JPEG-LS Lossless Image Compression\) " r"as there are no pixel data handlers available." ) with pytest.raises(NotImplementedError, match=msg): self.jpeg_ls_lossless.pixel_array @pytest.mark.skipif(not HAVE_PIL, reason=pillow_missing_message) def test_read_emri_with_pillow(self): pydicom.config.pixel_data_handlers = [pillow_handler] msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'1.2.840.10008.1.2.4.80' \(JPEG-LS Lossless Image Compression\) " r"as there are no pixel data handlers available." ) with pytest.raises(NotImplementedError, match=msg): self.emri_jpeg_ls_lossless.pixel_array @pytest.mark.skipif(not HAVE_GDCM, reason=gdcm_missing_message) def test_read_mr_with_gdcm(self): pydicom.config.pixel_data_handlers = [numpy_handler, gdcm_handler] a = self.jpeg_ls_lossless.pixel_array b = self.mr_small.pixel_array a_mean = a.mean() b_mean = b.mean() msg = f"using GDCM Decoded pixel data is not all {b_mean} (mean == {a_mean})" assert a_mean == b_mean, msg @pytest.mark.skipif(not HAVE_GDCM, reason=gdcm_missing_message) def test_read_emri_with_gdcm(self): pydicom.config.pixel_data_handlers = [numpy_handler, gdcm_handler] a = self.emri_jpeg_ls_lossless.pixel_array b = self.emri_small.pixel_array a_mean = a.mean() b_mean = b.mean() msg = f"using GDCM Decoded pixel data is not all {b_mean} (mean == {a_mean})" assert a_mean == b_mean, msg @pytest.mark.skipif(not HAVE_JPEGLS, reason=jpeg_ls_missing_message) def test_read_mr_with_jpeg_ls(self): pydicom.config.pixel_data_handlers = [numpy_handler, jpeg_ls_handler] a = self.jpeg_ls_lossless.pixel_array b = self.mr_small.pixel_array a_mean = a.mean() b_mean = b.mean() msg = f"using jpeg_ls decoded pixel data is not all {b_mean} (mean == {a_mean})" assert a_mean == b_mean, msg @pytest.mark.skipif(not HAVE_JPEGLS, reason=jpeg_ls_missing_message) def test_read_emri_with_jpeg_ls(self): pydicom.config.pixel_data_handlers = [numpy_handler, jpeg_ls_handler] a = self.emri_jpeg_ls_lossless.pixel_array b = self.emri_small.pixel_array a_mean = a.mean() b_mean = b.mean() msg = f"using jpeg_ls decoded pixel data is not all {b_mean} (mean == {a_mean})" assert a_mean == b_mean, msg def test_read_mr_without_any_handler(self): pydicom.config.pixel_data_handlers = [] msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'1.2.840.10008.1.2.4.80' \(JPEG-LS Lossless Image Compression\) " r"as there are no pixel data handlers available." ) with pytest.raises(NotImplementedError, match=msg): self.jpeg_ls_lossless.pixel_array def test_read_emri_without_any_handler(self): pydicom.config.pixel_data_handlers = [] msg = ( r"Unable to decode pixel data with a transfer syntax UID of " r"'1.2.840.10008.1.2.4.80' \(JPEG-LS Lossless Image Compression\) " r"as there are no pixel data handlers available." ) with pytest.raises(NotImplementedError, match=msg): self.emri_jpeg_ls_lossless.pixel_array pydicom-pydicom-20aa4b7/tests/test_charset.py000066400000000000000000000544461515706620200214470ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.charset module.""" import pytest import pydicom.charset from pydicom import dcmread from pydicom.data import get_charset_files, get_testdata_file from pydicom.dataelem import DataElement from pydicom.filebase import DicomBytesIO from pydicom.valuerep import PersonName # The file names (without '.dcm' extension) of most of the character test # files, together with the respective decoded PatientName tag values. # Most of these (except the Korean file) are taken from David Clunie's # charset example files. FILE_PATIENT_NAMES = [ ("chrArab", "قباني^لنزار"), ("chrFren", "Buc^Jérôme"), ("chrFrenMulti", "Buc^Jérôme"), ("chrGerm", "Äneas^Rüdiger"), ("chrGreek", "Διονυσιος"), ("chrH31", "Yamada^Tarou=山田^太郎=やまだ^たろう"), ("chrH32", "ヤマダ^タロウ=山田^太郎=やまだ^たろう"), ("chrHbrw", "שרון^דבורה"), ("chrI2", "Hong^Gildong=洪^吉洞=홍^길동"), ("chrJapMulti", "やまだ^たろう"), ("chrJapMultiExplicitIR6", "やまだ^たろう"), ("chrKoreanMulti", "김희중"), ("chrRuss", "Люкceмбypг"), ("chrX1", "Wang^XiaoDong=王^小東"), ("chrX2", "Wang^XiaoDong=王^小东"), ] # Test data for all single-byte coding extensions. # Mostly taken from the same example files. ENCODED_NAMES = [ ( "ISO 2022 IR 13", "ヤマダ^タロウ", b"\x1b\x29\x49\xd4\xcf\xc0\xde\x5e\x1b\x29\x49\xc0\xdb\xb3", ), ( "ISO 2022 IR 100", "Buc^Jérôme", b"\x1b\x2d\x41\x42\x75\x63\x5e\x1b\x2d\x41\x4a\xe9\x72\xf4\x6d\x65", ), ("ISO 2022 IR 101", "Wałęsa", b"\x1b\x2d\x42\x57\x61\xb3\xea\x73\x61"), ( "ISO 2022 IR 109", "antaŭnomo", b"\x1b\x2d\x43\x61\x6e\x74\x61\xfd\x6e\x6f\x6d\x6f", ), ("ISO 2022 IR 110", "vārds", b"\x1b\x2d\x44\x76\xe0\x72\x64\x73"), ( "ISO 2022 IR 127", "قباني^لنزار", b"\x1b\x2d\x47\xe2\xc8\xc7\xe6\xea\x5e\x1b\x2d\x47\xe4\xe6\xd2\xc7\xd1", ), ( "ISO 2022 IR 126", "Διονυσιος", b"\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2", ), ( "ISO 2022 IR 138", "שרון^דבורה", b"\x1b\x2d\x48\xf9\xf8\xe5\xef\x5e\x1b\x2d\x48\xe3\xe1\xe5\xf8\xe4", ), ( "ISO 2022 IR 144", "Люкceмбypг", b"\x1b\x2d\x4c\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3", ), ( "ISO 2022 IR 148", "Çavuşoğlu", b"\x1b\x2d\x4d\xc7\x61\x76\x75\xfe\x6f\xf0\x6c\x75", ), ("ISO 2022 IR 166", "นามสกุล", b"\x1b\x2d\x54\xb9\xd2\xc1\xca\xa1\xd8\xc5"), ] class TestCharset: def test_encodings(self): test_string = "Hello World" for x in pydicom.charset.python_encoding.items(): test_string.encode(x[1]) def test_nested_character_sets(self): """charset: can read and decode SQ with different encodings.........""" ds = dcmread(get_charset_files("chrSQEncoding.dcm")[0]) ds.decode() # These datasets inside of the SQ cannot be decoded with # default_encoding OR UTF-8 (the parent dataset's encoding). # Instead, we make sure that it is decoded using the # (0008,0005) tag of the dataset sequence = ds[0x32, 0x1064][0] assert ["shift_jis", "iso2022_jp"] == sequence._character_set assert "ヤマダ^タロウ=山田^太郎=やまだ^たろう" == sequence.PatientName def test_inherited_character_set_in_sequence(self): """charset: can read and decode SQ with parent encoding.............""" ds = dcmread(get_charset_files("chrSQEncoding1.dcm")[0]) ds.decode() # These datasets inside of the SQ shall be decoded with the parent # dataset's encoding sequence = ds[0x32, 0x1064][0] assert ["shift_jis", "iso2022_jp"] == sequence._character_set assert "ヤマダ^タロウ=山田^太郎=やまだ^たろう" == sequence.PatientName def test_standard_file(self): """charset: can read and decode standard file without special char..""" ds = dcmread(get_testdata_file("CT_small.dcm")) ds.decode() assert "CompressedSamples^CT1" == ds.PatientName def test_invalid_character_set(self, allow_reading_invalid_values): """charset: replace invalid encoding with default encoding""" ds = dcmread(get_testdata_file("CT_small.dcm")) ds._read_charset = None ds.SpecificCharacterSet = "UNSUPPORTED" with pytest.warns( UserWarning, match=("Unknown encoding 'UNSUPPORTED' - using default encoding instead"), ): ds.decode() assert "CompressedSamples^CT1" == ds.PatientName def test_invalid_character_set_enforce_valid(self, enforce_valid_values): """charset: raise on invalid encoding""" ds = dcmread(get_testdata_file("CT_small.dcm")) ds._read_charset = None ds.SpecificCharacterSet = "UNSUPPORTED" with pytest.raises(LookupError, match="Unknown encoding 'UNSUPPORTED'"): ds.decode() def test_decoding_with_specific_tags(self): """Decoding is correctly applied even if Specific Character Set is not in specific tags...""" rus_file = get_charset_files("chrRuss.dcm")[0] ds = dcmread(rus_file, specific_tags=["PatientName"]) ds.decode() assert 2 == len(ds) # specific character set is always decoded assert "Люкceмбypг" == ds.PatientName def test_bad_charset(self): """Test bad charset defaults to ISO IR 6""" # elem.value is PersonName elem = DataElement(0x00100010, "PN", "CITIZEN") pydicom.charset.decode_element(elem, ["ISO 2022 IR 126"]) assert "iso_ir_126" in elem.value.encodings assert "iso8859" not in elem.value.encodings # default encoding is iso8859 pydicom.charset.decode_element(elem, []) assert "iso8859" in elem.value.encodings def test_empty_charset(self): """Empty charset defaults to ISO IR 6""" elem = DataElement(0x00100010, "PN", "CITIZEN") pydicom.charset.decode_element(elem, [""]) assert ("iso8859",) == elem.value.encodings elem = DataElement(0x00100010, "PN", "CITIZEN") pydicom.charset.decode_element(elem, None) assert ("iso8859",) == elem.value.encodings def test_bad_encoded_single_encoding(self, allow_reading_invalid_values): """Test handling bad encoding for single encoding""" elem = DataElement(0x00100010, "PN", b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2") with pytest.warns( UserWarning, match="Failed to decode byte string with encoding 'UTF8'" ): pydicom.charset.decode_element(elem, ["ISO_IR 192"]) assert "���������" == elem.value def test_bad_encoded_single_encoding_enforce_standard(self, enforce_valid_values): """Test handling bad encoding for single encoding if config.settings.reading_validation_mode is RAISE.""" elem = DataElement(0x00100010, "PN", b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2") msg = ( "'utf.?8' codec can't decode byte 0xc4 in position 0: " "invalid continuation byte" ) with pytest.raises(UnicodeDecodeError, match=msg): pydicom.charset.decode_element(elem, ["ISO_IR 192"]) def test_code_extensions_not_allowed(self): """Test that UTF8 does not allow code extensions""" elem = DataElement(0x00100010, "PN", b"Buc^J\xc3\xa9r\xc3\xb4me") msg = ( "Value 'ISO_IR 192' for Specific Character Set does not " "allow code extensions, ignoring: ISO 2022 IR 100, " "ISO 2022 IR 144" ) with pytest.warns(UserWarning, match=msg): pydicom.charset.decode_element( elem, ["ISO_IR 192", "ISO 2022 IR 100", "ISO 2022 IR 144"] ) assert "Buc^Jérôme" == elem.value def test_convert_encodings_warnings(self): """Test warning if stand-alone encodings are used as code extension""" msg_iso = "Value 'ISO_IR 192' cannot be used as code extension, ignoring it" msg_gbk = "Value 'GBK' cannot be used as code extension, ignoring it" with pytest.warns(UserWarning, match=msg_iso): with pytest.warns(UserWarning, match=msg_gbk): encodings = pydicom.charset.convert_encodings( ["ISO_IR 126", "GBK", "ISO 2022 IR 144", "ISO_IR 192"] ) assert ["iso_ir_126", "iso_ir_144"] == encodings def test_convert_python_encodings(self): """Test that unknown encodings are returned unchanged by `convert_encodings`""" encodings = ["iso_ir_126", "iso_ir_144"] assert encodings == pydicom.charset.convert_encodings(encodings) def test_convert_empty_encoding(self): """Test that empty encodings are handled as default encoding""" encodings = "" assert ["iso8859"] == pydicom.charset.convert_encodings(encodings) encodings = [""] assert ["iso8859"] == pydicom.charset.convert_encodings(encodings) encodings = None assert ["iso8859"] == pydicom.charset.convert_encodings(encodings) def test_bad_decoded_multi_byte_encoding(self, allow_reading_invalid_values): """Test handling bad encoding for single encoding""" elem = DataElement( 0x00100010, "PN", b"\x1b$(D\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" ) with pytest.warns( UserWarning, match="Failed to decode byte string with encodings: iso2022_jp_2", ): pydicom.charset.decode_element(elem, ["ISO 2022 IR 159"]) assert "���������" == elem.value def test_bad_decoded_multi_byte_encoding_enforce_standard( self, enforce_valid_values ): """Test handling bad encoding for single encoding if `config.settings.reading_validation_mode` is RAISE""" elem = DataElement( 0x00100010, "PN", b"\x1b$(D\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" ) msg = ( "'iso2022_jp_2' codec can't decode byte 0xc4 in position 4: " "illegal multibyte sequence" ) with pytest.raises(UnicodeDecodeError, match=msg): pydicom.charset.decode_element(elem, ["ISO 2022 IR 159"]) def test_unknown_escape_sequence(self, allow_reading_invalid_values): """Test handling bad encoding for single encoding""" elem = DataElement( 0x00100010, "PN", b"\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" ) with pytest.warns( UserWarning, match="Found unknown escape sequence in encoded string value", ): pydicom.charset.decode_element(elem, ["ISO_IR 100"]) assert "\x1b-FÄéïíõóéïò" == elem.value def test_unknown_escape_sequence_enforce_standard(self, enforce_valid_values): """Test handling bad encoding for single encoding if `config.settings.reading_validation_mode` is RAISE""" elem = DataElement( 0x00100010, "PN", b"\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" ) with pytest.raises( ValueError, match="Found unknown escape sequence in encoded string value" ): pydicom.charset.decode_element(elem, ["ISO_IR 100"]) def test_patched_charset(self, allow_reading_invalid_values): """Test some commonly misspelled charset values""" elem = DataElement(0x00100010, "PN", b"Buc^J\xc3\xa9r\xc3\xb4me") pydicom.charset.decode_element(elem, ["ISO_IR 192"]) # correct encoding assert "Buc^Jérôme" == elem.value # patched encoding shall behave correctly, but a warning is issued elem = DataElement(0x00100010, "PN", b"Buc^J\xc3\xa9r\xc3\xb4me") with pytest.warns( UserWarning, match="Incorrect value for Specific Character Set " "'ISO IR 192' - assuming 'ISO_IR 192'", ): pydicom.charset.decode_element(elem, ["ISO IR 192"]) assert "Buc^Jérôme" == elem.value elem = DataElement(0x00100010, "PN", b"Buc^J\xe9r\xf4me") with pytest.warns( UserWarning, match="Incorrect value for Specific Character Set " "'ISO-IR 144' - assuming 'ISO_IR 144'", ) as w: pydicom.charset.decode_element(elem, ["ISO_IR 100", "ISO-IR 144"]) # make sure no warning is issued for the correct value assert 1 == len(w) # not patched incorrect encoding is replaced by default encoding elem = DataElement(0x00100010, "PN", b"Buc^J\xc3\xa9r\xc3\xb4me") with pytest.warns( UserWarning, match="Unknown encoding 'ISOIR 192' - using default encoding instead", ): pydicom.charset.decode_element(elem, ["ISOIR 192"]) # Python encoding also can be used directly elem = DataElement(0x00100010, "PN", b"Buc^J\xc3\xa9r\xc3\xb4me") pydicom.charset.decode_element(elem, ["utf8"]) assert "Buc^Jérôme" == elem.value def test_patched_code_extension_charset(self): """Test some commonly misspelled charset values for code extensions.""" elem = DataElement( 0x00100010, "PN", b"Dionysios=\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2", ) # correct encoding pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 126"]) assert "Dionysios=Διονυσιος" == elem.value # patched encoding shall behave correctly, but a warning is issued with pytest.warns( UserWarning, match="Incorrect value for Specific Character Set " "'ISO_2022-IR 100' - assuming " "'ISO 2022 IR 100'", ): elem = DataElement( 0x00100010, "PN", b"Dionysios=\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2", ) pydicom.charset.decode_element(elem, ["ISO_2022-IR 100", "ISO 2022 IR 126"]) assert "Dionysios=Διονυσιος" == elem.value with pytest.warns( UserWarning, match=r"Incorrect value for Specific Character Set " r"'ISO_2022_IR\+126' - assuming " r"'ISO 2022 IR 126'", ): elem = DataElement( 0x00100010, "PN", b"Dionysios=\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2", ) pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO_2022_IR+126"]) assert "Dionysios=Διονυσιος" == elem.value def test_multi_charset_default_value(self): """Test that the first value is used if no escape code is given""" # regression test for #707 elem = DataElement(0x00100010, "PN", b"Buc^J\xe9r\xf4me") pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 144"]) assert "Buc^Jérôme" == elem.value elem = DataElement(0x00081039, "LO", b"R\xf6ntgenaufnahme") pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 144"]) assert "Röntgenaufnahme" == elem.value def test_single_byte_multi_charset_personname(self): # component groups with different encodings elem = DataElement( 0x00100010, "PN", b"Dionysios=\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2", ) pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 126"]) assert "Dionysios=Διονυσιος" == elem.value # multiple values with different encodings encoded = ( b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3" ) elem = DataElement(0x00100060, "PN", encoded) pydicom.charset.decode_element( elem, ["ISO 2022 IR 100", "ISO 2022 IR 144", "ISO 2022 IR 126"] ) assert ["Buc^Jérôme", "Διονυσιος", "Люкceмбypг"] == elem.value def test_single_byte_multi_charset_text(self): # changed encoding inside the string elem = DataElement( 0x00081039, "LO", b"Dionysios is \x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2", ) pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 126"]) assert "Dionysios is Διονυσιος" == elem.value # multiple values with different encodings elem = DataElement( 0x00081039, "LO", b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3", ) pydicom.charset.decode_element( elem, ["ISO 2022 IR 100", "ISO 2022 IR 144", "ISO 2022 IR 126"] ) assert ["Buc^Jérôme", "Διονυσιος", "Люкceмбypг"] == elem.value @pytest.mark.parametrize("encoding, decoded, raw_data", ENCODED_NAMES) def test_single_byte_code_extensions(self, encoding, decoded, raw_data): # single-byte encoding as code extension elem = DataElement(0x00100010, "PN", b"ASCII+" + raw_data) pydicom.charset.decode_element(elem, ["", encoding]) assert "ASCII+" + decoded == elem.value def test_missing_escape_for_single_byte_code_extensions(self): # missing escape sequence after component delimiter raw_data = b"\x1b\x29\x49\xd4\xcf\xc0\xde\x5e\xc0\xdb\xb3" elem = DataElement(0x00100010, "PN", b"ASCII+" + raw_data) pydicom.charset.decode_element(elem, ["", "ISO 2022 IR 13"]) # the last part is decoded as Latin1 assert "ASCII+ヤマダ^ÀÛ³" == elem.value @pytest.mark.parametrize("filename, patient_name", FILE_PATIENT_NAMES) def test_charset_patient_names(self, filename, patient_name): """Test patient names are correctly decoded and encoded.""" # check that patient names are correctly read file_path = get_charset_files(filename + ".dcm")[0] ds = dcmread(file_path) ds.decode() assert patient_name == ds.PatientName # check that patient names are correctly written back fp = DicomBytesIO() ds.save_as(fp, enforce_file_format=True, implicit_vr=False) fp.seek(0) ds = dcmread(fp) assert patient_name == ds.PatientName # check that patient names are correctly written back # without original byte string (PersonName only) if hasattr(ds.PatientName, "original_string"): ds.PatientName.original_string = None fp = DicomBytesIO() ds.save_as(fp, enforce_file_format=True) fp.seek(0) ds = dcmread(fp) assert patient_name == ds.PatientName def test_changed_character_set(self): # Regression test for #629 multiPN_name = get_charset_files("chrFrenMulti.dcm")[0] ds = dcmread(multiPN_name) # is Latin-1 ds.SpecificCharacterSet = "ISO_IR 192" from pydicom.filebase import DicomBytesIO fp = DicomBytesIO() ds.save_as(fp, enforce_file_format=True) fp.seek(0) ds_out = dcmread(fp) # we expect UTF-8 encoding here assert b"Buc^J\xc3\xa9r\xc3\xb4me" == ds_out.get_item(0x00100010).value def test_invalid_second_encoding(self, allow_reading_invalid_values): # regression test for #850 elem = DataElement(0x00100010, "PN", "CITIZEN") with pytest.warns( UserWarning, match="Unknown encoding 'ISO 2022 IR 146' " "- using default encoding instead", ): pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 146"]) def test_invalid_second_encoding_strict(self, enforce_valid_values): elem = DataElement(0x00100010, "PN", "CITIZEN") with pytest.raises(LookupError, match="Unknown encoding 'ISO 2022 IR 146'"): pydicom.charset.decode_element(elem, ["ISO 2022 IR 100", "ISO 2022 IR 146"]) def test_japanese_multi_byte_personname(self): """Test japanese person name which has multi byte strings are correctly encoded.""" file_path = get_charset_files("chrH32.dcm")[0] ds = dcmread(file_path) ds.decode() if hasattr(ds.PatientName, "original_string"): original_string = ds.PatientName.original_string ds.PatientName.original_string = None fp = DicomBytesIO() ds.save_as(fp, enforce_file_format=True, implicit_vr=False) fp.seek(0) ds_out = dcmread(fp) assert original_string == ds_out.PatientName.original_string japanese_pn = PersonName("Mori^Ogai=森^鷗外=もり^おうがい") pyencs = pydicom.charset.convert_encodings( ["ISO 2022 IR 6", "ISO 2022 IR 87", "ISO 2022 IR 159"] ) actual_encoded = bytes(japanese_pn.encode(pyencs)) expect_encoded = ( b"\x4d\x6f\x72\x69\x5e\x4f\x67\x61\x69\x3d\x1b\x24\x42\x3f" b"\x39\x1b\x28\x42\x5e\x1b\x24\x28\x44\x6c\x3f\x1b\x24\x42" b"\x33\x30\x1b\x28\x42\x3d\x1b\x24\x42\x24\x62\x24\x6a\x1b" b"\x28\x42\x5e\x1b\x24\x42\x24\x2a\x24\x26\x24\x2c\x24\x24" b"\x1b\x28\x42" ) assert expect_encoded == actual_encoded def test_japanese_multi_byte_encoding(self): """Test japanese multi byte strings are correctly encoded.""" encoded = pydicom.charset.encode_string( "あaアア齩", ["shift_jis", "iso2022_jp", "iso2022_jp_2"] ) expect = b'\x1b$B$"\x1b(Ja\x1b)I\xb1\x1b$B%"\x1b$(DmN\x1b(J' assert expect == bytes(encoded) def test_bad_japanese_encoding(self): """Test japanese multi byte strings are not correctly encoded.""" with pytest.warns( UserWarning, match="Failed to encode value with encodings" ": shift_jis - using replacement character" "s in encoded string", ): encoded = pydicom.charset.encode_string("あaアア", ["shift_jis"]) assert b"?a??" == encoded pydicom-pydicom-20aa4b7/tests/test_cli.py000066400000000000000000000165451515706620200205630ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Tests for command-line interface""" from argparse import ArgumentTypeError import pytest from pydicom.cli.main import filespec_parser, eval_element, main, filespec_parts bad_elem_specs = ( "extra:colon", "no_callable()", "no_equals = ", "BeamSequence[0]extra", # must match to end of string "BeamSequence[x]", # index must be an int ) missing_elements = ( "NotThere", "BeamSequenceXX", "BeamDose", # valid keyword but not at top level ) bad_indexes = ( "BeamSequence[42]", "BeamSequence[-42]", ) class TestFilespec: @pytest.mark.parametrize("bad_spec", bad_elem_specs) def test_syntax(self, bad_spec): """Invalid syntax for for CLI file:element spec raises error""" with pytest.raises(ArgumentTypeError, match=r".* syntax .*"): filespec_parser(f"pydicom::rtplan.dcm::{bad_spec}") @pytest.mark.parametrize("missing_element", missing_elements) def test_elem_not_exists(self, missing_element): """CLI filespec elements not in the dataset raise an error""" with pytest.raises(ArgumentTypeError, match=r".* is not in the dataset"): filespec_parser(f"pydicom::rtplan.dcm::{missing_element}") @pytest.mark.parametrize("bad_index", bad_indexes) def test_bad_index(self, bad_index): """CLI filespec elements with an invalid index raise an error""" with pytest.raises(ArgumentTypeError, match=r".* index error"): filespec_parser(f"pydicom::rtplan.dcm::{bad_index}") def test_offers_pydicom_testfile(self): """CLI message offers pydicom data file if file not found""" with pytest.raises( ArgumentTypeError, match=r".*pydicom::rtplan\.dcm.*is available.*" ): filespec_parser("rtplan.dcm") def test_colons(self): """CLI filespec with a colon in filename works correctly""" expected = ("", r"c:\test.dcm", "") assert expected == filespec_parts(r"c:\test.dcm") expected = ("pydicom", r"c:\test.dcm", "") assert expected == filespec_parts(r"pydicom::c:\test.dcm") filespec = r"pydicom::c:\test.dcm::StudyDate" expected = ("pydicom", r"c:\test.dcm", "StudyDate") assert expected == filespec_parts(filespec) filespec = r"c:\test.dcm::StudyDate" expected = ("", r"c:\test.dcm", "StudyDate") assert expected == filespec_parts(filespec) class TestFilespecElementEval: # Load plan once plan, _ = filespec_parser("pydicom::rtplan.dcm")[0] def test_correct_values(self): """CLI produces correct evaluation of requested element""" # A nested data element elem_str = "BeamSequence[0].ControlPointSequence[0].NominalBeamEnergy" elem_val = eval_element(self.plan, elem_str) assert 6.0 == elem_val # A nested Sequence item elem_str = "BeamSequence[0].ControlPointSequence[0]" elem_val = eval_element(self.plan, elem_str) assert 6.0 == elem_val.NominalBeamEnergy # A nested Sequence itself elem_str = "BeamSequence[0].ControlPointSequence" elem_val = eval_element(self.plan, elem_str) assert 6.0 == elem_val[0].NominalBeamEnergy # A non-nested data element elem_str = "PatientID" elem_val = eval_element(self.plan, elem_str) assert "id00001" == elem_val # The file_meta or file_meta data element elem_str = "file_meta" elem_val = eval_element(self.plan, elem_str) assert "RT Plan Storage" == elem_val.MediaStorageSOPClassUID.name elem_str = "file_meta.MediaStorageSOPClassUID" elem_val = eval_element(self.plan, elem_str) assert "RT Plan Storage" == elem_val.name class TestCLIcall: """Test calls to `pydicom` command-line interface""" def test_bare_command(self, capsys): """CLI `pydicom` with no arguments displays help""" main([]) out, _ = capsys.readouterr() assert out.startswith("usage: pydicom [-h] {") def test_codify_command(self, capsys): """CLI `codify` command prints correct output""" # With private elements main("codify -p pydicom::nested_priv_SQ.dcm".split()) out, _ = capsys.readouterr() assert "add_new((0x0001, 0x0001)" in out # Without private elements main("codify pydicom::nested_priv_SQ.dcm".split()) out, _ = capsys.readouterr() assert "add_new((0x0001, 0x0001)" not in out def test_codify_data_element(self, capsys): """CLI `codify` command raises error if not a Dataset""" with pytest.raises(NotImplementedError): main("codify pydicom::rtplan.dcm::RTPlanLabel".split()) def test_codify_UTF8(self, capsys): """CLI `codify` command creates code with utf-8 characters""" main("codify pydicom::chrFren.dcm".split()) out, _ = capsys.readouterr() assert out.startswith("# -*- coding: utf-8 -*-") assert "Buc^Jérôme" in out def test_help(self, capsys): """CLI `help` command gives expected output""" # With subcommand main("help show".split()) out, err = capsys.readouterr() assert out.startswith("usage: pydicom show [-h] [") assert err == "" # No subcommand following main(["help"]) out, _ = capsys.readouterr() assert "Available subcommands:" in out # Non-existent subcommand following main("help DoesntExist".split()) out, _ = capsys.readouterr() assert "Available subcommands:" in out def test_show_command(self, capsys): """CLI `show` command prints correct output""" main("show pydicom::MR_small_RLE.dcm".split()) out, err = capsys.readouterr() assert "Instance Creation Date DA: '20040826'" in out assert out.endswith("OB: Array of 126 elements\n") assert err == "" # Get a specific data element main("show pydicom::MR_small_RLE.dcm::LargestImagePixelValue".split()) out, _ = capsys.readouterr() assert "4000" == out.strip() def test_show_options(self, capsys): """CLI `show` command with options prints correct output""" # Quiet option, image file main("show -q pydicom::MR_small_RLE.dcm".split()) out, err = capsys.readouterr() assert out.startswith("SOPClassUID: MR Image Storage") assert out.endswith("Rows: 64\nColumns: 64\nSliceLocation: 0.0000\n") assert err == "" # 'Quiet' option, RTPLAN file main("show -q pydicom::rtplan.dcm".split()) out, err = capsys.readouterr() assert out.endswith( "Beam 1 'Field 1' TREATMENT STATIC PHOTON energy 6.00000000000000 " "gantry 0.0, coll 0.0, couch 0.0 " "(0 wedges, 0 comps, 0 boli, 0 blocks)\n" ) assert err == "" # Top-level-only option, also different file for more variety main("show -t pydicom::nested_priv_SQ.dcm".split()) out, err = capsys.readouterr() assert "(0001,0001) Private Creator" in out assert "UN: b'Nested SQ'" not in out assert err == "" # Exclude private option main("show -x pydicom::nested_priv_SQ.dcm".split()) out, err = capsys.readouterr() assert "(0001,0001) Private Creator" not in out assert err == "" pydicom-pydicom-20aa4b7/tests/test_codes.py000066400000000000000000000241611515706620200211020ustar00rootroot00000000000000import pytest from pydicom.sr._cid_dict import ( cid_concepts as CID_CONCEPTS, name_for_cid, ) from pydicom.sr._concepts_dict import concepts as CONCEPTS from pydicom.sr.coding import Code from pydicom.sr.codedict import ( codes, Collection, Concepts, ) @pytest.fixture() def ambiguous_scheme(): """Add a scheme to the CID concepts dict that contains a duplicate attr""" cid = 6129 attr = CID_CONCEPTS[cid]["SCT"][0] assert "FOO" not in CID_CONCEPTS[cid] CID_CONCEPTS[cid]["FOO"] = [attr] yield attr, cid del CID_CONCEPTS[cid]["FOO"] @pytest.fixture() def add_nonunique(): """Add a non-unique keyword to the concepts dict""" CONCEPTS["TEST"] = { "Foo": {"BAR": ("Test A", [99999999999]), "BAZ": ("Test B", [99999999999])} } yield del CONCEPTS["TEST"] @pytest.fixture() def add_nonunique_cid(): """Add a non-unique keyword to the CIDs dict""" CONCEPTS["TEST"] = { "Foo": {"BAR": ("Test A", [99999999999]), "BAZ": ("Test B", [99999999999])} } CID_CONCEPTS[99999999999] = {"TEST": ["Foo", "Foo"]} name_for_cid[99999999999] = "Test" yield del CONCEPTS["TEST"] del CID_CONCEPTS[99999999999] del name_for_cid[99999999999] @pytest.fixture() def add_multiple_cid(): """Add multiple codes for a keyword, but with different CIDs""" CONCEPTS["TEST"] = { "Foo": { "BAR": ("Test A", [99999999999]), "BAZ": ("Test B", [99999999998]), }, } CID_CONCEPTS[99999999999] = {"TEST": ["Foo"]} name_for_cid[99999999999] = "Test" yield del CONCEPTS["TEST"] del CID_CONCEPTS[99999999999] del name_for_cid[99999999999] class TestCode: def setup_method(self): self._value = "373098007" self._meaning = "Mean Value of population" self._scheme_designator = "SCT" def test_construction_kwargs(self): c = Code( value=self._value, scheme_designator=self._scheme_designator, meaning=self._meaning, ) assert c.value == self._value assert c.scheme_designator == self._scheme_designator assert c.meaning == self._meaning assert c.scheme_version is None def test_use_as_dictionary_key(self): c = Code( value=self._value, scheme_designator=self._scheme_designator, meaning=self._meaning, ) d = {c: 1} assert c in d.keys() def test_construction_kwargs_optional(self): version = "v1.0" c = Code( value=self._value, scheme_designator=self._scheme_designator, meaning=self._meaning, scheme_version=version, ) assert c.value == self._value assert c.scheme_designator == self._scheme_designator assert c.meaning == self._meaning assert c.scheme_version == version def test_construction_args(self): c = Code(self._value, self._scheme_designator, self._meaning) assert c.value == self._value assert c.scheme_designator == self._scheme_designator assert c.meaning == self._meaning assert c.scheme_version is None def test_construction_args_optional(self): version = "v1.0" c = Code(self._value, self._scheme_designator, self._meaning, version) assert c.value == self._value assert c.scheme_designator == self._scheme_designator assert c.meaning == self._meaning assert c.scheme_version == version def test_equal(self): c1 = Code(self._value, self._scheme_designator, self._meaning) c2 = Code(self._value, self._scheme_designator, self._meaning) assert c1 == c2 def test_not_equal(self): c1 = Code(self._value, self._scheme_designator, self._meaning) c2 = Code("373099004", "SCT", "Median Value of population") assert c1 != c2 def test_equal_ignore_meaning(self): c1 = Code(self._value, self._scheme_designator, self._meaning) c2 = Code(self._value, self._scheme_designator, "bla bla bla") assert c1 == c2 def test_equal_equivalent_coding(self): c1 = Code(self._value, self._scheme_designator, self._meaning) c2 = Code("R-00317", "SRT", self._meaning) assert c1 == c2 assert c2 == c1 def test_equal_not_in_snomed_mapping(self): c1 = Code(self._value, self._scheme_designator, self._meaning) c2 = Code("bla bal bla", "SRT", self._meaning) assert c1 != c2 assert c2 != c1 class TestCollection: """Tests for Collection""" def test_init(self): """Test creation of new collections""" coll = Collection("SCT") assert coll.name == "SCT" assert coll.scheme_designator == "SCT" assert coll.is_cid is False coll = Collection("CID2") assert coll.name == "CID2" assert coll.scheme_designator == "CID2" assert coll.is_cid is True def test_concepts(self): """Test Collection.concepts""" coll = Collection("UCUM") assert coll._concepts == {} concepts = coll.concepts assert coll._concepts != {} assert concepts["Second"] == Code( "s", scheme_designator="UCUM", meaning="second" ) coll = Collection("CID2") assert coll.concepts["Transverse"] == Code( "62824007", scheme_designator="SCT", meaning="Transverse" ) def test_contains(self): """Test the in operator""" coll = Collection("UCUM") assert "Second" in coll assert "Foo" not in coll coll = Collection("CID2") assert "Transverse" in coll assert "Foo" not in coll c = Code("24028007", "SCT", "Right") assert c in codes.CID244 assert c in codes.SCT def test_dir(self): """Test dir()""" coll = Collection("UCUM") assert "Second" in dir(coll) assert "Foo" not in dir(coll) coll = Collection("CID2") assert "Transverse" in dir(coll) assert "Foo" not in dir(coll) coll = Collection("CID4") matches = coll.dir("Thoracic") assert "CervicoThoracicSpine" in matches assert "IntraThoracic" in matches assert "StructureOfDescendingThoracicAorta" in matches assert "ThoracicSpine" in matches # Check None_ coll = Collection("CID606") assert "None_" in coll assert "None_" in dir(coll) # Check _125Iodine coll = Collection("CID18") assert "_125Iodine" in coll assert "_125Iodine" in dir(coll) def test_getattr(self): """Test Collection.Foo""" coll = Collection("UCUM") assert coll.Second == Code("s", scheme_designator="UCUM", meaning="second") msg = "No matching code for keyword 'Foo' in scheme 'UCUM'" with pytest.raises(AttributeError, match=msg): coll.Foo coll = Collection("CID2") assert coll.Transverse == Code( "62824007", scheme_designator="SCT", meaning="Transverse" ) msg = "No matching code for keyword 'Foo' in CID2" with pytest.raises(AttributeError, match=msg): coll.Foo coll.foo = None assert coll.foo is None def test_getattr_multiple_cid(self, add_multiple_cid): """Test Collection.Foo for a CID""" coll = Collection("CID99999999999") assert coll.Foo == Code("BAR", scheme_designator="TEST", meaning="Test A") def test_getattr_multiple_raises(self, add_nonunique): """Test non-unique results for the keyword""" coll = Collection("TEST") msg = "Multiple codes found for keyword 'Foo' in scheme 'TEST': BAR, BAZ" with pytest.raises(RuntimeError, match=msg): coll.Foo def test_getattr_multiple_raises_cid(self, add_nonunique_cid): """Test non-unique results for the keyword""" coll = Collection("CID99999999999") msg = "Multiple codes found for keyword 'Foo' in CID99999999999: BAR, BAZ" with pytest.raises(RuntimeError, match=msg): coll.Foo coll._cid_data["TEST2"] = ["Foo"] msg = ( "Multiple schemes found to contain the keyword 'Foo' in CID99999999999: " "TEST, TEST2" ) with pytest.raises(RuntimeError, match=msg): coll.Foo def test_repr(self): """Test repr()""" coll = Collection("UCUM") assert ( "Second = Code(value='s', scheme_designator='UCUM', meaning='second', " "scheme_version=None)" ) in repr(coll) coll = Collection("CID2") assert ( "Transverse = Code(value='62824007', scheme_designator='SCT', " "meaning='Transverse', scheme_version=None)" ) in repr(coll) def test_str(self): """Test str()""" coll = Collection("UCUM") assert ( "Second s " " second\n" ) in str(coll) coll = Collection("CID2") assert "Transverse 62824007 SCT Transverse\n" in str(coll) def test_trait_names(self): """Test trait_names()""" traits = Collection("UCUM").trait_names() assert "Second" in traits assert "Foo" not in traits traits = Collection("CID2").trait_names() assert "Transverse" in traits assert "Foo" not in traits class TestConcepts: """Tests for Concepts""" def test_init(self): """Test creating a new instance""" colls = Concepts([Collection("SCT"), Collection("CID2")]) assert list(colls.collections) == ["SCT", "CID2"] assert colls.schemes() == ["SCT"] assert colls.CIDs() == ["CID2"] def test_getattr(self): """Test Concepts.Foo""" colls = Concepts([Collection("SCT"), Collection("CID2")]) assert isinstance(colls.SCT, Collection) assert isinstance(colls.CID2, Collection) colls.foo = None assert colls.foo is None msg = "'Concepts' object has no attribute 'Foo'" with pytest.raises(AttributeError, match=msg): colls.Foo pydicom-pydicom-20aa4b7/tests/test_config.py000066400000000000000000000130721515706620200212510ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.config module.""" import logging import importlib import pytest from pydicom import dcmread from pydicom.config import debug from pydicom.data import get_testdata_file from pydicom import config from pydicom.dataelem import RawDataElement, convert_raw_data_element from pydicom.dataset import Dataset from pydicom.tag import Tag DS_PATH = get_testdata_file("CT_small.dcm") PYTEST = [int(x) for x in pytest.__version__.split(".")] class TestDebug: """Tests for config.debug().""" def setup_method(self): self.logger = logging.getLogger("pydicom") def teardown_method(self): # Reset to just NullHandler self.logger.handlers = [self.logger.handlers[0]] def test_default(self, caplog): """Test that the default logging handler is a NullHandler.""" assert 1 == len(self.logger.handlers) assert isinstance(self.logger.handlers[0], logging.NullHandler) with caplog.at_level(logging.DEBUG, logger="pydicom"): dcmread(DS_PATH) assert "Call to dcmread()" not in caplog.text assert "Reading File Meta Information preamble..." in caplog.text assert "Reading File Meta Information prefix..." in caplog.text assert "00000080: 'DICM' prefix found" in caplog.text def test_debug_on_handler_null(self, caplog): """Test debug(True, False).""" debug(True, False) assert 1 == len(self.logger.handlers) assert isinstance(self.logger.handlers[0], logging.NullHandler) with caplog.at_level(logging.DEBUG, logger="pydicom"): dcmread(DS_PATH) assert "Call to dcmread()" in caplog.text assert "Reading File Meta Information preamble..." in caplog.text assert "Reading File Meta Information prefix..." in caplog.text assert "00000080: 'DICM' prefix found" in caplog.text msg = ( "0000989c: fc ff fc ff 4f 42 00 00 7e 00 00 00 " "(FFFC,FFFC) OB Length: 126" ) assert msg in caplog.text def test_debug_off_handler_null(self, caplog): """Test debug(False, False).""" debug(False, False) assert 1 == len(self.logger.handlers) assert isinstance(self.logger.handlers[0], logging.NullHandler) with caplog.at_level(logging.DEBUG, logger="pydicom"): dcmread(DS_PATH) assert "Call to dcmread()" not in caplog.text assert "Reading File Meta Information preamble..." in caplog.text assert "Reading File Meta Information prefix..." in caplog.text assert "00000080: 'DICM' prefix found" in caplog.text def test_debug_on_handler_stream(self, caplog): """Test debug(True, True).""" debug(True, True) assert 2 == len(self.logger.handlers) assert isinstance(self.logger.handlers[0], logging.NullHandler) assert isinstance(self.logger.handlers[1], logging.StreamHandler) with caplog.at_level(logging.DEBUG, logger="pydicom"): dcmread(DS_PATH) assert "Call to dcmread()" in caplog.text assert "Reading File Meta Information preamble..." in caplog.text assert "Reading File Meta Information prefix..." in caplog.text assert "00000080: 'DICM' prefix found" in caplog.text msg = ( "0000989c: fc ff fc ff 4f 42 00 00 7e 00 00 00 " "(FFFC,FFFC) OB Length: 126" ) assert msg in caplog.text def test_debug_off_handler_stream(self, caplog): """Test debug(False, True).""" debug(False, True) assert 2 == len(self.logger.handlers) assert isinstance(self.logger.handlers[0], logging.NullHandler) assert isinstance(self.logger.handlers[1], logging.StreamHandler) with caplog.at_level(logging.DEBUG, logger="pydicom"): dcmread(DS_PATH) assert "Call to dcmread()" not in caplog.text assert "Reading File Meta Information preamble..." in caplog.text assert "Reading File Meta Information prefix..." in caplog.text assert "00000080: 'DICM' prefix found" in caplog.text @pytest.fixture(scope="function", params=["config", "env"]) def future_setter(request, monkeypatch): if request.param == "config": config.future_behavior() yield else: monkeypatch.setenv("PYDICOM_FUTURE", "True") importlib.reload(config) yield config.future_behavior(False) class TestFuture: def test_reload(self): importlib.reload(config) assert not config._use_future def test_invalid_keyword_raise(self, future_setter): ds = Dataset() with pytest.raises(ValueError): ds.bitsStored = 42 class TestSettings: @pytest.fixture def enforce_valid_values(self): config.enforce_valid_values = True yield config.enforce_valid_values = False def test_default_for_reading_validation_mode(self): raw = RawDataElement(Tag(0x88880002), None, 4, b"unknown", 0, True, True) with pytest.warns(UserWarning): convert_raw_data_element(raw) def test_reading_validation_mode_with_enforce_valid_values( self, enforce_valid_values ): raw = RawDataElement(Tag(0x88880002), None, 4, b"unknown", 0, True, True) msg = r"VR lookup failed for the raw element with tag \(8888,0002\)" with pytest.raises(KeyError, match=msg): convert_raw_data_element(raw) pydicom-pydicom-20aa4b7/tests/test_data_manager.py000066400000000000000000000300141515706620200224020ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Unit tests for pydicom.data_manager""" import json import os from os.path import basename from pathlib import Path import shutil from tempfile import TemporaryDirectory import pytest from pydicom.data import ( get_charset_files, get_testdata_files, get_palette_files, fetch_data_files, ) from pydicom.data.data_manager import ( DATA_ROOT, get_testdata_file, external_data_sources, ) from pydicom.data import download from pydicom.data.download import get_data_dir, calculate_file_hash, get_cached_filehash EXT_PYDICOM = "pydicom-data" in external_data_sources() if EXT_PYDICOM: DATA_SRC = external_data_sources()["pydicom-data"].data_path try: with open(DATA_SRC / "test", "wb") as f: pass os.remove(DATA_SRC / "test") IS_WRITEABLE = True except Exception: IS_WRITEABLE = False @pytest.fixture def download_failure(): """Simulate a download failure.""" download._SIMULATE_NETWORK_OUTAGE = True yield download._SIMULATE_NETWORK_OUTAGE = False class TestGetData: def test_get_dataset(self): """Test the different functions to get lists of data files.""" # The cached files downloaded from the pydicom-data repo cached_data_test_files = str(get_data_dir()) # If pydicom-data is available locally ext_path = None if "pydicom-data" in external_data_sources(): ext_path = os.fspath(external_data_sources()["pydicom-data"].data_path) # Test base locations charbase = os.path.join(DATA_ROOT, "charset_files") assert os.path.exists(charbase) testbase = os.path.join(DATA_ROOT, "test_files") assert os.path.exists(testbase) # Test file get chardata = get_charset_files() assert 15 < len(chardata) # Test that top level file is included bases = [basename(x) for x in chardata] # Test that subdirectory files included testdata = get_testdata_files() bases = [basename(x) for x in testdata] assert "2693" in bases assert 70 < len(testdata) # The files should be from their respective bases for x in testdata: # Don't check files from external sources other than pydicom-data if ( testbase not in x and cached_data_test_files not in x and (ext_path not in x if ext_path else True) ): continue assert ( testbase in x or cached_data_test_files in x or (ext_path in x if ext_path else False) ) for x in chardata: assert charbase in x def test_get_dataset_pattern(self): """Test that pattern is working properly.""" pattern = "CT_small*" filename = get_testdata_files(pattern) assert filename[0].endswith("CT_small.dcm") pattern = "chrX1*" filename = get_charset_files(pattern) assert filename[0].endswith("chrX1.dcm") def test_get_testdata_file(self): """Test that file name is working properly.""" p = Path(get_testdata_file("DICOMDIR")) assert "DICOMDIR" == p.name.upper() def test_get_palette_files(self): """Test data_manager.get_palette_files.""" palbase = os.path.join(DATA_ROOT, "palettes") assert os.path.exists(palbase) palettes = get_palette_files("*.dcm") assert 8 == len(palettes) for x in palettes: assert palbase in x def test_no_absolute_path_in_get_testdata_file(self): msg = ( "'get_testdata_file' does not support absolute paths, " "as it only works with internal pydicom test data - " r"did you mean 'dcmread\(\"/foo/bar.dcm\"\)'?" ) with pytest.raises(ValueError, match=msg): get_testdata_file("/foo/bar.dcm") def test_no_absolute_path_in_get_testdata_files(self): msg = ( "'get_testdata_files' does not support absolute paths, as it only works " "with internal pydicom test data." ) with pytest.raises(ValueError, match=msg): get_testdata_files("/foo/*.dcm") @pytest.mark.skipif( not EXT_PYDICOM or not IS_WRITEABLE, reason="pydicom-data not installed or RO" ) class TestExternalDataSource: """Tests for the external data sources.""" def setup_method(self): self.dpath = external_data_sources()["pydicom-data"].data_path # Backup the 693_UNCI.dcm file self.src = self.dpath / "693_UNCI.dcm" self.tdir = TemporaryDirectory(ignore_cleanup_errors=True) self.dst = Path(self.tdir.name) / "PYTEST_BACKUP" shutil.copy(self.src, self.dst) def teardown_method(self): # Restore the backed-up file shutil.copy(self.dst, self.src) self.tdir.cleanup() if "mylib" in external_data_sources(): del external_data_sources()["mylib"] def as_posix(self, path): """Return `path` as a posix path""" return Path(path).as_posix() def test_get_testdata_file_local(self): """Test that local data path retrieved OK.""" fname = "CT_small.dcm" fpath = self.as_posix(get_testdata_file(fname)) assert "pydicom/data/test_files" in fpath def test_get_testdata_file_external(self): """Test that external data source preferred over cache.""" fname = "693_UNCI.dcm" fpath = self.as_posix(get_testdata_file(fname)) assert "data_store/data" in fpath def test_get_testdata_file_external_hash_mismatch(self): """Test that the external source is not used when hash is not OK.""" p = self.dpath / "693_UNCI.dcm" with open(p, "wb") as f: f.write(b"\x00\x01") ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) assert ext_hash != ref_hash fpath = self.as_posix(get_testdata_file(p.name)) assert ".pydicom/data" in fpath def test_get_testdata_file_external_hash_match(self): """Test that external source is used when hash is OK.""" fname = "693_UNCI.dcm" p = self.dpath / fname ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) assert ext_hash == ref_hash fpath = self.as_posix(get_testdata_file(fname)) assert "data_store/data" in fpath def test_get_testdata_file_external_ignore_hash(self): """Test that non-pydicom-data external source ignores hash check.""" external_data_sources()["mylib"] = external_data_sources()["pydicom-data"] p = self.dpath / "693_UNCI.dcm" with open(p, "wb") as f: f.write(b"\x00\x01") ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) assert ext_hash != ref_hash fpath = self.as_posix(get_testdata_file(p.name)) assert "data_store/data" in fpath def test_get_testdata_file_missing(self): """Test no such file available.""" fname = "MY_MISSING_FILE.dcm" assert get_testdata_file(fname) is None def test_get_testdata_files_local(self): """Test that local data paths retrieved OK.""" fname = "CT_small*" paths = get_testdata_files(fname) assert 1 == len(paths) assert "pydicom/data/test_files" in self.as_posix(paths[0]) def test_get_testdata_files_local_external_and_cache(self): """Test that local, external and cache paths retrieved OK.""" fname = "693*" paths = get_testdata_files(fname) assert 7 == len(paths) # Local preferred first assert "pydicom/data/test_files" in self.as_posix(paths[0]) # External source preferred second assert "data_store/data" in self.as_posix(paths[1]) # Cache source preferred last assert ".pydicom/data" in self.as_posix(paths[4]) def test_get_testdata_files_hash_match(self): """Test that the external source is not used when hash is not OK.""" p = self.dpath / "693_UNCI.dcm" ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) assert ext_hash == ref_hash fpaths = get_testdata_files("693_UNCI*") fpaths = [self.as_posix(p) for p in fpaths] assert 2 == len(fpaths) assert "data_store/data" in fpaths[0] assert ".pydicom/data" in fpaths[1] def test_get_testdata_files_hash_mismatch(self): """Test that the external source is not used when hash is not OK.""" p = self.dpath / "693_UNCI.dcm" with open(p, "wb") as f: f.write(b"\x00\x01") ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) assert ext_hash != ref_hash fpaths = get_testdata_files("693_UNCI*") fpaths = [self.as_posix(p) for p in fpaths] assert 1 == len(fpaths) assert ".pydicom/data" in fpaths[0] def test_get_testdata_files_external_ignore_hash(self): """Test that non-pydicom-data external source ignores hash check.""" external_data_sources()["mylib"] = external_data_sources()["pydicom-data"] p = self.dpath / "693_UNCI.dcm" with open(p, "wb") as f: f.write(b"\x00\x01") ext_hash = calculate_file_hash(p) ref_hash = get_cached_filehash(p.name) assert ext_hash != ref_hash fpaths = get_testdata_files("693_UNCI*") fpaths = [self.as_posix(p) for p in fpaths] assert 2 == len(fpaths) assert "data_store/data" in fpaths[0] assert ".pydicom/data" in fpaths[1] @pytest.mark.skipif(EXT_PYDICOM, reason="pydicom-data installed") class TestDownload: """Tests for the download module.""" def test_get_testdata_file_no_download(self, recwarn): """ Test that `data_path_with_download` is not called when `download=False`. """ fname = "693_UNCI.dcm" assert get_testdata_file(fname, download=False) is None assert not recwarn.list def test_get_testdata_file_network_outage(self, download_failure): """Test a network outage when using get_testdata_file.""" fname = "693_UNCI.dcm" msg = r"A download failure occurred while attempting to retrieve 693_UNCI.dcm" with pytest.warns(UserWarning, match=msg): assert get_testdata_file(fname) is None def test_get_testdata_files_network_outage(self, download_failure): """Test a network outage when using get_testdata_files.""" msg = ( r"One or more download failures occurred, the list of matching " r"file paths may be incomplete" ) with pytest.warns(UserWarning, match=msg): assert [] == get_testdata_files("693_UN*") def test_fetch_data_files(): """Test fetch_data_files().""" # Remove a single file from the cache cache = get_data_dir() path = cache / "693_J2KR.dcm" if path.exists(): path.unlink() assert not path.exists() fetch_data_files() assert path.exists() def test_fetch_data_files_download_failure(download_failure): """Test fetch_data_files() with download failures.""" msg = r"An error occurred downloading the following files:" with pytest.raises(RuntimeError, match=msg): fetch_data_files() def test_hashes(): """Test for duplicates in hashes.json.""" # We can't have case mixes because windows filenames are case insensitive root = Path(DATA_ROOT) with open(root / "hashes.json") as f: filenames = json.load(f).keys() filenames = [name.lower() for name in filenames] assert len(set(filenames)) == len(filenames) def test_urls(): """Test for duplicates in urls.json.""" # We can't have case mixes because windows filenames are case insensitive root = Path(DATA_ROOT) with open(root / "urls.json") as f: filenames = json.load(f).keys() filenames = [name.lower() for name in filenames] assert len(set(filenames)) == len(filenames) pydicom-pydicom-20aa4b7/tests/test_dataelem.py000066400000000000000000001702211515706620200215600ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.dataelem module.""" # Many tests of DataElement class are implied in test_dataset also import copy import datetime import math import io import platform import re import tempfile import pytest from pydicom import filewriter, config, dcmread from pydicom.charset import default_encoding from pydicom.data import get_testdata_file from pydicom.datadict import add_private_dict_entry from pydicom.dataelem import ( DataElement, RawDataElement, convert_raw_data_element, ) from pydicom.dataset import Dataset from pydicom.errors import BytesLengthException from pydicom.filebase import DicomBytesIO from pydicom.fileutil import read_buffer from pydicom.hooks import ( hooks, raw_element_value_retry, raw_element_value_fix_separator, ) from pydicom.multival import MultiValue from pydicom.tag import Tag, BaseTag from .test_util import save_private_dict from pydicom.uid import UID from pydicom.valuerep import BUFFERABLE_VRS, DSfloat, validate_value IS_WINDOWS = platform.system() == "Windows" class TestDataElement: """Tests for dataelem.DataElement.""" @pytest.fixture(autouse=True) def create_data(self, disable_value_validation): self.data_elementSH = DataElement((1, 2), "SH", "hello") self.data_elementIS = DataElement((1, 2), "IS", "42") self.data_elementDS = DataElement((1, 2), "DS", "42.00001") self.data_elementMulti = DataElement((1, 2), "DS", ["42.1", "42.2", "42.3"]) self.data_elementCommand = DataElement(0x00000000, "UL", 100) self.data_elementPrivate = DataElement(0x00090000, "UL", 101) self.data_elementRetired = DataElement(0x00080010, "SH", "102") config.use_none_as_empty_text_VR_value = False yield config.use_none_as_empty_text_VR_value = False @pytest.fixture def replace_un_with_known_vr(self): old_value = config.replace_un_with_known_vr config.replace_un_with_known_vr = True yield config.replace_un_with_known_vr = old_value def test_AT(self): """VR of AT takes Tag variants when set""" elem1 = DataElement("OffendingElement", "AT", 0x100010) elem2 = DataElement("OffendingElement", "AT", (0x10, 0x10)) elem3 = DataElement("FrameIncrementPointer", "AT", [0x540010, 0x540020]) elem4 = DataElement("OffendingElement", "AT", "PatientName") assert isinstance(elem1.value, BaseTag) assert isinstance(elem2.value, BaseTag) assert elem1.value == elem2.value == elem4.value assert elem1.value == 0x100010 assert isinstance(elem3.value, MultiValue) assert len(elem3.value) == 2 # Test also using Dataset, and check 0x00000000 works ds = Dataset() ds.OffendingElement = 0 assert isinstance(ds.OffendingElement, BaseTag) ds.OffendingElement = (0x0000, 0x0000) assert isinstance(ds.OffendingElement, BaseTag) assert ds.OffendingElement == 0 # An invalid Tag should throw an error with pytest.raises(OverflowError): _ = DataElement("OffendingElement", "AT", 0x100000000) def test_VM_1(self): """DataElement: return correct value multiplicity for VM > 1""" assert 3 == self.data_elementMulti.VM def test_VM_2(self): """DataElement: return correct value multiplicity for VM = 1""" assert 1 == self.data_elementIS.VM def test_DSFloat_conversion(self): """Test that strings are correctly converted if changing the value.""" assert isinstance(self.data_elementDS.value, DSfloat) assert isinstance(self.data_elementMulti.value[0], DSfloat) assert DSfloat("42.1") == self.data_elementMulti.value[0] # multi-value append/insert self.data_elementMulti.value.append("42.4") assert isinstance(self.data_elementMulti.value[3], DSfloat) assert DSfloat("42.4") == self.data_elementMulti.value[3] self.data_elementMulti.value.insert(0, "42.0") assert isinstance(self.data_elementMulti.value[0], DSfloat) assert DSfloat("42.0") == self.data_elementMulti.value[0] # change single value of multi-value self.data_elementMulti.value[3] = "123.4" assert isinstance(self.data_elementMulti.value[3], DSfloat) assert DSfloat("123.4") == self.data_elementMulti.value[3] def test_DSFloat_conversion_auto_format(self): """Test that strings are being auto-formatted correctly.""" data_element = DataElement((1, 2), "DS", DSfloat(math.pi, auto_format=True)) assert math.pi == data_element.value assert "3.14159265358979" == str(data_element.value) def test_backslash(self): """DataElement: String with '\\' sets multi-valued data_element.""" data_element = DataElement((1, 2), "DS", r"42.1\42.2\42.3") assert 3 == data_element.VM def test_UID(self): """DataElement: setting or changing UID results in UID type.""" ds = Dataset() ds.TransferSyntaxUID = "1.2.3" assert isinstance(ds.TransferSyntaxUID, UID) ds.TransferSyntaxUID += ".4.5.6" assert isinstance(ds.TransferSyntaxUID, UID) def test_keyword(self): """DataElement: return correct keyword""" assert "CommandGroupLength" == self.data_elementCommand.keyword assert "" == self.data_elementPrivate.keyword def test_retired(self): """DataElement: return correct is_retired""" assert self.data_elementCommand.is_retired is False assert self.data_elementRetired.is_retired is True assert self.data_elementPrivate.is_retired is False def test_name_group_length(self): """Test DataElement.name for Group Length element""" elem = DataElement(0x00100000, "LO", 12345) assert "Group Length" == elem.name def test_name_unknown_private(self): """Test DataElement.name with an unknown private element""" elem = DataElement(0x00110010, "LO", 12345) elem.private_creator = "TEST" assert "Private tag data" == elem.name elem = DataElement(0x00110F00, "LO", 12345) assert elem.tag.is_private assert elem.private_creator is None assert "Private tag data" == elem.name def test_name_unknown(self): """Test DataElement.name with an unknown element""" elem = DataElement(0x00000004, "LO", 12345) assert "" == elem.name def test_equality_standard_element(self): """DataElement: equality returns correct value for simple elements""" dd = DataElement(0x00100010, "PN", "ANON") assert dd == dd # noqa: PLR0124 Need to check equality with self ee = DataElement(0x00100010, "PN", "ANON") assert dd == ee # Check value ee.value = "ANAN" assert not dd == ee # Check tag ee = DataElement(0x00100011, "PN", "ANON") assert not dd == ee # Check VR ee = DataElement(0x00100010, "SH", "ANON") assert not dd == ee dd = DataElement(0x00080018, "UI", "1.2.3.4") ee = DataElement(0x00080018, "UI", "1.2.3.4") assert dd == ee ee = DataElement(0x00080018, "PN", "1.2.3.4") assert not dd == ee def test_equality_private_element(self): """DataElement: equality returns correct value for private elements""" dd = DataElement(0x01110001, "PN", "ANON") assert dd == dd # noqa: PLR0124 Need to check equality with self ee = DataElement(0x01110001, "PN", "ANON") assert dd == ee # Check value ee.value = "ANAN" assert not dd == ee # Check tag ee = DataElement(0x01110002, "PN", "ANON") assert not dd == ee # Check VR ee = DataElement(0x01110001, "SH", "ANON") assert not dd == ee def test_equality_sequence_element(self): """DataElement: equality returns correct value for sequence elements""" dd = DataElement(0x300A00B0, "SQ", []) assert dd == dd # noqa: PLR0124 Need to check equality with self ee = DataElement(0x300A00B0, "SQ", []) assert dd == ee # Check value e = Dataset() e.PatientName = "ANON" ee.value = [e] assert not dd == ee # Check tag ee = DataElement(0x01110002, "SQ", []) assert not dd == ee # Check VR ee = DataElement(0x300A00B0, "SH", []) assert not dd == ee # Check with dataset dd = DataElement(0x300A00B0, "SQ", [Dataset()]) dd.value[0].PatientName = "ANON" ee = DataElement(0x300A00B0, "SQ", [Dataset()]) ee.value[0].PatientName = "ANON" assert dd == ee # Check uneven sequences dd.value.append(Dataset()) dd.value[1].PatientName = "ANON" assert not dd == ee ee.value.append(Dataset()) ee.value[1].PatientName = "ANON" assert dd == ee ee.value.append(Dataset()) ee.value[2].PatientName = "ANON" assert not dd == ee def test_equality_not_rlement(self): """DataElement: equality returns correct value when not same class""" dd = DataElement(0x00100010, "PN", "ANON") ee = {"0x00100010": "ANON"} assert not dd == ee def test_equality_inheritance(self): """DataElement: equality returns correct value for subclasses""" class DataElementPlus(DataElement): pass dd = DataElement(0x00100010, "PN", "ANON") ee = DataElementPlus(0x00100010, "PN", "ANON") assert ee == ee # noqa: PLR0124 Need to check equality with self assert dd == ee assert ee == dd ee = DataElementPlus(0x00100010, "PN", "ANONY") assert not dd == ee assert not ee == dd def test_equality_class_members(self): """Test equality is correct when ignored class members differ.""" dd = DataElement(0x00100010, "PN", "ANON") dd.showVR = False dd.file_tell = 10 dd.maxBytesToDisplay = 0 dd.descripWidth = 0 assert DataElement(0x00100010, "PN", "ANON") == dd def test_inequality_standard(self): """Test DataElement.__ne__ for standard element""" dd = DataElement(0x00100010, "PN", "ANON") assert not dd != dd # noqa: PLR0124 Need to check inequality with self assert DataElement(0x00100010, "PN", "ANONA") != dd # Check tag assert DataElement(0x00100011, "PN", "ANON") != dd # Check VR assert DataElement(0x00100010, "SH", "ANON") != dd def test_inequality_sequence(self): """Test DataElement.__ne__ for sequence element""" dd = DataElement(0x300A00B0, "SQ", []) assert not dd != dd # noqa: PLR0124 Need to check inequality with self assert not DataElement(0x300A00B0, "SQ", []) != dd ee = DataElement(0x300A00B0, "SQ", [Dataset()]) assert ee != dd # Check value dd.value = [Dataset()] dd[0].PatientName = "ANON" ee[0].PatientName = "ANON" assert not ee != dd ee[0].PatientName = "ANONA" assert ee != dd def test_hash(self): """Test hash(DataElement) raises TypeError""" with pytest.raises(TypeError, match=r"unhashable"): hash(DataElement(0x00100010, "PN", "ANON")) def test_repeater_str(self): """Test a repeater group element displays the element name.""" elem = DataElement(0x60023000, "OB", b"\x00") assert "Overlay Data" in elem.__str__() def test_str_no_vr(self): """Test DataElement.__str__ output with no VR""" elem = DataElement(0x00100010, "PN", "ANON") assert "(0010,0010) Patient's Name" in str(elem) assert "PN: 'ANON'" in str(elem) elem.showVR = False assert "(0010,0010) Patient's Name" in str(elem) assert "PN" not in str(elem) def test_repr_seq(self): """Test DataElement.__repr__ with a sequence""" elem = DataElement(0x300A00B0, "SQ", [Dataset()]) elem[0].PatientID = "1234" assert repr(elem) == str(elem) def test_getitem_raises(self): """Test DataElement.__getitem__ raise if value not indexable""" elem = DataElement(0x00100010, "US", 123) with pytest.raises(TypeError): elem[0] def test_repval_large_elem(self): """Test DataElement.repval doesn't return a huge string for a large value""" elem = DataElement(0x00820003, "UT", "a" * 1000) assert len(elem.repval) < 100 def test_repval_large_vm(self): """Test DataElement.repval doesn't return a huge string for a large vm""" elem = DataElement(0x00080054, "AE", "a\\" * 1000 + "a") assert len(elem.repval) < 100 def test_repval_strange_type(self): """Test DataElement.repval doesn't break with bad types""" elem = DataElement(0x00020001, "OB", 0) assert len(elem.repval) < 100 def test_private_tag_in_repeater_range(self): """Test that an unknown private tag (e.g. a tag not in the private dictionary) in the repeater range is not handled as a repeater tag if using Implicit Little Endian transfer syntax.""" # regression test for #689 ds = Dataset() ds[0x50F10010] = RawDataElement( Tag(0x50F10010), None, 8, b"FDMS 1.0", 0, True, True ) ds[0x50F1100A] = RawDataElement( Tag(0x50F1100A), None, 6, b"ACC0.6", 0, True, True ) private_creator_data_elem = ds[0x50F10010] assert "Private Creator" == private_creator_data_elem.name assert "LO" == private_creator_data_elem.VR private_data_elem = ds[0x50F1100A] assert "[FNC Parameters]" == private_data_elem.name assert "SH" == private_data_elem.VR def test_private_repeater_tag(self): """Test that a known private tag in the repeater range is correctly handled using Implicit Little Endian transfer syntax.""" ds = Dataset() ds[0x60210012] = RawDataElement( Tag(0x60210012), None, 12, b"PAPYRUS 3.0 ", 0, True, True ) ds[0x60211200] = RawDataElement( Tag(0x60211200), None, 6, b"123456", 0, True, True ) private_creator_data_elem = ds[0x60210012] assert "Private Creator" == private_creator_data_elem.name assert "LO" == private_creator_data_elem.VR private_data_elem = ds[0x60211200] assert "[Overlay ID]" == private_data_elem.name assert "IS" == private_data_elem.VR def test_known_tags_with_UN_VR(self, replace_un_with_known_vr): """Known tags with VR UN are correctly decoded.""" ds = Dataset() ds[0x00080005] = DataElement(0x00080005, "UN", b"ISO_IR 126") ds[0x00100010] = DataElement(0x00100010, "UN", "Διονυσιος".encode("iso_ir_126")) ds.decode() assert "CS" == ds[0x00080005].VR assert "PN" == ds[0x00100010].VR assert "Διονυσιος" == ds[0x00100010].value ds = Dataset() ds[0x00080005] = DataElement( 0x00080005, "UN", b"ISO 2022 IR 100\\ISO 2022 IR 126" ) ds[0x00100010] = DataElement( 0x00100010, "UN", b"Dionysios=\x1b\x2d\x46" + "Διονυσιος".encode("iso_ir_126"), ) ds.decode() assert "CS" == ds[0x00080005].VR assert "PN" == ds[0x00100010].VR assert "Dionysios=Διονυσιος" == ds[0x00100010].value def test_reading_ds_with_known_tags_with_UN_VR(self, replace_un_with_known_vr): """Known tags with VR UN are correctly read.""" test_file = get_testdata_file("explicit_VR-UN.dcm") ds = dcmread(test_file) assert "CS" == ds[0x00080005].VR assert "TM" == ds[0x00080030].VR assert "PN" == ds[0x00100010].VR assert "PN" == ds[0x00100010].VR assert "DA" == ds[0x00100030].VR def test_unknown_tags_with_UN_VR(self): """Unknown tags with VR UN are not decoded.""" ds = Dataset() ds[0x00080005] = DataElement(0x00080005, "CS", b"ISO_IR 126") ds[0x00111010] = DataElement(0x00111010, "UN", "Διονυσιος".encode("iso_ir_126")) ds.decode() assert "UN" == ds[0x00111010].VR assert "Διονυσιος".encode("iso_ir_126") == ds[0x00111010].value def test_tag_with_long_value_UN_VR(self): """Tag with length > 64kb with VR UN is not changed.""" ds = Dataset() ds[0x00080005] = DataElement(0x00080005, "CS", b"ISO_IR 126") single_value = b"123456.789012345" large_value = b"\\".join([single_value] * 4500) ds[0x30040058] = DataElement( 0x30040058, "UN", large_value, is_undefined_length=False ) ds.decode() assert "UN" == ds[0x30040058].VR @pytest.mark.parametrize("use_none, empty_value", ((True, None), (False, ""))) def test_empty_text_values(self, use_none, empty_value, no_datetime_conversion): """Test that assigning an empty value behaves as expected.""" def check_empty_text_element(value): setattr(ds, tag_name, value) elem = ds[tag_name] assert bool(elem.value) is False assert 0 == elem.VM assert elem.value == value fp = DicomBytesIO() fp.is_implicit_VR = True fp.is_little_endian = True filewriter.write_dataset(fp, ds) ds_read = dcmread(fp, force=True) assert empty_value == ds_read[tag_name].value text_vrs = { "AE": "RetrieveAETitle", "AS": "PatientAge", "CS": "QualityControlSubject", "DA": "PatientBirthDate", "DT": "AcquisitionDateTime", "LO": "DataSetSubtype", "LT": "ExtendedCodeMeaning", "PN": "PatientName", "SH": "CodeValue", "ST": "InstitutionAddress", "TM": "StudyTime", "UC": "LongCodeValue", "UI": "SOPClassUID", "UR": "CodingSchemeURL", "UT": "StrainAdditionalInformation", } config.use_none_as_empty_text_VR_value = use_none ds = Dataset() # set value to new element for tag_name in text_vrs.values(): check_empty_text_element(None) del ds[tag_name] check_empty_text_element("") del ds[tag_name] check_empty_text_element([]) del ds[tag_name] # set value to existing element for tag_name in text_vrs.values(): check_empty_text_element(None) check_empty_text_element("") check_empty_text_element([]) check_empty_text_element(None) def test_empty_binary_values(self): """Test that assigning an empty value behaves as expected for non-text VRs.""" def check_empty_binary_element(value): setattr(ds, tag_name, value) elem = ds[tag_name] assert bool(elem.value) is False assert 0 == elem.VM assert elem.value == value fp = DicomBytesIO() fp.is_implicit_VR = True fp.is_little_endian = True filewriter.write_dataset(fp, ds) ds_read = dcmread(fp, force=True) assert ds_read[tag_name].value is None non_text_vrs = { "AT": "OffendingElement", "DS": "PatientWeight", "IS": "BeamNumber", "SL": "RationalNumeratorValue", "SS": "SelectorSSValue", "UL": "SimpleFrameList", "US": "SourceAcquisitionBeamNumber", "FD": "RealWorldValueLUTData", "FL": "VectorAccuracy", "OB": "FillPattern", "OD": "DoubleFloatPixelData", "OF": "UValueData", "OL": "TrackPointIndexList", "OW": "TrianglePointIndexList", "UN": "SelectorUNValue", } ds = Dataset() # set value to new element for tag_name in non_text_vrs.values(): check_empty_binary_element(None) del ds[tag_name] check_empty_binary_element([]) del ds[tag_name] check_empty_binary_element(MultiValue(int, [])) del ds[tag_name] # set value to existing element for tag_name in non_text_vrs.values(): check_empty_binary_element(None) check_empty_binary_element([]) check_empty_binary_element(MultiValue(int, [])) check_empty_binary_element(None) def test_empty_sequence_is_handled_as_array(self): ds = Dataset() ds.AcquisitionContextSequence = [] elem = ds["AcquisitionContextSequence"] assert bool(elem.value) is False assert elem.value == [] fp = DicomBytesIO() fp.is_implicit_VR = True fp.is_little_endian = True filewriter.write_dataset(fp, ds) ds_read = dcmread(fp, force=True) elem = ds_read["AcquisitionContextSequence"] assert elem.value == [] def test_is_private(self): """Test the is_private property.""" elem = DataElement(0x00090010, "UN", None) assert elem.is_private elem = DataElement(0x00080010, "UN", None) assert not elem.is_private def test_is_empty_sequence(self): """Test DataElement.is_empty for SQ.""" elem = DataElement(0x300A00B0, "SQ", []) assert elem.VR == "SQ" assert len(elem.value) == 0 assert elem.is_empty elem.value = [Dataset()] assert len(elem.value) == 1 assert not elem.is_empty def test_vm_sequence(self): """Test DataElement.VM for SQ.""" elem = DataElement(0x300A00B0, "SQ", []) assert not elem.is_buffered assert elem.VR == "SQ" assert len(elem.value) == 0 assert elem.VM == 1 elem.value = [Dataset(), Dataset()] assert len(elem.value) == 2 assert elem.VM == 1 class TestRawDataElement: """Tests for dataelem.RawDataElement.""" def test_invalid_tag_warning(self, allow_reading_invalid_values): """RawDataElement: conversion of unknown tag warns...""" raw = RawDataElement(Tag(0x88880088), None, 4, b"unknown", 0, True, True) with pytest.warns(UserWarning, match=r"\(8888,0088\)"): element = convert_raw_data_element(raw) assert element.VR == "UN" def test_key_error(self, enforce_valid_values): """RawDataElement: conversion of unknown tag throws KeyError...""" # raw data element -> tag VR length value # value_tell is_implicit_VR is_little_endian' # Unknown (not in DICOM dict), non-private, non-group 0 for this test raw = RawDataElement(Tag(0x88880002), None, 4, b"unknown", 0, True, True) msg = r"VR lookup failed for the raw element with tag \(8888,0002\)" with pytest.raises(KeyError, match=msg): convert_raw_data_element(raw) def test_valid_tag(self, no_datetime_conversion): """RawDataElement: conversion of known tag succeeds...""" raw = RawDataElement(Tag(0x00080020), "DA", 8, b"20170101", 0, False, True) element = convert_raw_data_element(raw, encoding=default_encoding) assert "Study Date" == element.name assert "DA" == element.VR assert "20170101" == element.value raw = RawDataElement( Tag(0x00080000), None, 4, b"\x02\x00\x00\x00", 0, True, True ) elem = convert_raw_data_element(raw, encoding=default_encoding) assert "UL" == elem.VR def test_data_element_without_encoding(self): """RawDataElement: no encoding needed.""" raw = RawDataElement( Tag(0x00104000), "LT", 23, b"comment\\comment2\\comment3", 0, False, True ) element = convert_raw_data_element(raw) assert "Patient Comments" == element.name def test_unknown_vr(self): """Test converting a raw element with unknown VR""" raw = RawDataElement(Tag(0x00080000), "AA", 8, b"20170101", 0, False, True) with pytest.raises(NotImplementedError): convert_raw_data_element(raw, encoding=default_encoding) @pytest.fixture def accept_wrong_length(self, request): old_value = config.convert_wrong_length_to_UN config.convert_wrong_length_to_UN = request.param yield config.convert_wrong_length_to_UN = old_value @pytest.mark.parametrize("accept_wrong_length", [False], indirect=True) def test_wrong_bytes_length_exception(self, accept_wrong_length): """Check exception when number of raw bytes is not correct.""" raw = RawDataElement(Tag(0x00190000), "FD", 1, b"1", 0, False, True) with pytest.raises(BytesLengthException): convert_raw_data_element(raw) @pytest.mark.parametrize("accept_wrong_length", [True], indirect=True) def test_wrong_bytes_length_convert_to_UN(self, accept_wrong_length): """Check warning and behavior for incorrect number of raw bytes.""" value = b"1" raw = RawDataElement(Tag(0x00190000), "FD", 1, value, 0, False, True) msg = ( r"Expected total bytes to be an even multiple of bytes per value. " r"Instead received b'1' with length 1 and struct format 'd' which " r"corresponds to bytes per value of 8. This occurred while trying " r"to parse \(0019,0000\) according to VR 'FD'. " r"Setting VR to 'UN'." ) with pytest.warns(UserWarning, match=msg): raw_elem = convert_raw_data_element(raw) assert "UN" == raw_elem.VR assert value == raw_elem.value def test_read_known_private_tag_implicit(self): fp = DicomBytesIO() ds = Dataset() ds.set_original_encoding(True, True) ds[0x00410010] = RawDataElement( Tag(0x00410010), "LO", 8, b"ACME 3.2", 0, True, True ) ds[0x00411001] = RawDataElement( Tag(0x00411001), "US", 2, b"\x2A\x00", 0, True, True ) ds[0x00431001] = RawDataElement( Tag(0x00431001), "SH", 8, b"Unknown ", 0, True, True ) ds.save_as(fp) ds = dcmread(fp, force=True) elem = ds[0x00411001] assert elem.VR == "UN" assert elem.name == "Private tag data" assert elem.value == b"\x2A\x00" with save_private_dict(): add_private_dict_entry("ACME 3.2", 0x00410001, "US", "Some Number") ds = dcmread(fp, force=True) elem = ds[0x00411001] assert elem.VR == "US" assert elem.name == "[Some Number]" assert elem.value == 42 # Unknown private tag is handled as before elem = ds[0x00431001] assert elem.VR == "UN" assert elem.name == "Private tag data" assert elem.value == b"Unknown " def test_read_known_private_tag_explicit(self): fp = DicomBytesIO() ds = Dataset() ds.set_original_encoding(False, True) ds[0x00410010] = RawDataElement( Tag(0x00410010), "LO", 8, b"ACME 3.2", 0, False, True ) ds[0x00411002] = RawDataElement( Tag(0x00411002), "UN", 8, b"SOME_AET", 0, False, True ) ds.save_as(fp) ds = dcmread(fp, force=True) elem = ds[0x00411002] assert elem.VR == "UN" assert elem.name == "Private tag data" assert elem.value == b"SOME_AET" with save_private_dict(): add_private_dict_entry("ACME 3.2", 0x00410002, "AE", "Some AET") ds = dcmread(fp, force=True) elem = ds[0x00411002] assert elem.VR == "AE" assert elem.name == "[Some AET]" assert elem.value == "SOME_AET" def test_read_known_private_tag_explicit_no_lookup( self, dont_replace_un_with_known_vr ): with save_private_dict(): add_private_dict_entry("ACME 3.2", 0x00410003, "IS", "Another Number") fp = DicomBytesIO() ds = Dataset() ds.set_original_encoding(False, True) ds[0x00410010] = RawDataElement( Tag(0x00410010), "LO", 8, b"ACME 3.2", 0, False, True ) ds[0x00411003] = RawDataElement( Tag(0x00411003), "UN", 8, b"12345678", 0, False, True ) ds.save_as(fp) ds = dcmread(fp, force=True) elem = ds[0x00411003] assert elem.VR == "UN" assert elem.name == "[Another Number]" assert elem.value == b"12345678" def test_lut_descriptor_modifier_invalid(self): """Test fixing value for LUT Descriptor if value is not an int""" raw = RawDataElement(Tag(0x00283002), None, 4, ["a", 0, 1], 0, True, True) elem = convert_raw_data_element(raw) assert elem.value == ["a", 0, 1] def test_UN_unknown_public_tag(self): """Test converting a UN element with unknown public tag""" raw = RawDataElement(Tag(0x88883002), "UN", 4, b"\x02\x04", 0, True, True) elem = convert_raw_data_element(raw) assert elem.value == b"\x02\x04" assert elem.tag == 0x88883002 assert elem.VR == "UN" @pytest.fixture def reset_hooks(): original = ( hooks.raw_element_vr, hooks.raw_element_value, hooks.raw_element_kwargs, ) yield ( hooks.raw_element_vr, hooks.raw_element_value, hooks.raw_element_kwargs, ) = original class TestConvertRawDataElementHooks: """Tests for the hooks in convert_raw_data_element()""" def test_vr(self, reset_hooks): """Test the 'raw_element_vr' hook""" ds = Dataset() ds.PatientName = "Foo" raw = RawDataElement(Tag(0x00100020), None, 4, b"unknown", 0, True, True) d = {} def func(raw, data, **kwargs): data["VR"] = "LO" d.update(kwargs) kwargs = {"a": 1, "b": []} hooks.register_callback("raw_element_vr", func) hooks.register_kwargs("raw_element_kwargs", kwargs) elem = convert_raw_data_element(raw, encoding=default_encoding, ds=ds) assert elem.value == "unknown" assert elem.VR == "LO" assert elem.tag == (0x00100020) assert d["encoding"] == default_encoding assert d["ds"] == ds assert d["a"] == 1 assert d["b"] == [] def test_value(self, reset_hooks): """Test the 'raw_element_vr' hook""" ds = Dataset() ds.PatientName = "Foo" raw = RawDataElement(Tag(0x00100020), "LO", 4, b"unknown", 0, True, True) d = {} def func(raw, data, **kwargs): data["value"] = "12345" d.update(kwargs) kwargs = {"c": 3, "d": None} hooks.register_callback("raw_element_value", func) hooks.register_kwargs("raw_element_kwargs", kwargs) elem = convert_raw_data_element(raw, encoding=default_encoding, ds=ds) assert elem.value == "12345" assert elem.VR == "LO" assert elem.tag == (0x00100020) assert d["encoding"] == default_encoding assert d["ds"] == ds assert d["c"] == 3 assert d["d"] is None def test_value_retry(self, reset_hooks): """Test the 'raw_element_value_retry' function""" raw = RawDataElement(Tag(0x00000903), None, 4, b"12345", 0, True, True) # Original function raises and exception msg = "Expected total bytes to be an even multiple of bytes per value" with pytest.raises(BytesLengthException, match=msg): convert_raw_data_element(raw) # No target_VRs set, no change hooks.register_callback("raw_element_value", raw_element_value_retry) with pytest.raises(BytesLengthException, match=msg): convert_raw_data_element(raw) kwargs = {"target_VRs": {"US": ("SS", "SH")}} hooks.register_kwargs("raw_element_kwargs", kwargs) # Test candidate VRs to see if they can be used instead # in this case SS will fail and SH will succeed elem = convert_raw_data_element(raw) assert elem.value == "12345" assert elem.VR == "SH" # If unable to convert then raise original exception kwargs["target_VRs"]["US"] = ("SS",) with pytest.raises(BytesLengthException, match=msg): convert_raw_data_element(raw) def test_value_fix_separator(self, reset_hooks): """Test the 'raw_element_value_fix_separator' function""" raw = RawDataElement( Tag(0x00000902), None, 4, b"\x41\x42\x2C\x43\x44\x2C\x45\x46", 0, True, True ) elem = convert_raw_data_element(raw) assert elem.value == "AB,CD,EF" hooks.register_callback("raw_element_value", raw_element_value_fix_separator) # No target_VRs set, no change elem = convert_raw_data_element(raw) assert elem.value == "AB,CD,EF" kwargs = {"target_VRs": ("LO",)} hooks.register_kwargs("raw_element_kwargs", kwargs) elem = convert_raw_data_element(raw) assert elem.value == ["AB", "CD", "EF"] kwargs["separator"] = ":" raw = raw._replace(value=raw.value.replace(b"\x2C", b":")) elem = convert_raw_data_element(raw) assert elem.value == ["AB", "CD", "EF"] raw = raw._replace(VR="SH") elem = convert_raw_data_element(raw) assert elem.value == "AB:CD:EF" class TestDataElementValidation: @staticmethod def check_invalid_vr(vr, value, check_warn=True): msg = rf"Invalid value for VR {vr}: *" if check_warn: with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.warns(UserWarning, match=msg): validate_value(vr, value, config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) with pytest.raises(ValueError, match=msg): validate_value(vr, value, config.RAISE) @staticmethod def check_valid_vr(vr, value): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) validate_value(vr, value, config.RAISE) @pytest.mark.parametrize( "vr, length", ( ("AE", 17), ("CS", 17), ("DS", 27), ("LO", 66), ("LT", 10250), ("SH", 17), ("ST", 1025), ("UI", 65), ), ) def test_maxvalue_exceeded(self, vr, length, no_datetime_conversion): msg = rf"The value length \({length}\) exceeds the maximum length *" with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, "1" * length, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, "2" * length, validation_mode=config.RAISE) @pytest.mark.parametrize( "value", ("Руссский", b"ctrl\tchar", "new\n", b"newline\n", "Äneas") ) def test_invalid_ae(self, value): self.check_invalid_vr("AE", value) @pytest.mark.parametrize("value", ("My AETitle", b"My AETitle", "", None)) def test_valid_ae(self, value): self.check_valid_vr("AE", value) @pytest.mark.parametrize("value", ("12Y", "0012Y", b"012B", "Y012", "012Y\n")) def test_invalid_as(self, value): self.check_invalid_vr("AS", value) @pytest.mark.parametrize("value", ("012Y", "345M", b"052W", b"789D", "", None)) def test_valid_as(self, value): self.check_valid_vr("AS", value) @pytest.mark.parametrize( "value", ("abcd", b"ABC+D", "ABCD-Z", "ÄÖÜ", "ÄÖÜ".encode(), "ABC\n") ) def test_invalid_cs(self, value): self.check_invalid_vr("CS", value) @pytest.mark.parametrize("value", ("VALID_13579 ", b"VALID_13579", "", None)) def test_valid_cs(self, value): self.check_valid_vr("CS", value) @pytest.mark.parametrize( "value", ( "201012", "2010122505", b"20102525", b"-20101225-", "20101620", "20101040", "20101033", "20101225 20201224 ", ), ) def test_invalid_da(self, value): self.check_invalid_vr("DA", value) @pytest.mark.parametrize( "value", ( b"19560303", "20101225-20201224 ", datetime.date(2022, 5, 1), b"-19560303", "19560303-", "", None, ), ) def test_valid_da(self, value): self.check_valid_vr("DA", value) @pytest.mark.parametrize( "value", ("201012+", "20A0", "+-123.66", "-123.5 E4", b"123F4 ", "- 195.6") ) def test_invalid_ds(self, value): self.check_invalid_vr("DS", value, check_warn=False) @pytest.mark.parametrize( "value", ("12345", "+.1234 ", "-0345.76", b"1956E3", b"-1956e+3", "+195.6e-3", "", None), ) def test_valid_ds(self, value): self.check_valid_vr("DS", value) @pytest.mark.parametrize( "value", ("201012+", "20A0", b"123.66", "-1235E4", "12 34") ) def test_invalid_is(self, value): self.check_invalid_vr("IS", value, check_warn=False) @pytest.mark.parametrize("value", (" 12345 ", b"+1234 ", "-034576", "", None)) def test_valid_is(self, value): self.check_valid_vr("IS", value) @pytest.mark.parametrize( "value", ( "234", "1", "01015", "225959.", b"0000.345", "222222.2222222", "-1234-", "+123456", b"-123456-1330", "006000", "005961", "0000aa", "0000.00", "123461-1330", "123400-1360", ), ) def test_invalid_tm(self, value): self.check_invalid_vr("TM", value) @pytest.mark.parametrize( "value", ( "23", "1234", b"010159", "225959.3", "000000.345", "222222.222222", "-1234", "123456-", b"123460-1330", "005960", "", None, datetime.time(11, 11, 0), ), ) def test_valid_tm(self, value): self.check_valid_vr("TM", value) @pytest.mark.parametrize( "value", ( "19", "198", "20011", b"20200101.222", "187712311", "20001301", "19190432010159", "203002020222.2222222", b"203002020270.2", "1984+2000", "+1877123112-0030", "19190430010161", "19190430016000", ), ) def test_invalid_dt(self, value): self.check_invalid_vr("DT", value) @pytest.mark.parametrize( "value", ( "1984", "200112", b"20200101", "1877123112", "200006012020", "19190420015960", "20300202022222.222222", b"20300202022222.2", "1984+0600", "1877123112-0030", "20300202022222.2-1200", "20000101-", "-2020010100", "1929-1997", "", None, datetime.datetime(1999, 12, 24, 12, 0, 0), ), ) def test_valid_dt(self, value): self.check_valid_vr("DT", value) @pytest.mark.parametrize( "value", ("Руссский", "ctrl\tchar", '"url"', "a 16) dcmread(fp, force=True) def test_write_valid_non_ascii_pn(self, enforce_writing_invalid_values): fp = DicomBytesIO() ds = Dataset() ds.set_original_encoding(False, True) ds.SpecificCharacterSet = "ISO_IR 192" # UTF-8 # string length is 40 ds.add(DataElement(0x00100010, "PN", "洪^吉洞" * 10)) # shall not raise, as the number of characters is considered, # not the number of bytes (which is > 64) ds.save_as(fp) def test_read_valid_length_non_ascii_text(self): fp = DicomBytesIO() ds = Dataset() ds.set_original_encoding(True, True) ds.SpecificCharacterSet = "ISO_IR 192" # UTF-8 ds.add(DataElement(0x00080050, "SH", "洪^吉洞=홍^길동")) # shall not raise, as the number of characters is considered, # not the number of bytes (which is > 16) ds.save_as(fp) dcmread(fp, force=True) @pytest.mark.parametrize( "value, value_type", [("1", "str"), (1.5, "float"), (complex(1, 2), "complex")] ) @pytest.mark.parametrize("vr", ("US", "SS", "UV", "SV")) def test_invalid_numeric_value(self, value, value_type, vr): msg = ( f"A value of type '{value_type}' cannot be assigned" f" to a tag with VR {vr}." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) @pytest.mark.parametrize( "value, value_type", [("1", "str"), (complex(1, 2), "complex")] ) @pytest.mark.parametrize("vr", ("FL", "FD")) def test_invalid_float_value(self, value, value_type, vr): msg = ( f"A value of type '{value_type}' cannot be assigned" f" to a tag with VR {vr}." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-1.5, 0, 1, 1234.5678)) @pytest.mark.parametrize("vr", ("FL", "FD")) def test_valid_float_value(self, value, vr): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) @pytest.mark.parametrize( "value", (0, 1, 65535, b"", b"\xf3\x42", b"\x01\x00\x02\x00") ) def test_valid_us_value(self, value): DataElement(0x00410001, "US", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-1, 66000)) def test_invalid_us_value(self, value): msg = ( "Invalid value: a value for a tag with VR US " "must be between 0 and 65535." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, "US", value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, "US", value, validation_mode=config.RAISE) with pytest.warns(UserWarning, match=msg): ds = Dataset() ds.add_new(0x00410001, "US", value) @pytest.mark.parametrize("value", (-32768, 0, 32767, b"\xff\xff", b"\0\0\0\0")) def test_valid_ss_value(self, value): DataElement(0x00410001, "SS", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-33000, 32768)) def test_invalid_ss_value(self, value): msg = ( "Invalid value: a value for a tag with VR SS " "must be between -32768 and 32767." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, "SS", value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, "SS", value, validation_mode=config.RAISE) @pytest.mark.parametrize("vr", ("US", "SS")) @pytest.mark.parametrize("value", (b"\x01", b"\x00\x00\x00")) def test_invalid_short_value_length(self, vr, value): msg = ( f"Invalid value length {len(value)}: the value length for a " f"tag with VR {vr} must be a multiple of 2." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (0, 1, 4294967295, b"\x00\x01\x02\x03")) def test_valid_ul_value(self, value): DataElement(0x00410001, "UL", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-2, 4294967300)) def test_invalid_ul_value(self, value): msg = ( "Invalid value: a value for a tag with VR UL " "must be between 0 and 4294967295." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, "UL", value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, "UL", value, validation_mode=config.RAISE) @pytest.mark.parametrize( "value", (-2147483648, 0, 2147483647, b"\x12\x34\x56\x78\x9a\xbc\xde\xf0") ) def test_valid_sl_value(self, value): DataElement(0x00410001, "SL", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-2147483650, 2147483648)) def test_invalid_sl_value(self, value): msg = ( "Invalid value: a value for a tag with VR SL " "must be between -2147483648 and 2147483647." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, "SL", value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, "SL", value, validation_mode=config.RAISE) @pytest.mark.parametrize("vr", ("UL", "SL")) @pytest.mark.parametrize("value", (b"\x0b\x00", b"\x01\x34\x11", b"\xff" * 5)) def test_invalid_long_value_length(self, vr, value): msg = ( f"Invalid value length {len(value)}: the value length for a " f"tag with VR {vr} must be a multiple of 4." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (0, 1, 18446744073709551615, b"01" * 8)) def test_valid_uv_value(self, value): DataElement(0x00410001, "UV", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-1, 18446744073709551617)) def test_invalid_uv_value(self, value): msg = ( "Invalid value: a value for a tag with VR UV " "must be between 0 and 18446744073709551615." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, "UV", value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, "UV", value, validation_mode=config.RAISE) @pytest.mark.parametrize( "value", (-9223372036854775808, 0, 9223372036854775807, b"ff" * 24) ) def test_valid_sv_value(self, value): DataElement(0x00410001, "SV", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-9223372036854775809, 9223372036854775808)) def test_invalid_sv_value(self, value): msg = ( "Invalid value: a value for a tag with VR SV must be between " "-9223372036854775808 and 9223372036854775807." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, "SV", value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, "SV", value, validation_mode=config.RAISE) @pytest.mark.parametrize("vr", ("UV", "SV")) @pytest.mark.parametrize( "value", ( b"\x0b\x00", b"\x01\x34\x11\x00", b"\xff" * 6, b"\x00" * 9, ), ) def test_invalid_very_long_value_length(self, vr, value): msg = ( f"Invalid value length {len(value)}: the value length for a " f"tag with VR {vr} must be a multiple of 8." ) with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) @pytest.mark.skipif(not config.have_numpy, reason="Numpy is not available") def test_pixel_data_ndarray_raises(self): """Test exception raised if setting PixelData using ndarray""" import numpy as np ds = Dataset() ds.PixelData = b"\x00\x01" assert ds.PixelData == b"\x00\x01" msg = ( r"The value for \(7FE0,0010\) 'Pixel Data' should be set using 'bytes' " r"not 'numpy.ndarray'. See the Dataset.set_pixel_data\(\) method for " "an alternative that supports ndarrays." ) with pytest.raises(TypeError, match=msg): ds.PixelData = np.ones((3, 4), dtype="u1") assert ds.PixelData == b"\x00\x01" @pytest.mark.parametrize("value", (None, b"", b"\x00", b"\x00\x01\x02\x03")) def test_valid_o_star_bytes(self, value): for vr in ("OB", "OD", "OF", "OL", "OW", "OV"): DataElement(0x00410001, "vr", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (bytearray(), bytearray(b"\x00\x01\x02\x03"))) def test_valid_o_star_bytearray(self, value): for vr in ("OB", "OD", "OF", "OL", "OW", "OV"): DataElement(0x00410001, "vr", value, validation_mode=config.RAISE) @pytest.mark.parametrize("value", (-2, 4294967300)) def test_invalid_o_star_value(self, value): for vr in ("OB", "OD", "OF", "OL", "OW", "OV"): msg = f"A value of type 'int' cannot be assigned to a tag with VR {vr}" with pytest.warns(UserWarning, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.WARN) with pytest.raises(ValueError, match=msg): DataElement(0x00410001, vr, value, validation_mode=config.RAISE) class TestBufferedDataElement: """Tests setting a DataElement value to a buffer""" @pytest.mark.parametrize("vr", BUFFERABLE_VRS) def test_reading_dataelement_buffer(self, vr): value = b"\x00\x01\x02\x03" buffer = io.BytesIO(value) elem = DataElement("PixelData", vr, buffer) data: bytes = b"" # while read_bytes is tested in test_buffer.py, this tests the integration # between the helper and DataElement since this is the main use case for chunk in read_buffer(elem.value): data += chunk assert data == value def test_unsupported_vr_raises(self): """Test using a buffer with an unsupported VR raises""" msg = ( "Elements with a VR of 'PN' cannot be used with buffered values, " "supported VRs are: OB, OD, OF, OL, OV, OW" ) with pytest.raises(ValueError, match=msg): DataElement("PersonName", "PN", io.BytesIO()) @pytest.mark.skipif(IS_WINDOWS, reason="TemporaryFile on Windows always readable") def test_invalid_buffer_raises(self): """Test invalid buffer raises on setting the value""" b = io.BytesIO() b.close() msg = ( r"Invalid buffer for \(0040,A123\) 'Person Name': the buffer has been " "closed" ) with pytest.raises(ValueError, match=msg): DataElement("PersonName", "OB", b) msg = ( r"Invalid buffer for \(0040,A123\) 'Person Name': the buffer must be " "readable and seekable" ) with tempfile.TemporaryFile(mode="wb") as t: with pytest.raises(ValueError, match=msg): DataElement("PersonName", "OB", t) def test_printing_value(self): value = b"\x00\x01\x02\x03" buffer = io.BytesIO(value) elem = DataElement("PixelData", "OB", buffer) assert elem.is_buffered assert re.compile( r"^\(7FE0,0010\) Pixel Data\W*OB: <_io.BytesIO object.*$" ).match(str(elem)) assert elem.repval.startswith("<_io.BytesIO object at") assert repr(elem) == str(elem) def test_VM(self): """Test buffered element VM""" elem = DataElement("PersonName", "OB", io.BytesIO()) assert elem.VM == 0 elem = DataElement("PersonName", "OB", io.BytesIO(b"\x00\x01")) assert elem.VM == 1 def test_equality(self): """Test element equality""" # First is buffered, second is not elem = DataElement("PersonName", "OB", b"\x00\x01") b_elem = DataElement("PersonName", "OB", io.BytesIO(b"\x00\x01")) # Test equality multiple times to ensure buffer can be re-read assert b_elem == elem assert b_elem == elem elem.value = b"\x01\x02" assert b_elem != elem assert b_elem != elem # First and second are both buffered b_elem2 = DataElement("PersonName", "OB", io.BytesIO(b"\x00\x01")) assert b_elem == b_elem2 assert b_elem == b_elem2 b_elem2 = DataElement("PersonName", "OB", io.BytesIO(b"\x01\x02")) assert b_elem != b_elem2 assert b_elem != b_elem2 # First is not buffered, second is # Test equality multiple times to ensure buffer can be re-read assert elem != b_elem assert elem != b_elem def test_equality_offset(self): """Test equality when the buffer isn't positioned at the start""" elem = DataElement("PersonName", "OB", b"\x00\x01") b = io.BytesIO(b"\x00\x01") b_elem = DataElement("PersonName", "OB", b) b.seek(2) assert b_elem == elem assert b_elem == elem c = io.BytesIO(b"\x00\x01") c_elem = DataElement("PersonName", "OB", c) c.seek(1) assert b_elem == c_elem assert b_elem == c_elem def test_equality_larger(self): """Test equality when bytes is larger than buffer""" elem = DataElement("PersonName", "OB", b"\x00\x01\x02\x03") b_elem = DataElement("PersonName", "OB", io.BytesIO(b"\x00\x01")) assert b_elem != elem c_elem = DataElement("PersonName", "OB", io.BytesIO(b"\x00\x01\x02\x03")) assert b_elem != c_elem def test_equality_multichunk(self): """Test element equality when the value gets chunked""" # Test multiple of default chunk size value = b"\x00\x01\x02" * 8192 elem = DataElement("PersonName", "OB", value) b_elem = DataElement("PersonName", "OB", io.BytesIO(value)) assert b_elem == elem # Test not a multiple of default chunk size value = b"\x00\x01\x02" * 8418 elem = DataElement("PersonName", "OB", value) b_elem = DataElement("PersonName", "OB", io.BytesIO(value)) assert b_elem == elem # Test empty value = b"" elem = DataElement("PersonName", "OB", value) b_elem = DataElement("PersonName", "OB", io.BytesIO(value)) assert b_elem == elem def test_equality_raises(self): """Test equality raises if buffer invalid.""" elem = DataElement("PersonName", "OB", b"\x00\x01") b = io.BytesIO(b"\x00\x01") b_elem = DataElement("PersonName", "OB", b) assert b_elem == elem # First buffer is invalid b.close() msg = ( r"Invalid buffer for \(0040,A123\) 'Person Name': the buffer has been " "closed" ) with pytest.raises(ValueError, match=msg): b_elem == elem # Second buffer is invalid with pytest.raises(ValueError, match=msg): elem == b_elem # Both buffers are invalid c = io.BytesIO(b"\x00\x01") c_elem = DataElement("PersonName", "OB", c) c.close() with pytest.raises(ValueError, match=msg): b_elem == c_elem def test_deepcopy(self): """Test deepcopy with a buffered value""" b = io.BytesIO(b"\x00\x01") elem = DataElement("PersonName", "OB", b) elem2 = copy.deepcopy(elem) assert isinstance(elem.value, io.BytesIO) assert isinstance(elem2.value, io.BytesIO) assert elem.value.getvalue() == b.getvalue() assert elem2.value.getvalue() == b.getvalue() assert elem2.value is not elem.value assert elem2 == elem def test_deepcopy_closed(self): """Test deepcopy with a buffered value""" b = io.BytesIO(b"\x00\x01") elem = DataElement("PersonName", "OB", b) b.close() msg = ( r"Error deepcopying the buffered element \(0040,A123\) 'Person Name': " "I/O operation on closed file" ) with pytest.raises(ValueError, match=msg): copy.deepcopy(elem) @pytest.fixture def use_future(): original = config._use_future config._use_future = True yield config._use_future = original def test_deprecation_warnings(): from pydicom.dataelem import DataElement_from_raw raw = RawDataElement(Tag(0x00100010), None, 4, b"unknown", 0, True, True) msg = ( "'pydicom.dataelem.DataElement_from_raw' is deprecated and will be removed " "in v4.0, please use 'pydicom.dataelem.convert_raw_data_element' instead" ) with pytest.warns(DeprecationWarning, match=msg): DataElement_from_raw(raw) def test_import_raises(use_future): with pytest.raises(ImportError): from pydicom.dataelem import DataElement_from_raw pydicom-pydicom-20aa4b7/tests/test_dataset.py000066400000000000000000003306651515706620200214430ustar00rootroot00000000000000# Copyright 2008-2023 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.dataset module.""" import copy import io import math from pathlib import Path import pickle from platform import python_implementation import sys import weakref import tempfile import pytest from pydicom.datadict import add_private_dict_entry from .test_helpers import assert_no_warning try: import numpy HAVE_NP = True except ImportError: HAVE_NP = False import pydicom from pydicom import config from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.dataelem import DataElement, RawDataElement from pydicom.dataset import Dataset, FileDataset, validate_file_meta, FileMetaDataset from pydicom.encaps import encapsulate from pydicom.filebase import DicomBytesIO from pydicom.pixels.utils import get_image_pixel_ids from pydicom.sequence import Sequence from pydicom.tag import Tag from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRLittleEndian, ExplicitVRBigEndian, JPEGBaseline8Bit, PYDICOM_IMPLEMENTATION_UID, CTImageStorage, ) from pydicom.valuerep import DS, VR class BadRepr: def __repr__(self): raise ValueError("bad repr") @pytest.fixture() def clear_pixel_data_handlers(): orig_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] yield pydicom.config.pixel_data_handlers = orig_handlers class TestDataset: """Tests for dataset.Dataset.""" def setup_method(self): self.ds = Dataset() self.ds.TreatmentMachineName = "unit001" def test_attribute_error_in_property(self): """Dataset: AttributeError in property raises actual error message.""" # This comes from bug fix for issue 42 # First, fake enough to try the pixel_array property ds = Dataset() ds.file_meta = FileMetaDataset() ds.PixelData = "xyzlmnop" msg = ( "Unable to decode the pixel data as the dataset's 'file_meta' has " r"no \(0002,0010\) 'Transfer Syntax UID' element" ) with pytest.raises(AttributeError, match=msg): ds.pixel_array def test_for_stray_raw_data_element(self): dataset = Dataset() dataset.PatientName = "MacDonald^George" sub_ds = Dataset() sub_ds.BeamNumber = "1" dataset.BeamSequence = Sequence([sub_ds]) fp = DicomBytesIO() dataset.save_as(fp, implicit_vr=True) def _reset(): fp.seek(0) ds1 = pydicom.dcmread(fp, force=True) fp.seek(0) ds2 = pydicom.dcmread(fp, force=True) return ds1, ds2 ds1, ds2 = _reset() assert ds1 == ds2 ds1, ds2 = _reset() ds1.PatientName # convert from raw assert ds1 == ds2 ds1, ds2 = _reset() ds2.PatientName assert ds1 == ds2 ds1, ds2 = _reset() ds2.PatientName assert ds2 == ds1 # compare in other order ds1, ds2 = _reset() ds2.BeamSequence[0].BeamNumber assert ds1 == ds2 # add a new element to one ds sequence item ds1, ds2 = _reset() ds2.BeamSequence[0].BeamName = "1" assert ds1 != ds2 # change a value in a sequence item ds1, ds2 = _reset() ds2.BeamSequence[0].BeamNumber = "2" assert ds2 != ds1 def test_attribute_error_in_property_correct_debug(self): """Test AttributeError in property raises correctly.""" class Foo(Dataset): @property def bar(self): return self._barr() def _bar(self): return "OK" def test(): ds = Foo() ds.bar msg = r"'Foo' object has no attribute '_barr'" with pytest.raises(AttributeError, match=msg): test() def test_tag_exception_print(self): """Test that tag appears in exception messages.""" ds = Dataset() ds.PatientID = "123456" # Valid value ds.SmallestImagePixelValue = BadRepr() # Invalid value msg = r"With tag \(0028,0106\) got exception: bad repr" with pytest.raises(ValueError, match=msg): str(ds) def test_tag_exception_walk(self): """Test that tag appears in exceptions raised during recursion.""" ds = Dataset() ds.PatientID = "123456" # Valid value ds.SmallestImagePixelValue = BadRepr() # Invalid value def callback(dataset, data_element): return str(data_element) def func(dataset=ds): return dataset.walk(callback) msg = r"With tag \(0028,0106\) got exception: bad repr" with pytest.raises(ValueError, match=msg): func() def test_set_new_data_element_by_name(self): """Dataset: set new data_element by name.""" ds = Dataset() ds.TreatmentMachineName = "unit #1" data_element = ds[0x300A, 0x00B2] assert "unit #1" == data_element.value assert "SH" == data_element.VR def test_set_existing_data_element_by_name(self): """Dataset: set existing data_element by name.""" self.ds.TreatmentMachineName = "unit999" # change existing value assert "unit999" == self.ds[0x300A, 0x00B2].value def test_set_non_dicom(self, setattr_warn): """Dataset: can set class instance property (non-dicom).""" ds = Dataset() msg = ( r"Camel case attribute 'SomeVariableName' used which is not in " r"the element keyword data dictionary" ) with pytest.warns(UserWarning, match=msg): ds.SomeVariableName = 42 assert hasattr(ds, "SomeVariableName") assert 42 == ds.SomeVariableName def test_membership(self, contains_warn): """Dataset: can test if item present by 'if in dataset'.""" assert "TreatmentMachineName" in self.ds msg = ( r"Invalid value 'Dummyname' used with the 'in' operator: must be " r"an element tag as a 2-tuple or int, or an element keyword" ) with pytest.warns(UserWarning, match=msg): assert "Dummyname" not in self.ds def test_contains(self, contains_warn): """Dataset: can test if item present by 'if in dataset'.""" self.ds.CommandGroupLength = 100 # (0000,0000) assert (0x300A, 0xB2) in self.ds assert [0x300A, 0xB2] in self.ds assert 0x300A00B2 in self.ds assert (0x10, 0x5F) not in self.ds assert "CommandGroupLength" in self.ds # Use a negative tag to cause an exception msg = ( r"Invalid value '\(-16, 16\)' used with the 'in' operator: must " r"be an element tag as a 2-tuple or int, or an element keyword" ) with pytest.warns(UserWarning, match=msg): assert (-0x0010, 0x0010) not in self.ds def foo(): pass # Try a function msg = r"Invalid value ' implicit ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian fp = DicomBytesIO() ds.save_as(fp) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding[0] assert ds._is_implicit_VR # Implicit -> explicit fp = DicomBytesIO() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds._is_implicit_VR = True ds.save_as(fp) fp.seek(0) ds = dcmread(fp) assert not ds.original_encoding[0] ds = Dataset() ds.preamble = b"\x00" * 128 ds.PatientName = "Foo" ds._is_little_endian = True ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRBigEndian # Big endian fp = DicomBytesIO() ds.save_as(fp) fp.seek(0) ds = dcmread(fp) assert not ds.original_encoding[1] # Little endian ds._read_little = None ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian fp = DicomBytesIO() ds.save_as(fp) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding[1] def test_priority_args(self): """Test prefer args over dataset attributes.""" ds = get_testdata_file("CT_small.dcm", read=True) del ds.file_meta assert not ds.original_encoding[0] assert not ds._is_implicit_VR # Explicit -> implicit fp = DicomBytesIO() ds.save_as(fp, implicit_vr=True) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding == (True, True) assert ds._is_implicit_VR # Implicit -> explicit fp = DicomBytesIO() ds.save_as(fp, implicit_vr=False) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding == (False, True) ds = Dataset() ds.preamble = b"\x00" * 128 ds.PatientName = "Foo" ds._is_little_endian = True # Big endian fp = DicomBytesIO() ds.save_as(fp, implicit_vr=False, little_endian=False) fp.seek(0) ds = dcmread(fp) assert not ds.original_encoding[1] # Little endian ds._read_little = None fp = DicomBytesIO() ds.save_as(fp, implicit_vr=False, little_endian=True) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding[1] def test_priority_attr(self): """Test priority of dataset attrs over original.""" ds = get_testdata_file("CT_small.dcm", read=True) del ds.file_meta assert not ds.original_encoding[0] # Explicit -> implicit fp = DicomBytesIO() ds._is_implicit_VR = True ds.save_as(fp) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding == (True, True) # Implicit -> explicit fp = DicomBytesIO() ds._is_implicit_VR = False ds.save_as(fp) fp.seek(0) ds = dcmread(fp) assert ds.original_encoding == (False, True) def test_write_like_original(self): ds = Dataset() ds.SOPClassUID = "1.2.3" ds.SOPInstanceUID = "1.2.3.4" msg = ( "'write_like_original' is deprecated and will be removed in v4.0, " "please use 'enforce_file_format' instead" ) # Test kwarg - not enforce_file_format with pytest.warns(DeprecationWarning, match=msg): ds.save_as(DicomBytesIO(), write_like_original=False, implicit_vr=True) # Test default - not enforce_file_format ds.save_as(DicomBytesIO(), implicit_vr=True) def test_save_as_compressed_no_encaps(self): """Test saving a compressed dataset with no encapsulation.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEGBaseline8Bit ds.PixelData = b"\x00\x01\x02\x03\x04\x05\x06" ds["PixelData"].VR = "OB" msg = ( r"The \(7FE0,0010\) 'Pixel Data' element value hasn't been encapsulated " "as required for a compressed transfer syntax - see pydicom.encaps." r"encapsulate\(\) for more information" ) with pytest.raises(ValueError, match=msg): ds.save_as(fp) def test_save_as_compressed_encaps(self): """Test saving a compressed dataset with encapsulation.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEGBaseline8Bit ds.PixelData = encapsulate([b"\x00\x01\x02\x03\x04\x05\x06"]) ds["PixelData"].VR = "OB" ds.save_as(fp) def test_save_as_no_pixel_data(self): """Test saving with no Pixel Data.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEGBaseline8Bit ds.save_as(fp) def test_save_as_no_file_meta(self): """Test saving with no Transfer Syntax or file_meta.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.save_as(fp, implicit_vr=False) del ds.file_meta ds.save_as(fp, implicit_vr=False) def test_save_as_private_transfer_syntax(self): """Test saving with a private transfer syntax.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = "1.2.3.4.5.6" msg = ( "The 'implicit_vr' and 'little_endian' arguments are required " "when using a private transfer syntax" ) with pytest.raises(ValueError, match=msg): ds.save_as(fp) ds.save_as(fp, implicit_vr=False) def test_save_as_set_little_implicit_with_tsyntax(self): """Test setting is_implicit_VR and is_little_endian from tsyntax""" ds = Dataset() ds.PatientName = "CITIZEN" msg = ( "Unable to determine the encoding to use for writing the dataset, " "please set the file meta's Transfer Syntax UID or use the " "'implicit_vr' and 'little_endian' arguments" ) with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO()) # Test public transfer syntax OK ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = "1.2.840.10008.1.2.1" ds.save_as(DicomBytesIO()) def test_save_as_undefined(self): """Test setting is_undefined_length correctly.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = JPEGBaseline8Bit ds.PixelData = encapsulate([b"\x00\x01\x02\x03\x04\x05\x06"]) elem = ds["PixelData"] elem.VR = "OB" # Compressed # False to True assert not elem.is_undefined_length ds.save_as(fp) assert elem.is_undefined_length # True to True ds.save_as(fp) assert elem.is_undefined_length # Uncompressed ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian # True to False ds.save_as(fp) assert not elem.is_undefined_length # False to False ds.save_as(fp) assert not elem.is_undefined_length def test_save_as_undefined_private(self): """Test is_undefined_length unchanged with private tsyntax.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = "1.2.3.4.5" ds.PixelData = encapsulate([b"\x00\x01\x02\x03\x04\x05\x06"]) elem = ds["PixelData"] elem.VR = "OB" # Unchanged - False assert not elem.is_undefined_length ds.save_as(fp, implicit_vr=True) assert not elem.is_undefined_length # Unchanged - True elem.is_undefined_length = True ds.save_as(fp, implicit_vr=True) assert elem.is_undefined_length def test_save_as_undefined_no_tsyntax(self): """Test is_undefined_length unchanged with no tsyntax.""" fp = DicomBytesIO() ds = Dataset() ds.PixelData = encapsulate([b"\x00\x01\x02\x03\x04\x05\x06"]) elem = ds["PixelData"] elem.VR = "OB" # Unchanged - False assert not elem.is_undefined_length ds.save_as(fp, implicit_vr=False) assert not elem.is_undefined_length # Unchanged - True elem.is_undefined_length = True ds.save_as(fp, implicit_vr=False) assert elem.is_undefined_length def test_convert_big_little_endian_raises(self): """Test conversion between big <-> little endian raises exception""" ds = Dataset() ds._read_implicit = True msg = ( r"'Dataset.save_as\(\)' cannot be used to " r"convert between little and big endian encoding. Please " r"read the documentation for filewriter.dcmwrite\(\) " r"if this is what you really want to do" ) # Test using is_little_endian ds._is_implicit_VR = True ds._is_little_endian = True ds._read_little = False with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO()) ds._read_little = True ds._is_little_endian = False with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO()) # Test using args with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO(), implicit_vr=True, little_endian=False) ds._read_little = False with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO(), implicit_vr=True, little_endian=True) # Test using transfer syntax ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO()) ds._read_little = True ds.file_meta.TransferSyntaxUID = ExplicitVRBigEndian with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO()) def test_overwrite(self): """Test the overwrite argument""" ds = dcmread(get_testdata_file("MR_small.dcm")) patient_name = ds.PatientName with tempfile.TemporaryDirectory() as tdir: p = Path(tdir) / "foo.dcm" p.touch() assert p.exists() msg = r"File exists: '(.*)foo.dcm'" with pytest.raises(FileExistsError, match=msg): ds.save_as(p, overwrite=False) ds.save_as(p, overwrite=True) assert dcmread(p).PatientName == patient_name class TestDatasetElements: """Test valid assignments of data elements""" def setup_method(self): self.ds = Dataset() self.sub_ds1 = Dataset() self.sub_ds2 = Dataset() def test_sequence_assignment(self): """Assignment to SQ works only if valid Sequence assigned.""" msg = r"Sequence contents must be 'Dataset' instances" with pytest.raises(TypeError, match=msg): self.ds.ConceptCodeSequence = [1, 2, 3] # check also that assigning proper sequence *does* work self.ds.ConceptCodeSequence = [self.sub_ds1, self.sub_ds2] assert isinstance(self.ds.ConceptCodeSequence, Sequence) def test_formatted_DS_assignment(self): """Assigning an auto-formatted decimal string works as expected.""" ds = pydicom.Dataset() ds.PatientWeight = DS(math.pi, auto_format=True) assert ds.PatientWeight.auto_format # Check correct 16-character string representation assert str(ds.PatientWeight) == "3.14159265358979" def test_ensure_file_meta(self): assert not hasattr(self.ds, "file_meta") self.ds.ensure_file_meta() assert hasattr(self.ds, "file_meta") assert not self.ds.file_meta def test_validate_and_correct_file_meta(self): file_meta = FileMetaDataset() validate_file_meta(file_meta, enforce_standard=False) with pytest.raises(AttributeError): validate_file_meta(file_meta, enforce_standard=True) file_meta = Dataset() # not FileMetaDataset for bkwds-compat checks file_meta.PatientID = "PatientID" for enforce_standard in (True, False): with pytest.raises( ValueError, match=r"Only File Meta Information group " r"\(0002,eeee\) elements may be present .*", ): validate_file_meta(file_meta, enforce_standard=enforce_standard) file_meta = FileMetaDataset() file_meta.MediaStorageSOPClassUID = "1.2.3" file_meta.MediaStorageSOPInstanceUID = "1.2.4" # still missing TransferSyntaxUID with pytest.raises(AttributeError): validate_file_meta(file_meta, enforce_standard=True) file_meta.TransferSyntaxUID = ImplicitVRLittleEndian validate_file_meta(file_meta, enforce_standard=True) # check the default created values assert b"\x00\x01" == file_meta.FileMetaInformationVersion assert PYDICOM_IMPLEMENTATION_UID == file_meta.ImplementationClassUID assert file_meta.ImplementationVersionName.startswith("PYDICOM ") file_meta.ImplementationClassUID = "1.2.3.4" file_meta.ImplementationVersionName = "ACME LTD" validate_file_meta(file_meta, enforce_standard=True) # check that existing values are left alone assert "1.2.3.4" == file_meta.ImplementationClassUID assert "ACME LTD" == file_meta.ImplementationVersionName class TestFileDataset: def setup_method(self): self.test_file = get_testdata_file("CT_small.dcm") def test_pickle_raw_data(self): ds = pydicom.dcmread(self.test_file) s = pickle.dumps({"ds": ds}) ds1 = pickle.loads(s)["ds"] assert ds == ds1 assert ds1.Modality == "CT" def test_pickle_data_elements(self): ds = pydicom.dcmread(self.test_file) for e in ds: # make sure all data elements have been loaded pass s = pickle.dumps({"ds": ds}) ds1 = pickle.loads(s)["ds"] assert ds == ds1 def test_pickle_nested_sequence(self): ds = pydicom.dcmread(get_testdata_file("nested_priv_SQ.dcm")) for e in ds: # make sure all data elements have been loaded pass s = pickle.dumps({"ds": ds}) ds1 = pickle.loads(s)["ds"] assert ds == ds1 def test_pickle_modified(self): """Test pickling a modified dataset.""" ds = pydicom.dcmread(self.test_file) ds.PixelSpacing = [1.0, 1.0] s = pickle.dumps({"ds": ds}) ds1 = pickle.loads(s)["ds"] assert ds == ds1 assert ds1.PixelSpacing == [1.0, 1.0] ds1.PixelSpacing.insert(1, 2) assert [1, 2, 1] == ds1.PixelSpacing def test_equality_file_meta(self): """Dataset: equality ignores metadata""" d = dcmread(self.test_file) e = dcmread(self.test_file) assert d == e e._read_implicit = not e._read_implicit assert d == e e._read_implicit = not e._read_implicit assert d == e e._read_little = not e._read_little assert d == e e._read_little = not e._read_little assert d == e e.filename = "test_filename.dcm" assert d == e def test_creation_with_container(self): """FileDataset.__init__ works OK with a container such as gzip""" class Dummy: filename = "/some/path/to/test" ds = Dataset() ds.PatientName = "CITIZEN^Jan" fds = FileDataset(Dummy(), ds) assert "/some/path/to/test" == fds.filename @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_with_array(self): """Test Dataset within a numpy array""" ds = get_testdata_file("CT_small.dcm", read=True) arr = numpy.array([ds]) assert arr[0].PatientName == ds.PatientName assert arr.dtype == object assert arr.shape == (1,) assert arr.flags.writeable arr[0].PatientName = "Citizen^Jan" assert arr[0].PatientName == "Citizen^Jan" assert "BeamSequence" not in arr[0] arr[0].BeamSequence = [] assert arr[0].BeamSequence == [] elem = arr[0]["PatientID"] assert isinstance(elem, DataElement) b = DicomBytesIO() arr[0].save_as(b) b.seek(0) out = dcmread(b) assert out == arr[0] def test_dataset_overrides_all_dict_attributes(self): """Ensure that we don't use inherited dict functionality""" ds = Dataset() di = dict() expected_diff = { "fromkeys", "__reversed__", "__ror__", "__ior__", "__or__", "__class_getitem__", } if "PyPy" in python_implementation(): # __ror__ missing in <= 3.10.13 if "__ror__" not in dir(dict): expected_diff.remove("__ror__") assert expected_diff == set(dir(di)) - set(dir(ds)) def test_copy_filelike_open(self): f = open(get_testdata_file("CT_small.dcm"), "rb") ds = pydicom.dcmread(f) assert not f.closed ds_copy = copy.copy(ds) assert ds.PatientName == ds_copy.PatientName assert ds.filename.endswith("CT_small.dcm") assert ds.buffer is None assert ds_copy.filename.endswith("CT_small.dcm") assert ds_copy.buffer is None assert ds_copy == ds assert ds_copy.fileobj_type == ds.fileobj_type f.close() def test_copy_filelike_closed(self): f = open(get_testdata_file("CT_small.dcm"), "rb") ds = pydicom.dcmread(f) f.close() assert f.closed ds_copy = copy.copy(ds) assert ds.PatientName == ds_copy.PatientName assert ds.filename.endswith("CT_small.dcm") assert ds.buffer is None assert ds_copy.filename.endswith("CT_small.dcm") assert ds_copy.buffer is None assert ds_copy == ds assert ds_copy.fileobj_type == ds.fileobj_type def test_copy_buffer_open(self): with open(get_testdata_file("CT_small.dcm"), "rb") as fb: data = fb.read() buff = io.BytesIO(data) ds = pydicom.dcmread(buff) ds_copy = copy.copy(ds) assert ds.filename is None assert ds.buffer is buff assert ds_copy.filename is None assert ds_copy == ds # Shallow copy, the two buffers share the same object assert ds_copy.buffer is ds.buffer assert not ds.buffer.closed assert ds_copy.fileobj_type == ds.fileobj_type def test_copy_buffer_closed(self): with open(get_testdata_file("CT_small.dcm"), "rb") as fb: data = fb.read() buff = io.BytesIO(data) ds = pydicom.dcmread(buff) buff.close() assert buff.closed ds_copy = copy.copy(ds) assert ds_copy == ds assert ds.filename is None assert ds.buffer is buff assert ds.buffer.closed assert ds_copy.filename is None assert ds_copy.buffer is buff assert ds_copy.buffer.closed # Shallow copy, the two buffers share the same object assert ds_copy.buffer is ds.buffer assert ds_copy.fileobj_type == ds.fileobj_type def test_deepcopy_filelike_open(self): f = open(get_testdata_file("CT_small.dcm"), "rb") ds = pydicom.dcmread(f) assert not f.closed ds_copy = copy.deepcopy(ds) assert ds.PatientName == ds_copy.PatientName assert ds.filename.endswith("CT_small.dcm") assert ds.buffer is None assert ds_copy.filename.endswith("CT_small.dcm") assert ds_copy.buffer is None assert ds_copy == ds assert ds_copy.fileobj_type == ds.fileobj_type f.close() def test_deepcopy_filelike_closed(self): f = open(get_testdata_file("CT_small.dcm"), "rb") ds = pydicom.dcmread(f) f.close() assert f.closed ds_copy = copy.deepcopy(ds) assert ds.PatientName == ds_copy.PatientName assert ds.filename.endswith("CT_small.dcm") assert ds.buffer is None assert ds_copy.filename.endswith("CT_small.dcm") assert ds_copy.buffer is None assert ds_copy == ds assert ds_copy.fileobj_type == ds.fileobj_type def test_deepcopy_buffer_open(self): # regression test for #1147 with open(get_testdata_file("CT_small.dcm"), "rb") as fb: data = fb.read() buff = io.BytesIO(data) ds = pydicom.dcmread(buff) assert not buff.closed ds_copy = copy.deepcopy(ds) assert ds_copy == ds assert ds.filename is None assert ds.buffer is buff assert not ds.buffer.closed assert ds_copy.filename is None assert isinstance(ds_copy.buffer, io.BytesIO) assert not ds_copy.buffer.closed # Deep copy, the two buffers should not be the same object, but equal otherwise assert ds.buffer is not ds_copy.buffer assert ds.buffer.getvalue() == ds_copy.buffer.getvalue() def test_deepcopy_buffer_closed(self): # regression test for #1147 with open(get_testdata_file("CT_small.dcm"), "rb") as fb: data = fb.read() buff = io.BytesIO(data) ds = pydicom.dcmread(buff) buff.close() assert buff.closed msg = ( r"The ValueError exception '(.*)' occurred trying to deepcopy the " "buffer-like the dataset was read from, the 'buffer' attribute will be " "set to 'None' in the copied object" ) with pytest.warns(UserWarning, match=msg): ds_copy = copy.deepcopy(ds) assert ds_copy == ds # Deep copy, the two buffers should not be the same object but # cannot copy a closed IOBase object assert ds.filename is None assert ds.buffer is buff assert ds.buffer.closed assert ds_copy.filename is None assert ds_copy.buffer is None def test_equality_with_different_metadata(self): ds = dcmread(get_testdata_file("CT_small.dcm")) ds2 = copy.deepcopy(ds) assert ds == ds2 ds.filename = "foo.dcm" ds._read_implicit = not ds._read_implicit ds._read_little = not ds._read_little ds.file_meta = None ds.preamble = None assert ds == ds2 def test_deepcopy_without_filename(self): """Regression test for #1571.""" file_meta = FileMetaDataset() ds = FileDataset( filename_or_obj="", dataset={}, file_meta=file_meta, preamble=b"\0" * 128 ) assert ds.filename == "" assert ds.buffer is None ds2 = copy.deepcopy(ds) assert ds2.filename == "" assert ds2.buffer is None def test_deepcopy_dataset_subclass(self): """Regression test for #1813.""" class MyDatasetSubclass(pydicom.Dataset): pass my_dataset_subclass = MyDatasetSubclass() ds2 = copy.deepcopy(my_dataset_subclass) assert ds2.__class__ is MyDatasetSubclass def test_deepcopy_after_update(self): """Regression test for #1816""" ds = Dataset() ds.BeamSequence = [] ds2 = Dataset() ds2.update(ds) ds3 = copy.deepcopy(ds2) assert ds3 == ds def test_buffer(self): """Test the buffer attribute.""" with open(get_testdata_file("CT_small.dcm"), "rb") as fb: buffer = io.BytesIO(fb.read()) ds = dcmread(buffer) assert ds.filename is None assert ds.buffer is buffer assert ds.fileobj_type == io.BytesIO # Deflated datasets get inflated to a DicomBytesIO() buffer ds = dcmread(get_testdata_file("image_dfl.dcm")) assert ds.filename.endswith("image_dfl.dcm") assert isinstance(ds.buffer, DicomBytesIO) assert ds.fileobj_type == DicomBytesIO class TestDatasetOverlayArray: """Tests for Dataset.overlay_array().""" def setup_method(self): """Setup the test datasets and the environment.""" self.ds = dcmread(get_testdata_file("MR-SIEMENS-DICOM-WithOverlays.dcm")) @pytest.mark.skipif(HAVE_NP, reason="numpy is available") def test_possible_not_available(self): """Test with possible but not available handlers.""" msg = r"NumPy is required for FileDataset.overlay_array\(\)" with pytest.raises(ImportError, match=msg): self.ds.overlay_array(0x6000) @pytest.mark.skipif(not HAVE_NP, reason="numpy is not available") def test_possible_available(self): """Test with possible and available handlers.""" assert isinstance(self.ds.overlay_array(0x6000), numpy.ndarray) class TestFileMeta: def test_type_exception(self): """Assigning ds.file_meta warns if not FileMetaDataset instance""" ds = Dataset() msg = "'Dataset.file_meta' must be a 'FileMetaDataset' instance" with pytest.raises(TypeError, match=msg): ds.file_meta = list() def test_assign_file_meta(self): """Test can only set group 2 elements in File Meta""" # FileMetaDataset accepts only group 2 file_meta = FileMetaDataset() with pytest.raises(ValueError): file_meta.PatientID = "123" # No error if assign empty file meta ds = Dataset() ds.file_meta = FileMetaDataset() # Can assign non-empty file_meta ds_meta = FileMetaDataset() ds_meta.TransferSyntaxUID = "1.2" ds.file_meta = ds_meta # Error on assigning file meta if any non-group 2 with pytest.raises(ValueError): ds_meta.PatientName = "x" def test_file_meta_conversion(self): """Test conversion to FileMetaDataset from Dataset.""" ds = Dataset() meta = Dataset() meta.TransferSyntaxUID = "1.2" ds.file_meta = meta assert isinstance(ds.file_meta, FileMetaDataset) assert ds.file_meta.TransferSyntaxUID == "1.2" ds.file_meta = None meta.PatientID = "12345678" msg = ( r"File meta datasets may only contain group 2 elements but the " r"following elements are present: \(0010,0020\)" ) with pytest.raises(ValueError, match=msg): ds.file_meta = meta assert ds.file_meta is None def test_init_file_meta(self): """Check instantiation of FileMetaDataset""" ds_meta = Dataset() ds_meta.TransferSyntaxUID = "1.2" # Accepts with group 2 file_meta = FileMetaDataset(ds_meta) assert "1.2" == file_meta.TransferSyntaxUID # Accepts dict dict_meta = {0x20010: DataElement(0x20010, "UI", "2.3")} file_meta = FileMetaDataset(dict_meta) assert "2.3" == file_meta.TransferSyntaxUID # Fails if not dict or Dataset with pytest.raises(TypeError): FileMetaDataset(["1", "2"]) # Raises error if init with non-group-2 ds_meta.PatientName = "x" with pytest.raises(ValueError): FileMetaDataset(ds_meta) # None can be passed, to match Dataset behavior FileMetaDataset(None) def test_set_file_meta(self): """Check adding items to existing FileMetaDataset""" file_meta = FileMetaDataset() # Raise error if set non-group 2 with pytest.raises(ValueError): file_meta.PatientID = "1" # Check assigning via non-Tag file_meta[0x20010] = DataElement(0x20010, "UI", "2.3") # Check RawDataElement file_meta[0x20010] = RawDataElement(0x20010, "UI", 4, "1.23", 0, True, True) def test_del_file_meta(self): """Can delete the file_meta attribute""" ds = Dataset() ds.file_meta = FileMetaDataset() del ds.file_meta assert not hasattr(ds, "file_meta") def test_show_file_meta(self): orig_show = pydicom.config.show_file_meta pydicom.config.show_file_meta = True ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = "1.2" ds.PatientName = "test" shown = str(ds) assert shown.startswith("Dataset.file_meta ---") assert shown.splitlines()[1].startswith("(0002,0010) Transfer Syntax UID") # Turn off file_meta display pydicom.config.show_file_meta = False shown = str(ds) assert shown.startswith("(0010,0010) Patient's Name") pydicom.config.show_file_meta = orig_show @pytest.mark.parametrize("copy_method", [Dataset.copy, copy.copy, copy.deepcopy]) def test_copy(self, copy_method): ds = Dataset() ds.PatientName = "John^Doe" ds.BeamSequence = [Dataset(), Dataset(), Dataset()] ds.BeamSequence[0].Manufacturer = "Linac, co." ds.BeamSequence[1].Manufacturer = "Linac and Sons, co." ds.set_original_encoding(True, True, "utf-8") ds_copy = copy_method(ds) assert isinstance(ds_copy, Dataset) assert len(ds_copy) == 2 assert ds_copy.PatientName == "John^Doe" assert ds_copy.BeamSequence[0].Manufacturer == "Linac, co." assert ds_copy.BeamSequence[1].Manufacturer == "Linac and Sons, co." if copy_method == copy.deepcopy: assert id(ds_copy.BeamSequence[0]) != id(ds.BeamSequence[0]) else: # shallow copy assert id(ds_copy.BeamSequence[0]) == id(ds.BeamSequence[0]) assert ds_copy.original_encoding == (True, True) assert ds_copy.original_character_set == "utf-8" def test_tsyntax_encoding(self): file_meta = FileMetaDataset() assert file_meta._tsyntax_encoding == (None, None) file_meta.TransferSyntaxUID = ImplicitVRLittleEndian assert file_meta._tsyntax_encoding == (True, True) file_meta.TransferSyntaxUID = "1.2.3.4" assert file_meta._tsyntax_encoding == (None, None) file_meta.TransferSyntaxUID = CTImageStorage assert file_meta._tsyntax_encoding == (None, None) @pytest.fixture def contains_raise(): """Raise on invalid keys with Dataset.__contains__()""" original = config.INVALID_KEY_BEHAVIOR config.INVALID_KEY_BEHAVIOR = "RAISE" yield config.INVALID_KEY_BEHAVIOR = original @pytest.fixture def contains_ignore(): """Ignore invalid keys with Dataset.__contains__()""" original = config.INVALID_KEY_BEHAVIOR config.INVALID_KEY_BEHAVIOR = "IGNORE" yield config.INVALID_KEY_BEHAVIOR = original @pytest.fixture def contains_warn(): """Warn on invalid keys with Dataset.__contains__()""" original = config.INVALID_KEY_BEHAVIOR config.INVALID_KEY_BEHAVIOR = "WARN" yield config.INVALID_KEY_BEHAVIOR = original CAMEL_CASE = ( [ # Shouldn't warn "Rows", "_Rows", "Rows_", "rows", "_rows", "__rows", "rows_", "ro_ws", "rowds", "BitsStored", "bits_Stored", "Bits_Stored", "bits_stored", "_BitsStored", "BitsStored_", "B_itsStored", "BitsS_tored", "12LeadECG", "file_meta", "filename", "is_implicit_VR", "is_little_endian", "preamble", "timestamp", "fileobj_type", "patient_records", "_parent_encoding", "_dict", "is_decompressed", "read_encoding", "_private_blocks", "default_element_format", "indent_chars", "default_sequence_element_format", "PatientName", ], [ # Should warn "bitsStored", "BitSStored", "TwelveLeadECG", "SOPInstanceUId", "PatientsName", "Rowds", ], ) @pytest.fixture def setattr_raise(): """Raise on Dataset.__setattr__() close keyword matches.""" original = config.INVALID_KEYWORD_BEHAVIOR config.INVALID_KEYWORD_BEHAVIOR = "RAISE" yield config.INVALID_KEYWORD_BEHAVIOR = original @pytest.fixture def setattr_ignore(): """Ignore Dataset.__setattr__() close keyword matches.""" original = config.INVALID_KEYWORD_BEHAVIOR config.INVALID_KEYWORD_BEHAVIOR = "IGNORE" yield config.INVALID_KEYWORD_BEHAVIOR = original @pytest.fixture def setattr_warn(): """Warn on Dataset.__setattr__() close keyword matches.""" original = config.INVALID_KEYWORD_BEHAVIOR config.INVALID_KEYWORD_BEHAVIOR = "WARN" yield config.INVALID_KEYWORD_BEHAVIOR = original def test_setattr_warns(setattr_warn): """ "Test warnings for Dataset.__setattr__() for close matches.""" with assert_no_warning(): ds = Dataset() deprecations = ( "is_implicit_VR", "is_little_endian", "read_encoding", ) for s in CAMEL_CASE[0]: if s in deprecations: with pytest.warns(DeprecationWarning): val = getattr(ds, s, None) setattr(ds, s, val) else: with assert_no_warning(): val = getattr(ds, s, None) setattr(ds, s, val) for s in CAMEL_CASE[1]: msg = ( r"Camel case attribute '" + s + r"' used which is not in the " r"element keyword data dictionary" ) with pytest.warns(UserWarning, match=msg): val = getattr(ds, s, None) setattr(ds, s, None) def test_setattr_raises(setattr_raise): """ "Test exceptions for Dataset.__setattr__() for close matches.""" with assert_no_warning(): ds = Dataset() deprecations = ( "is_implicit_VR", "is_little_endian", "read_encoding", ) for s in CAMEL_CASE[0]: if s in deprecations: with pytest.warns(DeprecationWarning): val = getattr(ds, s, None) setattr(ds, s, val) else: with assert_no_warning(): val = getattr(ds, s, None) setattr(ds, s, val) for s in CAMEL_CASE[1]: msg = ( r"Camel case attribute '" + s + r"' used which is not in the " r"element keyword data dictionary" ) with pytest.raises(ValueError, match=msg): val = getattr(ds, s, None) setattr(ds, s, None) def test_setattr_ignore(setattr_ignore): """Test config.INVALID_KEYWORD_BEHAVIOR = 'IGNORE'""" with assert_no_warning(): ds = Dataset() deprecations = ( "is_implicit_VR", "is_little_endian", "read_encoding", ) for s in CAMEL_CASE[0]: if s in deprecations: with pytest.warns(DeprecationWarning): val = getattr(ds, s, None) setattr(ds, s, val) else: with assert_no_warning(): val = getattr(ds, s, None) setattr(ds, s, val) ds = Dataset() for s in CAMEL_CASE[1]: with assert_no_warning(): getattr(ds, s, None) setattr(ds, s, None) class TestDatasetWithBufferedData: """Tests for datasets with buffered element values""" def test_pickle_bytesio(self): """Test pickling a dataset with buffered element value""" b = io.BytesIO(b"\x00\x01") ds = Dataset() ds.PixelData = b s = pickle.dumps({"ds": ds}) ds1 = pickle.loads(s)["ds"] assert ds.PixelData is not ds1.PixelData assert ds == ds1 def test_pickle_bufferedreader_raises(self): with tempfile.TemporaryDirectory() as tdir: with open(f"{tdir}/foo.bin", "wb") as f: f.write(b"\x00\x01\x02\x03\x04") with open(f"{tdir}/foo.bin", "rb") as f: ds = Dataset() ds.PixelData = f with pytest.raises(TypeError, match="cannot"): pickle.dumps({"ds": ds}) def test_copy_bytesio(self): """Test copy.copy() for dataset with buffered element value""" b = io.BytesIO(b"\x00\x01") ds = Dataset() ds.PixelData = b ds2 = copy.copy(ds) assert isinstance(ds2.PixelData, io.BytesIO) assert ds2.PixelData is ds.PixelData def test_copy_bytesio_closed(self): """Test copy.copy() for dataset with buffered element value""" b = io.BytesIO(b"\x00\x01") ds = Dataset() ds.PixelData = b b.close() ds2 = copy.copy(ds) assert isinstance(ds2.PixelData, io.BytesIO) assert ds2.PixelData is ds.PixelData assert ds2.PixelData.closed def test_copy_bufferedreader(self): with tempfile.TemporaryDirectory() as tdir: with open(f"{tdir}/foo.bin", "wb") as f: f.write(b"\x00\x01\x02\x03\x04") with open(f"{tdir}/foo.bin", "rb") as f: ds = Dataset() ds.PixelData = f ds2 = copy.copy(ds) assert isinstance(ds2.PixelData, io.BufferedReader) assert ds2.PixelData is ds.PixelData def test_copy_bufferedreader_closed(self): with tempfile.TemporaryDirectory() as tdir: with open(f"{tdir}/foo.bin", "wb") as f: f.write(b"\x00\x01\x02\x03\x04") with open(f"{tdir}/foo.bin", "rb") as f: ds = Dataset() ds.PixelData = f ds.PixelData.close() ds2 = copy.copy(ds) assert isinstance(ds2.PixelData, io.BufferedReader) assert ds2.PixelData is ds.PixelData assert ds2.PixelData.closed def test_deepcopy_bytesio(self): """Test copy.deepcopy() for dataset with buffered element value""" b = io.BytesIO(b"\x00\x01") ds = Dataset() ds.PixelData = b ds2 = copy.deepcopy(ds) assert isinstance(ds2.PixelData, io.BytesIO) assert ds2.PixelData is not ds.PixelData assert ds2.PixelData.getvalue() == ds.PixelData.getvalue() def test_deepcopy_bytesio_closed(self): """Test copy.deepcopy() for dataset with buffered element value""" b = io.BytesIO(b"\x00\x01") ds = Dataset() ds.PixelData = b b.close() msg = ( r"Error deepcopying the buffered element \(7FE0,0010\) 'Pixel Data': I/O " "operation on closed file" ) with pytest.raises(ValueError, match=msg): copy.deepcopy(ds) def test_deepcopy_bufferedreader_raises(self): with tempfile.TemporaryDirectory() as tdir: with open(f"{tdir}/foo.bin", "wb") as f: f.write(b"\x00\x01\x02\x03\x04") with open(f"{tdir}/foo.bin", "rb") as f: ds = Dataset() ds.PixelData = f msg = ( r"Error deepcopying the buffered element \(7FE0,0010\) 'Pixel Data': " r"cannot (.*)BufferedReader" ) with pytest.raises(TypeError, match=msg): copy.deepcopy(ds) @pytest.fixture def use_future(): original = config._use_future config._use_future = True yield config._use_future = original class TestFuture: def test_save_as_write_like_original_raises(self, use_future): ds = Dataset() msg = ( "'write_like_original' is no longer accepted as a positional or " "keyword argument, use 'enforce_file_format' instead" ) with pytest.raises(TypeError, match=msg): ds.save_as(None, write_like_original=False) def test_save_as_endianness_conversion(self, use_future): ds = Dataset() ds._is_implicit_VR = True ds._is_little_endian = True ds._read_implicit = False ds._read_little = False ds.save_as(DicomBytesIO()) ds._read_little = True ds._is_little_endian = False ds.save_as(DicomBytesIO()) def test_is_original_encoding(self, use_future): ds = Dataset() ds._read_charset = ["latin_1"] ds.SpecificCharacterSet = "ISO_IR 100" assert ds.is_original_encoding ds.SpecificCharacterSet = "ISO_IR 192" assert not ds.is_original_encoding ds.SpecificCharacterSet = "ISO_IR 100" assert ds.is_original_encoding def test_is_little_endian_raises(self, use_future): ds = Dataset() assert not hasattr(ds, "_is_little_endian") msg = "'Dataset' object has no attribute 'is_little_endian'" with pytest.raises(AttributeError, match=msg): ds.is_little_endian = True ds._is_little_endian = True with pytest.raises(AttributeError, match=msg): ds.is_little_endian def test_is_implicit_VR_raises(self, use_future): ds = Dataset() assert not hasattr(ds, "_is_implicit_VR") msg = "'Dataset' object has no attribute 'is_implicit_VR'" with pytest.raises(AttributeError, match=msg): ds.is_implicit_VR = True ds._is_implicit_VR = True with pytest.raises(AttributeError, match=msg): ds.is_implicit_VR def test_read_encoding_raises(self, use_future): ds = Dataset() msg = "'Dataset' object has no attribute 'read_encoding'" with pytest.raises(AttributeError, match=msg): ds.read_encoding = "foo" ds._read_charset = "foo" with pytest.raises(AttributeError, match=msg): ds.read_encoding def test_read_implicit_vr_raises(self, use_future): ds = Dataset() ds._read_implicit = True msg = "'Dataset' object has no attribute 'read_implicit_vr'" with pytest.raises(AttributeError, match=msg): ds.read_implicit_vr def test_read_little_endian_raises(self, use_future): ds = Dataset() ds._read_little = True msg = "'Dataset' object has no attribute 'read_little_endian'" with pytest.raises(AttributeError, match=msg): ds.read_little_endian def test_slice(self, use_future): ds = Dataset() ds._is_little_endian = True ds._is_implicit_VR = True ds = ds[0x00080001:] assert not hasattr(ds, "_is_little_endian") assert not hasattr(ds, "_is_implicit_VR") def test_convert_pixel_data(self, use_future): msg = "'Dataset' object has no attribute 'convert_pixel_data'" with pytest.raises(AttributeError, match=msg): Dataset().convert_pixel_data() def test_pixel_array_options(self, use_future): msg = ( r"Dataset.pixel_array_options\(\) got an unexpected " "keyword argument 'use_v2_backend'" ) with pytest.raises(TypeError, match=msg): Dataset().pixel_array_options(use_v2_backend=True) def test_decompress(self, use_future): msg = ( r"Dataset.decompress\(\) got an unexpected " "keyword argument 'handler_name'" ) with pytest.raises(TypeError, match=msg): Dataset().decompress(handler_name="foo") pydicom-pydicom-20aa4b7/tests/test_dictionary.py000066400000000000000000000155541515706620200221600ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Test for datadict.py""" import pytest from pydicom import DataElement from pydicom.dataset import Dataset from pydicom.datadict import ( keyword_for_tag, dictionary_description, dictionary_has_tag, repeater_has_tag, repeater_has_keyword, get_private_entry, dictionary_VM, private_dictionary_VR, private_dictionary_VM, add_private_dict_entries, add_private_dict_entry, _dictionary_vr_fast, ) from pydicom.datadict import add_dict_entry, add_dict_entries from .test_util import save_private_dict class TestDict: def test_tag_not_found(self): """dicom_dictionary: CleanName returns blank string for unknown tag""" assert "" == keyword_for_tag(0x99991111) def test_repeaters(self): """dicom_dictionary: Tags with "x" return correct dict info........""" assert "Transform Label" == dictionary_description(0x280400) assert "Rows For Nth Order Coefficients" == dictionary_description(0x280410) def test_dict_has_tag(self): """Test dictionary_has_tag""" assert dictionary_has_tag(0x00100010) assert not dictionary_has_tag(0x11110010) assert dictionary_has_tag("PatientName") assert not dictionary_has_tag("PatientMane") def test_repeater_has_tag(self): """Test repeater_has_tag""" assert repeater_has_tag(0x60000010) assert repeater_has_tag(0x60020010) assert not repeater_has_tag(0x00100010) def test_repeater_has_keyword(self): """Test repeater_has_keyword""" assert repeater_has_keyword("OverlayData") assert not repeater_has_keyword("PixelData") def test_get_private_entry(self): """Test get_private_entry""" # existing entry entry = get_private_entry((0x0903, 0x0011), "GEIIS PACS") assert "US" == entry[0] # VR assert "1" == entry[1] # VM assert "Significant Flag" == entry[2] # name assert not entry[3] # is retired # existing entry in another slot entry = get_private_entry((0x0903, 0x1011), "GEIIS PACS") assert "Significant Flag" == entry[2] # name # non-existing entry with pytest.raises(KeyError): get_private_entry((0x0903, 0x0011), "Nonexisting") with pytest.raises(KeyError): get_private_entry((0x0903, 0x0091), "GEIIS PACS") def test_add_entry(self): """dicom_dictionary: Can add and use a single dictionary entry""" add_dict_entry(0x10021001, "UL", "TestOne", "Test One") add_dict_entry(0x10021002, "DS", "TestTwo", "Test Two", VM="3") ds = Dataset() ds.TestOne = 42 ds.TestTwo = ["1", "2", "3"] def test_add_entry_raises_for_private_tag(self): with pytest.raises( ValueError, match='Private tags cannot be added using "add_dict_entries"' ): add_dict_entry(0x10011101, "DS", "Test One", "Test One") def test_add_entries(self): """dicom_dictionary: add and use a dict of new dictionary entries""" new_dict_items = { 0x10021001: ("UL", "1", "Test One", "", "TestOne"), 0x10021002: ("DS", "3", "Test Two", "", "TestTwo"), } add_dict_entries(new_dict_items) ds = Dataset() ds.TestOne = 42 ds.TestTwo = ["1", "2", "3"] def test_add_entries_raises_for_private_tags(self): new_dict_items = { 0x10021001: ("UL", "1", "Test One", "", "TestOne"), 0x10011002: ("DS", "3", "Test Two", "", "TestTwo"), } with pytest.raises( ValueError, match='Private tags cannot be added using "add_dict_entries"' ): add_dict_entries(new_dict_items) def test_add_private_entry(self): with save_private_dict(): add_private_dict_entry("ACME 3.1", 0x10011101, "DS", "Test One", "3") entry = get_private_entry((0x1001, 0x0001), "ACME 3.1") assert "DS" == entry[0] # VR assert "3" == entry[1] # VM assert "Test One" == entry[2] # description def test_add_private_entry_raises_for_non_private_tag(self): msg = ( r"Non-private tags cannot be added using " r"'add_private_dict_entries\(\)' \- use " r"'add_dict_entries\(\)' instead" ) with pytest.raises(ValueError, match=msg): add_private_dict_entry("ACME 3.1", 0x10021101, "DS", "Test One") def test_add_private_entries(self): """dicom_dictionary: add and use a dict of new dictionary entries""" new_dict_items = { 0x10011001: ( "SH", "1", "Test One", ), 0x10011002: ("DS", "3", "Test Two", "", "TestTwo"), } add_private_dict_entries("ACME 3.1", new_dict_items) ds = Dataset() ds[0x10010010] = DataElement(0x10010010, "LO", "ACME 3.1") ds[0x10011001] = DataElement(0x10011001, "SH", "Test") ds[0x10011002] = DataElement(0x10011002, "DS", "1\\2\\3") assert "Test" == ds[0x10011001].value assert [1, 2, 3] == ds[0x10011002].value def test_add_private_entries_raises_for_non_private_tags(self): new_dict_items = { 0x10021001: ("UL", "1", "Test One", "", "TestOne"), 0x10011002: ("DS", "3", "Test Two", "", "TestTwo"), } msg = ( r"Non-private tags cannot be added using " r"'add_private_dict_entries\(\)' \- use " r"'add_dict_entries\(\)' instead" ) with pytest.raises(ValueError, match=msg): add_private_dict_entries("ACME 3.1", new_dict_items) def test_dictionary_VM(self): """Test dictionary_VM""" assert dictionary_VM(0x00000000) == "1" assert dictionary_VM(0x00081163) == "2" assert dictionary_VM(0x0000901) == "1-n" assert dictionary_VM(0x00041141) == "1-8" assert dictionary_VM(0x00080008) == "2-n" assert dictionary_VM(0x00080309) == "1-3" assert dictionary_VM(0x00081162) == "3-3n" def test_private_dict_VR(self): """Test private_dictionary_VR""" assert private_dictionary_VR(0x00090000, "ACUSON") == "IS" def test_private_dict_VM(self): """Test private_dictionary_VM""" assert private_dictionary_VM(0x00090000, "ACUSON") == "1" def test_dictionary_vr_fast(self): """Test _dictionary_vr_fast().""" assert _dictionary_vr_fast(0x00100010) == "PN" assert _dictionary_vr_fast(0x60000010) == "US" # masked msg = r"Tag \(0009,0003\) not found in DICOM dictionary" with pytest.raises(KeyError, match=msg): _dictionary_vr_fast(0x00090003) msg = r"Tag \(50F1,0010\) not found in DICOM dictionary" with pytest.raises(KeyError, match=msg): _dictionary_vr_fast(0x50F10010) pydicom-pydicom-20aa4b7/tests/test_encaps.py000066400000000000000000004141271515706620200212630ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Test for encaps.py""" from io import BytesIO import mmap from struct import unpack import tempfile import pytest from pydicom import dcmread, config, encaps from pydicom.data import get_testdata_file from pydicom.encaps import ( fragment_frame, itemize_frame, encapsulate, encapsulate_extended, parse_basic_offsets, parse_fragments, generate_fragments, generate_fragmented_frames, generate_frames, get_frame, _BufferedItem, EncapsulatedBuffer, encapsulate_buffer, encapsulate_extended_buffer, ) from pydicom.filebase import DicomBytesIO from pydicom.fileutil import read_buffer JP2K_10FRAME_NOBOT = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") class TestGetFrameOffsets: """Test encaps.get_frame_offsets""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.get_frame_offsets def test_bad_tag(self): """Test raises exception if no item tag.""" # (FFFE,E100) bytestream = b"\xFE\xFF\x00\xE1\x08\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" fp = DicomBytesIO(bytestream) fp.is_little_endian = True with pytest.raises( ValueError, match=r"Unexpected tag '\(FFFE,E100\)' when " r"parsing the Basic Offset Table item", ): self.func(fp) def test_bad_length_multiple(self): """Test raises exception if the item length is not a multiple of 4.""" # Length 10 bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0A\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True with pytest.raises( ValueError, match="The length of the Basic Offset Table item is not a multiple of 4", ): self.func(fp) def test_zero_length(self): """Test reading BOT with zero length""" bytestream = b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert (False, [0]) == self.func(fp) def test_multi_frame(self): """Test reading multi-frame BOT item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x10\x00\x00\x00" b"\x00\x00\x00\x00" b"\x66\x13\x00\x00" b"\xF4\x25\x00\x00" b"\xFE\x37\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert (True, [0, 4966, 9716, 14334]) == self.func(fp) def test_single_frame(self): """Test reading single-frame BOT item""" bytestream = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x00\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert (True, [0]) == self.func(fp) def test_not_little_endian(self): """Test reading big endian raises exception""" bytestream = b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = False with pytest.raises(ValueError, match="'fp.is_little_endian' must be True"): self.func(fp) class TestGetNrFragments: """Test encaps.get_nr_fragments""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.get_nr_fragments def test_item_undefined_length(self): """Test exception raised if item length undefined.""" bytestream = b"\xFE\xFF\x00\xE0\xFF\xFF\xFF\xFF\x00\x00\x00\x01" fp = DicomBytesIO(bytestream) fp.is_little_endian = True with pytest.raises(ValueError): self.func(fp) def test_item_sequence_delimiter(self): """Test that the fragments are returned if seq delimiter hit.""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert 1 == self.func(fp) def test_item_bad_tag(self): """Test exception raised if item has unexpected tag""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\x10\x00\x10\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True msg = ( r"Unexpected tag '\(0010,0010\)' at offset 12 when parsing the " r"encapsulated pixel data fragment items" ) with pytest.raises(ValueError, match=msg): self.func(fp) def test_single_fragment_no_delimiter(self): """Test single fragment is returned OK""" bytestream = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert 1 == self.func(fp) def test_multi_fragments_no_delimiter(self): """Test multi fragments are returned OK""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert 2 == self.func(fp) def test_single_fragment_delimiter(self): """Test single fragment is returned OK with sequence delimiter item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert 1 == self.func(fp) def test_multi_fragments_delimiter(self): """Test multi fragments are returned OK with sequence delimiter item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" b"\xFE\xFF\xDD\xE0" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert 2 == self.func(fp) def test_not_little_endian(self): """Test reading big endian raises exception""" bytestream = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = False with pytest.raises(ValueError, match="'fp.is_little_endian' must be True"): self.func(fp) class TestGeneratePixelDataFragment: """Test encaps.generate_pixel_data_fragment""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.generate_pixel_data_fragment def test_item_undefined_length(self): """Test exception raised if item length undefined.""" bytestream = b"\xFE\xFF\x00\xE0\xFF\xFF\xFF\xFF\x00\x00\x00\x01" fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) with pytest.raises( ValueError, match="Undefined item length at offset 4 when " "parsing the encapsulated pixel data " "fragments", ): next(fragments) pytest.raises(StopIteration, next, fragments) def test_item_sequence_delimiter(self): """Test that the fragments are returned if seq delimiter hit.""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) def test_item_bad_tag(self): """Test exception raised if item has unexpected tag""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\x10\x00\x10\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) assert next(fragments) == b"\x01\x00\x00\x00" with pytest.raises( ValueError, match=r"Unexpected tag '\(0010,0010\)' at offset " r"12 when parsing the encapsulated pixel " r"data fragment items", ): next(fragments) pytest.raises(StopIteration, next, fragments) def test_single_fragment_no_delimiter(self): """Test single fragment is returned OK""" bytestream = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) def test_multi_fragments_no_delimiter(self): """Test multi fragments are returned OK""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) assert next(fragments) == b"\x01\x00\x00\x00" assert next(fragments) == b"\x01\x02\x03\x04\x05\x06" pytest.raises(StopIteration, next, fragments) def test_single_fragment_delimiter(self): """Test single fragment is returned OK with sequence delimiter item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) def test_multi_fragments_delimiter(self): """Test multi fragments are returned OK with sequence delimiter item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" b"\xFE\xFF\xDD\xE0" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True fragments = self.func(fp) assert next(fragments) == b"\x01\x00\x00\x00" assert next(fragments) == b"\x01\x02\x03\x04\x05\x06" pytest.raises(StopIteration, next, fragments) def test_not_little_endian(self): """Test reading big endian raises exception""" bytestream = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = False fragments = self.func(fp) with pytest.raises(ValueError, match="'fp.is_little_endian' must be True"): next(fragments) class TestGeneratePixelDataFrames: """Test encaps.generate_pixel_data_frames""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.generate_pixel_data_frame def test_empty_bot_single_fragment(self): """Test a single-frame image where the frame is one fragments""" # 1 frame, 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_empty_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream, 1) assert next(frames) == (b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00") pytest.raises(StopIteration, next, frames) def test_bot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == (b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00") pytest.raises(StopIteration, next, frames) def test_multi_frame_one_to_one(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == b"\x01\x00\x00\x00" assert next(frames) == b"\x02\x00\x00\x00" assert next(frames) == b"\x03\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_multi_frame_three_to_one(self): """Test a multi-frame image where each frame is three fragments""" # 2 frames, each 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x24\x00\x00\x00" b"\x48\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" assert next(frames) == b"\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" assert next(frames) == b"\x03\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_multi_frame_varied_ratio(self): """Test a multi-frame image where each frames is random fragments""" # 3 frames, 1st is 1 fragment, 2nd is 3 fragments, 3rd is 2 fragments bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0E\x00\x00\x00" b"\x32\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x01\x00\x00\x00\x00\x01" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x03\x00\x00\x00\x00\x02" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x04" ) frames = self.func(bytestream) assert next(frames) == b"\x01\x00\x00\x00\x00\x01" assert next(frames) == (b"\x02\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x02") assert next(frames) == b"\x03\x00\x00\x00\x02\x04" pytest.raises(StopIteration, next, frames) def test_empty_bot_multi_fragments_per_frame(self): """Test multi-frame where multiple frags per frame and no BOT.""" # Regression test for #685 ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames frame_gen = self.func(ds.PixelData, ds.NumberOfFrames) for ii in range(10): next(frame_gen) with pytest.raises(StopIteration): next(frame_gen) class TestGeneratePixelData: """Test encaps.generate_pixel_data""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.generate_pixel_data def test_empty_bot_single_fragment(self): """Test a single-frame image where the frame is one fragments""" # 1 frame, 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_empty_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream, 1) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) def test_empty_bot_no_number_of_frames_raises(self): """Test parsing raises if not BOT and no number_of_frames.""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) msg = ( r"Unable to determine the frame boundaries for the encapsulated " r"pixel data as there is no Basic or Extended Offset Table and the " r"number of frames has not been supplied" ) with pytest.raises(ValueError, match=msg): next(self.func(bytestream)) def test_empty_bot_too_few_fragments(self): """Test parsing with too few fragments.""" ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames msg = ( "Unable to generate frames from the encapsulated pixel data as " "there are fewer fragments than frames; the dataset may be corrupt " "or the number of frames may be incorrect" ) with pytest.raises(ValueError, match=msg): next(self.func(ds.PixelData, 20)) def test_empty_bot_multi_fragments_per_frame(self): """Test parsing with multiple fragments per frame.""" # 4 frames in 6 fragments with JPEG EOI marker bytestream = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" ) frames = self.func(bytestream, 4) for ii in range(4): next(frames) with pytest.raises(StopIteration): next(frames) def test_empty_bot_no_marker(self): """Test parsing not BOT and no final marker with multi fragments.""" # 4 frames in 6 fragments with JPEG EOI marker (1 missing EOI) bytestream = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\x00\x00" ) frames = self.func(bytestream, 4) for ii in range(3): next(frames) msg = ( "The end of the encapsulated pixel data has been reached but fewer " "frames than expected have been found. Please confirm that the " "generated frame data is correct" ) with pytest.warns(UserWarning, match=msg): next(frames) with pytest.raises(StopIteration): next(frames) def test_empty_bot_missing_marker(self): """Test parsing no BOT and missing marker with multi fragments.""" # 4 frames in 6 fragments with JPEG EOI marker (1 missing EOI) bytestream = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" ) msg = ( "The end of the encapsulated pixel data has been reached but " "fewer frames than expected have been found" ) with pytest.warns(UserWarning, match=msg): for ii, frame in enumerate(self.func(bytestream, 4)): pass assert 2 == ii def test_bot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) def test_multi_frame_one_to_one(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == (b"\x01\x00\x00\x00",) assert next(frames) == (b"\x02\x00\x00\x00",) assert next(frames) == (b"\x03\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_multi_frame_three_to_one(self): """Test a multi-frame image where each frame is three fragments""" # 2 frames, each 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x24\x00\x00\x00" b"\x48\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" ) frames = self.func(bytestream) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) assert next(frames) == ( b"\x02\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) assert next(frames) == ( b"\x03\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) def test_multi_frame_varied_ratio(self): """Test a multi-frame image where each frames is random fragments""" # 3 frames, 1st is 1 fragment, 2nd is 3 fragments, 3rd is 2 fragments bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0E\x00\x00\x00" b"\x32\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x01\x00\x00\x00\x00\x01" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x03\x00\x00\x00\x00\x02" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x04" ) frames = self.func(bytestream) assert next(frames) == (b"\x01\x00\x00\x00\x00\x01",) assert next(frames) == ( b"\x02\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00\x00\x02", ) assert next(frames) == (b"\x03\x00\x00\x00", b"\x02\x04") pytest.raises(StopIteration, next, frames) class TestDecodeDataSequence: """Test encaps.decode_data_sequence""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.decode_data_sequence def test_empty_bot_single_fragment(self): """Test a single-frame image where the frame is one fragments""" # 1 frame, 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) frames = self.func(bytestream) assert frames == [b"\x01\x00\x00\x00"] def test_empty_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert frames == [b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00"] def test_bot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) frames = self.func(bytestream) assert frames == [b"\x01\x00\x00\x00"] def test_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert frames == [b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00"] def test_multi_frame_one_to_one(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) frames = self.func(bytestream) assert frames == [b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00"] def test_multi_frame_three_to_one(self): """Test a multi-frame image where each frame is three fragments""" # 2 frames, each 3 fragments long bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x20\x00\x00\x00" b"\x40\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" ) frames = self.func(bytestream) assert frames == [ b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", b"\x02\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", b"\x03\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ] def test_multi_frame_varied_ratio(self): """Test a multi-frame image where each frames is random fragments""" # 3 frames, 1st is 1 fragment, 2nd is 3 fragments, 3rd is 2 fragments bytestream = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0E\x00\x00\x00" b"\x32\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x01\x00\x00\x00\x00\x01" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x03\x00\x00\x00\x00\x02" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x04" ) frames = self.func(bytestream) assert frames == [ b"\x01\x00\x00\x00\x00\x01", b"\x02\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00\x00\x02", b"\x03\x00\x00\x00", b"\x02\x04", ] class TestDefragmentData: """Test encaps.defragment_data""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.defragment_data def test_defragment(self): """Test joining fragmented data works""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) reference = b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" assert self.func(bytestream) == reference class TestReadItem: """Test encaps.read_item""" def setup_method(self): with pytest.warns(DeprecationWarning): self.func = encaps.read_item def test_item_undefined_length(self): """Test exception raised if item length undefined.""" bytestream = b"\xFE\xFF\x00\xE0\xFF\xFF\xFF\xFF\x00\x00\x00\x01" fp = DicomBytesIO(bytestream) fp.is_little_endian = True with pytest.raises( ValueError, match="Encapsulated data fragment had Undefined " "Length at data position 0x4", ): self.func(fp) def test_item_sequence_delimiter(self): """Test non-zero length seq delimiter reads correctly.""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" b"\x04\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" assert self.func(fp) is None assert self.func(fp) == b"\x02\x00\x00\x00" def test_item_sequence_delimiter_zero_length(self): """Test that the fragments are returned if seq delimiter hit.""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" assert self.func(fp) is None assert self.func(fp) == b"\x02\x00\x00\x00" def test_item_bad_tag(self): """Test item is read if it has an unexpected tag""" # This should raise an exception instead bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\x10\x00\x10\x00" b"\x04\x00\x00\x00" b"\xFF\x00\xFF\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" assert self.func(fp) == b"\xFF\x00\xFF\x00" assert self.func(fp) == b"\x02\x00\x00\x00" def test_single_fragment_no_delimiter(self): """Test single fragment is returned OK""" bytestream = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" def test_multi_fragments_no_delimiter(self): """Test multi fragments are returned OK""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" assert self.func(fp) == b"\x01\x02\x03\x04\x05\x06" def test_single_fragment_delimiter(self): """Test single fragment is returned OK with sequence delimiter item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" def test_multi_fragments_delimiter(self): """Test multi fragments are returned OK with sequence delimiter item""" bytestream = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" b"\xFE\xFF\xDD\xE0" ) fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert self.func(fp) == b"\x01\x00\x00\x00" assert self.func(fp) == b"\x01\x02\x03\x04\x05\x06" class TestFragmentFrame: """Test encaps.fragment_frame.""" def test_single_fragment_even_data(self): """Test 1 fragment from even data""" bytestream = b"\xFE\xFF\x00\xE1" fragments = fragment_frame(bytestream, nr_fragments=1) fragment = next(fragments) assert pytest.raises(StopIteration, next, fragments) assert fragment == bytestream assert len(fragment) == 4 assert isinstance(fragment, bytes) def test_single_fragment_odd_data(self): """Test 1 fragment from odd data""" bytestream = b"\xFE\xFF\x00" fragments = fragment_frame(bytestream, nr_fragments=1) fragment = next(fragments) assert pytest.raises(StopIteration, next, fragments) assert fragment == bytestream + b"\x00" assert len(fragment) == 4 def test_even_fragment_even_data(self): """Test even fragments from even data""" bytestream = b"\xFE\xFF\x00\xE1" # Each fragment should be 2 bytes fragments = fragment_frame(bytestream, nr_fragments=2) fragment = next(fragments) assert fragment == bytestream[:2] fragment = next(fragments) assert fragment == bytestream[2:] assert pytest.raises(StopIteration, next, fragments) def test_even_fragment_odd_data(self): """Test even fragments from odd data""" bytestream = b"\xFE\xFF\x00" # First fragment should be 1.5 -> 2 bytes, with the final # fragment 1 byte + 1 byte padding fragments = fragment_frame(bytestream, nr_fragments=2) fragment = next(fragments) assert fragment == b"\xFE\xFF" fragment = next(fragments) assert fragment == b"\x00\x00" assert pytest.raises(StopIteration, next, fragments) def test_odd_fragments_even_data(self): """Test odd fragments from even data""" bytestream = b"\xFE\xFF\x00\xE1" * 31 # 124 bytes assert len(bytestream) % 2 == 0 # Each fragment should be 17.7 -> 18 bytes, with the final # fragment 16 bytes fragments = fragment_frame(bytestream, nr_fragments=7) for ii in range(6): fragment = next(fragments) assert len(fragment) == 18 fragment = next(fragments) assert len(fragment) == 16 assert pytest.raises(StopIteration, next, fragments) def test_odd_fragments_odd_data(self): """Test odd fragments from odd data""" bytestream = b"\xFE\xFF\x00" * 31 # 93 bytes assert len(bytestream) % 2 == 1 # Each fragment should be 13.3 -> 14 bytes, with the final # fragment 9 bytes + 1 byte padding fragments = fragment_frame(bytestream, nr_fragments=7) for ii in range(6): fragment = next(fragments) assert len(fragment) == 14 fragment = next(fragments) assert len(fragment) == 10 assert pytest.raises(StopIteration, next, fragments) def test_too_many_fragments_raises(self): """Test exception raised if too many fragments.""" bytestream = b"\xFE\xFF\x00" * 31 # 93 bytes # At most we can have 47 fragments for fragment in fragment_frame(bytestream, nr_fragments=47): pass with pytest.raises(ValueError): for fragment in fragment_frame(bytestream, nr_fragments=48): pass class TestEncapsulateFrame: """Test encaps.itemize_frame.""" def test_single_item(self): """Test encapsulating into one fragment""" bytestream = b"\xFE\xFF\x00\xE1" item_generator = itemize_frame(bytestream, nr_fragments=1) item = next(item_generator) assert item == (b"\xfe\xff\x00\xe0\x04\x00\x00\x00\xFE\xFF\x00\xE1") pytest.raises(StopIteration, next, item_generator) def test_two_items(self): """Test encapsulating into two fragments""" bytestream = b"\xFE\xFF\x00\xE1" item_generator = itemize_frame(bytestream, nr_fragments=2) item = next(item_generator) assert item == (b"\xfe\xff\x00\xe0\x02\x00\x00\x00\xFE\xFF") item = next(item_generator) assert item == (b"\xfe\xff\x00\xe0\x02\x00\x00\x00\x00\xe1") pytest.raises(StopIteration, next, item_generator) class TestEncapsulate: """Test encaps.encapsulate.""" def test_encapsulate_single_fragment_per_frame_no_bot(self): """Test encapsulating single fragment per frame with no BOT values.""" ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ f for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 data = encapsulate(frames, fragments_per_frame=1, has_bot=False) test_frames = generate_frames(data, number_of_frames=ds.NumberOfFrames) for a, b in zip(test_frames, frames): assert a == b # Original data has no BOT values assert data == ds.PixelData def test_encapsulate_single_fragment_per_frame_bot(self): """Test encapsulating single fragment per frame with BOT values.""" ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ f for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 data = encapsulate(frames, fragments_per_frame=1, has_bot=True) test_frames = generate_frames(data, number_of_frames=ds.NumberOfFrames) for a, b in zip(test_frames, frames): assert a == b fp = DicomBytesIO(data) fp.is_little_endian = True offsets = parse_basic_offsets(fp) assert offsets == [ 0x0000, # 0 0x0EEE, # 3822 0x1DF6, # 7670 0x2CF8, # 11512 0x3BFC, # 15356 0x4ADE, # 19166 0x59A2, # 22946 0x6834, # 26676 0x76E2, # 30434 0x8594, # 34196 ] def test_encapsulate_bot(self): """Test the Basic Offset Table is correct.""" ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ f for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 data = encapsulate(frames, fragments_per_frame=1, has_bot=True) assert data[:56] == ( b"\xfe\xff\x00\xe0" # Basic offset table item tag b"\x28\x00\x00\x00" # Basic offset table length b"\x00\x00\x00\x00" # First offset b"\xee\x0e\x00\x00" b"\xf6\x1d\x00\x00" b"\xf8\x2c\x00\x00" b"\xfc\x3b\x00\x00" b"\xde\x4a\x00\x00" b"\xa2\x59\x00\x00" b"\x34\x68\x00\x00" b"\xe2\x76\x00\x00" b"\x94\x85\x00\x00" # Last offset b"\xfe\xff\x00\xe0" # Next item tag b"\xe6\x0e\x00\x00" # Next item length ) def test_encapsulate_bot_large_raises(self): """Test exception raised if too much pixel data for BOT.""" class FakeBytes(bytes): length = -1 def __len__(self): return self.length def __getitem__(self, s): return b"\x00" * 5 frame_a = FakeBytes() frame_a.length = 2**32 - 1 - 8 # 8 for first BOT item tag/length frame_b = FakeBytes() frame_b.length = 10 encapsulate([frame_a, frame_b], has_bot=True) frame_a.length = 2**32 - 1 - 7 msg = ( r"The total length of the encapsulated frame data \(4294967296 " r"bytes\) will be greater than the maximum allowed by the Basic " ) with pytest.raises(ValueError, match=msg): encapsulate([frame_a, frame_b], has_bot=True) class TestEncapsulateExtended: """Tests for encaps.encapsulate_extended.""" def test_encapsulate(self): ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ f for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 out = encapsulate_extended(frames) # Pixel Data encapsulated OK assert isinstance(out[0], bytes) test_frames = [ f for f in generate_frames(out[0], number_of_frames=ds.NumberOfFrames) ] for a, b in zip(test_frames, frames): assert a == b # Extended Offset Table is OK assert isinstance(out[1], bytes) assert [ 0x0000, # 0 0x0EEE, # 3822 0x1DF6, # 7670 0x2CF8, # 11512 0x3BFC, # 15356 0x4ADE, # 19166 0x59A2, # 22946 0x6834, # 26676 0x76E2, # 30434 0x8594, # 34196 ] == list(unpack("<10Q", out[1])) # Extended Offset Table Lengths are OK assert isinstance(out[2], bytes) assert [len(f) for f in frames] == list(unpack("<10Q", out[2])) def test_encapsulate_odd_length(self): """Test encapsulating odd-length frames""" frames = [b"\x00", b"\x01", b"\x02"] eot_encapsulated, eot, eot_lengths = encapsulate_extended(frames) assert unpack(f"<{len(frames)}Q", eot) == (0, 10, 20) assert unpack(f"<{len(frames)}Q", eot_lengths) == (2, 2, 2) def as_bytesio(buffer): buffer = BytesIO(buffer) buffer.seek(0) return buffer class TestParseBasicOffsets: """Tests for parse_basic_offsets()""" def test_bad_tag(self): """Test raises exception if no item tag.""" # (FFFE,E100) buffer = b"\xFE\xFF\x00\xE1\x08\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" msg = ( r"Found unexpected tag \(FFFE,E100\) instead of \(FFFE,E000\) when " r"parsing the Basic Offset Table item" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_basic_offsets(src) buffer = b"\xFE\xFF\x00\xE1\x08\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" msg = ( r"Found unexpected tag \(FEFF,00E1\) instead of \(FFFE,E000\) when " r"parsing the Basic Offset Table item" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_basic_offsets(src, endianness=">") def test_bad_length_multiple(self): """Test raises exception if the item length is not a multiple of 4.""" # Length 10 buffer = ( b"\xFE\xFF\x00\xE0" b"\x0A\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A" ) msg = "The length of the Basic Offset Table item is not a multiple of 4" for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_basic_offsets(src) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x0A" b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_basic_offsets(src, endianness=">") def test_zero_length(self): """Test reading BOT with zero length""" # Little endian buffer = b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" for func in (bytes, as_bytesio): src = func(buffer) assert [] == parse_basic_offsets(src) assert src.tell() == 8 # Big endian buffer = b"\xFF\xFE\xE0\x00\x00\x00\x00\x00" for func in (bytes, as_bytesio): src = func(buffer) assert [] == parse_basic_offsets(src, endianness=">") assert src.tell() == 8 def test_multi_frame(self): """Test reading multi-frame BOT item""" # Little endian buffer = ( b"\xFE\xFF\x00\xE0" b"\x10\x00\x00\x00" b"\x00\x00\x00\x00" b"\x66\x13\x00\x00" b"\xF4\x25\x00\x00" b"\xFE\x37\x00\x00" b"\xFE\xFF\x00\xE0" ) for func in (bytes, as_bytesio): src = func(buffer) assert [0, 4966, 9716, 14334] == parse_basic_offsets(src) assert src.tell() == 24 # Big endian buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x10" b"\x00\x00\x00\x00" b"\x00\x00\x13\x66" b"\x00\x00\x25\xF4" b"\x00\x00\x37\xFE" b"\xFF\xFE\xE0\x00" ) for func in (bytes, as_bytesio): src = func(buffer) assert [0, 4966, 9716, 14334] == parse_basic_offsets(src, endianness=">") assert src.tell() == 24 def test_single_frame(self): """Test reading single-frame BOT item""" # Little endian buffer = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x00\x00\x00\x00\xFE\xFF\x00\xE0" for func in (bytes, as_bytesio): src = func(buffer) assert [0] == parse_basic_offsets(src) assert src.tell() == 12 # Big endian buffer = b"\xFF\xFE\xE0\x00\x00\x00\x00\x04\x00\x00\x00\x00\xFF\xFE\xE0\x00" for func in (bytes, as_bytesio): src = func(buffer) assert [0] == parse_basic_offsets(src, endianness=">") assert src.tell() == 12 class TestParseFragments: """Tests for parse_fragments()""" def test_item_undefined_length(self): """Test exception raised if item length undefined.""" buffer = b"\xFE\xFF\x00\xE0\xFF\xFF\xFF\xFF\x00\x00\x00\x01" msg = ( "Undefined item length at offset 4 when " "parsing the encapsulated pixel data fragments" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_fragments(src) buffer = b"\xFF\xFE\xE0\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x01" for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_fragments(src, endianness=">") def test_item_sequence_delimiter(self): """Test that the fragments are returned if seq delimiter hit.""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" # sequence delimiter b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src) == (1, [0]) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\xFF\xFE\xE0\xDD" # sequence delimiter b"\x00\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04`" b"\x00\x00\x00\x02" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src, endianness=">") == (1, [0]) def test_item_bad_tag(self): """Test exception raised if item has unexpected tag""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\x10\x00\x10\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) msg = ( r"Unexpected tag '\(0010,0010\)' at offset 12 when parsing the " r"encapsulated pixel data fragment items" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_fragments(src) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\x00\x10\x00\x10" b"\x00\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x02" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_fragments(src, endianness=">") def test_item_invalid(self): """Test exception raised if sequence is too short""" buffer = b"\xFE\xFF\x00\xE0\x04\x00\x00" msg = ( "Unable to determine the length of the item at offset 0 as the end " "of the data has been reached - the encapsulated pixel data may " "be invalid" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_fragments(src) buffer = b"\xFF\xFE\xE0\x00\x00\x00\x04" for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): parse_fragments(src, endianness=">") def test_single_fragment_no_delimiter(self): """Test single fragment is returned OK""" buffer = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src) == (1, [0]) assert src.tell() == 0 buffer = b"\xFF\xFE\xE0\x00\x00\x00\x00\x04\x00\x00\x00\x01" for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src, endianness=">") == (1, [0]) assert src.tell() == 0 def test_multi_fragments_no_delimiter(self): """Test multi fragments are returned OK""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src) == (2, [0, 12]) assert src.tell() == 0 buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x06" b"\x01\x02\x03\x04\x05\x06" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src, endianness=">") == (2, [0, 12]) assert src.tell() == 0 def test_single_fragment_delimiter(self): """Test single fragment is returned OK with sequence delimiter item""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src) == (1, [0]) assert src.tell() == 0 buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\xFF\xFE\xE0\xDD" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src, endianness=">") == (1, [0]) assert src.tell() == 0 def test_multi_fragments_delimiter(self): """Test multi fragments are returned OK with sequence delimiter item""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" b"\xFE\xFF\xDD\xE0" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src) == (2, [0, 12]) assert src.tell() == 0 buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x06" b"\x01\x02\x03\x04\x05\x06" b"\xFF\xFE\xE0\xDD" ) for func in (bytes, as_bytesio): src = func(buffer) assert parse_fragments(src, endianness=">") == (2, [0, 12]) assert src.tell() == 0 class TestGenerateFragments: """Test generate_fragments()""" def test_item_undefined_length(self): """Test exception raised if item length undefined.""" buffer = b"\xFE\xFF\x00\xE0\xFF\xFF\xFF\xFF\x00\x00\x00\x01" msg = ( "Undefined item length at offset 4 when parsing the encapsulated " "pixel data fragments" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) with pytest.raises(ValueError, match=msg): next(fragments) pytest.raises(StopIteration, next, fragments) buffer = b"\xFF\xFE\xE0\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x01" for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") with pytest.raises(ValueError, match=msg): next(fragments) pytest.raises(StopIteration, next, fragments) def test_item_sequence_delimiter(self): """Test that the fragments are returned if seq delimiter hit.""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\xFF\xFE\xE0\xDD" b"\x00\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x02" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") assert next(fragments) == b"\x00\x00\x00\x01" pytest.raises(StopIteration, next, fragments) def test_item_bad_tag(self): """Test exception raised if item has unexpected tag""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\x10\x00\x10\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) msg = ( r"Unexpected tag '\(0010,0010\)' at offset 12 when parsing the " "encapsulated pixel data fragment items" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) assert next(fragments) == b"\x01\x00\x00\x00" with pytest.raises(ValueError, match=msg): next(fragments) pytest.raises(StopIteration, next, fragments) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x00\x00\x00\x01" b"\x00\x10\x00\x10" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") assert next(fragments) == b"\x00\x00\x00\x01" with pytest.raises(ValueError, match=msg): next(fragments) pytest.raises(StopIteration, next, fragments) def test_item_invalid(self): """Test exception raised if item is invalid""" buffer = b"\xFE\xFF\x00\xE0\x04\x00\x00" msg = ( "Unable to determine the length of the item at offset 0 as the end " "of the data has been reached - the encapsulated pixel data may " "be invalid" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) with pytest.raises(ValueError, match=msg): next(fragments) pytest.raises(StopIteration, next, fragments) buffer = b"\xFF\xFE\xE0\x00\x00\x00\x04" for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") with pytest.raises(ValueError, match=msg): next(fragments) pytest.raises(StopIteration, next, fragments) def test_single_fragment_no_delimiter(self): """Test single fragment is returned OK""" buffer = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) buffer = b"\xFF\xFE\xE0\x00\x00\x00\x00\x04\x01\x00\x00\x00" for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) def test_multi_fragments_no_delimiter(self): """Test multi fragments are returned OK""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) assert next(fragments) == b"\x01\x00\x00\x00" assert next(fragments) == b"\x01\x02\x03\x04\x05\x06" pytest.raises(StopIteration, next, fragments) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x01\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x06" b"\x01\x02\x03\x04\x05\x06" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") assert next(fragments) == b"\x01\x00\x00\x00" assert next(fragments) == b"\x01\x02\x03\x04\x05\x06" pytest.raises(StopIteration, next, fragments) def test_single_fragment_delimiter(self): """Test single fragment is returned OK with sequence delimiter item""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\xDD\xE0" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x01\x00\x00\x00" b"\xFF\xFE\xE0\xDD" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") assert next(fragments) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, fragments) def test_multi_fragments_delimiter(self): """Test multi fragments are returned OK with sequence delimiter item""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00" b"\x01\x02\x03\x04\x05\x06" b"\xFE\xFF\xDD\xE0" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src) assert next(fragments) == b"\x01\x00\x00\x00" assert next(fragments) == b"\x01\x02\x03\x04\x05\x06" pytest.raises(StopIteration, next, fragments) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x01\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x06" b"\x01\x02\x03\x04\x05\x06" b"\xFF\xFE\xE0\xDD" ) for func in (bytes, as_bytesio): src = func(buffer) fragments = generate_fragments(src, endianness=">") assert next(fragments) == b"\x01\x00\x00\x00" assert next(fragments) == b"\x01\x02\x03\x04\x05\x06" pytest.raises(StopIteration, next, fragments) class TestGenerateFragmentedFrames: """Tests for generate_fragmented_frames()""" def test_empty_bot_single_fragment(self): """Test a single-frame image where the frame is one fragments""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src) assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x01\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, endianness=">") assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_empty_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, number_of_frames=1) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) buffer = ( b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x01\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x02\x00\x00\x00" b"\xFF\xFE\xE0\x00" b"\x00\x00\x00\x04" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames( buffer, number_of_frames=1, endianness=">" ) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) def test_empty_bot_no_number_of_frames_raises(self): """Test parsing raises if not BOT and no number_of_frames.""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) msg = ( r"Unable to determine the frame boundaries for the encapsulated " r"pixel data as there is no Basic or Extended Offset Table and the " r"number of frames has not been supplied" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): next(generate_fragmented_frames(src)) def test_empty_bot_too_few_fragments(self): """Test parsing with too few fragments.""" ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames msg = ( "Unable to generate frames from the encapsulated pixel data as " "there are fewer fragments than frames; the dataset may be corrupt " "or the number of frames may be incorrect" ) for func in (bytes, as_bytesio): src = func(ds.PixelData) with pytest.raises(ValueError, match=msg): next(generate_fragmented_frames(src, number_of_frames=20)) def test_empty_bot_multi_fragments_per_frame(self): """Test parsing with multiple fragments per frame.""" # 4 frames in 6 fragments with JPEG EOI marker buffer = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, number_of_frames=4) for ii in range(4): next(frames) pytest.raises(StopIteration, next, frames) def test_empty_bot_no_marker(self): """Test parsing not BOT and no final marker with multi fragments.""" # 4 frames in 6 fragments with JPEG EOI marker (1 missing EOI) buffer = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, number_of_frames=4) for ii in range(3): next(frames) msg = ( "The end of the encapsulated pixel data has been reached but fewer " "frames than expected have been found. Please confirm that the " "generated frame data is correct" ) with pytest.warns(UserWarning, match=msg): next(frames) pytest.raises(StopIteration, next, frames) def test_empty_bot_missing_marker(self): """Test parsing no BOT and missing marker with multi fragments.""" # 4 frames in 6 fragments with JPEG EOI marker (1 missing EOI) buffer = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" ) msg = ( "The end of the encapsulated pixel data has been reached but " "fewer frames than expected have been found" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.warns(UserWarning, match=msg): for ii, frame in enumerate( generate_fragmented_frames(src, number_of_frames=4) ): pass assert 2 == ii def test_bot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src) assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) def test_multi_frame_one_to_one(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src) assert next(frames) == (b"\x01\x00\x00\x00",) assert next(frames) == (b"\x02\x00\x00\x00",) assert next(frames) == (b"\x03\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_multi_frame_three_to_one(self): """Test a multi-frame image where each frame is three fragments""" # 2 frames, each 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x24\x00\x00\x00" b"\x48\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src) assert next(frames) == ( b"\x01\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) assert next(frames) == ( b"\x02\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) assert next(frames) == ( b"\x03\x00\x00\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00", ) pytest.raises(StopIteration, next, frames) def test_multi_frame_varied_ratio(self): """Test a multi-frame image where each frame is random fragments""" # 3 frames, 1st is 1 fragment, 2nd is 3 fragments, 3rd is 2 fragments buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0E\x00\x00\x00" b"\x32\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x01\x00\x00\x00\x00\x01" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x03\x00\x00\x00\x00\x02" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x04" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src) assert next(frames) == (b"\x01\x00\x00\x00\x00\x01",) assert next(frames) == ( b"\x02\x00", b"\x02\x00\x00\x00", b"\x03\x00\x00\x00\x00\x02", ) assert next(frames) == (b"\x03\x00\x00\x00", b"\x02\x04") pytest.raises(StopIteration, next, frames) def test_eot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) eot = ([0], [4]) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, extended_offsets=eot) assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) eot = ( # unsigned long, 8 bytes b"\x00\x00\x00\x00\x00\x00\x00\x00", b"\x04\x00\x00\x00\x00\x00\x00\x00", ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, extended_offsets=eot) assert next(frames) == (b"\x01\x00\x00\x00",) pytest.raises(StopIteration, next, frames) def test_eot_multi_frame(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" # 0 b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" # 12 b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" # 24 b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) eot = ([0, 12, 24], [4, 4, 4]) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, extended_offsets=eot) assert next(frames) == (b"\x01\x00\x00\x00",) assert next(frames) == (b"\x02\x00\x00\x00",) assert next(frames) == (b"\x03\x00\x00\x00",) pytest.raises(StopIteration, next, frames) eot = ( # unsigned long, 8 bytes b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x0C\x00\x00\x00\x00\x00\x00\x00" b"\x18\x00\x00\x00\x00\x00\x00\x00", b"\x04\x00\x00\x00\x00\x00\x00\x00" * 3, ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_fragmented_frames(src, extended_offsets=eot) assert next(frames) == (b"\x01\x00\x00\x00",) assert next(frames) == (b"\x02\x00\x00\x00",) assert next(frames) == (b"\x03\x00\x00\x00",) pytest.raises(StopIteration, next, frames) class TestGenerateFrames: """Tests for generate_frames()""" def test_empty_bot_single_fragment(self): """Test a single-frame image where the frame is one fragments""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src) assert next(frames) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_empty_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src, number_of_frames=1) assert next(frames) == (b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00") pytest.raises(StopIteration, next, frames) def test_bot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src) assert next(frames) == b"\x01\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src) assert next(frames) == (b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00") pytest.raises(StopIteration, next, frames) def test_multi_frame_one_to_one(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src) assert next(frames) == b"\x01\x00\x00\x00" assert next(frames) == b"\x02\x00\x00\x00" assert next(frames) == b"\x03\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_multi_frame_three_to_one(self): """Test a multi-frame image where each frame is three fragments""" # 2 frames, each 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x24\x00\x00\x00" b"\x48\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src) assert next(frames) == b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" assert next(frames) == b"\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" assert next(frames) == b"\x03\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" pytest.raises(StopIteration, next, frames) def test_multi_frame_varied_ratio(self): """Test a multi-frame image where each frames is random fragments""" # 3 frames, 1st is 1 fragment, 2nd is 3 fragments, 3rd is 2 fragments buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0E\x00\x00\x00" b"\x32\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x01\x00\x00\x00\x00\x01" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x03\x00\x00\x00\x00\x02" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x04" ) for func in (bytes, as_bytesio): src = func(buffer) frames = generate_frames(src) assert next(frames) == b"\x01\x00\x00\x00\x00\x01" assert next(frames) == (b"\x02\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x02") assert next(frames) == b"\x03\x00\x00\x00\x02\x04" pytest.raises(StopIteration, next, frames) def test_empty_bot_single_fragment_per_frame(self): """Test multi-frame where multiple frags per frame and no BOT.""" ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames for func in (bytes, as_bytesio): src = func(ds.PixelData) frame_gen = generate_frames(src, number_of_frames=ds.NumberOfFrames) for ii in range(10): next(frame_gen) with pytest.raises(StopIteration): next(frame_gen) def test_empty_bot_multi_fragments_per_frame(self): """Test multi-frame where multiple frags per frame and no BOT.""" # Regression test for #685 ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames for func in (bytes, as_bytesio): src = func(ds.PixelData) # Note that we will yield 10 frames, not 8 frame_gen = generate_frames(src, number_of_frames=8) for ii in range(10): next(frame_gen) with pytest.raises(StopIteration): next(frame_gen) def test_empty_bot_multi_fragments_per_frame_excess_frames(self): """Test multi-frame where multiple frags per frame and no BOT.""" # Regression test for #685 ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames msg = ( "The end of the encapsulated pixel data has been reached but " "no JPEG EOI/EOC marker was found, the final frame may be " "be invalid" ) excess = b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x00\x01\x02\x03" for func in (bytes, as_bytesio): src = func(b"".join([ds.PixelData, excess])) # Note that we will yield 10 frames, not 8 frame_gen = generate_frames(src, number_of_frames=8) for ii in range(10): next(frame_gen) with pytest.warns(UserWarning, match=msg): frame = next(frame_gen) assert frame == b"\x00\x01\x02\x03" with pytest.raises(StopIteration): next(frame_gen) def test_mmap(self): """Test with mmapped file.""" with dcmread(JP2K_10FRAME_NOBOT) as ds: elem = ds["PixelData"] frames = generate_frames(ds.PixelData, number_of_frames=10) for ii in range(8): next(frames) reference = next(frames) assert reference[-10:] == b"\x56\xF7\xFF\x4E\x60\xE3\xDA\x0F\xFF\xD9" with open(JP2K_10FRAME_NOBOT, "rb") as f: mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) # Start of BOT is at offset 2352 mm.seek(elem.file_tell) # frame 9 (index 8) starts at offset 32802 and is 3754 bytes long frames = generate_frames(mm, number_of_frames=10) for ii in range(8): next(frames) frame = next(frames) assert frame == reference assert len(frame) == 3754 class TestGetFrame: """Tests for get_frame()""" def test_empty_bot_single_fragment(self): """Test a single-frame image where the frame is one fragments""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0) == b"\x01\x00\x00\x00" def test_empty_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0, number_of_frames=1) == ( b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" ) def test_empty_bot_no_number_of_frames_raises(self): """Test parsing raises if not BOT and no number_of_frames.""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) msg = ( r"Unable to determine the frame boundaries for the encapsulated " r"pixel data as there is no basic or extended offset table data " r"and the number of frames has not been supplied" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): get_frame(src, 0) def test_empty_bot_too_few_fragments(self): """Test parsing with too few fragments.""" ds = dcmread(JP2K_10FRAME_NOBOT) assert 10 == ds.NumberOfFrames msg = "There is insufficient pixel data to contain 12 frames" with pytest.raises(ValueError, match=msg): get_frame(ds.PixelData, 11, number_of_frames=20) def test_empty_bot_multi_fragments_per_frame(self): """Test parsing with multiple fragments per frame.""" # 4 frames in 6 fragments with JPEG EOI marker buffer = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" ) msg = "There is insufficient pixel data to contain 5 frames" for func in (bytes, as_bytesio): src = func(buffer) # Note that we can access a single "extra" frame assert ( get_frame(src, 0, number_of_frames=3) == b"\x01\x00\x00\x00\x01\xFF\xD9\x00" ) assert get_frame(src, 1, number_of_frames=3) == b"\x01\x00\xFF\xD9" assert get_frame(src, 2, number_of_frames=3) == b"\x01\xFF\xD9\x00" assert ( get_frame(src, 3, number_of_frames=3) == b"\x01\x00\x00\x00\x01\xFF\xD9\x00" ) with pytest.raises(ValueError, match=msg): get_frame(src, 4, number_of_frames=3) def test_empty_bot_no_marker(self): """Test parsing no BOT and no final marker with multi fragments.""" # 4 frames in 6 fragments with JPEG EOI marker (1 missing EOI) buffer = ( b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xD9\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\xFF\xD9" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\xFF\x00\x00" ) for func in (bytes, as_bytesio): src = func(buffer) assert ( get_frame(src, 0, number_of_frames=3) == b"\x01\x00\x00\x00\x01\xFF\xD9\x00" ) assert ( get_frame(src, 1, number_of_frames=3) == b"\x01\x00\x00\x00\x01\xFF\xD9\x00" ) assert get_frame(src, 2, number_of_frames=3) == b"\x01\xFF\xFF\xD9" msg = ( "The end of the encapsulated pixel data has been reached but no " "JPEG EOI/EOC marker was found, the returned frame data may be invalid" ) with pytest.warns(UserWarning, match=msg): assert get_frame(src, 3, number_of_frames=3) == b"\x01\xFF\x00\x00" msg = "There is insufficient pixel data to contain 5 frames" with pytest.raises(ValueError, match=msg): get_frame(src, 4, number_of_frames=3) def test_empty_bot_index_greater_than_frames_raises(self): """Test multiple fragments, 1 frame raises if index > 0""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) msg = "The 'index' must be 0 if the number of frames is 1" for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): get_frame(src, 1, number_of_frames=1) def test_empty_bot_index_greater_than_multi_frames_raises(self): """Test 1:1 fragments:frames raises if index > number of frames""" buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) msg = ( "Found 2 frame fragments in the encapsulated pixel data, an " "'index' of 2 is invalid" ) for func in (bytes, as_bytesio): src = func(buffer) with pytest.raises(ValueError, match=msg): get_frame(src, 2, number_of_frames=2) def test_bot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) msg = "There aren't enough offsets in the Basic Offset Table for 2 frames" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0) == b"\x01\x00\x00\x00" with pytest.raises(ValueError, match=msg): get_frame(src, 1) def test_bot_triple_fragment_single_frame(self): """Test a single-frame image where the frame is three fragments""" # 1 frame, 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) msg = "There aren't enough offsets in the Basic Offset Table for 2 frames" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0) == ( b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" ) with pytest.raises(ValueError, match=msg): get_frame(src, 1) def test_multi_frame_one_to_one(self): """Test a multi-frame image where each frame is one fragment""" # 3 frames, each 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0C\x00\x00\x00" b"\x18\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) msg = "There aren't enough offsets in the Basic Offset Table for 4 frames" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0) == b"\x01\x00\x00\x00" assert get_frame(src, 1) == b"\x02\x00\x00\x00" assert get_frame(src, 2) == b"\x03\x00\x00\x00" with pytest.raises(ValueError, match=msg): get_frame(src, 3) def test_multi_frame_three_to_one(self): """Test a multi-frame image where each frame is three fragments""" # 3 frames, each 3 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x24\x00\x00\x00" b"\x48\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x03\x00\x00\x00" ) msg = "There aren't enough offsets in the Basic Offset Table for 4 frames" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0) == ( b"\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" ) assert get_frame(src, 1) == ( b"\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" ) assert get_frame(src, 2) == ( b"\x03\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00" ) with pytest.raises(ValueError, match=msg): get_frame(src, 3) def test_multi_frame_varied_ratio(self): """Test a multi-frame image where each frames is random fragments""" # 3 frames, 1st is 1 fragment, 2nd is 3 fragments, 3rd is 2 fragments buffer = ( b"\xFE\xFF\x00\xE0" b"\x0C\x00\x00\x00" b"\x00\x00\x00\x00" b"\x0E\x00\x00\x00" b"\x32\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x01\x00\x00\x00\x00\x01" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x06\x00\x00\x00\x03\x00\x00\x00\x00\x02" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00\x03\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x02\x00\x00\x00\x02\x04" ) msg = "There aren't enough offsets in the Basic Offset Table for 4 frames" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0) == b"\x01\x00\x00\x00\x00\x01" assert get_frame(src, 1) == ( b"\x02\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x02" ) assert get_frame(src, 2) == b"\x03\x00\x00\x00\x02\x04" with pytest.raises(ValueError, match=msg): get_frame(src, 3) def test_eot_single_fragment(self): """Test a single-frame image where the frame is one fragment""" # 1 frame, 1 fragment long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" ) eot = ([0], [4]) msg = "Found 1 frame fragment in the encapsulated pixel data, 'index' must be 0" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0, extended_offsets=eot) == b"\x01\x00\x00\x00" with pytest.raises(ValueError, match=msg): get_frame(src, 1) eot = ( # unsigned long, 8 bytes b"\x00\x00\x00\x00\x00\x00\x00\x00", b"\x04\x00\x00\x00\x00\x00\x00\x00", ) for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0, extended_offsets=eot) == b"\x01\x00\x00\x00" with pytest.raises(ValueError, match=msg): get_frame(src, 1) def test_eot_multi_fragment(self): """Test a single-frame image where the frame is three fragments""" # 3 frames, 1 fragments long buffer = ( b"\xFE\xFF\x00\xE0" b"\x00\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x01\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x02\x00\x00\x00" b"\xFE\xFF\x00\xE0" b"\x04\x00\x00\x00" b"\x03\x00\x00\x00" ) eot = ([0, 12, 24], [4, 4, 4]) msg = "There aren't enough offsets in the Extended Offset Table for 4 frames" for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0, extended_offsets=eot) == b"\x01\x00\x00\x00" assert get_frame(src, 1, extended_offsets=eot) == b"\x02\x00\x00\x00" assert get_frame(src, 2, extended_offsets=eot) == b"\x03\x00\x00\x00" with pytest.raises(ValueError, match=msg): get_frame(src, 3, extended_offsets=eot) eot = ( # unsigned long, 8 bytes b"\x00\x00\x00\x00\x00\x00\x00\x00" b"\x0C\x00\x00\x00\x00\x00\x00\x00" b"\x18\x00\x00\x00\x00\x00\x00\x00", b"\x04\x00\x00\x00\x00\x00\x00\x00" * 3, ) for func in (bytes, as_bytesio): src = func(buffer) assert get_frame(src, 0, extended_offsets=eot) == b"\x01\x00\x00\x00" assert get_frame(src, 1, extended_offsets=eot) == b"\x02\x00\x00\x00" assert get_frame(src, 2, extended_offsets=eot) == b"\x03\x00\x00\x00" with pytest.raises(ValueError, match=msg): get_frame(src, 3, extended_offsets=eot) def test_mmap(self): """Test with mmapped file.""" references = [] with dcmread(JP2K_10FRAME_NOBOT) as ds: elem = ds["PixelData"] references.append(get_frame(ds.PixelData, 0, number_of_frames=10)) assert references[-1][-10:] == b"\x35\x6C\xDC\x6F\x8F\xF9\x43\xBF\xFF\xD9" references.append(get_frame(ds.PixelData, 4, number_of_frames=10)) assert references[-1][-10:] == b"\x68\xFA\x46\x3C\xF9\xC6\xBF\xFF\xD9\x00" references.append(get_frame(ds.PixelData, 9, number_of_frames=10)) assert references[-1][-10:] == b"\xA5\x23\x00\x7B\xD9\x62\x13\x21\xFF\xD9" with open(JP2K_10FRAME_NOBOT, "rb") as f: mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) # Start of BOT is at offset 2352 mm.seek(elem.file_tell) # frame 9 (index 8) starts at offset 32802 and is 3754 bytes long frame = get_frame(mm, 0, number_of_frames=10) assert frame == references[0] frame = get_frame(mm, 4, number_of_frames=10) assert frame == references[1] frame = get_frame(mm, 9, number_of_frames=10) assert frame == references[2] class TestBufferedFrame: """Tests for _BufferedItem""" def test_init(self): """Test creating a new instance""" # Even length frame b = BytesIO(b"\x00\x01" * 10) bf = _BufferedItem(b) assert bf.buffer == b assert bf.length == 28 assert bf._item == b"\xFE\xFF\x00\xE0\x14\x00\x00\x00" assert not bf._padding # Odd-length frame gets padded b = BytesIO(b"\x00\x01\x02" * 3) bf = _BufferedItem(b) assert bf.buffer == b assert bf.length == 18 assert bf._item == b"\xFE\xFF\x00\xE0\x0A\x00\x00\x00" assert bf._padding def test_read_even(self): """Test read() using an even length frame buffer""" b = BytesIO(b"\x00\x01" * 10) bf = _BufferedItem(b) out = bf.read(0, 8192) assert b.tell() == 0 assert out[:8] == b"\xFE\xFF\x00\xE0\x14\x00\x00\x00" assert out[8:] == b"\x00\x01" * 10 out = bf.read(1, 8192) assert b.tell() == 0 assert out[:7] == b"\xFF\x00\xE0\x14\x00\x00\x00" assert out[7:] == b"\x00\x01" * 10 # Offset at end of item value out = bf.read(7, 8192) assert b.tell() == 0 assert out[:1] == b"\x00" assert out[1:] == b"\x00\x01" * 10 # Offset at start of frame buffer out = bf.read(8, 8192) assert b.tell() == 0 assert out == b"\x00\x01" * 10 out = bf.read(9, 8192) assert b.tell() == 0 assert out == b"\x01" + b"\x00\x01" * 9 # Offset at end of frame buffer out = bf.read(27, 8192) assert b.tell() == 0 assert out == b"\x01" # Offset invalid msg = r"Invalid 'start' value '28', must be in the closed interval \[0, 27\]" with pytest.raises(ValueError, match=msg): bf.read(28, 8192) msg = r"Invalid 'start' value '-1', must be in the closed interval \[0, 27\]" with pytest.raises(ValueError, match=msg): bf.read(-1, 8192) def test_read_odd(self): """Test read() using an odd length frame buffer""" b = BytesIO(b"\x01\x02" * 9 + b"\x01") assert len(b.getvalue()) % 2 bf = _BufferedItem(b) out = bf.read(0, 8192) assert b.tell() == 0 assert out[:8] == b"\xFE\xFF\x00\xE0\x14\x00\x00\x00" assert out[8:] == b"\x01\x02" * 9 + b"\x01\x00" out = bf.read(1, 8192) assert b.tell() == 0 assert out[:7] == b"\xFF\x00\xE0\x14\x00\x00\x00" assert out[7:] == b"\x01\x02" * 9 + b"\x01\x00" # Offset at end of item value out = bf.read(7, 8192) assert b.tell() == 0 assert out[:1] == b"\x00" assert out[1:] == b"\x01\x02" * 9 + b"\x01\x00" # Offset at start of frame buffer out = bf.read(8, 8192) assert b.tell() == 0 assert out == b"\x01\x02" * 9 + b"\x01\x00" out = bf.read(9, 8192) assert b.tell() == 0 assert out == b"\x02" + b"\x01\x02" * 8 + b"\x01\x00" # Offset at end of frame buffer out = bf.read(26, 8192) assert b.tell() == 0 assert out == b"\x01\x00" # Offset at padding out = bf.read(27, 8192) assert b.tell() == 0 assert out == b"\x00" # Offset invalid msg = r"Invalid 'start' value '28', must be in the closed interval \[0, 27\]" with pytest.raises(ValueError, match=msg): bf.read(28, 8192) msg = r"Invalid 'start' value '-1', must be in the closed interval \[0, 27\]" with pytest.raises(ValueError, match=msg): bf.read(-1, 8192) def test_read_partial_even(self): """Test partial read() using an even length frame buffer""" b = BytesIO(b"\x00\x01" * 10) bf = _BufferedItem(b) out = bf.read(0, size=0) assert out == b"" out = bf.read(0, size=1) assert out == b"\xFE" out = bf.read(0, size=5) assert out == b"\xFE\xFF\x00\xE0\x14" out = bf.read(0, size=8) assert out[:8] == b"\xFE\xFF\x00\xE0\x14\x00\x00\x00" out = bf.read(0, size=9) assert out[:8] == b"\xFE\xFF\x00\xE0\x14\x00\x00\x00" assert out[8:] == b"\x00" out = bf.read(1, size=0) assert out[:7] == b"" # Read to end of item value out = bf.read(1, size=7) assert out == b"\xFF\x00\xE0\x14\x00\x00\x00" # Read past end of item value out = bf.read(1, size=8) assert out[:7] == b"\xFF\x00\xE0\x14\x00\x00\x00" assert out[7:] == b"\x00" # Offset at end of item out = bf.read(7, size=0) assert out == b"" out = bf.read(7, size=4) assert out == b"\x00\x00\x01\x00" # Offset at start of frame out = bf.read(8, size=5) assert out == b"\x00\x01\x00\x01\x00" # Offset at end of frame out = bf.read(27, size=1) assert out == b"\x01" # Offset invalid msg = r"Invalid 'start' value '28', must be in the closed interval \[0, 27\]" with pytest.raises(ValueError, match=msg): bf.read(28, size=0) def test_read_partial_odd(self): """Test partial read() using an odd length frame buffer""" b = BytesIO(b"\x01\x02" * 9 + b"\x01") assert len(b.getvalue()) % 2 bf = _BufferedItem(b) # Offset at end of frame buffer out = bf.read(26, size=1) assert out == b"\x01" out = bf.read(26, size=2) assert out == b"\x01\x00" # Offset at padding out = bf.read(27, size=1) assert out == b"\x00" # Offset invalid msg = r"Invalid 'start' value '28', must be in the closed interval \[0, 27\]" with pytest.raises(ValueError, match=msg): bf.read(28, 2) def test_empty_buffer(self): """Test using an empty buffer""" bf = _BufferedItem(BytesIO()) assert bf.length == 8 out = bf.read(7, 10) assert out == b"\x00" def test_too_large_buffer_raises(self): """Test exception raised if the buffer is too large.""" b = FooBuffer() b._tell = 2**32 - 1 msg = "Buffers containing more than 4294967294 bytes are not supported" with pytest.raises(ValueError, match=msg): _BufferedItem(b) class FooBuffer(BytesIO): _read = b"" _readable = True _seekable = True _tell = 0 def read(self, size): return self._read def readable(self): return self._readable def seek(self, offset, whence=0): return self._tell def seekable(self): return self._seekable def tell(self): return self._tell class TestEncapsulatedBuffer: """Tests for EncapsulatedBuffer""" def test_init(self): """Test creating a new instance""" # Even length frame b = BytesIO(b"\x00\x01" * 10) eb = EncapsulatedBuffer([b]) assert eb.encapsulated_length == 36 msg = ( "'buffers' must be a list of objects that inherit from 'io.BufferedIOBase'" ) with pytest.raises(TypeError, match=msg): EncapsulatedBuffer(b) def test_bot_empty(self): """Test an empty Basic Offset Table""" b = BytesIO(b"\x00\x01" * 10) eb = EncapsulatedBuffer([b]) bot = eb.basic_offset_table assert bot == b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" def test_bot(self): """Test a non-empty Basic Offset Table""" eb = EncapsulatedBuffer([BytesIO(b"\xFF")], use_bot=True) bot = eb.basic_offset_table assert bot == b"\xFE\xFF\x00\xE0\x04\x00\x00\x00\x00\x00\x00\x00" eb = EncapsulatedBuffer([BytesIO(b"\xFF"), BytesIO(b"\xFE" * 99)], use_bot=True) bot = eb.basic_offset_table assert bot[:8] == b"\xFE\xFF\x00\xE0\x08\x00\x00\x00" assert bot[8:] == b"\x00\x00\x00\x00\x0A\x00\x00\x00" eb = EncapsulatedBuffer( [BytesIO(b"\xFF"), BytesIO(b"\xFE" * 99), BytesIO(b"\xFD" * 1024)], use_bot=True, ) bot = eb.basic_offset_table assert bot[:8] == b"\xFE\xFF\x00\xE0\x0C\x00\x00\x00" assert bot[8:] == b"\x00\x00\x00\x00\x0A\x00\x00\x00\x76\x00\x00\x00" eb = EncapsulatedBuffer( [ BytesIO(b"\xFF"), BytesIO(b"\xFE" * 99), BytesIO(b"\xFD" * 1024), BytesIO(b"\xFC" * 18), ], use_bot=True, ) bot = eb.basic_offset_table assert bot[:8] == b"\xFE\xFF\x00\xE0\x10\x00\x00\x00" assert bot[8:] == ( b"\x00\x00\x00\x00\x0A\x00\x00\x00\x76\x00\x00\x00\x7E\x04\x00\x00" ) def test_closed(self): """Test the closed property""" b = BytesIO(b"\xFF") eb = EncapsulatedBuffer([b]) assert not eb.closed b.close() assert eb.closed b = BytesIO(b"\xFF") c = BytesIO(b"\xFF") d = BytesIO(b"\xFF") e = BytesIO(b"\xFF") eb = EncapsulatedBuffer([b, c, d, e]) assert not eb.closed e.close() assert eb.closed def test_seek_tell(self): """Test the seek() and tell() methods.""" eb = EncapsulatedBuffer([BytesIO()]) # os.SEEK_SET -> offset relative to start assert eb.tell() == 0 assert eb.seek(0, 0) == 0 assert eb.tell() == 0 assert eb.seek(8, 0) == 8 assert eb.tell() == 8 assert eb.seek(23, 0) == 23 assert eb.tell() == 23 assert eb.seek(30, 0) == 30 assert eb.tell() == 30 msg = "Negative seek 'offset' value -1" with pytest.raises(ValueError, match=msg): eb.seek(-1, 0) # os.SEEK_CUR -> offset relative to current position eb.seek(0, 0) assert eb.seek(-1, 1) == 0 assert eb.tell() == 0 assert eb.seek(1, 1) == 1 assert eb.tell() == 1 eb.seek(0, 0) assert eb.seek(30, 1) == 30 assert eb.tell() == 30 assert eb.seek(0, 2) == 16 assert eb.seek(0, 1) == 16 assert eb.seek(-1, 1) == 15 assert eb.seek(-15, 1) == 0 assert eb.seek(-1, 1) == 0 # os.SEEK_END -> offset relative to end assert eb.seek(0, 2) == 16 assert eb.tell() == 16 assert eb.seek(-7, 2) == 9 assert eb.tell() == 9 assert eb.seek(-15, 2) == 1 assert eb.seek(-16, 2) == 0 assert eb.seek(-17, 2) == 0 msg = "Invalid 'whence' value, should be 0, 1 or 2" with pytest.raises(ValueError, match=msg): eb.seek(0, 3) with pytest.raises(ValueError, match=msg): eb.seek(0, -1) def test_lengths(self): """Test the lengths property""" assert EncapsulatedBuffer([BytesIO()]).lengths == [8] assert EncapsulatedBuffer([BytesIO(), BytesIO()]).lengths == [8, 8] assert EncapsulatedBuffer([BytesIO(b"\x00")]).lengths == [10] assert EncapsulatedBuffer([BytesIO(b"\x00\x01")]).lengths == [10] assert EncapsulatedBuffer([BytesIO(b"\x00"), BytesIO(b"\x00\x01")]).lengths == [ 10, 10, ] assert EncapsulatedBuffer( [BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05")] ).lengths == [308, 12] assert EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x00\x01\x02" * 111), ] ).lengths == [308, 12, 342] def test_offsets(self): """Test the offsets property""" assert EncapsulatedBuffer([BytesIO()]).offsets == [0] assert EncapsulatedBuffer([BytesIO(), BytesIO()]).offsets == [0, 8] assert EncapsulatedBuffer([BytesIO(b"\x00")]).offsets == [0] assert EncapsulatedBuffer([BytesIO(b"\x00\x01")]).offsets == [0] assert EncapsulatedBuffer([BytesIO(b"\x00"), BytesIO(b"\x00\x01")]).offsets == [ 0, 10, ] assert EncapsulatedBuffer( [BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05")] ).offsets == [0, 308] assert EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x00\x01\x02" * 111), ] ).offsets == [0, 308, 320] def test_encapsulated_length_empty_bot(self): """Test the encapsulated_length property with an empty BOT""" assert EncapsulatedBuffer([BytesIO()]).encapsulated_length == 16 assert EncapsulatedBuffer([BytesIO(), BytesIO()]).encapsulated_length == 24 assert EncapsulatedBuffer([BytesIO(b"\x00")]).encapsulated_length == 18 assert EncapsulatedBuffer([BytesIO(b"\x00\x01")]).encapsulated_length == 18 assert ( EncapsulatedBuffer( [BytesIO(b"\x00"), BytesIO(b"\x00\x01")] ).encapsulated_length == 28 ) assert ( EncapsulatedBuffer( [BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05")] ).encapsulated_length == 328 ) assert ( EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x00\x01\x02" * 111), ] ).encapsulated_length == 670 ) def test_encapsulated_length_bot(self): """Test the encapsulated_length property with an empty BOT""" # BOT adds 4 bytes per item assert EncapsulatedBuffer([BytesIO()], True).encapsulated_length == 16 + 4 assert ( EncapsulatedBuffer([BytesIO(), BytesIO()], True).encapsulated_length == 24 + 8 ) assert ( EncapsulatedBuffer([BytesIO(b"\x00")], True).encapsulated_length == 18 + 4 ) assert ( EncapsulatedBuffer([BytesIO(b"\x00\x01")], True).encapsulated_length == 18 + 4 ) assert ( EncapsulatedBuffer( [BytesIO(b"\x00"), BytesIO(b"\x00\x01")], True ).encapsulated_length == 28 + 8 ) assert ( EncapsulatedBuffer( [BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05")], True ).encapsulated_length == 328 + 8 ) assert ( EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x00\x01\x02" * 111), ], True, ).encapsulated_length == 670 + 12 ) def test_read(self): """Test read()""" b = BytesIO(b"\x01\x02" * 10) eb = EncapsulatedBuffer([b]) assert eb.encapsulated_length == 36 out = eb.read(8) assert out == b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" eb.seek(0) out = eb.read(8192) assert len(out) == 36 # Basic Offset Table with no values assert out[:8] == b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" # Encapsulated buffer item assert out[8:] == b"\xFE\xFF\x00\xE0\x14\x00\x00\x00" + b"\x01\x02" * 10 assert eb.tell() == 36 eb = EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x06\x07\x08" * 111), ], ) assert eb.encapsulated_length == 670 assert eb.read(6) == b"\xFE\xFF\x00\xE0\x00\x00" assert eb.tell() == 6 # End of first item tag, first item tag, start of first item value assert eb.read(13) == ( b"\x00\x00" + b"\xFE\xFF\x00\xE0\x2C\x01\x00\x00" + b"\x00\x01\x00" ) assert eb.tell() == 19 eb.read(294) assert eb.tell() == 313 # End of first item value, second item tag, start of second item value assert eb.read(12) == ( b"\x01\x00\x01" + b"\xFE\xFF\x00\xE0\x04\x00\x00\x00" + b"\x02" ) assert eb.tell() == 325 # End of second item value, third item tag, start of third item value assert eb.read(12) == ( b"\x03\x04\x05" + b"\xFE\xFF\x00\xE0\x4E\x01\x00\x00" + b"\x06" ) assert eb.tell() == 337 eb.read(108) assert eb.tell() == 445 # End of third item value, sequence delimiter item out = eb.read() assert out[222:] == b"\x07\x08\x00" assert eb.tell() == 670 assert eb.read() == b"" assert eb.tell() == 670 eb.seek(445, 0) out = eb.read() assert out[222:] == b"\x07\x08\x00" assert eb.tell() == 670 def test_read_none(self): """Test read() when no data available from the buffer.""" b = FooBuffer() b._tell = 20 eb = EncapsulatedBuffer([b]) assert eb.encapsulated_length == 36 # Start of FooBuffer's data eb.seek(16) assert eb.read(20) == b"" def test_readable(self): """Test readable()""" assert EncapsulatedBuffer([BytesIO(b"\x01\x02" * 10)]).readable() b = FooBuffer() c = FooBuffer() d = FooBuffer() eb = EncapsulatedBuffer([b, c, d]) assert eb.readable() c._readable = False assert not eb.readable() def test_seekable(self): """Test seekable()""" assert EncapsulatedBuffer([BytesIO(b"\x01\x02" * 10)]).seekable() b = FooBuffer() c = FooBuffer() d = FooBuffer() eb = EncapsulatedBuffer([b, c, d]) assert eb.seekable() c._seekable = False assert not eb.seekable() def test_extended_lengths(self): """Test the extended_lengths property""" eb = EncapsulatedBuffer([BytesIO()]) assert eb.extended_lengths == b"\x00" * 8 eb = EncapsulatedBuffer([BytesIO(), BytesIO()]) assert eb.extended_lengths == b"\x00" * 16 eb = EncapsulatedBuffer([BytesIO(b"\x00"), BytesIO()]) assert eb.extended_lengths == b"\x02" + b"\x00" * 15 eb = EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x00\x01\x02" * 111), ], ) out = eb.extended_lengths assert out[:8] == b"\x2C\x01" + b"\x00" * 6 assert out[8:16] == b"\x04" + b"\x00" * 7 assert out[16:] == b"\x4E\x01" + b"\x00" * 6 def test_extended_offsets(self): """Test the extended_offsets property""" eb = EncapsulatedBuffer([BytesIO()]) assert eb.extended_offsets == b"\x00" * 8 eb = EncapsulatedBuffer([BytesIO(), BytesIO()]) assert eb.extended_offsets == b"\x00" * 8 + b"\x08" + b"\x00" * 7 eb = EncapsulatedBuffer([BytesIO(b"\x00"), BytesIO()]) assert eb.extended_offsets == b"\x00" * 8 + b"\x0A" + b"\x00" * 7 eb = EncapsulatedBuffer( [ BytesIO(b"\x00\x01" * 150), BytesIO(b"\x02\x03\x04\x05"), BytesIO(b"\x00\x01\x02" * 111), BytesIO(b"\x00\x01\x02" * 5), ], ) out = eb.extended_offsets assert out[:8] == b"\x00" * 8 assert out[8:16] == b"\x34\x01" + b"\x00" * 6 assert out[16:24] == b"\x40\x01" + b"\x00" * 6 assert out[24:] == b"\x96\x02" + b"\x00" * 6 class TestEncapsulateBufferFunc: """Test encaps.encapsulate_buffer.""" def test_encapsulate_single_fragment_per_frame_no_bot(self): """Test encapsulating single fragment per frame with no BOT values.""" ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ BytesIO(f) for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 data = encapsulate_buffer(frames, has_bot=False) assert isinstance(data, EncapsulatedBuffer) test_frames = generate_frames(data, number_of_frames=ds.NumberOfFrames) for a, b in zip(test_frames, frames): assert a == b.getvalue() # Original data has no BOT values data.seek(0) assert b"".join(read_buffer(data)) == ds.PixelData def test_encapsulate_single_fragment_per_frame_bot(self): """Test encapsulating single fragment per frame with BOT values.""" ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ BytesIO(f) for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 data = encapsulate_buffer(frames, has_bot=True) test_frames = generate_frames(data, number_of_frames=ds.NumberOfFrames) for a, b in zip(test_frames, frames): assert a == b.getvalue() data.seek(0) fp = DicomBytesIO(b"".join(read_buffer(data))) fp.is_little_endian = True offsets = parse_basic_offsets(fp) assert offsets == [ 0x0000, # 0 0x0EEE, # 3822 0x1DF6, # 7670 0x2CF8, # 11512 0x3BFC, # 15356 0x4ADE, # 19166 0x59A2, # 22946 0x6834, # 26676 0x76E2, # 30434 0x8594, # 34196 ] def test_encapsulate_bot(self): """Test the Basic Offset Table is correct.""" ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ BytesIO(f) for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 data = encapsulate_buffer(frames, has_bot=True) assert data.read(56) == ( b"\xfe\xff\x00\xe0" # Basic offset table item tag b"\x28\x00\x00\x00" # Basic offset table length b"\x00\x00\x00\x00" # First offset b"\xee\x0e\x00\x00" b"\xf6\x1d\x00\x00" b"\xf8\x2c\x00\x00" b"\xfc\x3b\x00\x00" b"\xde\x4a\x00\x00" b"\xa2\x59\x00\x00" b"\x34\x68\x00\x00" b"\xe2\x76\x00\x00" b"\x94\x85\x00\x00" # Last offset b"\xfe\xff\x00\xe0" # Next item tag b"\xe6\x0e\x00\x00" # Next item length ) def test_encapsulate_bot_large_raises(self): """Test exception raised if too much pixel data for BOT.""" class FakeBytes(bytes): length = -1 def __len__(self): return self.length def __getitem__(self, s): return b"\x00" * 5 frame_a = FakeBytes() frame_a.length = 2**32 - 1 - 8 # 8 for first BOT item tag/length frame_b = FakeBytes() frame_b.length = 10 encapsulate([frame_a, frame_b], has_bot=True) frame_a.length = 2**32 - 1 - 7 msg = ( r"The total length of the encapsulated frame data \(4294967296 " r"bytes\) will be greater than the maximum allowed by the Basic " ) with pytest.raises(ValueError, match=msg): encapsulate([frame_a, frame_b], has_bot=True) class TestEncapsulateExtendedBuffer: """Tests for encaps.encapsulate_extended_buffer.""" def test_encapsulate(self): ds = dcmread(JP2K_10FRAME_NOBOT) frames = [ BytesIO(f) for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] assert len(frames) == 10 out = encapsulate_extended_buffer(frames) # Pixel Data encapsulated OK assert isinstance(out[0], EncapsulatedBuffer) test_frames = [ f for f in generate_frames(out[0], number_of_frames=ds.NumberOfFrames) ] for a, b in zip(test_frames, frames): assert a == b.getvalue() # Extended Offset Table is OK assert isinstance(out[1], bytes) assert [ 0x0000, # 0 0x0EEE, # 3822 0x1DF6, # 7670 0x2CF8, # 11512 0x3BFC, # 15356 0x4ADE, # 19166 0x59A2, # 22946 0x6834, # 26676 0x76E2, # 30434 0x8594, # 34196 ] == list(unpack("<10Q", out[1])) # Extended Offset Table Lengths are OK assert isinstance(out[2], bytes) assert [len(f.getvalue()) for f in frames] == list(unpack("<10Q", out[2])) def test_encapsulate_odd_length(self): """Test encapsulating odd-length frames""" frames = [b"\x00", b"\x01", b"\x02"] eot_encapsulated, eot, eot_lengths = encapsulate_extended(frames) assert unpack(f"<{len(frames)}Q", eot) == (0, 10, 20) assert unpack(f"<{len(frames)}Q", eot_lengths) == (2, 2, 2) @pytest.fixture def use_future(): original = config._use_future config._use_future = True yield config._use_future = original class TestFuture: def test_imports_raise(self, use_future): with pytest.raises(ImportError): from pydicom.encaps import generate_pixel_data_fragment with pytest.raises(ImportError): from pydicom.encaps import get_frame_offsets with pytest.raises(ImportError): from pydicom.encaps import get_nr_fragments with pytest.raises(ImportError): from pydicom.encaps import generate_pixel_data_frame with pytest.raises(ImportError): from pydicom.encaps import generate_pixel_data with pytest.raises(ImportError): from pydicom.encaps import decode_data_sequence with pytest.raises(ImportError): from pydicom.encaps import defragment_data with pytest.raises(ImportError): from pydicom.encaps import read_item pydicom-pydicom-20aa4b7/tests/test_env_info.py000066400000000000000000000020351515706620200216040ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Unit tests for the env_info module.""" import pydicom.env_info class TestEnvInfo: """Test the env_info module""" def test_report_looks_like_a_table(self, capsys): """Test that the report looks like a table""" pydicom.env_info.main() out, err = capsys.readouterr() table_start = """ module | version ------ | ------- platform |""".lstrip() assert out.startswith(table_start) def test_all_modules_reported(self, capsys): """Test that all modules are reported""" pydicom.env_info.main() out, err = capsys.readouterr() lines = out.split("\n") modules = [line.split("|")[0].strip() for line in lines[2:] if line] assert modules == [ "platform", "Python", "pydicom", "gdcm", "jpeg_ls", "numpy", "PIL", "pylibjpeg", "openjpeg", "libjpeg", ] pydicom-pydicom-20aa4b7/tests/test_errors.py000066400000000000000000000011531515706620200213150ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for errors.py""" import pytest from pydicom.errors import InvalidDicomError def test_message(): """Test InvalidDicomError with a message""" def _test(): raise InvalidDicomError("test msg") with pytest.raises(InvalidDicomError, match="test msg"): _test() def test_no_message(): """Test InvalidDicomError with no message""" def _test(): raise InvalidDicomError with pytest.raises( InvalidDicomError, match="The specified file is not a valid DICOM file." ): _test() pydicom-pydicom-20aa4b7/tests/test_examples.py000066400000000000000000000036641515706620200216300ustar00rootroot00000000000000"""Tests for the examples module.""" from pathlib import Path import pytest import pydicom from pydicom import examples, FileDataset from pydicom.examples import ct class TestExamples: def test_exception(self): """Test accessing missing module attribute raises.""" msg = "module 'pydicom.examples' has no attribute 'foo'" with pytest.raises(AttributeError, match=msg): examples.foo def test_access(self): """Test dataset access works OK.""" assert isinstance(examples.ct, FileDataset) assert isinstance(examples.dicomdir, FileDataset) assert isinstance(examples.jpeg2k, FileDataset) assert isinstance(examples.mr, FileDataset) assert isinstance(examples.no_meta, FileDataset) assert isinstance(examples.overlay, FileDataset) assert isinstance(examples.palette_color, FileDataset) assert isinstance(examples.rgb_color, FileDataset) assert isinstance(examples.rt_dose, FileDataset) assert isinstance(examples.rt_plan, FileDataset) assert isinstance(examples.rt_ss, FileDataset) assert isinstance(examples.waveform, FileDataset) def test_module_characteristics(self): """Test characteristics of the attributes.""" assert pydicom.examples.ct == examples.ct assert pydicom.examples.ct == ct assert ct == examples.ct # New instance every time the attribute is accessed assert examples.ct is not examples.ct assert ct is ct # noqa assert isinstance(ct, FileDataset) assert ct.PatientName == "CompressedSamples^CT1" def test_get_path(self): """Test get_path()""" path = examples.get_path("ct") assert isinstance(path, Path) assert path.name == "CT_small.dcm" msg = "No example dataset exists with the name 'foo'" with pytest.raises(ValueError, match=msg): examples.get_path("foo") pydicom-pydicom-20aa4b7/tests/test_filebase.py000066400000000000000000000222171515706620200215570ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Test for filebase.py""" from io import BytesIO import pytest from pydicom.data import get_testdata_file from pydicom.filebase import DicomIO, DicomFileLike, DicomFile, DicomBytesIO from pydicom.tag import Tag TEST_FILE = get_testdata_file("CT_small.dcm") class TestDicomIO: """Test filebase.DicomIO class""" def test_init(self): """Test __init__""" fp = DicomIO(BytesIO()) assert not hasattr(fp, "is_implicit_VR") assert not hasattr(fp, "is_little_endian") def test_parent(self): """Test DicomIO.parent""" buffer = BytesIO() fp = DicomIO(buffer) assert fp.parent is buffer def test_read_tag(self): """Test DicomIO.read_tag indirectly""" # Tags are 2 + 2 = 4 bytes bytestream = b"\x01\x02\x03\x04\x05\x06" # Little endian fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert Tag(fp.read_tag()) == 0x02010403 # Big endian fp = DicomBytesIO(bytestream) fp.is_little_endian = False assert Tag(fp.read_tag()) == 0x01020304 def test_write_tag(self): """Test DicomIO.write_tag indirectly""" tag = Tag(0x01020304) # Little endian fp = DicomBytesIO() fp.is_little_endian = True fp.write_tag(tag) assert fp.getvalue() == b"\x02\x01\x04\x03" # Big endian fp = DicomBytesIO() fp.is_little_endian = False fp.write_tag(tag) assert fp.getvalue() == b"\x01\x02\x03\x04" def test_read_us(self): """Test DicomIO.read_US""" # US are 2 bytes fixed bytestream = b"\x00\x00\xFF\x00\xFE\xFF" # Little endian fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert fp.read_US() == 0 assert fp.read_US() == 255 assert fp.read_US() == 65534 # Big endian fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert fp.read_US() == 0 assert fp.read_US() == 255 assert fp.read_US() == 0xFFFE def test_write_us(self): """Test DicomIO.write_US""" # Little endian fp = DicomBytesIO() fp.is_little_endian = True assert fp.getvalue() == b"" fp.write_US(0) assert fp.getvalue() == b"\x00\x00" fp.write_US(255) assert fp.getvalue() == b"\x00\x00\xFF\x00" fp.write_US(65534) assert fp.getvalue() == b"\x00\x00\xFF\x00\xFE\xFF" # Big endian fp = DicomBytesIO() fp.is_little_endian = False assert fp.getvalue() == b"" fp.write_US(0) assert fp.getvalue() == b"\x00\x00" fp.write_US(255) assert fp.getvalue() == b"\x00\x00\x00\xFF" fp.write_US(65534) assert fp.getvalue() == b"\x00\x00\x00\xFF\xFF\xFE" def test_read_ul(self): """Test DicomIO.read_UL""" # UL are 4 bytes fixed bytestream = b"\x00\x00\x00\x00\xFF\xFF\x00\x00\xFE\xFF\xFF\xFF" # Little endian fp = DicomBytesIO(bytestream) fp.is_little_endian = True assert fp.read_UL() == 0 assert fp.read_UL() == 0xFFFF assert fp.read_UL() == 0xFFFFFFFE # Big endian bytestream = b"\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFE" fp = DicomBytesIO(bytestream) fp.is_little_endian = False assert fp.read_UL() == 0 assert fp.read_UL() == 0xFFFF assert fp.read_UL() == 0xFFFFFFFE def test_write_ul(self): """Test DicomIO.write_UL indirectly""" # Little endian fp = DicomBytesIO() fp.is_little_endian = True assert fp.getvalue() == b"" fp.write_UL(0) assert fp.getvalue() == b"\x00\x00\x00\x00" fp.write_UL(65535) assert fp.getvalue() == b"\x00\x00\x00\x00\xFF\xFF\x00\x00" fp.write_UL(4294967294) assert fp.getvalue() == (b"\x00\x00\x00\x00\xFF\xFF\x00\x00\xFE\xFF\xFF\xFF") # Big endian fp = DicomBytesIO() fp.is_little_endian = False assert fp.getvalue() == b"" fp.write_UL(0) assert fp.getvalue() == b"\x00\x00\x00\x00" fp.write_UL(65535) assert fp.getvalue() == b"\x00\x00\x00\x00\x00\x00\xFF\xFF" fp.write_UL(4294967294) assert fp.getvalue() == (b"\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFE") def test_read(self): """Test DicomIO.read entire length""" fp = DicomBytesIO(b"\x00\x01\x03") bytestream = fp.read() assert bytestream == b"\x00\x01\x03" def test_read_length(self): """Test DicomIO.read specific length""" fp = DicomBytesIO(b"\x00\x01\x03") bytestream = fp.read(2) assert bytestream == b"\x00\x01" def test_read_exact(self): """Test DicomIO.read exact length""" fp = DicomBytesIO(b"\x00\x01\x03\x04") bytestream = fp.read_exact(length=4) assert bytestream == b"\x00\x01\x03\x04" def test_read_exact_retry(self): """Test DicomIO.read exact length success after retry""" class Foo: idx = 0 seek = None tell = None def read(self, length): if self.idx == 0: self.idx += 1 return b"\x00" return b"\x01\x03\x04" fp = DicomIO(Foo()) bytestream = fp.read_exact(length=4) assert bytestream == b"\x00\x01\x03\x04" def test_read_exact_length_raises(self): """Test DicomIO.read exact length raises if short""" fp = DicomBytesIO(b"\x00\x01\x03") with pytest.raises( EOFError, match="Unexpected end of file. Read 3 bytes of 4 " "expected starting at position 0x0", ): fp.read_exact(length=4) def test_getter_is_little_endian(self): """Test DicomIO.is_little_endian getter""" fp = DicomIO(BytesIO()) fp.is_little_endian = True assert fp.is_little_endian fp.is_little_endian = False assert not fp.is_little_endian def test_setter_is_little_endian(self): """Test DicomIO.is_little_endian setter""" fp = DicomIO(BytesIO()) for is_little in (True, False): fp.is_little_endian = is_little assert hasattr(fp, "_us_packer") assert hasattr(fp, "_us_unpacker") assert hasattr(fp, "_ul_packer") assert hasattr(fp, "_ul_unpacker") assert hasattr(fp, "_us_packer") assert hasattr(fp, "_tag_packer") assert hasattr(fp, "_tag_unpacker") msg = "'DicomIO.is_little_endian' must be bool" with pytest.raises(TypeError, match=msg): fp.is_little_endian = None def test_is_implicit_vr(self): """Test DicomIO.is_implicit_VR""" fp = DicomIO(BytesIO()) fp.is_implicit_VR = True assert fp.is_implicit_VR fp.is_implicit_VR = False assert not fp.is_implicit_VR msg = "'DicomIO.is_implicit_VR' must be bool" with pytest.raises(TypeError, match=msg): fp.is_implicit_VR = None def test_methods_raise(self): """Test various DicomIO methods raise exceptions.""" class Reader: def read(self): pass def seek(self): pass def tell(self): pass class Writer: def write(self, b): pass def seek(self): pass def tell(self): pass with pytest.raises(TypeError, match=r"object has no read\(\) method"): DicomIO(Writer()).read(2) with pytest.raises(TypeError, match=r"object has no write\(\) method"): DicomIO(Reader()).write(b"") fp = DicomIO(Reader()) assert fp.name is None fp.name = "foo" assert fp.name == "foo" fp.close() # no exceptions def test_init_good_buffer(self): """Test methods are set OK if buffer is good""" buffer = BytesIO() fp = DicomFileLike(buffer) assert fp._buffer == buffer assert fp.write == buffer.write assert fp.seek == buffer.seek assert fp.read == buffer.read assert fp.tell == buffer.tell assert fp.close == buffer.close def test_context(self): """Test using DicomFileLike as a context""" with DicomIO(BytesIO(b"\x00\x01")) as fp: assert fp.read(2) == b"\x00\x01" class TestDicomBytesIO: """Test filebase.DicomBytesIO class""" def test_getvalue(self): """Test DicomBytesIO.getvalue""" fp = DicomBytesIO(b"\x00\x01\x00\x02") assert fp.getvalue() == b"\x00\x01\x00\x02" class TestDicomFile: """Test filebase.DicomFile() function""" def test_read(self): """Test the function""" with DicomFile(TEST_FILE, "rb") as fp: assert not fp._buffer.closed # Weird issue with Python 3.6 sometimes returning # lowercase file path on Windows assert "ct_small.dcm" in fp.name.lower() assert fp.read(2) == b"\x49\x49" pydicom-pydicom-20aa4b7/tests/test_filereader.py000066400000000000000000002102011515706620200220770ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.filereader module.""" import gzip import io from io import BytesIO import logging import os import shutil from pathlib import Path from struct import unpack import sys import tempfile import pytest import pydicom.config from pydicom import config, dicomio from pydicom.dataset import Dataset, FileDataset, FileMetaDataset from pydicom.data import get_testdata_file from pydicom.datadict import add_dict_entries from pydicom.filereader import ( dcmread, read_dataset, data_element_generator, read_file_meta_info, ) from pydicom.dataelem import DataElement, convert_raw_data_element from pydicom.errors import InvalidDicomError from pydicom.filebase import DicomBytesIO from pydicom.multival import MultiValue from pydicom.sequence import Sequence from pydicom.tag import Tag, TupleTag import pydicom.uid from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRLittleEndian, UID, register_transfer_syntax, PrivateTransferSyntaxes, ) import pydicom.valuerep from pydicom import values from pydicom.pixel_data_handlers import gdcm_handler have_gdcm_handler = gdcm_handler.is_available() have_numpy = pydicom.config.have_numpy if have_numpy: import numpy try: import jpeg_ls except ImportError: jpeg_ls = None try: from PIL import Image as PILImg except ImportError: # If that failed, try the alternate import syntax for PIL. try: import Image as PILImg except ImportError: # Neither worked, so it's likely not installed. PILImg = None have_jpeg_ls = jpeg_ls is not None have_pillow = PILImg is not None empty_number_tags_name = get_testdata_file("reportsi_with_empty_number_tags.dcm") rtplan_name = get_testdata_file("rtplan.dcm") rtdose_name = get_testdata_file("rtdose.dcm") ct_name = get_testdata_file("CT_small.dcm") mr_name = get_testdata_file("MR_small.dcm") truncated_mr_name = get_testdata_file("MR_truncated.dcm") jpeg2000_name = get_testdata_file("JPEG2000.dcm") jpeg2000_embedded_sequence_delimiter_name = get_testdata_file( "JPEG2000-embedded-sequence-delimiter.dcm" ) jpeg2000_lossless_name = get_testdata_file("MR_small_jp2klossless.dcm") jpeg_ls_lossless_name = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") jpeg_lossy_name = get_testdata_file("JPEG-lossy.dcm") jpeg_lossless_name = get_testdata_file("JPEG-LL.dcm") deflate_name = get_testdata_file("image_dfl.dcm") rtstruct_name = get_testdata_file("rtstruct.dcm") priv_SQ_name = get_testdata_file("priv_SQ.dcm") nested_priv_SQ_name = get_testdata_file("nested_priv_SQ.dcm") meta_missing_tsyntax_name = get_testdata_file("meta_missing_tsyntax.dcm") no_meta_group_length = get_testdata_file("no_meta_group_length.dcm") gzip_name = get_testdata_file("zipMR.gz") color_px_name = get_testdata_file("color-px.dcm") color_pl_name = get_testdata_file("color-pl.dcm") explicit_vr_le_no_meta = get_testdata_file("ExplVR_LitEndNoMeta.dcm") explicit_vr_be_no_meta = get_testdata_file("ExplVR_BigEndNoMeta.dcm") emri_name = get_testdata_file("emri_small.dcm") emri_big_endian_name = get_testdata_file("emri_small_big_endian.dcm") emri_jpeg_ls_lossless = get_testdata_file("emri_small_jpeg_ls_lossless.dcm") emri_jpeg_2k_lossless = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") emri_jpeg_2k_lossless_too_short = get_testdata_file( "emri_small_jpeg_2k_lossless_too_short.dcm" ) color_3d_jpeg_baseline = get_testdata_file("color3d_jpeg_baseline.dcm") dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() def test_dicomio(): assert dicomio.dcmread is pydicom.dcmread assert dicomio.dcmwrite is pydicom.dcmwrite class TestReader: def teardown_method(self): pydicom.uid.PrivateTransferSyntaxes = [] def test_empty_numbers_tag(self): """Test that an empty tag with a number VR (FL, UL, SL, US, SS, FL, FD, OF) reads as ``None``.""" empty_number_tags_ds = dcmread(empty_number_tags_name) assert empty_number_tags_ds.ExaminedBodyThickness is None assert empty_number_tags_ds.SimpleFrameList is None assert empty_number_tags_ds.ReferencePixelX0 is None assert empty_number_tags_ds.PhysicalUnitsXDirection is None assert empty_number_tags_ds.TagAngleSecondAxis is None assert empty_number_tags_ds.TagSpacingSecondDimension is None assert empty_number_tags_ds.VectorGridData is None def test_UTF8_filename(self): utf8_filename = os.path.join(tempfile.gettempdir(), "ДИКОМ.dcm") shutil.copyfile(rtdose_name, utf8_filename) ds = dcmread(utf8_filename) os.remove(utf8_filename) assert ds is not None def test_pathlib_path_filename(self): """Check that file can be read using pathlib.Path""" dcmread(Path(priv_SQ_name)) def test_RTPlan(self): """Returns correct values for sample data elements in test RT Plan file. """ plan = dcmread(rtplan_name) beam = plan.BeamSequence[0] # if not two controlpoints, then this would raise exception cp0, cp1 = beam.ControlPointSequence assert "unit001" == beam.TreatmentMachineName assert beam[0x300A, 0x00B2].value == beam.TreatmentMachineName got = cp1.ReferencedDoseReferenceSequence[0].CumulativeDoseReferenceCoefficient DS = pydicom.valuerep.DS expected = DS("0.9990268") assert expected == got got = cp0.BeamLimitingDevicePositionSequence[0].LeafJawPositions if have_numpy and config.use_DS_numpy: expected = numpy.array([DS("-100"), DS("100.0")]) assert numpy.allclose(got, expected) else: expected = [DS("-100"), DS("100.0")] assert got == expected def test_RTDose(self): """Returns correct values for sample data elements in test RT Dose file""" dose = dcmread(rtdose_name) assert Tag((0x3004, 0x000C)) == dose.FrameIncrementPointer assert dose[0x28, 9].value == dose.FrameIncrementPointer # try a value that is nested the deepest # (so deep I break it into two steps!) fract = dose.ReferencedRTPlanSequence[0].ReferencedFractionGroupSequence[0] assert 1 == fract.ReferencedBeamSequence[0].ReferencedBeamNumber def test_CT(self): """Returns correct values for sample data elements in test CT file.""" ct = dcmread(ct_name) assert "1.3.6.1.4.1.5962.2" == ct.file_meta.ImplementationClassUID value = ct.file_meta[0x2, 0x12].value assert value == ct.file_meta.ImplementationClassUID # (0020,0032) Image Position (Patient) # [-158.13580300000001, -179.035797, -75.699996999999996] got = ct.ImagePositionPatient DS = pydicom.valuerep.DS if have_numpy and config.use_DS_numpy: expected = numpy.array([-158.135803, -179.035797, -75.699997]) assert numpy.allclose(got, expected) else: expected = [DS("-158.135803"), DS("-179.035797"), DS("-75.699997")] assert got == expected assert 128 == ct.Rows assert 128 == ct.Columns assert 16 == ct.BitsStored assert 128 * 128 * 2 == len(ct.PixelData) # Also test private elements name can be resolved: got = ct[(0x0043, 0x104E)].name assert "[Duration of X-ray on]" == got @pytest.mark.skipif(not have_numpy, reason="Numpy not installed") def test_CT_PixelData(self): """Check that we can read pixel data. Tests that we get last one in array. """ ct = dcmread(ct_name) assert 909 == ct.pixel_array[-1][-1] def test_no_force(self): """Raises exception if missing DICOM header and force==False.""" with pytest.raises(InvalidDicomError): dcmread(rtstruct_name) def test_RTStruct(self): """Returns correct values for sample elements in test RTSTRUCT file.""" # RTSTRUCT test file has complex nested sequences # -- see rtstruct.dump file # Also has no DICOM header ... so tests 'force' argument of dcmread rtss = dcmread(rtstruct_name, force=True) frame_of_ref = rtss.ReferencedFrameOfReferenceSequence[0] study = frame_of_ref.RTReferencedStudySequence[0] uid = study.RTReferencedSeriesSequence[0].SeriesInstanceUID assert "1.2.826.0.1.3680043.8.498.2010020400001.2.1.1" == uid got = rtss.ROIContourSequence[0].ContourSequence[2].ContourNumber assert 3 == got obs_seq0 = rtss.RTROIObservationsSequence[0] got = obs_seq0.ROIPhysicalPropertiesSequence[0].ROIPhysicalProperty assert "REL_ELEC_DENSITY" == got def test_dir(self): """Returns correct dir attributes for both Dataset and DICOM names (python >= 2.6)..""" # Only python >= 2.6 calls __dir__ for dir() call rtss = dcmread(rtstruct_name, force=True) # sample some expected 'dir' values got_dir = dir(rtss) expect_in_dir = [ "pixel_array", "add_new", "ROIContourSequence", "StructureSetDate", ] for name in expect_in_dir: assert name in got_dir # Now check for some items in dir() of a nested item roi0 = rtss.ROIContourSequence[0] got_dir = dir(roi0) expect_in_dir = [ "pixel_array", "add_new", "ReferencedROINumber", "ROIDisplayColor", ] for name in expect_in_dir: assert name in got_dir def test_MR(self): """Returns correct values for sample data elements in test MR file.""" mr = dcmread(mr_name) # (0010,0010) Patient's Name 'CompressedSamples^MR1' mr.decode() assert "CompressedSamples^MR1" == mr.PatientName assert mr[0x10, 0x10].value == mr.PatientName DS = pydicom.valuerep.DS if have_numpy and config.use_DS_numpy: expected = numpy.array([0.3125, 0.3125]) assert numpy.allclose(mr.PixelSpacing, expected) else: assert [DS("0.3125"), DS("0.3125")] == mr.PixelSpacing def test_deflate(self): """Returns correct values for sample data elements in test compressed (zlib deflate) file """ # Everything after group 2 is compressed. # If we can read anything else, the decompression must have been ok. ds = dcmread(deflate_name) assert "WSD" == ds.ConversionType assert isinstance(ds.buffer, DicomBytesIO) assert ds.filename == deflate_name def test_sequence_with_implicit_vr(self): """Test that reading a UN sequence with unknown length and implicit VR in a dataset with explicit VR is read regardless of the value of the assume_implicit_vr_switch option.""" replace_un_with_known_vr = config.replace_un_with_known_vr assume_implicit_vr_switch = config.assume_implicit_vr_switch config.replace_un_with_known_vr = True config.assume_implicit_vr_switch = True ds = dcmread(get_testdata_file("bad_sequence.dcm")) str(ds.CTDIPhantomTypeCodeSequence) config.assume_implicit_vr_switch = False ds = dcmread(get_testdata_file("bad_sequence.dcm")) str(ds.CTDIPhantomTypeCodeSequence) config.replace_un_with_known_vr = False ds = dcmread(get_testdata_file("bad_sequence.dcm")) str(ds.CTDIPhantomTypeCodeSequence) config.replace_un_with_known_vr = replace_un_with_known_vr config.assume_implicit_vr_switch = assume_implicit_vr_switch def test_no_pixels_read(self): """Returns all data elements before pixels using stop_before_pixels=False. """ # Just check the tags, and a couple of values ctpartial = dcmread(ct_name, stop_before_pixels=True) ctpartial_tags = sorted(ctpartial.keys()) ctfull = dcmread(ct_name) ctfull_tags = sorted(ctfull.keys()) missing = [Tag(0x7FE0, 0x10), Tag(0xFFFC, 0xFFFC)] assert ctfull_tags == ctpartial_tags + missing @pytest.mark.skipif(not have_numpy, reason="Numpy not available") def test_no_float_pixels_read(self): """Returns all data elements before pixels using stop_before_pixels=True. """ ds = Dataset() ds.InstanceNumber = 1 ds.FloatPixelData = numpy.random.random((3, 3)).tobytes() fp = BytesIO() file_ds = FileDataset(fp, ds) file_ds.save_as(fp, implicit_vr=True) test_ds = dcmread(fp, force=True, stop_before_pixels=True) ds_tags = sorted(ds.keys()) test_ds_tags = sorted(test_ds.keys()) assert ds_tags == test_ds_tags + [Tag(0x7FE0, 0x08)] def test_specific_tags(self): """Returns only tags specified by user.""" ctspecific = dcmread( ct_name, specific_tags=[ Tag(0x0010, 0x0010), "PatientID", "ImageType", "ViewName", ], ) ctspecific_tags = sorted(ctspecific.keys()) expected = [ # SpecificCharacterSet is always added # ViewName does not exist in the data set Tag(0x0008, 0x0005), Tag(0x0008, 0x0008), Tag(0x0010, 0x0010), Tag(0x0010, 0x0020), ] assert expected == ctspecific_tags def test_specific_tags_with_other_unknown_length_tags(self): rtstruct_specific = dcmread( rtstruct_name, force=True, specific_tags=[ "PatientName", "PatientID", ], ) rtstruct_specific_tags = sorted(rtstruct_specific.keys()) expected = [ # SpecificCharacterSet is always added Tag(0x0008, 0x0005), Tag(0x0010, 0x0010), Tag(0x0010, 0x0020), ] assert expected == rtstruct_specific_tags def test_specific_tags_with_unknown_length_SQ(self): """Returns only tags specified by user.""" unknown_len_sq_tag = Tag(0x3F03, 0x1001) tags = dcmread(priv_SQ_name, specific_tags=[unknown_len_sq_tag]) tags = sorted(tags.keys()) assert [unknown_len_sq_tag] == tags tags = dcmread(priv_SQ_name, specific_tags=["PatientName"]) tags = sorted(tags.keys()) assert [] == tags def test_specific_tags_with_unknown_length_tag(self): """Returns only tags specified by user.""" unknown_len_tag = Tag(0x7FE0, 0x0010) # Pixel Data tags = dcmread(emri_jpeg_2k_lossless, specific_tags=[unknown_len_tag]) tags = sorted(tags.keys()) # SpecificCharacterSet is always added assert [Tag(0x08, 0x05), unknown_len_tag] == tags tags = dcmread(emri_jpeg_2k_lossless, specific_tags=["SpecificCharacterSet"]) tags = sorted(tags.keys()) assert [Tag(0x08, 0x05)] == tags def test_tag_with_unknown_length_tag_too_short(self, allow_reading_invalid_values): """Tests handling of incomplete sequence value.""" # the data set is the same as emri_jpeg_2k_lossless, # with the last 8 bytes removed to provoke the EOF error unknown_len_tag = Tag(0x7FE0, 0x0010) # Pixel Data with pytest.warns(UserWarning, match="End of file reached*"): dcmread( emri_jpeg_2k_lossless_too_short, specific_tags=[unknown_len_tag], ) def test_tag_with_unknown_length_tag_too_short_strict(self, enforce_valid_values): """Tests handling of incomplete sequence value in strict mode.""" unknown_len_tag = Tag(0x7FE0, 0x0010) # Pixel Data with pytest.raises(EOFError, match="End of file reached*"): dcmread( emri_jpeg_2k_lossless_too_short, specific_tags=[unknown_len_tag], ) def test_private_SQ(self): """Can read private undefined length SQ without error.""" # From issues 91, 97, 98. Bug introduced by fast reading, due to # VR=None in raw data elements, then an undefined length private # item VR is looked up, and there is no such tag, # generating an exception # Simply read the file, in 0.9.5 this generated an exception dcmread(priv_SQ_name) def test_nested_private_SQ(self): """Can successfully read a private SQ which contains additional SQs.""" # From issue 113. When a private SQ of undefined length is used, the # sequence is read in and the length of the SQ is determined upon # identification of the SQ termination sequence. When using nested # Sequences, the first termination sequence encountered actually # belongs to the nested Sequence not the parent, therefore the # remainder of the file is not read in properly ds = dcmread(nested_priv_SQ_name) # Make sure that the entire dataset was read in pixel_data_tag = TupleTag((0x7FE0, 0x10)) assert pixel_data_tag in ds # Check that the DataElement is indeed a Sequence tag = TupleTag((0x01, 0x01)) seq0 = ds[tag] assert "SQ" == seq0.VR # Now verify the presence of the nested private SQ seq1 = seq0[0][tag] assert "SQ" == seq1.VR # Now make sure the values that are parsed are correct assert b"Double Nested SQ" == seq1[0][tag].value assert b"Nested SQ" == seq0[0][0x01, 0x02].value def test_un_sequence(self, dont_replace_un_with_known_vr): ds = dcmread(get_testdata_file("UN_sequence.dcm")) seq_element = ds[0x4453100C] assert seq_element.VR == "SQ" assert len(seq_element.value) == 1 assert len(seq_element.value[0].ReferencedSeriesSequence) == 1 def test_un_sequence_dont_infer( self, dont_replace_un_with_sq_vr, dont_replace_un_with_known_vr ): ds = dcmread(get_testdata_file("UN_sequence.dcm")) seq_element = ds[0x4453100C] assert seq_element.VR == "UN" def test_no_meta_group_length(self, no_datetime_conversion): """Read file with no group length in file meta.""" # Issue 108 -- iView example file with no group length (0002,0002) # Originally crashed, now check no exception, but also check one item # in file_meta, and second one in followinsg dataset ds = dcmread(no_meta_group_length) assert "20111130" == ds.InstanceCreationDate def test_no_transfer_syntax_in_meta(self): """Read file with file_meta, but has no TransferSyntaxUID in it.""" # From issue 258: if file has file_meta but no TransferSyntaxUID in it, # should assume default transfer syntax ds = dcmread(meta_missing_tsyntax_name) # is default transfer syntax # Repeat one test from nested private sequence test to maker sure # file was read correctly pixel_data_tag = TupleTag((0x7FE0, 0x10)) assert pixel_data_tag in ds def test_explicit_VR_little_endian_no_meta(self, no_datetime_conversion): """Read file without file meta with Little Endian Explicit VR dataset.""" # Example file from CMS XiO 5.0 and above # Still need to force read data since there is no 'DICM' marker present ds = dcmread(explicit_vr_le_no_meta, force=True) assert "20150529" == ds.InstanceCreationDate def test_explicit_VR_big_endian_no_meta(self, no_datetime_conversion): """Read file without file meta with Big Endian Explicit VR dataset.""" # Example file from CMS XiO 5.0 and above # Still need to force read data since there is no 'DICM' marker present ds = dcmread(explicit_vr_be_no_meta, force=True) assert "20150529" == ds.InstanceCreationDate def test_planar_config(self): px_data_ds = dcmread(color_px_name) pl_data_ds = dcmread(color_pl_name) assert px_data_ds.PlanarConfiguration != pl_data_ds.PlanarConfiguration if have_numpy: px_data = px_data_ds.pixel_array pl_data = pl_data_ds.pixel_array assert numpy.all(px_data == pl_data) def test_correct_ambiguous_vr(self): """Test correcting ambiguous VR elements read from file""" ds = Dataset() ds.PixelRepresentation = 0 ds.add(DataElement(0x00280108, "US", 10)) ds.add(DataElement(0x00280109, "US", 500)) fp = BytesIO() file_ds = FileDataset(fp, ds) file_ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "US" == ds[0x00280108].VR assert 10 == ds.SmallestPixelValueInSeries def test_correct_ambiguous_explicit_vr(self): """Test correcting ambiguous VR elements read from file""" ds = Dataset() ds.PixelRepresentation = 0 ds.add(DataElement(0x00280108, "US", 10)) ds.add(DataElement(0x00280109, "US", 500)) fp = BytesIO() file_ds = FileDataset(fp, ds) file_ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "US" == ds[0x00280108].VR assert 10 == ds.SmallestPixelValueInSeries def test_correct_ambiguous_vr_compressed(self): """Test correcting compressed Pixel Data read from file""" # Create an implicit VR compressed dataset ds = dcmread(jpeg_lossless_name) fp = BytesIO() file_ds = FileDataset(fp, ds) file_ds.save_as(fp) ds = dcmread(fp, force=True) assert "OB" == ds[0x7FE00010].VR def test_read_encoded_pixel_data_without_embedded_sequence_delimiter(self): ds = dcmread(jpeg2000_name) assert "OB" == ds[0x7FE00010].VR assert 266 == len(ds[0x7FE00010].value) def test_read_encoded_pixel_data_with_embedded_sequence_delimiter(self): """Test ignoring embedded sequence delimiter in encoded pixel data fragment. Reproduces #1140. """ ds = dcmread(jpeg2000_embedded_sequence_delimiter_name) assert "OB" == ds[0x7FE00010].VR assert 266 == len(ds[0x7FE00010].value) def test_long_specific_char_set(self, allow_reading_invalid_values): """Test that specific character set is read even if it is longer than defer_size""" ds = Dataset() long_specific_char_set_value = ["ISO 2022IR 100"] * 9 ds.add(DataElement(0x00080005, "CS", long_specific_char_set_value)) msg = r"Unknown encoding 'ISO 2022IR 100' - using default encoding instead" fp = BytesIO() file_ds = FileDataset(fp, ds) with pytest.warns(UserWarning, match=msg): file_ds.save_as(fp) with pytest.warns(UserWarning, match=msg): ds = dcmread(fp, defer_size=65, force=True) assert long_specific_char_set_value == ds[0x00080005].value def test_long_specific_char_set_strict(self, enforce_valid_values): ds = Dataset() long_specific_char_set_value = ["ISO 2022IR 100"] * 9 ds.add(DataElement(0x00080005, "CS", long_specific_char_set_value)) fp = BytesIO() file_ds = FileDataset(fp, ds) with pytest.raises(LookupError, match="Unknown encoding 'ISO 2022IR 100'"): file_ds.save_as(fp) def test_no_preamble_file_meta_dataset(self): """Test correct read of group 2 elements with no preamble.""" bytestream = ( b"\x02\x00\x02\x00\x55\x49\x16\x00\x31\x2e\x32\x2e" b"\x38\x34\x30\x2e\x31\x30\x30\x30\x38\x2e\x35\x2e" b"\x31\x2e\x31\x2e\x39\x00\x02\x00\x10\x00\x55\x49" b"\x12\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30" b"\x30\x30\x38\x2e\x31\x2e\x32\x00\x20\x20\x10\x00" b"\x02\x00\x00\x00\x01\x00\x20\x20\x20\x00\x06\x00" b"\x00\x00\x4e\x4f\x52\x4d\x41\x4c" ) fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert "MediaStorageSOPClassUID" in ds.file_meta assert ImplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID assert "NORMAL" == ds.Polarity assert 1 == ds.ImageBoxPosition def test_no_preamble_command_group_dataset(self): """Test correct read of group 0 and 2 elements with no preamble.""" bytestream = ( b"\x02\x00\x02\x00\x55\x49\x16\x00\x31\x2e\x32\x2e" b"\x38\x34\x30\x2e\x31\x30\x30\x30\x38\x2e\x35\x2e" b"\x31\x2e\x31\x2e\x39\x00\x02\x00\x10\x00\x55\x49" b"\x12\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30" b"\x30\x30\x38\x2e\x31\x2e\x32\x00" b"\x20\x20\x10\x00\x02\x00\x00\x00\x01\x00\x20\x20" b"\x20\x00\x06\x00\x00\x00\x4e\x4f\x52\x4d\x41\x4c" b"\x00\x00\x10\x01\x02\x00\x00\x00\x03\x00" ) fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert "MediaStorageSOPClassUID" in ds.file_meta assert ImplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID assert "NORMAL" == ds.Polarity assert 1 == ds.ImageBoxPosition assert 3 == ds.MessageID def test_group_length_wrong(self): """Test file is read correctly even if FileMetaInformationGroupLength is incorrect. """ bytestream = ( b"\x02\x00\x00\x00\x55\x4C\x04\x00\x0A\x00\x00\x00" b"\x02\x00\x02\x00\x55\x49\x16\x00\x31\x2e\x32\x2e" b"\x38\x34\x30\x2e\x31\x30\x30\x30\x38\x2e\x35\x2e" b"\x31\x2e\x31\x2e\x39\x00\x02\x00\x10\x00\x55\x49" b"\x12\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30" b"\x30\x30\x38\x2e\x31\x2e\x32\x00" b"\x20\x20\x10\x00\x02\x00\x00\x00\x01\x00\x20\x20" b"\x20\x00\x06\x00\x00\x00\x4e\x4f\x52\x4d\x41\x4c" ) fp = BytesIO(bytestream) ds = dcmread(fp, force=True) value = ds.file_meta.FileMetaInformationGroupLength assert not len(bytestream) - 12 == value assert 10 == ds.file_meta.FileMetaInformationGroupLength assert "MediaStorageSOPClassUID" in ds.file_meta assert ImplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID assert "NORMAL" == ds.Polarity assert 1 == ds.ImageBoxPosition def test_preamble_command_meta_no_dataset(self): """Test reading only preamble, command and meta elements""" preamble = b"\x00" * 128 prefix = b"DICM" command = ( b"\x00\x00\x00\x00\x04\x00\x00\x00\x38" b"\x00\x00\x00\x00\x00\x02\x00\x12\x00\x00" b"\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31" b"\x30\x30\x30\x38\x2e\x31\x2e\x31\x00\x00" b"\x00\x00\x01\x02\x00\x00\x00\x30\x00\x00" b"\x00\x10\x01\x02\x00\x00\x00\x07\x00\x00" b"\x00\x00\x08\x02\x00\x00\x00\x01\x01" ) meta = ( b"\x02\x00\x00\x00\x55\x4C\x04\x00\x0A\x00\x00\x00" b"\x02\x00\x02\x00\x55\x49\x16\x00\x31\x2e\x32\x2e" b"\x38\x34\x30\x2e\x31\x30\x30\x30\x38\x2e\x35\x2e" b"\x31\x2e\x31\x2e\x39\x00\x02\x00\x10\x00\x55\x49" b"\x12\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30" b"\x30\x30\x38\x2e\x31\x2e\x32\x00" ) bytestream = preamble + prefix + meta + command fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert "TransferSyntaxUID" in ds.file_meta assert "MessageID" in ds def test_preamble_meta_no_dataset(self): """Test reading only preamble and meta elements""" preamble = b"\x00" * 128 prefix = b"DICM" meta = ( b"\x02\x00\x00\x00\x55\x4C\x04\x00\x0A\x00\x00\x00" b"\x02\x00\x02\x00\x55\x49\x16\x00\x31\x2e\x32\x2e" b"\x38\x34\x30\x2e\x31\x30\x30\x30\x38\x2e\x35\x2e" b"\x31\x2e\x31\x2e\x39\x00\x02\x00\x10\x00\x55\x49" b"\x12\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30" b"\x30\x30\x38\x2e\x31\x2e\x32\x00" ) bytestream = preamble + prefix + meta fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert b"\x00" * 128 == ds.preamble assert "TransferSyntaxUID" in ds.file_meta assert Dataset() == ds[:] def test_preamble_commandset_no_dataset(self): """Test reading only preamble and command set""" preamble = b"\x00" * 128 prefix = b"DICM" command = ( b"\x00\x00\x00\x00\x04\x00\x00\x00\x38" b"\x00\x00\x00\x00\x00\x02\x00\x12\x00\x00" b"\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31" b"\x30\x30\x30\x38\x2e\x31\x2e\x31\x00\x00" b"\x00\x00\x01\x02\x00\x00\x00\x30\x00\x00" b"\x00\x10\x01\x02\x00\x00\x00\x07\x00\x00" b"\x00\x00\x08\x02\x00\x00\x00\x01\x01" ) bytestream = preamble + prefix + command fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert "MessageID" in ds assert Dataset() == ds.file_meta def test_meta_no_dataset(self): """Test reading only meta elements""" bytestream = ( b"\x02\x00\x00\x00\x55\x4C\x04\x00\x0A\x00\x00\x00" b"\x02\x00\x02\x00\x55\x49\x16\x00\x31\x2e\x32\x2e" b"\x38\x34\x30\x2e\x31\x30\x30\x30\x38\x2e\x35\x2e" b"\x31\x2e\x31\x2e\x39\x00\x02\x00\x10\x00\x55\x49" b"\x12\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31\x30" b"\x30\x30\x38\x2e\x31\x2e\x32\x00" ) fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert "TransferSyntaxUID" in ds.file_meta assert Dataset() == ds[:] def test_commandset_no_dataset(self): """Test reading only command set elements""" bytestream = ( b"\x00\x00\x00\x00\x04\x00\x00\x00\x38" b"\x00\x00\x00\x00\x00\x02\x00\x12\x00\x00" b"\x00\x31\x2e\x32\x2e\x38\x34\x30\x2e\x31" b"\x30\x30\x30\x38\x2e\x31\x2e\x31\x00\x00" b"\x00\x00\x01\x02\x00\x00\x00\x30\x00\x00" b"\x00\x10\x01\x02\x00\x00\x00\x07\x00\x00" b"\x00\x00\x08\x02\x00\x00\x00\x01\x01" ) fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert "MessageID" in ds assert ds.preamble is None assert Dataset() == ds.file_meta def test_file_meta_dataset_implicit_vr(self, allow_reading_invalid_values): """Test reading a file meta dataset that is implicit VR""" bytestream = ( b"\x02\x00\x10\x00\x12\x00\x00\x00" b"\x31\x2e\x32\x2e\x38\x34\x30\x2e" b"\x31\x30\x30\x30\x38\x2e\x31\x2e" b"\x32\x00" ) fp = BytesIO(bytestream) with pytest.warns(UserWarning): ds = dcmread(fp, force=True) assert "TransferSyntaxUID" in ds.file_meta def test_file_meta_dataset_implicit_vr_strict(self, enforce_valid_values): """Test reading a file meta dataset that is implicit VR""" bytestream = ( b"\x02\x00\x10\x00\x12\x00\x00\x00" b"\x31\x2e\x32\x2e\x38\x34\x30\x2e" b"\x31\x30\x30\x30\x38\x2e\x31\x2e" b"\x32\x00" ) fp = BytesIO(bytestream) with pytest.raises( InvalidDicomError, match="Expected explicit VR, but found implicit VR" ): dcmread(fp, force=True) def test_no_dataset(self): """Test reading no elements or preamble produces empty Dataset""" bytestream = b"" fp = BytesIO(bytestream) ds = dcmread(fp, force=True) assert ds.preamble is None assert Dataset() == ds.file_meta assert Dataset() == ds[:] def test_empty_file(self): """Test reading no elements from file produces empty Dataset""" with tempfile.NamedTemporaryFile() as f: ds = dcmread(f, force=True) assert ds.preamble is None assert Dataset() == ds.file_meta assert Dataset() == ds[:] def test_bad_filename(self): """Test reading from non-existing file raises.""" with pytest.raises(FileNotFoundError): dcmread("InvalidFilePath") with pytest.raises( TypeError, match=( "dcmread: Expected a file path, file-like or readable " "buffer, but got NoneType" ), ): dcmread(None) with pytest.raises( TypeError, match=( "dcmread: Expected a file path, file-like or readable " "buffer, but got int" ), ): dcmread(42) def test_empty_specific_character_set(self): """Test that an empty Specific Character Set is handled correctly. Regression test for #1038""" ds = dcmread(get_testdata_file("empty_charset_LEI.dcm")) msg = ( "'FileDataset.read_encoding' will be removed in v4.0, use " "'FileDataset.original_character_set' instead" ) with pytest.warns(DeprecationWarning, match=msg): assert ds.read_encoding == ["iso8859"] def test_dcmread_does_not_raise(self): """Test that reading from DicomBytesIO does not raise on EOF. Regression test for #358.""" ds = dcmread(mr_name) fp = DicomBytesIO() ds.save_as(fp) fp.seek(0) de_gen = data_element_generator(fp, False, True) try: while True: next(de_gen) except StopIteration: pass except EOFError: self.fail("Unexpected EOFError raised") def test_lut_descriptor(self): """Regression test for #942: incorrect first value""" prefixes = [ b"\x28\x00\x01\x11", b"\x28\x00\x02\x11", b"\x28\x00\x03\x11", b"\x28\x00\x02\x30", ] suffix = b"\x53\x53\x06\x00\x00\xf5\x00\xf8\x10\x00" for raw_tag in prefixes: tag = unpack("<2H", raw_tag) bs = DicomBytesIO(raw_tag + suffix) bs.is_little_endian = True bs.is_implicit_VR = False ds = dcmread(bs, force=True) elem = ds[tag] assert elem.VR == "SS" assert elem.value == [62720, -2048, 16] def test_lut_descriptor_empty(self): """Regression test for #1049: LUT empty raises.""" bs = DicomBytesIO(b"\x28\x00\x01\x11\x53\x53\x00\x00") bs.is_little_endian = True bs.is_implicit_VR = False ds = dcmread(bs, force=True) elem = ds[0x00281101] assert elem.value is None assert elem.VR == "SS" def test_lut_descriptor_singleton(self): """Test LUT Descriptor with VM = 1""" bs = DicomBytesIO(b"\x28\x00\x01\x11\x53\x53\x02\x00\x00\xf5") bs.is_little_endian = True bs.is_implicit_VR = False ds = dcmread(bs, force=True) elem = ds[0x00281101] # No conversion to US if not a triplet assert elem.value == -2816 assert elem.VR == "SS" def test_reading_of(self): """Test reading a dataset with OF element.""" bs = DicomBytesIO( b"\x28\x00\x01\x11\x53\x53\x06\x00\x00\xf5\x00\xf8\x10\x00" b"\xe0\x7f\x08\x00\x4F\x46\x00\x00\x04\x00\x00\x00\x00\x01\x02\x03" ) bs.is_little_endian = True bs.is_implicit_VR = False ds = dcmread(bs, force=True) elem = ds["FloatPixelData"] assert "OF" == elem.VR assert b"\x00\x01\x02\x03" == elem.value def test_empty_pn(self): """Test correct type for an empty PN element.""" # Test for 1338 ds = Dataset() ds.PatientName = "" assert isinstance(ds.PatientName, pydicom.valuerep.PersonName) bs = DicomBytesIO() ds.save_as(bs, implicit_vr=True) dcmread(bs, force=True) assert isinstance(ds[0x00100010].value, pydicom.valuerep.PersonName) def test_explicit_undefined_length_logged(self, enable_debugging, caplog): with caplog.at_level(logging.DEBUG, logger="pydicom"): read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00OB\x00\x00\xFF\xFF\xFF\xFF" b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\xDD\xE0\x00\x00\x00\x00" ), False, True, ) assert "Undefined length (FFFFFFFF)" in caplog.text assert "Reading undefined length data element" in caplog.text def test_sequence_undefined_length_logged(self, enable_debugging, caplog): with caplog.at_level(logging.DEBUG, logger="pydicom"): read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00SQ\x00\x00\xFF\xFF\xFF\xFF" b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\xDD\xE0\x00\x00\x00\x00" ), False, True, ) assert "0000001E: Reading/parsing undefined length sequence" in caplog.text assert ( "00000022: fe ff 00 e0 00 00 00 00 Found Item tag (start of item)" ) in caplog.text assert "Finished sequence item" in caplog.text def test_sequence_delimiter_with_length(self, enable_debugging, caplog): with caplog.at_level(logging.DEBUG, logger="pydicom"): read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00SQ\x00\x00\xFF\xFF\xFF\xFF" b"\xFE\xFF\x00\xE0\x00\x00\x00\x00" b"\xFE\xFF\xDD\xE0\x00\x00\x00\x01" ), False, True, ) assert ( "Expected 0x00000000 after delimiter, found 0x1000000, at position 0x2A" ) in caplog.text def test_sequence_missing_item_tag(self, enable_debugging, caplog): with caplog.at_level(logging.WARNING, logger="pydicom"): read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00SQ\x00\x00\xFF\xFF\xFF\xFF" b"\x10\x00\x10\x00\x00\x00\x00\x00" b"\xFE\xFF\xDD\xE0\x00\x00\x00\x01" ), False, True, ) assert ( "Expected sequence item with tag (FFFE,E000) at file position 0x22" ) in caplog.text def test_registered_private_transfer_syntax(self, enable_debugging, caplog): """Test reading a dataset with a registered private transfer syntax""" uid = UID("1.2.3.4") uid.set_private_encoding(True, True) ds = dcmread(ct_name) assert ds.original_encoding == (False, True) buffer = BytesIO() ds.file_meta.TransferSyntaxUID = uid assert ds.file_meta.TransferSyntaxUID.is_implicit_VR assert ds.file_meta.TransferSyntaxUID.is_little_endian ds.save_as(buffer) buffer.seek(0) with caplog.at_level(logging.WARNING, logger="pydicom"): msg = "Expected explicit VR, but found implicit VR" with pytest.warns(UserWarning, match=msg): dcmread(buffer) assert msg in caplog.text caplog.clear() register_transfer_syntax(uid) buffer.seek(0) with caplog.at_level(logging.WARNING, logger="pydicom"): ds = dcmread(buffer) assert "Expected explicit VR, but found implicit VR" not in caplog.text assert ds.file_meta.TransferSyntaxUID == uid assert ds.original_encoding == (True, True) class TestIncorrectVR: def setup_method(self): self.ds_explicit = BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" # SpecificCharacterSet b"\x08\x00\x20\x00DA\x08\x0020000101" # StudyDate ) self.ds_implicit = BytesIO( b"\x08\x00\x05\x00\x0a\x00\x00\x00ISO_IR 100" b"\x08\x00\x20\x00\x08\x00\x00\x0020000101" ) def test_implicit_vr_expected_explicit_used( self, allow_reading_invalid_values, no_datetime_conversion ): msg = ( "Expected implicit VR, but found explicit VR - " "using explicit VR for reading" ) with pytest.warns(UserWarning, match=msg): ds = read_dataset( self.ds_explicit, is_implicit_VR=True, is_little_endian=True ) assert "ISO_IR 100" == ds.SpecificCharacterSet assert "20000101" == ds.StudyDate def test_implicit_vr_expected_explicit_used_strict(self, enforce_valid_values): msg = "Expected implicit VR, but found explicit VR" with pytest.raises(InvalidDicomError, match=msg): read_dataset(self.ds_explicit, is_implicit_VR=True, is_little_endian=True) def test_explicit_vr_expected_implicit_used( self, allow_reading_invalid_values, no_datetime_conversion ): msg = ( "Expected explicit VR, but found implicit VR - " "using implicit VR for reading" ) with pytest.warns(UserWarning, match=msg): ds = read_dataset( self.ds_implicit, is_implicit_VR=False, is_little_endian=True ) assert "ISO_IR 100" == ds.SpecificCharacterSet assert "20000101" == ds.StudyDate def test_explicit_vr_expected_implicit_used_strict(self, enforce_valid_values): msg = "Expected explicit VR, but found implicit VR" with pytest.raises(InvalidDicomError, match=msg): read_dataset(self.ds_implicit, is_implicit_VR=False, is_little_endian=True) def test_seq_item_looks_like_explicit_VR(self): # For issue 999. # Set up an implicit VR dataset with a "normal" group 8 tag, # followed by a sequence with an item (dataset) having # a data element length that looks like a potential valid VR ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.MediaStorageSOPClassUID = "1.1.1" ds.file_meta.MediaStorageSOPInstanceUID = "2.2.2" ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.SOPClassUID = "9.9.9" # First item group 8 in top-level dataset seq = Sequence() seq_ds = Dataset() seq_ds.BadPixelImage = b"\3" * 0x5244 # length looks like "DR" seq.append(seq_ds) ds.ReferencedImageSequence = seq dbio = DicomBytesIO() ds.save_as(dbio, enforce_file_format=True) # Now read the constructed dataset back in # In original issue, shows warning that has detected what appears # to be Explicit VR, then throws NotImplemented for the unknown VR dbio.seek(0) ds = dcmread(dbio) ds.remove_private_tags() # forces it to actually parse SQ @pytest.fixture def enable_debugging(): original_debug = config.debugging config.debugging = True yield config.debugging = original_debug @pytest.fixture def enable_debugging_and_implicit(): original_debug = config.debugging original_switch = config.assume_implicit_vr_switch config.debugging = True config.assume_implicit_vr_switch = True yield config.debugging = original_debug config.assume_implicit_vr_switch = original_switch class TestUnknownVR: @pytest.fixture(autouse=True) def restore_config_values(self): orig_impl_VR_switch = config.assume_implicit_vr_switch config.assume_implicit_vr_switch = False yield config.assume_implicit_vr_switch = orig_impl_VR_switch @pytest.mark.parametrize( "vr_bytes, str_output", [ # Test limits of char values (b"\x00\x41", "0x00 0x41"), # 000/A (b"\x40\x41", "0x40 0x41"), # 064/A (b"\x5B\x41", "0x5b 0x41"), # 091/A (b"\x60\x41", "0x60 0x41"), # 096/A (b"\x7B\x41", "0x7b 0x41"), # 123/A (b"\xFF\x41", "0xff 0x41"), # 255/A # Test good/bad (b"\x41\x00", "0x41 0x00"), # A/- (b"\x5A\x00", "0x5a 0x00"), # Z/- # Test not quite good/bad (b"\x61\x00", "0x61 0x00"), # a/- (b"\x7A\x00", "0x7a 0x00"), # z/- # Test bad/good (b"\x00\x41", "0x00 0x41"), # -/A (b"\x00\x5A", "0x00 0x5a"), # -/Z # Test bad/not quite good (b"\x00\x61", "0x00 0x61"), # -/a (b"\x00\x7A", "0x00 0x7a"), # -/z # Test good/good (b"\x41\x41", "AA"), # A/A (b"\x41\x5A", "AZ"), # A/Z (b"\x5A\x41", "ZA"), # Z/A (b"\x5A\x5A", "ZZ"), # Z/Z # Test not quite good (b"\x41\x61", "Aa"), # A/a (b"\x41\x7A", "Az"), # A/z (b"\x61\x41", "aA"), # a/A (b"\x61\x5A", "aZ"), # a/Z (b"\x61\x61", "aa"), # a/a (b"\x61\x7A", "az"), # a/z (b"\x5A\x61", "Za"), # Z/a (b"\x5A\x7A", "Zz"), # Z/z (b"\x7A\x41", "zA"), # z/A (b"\x7A\x5A", "zZ"), # z/Z (b"\x7A\x61", "za"), # z/a (b"\x7A\x7A", "zz"), # z/z ], ) def test_fail_decode_msg(self, vr_bytes, str_output): """Regression test for #791.""" # start the dataset with a valid tag (SpecificCharacterSet), # as the first tag is used to check the VR ds = read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00" + vr_bytes + b"\x00\x00\x00\x08\x00\x49" ), False, True, ) msg = r"Unknown Value Representation '{}' in tag \(0008,0006\)" msg = msg.format(str_output) with pytest.raises(NotImplementedError, match=msg): print(ds) def test_unknown_explicit(self, enable_debugging, caplog): with caplog.at_level(logging.WARNING, logger="pydicom"): read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00XX\x00\x00\x00\x08\x00\x49" ), False, True, ) assert ( "Unknown VR 'XX' assuming explicit VR encoding with 2-byte length" ) in caplog.text def test_unknown_implicit(self, enable_debugging_and_implicit, caplog): with caplog.at_level(logging.WARNING, logger="pydicom"): read_dataset( BytesIO( b"\x08\x00\x05\x00CS\x0a\x00ISO_IR 100" b"\x08\x00\x06\x00xx\x00\x00\x00\x08\x00\x49" ), False, True, ) assert "Unknown VR '0x7878' assuming implicit VR encoding" in caplog.text class TestReadDataElement: def setup_method(self): ds = Dataset() ds.DoubleFloatPixelData = ( b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03\x04\x05\x06\x07" # OD ) ds.SelectorOLValue = ( b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03" # VR of OL ) ds.PotentialReasonsForProcedure = [ "A", "B", "C", ] # VR of UC, odd length ds.StrainDescription = "Test" # Even length ds.URNCodeValue = "http://test.com" # VR of UR ds.RetrieveURL = "ftp://test.com " # Test trailing spaces ignored ds.DestinationAE = " TEST 12 " # 16 characters max for AE # 8-byte values ds.ExtendedOffsetTable = ( # VR of OV b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" ) # No public elements with VR of SV or UV yet... add_dict_entries( { 0xFFFE0001: ( "SV", "1", "SV Element Minimum", "", "SVElementMinimum", ), 0xFFFE0002: ( "SV", "1", "SV Element Maximum", "", "SVElementMaximum", ), 0xFFFE0003: ( "UV", "1", "UV Element Minimum", "", "UVElementMinimum", ), 0xFFFE0004: ( "UV", "1", "UV Element Maximum", "", "UVElementMaximum", ), } ) ds.SVElementMinimum = -(2**63) ds.SVElementMaximum = 2**63 - 1 ds.UVElementMinimum = 0 ds.UVElementMaximum = 2**64 - 1 self.fp = BytesIO() # Implicit little file_ds = FileDataset(self.fp, ds) file_ds.save_as(self.fp, implicit_vr=True) self.fp_ex = BytesIO() # Explicit little file_ds = FileDataset(self.fp_ex, ds) file_ds.save_as(self.fp_ex, implicit_vr=False) def test_read_OD_implicit_little(self): """Check creation of OD DataElement from byte data works correctly.""" ds = dcmread(self.fp, force=True) ref_elem = ds.get(0x7FE00009) elem = DataElement( 0x7FE00009, "OD", b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03\x04\x05\x06\x07", ) assert ref_elem == elem def test_read_OD_explicit_little(self): """Check creation of OD DataElement from byte data works correctly.""" ds = dcmread(self.fp_ex, force=True) ref_elem = ds.get(0x7FE00009) elem = DataElement( 0x7FE00009, "OD", b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03\x04\x05\x06\x07", ) assert ref_elem == elem def test_read_OL_implicit_little(self): """Check creation of OL DataElement from byte data works correctly.""" ds = dcmread(self.fp, force=True) ref_elem = ds.get(0x00720075) elem = DataElement( 0x00720075, "OL", b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03", ) assert ref_elem == elem def test_read_OL_explicit_little(self): """Check creation of OL DataElement from byte data works correctly.""" ds = dcmread(self.fp_ex, force=True) ref_elem = ds.get(0x00720075) elem = DataElement( 0x00720075, "OL", b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03", ) assert ref_elem == elem def test_read_UC_implicit_little(self): """Check creation of DataElement from byte data works correctly.""" ds = dcmread(self.fp, force=True) ref_elem = ds.get(0x00189908) elem = DataElement(0x00189908, "UC", ["A", "B", "C"]) assert ref_elem == elem ds = dcmread(self.fp, force=True) ref_elem = ds.get(0x00100212) elem = DataElement(0x00100212, "UC", "Test") assert ref_elem == elem def test_read_UC_explicit_little(self): """Check creation of DataElement from byte data works correctly.""" ds = dcmread(self.fp_ex, force=True) ref_elem = ds.get(0x00189908) elem = DataElement(0x00189908, "UC", ["A", "B", "C"]) assert ref_elem == elem ds = dcmread(self.fp_ex, force=True) ref_elem = ds.get(0x00100212) elem = DataElement(0x00100212, "UC", "Test") assert ref_elem == elem def test_read_UR_implicit_little(self): """Check creation of DataElement from byte data works correctly.""" ds = dcmread(self.fp, force=True) ref_elem = ds.get(0x00080120) # URNCodeValue elem = DataElement(0x00080120, "UR", "http://test.com") assert ref_elem == elem # Test trailing spaces ignored ref_elem = ds.get(0x00081190) # RetrieveURL elem = DataElement(0x00081190, "UR", "ftp://test.com") assert ref_elem == elem def test_read_UR_explicit_little(self): """Check creation of DataElement from byte data works correctly.""" ds = dcmread(self.fp_ex, force=True) ref_elem = ds.get(0x00080120) # URNCodeValue elem = DataElement(0x00080120, "UR", "http://test.com") assert ref_elem == elem # Test trailing spaces ignored ref_elem = ds.get(0x00081190) # RetrieveURL elem = DataElement(0x00081190, "UR", "ftp://test.com") assert ref_elem == elem def test_read_AE(self): """Check creation of AE DataElement from byte data works correctly.""" ds = dcmread(self.fp, force=True) assert "TEST 12" == ds.DestinationAE # Test multivalue read correctly ds.DestinationAE = ["TEST 12 ", " TEST2", " TEST 3 "] fp = BytesIO() ds.save_as(fp) fp.seek(0) ds = dcmread(fp, force=True) assert ["TEST 12", "TEST2", "TEST 3"] == ds.DestinationAE def test_read_OV_implicit_little(self): """Check reading element with VR of OV encoded as implicit""" ds = dcmread(self.fp, force=True) val = b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" elem = ds["ExtendedOffsetTable"] assert "OV" == elem.VR assert 0x7FE00001 == elem.tag assert val == elem.value new = DataElement(0x7FE00001, "OV", val) assert elem == new def test_read_OV_explicit_little(self): """Check reading element with VR of OV encoded as explicit""" ds = dcmread(self.fp_ex, force=True) val = b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" elem = ds["ExtendedOffsetTable"] assert "OV" == elem.VR assert 0x7FE00001 == elem.tag assert val == elem.value new = DataElement(0x7FE00001, "OV", val) assert elem == new def test_read_SV_implicit_little(self): """Check reading element with VR of SV encoded as implicit""" ds = dcmread(self.fp, force=True) elem = ds["SVElementMinimum"] assert "SV" == elem.VR assert 0xFFFE0001 == elem.tag assert -(2**63) == elem.value new = DataElement(0xFFFE0001, "SV", -(2**63)) assert elem == new elem = ds["SVElementMaximum"] assert "SV" == elem.VR assert 0xFFFE0002 == elem.tag assert 2**63 - 1 == elem.value new = DataElement(0xFFFE0002, "SV", 2**63 - 1) assert elem == new def test_read_SV_explicit_little(self): """Check reading element with VR of SV encoded as explicit""" ds = dcmread(self.fp_ex, force=True) elem = ds["SVElementMinimum"] assert "SV" == elem.VR assert 0xFFFE0001 == elem.tag assert -(2**63) == elem.value new = DataElement(0xFFFE0001, "SV", -(2**63)) assert elem == new elem = ds["SVElementMaximum"] assert "SV" == elem.VR assert 0xFFFE0002 == elem.tag assert 2**63 - 1 == elem.value new = DataElement(0xFFFE0002, "SV", 2**63 - 1) assert elem == new def test_read_UV_implicit_little(self): """Check reading element with VR of UV encoded as implicit""" ds = dcmread(self.fp, force=True) elem = ds["UVElementMinimum"] assert "UV" == elem.VR assert 0xFFFE0003 == elem.tag assert 0 == elem.value new = DataElement(0xFFFE0003, "UV", 0) assert elem == new elem = ds["UVElementMaximum"] assert "UV" == elem.VR assert 0xFFFE0004 == elem.tag assert 2**64 - 1 == elem.value new = DataElement(0xFFFE0004, "UV", 2**64 - 1) assert elem == new def test_read_UV_explicit_little(self): """Check reading element with VR of UV encoded as explicit""" ds = dcmread(self.fp_ex, force=True) elem = ds["UVElementMinimum"] assert "UV" == elem.VR assert 0xFFFE0003 == elem.tag assert 0 == elem.value new = DataElement(0xFFFE0003, "UV", 0) assert elem == new elem = ds["UVElementMaximum"] assert "UV" == elem.VR assert 0xFFFE0004 == elem.tag assert 2**64 - 1 == elem.value new = DataElement(0xFFFE0004, "UV", 2**64 - 1) assert elem == new class TestDSISnumpy: @pytest.fixture(autouse=True) def restore_config_values(self): orig_IS_numpy = config.use_IS_numpy orig_DS_numpy = config.use_DS_numpy orig_DS_decimal = config.use_DS_decimal yield config.use_IS_numpy = orig_IS_numpy config.DS_decimal(orig_DS_decimal) config.DS_numpy(orig_DS_numpy) @pytest.mark.skipif(have_numpy, reason="Testing import error") def test_IS_numpy_import_error(self): config.use_IS_numpy = True rtss = dcmread(rtstruct_name, force=True) # no numpy, then trying to use numpy raises error with pytest.raises(ImportError): rtss.ROIContourSequence[0].ROIDisplayColor # VR is IS @pytest.mark.skipif(not have_numpy, reason="Testing with numpy only") def test_IS_numpy_class(self): config.use_IS_numpy = True rtss = dcmread(rtstruct_name, force=True) col = rtss.ROIContourSequence[0].ROIDisplayColor # VR is IS assert isinstance(col, numpy.ndarray) assert "int64" == col.dtype # Check a conversion with only a single value roi_num = rtss.ROIContourSequence[0].ReferencedROINumber assert isinstance(roi_num, numpy.int64) def test_IS_not_numpy(self): """Test class of the object matches the config, when the config is changed""" config.use_IS_numpy = False rtss = dcmread(rtstruct_name, force=True) col = rtss.ROIContourSequence[0].ROIDisplayColor # VR is IS assert isinstance(col, MultiValue) @pytest.mark.skipif(have_numpy, reason="Testing import error") def test_DS_numpy_import_error(self): config.use_DS_numpy = True rtss = dcmread(rtstruct_name, force=True) # no numpy, then trying to use numpy raises error with pytest.raises(ImportError): rtss.ROIContourSequence[0].ContourSequence[0].ContourData @pytest.mark.skipif(not have_numpy, reason="Testing with numpy only") def test_DS_numpy_class(self): config.use_DS_numpy = True rtss = dcmread(rtstruct_name, force=True) # ContourData has VR of DS cd = rtss.ROIContourSequence[0].ContourSequence[0].ContourData assert isinstance(cd, numpy.ndarray) assert "float64" == cd.dtype # Check conversion with only a single value roi_vol = rtss.StructureSetROISequence[0].ROIVolume assert isinstance(roi_vol, numpy.float64) def test_DS_not_numpy(self): """Test class of the object matches the config.""" config.use_DS_numpy = False rtss = dcmread(rtstruct_name, force=True) # ContourData has VR of DS cd = rtss.ROIContourSequence[0].ContourSequence[0].ContourData assert isinstance(cd, MultiValue) @pytest.mark.skipif(not have_numpy, reason="numpy not installed") def test_DS_conflict_config(self): config.DS_numpy(False) config.DS_decimal(True) with pytest.raises(ValueError): config.DS_numpy(True) @pytest.mark.skipif(not have_numpy, reason="numpy not installed") def test_DS_conflict_config2(self): config.DS_numpy(True) with pytest.raises(ValueError): config.DS_decimal(True) @pytest.mark.skipif(not have_numpy, reason="numpy not installed") def test_DS_bad_chars(self): config.DS_numpy(True) with pytest.raises(ValueError): values.convert_DS_string(b"123.1b", True) @pytest.mark.skipif(not have_numpy, reason="numpy not installed") def test_IS_bad_chars(self): config.use_IS_numpy = True with pytest.raises(ValueError): values.convert_IS_string(b"123b", True) @pytest.mark.skipif(have_numpy, reason="testing numpy ImportError") def test_numpy_import_warning(self): config.DS_numpy(True) config.use_IS_numpy = True with pytest.raises(ImportError): values.convert_DS_string(b"123.1", True) with pytest.raises(ImportError): values.convert_IS_string(b"123", True) class TestDeferredRead: """Test that deferred data element reading (for large size) works as expected """ # Copy one of test files and use temporarily, then later remove. def setup_method(self): self.testfile_name = ct_name + ".tmp" shutil.copyfile(ct_name, self.testfile_name) def teardown_method(self): if os.path.exists(self.testfile_name): os.remove(self.testfile_name) def test_time_check(self): """Deferred read warns if file has been modified""" ds = dcmread(self.testfile_name, defer_size="2 kB") from time import sleep sleep(0.1) with open(self.testfile_name, "r+") as f: f.write("\0") # "touch" the file msg = r"Deferred read warning -- file modification time has changed" with pytest.warns(UserWarning, match=msg): ds.PixelData def test_file_exists(self): """Deferred read raises error if file no longer exists.""" ds = dcmread(self.testfile_name, defer_size=2000) os.remove(self.testfile_name) with pytest.raises(OSError): ds.PixelData def test_values_identical(self, enable_debugging, caplog): """Deferred values exactly matches normal read.""" ds_norm = dcmread(self.testfile_name) with caplog.at_level(logging.DEBUG, logger="pydicom"): ds_defer = dcmread(self.testfile_name, defer_size=2000) for data_elem in ds_norm: tag = data_elem.tag if have_numpy and isinstance(data_elem.value, numpy.ndarray): assert numpy.allclose(data_elem.value, ds_defer[tag].value) else: assert data_elem.value == ds_defer[tag].value assert ( "Defer size exceeded. Skipping forward to next data element." ) in caplog.text def test_zipped_deferred(self): """Deferred values from a gzipped file works.""" # Arose from issue 103 "Error for defer_size read of gzip file object" fobj = gzip.open(gzip_name) ds = dcmread(fobj, defer_size=1) fobj.close() # before the fix, this threw an error as file reading was not in # the right place, it was re-opened as a normal file, not a zip file ds.InstanceNumber def test_filelike_deferred(self): """Deferred values work with file-like objects.""" f = open(ct_name, "rb") dataset = pydicom.dcmread(f, defer_size=1024) assert 32768 == len(dataset.PixelData) # The 'Histogram tables' private data element is also > 1024 bytes so # pluck this out to confirm multiple deferred reads work (#1609). private_block = dataset.private_block(0x43, "GEMS_PARM_01") assert 2068 == len(private_block[0x29].value) f.close() def test_buffer_deferred(self): """Deferred values work with buffer-like objects.""" with open(ct_name, "rb") as fp: data = fp.read() filelike = io.BytesIO(data) dataset = pydicom.dcmread(filelike, defer_size=1024) assert 32768 == len(dataset.PixelData) # The 'Histogram tables' private data element is also > 1024 bytes so # pluck this out to confirm multiple deferred reads work (#1609). private_block = dataset.private_block(0x43, "GEMS_PARM_01") assert 2068 == len(private_block[0x29].value) def test_named_buffer_deferred(self): """Deferred values work with file-like objects.""" path = get_testdata_file("image_dfl.dcm") ds = pydicom.dcmread(path, defer_size=1024) assert isinstance(ds.buffer, DicomBytesIO) assert 262144 == len(ds.PixelData) class TestReadTruncatedFile: def testReadFileWithMissingPixelData(self): mr = dcmread(truncated_mr_name) mr.decode() assert "CompressedSamples^MR1" == mr.PatientName assert mr.PatientName == mr[0x10, 0x10].value DS = pydicom.valuerep.DS if have_numpy and config.use_DS_numpy: expected = numpy.array([0.3125, 0.3125]) assert numpy.allclose(mr.PixelSpacing, expected) else: assert [DS("0.3125"), DS("0.3125")] == mr.PixelSpacing @pytest.mark.skipif( not have_numpy or have_gdcm_handler, reason="Missing numpy or GDCM present", ) def testReadFileWithMissingPixelDataArray(self): mr = dcmread(truncated_mr_name) mr.decode() # Need to escape brackets msg = ( r"The number of bytes of pixel data is less than expected \(8130 vs 8192 " r"bytes\) - the dataset may be corrupted, have an invalid group 0028 " "element value, or the transfer syntax may be incorrect" ) with pytest.raises(ValueError, match=msg): mr.pixel_array class TestFileLike: """Test that can read DICOM files with file-like object rather than filename """ def test_read_file_given_file_object(self): """filereader: can read using already opened file............""" f = open(ct_name, "rb") ct = dcmread(f) # XXX Tests here simply repeat testCT -- perhaps should collapse # the code together? DS = pydicom.valuerep.DS got = ct.ImagePositionPatient if have_numpy and config.use_DS_numpy: expected = numpy.array([-158.135803, -179.035797, -75.699997]) assert numpy.allclose(got, expected) else: expected = [DS("-158.135803"), DS("-179.035797"), DS("-75.699997")] assert expected == got assert "1.3.6.1.4.1.5962.2" == ct.file_meta.ImplementationClassUID value = ct.file_meta[0x2, 0x12].value assert ct.file_meta.ImplementationClassUID == value assert 128 == ct.Rows assert 128 == ct.Columns assert 16 == ct.BitsStored assert 128 * 128 * 2 == len(ct.PixelData) # Should also be able to close the file ourselves without # exception raised: f.close() def test_read_file_given_file_like_object(self): """filereader: can read using a file-like (BytesIO) file....""" with open(ct_name, "rb") as f: file_like = BytesIO(f.read()) ct = dcmread(file_like) # Tests here simply repeat some of testCT test got = ct.ImagePositionPatient DS = pydicom.valuerep.DS if have_numpy and config.use_DS_numpy: expected = numpy.array([-158.135803, -179.035797, -75.699997]) assert numpy.allclose(got, expected) else: expected = [DS("-158.135803"), DS("-179.035797"), DS("-75.699997")] assert expected == got assert 128 * 128 * 2 == len(ct.PixelData) # Should also be able to close the file ourselves without # exception raised: file_like.close() class TestDataElementGenerator: """Test filereader.data_element_generator""" def test_little_endian_explicit(self): """Test reading little endian explicit VR data""" # (0010,0010) PatientName PN 6 ABCDEF bytestream = b"\x10\x00\x10\x00PN\x06\x00ABCDEF" fp = BytesIO(bytestream) # fp, is_implicit_VR, is_little_endian, gen = data_element_generator(fp, False, True) elem = DataElement(0x00100010, "PN", "ABCDEF") assert elem == convert_raw_data_element(next(gen), encoding="ISO_IR 100") def test_little_endian_implicit(self): """Test reading little endian implicit VR data""" # (0010,0010) PatientName PN 6 ABCDEF bytestream = b"\x10\x00\x10\x00\x06\x00\x00\x00ABCDEF" fp = BytesIO(bytestream) gen = data_element_generator(fp, is_implicit_VR=True, is_little_endian=True) elem = DataElement(0x00100010, "PN", "ABCDEF") assert elem == convert_raw_data_element(next(gen), encoding="ISO_IR 100") def test_big_endian_explicit(self): """Test reading big endian explicit VR data""" # (0010,0010) PatientName PN 6 ABCDEF bytestream = b"\x00\x10\x00\x10PN\x00\x06ABCDEF" fp = BytesIO(bytestream) # fp, is_implicit_VR, is_little_endian, gen = data_element_generator(fp, False, False) elem = DataElement(0x00100010, "PN", "ABCDEF") assert elem == convert_raw_data_element(next(gen), encoding="ISO_IR 100") def test_read_file_meta_info(): """Test read_file_meta_info()""" ds = read_file_meta_info(rtplan_name) assert len(ds) == 6 assert isinstance(ds, FileMetaDataset) assert ds.TransferSyntaxUID == ImplicitVRLittleEndian pydicom-pydicom-20aa4b7/tests/test_fileset.py000066400000000000000000003206361515706620200214460ustar00rootroot00000000000000import os import platform import sys from pathlib import Path import shutil from tempfile import TemporaryDirectory import pytest from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.dataset import Dataset, FileMetaDataset from pydicom.filebase import DicomBytesIO, DicomFileLike from pydicom.fileset import ( FileSet, FileInstance, RecordNode, is_conformant_file_id, generate_filename, _define_patient, _define_study, _define_series, _define_image, _PREFIXES, ) from pydicom.filewriter import write_dataset from pydicom.tag import Tag from pydicom.uid import ( ExplicitVRLittleEndian, generate_uid, ImplicitVRLittleEndian, MediaStorageDirectoryStorage, ComputedRadiographyImageStorage, CTImageStorage, RTBeamsTreatmentRecordStorage, RTPlanStorage, GrayscaleSoftcopyPresentationStateStorage, BasicTextSRStorage, KeyObjectSelectionDocumentStorage, MRSpectroscopyStorage, HangingProtocolStorage, EncapsulatedPDFStorage, ColorPaletteStorage, GenericImplantTemplateStorage, ImplantAssemblyTemplateStorage, ImplantTemplateGroupStorage, TwelveLeadECGWaveformStorage, RawDataStorage, SpatialRegistrationStorage, SpatialFiducialsStorage, RealWorldValueMappingStorage, StereometricRelationshipStorage, LensometryMeasurementsStorage, SurfaceSegmentationStorage, TractographyResultsStorage, SurfaceScanMeshStorage, RTDoseStorage, ContentAssessmentResultsStorage, RTStructureSetStorage, RTBeamsDeliveryInstructionStorage, CArmPhotonElectronRadiationStorage, ) TEST_FILE = get_testdata_file("DICOMDIR") TINY_ALPHA_FILESET = get_testdata_file("TINY_ALPHA/DICOMDIR") IMPLICIT_TEST_FILE = get_testdata_file("DICOMDIR-implicit") BIGENDIAN_TEST_FILE = get_testdata_file("DICOMDIR-bigEnd") @pytest.fixture def tiny(): """Return the tiny alphanumeric File-set.""" return dcmread(TINY_ALPHA_FILESET) @pytest.fixture def dicomdir(): """Return the DICOMDIR dataset.""" return dcmread(TEST_FILE) @pytest.fixture def dicomdir_copy(): """Copy the File-set to a temporary directory and return its DICOMDIR.""" t = TemporaryDirectory() src = Path(TEST_FILE).parent dst = Path(t.name) shutil.copyfile(src / "DICOMDIR", dst / "DICOMDIR") shutil.copytree(src / "77654033", dst / "77654033") shutil.copytree(src / "98892003", dst / "98892003") shutil.copytree(src / "98892001", dst / "98892001") return t, dcmread(dst / "DICOMDIR") @pytest.fixture def ct(): """Return a DICOMDIR dataset.""" return dcmread(get_testdata_file("CT_small.dcm")) @pytest.fixture def tdir(): """Return a TemporaryDirectory instance.""" return TemporaryDirectory() FILESET_ROOT = "/path/to/fileset/" ABS_FILE_PATH = "/secret.txt" SYMLINK_TO_ABS_FILE = "Pat1/St1/Im2" SYMLINK_TO_ABS_DIR = "Pat1/St2" DOT_DOT_FILE = "../goback.txt" ABS_FILE_CONTENTS = "Top Secret file contents" COPY_PATH = "/path/to/copied/" @pytest.fixture( params=[ ABS_FILE_PATH, DOT_DOT_FILE, SYMLINK_TO_ABS_FILE, SYMLINK_TO_ABS_DIR + ABS_FILE_PATH, ] ) def fileset_fs(request, fs, ignore_reading_invalid_values): """Create an in-memory file system with pyfakefs and test DICOMDIRs""" # Simplified version of submitted report from JeongAhn Jang, in pyfakefs orig_dicomdir_root = Path(TEST_FILE).parent dicomdir_root = Path(FILESET_ROOT) fs.add_real_file( orig_dicomdir_root / "77654033/CR1/6154", target_path=dicomdir_root / "Pat1/St1/Im1", ) fs.create_file(ABS_FILE_PATH, contents=ABS_FILE_CONTENTS) fs.create_dir(COPY_PATH) fs.create_symlink(dicomdir_root / SYMLINK_TO_ABS_FILE, ABS_FILE_PATH) fs.create_symlink(dicomdir_root / SYMLINK_TO_ABS_DIR, "/") # MAKE DICOMDIR for this simplified file-set fset = FileSet() fset.add(dicomdir_root / "Pat1/St1/Im1") fset.write(dicomdir_root) # Create bad DICOMDIR2 file from the simplified one # Modify first referenced file fset = FileSet(dicomdir_root / "DICOMDIR") record = next( rec for rec in fset._ds.DirectoryRecordSequence if "ReferencedFileID" in rec ) record.ReferencedFileID = request.param # Write modified DICOMDIR file with open(dicomdir_root / "DICOMDIR2", "wb") as fp: fset._write_dicomdir(DicomFileLike(fp)) yield fs @pytest.fixture def custom_leaf(): """Return the leaf node from a custom 4-level record hierarchy""" ct = dcmread(get_testdata_file("CT_small.dcm")) patient = _define_patient(ct) study = _define_study(ct) series = _define_series(ct) image = _define_image(ct) for ii, record in enumerate([patient, study, series, image]): rtypes = ["PATIENT", "STUDY", "SERIES", "IMAGE"] record.DirectoryRecordType = rtypes[ii] record.OffsetOfTheNextDirectoryRecord = 0 record.RecordInUseFlag = 0xFFFF record.OffsetOfReferencedLowerLevelDirectoryEntity = 0 patient = RecordNode(patient) study = RecordNode(study) series = RecordNode(series) image.ReferencedFileID = None image.ReferencedSOPClassUIDInFile = ct.SOPClassUID image.ReferencedSOPInstanceUIDInFile = ct.SOPInstanceUID image.ReferencedTransferSyntaxUIDInFile = ct.file_meta.TransferSyntaxUID image = RecordNode(image) image.parent = series series.parent = study study.parent = patient return image @pytest.fixture def private(dicomdir, request, ignore_reading_invalid_values): """Return a DICOMDIR dataset with PRIVATE records.""" def write_record(ds): """Return `ds` as explicit little encoded bytes.""" fp = DicomBytesIO() fp.is_implicit_VR = False fp.is_little_endian = True write_dataset(fp, ds) return fp.getvalue() def private_record(): record = Dataset() record.OffsetOfReferencedLowerLevelDirectoryEntity = 0 record.RecordInUseFlag = 65535 record.OffsetOfTheNextDirectoryRecord = 0 record.DirectoryRecordType = "PRIVATE" record.PrivateRecordUID = generate_uid() return record ds = dicomdir top = private_record() middle = private_record() bottom = private_record() bottom.ReferencedSOPClassUIDInFile = "1.2.3.4" if hasattr(request, "param"): file_ids = request.param else: file_ids = [ "TINY_ALPHA", "PT000000", "ST000000", "SE000000", "IM000000", ] bottom.ReferencedFileID = file_ids bottom.ReferencedSOPInstanceUIDInFile = ( "1.2.276.0.7230010.3.1.4.0.31906.1359940846.78187" ) bottom.ReferencedTransferSyntaxUIDInFile = ExplicitVRLittleEndian len_top = len(write_record(top)) # 112 len_middle = len(write_record(middle)) # 112 len(write_record(bottom)) # 238 len_last = len(write_record(ds.DirectoryRecordSequence[-1])) # 248 records = {} for item in ds.DirectoryRecordSequence: records[item.seq_item_tell] = item # Top PRIVATE # Offset to the top PRIVATE - 10860 + 248 + 8 offset = ds.DirectoryRecordSequence[-1].seq_item_tell + len_last + 8 # Change the last top-level record to point at the top PRIVATE # Original is 3126 last = ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity record = records[last] record.OffsetOfTheNextDirectoryRecord = offset # Change the last record offset ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity = offset top.seq_item_tell = offset # Offset to the middle PRIVATE offset += len_top + 8 top.OffsetOfReferencedLowerLevelDirectoryEntity = offset ds.DirectoryRecordSequence.append(top) middle.seq_item_tell = offset # Middle PRIVATE # Offset to the bottom PRIVATE offset += len_middle + 8 middle.OffsetOfReferencedLowerLevelDirectoryEntity = offset ds.DirectoryRecordSequence.append(middle) # Bottom PRIVATE ds.DirectoryRecordSequence.append(bottom) bottom.seq_item_tell = offset return ds @pytest.fixture def dummy(): """Return a dummy dataset used for testing the record creators""" ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.PatientID = "12345678" ds.PatientName = "Citizen^Jan" ds.StudyDate = "20201001" ds.StudyTime = "120000" ds.StudyID = "1" ds.StudyInstanceUID = "1.2.3" ds.SeriesInstanceUID = "1.2.3.4" ds.SeriesNumber = "1" ds.SOPInstanceUID = "1.2.3.4.5" ds.InstanceNumber = "1" ds.ContentDate = "20201002" ds.ContentTime = "120100" ds.ContentLabel = "CONTENT LABEL" ds.ContentDescription = "Content description" ds.ContentCreatorName = "Content^Creator^Name" ds.TreatmentDate = "20201003" ds.TreatmentTime = "120200" ds.PresentationCreationDate = "20201004" ds.PresentationCreationTime = "120300" ds.InstanceCreationDate = "20200105" ds.InstanceCreationTime = "120400" ds.CompletionFlag = "COMPLETE" ds.VerificationFlag = "VERIFIED" ds.ConceptNameCodeSequence = [Dataset()] ds.ImageType = "ADDITION" ds.NumberOfFrames = 7 ds.Rows = 10 ds.Columns = 11 ds.DataPointRows = 12 ds.DataPointColumns = 13 ds.HangingProtocolCreator = "HP Creator" ds.HangingProtocolCreationDateTime = "20201001120000" ds.HangingProtocolDefinitionSequence = [Dataset()] ds.NumberOfPriorsReferenced = 2 ds.HangingProtocolUserIdentificationCodeSequence = [Dataset()] ds.DocumentTitle = "Document title" ds.MIMETypeOfEncapsulatedDocument = "PDF" ds.Manufacturer = "Implant manufacturer" ds.ImplantName = "Implant name" ds.ImplantPartNumber = "PN01" ds.ImplantAssemblyTemplateName = "Template name" ds.ProcedureTypeCodeSequence = [Dataset()] ds.ImplantTemplateGroupName = "Group name" ds.ImplantTemplateGroupIssuer = "Group issuer" ds.RTPlanDate = "20201006" ds.RTPlanTime = "120600" ds.DoseSummationType = "PLAN" ds.StructureSetLabel = "Struct set label" ds.StructureSetDate = "20201007" ds.StructureSetTime = "120700" # To be customised ds.Modality = "CT" # PLAN, STSEGANN ds.SOPClassUID = CTImageStorage # To be added # ds.EncapsulatedDocument = None # ds.RTPlanLabel = None # 1C elements opt = Dataset() opt.SpecificCharacterSet = "ISO_IR 100" opt.BlendingSequence = [Dataset()] opt.ReferencedSeriesSequence = [Dataset()] opt.VerificationDateTime = "20201001120000" opt.ContentSequence = [Dataset()] opt.ReferencedImageEvidenceSequence = [Dataset()] opt.HL7InstanceIdentifier = "HL7 identifier" opt.ImplantSize = "13.4x12.5" opt.UserContentLabel = "Content label" opt.UserContentLongLabel = "Content long label" return ds, opt def write_fs(fs, path=None): """Call FileSet.write(path). Returns ------- pydicom.dataset.Dataset The resulting DICOMDIR dataset list of PathLike A list of paths for the non-DICOMDIR files in the File-set. """ fs.write(path) path = Path(fs.path) paths = [p for p in path.glob("**/*") if p.is_file() and p.name != "DICOMDIR"] return dcmread(path / "DICOMDIR"), sorted(paths) def copy_fs(fs, path, as_implicit=False): """Call FileSet.copy(path). Returns ------- pydicom.fileset.FileSet The new FileSet, pydicom.dataset.Dataset The new File-set's DICOMDIR dataset list of PathLike A list of paths for the non-DICOMDIR files in the new File-set. """ path = Path(path) fs = fs.copy(path, force_implicit=as_implicit) paths = [p for p in path.glob("**/*") if p.is_file() and p.name != "DICOMDIR"] return fs, dcmread(path / "DICOMDIR"), sorted(paths) def temporary_fs(ds): """Copy a File-set to a temporary directory.""" t = TemporaryDirectory() src = Path(ds.filename).parent dst = Path(t.name) shutil.copyfile(src / "DICOMDIR", dst / "DICOMDIR") for d in src.glob("*"): if d.is_dir(): shutil.copytree(d, dst / d.name) return t, dcmread(dst / "DICOMDIR") def test_is_conformant_file_id(): """Test conformant and non-conformant File ID paths""" bad = [ "aBCDEF123", "aBCD1234", "ABCD!", "1234)", " ", "1/2/3/4/5/6/7/8/9", "لنزار", "ABCD.DCM", "123 ABCD", ] for p in bad: assert not is_conformant_file_id(Path(p)) good = [ "ACBDEFGH", "12345678", "1/2/3/4/5/6/7/8", "0", "9", "A", "Z", "ABCD1234", "1234ABCD", "_", "_ABCD", "ABCD_", "AB_CD", "________", "A_______", "_______1", ] for p in good: assert is_conformant_file_id(Path(p)) def test_prefixes(): """Test that the file ID prefixes are unique.""" prefixes = set(_PREFIXES.values()) assert len(_PREFIXES) == len(prefixes) class TestGenerateFilename: """Tests for generate_filename().""" def test_numeric(self): """Test generating numeric suffixes.""" gen = generate_filename(start=0, alphanumeric=False) assert "00000000" == next(gen) assert "00000001" == next(gen) assert "00000002" == next(gen) assert "00000003" == next(gen) assert "00000004" == next(gen) assert "00000005" == next(gen) assert "00000006" == next(gen) assert "00000007" == next(gen) assert "00000008" == next(gen) assert "00000009" == next(gen) assert "00000010" == next(gen) def test_numeric_prefix(self): """Test prefix for numeric filenames.""" for ii in range(1, 8): prefix = "A" * ii gen = generate_filename(prefix="A" * ii, start=0, alphanumeric=False) assert prefix + "0" * (8 - ii) == next(gen) def test_numeric_start(self): """Test start point with numeric suffixes.""" gen = generate_filename(start=10, alphanumeric=False) assert "00000010" == next(gen) assert "00000011" == next(gen) assert "00000012" == next(gen) def test_alphanumeric(self): """Test generating alphanumeric suffixes.""" gen = generate_filename(start=0, alphanumeric=True) assert "00000000" == next(gen) assert "00000001" == next(gen) assert "00000002" == next(gen) assert "00000003" == next(gen) assert "00000004" == next(gen) assert "00000005" == next(gen) assert "00000006" == next(gen) assert "00000007" == next(gen) assert "00000008" == next(gen) assert "00000009" == next(gen) assert "0000000A" == next(gen) for ii in range(23): next(gen) assert "0000000Z" == next(gen) assert "00000010" == next(gen) def test_alphanumeric_prefix(self): """Test length of the suffixes.""" for ii in range(1, 8): prefix = "A" * ii gen = generate_filename(prefix="A" * ii, start=0, alphanumeric=True) assert prefix + "0" * (8 - ii) == next(gen) assert prefix + "0" * (7 - ii) + "1" == next(gen) assert prefix + "0" * (7 - ii) + "2" == next(gen) assert prefix + "0" * (7 - ii) + "3" == next(gen) assert prefix + "0" * (7 - ii) + "4" == next(gen) assert prefix + "0" * (7 - ii) + "5" == next(gen) assert prefix + "0" * (7 - ii) + "6" == next(gen) assert prefix + "0" * (7 - ii) + "7" == next(gen) assert prefix + "0" * (7 - ii) + "8" == next(gen) assert prefix + "0" * (7 - ii) + "9" == next(gen) assert prefix + "0" * (7 - ii) + "A" == next(gen) def test_alphanumeric_start(self): """Test start point with alphanumeric suffixes.""" gen = generate_filename(start=10, alphanumeric=True) assert "0000000A" == next(gen) assert "0000000B" == next(gen) assert "0000000C" == next(gen) def test_long_prefix_raises(self): """Test too long a prefix.""" msg = r"The 'prefix' must be less than 8 characters long" with pytest.raises(ValueError, match=msg): next(generate_filename("A" * 8)) class TestRecordNode: """Tests for RecordNode.""" def test_root(self, private): """Tests the root node.""" fs = FileSet(private) root = fs._tree assert [] == root.ancestors msg = r"The root node doesn't contribute a File ID component" with pytest.raises(ValueError, match=msg): root.component assert root.file_set == fs assert root.parent is None assert 3 == len(root.children) assert 55 == len(list(iter(root))) # Test __contains__ for child in root.children: assert child in root assert child.key in root assert -1 == root.depth assert 0 == root.index assert not root.has_instance assert root.is_root assert root.previous is None assert root.next is None assert root == root.root assert "ROOT" == str(root) msg = r"'RootNode' object has no attribute '_record'" with pytest.raises(AttributeError, match=msg): root.key with pytest.raises(AttributeError, match=msg): root.record_type assert pytest.raises(StopIteration, next, root.reverse()) # Test __getitem__ for child in root.children: assert child == root[child.key] assert child == root[child] # bit silly child = child.children[0] with pytest.raises(KeyError): root[child.key] with pytest.raises(KeyError): root[child] with pytest.raises(KeyError): del root[child.key] with pytest.raises(KeyError): del root[child] # Test __delitem__ del root[root.children[0]] assert 2 == len(root.children) assert 41 == len(list(iter(root))) # Test __iter__ gen = iter(root) assert "PatientID='98890234'" in str(next(gen)) assert "StudyDate=20010101" in str(next(gen)) assert "SeriesNumber=4" in str(next(gen)) assert "InstanceNumber=1" in str(next(gen)) assert "InstanceNumber=2" in str(next(gen)) assert "SeriesNumber=5" in str(next(gen)) assert "InstanceNumber=6" in str(next(gen)) assert "InstanceNumber=7" in str(next(gen)) for ii in range(29): next(gen) assert "InstanceNumber=7" in str(next(gen)) assert "PRIVATE" in str(next(gen)) assert "PRIVATE" in str(next(gen)) assert "PRIVATE" in str(next(gen)) assert pytest.raises(StopIteration, next, gen) def test_leaf(self, private): """Test a leaf node.""" fs = FileSet(private) # non-PRIVATE leaf = fs._instances[5].node assert [] == leaf.children assert leaf.has_instance ancestors = leaf.ancestors assert 3 == len(ancestors) assert "IMAGE" == leaf.record_type assert "IM000002" == leaf.component assert "SERIES" in str(ancestors[0]) assert "SE000000" == ancestors[0].component assert "STUDY" in str(ancestors[1]) assert "ST000001" == ancestors[1].component assert "PATIENT" in str(ancestors[2]) assert "PT000000" == ancestors[2].component assert 3 == leaf.depth assert fs == leaf.file_set assert 2 == leaf.index assert not leaf.is_root gen = iter(leaf) assert leaf == next(gen) assert pytest.raises(StopIteration, next, gen) assert leaf.parent.children[3] == leaf.next assert leaf.parent.children[1] == leaf.previous # PRIVATE leaf = fs._instances[-1].node assert [] == leaf.children assert leaf.has_instance ancestors = leaf.ancestors assert 2 == len(ancestors) assert "PRIVATE" == leaf.record_type assert "P2000000" == leaf.component assert "PRIVATE" in str(ancestors[0]) assert "P1000000" == ancestors[0].component assert "PRIVATE" in str(ancestors[1]) assert "P0000002" == ancestors[1].component assert 2 == leaf.depth assert fs == leaf.file_set assert 0 == leaf.index assert not leaf.is_root gen = iter(leaf) assert leaf == next(gen) assert pytest.raises(StopIteration, next, gen) assert leaf.next is None assert leaf.previous is None def test_add(self, private, ct): """Test instance added at end of children""" fs = FileSet(private) instance = fs._instances[0] parent = instance.node.parent assert 1 == len(parent.children) assert 0 == instance.node.index assert instance.node.next is None assert instance.node.previous is None ct.PatientID = instance.PatientID ct.StudyInstanceUID = instance.StudyInstanceUID ct.SeriesInstanceUID = instance.SeriesInstanceUID added = fs.add(ct) assert 2 == len(parent.children) assert 0 == instance.node.index assert added.node == instance.node.next assert instance.node.previous is None assert 1 == added.node.index assert instance.node == added.node.previous assert added.node.next is None def test_key(self, private): """Test the record keys.""" fs = FileSet(private) root = fs._tree node = root.children[0] assert node._record.PatientID == node.key node = node.children[0] assert node._record.StudyInstanceUID == node.key node = node.children[0] assert node._record.SeriesInstanceUID == node.key node = node.children[0] assert node._record.ReferencedSOPInstanceUIDInFile == node.key node = root.children[-1] assert node._record.PrivateRecordUID == node.key node = node.children[-1] assert node._record.PrivateRecordUID == node.key node = node.children[-1] assert node._record.PrivateRecordUID == node.key # Test STUDY directly referencing an instance ds = private seq = ds.DirectoryRecordSequence uid = seq[3].ReferencedSOPInstanceUIDInFile seq[1].ReferencedSOPInstanceUIDInFile = uid seq[1].ReferencedTransferSyntaxUIDInFile = ExplicitVRLittleEndian seq[1].ReferencedSOPClassUID = ComputedRadiographyImageStorage seq[1].OffsetOfReferencedLowerLevelDirectoryEntity = 0 seq[1].ReferencedFileID = seq[3].ReferencedFileID del seq[1].StudyInstanceUID fs = FileSet(ds) # The leaf STUDY node node = fs._tree.children[0].children[0] assert [] == node.children assert uid == node.key assert node.has_instance def test_key_raises(self, dummy): """Test missing required element raises.""" ds, opt = dummy ds.SOPClassUID = ColorPaletteStorage fs = FileSet() instance = fs.add(ds) del instance.node._record.ReferencedSOPInstanceUIDInFile msg = ( r"Invalid 'PALETTE' record - missing required element " r"'Referenced SOP Instance UID in File'" ) with pytest.raises(AttributeError, match=msg): instance.node.key @pytest.mark.parametrize("private", [["/", "etc", "passwd"]], indirect=True) def test_id_outside_root(self, private): """File ID points to a path outside the root directory.""" with pytest.raises( PermissionError, match=r"ReferencedFileID .* must be inside the DICOMDIR root path", ): FileSet(private) def test_bad_record(self, private): """Test a bad directory record raises an exception when loading.""" del private.DirectoryRecordSequence[0].PatientID msg = ( r"The PATIENT directory record at offset 396 is missing a " r"required element" ) with pytest.raises(ValueError, match=msg): FileSet(private) private.DirectoryRecordSequence[0].PatientID = "77654033" del private.DirectoryRecordSequence[1].StudyInstanceUID msg = ( r"The STUDY directory record at offset 510 is missing a required " r"element" ) with pytest.raises(ValueError, match=msg): FileSet(private) def test_bad_record_missing_req(self, private): """Test bad directory record raises if missing required element.""" del private.DirectoryRecordSequence[0].DirectoryRecordType msg = ( r"The directory record at offset 396 is missing one or more " r"required elements: DirectoryRecordType" ) with pytest.raises(ValueError, match=msg): FileSet(private) def test_encoding(self, private, tdir): """Test group element not added when encoding.""" fs = FileSet(private) node = fs._instances[0].node node._record.add_new(0x00080000, "UL", 128) node._record.PatientSex = "F" fs, ds, paths = copy_fs(fs, tdir.name) item = ds.DirectoryRecordSequence[3] assert 0x00080000 not in item assert "PatientSex" in item def test_remove_raises(self, private): """Test RecordNode.remove() raises if not a leaf.""" fs = FileSet(private) node = fs._tree.children[0] assert not node.has_instance msg = r"Only leaf nodes can be removed" with pytest.raises(ValueError, match=msg): fs._tree.remove(node) def test_file_id_singleton(self, ct, tdir): """Test a singleton File ID.""" fs = FileSet() p = Path(tdir.name) ct.save_as(p / "01") fs.add(p / "01") fs.write(p) ds = dcmread(p / "DICOMDIR") item = ds.DirectoryRecordSequence[-1] assert "IMAGE" == item.DirectoryRecordType item.ReferencedFileID = "01" ds.save_as(p / "DICOMDIR", overwrite=True) fs = FileSet(ds) assert fs._instances[0].node.file_id_path(fs.root_path) == Path("01") def test_absolute_file_id(self, ct, tdir, ignore_reading_invalid_values): """Test a singleton File ID.""" fs = FileSet() p = Path(tdir.name) ct.save_as(p / "01") fs.add(p / "01") fs.write(p) ds = dcmread(p / "DICOMDIR") item = ds.DirectoryRecordSequence[-1] item.ReferencedFileID = "/01" ds.save_as(p / "DICOMDIR", overwrite=True) with pytest.raises( PermissionError, match=r"ReferencedFileID .* must be inside the DICOMDIR root path", ): FileSet(ds) def test_root_path_missing(self, ct): """Test RecordNode._file_id if no Referenced File ID.""" fs = FileSet() instance = fs.add(ct) # del instance.node._record.ReferencedFileID msg = r"No root path set in the File-set" with pytest.raises(AttributeError, match=msg): fs.root_path def test_file_id_missing(self, ct): """Test RecordNode._file_id if no Referenced File ID.""" fs = FileSet() instance = fs.add(ct) del instance.node._record.ReferencedFileID msg = r"No 'Referenced File ID' in the directory record" with pytest.raises(AttributeError, match=msg): instance.node.file_id_path(Path("/dicom_data")) class TestFileInstance: """Tests for FileInstance.""" def test_getattr(self, dicomdir): """Test FileInstance.__getattribute__.""" fs = FileSet(dicomdir) instance = fs._instances[0] assert "20010101" == instance.StudyDate instance.my_attr = 1234 assert 1234 == instance.my_attr msg = r"'FileInstance' object has no attribute 'missing_attr'" with pytest.raises(AttributeError, match=msg): instance.missing_attr def test_getattr_order(self, private): """Test records are searched closest to furthest""" fs = FileSet(private) instance = fs._instances[-1] assert instance.is_private # a: root, b: middle, c: bottom, c = instance.node b = c.parent a = b.parent assert c._record.PrivateRecordUID != b._record.PrivateRecordUID assert c._record.PrivateRecordUID != a._record.PrivateRecordUID assert instance.PrivateRecordUID == c._record.PrivateRecordUID def test_getitem(self, dicomdir): """Test FileInstance.__getitem__.""" fs = FileSet(dicomdir) instance = fs._instances[0] assert "20010101" == instance["StudyDate"].value assert "20010101" == instance[0x00080020].value assert "20010101" == instance[Tag(0x00080020)].value assert "20010101" == instance[(0x0008, 0x0020)].value assert "20010101" == instance["0x00080020"].value with pytest.raises(KeyError, match=r"(0000,0000)"): instance[0x00000000] def test_getitem_special(self, tiny): """Test FileInstance.__getitem__ for the three special elements.""" fs = FileSet(tiny) instance = fs._instances[0] elem = instance["SOPInstanceUID"] assert ( "1.2.826.0.1.3680043.8.498.66612287766462461480665815941164330386" ) == elem.value elem = instance["SOPClassUID"] assert CTImageStorage == elem.value elem = instance["TransferSyntaxUID"] assert ExplicitVRLittleEndian == elem.value def test_getitem_order(self, private): """Test records are searched closest to furthest""" fs = FileSet(private) instance = fs._instances[-1] assert instance.is_private # a: root, b: middle, c: bottom, c = instance.node b = c.parent a = b.parent assert c._record["PrivateRecordUID"] != b._record["PrivateRecordUID"] assert c._record["PrivateRecordUID"] != a._record["PrivateRecordUID"] assert instance["PrivateRecordUID"] == c._record["PrivateRecordUID"] def test_contains(self, dicomdir): """Test FileInstance.__contains__.""" fs = FileSet(dicomdir) instance = fs._instances[0] assert "StudyDate" in instance assert 0x00080020 in instance assert Tag(0x00080020) in instance assert (0x0008, 0x0020) in instance assert "0x00080020" in instance assert "bad" not in instance def test_is_private(self, private): """Test FileInstance.is_private""" fs = FileSet(private) instance = fs._instances[-1] assert instance.is_private instance = fs._instances[0] assert not instance.is_private def test_properties(self, dicomdir): """Test the FileInstance properties.""" fs = FileSet(dicomdir) instance = fs._instances[0] assert fs == instance.file_set assert os.fspath(Path("77654033/CR1/6154")) in instance.path assert isinstance(instance.path, str) sop_instance = "1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11" nodes = [node for node in instance.node.ancestors] assert 3 == len(nodes) assert nodes[0].record_type == "SERIES" assert nodes[1].record_type == "STUDY" assert nodes[2].record_type == "PATIENT" record = instance.node._record assert sop_instance == record.ReferencedSOPInstanceUIDInFile assert sop_instance == instance.SOPInstanceUID assert ExplicitVRLittleEndian == instance.TransferSyntaxUID assert "1.2.840.10008.5.1.4.1.1.1" == instance.SOPClassUID def test_path(self, ct, tdir): """Test FileInstance.path when not staged.""" fs = FileSet() fs.add(ct) ds, paths = write_fs(fs, tdir.name) assert 1 == len(fs) instance = fs._instances[0] assert not instance.is_staged assert (Path(fs.path) / Path(instance.FileID)) == Path(instance.path) def test_path_add(self, ct, tdir): """Test FileInstance.path when staged for addition.""" fs = FileSet() fs.add(ct) assert 1 == len(fs) instance = fs._instances[0] assert instance.is_staged assert instance.for_addition assert Path(fs._stage["path"]) / f"{instance._uuid}" == Path(instance.path) assert isinstance(instance.path, str) def test_path_move(self, dicomdir): """Test FileInstance.path for an instance to be move.""" fs = FileSet(dicomdir) assert fs._stage["~"] instance = fs._instances[0] assert instance.is_staged assert instance.for_moving assert (Path(fs.path) / Path(*instance.ReferencedFileID)) == Path(instance.path) assert isinstance(instance.path, str) def test_path_removal(self, dicomdir, tdir): """Test FileInstance.FileID when staged for removal.""" fs = FileSet(dicomdir) instance = fs._instances[0] fs.remove(instance) assert instance.is_staged assert instance.for_removal assert (Path(fs.path) / Path(*instance.ReferencedFileID)) == Path(instance.path) assert isinstance(instance.path, str) def test_load(self, ct, tdir): """Test FileInstance.load() when not staged.""" fs = FileSet() fs.add(ct) ds, paths = write_fs(fs, tdir.name) assert 1 == len(fs) instance = fs._instances[0] assert not instance.is_staged ds = instance.load() assert isinstance(ds, Dataset) assert ct.SOPInstanceUID == ds.SOPInstanceUID def test_load_staged_add(self, ct, tdir): """Test FileInstance.load() when staged for addition.""" fs = FileSet() fs.add(ct) assert 1 == len(fs) instance = fs._instances[0] assert instance.is_staged assert instance.for_addition ds = instance.load() assert isinstance(ds, Dataset) assert ct.SOPInstanceUID == ds.SOPInstanceUID def test_load_staged_move(self, dicomdir): """Test FileInstance.load() for an instance to be moved.""" fs = FileSet(dicomdir) instance = fs._instances[0] assert instance.is_staged assert instance.for_moving assert fs.is_staged # At least one instance needs to be moved assert fs._stage["~"] ds = instance.load() assert isinstance(ds, Dataset) sop_instance = "1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11" assert sop_instance == ds.SOPInstanceUID def test_load_staged_removal(self, dicomdir, tdir): """Test FileInstance.load() when staged for removal.""" fs = FileSet(dicomdir) instance = fs._instances[0] fs.remove(instance) assert instance.is_staged assert instance.for_removal ds = instance.load() assert isinstance(ds, Dataset) sop_instance = "1.3.6.1.4.1.5962.1.1.0.0.0.1196527414.5534.0.11" assert sop_instance == ds.SOPInstanceUID def test_for_moving(self, dummy, ct, tdir): """Test FileInstance.for_moving.""" ds, opt = dummy ds.SOPClassUID = ColorPaletteStorage fs = FileSet() # Single level File ID instance = fs.add(ds) assert instance.for_addition assert not instance.for_removal assert not instance.for_moving # Four level File ID instance = fs.add(ct) assert instance.for_addition assert not instance.for_removal assert not instance.for_moving ds, paths = write_fs(fs, tdir.name) for instance in fs: assert not instance.for_addition assert not instance.for_removal assert not instance.for_moving def test_fileid(self, ct, tdir): """Test FileInstance.FileID when not staged.""" fs = FileSet() fs.add(ct) ds, paths = write_fs(fs, tdir.name) assert 1 == len(fs) instance = fs._instances[0] assert not instance.is_staged fileid = Path("PT000000/ST000000/SE000000/IM000000") assert os.fspath(fileid) == instance.FileID def test_fileid_add(self, ct, tdir): """Test FileInstance.FileID when staged for addition.""" fs = FileSet() fs.add(ct) assert 1 == len(fs) instance = fs._instances[0] assert instance.is_staged assert instance.for_addition fileid = Path("PT000000/ST000000/SE000000/IM000000") assert os.fspath(fileid) == instance.FileID def test_fileid_move(self, dicomdir): """Test FileInstance.FileID for an instance to be moved.""" fs = FileSet(dicomdir) assert fs.is_staged # At least one instance needs to be moved assert fs._stage["~"] instance = fs._instances[0] assert instance.is_staged assert instance.for_moving fileid = Path("PT000000/ST000000/SE000000/IM000000") assert os.fspath(fileid) == instance.FileID def test_fileid_removal(self, dicomdir, tdir): """Test FileInstance.FileID when staged for removal.""" fs = FileSet(dicomdir) instance = fs._instances[0] fs.remove(instance) assert instance.is_staged assert instance.for_removal fileid = Path("PT000000/ST000000/SE000000/IM000000") assert os.fspath(fileid) == instance.FileID def test_private(self, private): """Test FileInstance with PRIVATE records.""" fs = FileSet(private) instances = fs._instances assert 32 == len(instances) instance = instances[-1] assert 2 == len(instance.node.ancestors) for node in instance.node.reverse(): assert node.record_type == "PRIVATE" path = os.fspath(Path("TINY_ALPHA/PT000000/ST000000/SE000000/IM000000")) assert path in instances[-1].path assert "1.2.3.4" == instance.SOPClassUID assert "1.2.276.0.7230010.3.1.4.0.31906.1359940846.78187" == ( instance.SOPInstanceUID ) assert ExplicitVRLittleEndian == instance.TransferSyntaxUID class TestFileSet: """Tests for FileSet.""" def test_empty(self): """Test an new and empty File-set.""" fs = FileSet() assert 0 == len(fs) assert fs.ID is None assert fs.UID.is_valid assert fs.path is None assert fs.is_staged # New datasets are staged with pytest.raises(StopIteration): next(iter(fs)) s = str(fs) assert "DICOM File-set" in s assert "Root directory: (no value available)" in s assert "File-set ID: (no value available)" in s assert f"File-set UID: {fs.UID}" in s assert "Managed instances" not in s def test_id(self, tdir): """Test the FileSet.ID property.""" fs = FileSet() assert fs.is_staged assert fs.ID is None fs.ID = "MYID" assert fs.is_staged assert "MYID" == fs.ID s = str(fs) assert "DICOM File-set" in s assert "Root directory: (no value available)" in s assert "File-set ID: MYID" in s assert f"File-set UID: {fs.UID}" in s assert "Managed instances" not in s ds, paths = write_fs(fs, tdir.name) assert not fs.is_staged assert "Changes staged for write():" not in str(fs) fs.ID = "MYID" assert not fs.is_staged fsids = [None, "A", "1" * 16] for fsid in fsids: fs.ID = fsid assert fs.is_staged assert fsid == fs.ID ds, paths = write_fs(fs) assert [] == paths if fsid is None: fsid = "" assert fsid == ds.FileSetID msg = r"The maximum length of the 'File-set ID' is 16 characters" with pytest.raises(ValueError, match=msg): fs.ID = "1" * 17 assert "1" * 16 == fs.ID def test_uid(self, tdir): """Test the FileSet.UID property.""" fs = FileSet() assert fs.is_staged uid = fs.UID ds, paths = write_fs(fs, tdir.name) assert [] == paths assert fs.UID == ds.file_meta.MediaStorageSOPInstanceUID s = str(fs) assert "DICOM File-set" in s assert "Root directory: (no value available)" not in s assert "File-set ID: (no value available)" in s assert f"File-set UID: {fs.UID}" in s assert "Managed instances" not in s assert "Changes staged for write():" not in s assert not fs.is_staged fs.UID = uid assert not fs.is_staged fs.UID = generate_uid() assert uid != fs.UID assert fs.is_staged def test_descriptor(self): """Test FileSet.descriptor_file_id.""" fs = FileSet() assert fs.descriptor_file_id is None assert fs.is_staged fs._stage["^"] = False # Override assert not fs.is_staged fs.descriptor_file_id = None assert not fs.is_staged assert fs.descriptor_file_id is None fs.descriptor_file_id = "README" assert fs.is_staged assert "README" == fs.descriptor_file_id fs.descriptor_file_id = "README" assert "README" == fs.descriptor_file_id fs.descriptor_file_id = "A" * 16 assert "A" * 16 == fs.descriptor_file_id fs.descriptor_file_id = None assert fs.descriptor_file_id is None fs.descriptor_file_id = ["A"] * 8 assert ["A"] * 8 == fs.descriptor_file_id fs.descriptor_file_id = ["A", "", "B", "C"] assert ["A", "B", "C"] == fs.descriptor_file_id # Test exceptions msg = r"The 'DescriptorFileID' must be a str, list of str, or None" with pytest.raises(TypeError, match=msg): fs.descriptor_file_id = 12 msg = ( r"The 'File-set Descriptor File ID' has a maximum of 8 " r"components, each between 0 and 16 characters long" ) with pytest.raises(ValueError, match=msg): fs.descriptor_file_id = ["A"] * 9 with pytest.raises(ValueError, match=msg): fs.descriptor_file_id = ["A" * 17] with pytest.raises(ValueError, match=msg): fs.descriptor_file_id = ["A", 1] msg = ( r"Each 'File-set Descriptor File ID' component has a " r"maximum length of 16 characters" ) with pytest.raises(ValueError, match=msg): fs.descriptor_file_id = "A" * 17 assert ["A", "B", "C"] == fs.descriptor_file_id def test_descriptor_and_charset_written(self, tdir): """Test that the File-set Descriptor File ID gets written.""" fs = FileSet() fs.descriptor_file_id = "README" fs.descriptor_character_set = "ISO_IR 100" ds, paths = write_fs(fs, tdir.name) assert "README" == ds.FileSetDescriptorFileID assert "ISO_IR 100" == ds.SpecificCharacterSetOfFileSetDescriptorFile def test_descriptor_dicomdir(self, dicomdir): """Test FileSet.descriptor_file_id with a DICOMDIR file.""" fs = FileSet(dicomdir) ds = fs._ds assert fs.descriptor_file_id is None assert "FileSetDescriptorFileID" not in ds assert fs.is_staged fs._stage["^"] = False # Override fs._stage["~"] = {} assert not fs.is_staged fs.descriptor_file_id = None assert "FileSetDescriptorFileID" not in ds assert not fs.is_staged assert fs.descriptor_file_id is None fs.descriptor_file_id = "README" assert "README" == ds.FileSetDescriptorFileID assert fs.is_staged assert "README" == fs.descriptor_file_id fs.descriptor_file_id = "README" assert "README" == fs.descriptor_file_id fs.descriptor_file_id = "A" * 16 assert "A" * 16 == fs.descriptor_file_id assert "A" * 16 == ds.FileSetDescriptorFileID fs.descriptor_file_id = None assert fs.descriptor_file_id is None assert ds.FileSetDescriptorFileID is None fs.descriptor_file_id = ["A"] * 8 assert ["A"] * 8 == fs.descriptor_file_id assert ["A"] * 8 == ds.FileSetDescriptorFileID def test_descriptor_charset(self): """Test FileSet.descriptor_character_set.""" fs = FileSet() assert fs.descriptor_character_set is None assert fs.is_staged fs._stage["^"] = False # Override assert not fs.is_staged fs.descriptor_character_set = None assert not fs.is_staged assert fs.descriptor_character_set is None fs.descriptor_character_set = "README" assert fs.is_staged assert "README" == fs.descriptor_character_set def test_descriptor_charset_dicomdir(self, dicomdir): """Test FileSet.descriptor_character_set.""" fs = FileSet(dicomdir) ds = fs._ds assert fs.descriptor_character_set is None assert "SpecificCharacterSetOfFileSetDescriptorFile" not in ds assert fs.is_staged fs._stage["^"] = False # Override fs._stage["~"] = {} assert not fs.is_staged fs.descriptor_character_set = None assert "SpecificCharacterSetOfFileSetDescriptorFile" not in ds assert not fs.is_staged assert fs.descriptor_character_set is None fs.descriptor_character_set = "README" assert "README" == ds.SpecificCharacterSetOfFileSetDescriptorFile assert fs.is_staged def test_path(self, tdir): """Test setting the File-set's path.""" fs = FileSet() assert fs.path is None msg = ( r"can't set attribute" if sys.version_info < (3, 11) else r"property 'path' of 'FileSet' object has no setter" ) with pytest.raises(AttributeError, match=msg): fs.path = tdir.name # Test with str path = tdir.name assert isinstance(path, str) ds, paths = write_fs(fs, path) assert Path(path).parts[-2:] == Path(fs.path).parts[-2:] assert [] == paths root = os.fspath(Path(*Path(tdir.name).parts[-2:])) assert root in ds.filename assert root in str(fs) assert not fs.is_staged # Test with PathLike fs = FileSet() path = Path(tdir.name) ds, paths = write_fs(fs, path) assert [] == paths root = os.fspath(Path(*Path(tdir.name).parts[-2:])) assert root in ds.filename assert root in str(fs) assert not fs.is_staged def test_empty_write(self, tdir): """Test writing an empty File-set.""" fs = FileSet() uid = fs.UID msg = r"The path to the root directory is required for a new File-set" with pytest.raises(ValueError, match=msg): fs.write() path = Path(tdir.name) fs.write(path) # Should be the DICOMDIR file contents = list(path.glob("**/*")) assert "DICOMDIR" == contents[0].name assert 1 == len(contents) ds = dcmread(contents[0]) meta = ds.file_meta assert MediaStorageDirectoryStorage == meta.MediaStorageSOPClassUID assert uid == meta.MediaStorageSOPInstanceUID assert meta.TransferSyntaxUID == ExplicitVRLittleEndian assert "" == ds.FileSetID assert 0 == ds.OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity assert 0 == ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity assert 0 == ds.FileSetConsistencyFlag assert [] == ds.DirectoryRecordSequence def test_add_dataset(self, ct, tdir): """Test FileSet.add() with a Dataset.""" fs = FileSet() assert fs.is_staged fs.write(tdir.name) # write empty to unstage assert not fs.is_staged fs.add(ct) assert fs.is_staged s = str(fs) assert "Managed instances" in s assert ("PATIENT: PatientID='1CT1', PatientName='CompressedSamples^CT1'") in s assert ( "STUDY: StudyDate=20040119, StudyTime=072730, " "StudyDescription='e+1'" in s ) assert "SERIES: Modality=CT, SeriesNumber=1" in s assert 1 == len(fs) instances = [ii for ii in fs] file_id = Path("PT000000", "ST000000", "SE000000", "IM000000") assert os.fspath(file_id) == instances[0].FileID ds, paths = write_fs(fs) assert 1 == len(fs) # Test the DICOMDIR # If uid_len is odd then actual length in dataset is uid_len + 1 uid_len = len(ds.file_meta.MediaStorageSOPInstanceUID) length = 398 - 64 + uid_len + uid_len % 2 assert length == ds.OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity assert length == ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity seq = ds.DirectoryRecordSequence assert 4 == len(seq) item = seq[0] assert item.seq_item_tell == length assert "PATIENT" == item.DirectoryRecordType assert ct.PatientName == item.PatientName assert ct.PatientID == item.PatientID assert 0xFFFF == item.RecordInUseFlag assert 0 == item.OffsetOfTheNextDirectoryRecord assert "ISO_IR 100" == item.SpecificCharacterSet assert length + (516 - 398) == item.OffsetOfReferencedLowerLevelDirectoryEntity item = seq[1] assert item.seq_item_tell == length + (516 - 398) assert "STUDY" == item.DirectoryRecordType assert ct.StudyDate == item.StudyDate assert ct.StudyTime == item.StudyTime assert ct.AccessionNumber == item.AccessionNumber assert ct.StudyDescription == item.StudyDescription assert ct.StudyInstanceUID == item.StudyInstanceUID assert 0xFFFF == item.RecordInUseFlag assert 0 == item.OffsetOfTheNextDirectoryRecord assert "ISO_IR 100" == item.SpecificCharacterSet assert length + (704 - 398) == item.OffsetOfReferencedLowerLevelDirectoryEntity item = seq[2] assert item.seq_item_tell == length + (704 - 398) assert "SERIES" == item.DirectoryRecordType assert ct.Modality == item.Modality assert ct.SeriesInstanceUID == item.SeriesInstanceUID assert ct.SeriesNumber == item.SeriesNumber assert 0xFFFF == item.RecordInUseFlag assert 0 == item.OffsetOfTheNextDirectoryRecord assert "ISO_IR 100" == item.SpecificCharacterSet assert length + (852 - 398) == item.OffsetOfReferencedLowerLevelDirectoryEntity item = seq[3] assert item.seq_item_tell == length + (852 - 398) assert "IMAGE" == item.DirectoryRecordType assert ["PT000000", "ST000000", "SE000000", "IM000000"] == ( item.ReferencedFileID ) assert ct.SOPInstanceUID == item.ReferencedSOPInstanceUIDInFile assert ct.InstanceNumber == item.InstanceNumber assert ct.SOPClassUID == item.ReferencedSOPClassUIDInFile assert ct.file_meta.TransferSyntaxUID == ( item.ReferencedTransferSyntaxUIDInFile ) assert 0xFFFF == item.RecordInUseFlag assert 0 == item.OffsetOfTheNextDirectoryRecord assert "ISO_IR 100" == item.SpecificCharacterSet assert 0 == item.OffsetOfReferencedLowerLevelDirectoryEntity assert not fs.is_staged s = str(fs) root = os.fspath(Path(*Path(tdir.name).parts[-2:])) assert root in s assert 1 == len(paths) assert ct == dcmread(paths[0]) # Calling write() again shouldn't change anything ds2, paths = write_fs(fs) assert ds == ds2 assert ds2.filename == ds.filename assert 1 == len(paths) assert ct == dcmread(paths[0]) def test_add_bad_dataset(self, ct): """Test adding a dataset missing Type 1 element value.""" ct.PatientID = None fs = FileSet() msg = ( r"Unable to use the default 'PATIENT' record creator: " r"The instance's \(0010,0020\) 'Patient ID' element cannot be empty. " r"See DICOM PS3.3 Section F.5. Either update the instance, " r"define your own record creation function " r"or use 'FileSet.add_custom\(\)' instead" ) with pytest.raises(ValueError, match=msg): fs.add(ct) def test_add_path(self, tdir): """Test FileSet.add() with a Dataset.""" fs = FileSet() fs.write(tdir.name) assert not fs.is_staged fs.add(get_testdata_file("CT_small.dcm")) assert fs.is_staged def test_add_add(self, ct, tdir): """Test calling FileSet.add() on the same Dataset.""" fs = FileSet() fs.add(ct) fs.add(ct) assert fs.is_staged assert 1 == len(fs) ds, paths = write_fs(fs, tdir.name) assert 4 == len(ds.DirectoryRecordSequence) assert 1 == len(paths) def test_remove(self, ct, tdir): """Test removing an instance.""" fs = FileSet() fs.add(ct) fs.write(tdir.name) assert "Managed instances" in str(fs) instance = next(iter(fs)) assert isinstance(instance, FileInstance) fs.remove(instance) assert 0 == len(fs) with pytest.raises(StopIteration): next(iter(fs)) ds, paths = write_fs(fs) assert [] == ds.DirectoryRecordSequence assert 0 == ds.OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity assert 0 == ds.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity assert [] == paths def test_remove_iter(self, tiny): """Test FileSet.remove() with iter(FileSet).""" fs = FileSet(tiny) for instance in fs: fs.remove(instance) assert 0 == len(fs) def test_remove_remove(self, ct, tdir): """Test removing an instance that's already removed.""" fs = FileSet() fs.add(ct) fs.write(tdir.name) instance = next(iter(fs)) assert isinstance(instance, FileInstance) fs.remove(instance) msg = r"No such instance in the File-set" with pytest.raises(ValueError, match=msg): fs.remove(instance) def test_remove_add(self, ct, tdir): """Test adding an instance that's removed.""" fs = FileSet() fs.add(ct) fs.write(tdir.name) instance = next(iter(fs)) assert isinstance(instance, FileInstance) fs.remove(instance) assert fs.is_staged fs.add(ct) assert not fs.is_staged ds, paths = write_fs(fs) assert 4 == len(ds.DirectoryRecordSequence) assert 1 == len(paths) def test_add_remove(self, ct, tdir): """Test removing an instance that's added.""" fs = FileSet() fs.write(tdir.name) assert not fs.is_staged fs.add(ct) assert fs.is_staged instance = next(iter(fs)) assert isinstance(instance, FileInstance) fs.remove(instance) assert not fs.is_staged ds, paths = write_fs(fs) assert [] == ds.DirectoryRecordSequence assert [] == paths def test_file_ids_unique(self, dicomdir): """That that the File IDs are all unique within the File-set.""" fs = FileSet(dicomdir) ids = set([ii.FileID for ii in fs]) assert len(fs._instances) == len(ids) def test_add_custom(self, ct, tdir, custom_leaf): """Test FileSet.add_custom() with a standard IOD.""" fs = FileSet() fs.add_custom(ct, custom_leaf) assert 1 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) assert fs.is_staged instance = fs._instances[0] assert instance.SOPInstanceUID in fs._stage["+"] ds, paths = write_fs(fs, tdir.name) assert 1 == len(paths) assert 4 == len(ds.DirectoryRecordSequence) assert Dataset(ct) == dcmread(paths[0]) def test_add_custom_path(self, ct, tdir, custom_leaf): """Test add_custom() with a path.""" fs = FileSet() fs.add_custom(ct.filename, custom_leaf) assert 1 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) assert fs.is_staged instance = fs._instances[0] assert instance.SOPInstanceUID in fs._stage["+"] ds, paths = write_fs(fs, tdir.name) assert 1 == len(paths) assert 4 == len(ds.DirectoryRecordSequence) assert Dataset(ct) == dcmread(paths[0]) def test_add_custom_private(self, ct, tdir): """Test add_custom() with a private instance.""" # Maximum of 8, including the top (root) node patient = _define_patient(ct) patient.DirectoryRecordType = "PATIENT" patient.OffsetOfTheNextDirectoryRecord = 0 patient.RecordInUseFlag = 0xFFFF patient.OffsetOfReferencedLowerLevelDirectoryEntity = 0 patient = RecordNode(patient) ds = Dataset() ds.PrivateRecordUID = generate_uid() ds.DirectoryRecordType = "PRIVATE" ds.ReferencedFileID = None ds.ReferencedSOPClassUIDInFile = ct.SOPClassUID ds.ReferencedSOPInstanceUIDInFile = ct.SOPInstanceUID ds.ReferencedTransferSyntaxUIDInFile = ct.file_meta.TransferSyntaxUID private = RecordNode(ds) private.parent = patient assert 1 == private.depth fs = FileSet() fs.add_custom(ct, private) assert 1 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) assert fs.is_staged instance = fs._instances[0] assert instance.SOPInstanceUID in fs._stage["+"] ds, paths = write_fs(fs, tdir.name) assert 1 == len(paths) assert 2 == len(ds.DirectoryRecordSequence) assert "PATIENT" == ds.DirectoryRecordSequence[0].DirectoryRecordType assert "PRIVATE" == ds.DirectoryRecordSequence[1].DirectoryRecordType assert Dataset(ct) == dcmread(paths[0]) def test_add_custom_too_deep(self, ct): """Test adding too many nodes raises exception.""" # Maximum of 8, including the top (root) node top = _define_patient(ct) top.DirectoryRecordType = "PATIENT" top.OffsetOfTheNextDirectoryRecord = 0 top.RecordInUseFlag = 0xFFFF top.OffsetOfReferencedLowerLevelDirectoryEntity = 0 top = RecordNode(top) for ii in range(8): ds = Dataset() ds.PrivateRecordUID = generate_uid() ds.DirectoryRecordType = "PRIVATE" node = RecordNode(ds) node.parent = top top = node top._record.ReferencedFileID = None top._record.ReferencedSOPClassUIDInFile = ct.SOPClassUID top._record.ReferencedSOPInstanceUIDInFile = ct.SOPInstanceUID top._record.ReferencedTransferSyntaxUIDInFile = ct.file_meta.TransferSyntaxUID assert 8 == top.depth fs = FileSet() msg = ( r"The 'leaf' node must not have more than 7 ancestors as " r"'FileSet' supports a maximum directory structure depth of 8" ) with pytest.raises(ValueError, match=msg): fs.add_custom(ct, top) def test_add_custom_bad_leaf(self, ct, tdir, custom_leaf): """Test FileSet.add_custom() with a bad leaf record.""" del custom_leaf._record.ReferencedSOPClassUIDInFile del custom_leaf._record.ReferencedFileID del custom_leaf._record.ReferencedSOPInstanceUIDInFile del custom_leaf._record.ReferencedTransferSyntaxUIDInFile fs = FileSet() instance = fs.add_custom(ct, custom_leaf) assert 1 == len(fs) assert ct.SOPClassUID == instance.ReferencedSOPClassUIDInFile assert instance.ReferencedFileID is None assert ct.SOPInstanceUID == instance.ReferencedSOPInstanceUIDInFile assert ct.file_meta.TransferSyntaxUID == ( instance.ReferencedTransferSyntaxUIDInFile ) def test_add_custom_add_add(self, ct, tdir, custom_leaf): """Test add_custom() if the instance is already in the File-set.""" fs = FileSet() fs.add(ct) assert 1 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) fs.add_custom(ct, custom_leaf) assert 1 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) def test_add_custom_remove_add(self, ct, tdir, custom_leaf): """Test adding a removed instance.""" fs = FileSet() fs.add_custom(ct, custom_leaf) ds, paths = write_fs(fs, tdir.name) assert not fs.is_staged assert 1 == len(fs) fs.remove(fs._instances[0]) fs.add_custom(ct, custom_leaf) assert 1 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) def test_clear(self, dicomdir, tdir): """Test FileSet.clear().""" fs = FileSet(dicomdir) fs.ID = "TESTID" fs.descriptor_file_id = "README" fs.descriptor_character_set = "ISO 1" fs, ds, paths = copy_fs(fs, tdir.name) assert "README" == fs.descriptor_file_id assert "ISO 1" == fs.descriptor_character_set assert [] != fs._instances assert fs._id is not None assert fs.root_path is not None uid = fs._uid assert fs._uid is not None assert fs._ds is not None assert fs._descriptor is not None assert fs._charset is not None assert [] != fs._tree.children fs.clear() assert [] == fs._instances assert fs._id is None assert fs._root_path is None assert uid != fs._uid assert fs._uid.is_valid assert fs._ds == Dataset() assert fs._descriptor is None assert fs._charset is None assert [] == fs._tree.children def test_str_empty(self, tdir): """Test str(FileSet) on an empty File-set.""" fs = FileSet() s = str(fs) assert "DICOM File-set" in s assert "Root directory: (no value available)" in s assert "File-set ID: (no value available)" in s assert "File-set UID: 1.2.826.0.1" in s assert "Descriptor file ID: (no value available)" in s assert "Descriptor file character set: (no value available)" in s assert "Changes staged for write(): DICOMDIR creation" in s assert "addition" not in s assert "removal" not in s assert "Managed instances:" not in s # Set DICOMDIR elements fs.ID = "TEST ID" fs.descriptor_file_id = "README" fs.descriptor_character_set = "ISO WHATEVER" ds, paths = write_fs(fs, tdir.name) s = str(fs) assert "DICOM File-set" in s assert "Root directory: (no value available)" not in s assert "File-set ID: TEST ID" in s assert "File-set UID: 1.2.826.0.1" in s assert "Descriptor file ID: README" in s assert "Descriptor file character set: ISO WHATEVER" in s assert "Changes staged for write(): DICOMDIR creation" not in s assert "addition" not in s assert "removal" not in s assert "Managed instances:" not in s def test_str(self, ct, dummy, tdir): """Test str(FileSet) with empty + additions.""" fs = FileSet() fs.add(ct) mr = get_testdata_file("MR_small.dcm", read=True) # mr.SeriesDescription = "TEST_DESC" fs.add(mr) # Hack to add description because pydicom.fileset._define_series doesn't copy # optional attribute "Series Description". _mr_series_record = fs._tree.children[-1].children[-1].children[-1]._record _mr_series_record.SeriesDescription = "TEST_DESC" for p in list(Path(TINY_ALPHA_FILESET).parent.glob("**/*"))[::2]: if p.is_file() and p.name not in ["DICOMDIR", "README"]: fs.add(p) instance = fs._instances[-1] ds = dcmread(get_testdata_file("rtdose.dcm")) ds.PatientID = "12345678" ds.InstanceNumber = "1" ds.StudyInstanceUID = instance.StudyInstanceUID ds.SeriesInstanceUID = instance.SeriesInstanceUID fs.add(ds) ds = dcmread(get_testdata_file("rtplan.dcm")) ds.PatientID = "12345678" ds.InstanceNumber = "1" ds.StudyInstanceUID = instance.StudyInstanceUID ds.SeriesInstanceUID = instance.SeriesInstanceUID fs.add(ds) ds, opt = dummy ds.SOPClassUID = ColorPaletteStorage fs.add(ds) ref = ( "DICOM File-set\n" " Root directory: (no value available)\n" " File-set ID: (no value available)\n" f" File-set UID: {fs.UID}\n" " Descriptor file ID: (no value available)\n" " Descriptor file character set: (no value available)\n" " Changes staged for write(): DICOMDIR creation, 30 additions\n" "\n" " Managed instances:\n" " PATIENT: PatientID='1CT1', " "PatientName='CompressedSamples^CT1'\n" " STUDY: StudyDate=20040119, StudyTime=072730, " "StudyDescription='e+1'\n" " SERIES: Modality=CT, SeriesNumber=1\n" " IMAGE: 1 SOP Instance (1 addition)\n" " PATIENT: PatientID='4MR1', " "PatientName='CompressedSamples^MR1'\n" " STUDY: StudyDate=20040826, StudyTime=185059\n" " SERIES: Modality=MR, SeriesNumber=1, SeriesDescription='TEST_DESC'\n" " IMAGE: 1 SOP Instance (1 addition)\n" " PATIENT: PatientID='12345678', PatientName='Citizen^Jan'\n" " STUDY: StudyDate=20200913, StudyTime=161900, " "StudyDescription='Testing File-set'\n" " SERIES: Modality=CT, SeriesNumber=1\n" " IMAGE: 25 SOP Instances (25 additions)\n" " RT DOSE: 1 SOP Instance (1 addition)\n" " RT PLAN: 1 SOP Instance (1 addition)\n" " PALETTE: 1 SOP Instance (to be added)" ) assert ref == str(fs) ds, paths = write_fs(fs, tdir.name) ref = ( " File-set ID: (no value available)\n" f" File-set UID: {fs.UID}\n" " Descriptor file ID: (no value available)\n" " Descriptor file character set: (no value available)\n" "\n" " Managed instances:\n" " PATIENT: PatientID='1CT1', " "PatientName='CompressedSamples^CT1'\n" " STUDY: StudyDate=20040119, StudyTime=072730, " "StudyDescription='e+1'\n" " SERIES: Modality=CT, SeriesNumber=1\n" " IMAGE: 1 SOP Instance\n" " PATIENT: PatientID='4MR1', " "PatientName='CompressedSamples^MR1'\n" " STUDY: StudyDate=20040826, StudyTime=185059\n" " SERIES: Modality=MR, SeriesNumber=1, SeriesDescription='TEST_DESC'\n" " IMAGE: 1 SOP Instance\n" " PATIENT: PatientID='12345678', PatientName='Citizen^Jan'\n" " STUDY: StudyDate=20200913, StudyTime=161900, " "StudyDescription='Testing File-set'\n" " SERIES: Modality=CT, SeriesNumber=1\n" " IMAGE: 25 SOP Instances\n" " RT DOSE: 1 SOP Instance\n" " RT PLAN: 1 SOP Instance\n" " PALETTE: 1 SOP Instance" ) assert ref in str(fs) for instance in fs: fs.remove(instance) for p in list(Path(TINY_ALPHA_FILESET).parent.glob("**/*"))[1:40:2]: if p.is_file() and p.name not in ["DICOMDIR", "README"]: fs.add(p) ref = ( " File-set ID: (no value available)\n" f" File-set UID: {fs.UID}\n" " Descriptor file ID: (no value available)\n" " Descriptor file character set: (no value available)\n" " Changes staged for write(): DICOMDIR update, 18 additions, " "30 removals\n" "\n" " Managed instances:\n" " PATIENT: PatientID='1CT1', " "PatientName='CompressedSamples^CT1'\n" " STUDY: StudyDate=20040119, StudyTime=072730, " "StudyDescription='e+1'\n" " SERIES: Modality=CT, SeriesNumber=1\n" " IMAGE: 0 SOP Instances (1 initial, 1 removal)\n" " PATIENT: PatientID='4MR1', " "PatientName='CompressedSamples^MR1'\n" " STUDY: StudyDate=20040826, StudyTime=185059\n" " SERIES: Modality=MR, SeriesNumber=1, SeriesDescription='TEST_DESC'\n" " IMAGE: 0 SOP Instances (1 initial, 1 removal)\n" " PATIENT: PatientID='12345678', PatientName='Citizen^Jan'\n" " STUDY: StudyDate=20200913, StudyTime=161900, " "StudyDescription='Testing File-set'\n" " SERIES: Modality=CT, SeriesNumber=1\n" " IMAGE: 18 SOP Instances (25 initial, 18 additions, " "25 removals)\n" " RT DOSE: 0 SOP Instances (1 initial, 1 removal)\n" " RT PLAN: 0 SOP Instances (1 initial, 1 removal)\n" " PALETTE: 1 SOP Instance (to be removed)" ) assert ref in str(fs) def test_str_update_structure(self, dicomdir): """Test that the update structure comment appears.""" fs = FileSet(dicomdir) assert ( "Changes staged for write(): DICOMDIR update, directory structure update" ) in str(fs) class TestFileSet_Load: """Tests for a loaded File-set.""" def test_write_dicomdir(self, dicomdir): """Test DICOMDIR writing""" fs = FileSet(dicomdir) out = DicomBytesIO() out.is_little_endian = True out.is_implicit_VR = False fs._write_dicomdir(out) out.seek(0) new = dcmread(out) assert dicomdir.DirectoryRecordSequence == new.DirectoryRecordSequence assert 396 == new.OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity assert 3126 == new.OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity def test_write_new_path(self, dicomdir): """Test writing to a new path.""" fs = FileSet(dicomdir) assert fs.path is not None msg = ( r"The path for an existing File-set cannot be changed, use " r"'FileSet.copy\(\)' to write the File-set to a new location" ) with pytest.raises(ValueError, match=msg): fs.write("MYNEWPATH") def test_bad_sop_class_raises(self, dicomdir): """Test loading using non-DICOMDIR.""" dicomdir.file_meta.MediaStorageSOPClassUID = "1.2.3" msg = ( r"Unable to load the File-set as the supplied dataset is " r"not a 'Media Storage Directory' instance" ) with pytest.raises(ValueError, match=msg): FileSet(dicomdir) def test_bad_filename_raises(self, dicomdir): """Test loading with a bad path.""" dicomdir.filename = "bad" msg = ( r"Unable to load the File-set as the 'filename' attribute " r"for the DICOMDIR dataset is not a valid path: " r"bad" ) with pytest.raises(FileNotFoundError, match=msg): FileSet(dicomdir) def test_bad_filename_type_raises(self, dicomdir): """Test loading with a bad DICOMDIR filename type.""" dicomdir.filename = None msg = ( r"Unable to load the File-set as the DICOMDIR dataset must " r"have a 'filename' attribute set to the path of the " r"DICOMDIR file" ) with pytest.raises(TypeError, match=msg): FileSet(dicomdir) def test_find(self, dicomdir): """Tests for FileSet.find().""" fs = FileSet(dicomdir) assert 31 == len(fs.find()) assert 7 == len(fs.find(PatientID="77654033")) assert 24 == len(fs.find(PatientID="98890234")) matches = fs.find(PatientID="98890234", StudyDate="20030505") assert 17 == len(matches) for ii in matches: assert isinstance(ii, FileInstance) sop_instances = [ii.SOPInstanceUID for ii in matches] assert 17 == len(list(set(sop_instances))) def test_find_load(self, private): """Test FileSet.find(load=True).""" fs = FileSet(private) msg = ( r"None of the records in the DICOMDIR dataset contain all " r"the query elements, consider using the 'load' parameter " r"to expand the search to the corresponding SOP instances" ) with pytest.warns(UserWarning, match=msg): results = fs.find(load=False, PhotometricInterpretation="MONOCHROME1") assert not results results = fs.find(load=True, PhotometricInterpretation="MONOCHROME1") assert 3 == len(results) def test_find_values(self, private): """Test searching the FileSet for element values.""" fs = FileSet(private) expected = { "PatientID": ["77654033", "98890234"], "StudyDescription": [ "XR C Spine Comp Min 4 Views", "CT, HEAD/BRAIN WO CONTRAST", "", "Carotids", "Brain", "Brain-MRA", ], } for k, v in expected.items(): assert fs.find_values(k) == v assert fs.find_values(list(expected.keys())) == expected def test_find_values_load(self, private): """Test FileSet.find_values(load=True).""" fs = FileSet(private) search_element = "PhotometricInterpretation" msg = ( r"None of the records in the DICOMDIR dataset contain " rf"\['{search_element}'\], consider using the 'load' parameter " r"to expand the search to the corresponding SOP instances" ) with pytest.warns(UserWarning, match=msg): results = fs.find_values(search_element, load=False) assert not results assert fs.find_values(search_element, load=True) == [ "MONOCHROME1", "MONOCHROME2", ] with pytest.warns(UserWarning, match=msg): results = fs.find_values([search_element], load=False) assert not results[search_element] assert (fs.find_values([search_element], load=True)) == { search_element: ["MONOCHROME1", "MONOCHROME2"] } def test_empty_file_id(self, dicomdir): """Test loading a record with an empty File ID.""" item = dicomdir.DirectoryRecordSequence[5] item.ReferencedFileID = None uid = item.ReferencedSOPInstanceUIDInFile fs = FileSet(dicomdir) assert [] == fs.find(SOPInstanceUID=uid) assert 30 == len(fs) def test_bad_file_id(self, dicomdir): """Test loading a record with a bad File ID.""" item = dicomdir.DirectoryRecordSequence[5] item.ReferencedFileID[-1] = "MISSING" uid = item.ReferencedSOPInstanceUIDInFile msg = ( r"The referenced SOP Instance for the directory record at offset " r"1220 does not exist:" ) with pytest.warns(UserWarning, match=msg): fs = FileSet(dicomdir) assert [] == fs.find(SOPInstanceUID=uid) assert 30 == len(fs) def test_load_orphans_raise(self, private): """Test loading orphaned records raises exception.""" ds = private seq = ds.DirectoryRecordSequence uid = seq[3].ReferencedSOPInstanceUIDInFile seq[1].ReferencedSOPInstanceUIDInFile = uid seq[1].ReferencedTransferSyntaxUIDInFile = ExplicitVRLittleEndian seq[1].ReferencedSOPClassUID = ComputedRadiographyImageStorage seq[1].OffsetOfReferencedLowerLevelDirectoryEntity = 0 seq[1].ReferencedFileID = seq[3].ReferencedFileID del seq[1].StudyInstanceUID fs = FileSet() msg = r"The DICOMDIR contains orphaned directory records" with pytest.raises(ValueError, match=msg): fs.load(ds, raise_orphans=True) def test_load_orphans_exclude(self, private): """Test loading and ignore orphaned records.""" # The first study includes 3 series, each series with 1 image # so we're orphaning 3 instances seq = private.DirectoryRecordSequence seq[1].OffsetOfReferencedLowerLevelDirectoryEntity = 0 fs = FileSet() msg = ( r"The DICOMDIR has 3 orphaned directory records that reference " r"an instance that will not be included in the File-set" ) with pytest.warns(UserWarning, match=msg): fs.load(private, include_orphans=False) assert 29 == len(fs) assert [] == fs.find(StudyInstanceUID=seq[1].StudyInstanceUID) assert [] == fs.find(SeriesInstanceUID=seq[2].SeriesInstanceUID) for ii in range(3, 9, 2): assert "IMAGE" == seq[ii].DirectoryRecordType assert [] == fs.find(SOPInstanceUID=seq[ii].ReferencedSOPInstanceUIDInFile) def test_load_orphans_no_file_id(self, private): """Test loading orphaned records without a valid File ID.""" # The first study includes 3 series, each series with 1 image # so we're orphaning 3 instances, 1 with an invalid File ID seq = private.DirectoryRecordSequence seq[1].OffsetOfReferencedLowerLevelDirectoryEntity = 0 seq[5].ReferencedFileID = None fs = FileSet() fs.load(private) assert 31 == len(fs) assert "IMAGE" == seq[5].DirectoryRecordType assert [] == fs.find(SOPInstanceUID=seq[5].ReferencedSOPInstanceUIDInFile) assert 1 == len(fs.find(SOPInstanceUID=seq[3].ReferencedSOPInstanceUIDInFile)) assert 1 == len(fs.find(SOPInstanceUID=seq[7].ReferencedSOPInstanceUIDInFile)) def test_load_orphans_private(self, private): """Test loading an orphaned PRIVATE record.""" seq = private.DirectoryRecordSequence seq[-2].OffsetOfReferencedLowerLevelDirectoryEntity = 0 fs = FileSet() fs.load(private) assert 32 == len(fs) assert 1 == len(fs.find(SOPInstanceUID=seq[-1].ReferencedSOPInstanceUIDInFile)) def test_load_dicomdir_big_endian(self, dicomdir, tdir): """Test loading a big endian DICOMDIR""" ds = dcmread(BIGENDIAN_TEST_FILE) msg = ( r"The DICOMDIR dataset uses an invalid transfer syntax " r"'Explicit VR Big Endian' and will be updated to use 'Explicit " r"VR Little Endian'" ) with pytest.warns(UserWarning, match=msg): fs = FileSet(ds) # Should be written out as explicit little fs, ds, paths = copy_fs(fs, tdir.name) assert ExplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID ref = FileSet(dicomdir) assert len(ref) == len(fs) for ii, rr in zip(fs, ref): assert ii.SOPInstanceUID == rr.SOPInstanceUID def test_load_dicomdir_implicit(self, dicomdir, tdir): """Test loading an implicit VR DICOMDIR.""" ds = dcmread(IMPLICIT_TEST_FILE) msg = ( r"The DICOMDIR dataset uses an invalid transfer syntax " r"'Implicit VR Little Endian' and will be updated to use " r"'Explicit VR Little Endian'" ) with pytest.warns(UserWarning, match=msg): fs = FileSet(ds) # Should be written out as explicit little fs, ds, paths = copy_fs(fs, tdir.name) assert ExplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID ref = FileSet(dicomdir) assert len(ref) == len(fs) for ii, rr in zip(fs, ref): assert ii.SOPInstanceUID == rr.SOPInstanceUID def test_load_dicomdir_reordered(self, dicomdir): """Test loading DICOMDIR-reordered""" ds = dcmread(get_testdata_file("DICOMDIR-reordered")) fs = FileSet(ds) ref = FileSet(dicomdir) assert len(ref) == len(fs) for ii, rr in zip(fs, ref): assert ii.SOPInstanceUID == rr.SOPInstanceUID def test_load_dicomdir_no_offset(self, dicomdir): """Test loading DICOMDIR-nooffset""" ds = dcmread(get_testdata_file("DICOMDIR-nooffset")) fs = FileSet(ds) ref = FileSet(dicomdir) assert len(ref) == len(fs) for ii, rr in zip(fs, ref): assert ii.SOPInstanceUID == rr.SOPInstanceUID def test_load_dicomdir_no_uid(self, dicomdir): """Test loading DICOMDIR with no UID""" del dicomdir.file_meta.MediaStorageSOPInstanceUID fs = FileSet(dicomdir) assert fs.UID.is_valid assert fs.UID == dicomdir.file_meta.MediaStorageSOPInstanceUID class TestFileSet_Modify: """Tests for a modified File-set.""" def setup_method(self): self.fn = FileSet.__len__ def teardown_method(self): FileSet.__len__ = self.fn def test_write_dicomdir_fs_changes(self, dicomdir_copy): """Test FileSet.write() with only ^ changes.""" t, ds = dicomdir_copy fs = FileSet(ds) ds, paths = write_fs(fs) assert not fs._stage["^"] fs.descriptor_file_id = ["1", "2", "3"] assert fs._stage["^"] assert not fs._stage["~"] assert not fs._stage["+"] assert not fs._stage["-"] fs.write() assert not fs._stage["^"] ds = dcmread(Path(fs.path) / "DICOMDIR") assert ["1", "2", "3"] == ds.FileSetDescriptorFileID def test_write_dicomdir_use_existing(self, dicomdir_copy): """Test FileSet.write() with use_existing.""" tdir, ds = dicomdir_copy assert "FileSetDescriptorFileID" not in ds fs = FileSet(ds) assert fs._stage["~"] assert not fs._stage["+"] assert not fs._stage["-"] fs.descriptor_file_id = ["1", "2", "3"] fs.write(use_existing=True) t = Path(tdir.name) # File IDs haven't changed assert [] == list(t.glob("PT000000")) assert 1 == len(list(t.glob("98892003"))) ds = dcmread(t / "DICOMDIR") assert ["1", "2", "3"] == ds.FileSetDescriptorFileID def test_write_dicomdir_use_existing_raises(self, dicomdir_copy, ct): """Test FileSet.write() with use_existing raises with +/- changes.""" tdir, ds = dicomdir_copy assert "FileSetDescriptorFileID" not in ds fs = FileSet(ds) fs.add(ct) assert fs._stage["~"] assert fs._stage["+"] assert not fs._stage["-"] fs.descriptor_file_id = ["1", "2", "3"] msg = ( r"'Fileset.write\(\)' called with 'use_existing' but additions to " r"the File-set's managed instances are staged" ) with pytest.raises(ValueError, match=msg): fs.write(use_existing=True) def test_remove_addition_bad_path(self, dicomdir, ct): """Test removing a missing file from the File-set's stage.""" fs = FileSet(dicomdir) fs.add(ct) instance = fs.find(SOPInstanceUID=ct.SOPInstanceUID)[0] assert instance.SOPInstanceUID in fs._stage["+"] assert instance in fs path = instance._stage_path instance._stage_path = Path(fs.path) / "BADFILE" fs.remove(instance) assert instance not in fs assert instance.SOPInstanceUID not in fs._stage["-"] assert instance.SOPInstanceUID not in fs._stage["+"] # File should still exist assert path.exists() def test_write_file_id(self, tiny): """Test that the File IDs character sets switch correctly.""" tdir, ds = temporary_fs(tiny) def my_len(self): return 10**6 + 1 FileSet.__len__ = my_len fs = FileSet(ds) assert 10**6 + 1 == len(fs) ds, paths = write_fs(fs) instance = fs._instances[-1] # Was written with alphanumeric File IDs assert "IM00001E" in instance.path def my_len(self): return 35**6 + 1 FileSet.__len__ = my_len fs = FileSet(ds) assert 35**6 + 1 == len(fs) msg = ( r"pydicom doesn't support writing File-sets with more than " r"1838265625 managed instances" ) with pytest.raises(NotImplementedError, match=msg): fs.write() def test_write_missing_removal(self, tiny): """Test that missing files are ignored when removing during write.""" tdir, ds = temporary_fs(tiny) fs = FileSet(ds) instance = fs._instances[0] path = Path(instance.path) fs.remove(instance) assert path.exists() path.unlink() assert not path.exists() ds, paths = write_fs(fs) assert [] == fs.find(SOPInstanceUID=instance.SOPInstanceUID) assert 49 == len(fs) def test_write_removal_addition_collision(self, tiny): """Test re-adding files staged for removal that also collide.""" # The colliding files are IM000010 to IM000019 which get # overwritten by IM00000A to IM00000J tdir, ds = temporary_fs(tiny) fs = FileSet(ds) # IM000010 to IM000013 instances = fs._instances[36:40] assert "IM000010" == Path(instances[0].path).name assert "IM000011" == Path(instances[1].path).name assert "IM000012" == Path(instances[2].path).name assert "IM000013" == Path(instances[3].path).name fs.remove(instances) assert 46 == len(fs) for instance in instances: path = Path(instance.path) fs.add(path) ds, paths = write_fs(fs) assert 50 == len(paths) original = FileSet(tiny) assert len(original) == len(fs) for ref, ii in zip(original, fs): assert ref.path != ii.path assert ref.SOPInstanceUID == ii.SOPInstanceUID rs = ref.load() ts = ii.load() assert Dataset(rs) == ts def test_write_implicit(self, dicomdir, dicomdir_copy, tdir): """Test writing the DICOMDIR using Implicit VR""" tdir, ds = dicomdir_copy fs = FileSet(ds) with pytest.warns(UserWarning): fs.write(force_implicit=True, use_existing=True) ds = dcmread(Path(fs.path) / "DICOMDIR") assert ImplicitVRLittleEndian == ds.file_meta.TransferSyntaxUID ref_ds = dcmread(IMPLICIT_TEST_FILE) assert Dataset(ref_ds) == ds ref = FileSet(dicomdir) assert len(ref) == len(fs) for ii, rr in zip(fs, ref): assert ii.SOPInstanceUID == rr.SOPInstanceUID def test_write_use_existing(self, dicomdir_copy): """Test write() with use_existing.""" tdir, ds = dicomdir_copy assert 52 == len(ds.DirectoryRecordSequence) fs = FileSet(ds) orig_paths = [p for p in fs.root_path.glob("**/*") if p.is_file()] instance = fs._instances[0] assert Path(instance.path) in orig_paths fs.remove(instance) orig_file_ids = [ii.ReferencedFileID for ii in fs] fs.write(use_existing=True) assert 50 == len(fs._ds.DirectoryRecordSequence) paths = [p for p in fs.root_path.glob("**/*") if p.is_file()] assert orig_file_ids == [ii.ReferencedFileID for ii in fs] assert Path(instance.path) not in paths assert sorted(orig_paths)[1:] == sorted(paths) assert {} == fs._stage["-"] assert not fs._stage["^"] assert {} == fs._stage["+"] assert fs._stage["~"] def test_write_use_existing_raises(self, dicomdir, ct): """Test write() with use_existing raises if additions.""" fs = FileSet(dicomdir) fs.remove(fs._instances[0]) fs.add(ct) msg = ( r"'Fileset.write\(\)' called with 'use_existing' but additions " r"to the File-set's managed instances are staged" ) with pytest.raises(ValueError, match=msg): fs.write(use_existing=True) def test_add_instance_missing(self, tdir): """Test adding an instance missing a required value.""" fs = FileSet() ds = dcmread(get_testdata_file("rtdose.dcm")) del ds.InstanceNumber msg = ( r"Unable to use the default 'RT DOSE' record creator: " r"The instance's \(0020,0013\) 'Instance Number' element is missing. " r"See DICOM PS3.3 Section F.5. Either update the instance, " r"define your own record creation function " r"or use 'FileSet.add_custom\(\)' instead" ) with pytest.raises(ValueError, match=msg): fs.add(ds) def test_add_instance_missing_required_value(self, tdir): """Test adding an instance missing a required value.""" fs = FileSet() ds = dcmread(get_testdata_file("rtdose.dcm")) ds.InstanceNumber = None msg = ( r"Unable to use the default 'RT DOSE' record creator: " r"The instance's \(0020,0013\) 'Instance Number' element cannot be empty. " r"See DICOM PS3.3 Section F.5. Either update the instance, " r"define your own record creation function " r"or use 'FileSet.add_custom\(\)' instead" ) with pytest.raises(ValueError, match=msg): fs.add(ds) def test_add_rt_dose(self, tdir, disable_value_validation): """Test adding an RT Dose instance.""" fs = FileSet() ds = dcmread(get_testdata_file("rtdose.dcm")) ds.SpecificCharacterSet = "ISO_IR 100" ds.InstanceNumber = 1 # Type 2, but Type 1 in the RT DOSE record fs.add(ds) assert 1 == len(fs.find(SOPInstanceUID=ds.SOPInstanceUID)) dicomdir, paths = write_fs(fs, tdir.name) assert 1 == len(paths) seq = dicomdir.DirectoryRecordSequence assert "PATIENT" == seq[0].DirectoryRecordType assert "STUDY" == seq[1].DirectoryRecordType assert "SERIES" == seq[2].DirectoryRecordType assert "RT DOSE" == seq[3].DirectoryRecordType assert Dataset(ds) == dcmread(paths[0]) def test_add_rt_structure_set(self, tdir): """Test adding an RT Structure Set instance.""" ds = dcmread(get_testdata_file("rtstruct.dcm"), force=True) ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian ds.StudyDate = "20201001" ds.StudyTime = "120000" fs = FileSet() fs.add(ds) assert 1 == len(fs.find(SOPInstanceUID=ds.SOPInstanceUID)) dicomdir, paths = write_fs(fs, tdir.name) assert 1 == len(paths) seq = dicomdir.DirectoryRecordSequence assert "PATIENT" == seq[0].DirectoryRecordType assert "STUDY" == seq[1].DirectoryRecordType assert "SERIES" == seq[2].DirectoryRecordType assert "RT STRUCTURE SET" == seq[3].DirectoryRecordType assert Dataset(ds) == dcmread(paths[0]) def test_add_rt_plan(self, tdir): """Test adding an RT Plan instance.""" ds = dcmread(get_testdata_file("rtplan.dcm"), force=True) ds.InstanceNumber = 1 fs = FileSet() fs.add(ds) assert 1 == len(fs.find(SOPInstanceUID=ds.SOPInstanceUID)) dicomdir, paths = write_fs(fs, tdir.name) assert 1 == len(paths) seq = dicomdir.DirectoryRecordSequence assert "PATIENT" == seq[0].DirectoryRecordType assert "STUDY" == seq[1].DirectoryRecordType assert "SERIES" == seq[2].DirectoryRecordType assert "RT PLAN" == seq[3].DirectoryRecordType assert Dataset(ds) == dcmread(paths[0]) def test_remove_list(self, dicomdir, tdir): """Test remove using a list of instances.""" fs = FileSet(dicomdir) instances = fs.find(StudyDescription="XR C Spine Comp Min 4 Views") fs.remove(instances) assert 28 == len(fs) def test_add_bad_one_level(self, dummy): """Test adding a bad one-level dataset raises.""" ds, opt = dummy ds.SOPClassUID = HangingProtocolStorage del ds.HangingProtocolCreator fs = FileSet() msg = ( r"Unable to use the default 'HANGING PROTOCOL' record creator: " r"The instance's \(0072,0008\) 'Hanging Protocol Creator' element " r"is missing. See DICOM PS3.3 Section F.5. Either update the " r"instance, define your own record creation function or use " r"'FileSet.add_custom\(\)' instead" ) with pytest.raises(ValueError, match=msg): fs.add(ds) def test_write_undefined_length(self, dicomdir_copy): """Test writing with undefined length items""" t, ds = dicomdir_copy ds["DirectoryRecordSequence"].is_undefined_length = True for item in ds.DirectoryRecordSequence: item.is_undefined_length_sequence_item = True fs = FileSet(ds) fs.write(use_existing=True) ds = dcmread(Path(t.name) / "DICOMDIR") item = ds.DirectoryRecordSequence[-1] assert item.ReferencedFileID == ["98892003", "MR700", "4648"] class TestFileSet_Copy: """Tests for copying a File-set.""" def setup_method(self): self.orig = FileSet.__len__ def teardown_method(self): FileSet.__len__ = self.orig @pytest.mark.skipif( platform.python_implementation() == "PyPy", reason="pyfakefs does not work with generate_uid() in PyPy", ) def test_constrained_to_fileset_root(self, fileset_fs): """Ensure files cannot be copied outside the FileSet root""" with pytest.raises( PermissionError, match=r"ReferencedFileID .* must be inside the DICOMDIR root path", ): FileSet(Path(FILESET_ROOT) / "DICOMDIR2") def test_copy(self, dicomdir, tdir): """Test FileSet.copy()""" orig_root = Path(dicomdir.filename).parent fs = FileSet(dicomdir) fs.ID = "NEW ID" uid = fs.UID = generate_uid() fs.descriptor_file_id = "README" fs.descriptor_character_set = "ISO_IR 100" cp, ds, paths = copy_fs(fs, tdir.name) assert 31 == len(paths) assert (("PT000000", "ST000000", "SE000000", "IM000000")) == paths[0].parts[-4:] assert (("PT000001", "ST000003", "SE000002", "IM000006")) == paths[-1].parts[ -4: ] # Check existing File-set remains the same assert "NEW ID" == fs.ID assert dicomdir.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert uid == fs.UID assert dicomdir.file_meta.MediaStorageSOPInstanceUID == fs.UID assert "README" == fs.descriptor_file_id assert "ISO_IR 100" == fs.descriptor_character_set assert not bool(fs._stage["+"]) assert not bool(fs._stage["-"]) assert fs.is_staged paths = list(orig_root.glob("98892001/**/*")) paths += list(orig_root.glob("98892003/**/*")) paths += list(orig_root.glob("77654033/**/*")) paths = [p for p in paths if p.is_file()] # Test new File-set assert len(fs) == len(cp) for ref, instance in zip(fs, cp): assert ref.SOPInstanceUID == instance.SOPInstanceUID assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.original_encoding == (False, True) assert not cp.is_staged assert "NEW ID" == cp.ID assert uid == cp.UID assert ds.file_meta.MediaStorageSOPInstanceUID == cp.UID assert "README" == cp.descriptor_file_id assert "ISO_IR 100" == cp.descriptor_character_set def test_copy_raises(self, dicomdir, tdir): """Test exceptions raised by FileSet.copy().""" fs = FileSet(dicomdir) msg = r"Cannot copy the File-set as the 'path' is unchanged" with pytest.raises(ValueError, match=msg): fs.copy(fs.path) def test_copy_implicit(self, dicomdir, tdir): """Test copy() with implicit VR.""" assert not dicomdir.is_implicit_VR fs = FileSet(dicomdir) with pytest.warns(UserWarning): cp, ds, paths = copy_fs(fs, tdir.name, as_implicit=True) # Check existing File-set remains the same assert "PYDICOM_TEST" == fs.ID assert dicomdir.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert dicomdir.file_meta.MediaStorageSOPInstanceUID == fs.UID assert fs.descriptor_file_id is None assert fs.descriptor_character_set is None assert not bool(fs._stage["+"]) assert not bool(fs._stage["-"]) assert 31 == len(paths) assert len(fs) == len(cp) for ref, instance in zip(fs, cp): assert ref.SOPInstanceUID == instance.SOPInstanceUID assert ds.file_meta.TransferSyntaxUID == ImplicitVRLittleEndian assert ds.original_encoding == (True, True) def test_file_id(self, tiny, tdir): """Test that the File IDs character sets switch correctly.""" def my_len(self): return 10**6 + 1 FileSet.__len__ = my_len fs = FileSet(tiny) assert 10**6 + 1 == len(fs) fs, ds, paths = copy_fs(fs, tdir.name) instance = fs._instances[-1] # Was written with alphanumeric File IDs assert "IM00001E" in instance.path def my_len(self): return 35**6 + 1 FileSet.__len__ = my_len fs = FileSet(tiny) assert 35**6 + 1 == len(fs) msg = ( r"pydicom doesn't support writing File-sets with more than " r"1838265625 managed instances" ) with pytest.raises(NotImplementedError, match=msg): fs.copy(tdir.name) def test_additions(self, tiny, ct, tdir): """Test that additions get added when copying.""" fs = FileSet(tiny) assert [] == fs.find(PatientID="1CT1") fs.add(ct) cp, ds, paths = copy_fs(fs, tdir.name) assert 51 == len(paths) assert (("PT000001", "ST000000", "SE000000", "IM000000")) == paths[-1].parts[ -4: ] assert 51 == len(cp) assert not cp.is_staged instances = cp.find(PatientID="1CT1") assert 1 == len(instances) assert ct.SOPInstanceUID == instances[0].SOPInstanceUID # Test addition is still staged in original fs assert fs.is_staged assert 51 == len(fs) assert 1 == len(fs._stage["+"]) assert ct.SOPInstanceUID in fs._stage["+"] def test_removals(self, tiny, tdir): """Test that additions get added when copying.""" fs = FileSet(tiny) instance = fs._instances[0] uid = instance.SOPInstanceUID instances = fs.find(SOPInstanceUID=uid) assert 1 == len(instances) fs.remove(instance) assert fs.is_staged cp, ds, paths = copy_fs(fs, tdir.name) assert 49 == len(paths) assert (("PT000000", "ST000000", "SE000000", "IM000048")) == paths[-1].parts[ -4: ] assert not cp.is_staged names = [p.name for p in paths] assert 49 == len(names) assert "IM000000" in names assert "IM000048" in names assert "IM000049" not in names assert [] == cp.find(SOPInstanceUID=uid) # Test removal is still staged in original fs assert fs.is_staged assert 1 == len(fs._stage["-"]) assert uid in fs._stage["-"] def test_additions_removals(self, tiny, ct, tdir): """Test copying with additions and removals.""" mr = dcmread(get_testdata_file("MR_small.dcm")) fs = FileSet(tiny) assert [] == fs.find(PatientID=ct.PatientID) assert [] == fs.find(PatientID=mr.PatientID) fs.add(ct) fs.add(mr) instances = fs._instances[:5] for instance in instances: matches = fs.find(SOPInstanceUID=instance.SOPInstanceUID) assert 1 == len(matches) fs.remove(instance) assert fs.is_staged cp, ds, paths = copy_fs(fs, tdir.name) # Test written instances parts = [p.parts for p in paths] assert 47 == len(parts) assert "IM000000" == parts[0][-1] assert "IM000044" == parts[44][-1] for ii in range(45): assert ("PT000000", "ST000000", "SE000000") == parts[ii][-4:-1] assert ("PT000001", "ST000000", "SE000000", "IM000000") == parts[45][-4:] assert ("PT000002", "ST000000", "SE000000", "IM000000") == parts[46][-4:] # Test copied fileset assert not cp.is_staged assert 1 == len(cp.find(SOPInstanceUID=ct.SOPInstanceUID)) assert 1 == len(cp.find(SOPInstanceUID=mr.SOPInstanceUID)) for instance in instances: matches = cp.find(SOPInstanceUID=instance.SOPInstanceUID) assert 0 == len(matches) assert instance.SOPInstanceUID not in cp._stage["-"] # Test original fileset assert fs.is_staged for instance in instances: assert instance.SOPInstanceUID in fs._stage["-"] assert 2 == len(fs._stage["+"]) assert 1 == len(fs.find(SOPInstanceUID=ct.SOPInstanceUID)) assert 1 == len(fs.find(SOPInstanceUID=mr.SOPInstanceUID)) # record type REFERENCE_1LEVEL = [ ("HANGING PROTOCOL", HangingProtocolStorage), ("IMPLANT", GenericImplantTemplateStorage), ("IMPLANT ASSY", ImplantAssemblyTemplateStorage), ("IMPLANT GROUP", ImplantTemplateGroupStorage), ("PALETTE", ColorPaletteStorage), ] # PATIENT -> STUDY -> SERIES -> record type REFERENCE_4LEVEL = [ # Record type, SOP Class, Modality, Optional element to include ("IMAGE", CTImageStorage, "CT", None), ("RT DOSE", RTDoseStorage, "RTDOSE", None), ("RT STRUCTURE SET", RTStructureSetStorage, "RTSTRUCT", None), ("RT PLAN", RTPlanStorage, "RTPLAN", "RTPlanLabel"), ("RT TREAT RECORD", RTBeamsTreatmentRecordStorage, "RTRECORD", None), ("PRESENTATION", GrayscaleSoftcopyPresentationStateStorage, "PR", None), ("WAVEFORM", TwelveLeadECGWaveformStorage, "ECG", None), ("SR DOCUMENT", BasicTextSRStorage, "SR", None), ("KEY OBJECT DOC", KeyObjectSelectionDocumentStorage, "KO", None), ("SPECTROSCOPY", MRSpectroscopyStorage, "MS", None), ("RAW DATA", RawDataStorage, "OT", None), ("REGISTRATION", SpatialRegistrationStorage, "REG", None), ("FIDUCIAL", SpatialFiducialsStorage, "FID", None), ("ENCAP DOC", EncapsulatedPDFStorage, "DOC", "EncapsulatedDocument"), ("VALUE MAP", RealWorldValueMappingStorage, "RWV", None), ("STEREOMETRIC", StereometricRelationshipStorage, "SMR", None), ("PLAN", RTBeamsDeliveryInstructionStorage, "PLAN", None), ("MEASUREMENT", LensometryMeasurementsStorage, "LEN", None), ("SURFACE", SurfaceSegmentationStorage, "LS", None), ("SURFACE SCAN", SurfaceScanMeshStorage, "LS", None), ("TRACT", TractographyResultsStorage, "NONE", None), ("ASSESSMENT", ContentAssessmentResultsStorage, "ASMT", None), ("RADIOTHERAPY", CArmPhotonElectronRadiationStorage, "RTRAD", None), ] @pytest.mark.parametrize("rtype, sop", REFERENCE_1LEVEL) def test_one_level_record(rtype, sop, dummy, tdir): """Test adding instances that require a single level hierarchy.""" ds, opt = dummy ds.SOPClassUID = sop fs = FileSet() fs.add(ds) assert 1 == len(fs.find(SOPInstanceUID=ds.SOPInstanceUID)) dicomdir, paths = write_fs(fs, tdir.name) assert 1 == len(paths) [leaf] = dicomdir.DirectoryRecordSequence assert rtype == leaf.DirectoryRecordType assert sop == leaf.ReferencedSOPClassUIDInFile assert ds.SOPInstanceUID == leaf.ReferencedSOPInstanceUIDInFile assert ds.file_meta.TransferSyntaxUID == (leaf.ReferencedTransferSyntaxUIDInFile) file_id = list(paths[0].relative_to(fs.path).parts) assert file_id == [leaf.ReferencedFileID] assert Dataset(ds) == dcmread(paths[0]) # Test the 1C elements ds.update(opt) fs = FileSet() fs.add(ds) @pytest.mark.parametrize("rtype, sop, modality, kw", REFERENCE_4LEVEL) def test_four_level_record(rtype, sop, modality, kw, dummy, tdir): """Test adding instances that require the 4-level hierarchy.""" ds, opt = dummy ds.SOPClassUID = sop ds.Modality = modality if kw == "RTPlanLabel": setattr(ds, kw, "Value") elif kw == "EncapsulatedDocument": setattr(ds, kw, b"\x00\x01") fs = FileSet() fs.add(ds) assert 1 == len(fs.find(SOPInstanceUID=ds.SOPInstanceUID)) dicomdir, paths = write_fs(fs, tdir.name) assert 1 == len(paths) [pt, st, se, leaf] = dicomdir.DirectoryRecordSequence assert "PATIENT" == pt.DirectoryRecordType assert ds.PatientID == pt.PatientID assert ds.PatientName == pt.PatientName assert "STUDY" == st.DirectoryRecordType assert ds.StudyDate == st.StudyDate assert ds.StudyTime == st.StudyTime assert ds.StudyInstanceUID == st.StudyInstanceUID assert "SERIES" == se.DirectoryRecordType assert modality == se.Modality assert rtype == leaf.DirectoryRecordType assert sop == leaf.ReferencedSOPClassUIDInFile assert ds.SOPInstanceUID == leaf.ReferencedSOPInstanceUIDInFile assert ds.file_meta.TransferSyntaxUID == (leaf.ReferencedTransferSyntaxUIDInFile) file_id = list(paths[0].relative_to(fs.path).parts) assert file_id == leaf.ReferencedFileID assert Dataset(ds) == dcmread(paths[0]) # Test the 1C elements ds.update(opt) fs = FileSet() fs.add(ds) pydicom-pydicom-20aa4b7/tests/test_fileutil.py000066400000000000000000000125041515706620200216200ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Test suite for util functions""" from io import BytesIO, RawIOBase from pathlib import Path import platform import tempfile import pytest from pydicom.config import settings from pydicom.fileutil import ( path_from_pathlike, check_buffer, reset_buffer_position, read_buffer, buffer_remaining, buffer_length, buffer_equality, ) IS_WINDOWS = platform.system() == "Windows" class PathLike: """Minimal example for path-like object""" def __init__(self, path: str): self.path = path def __fspath__(self): return self.path class TestPathFromPathLike: """Test the fileutil module""" def test_non_pathlike_is_returned_unaltered(self): assert "test.dcm" == path_from_pathlike("test.dcm") assert path_from_pathlike(None) is None file_like = BytesIO() assert file_like == path_from_pathlike(file_like) assert 42 == path_from_pathlike(42) def test_pathlib_path(self): assert "test.dcm" == path_from_pathlike(Path("test.dcm")) def test_path_like(self): assert "test.dcm" == path_from_pathlike(PathLike("test.dcm")) @pytest.fixture def reset_buffered_read_size(): original = settings.buffered_read_size yield settings.buffered_read_size = original class TestBufferFunctions: """Test for the buffer functions""" @pytest.mark.skipif(IS_WINDOWS, reason="Running on Windows") def test_check_buffer(self): """Test check_buffer()""" # Invalid type msg = "the buffer must inherit from 'io.BufferedIOBase'" with pytest.raises(TypeError, match=msg): check_buffer(None) b = BytesIO() assert b.readable() assert b.seekable() assert not b.closed check_buffer(b) # Buffer has been closed b.close() assert b.closed msg = "the buffer has been closed" with pytest.raises(ValueError, match=msg): check_buffer(b) # Buffer is not readable msg = "the buffer must be readable and seekable" with pytest.raises(ValueError, match=msg): with tempfile.TemporaryFile(mode="wb") as t: check_buffer(t) def test_buffer_remaining(self): """Test buffer_remaining()""" assert buffer_remaining(BytesIO()) == 0 assert buffer_remaining(BytesIO(b"\x00")) == 1 assert buffer_remaining(BytesIO(b"\x00" * 100)) == 100 b = BytesIO(b"\x00" * 100) b.seek(100) assert buffer_remaining(b) == 0 assert b.tell() == 100 b.seek(0) assert buffer_remaining(b) == 100 assert b.tell() == 0 b.seek(13) assert buffer_remaining(b) == 87 assert b.tell() == 13 def test_reset_buffer_position(self): """Test reset_buffer_position()""" b = BytesIO(b"\x00" * 100) b.seek(100) with reset_buffer_position(b) as idx: assert idx == 100 b.seek(0) assert b.tell() == 100 b.seek(13) with reset_buffer_position(b) as idx: assert idx == 13 b.seek(57) assert b.tell() == 13 b.seek(0) with reset_buffer_position(b) as idx: assert idx == 0 b.seek(47) assert b.tell() == 0 b.close() msg = "the buffer has been closed" with pytest.raises(ValueError, match=msg): with reset_buffer_position(b) as idx: assert idx == 100 b.seek(0) def test_read_buffer(self): """Test read_buffer()""" b = BytesIO() assert [d for d in read_buffer(b)] == [] b = BytesIO(b"\x01" * 100 + b"\x02\x03") out = bytearray() for data in read_buffer(b, chunk_size=12): out.extend(data) assert len(out) == 102 assert out == b.getvalue() msg = "Invalid 'chunk_size' value '-12', must be greater than 0" with pytest.raises(ValueError, match=msg): next(read_buffer(b, chunk_size=-12)) b.close() msg = "the buffer has been closed" with pytest.raises(ValueError, match=msg): next(read_buffer(b)) def test_read_buffer_chunk_size(self): """Test the chunk size for read_buffer()""" b = BytesIO(b"\x01\x02" * 6) settings.buffered_read_size = 2 for idx, data in enumerate(read_buffer(b)): assert data == b"\x01\x02" assert idx == 5 b.seek(0) for idx, data in enumerate(read_buffer(b, chunk_size=4)): assert data == b"\x01\x02\x01\x02" assert idx == 2 msg = "The read size must be greater than 0" with pytest.raises(ValueError, match=msg): settings.buffered_read_size = -1 def test_buffer_length(self): """Test buffer_length()""" assert buffer_length(BytesIO()) == 0 assert buffer_length(BytesIO(b"\x00")) == 1 assert buffer_length(BytesIO(b"\x00" * 100)) == 100 b = BytesIO(b"\x00" * 100) b.seek(100) assert buffer_length(b) == 100 b.seek(50) assert buffer_length(b) == 100 def test_equality_not_buffer(self): """Test equality if 'other' is not a buffer or bytes""" assert buffer_equality(b"", None) is False pydicom-pydicom-20aa4b7/tests/test_filewriter.py000066400000000000000000003676131515706620200221750ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """test cases for pydicom.filewriter module""" import tempfile from copy import deepcopy from datetime import date, datetime, time, timedelta, timezone from io import BytesIO import os import sys from pathlib import Path import pickle import platform from struct import unpack from tempfile import TemporaryFile from typing import cast import zlib try: import resource HAVE_RESOURCE = True except ImportError: HAVE_RESOURCE = False import pytest from pydicom import config, __version_info__, uid from pydicom.data import get_testdata_file, get_charset_files from pydicom.dataset import Dataset, FileDataset, FileMetaDataset from pydicom.dataelem import DataElement, RawDataElement from pydicom.filebase import DicomBytesIO from pydicom.filereader import dcmread, read_dataset from pydicom.filewriter import ( _determine_encoding, write_data_element, write_dataset, correct_ambiguous_vr, write_file_meta_info, correct_ambiguous_vr_element, write_numbers, write_PN, _format_DT, write_text, write_OBvalue, write_OWvalue, writers, dcmwrite, ) from pydicom.multival import MultiValue from pydicom.sequence import Sequence from .test_helpers import assert_no_warning from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRBigEndian, ExplicitVRLittleEndian, RLELossless, PYDICOM_IMPLEMENTATION_UID, CTImageStorage, UID, ) from pydicom.util.hexutil import hex2bytes from pydicom.valuerep import BUFFERABLE_VRS, DA, DT, TM, VR from pydicom.values import convert_text from ._write_stds import impl_LE_deflen_std_hex rtplan_name = get_testdata_file("rtplan.dcm") rtdose_name = get_testdata_file("rtdose.dcm") ct_name = get_testdata_file("CT_small.dcm") mr_name = get_testdata_file("MR_small.dcm") mr_implicit_name = get_testdata_file("MR_small_implicit.dcm") mr_bigendian_name = get_testdata_file("MR_small_bigendian.dcm") jpeg_name = get_testdata_file("JPEG2000.dcm") no_ts = get_testdata_file("meta_missing_tsyntax.dcm") color_pl_name = get_testdata_file("color-pl.dcm") sc_rgb_name = get_testdata_file("SC_rgb.dcm") datetime_name = mr_name unicode_name = get_charset_files("chrH31.dcm")[0] multiPN_name = get_charset_files("chrFrenMulti.dcm")[0] deflate_name = get_testdata_file("image_dfl.dcm") base_version = ".".join(str(i) for i in __version_info__) IS_WINDOWS = platform.system() == "Windows" def files_identical(a, b): """Return a tuple (file a == file b, index of first difference)""" with open(a, "rb") as A: with open(b, "rb") as B: a_bytes = A.read() b_bytes = B.read() return bytes_identical(a_bytes, b_bytes) def bytes_identical(a_bytes, b_bytes): """Return a tuple (bytes a == bytes b, index of first difference)""" if len(a_bytes) != len(b_bytes): return False, min([len(a_bytes), len(b_bytes)]) elif a_bytes == b_bytes: return True, 0 # True, dummy argument else: pos = 0 while a_bytes[pos] == b_bytes[pos]: pos += 1 return False, pos # False if not identical, position of 1st diff def as_assertable(dataset): """Copy the elements in a Dataset (including the file_meta, if any) to a set that can be safely compared using pytest's assert. (Datasets can't be so compared because DataElements are not hashable.)""" safe_dict = dict( (str(elem.tag) + " " + elem.keyword, elem.value) for elem in dataset ) if hasattr(dataset, "file_meta"): safe_dict.update(as_assertable(dataset.file_meta)) return safe_dict class TestWriteFile: def setup_method(self): self.file_out = TemporaryFile("w+b") def teardown_method(self): self.file_out.close() def compare(self, in_filename): """Read Dataset from in_filename, write to file, compare""" with open(in_filename, "rb") as f: bytes_in = BytesIO(f.read()) bytes_in.seek(0) ds = dcmread(bytes_in) ds.save_as(self.file_out) self.file_out.seek(0) bytes_out = BytesIO(self.file_out.read()) bytes_in.seek(0) bytes_out.seek(0) same, pos = bytes_identical(bytes_in.getvalue(), bytes_out.getvalue()) assert same def compare_bytes(self, bytes_in, bytes_out): """Compare two bytestreams for equality""" same, pos = bytes_identical(bytes_in, bytes_out) assert same def testRTPlan(self): """Input file, write back and verify them identical (RT Plan file)""" self.compare(rtplan_name) def testRTDose(self): """Input file, write back and verify them identical (RT Dose file)""" self.compare(rtdose_name) def testCT(self): """Input file, write back and verify them identical (CT file).....""" self.compare(ct_name) def testMR(self): """Input file, write back and verify them identical (MR file).....""" self.compare(mr_name) def testUnicode(self): """Ensure decoded string DataElements are written to file properly""" self.compare(unicode_name) def testMultiPN(self): """Ensure multiple Person Names are written to the file correctly.""" self.compare(multiPN_name) def testJPEG2000(self): """Input file, write back and verify them identical (JPEG2K file).""" self.compare(jpeg_name) def test_None_parent(self): """Ensure can write nested sequence with no parent dataset""" # from issues 1836, 1838, 1839 # (0040,9096) Real World Value Mapping Sequence 1 item(s) ---- # (0040,9211) Real World Value Last Value Mapped US: 8699 byts = ( b"\0" * 128 + b"DICM" + bytes.fromhex( "4000 9690 FFFFFFFF" # (0040,9096) Sequence undefined length " FEFF 00E0 FFFFFFFF" # Sequence Item undefined length " 4000 1192 02000000" # (0040,9211) length 2 " FB 21 " # value " FEFF 0DE0 00000000" # Item Delimiter "FEFF DDE0 00000000" # Sequence Delimiter ) ) ds = dcmread(BytesIO(byts)) # original bug raises 'NoneType' object is not callable on decode ds.decode() def test_pathlib_path_filename(self): """Check that file can be written using pathlib.Path""" ds = dcmread(Path(ct_name)) ds.save_as(self.file_out) self.file_out.seek(0) ds1 = dcmread(self.file_out) assert ds.PatientName == ds1.PatientName def testListItemWriteBack(self): """Change item in a list and confirm it is written to file""" DS_expected = 0 CS_expected = "new" SS_expected = 999 ds = dcmread(ct_name) ds.ImagePositionPatient[2] = DS_expected ds.ImageType[1] = CS_expected ds[(0x0043, 0x1012)].value[0] = SS_expected ds.save_as(self.file_out) self.file_out.seek(0) # Now read it back in and check that the values were changed ds = dcmread(self.file_out) assert CS_expected == ds.ImageType[1] assert SS_expected == ds[0x00431012].value[0] assert DS_expected == ds.ImagePositionPatient[2] def testwrite_short_uid(self): ds = dcmread(rtplan_name) ds.SOPInstanceUID = "1.2" ds.save_as(self.file_out) self.file_out.seek(0) ds = dcmread(self.file_out) assert "1.2" == ds.SOPInstanceUID def test_write_no_ts(self): """Test reading a file with no ts and writing it out identically.""" ds = dcmread(no_ts) ds.save_as(self.file_out) self.file_out.seek(0) with open(no_ts, "rb") as ref_file: written_bytes = self.file_out.read() read_bytes = ref_file.read() self.compare_bytes(read_bytes, written_bytes) def test_write_double_filemeta(self): """Test writing file meta from Dataset doesn't work""" ds = dcmread(ct_name) ds.TransferSyntaxUID = "1.1" with pytest.raises(ValueError): ds.save_as(self.file_out) def test_write_ffff_ffff(self): """Test writing element (FFFF,FFFF) to file #92""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.add_new(0xFFFFFFFF, "LO", "123456") ds.save_as(fp, implicit_vr=True) fp.seek(0) ds = dcmread(fp, force=True) assert ds[0xFFFFFFFF].value == b"123456" def test_write_removes_grouplength(self): ds = dcmread(color_pl_name) assert 0x00080000 in ds ds.save_as(self.file_out) self.file_out.seek(0) ds = dcmread(self.file_out) # group length has been removed assert 0x00080000 not in ds def test_write_empty_sequence(self): """Make sure that empty sequence is correctly written.""" # regression test for #1030 ds = dcmread(get_testdata_file("test-SR.dcm")) ds.save_as(self.file_out) self.file_out.seek(0) ds = dcmread(self.file_out) assert ds.PerformedProcedureCodeSequence == [] def test_write_deflated_retains_elements(self): """Read a Deflated Explicit VR Little Endian file, write it, and then read the output, to verify that the written file contains the same data. """ original = dcmread(deflate_name) original.save_as(self.file_out) self.file_out.seek(0) rewritten = dcmread(self.file_out) assert as_assertable(rewritten) == as_assertable(original) def test_write_deflated_deflates_post_file_meta(self): """Read a Deflated Explicit VR Little Endian file, write it, and then check the bytes in the output, to verify that the written file is deflated past the file meta information. """ original = dcmread(deflate_name) original.save_as(self.file_out) first_byte_past_file_meta = 0x14E with open(deflate_name, "rb") as original_file: original_file.seek(first_byte_past_file_meta) original_post_meta_file_bytes = original_file.read() unzipped_original = zlib.decompress( original_post_meta_file_bytes, -zlib.MAX_WBITS ) self.file_out.seek(first_byte_past_file_meta) rewritten_post_meta_file_bytes = self.file_out.read() unzipped_rewritten = zlib.decompress( rewritten_post_meta_file_bytes, -zlib.MAX_WBITS ) assert unzipped_rewritten == unzipped_original def test_write_dataset_without_encoding(self): """Test that write_dataset() raises if encoding not set.""" msg = ( "Unable to determine the encoding to use for writing the dataset, " "please set the file meta's Transfer Syntax UID or use the " "'implicit_vr' and 'little_endian' arguments" ) with pytest.raises(ValueError, match=msg): dcmwrite(BytesIO(), Dataset()) class TestScratchWriteDateTime(TestWriteFile): """Write and reread simple or multi-value DA/DT/TM data elements""" def setup_method(self): config.datetime_conversion = True self.file_out = TemporaryFile("w+b") def teardown_method(self): config.datetime_conversion = False self.file_out.close() def test_multivalue_DA(self): """Write DA/DT/TM data elements..........""" multi_DA_expected = (date(1961, 8, 4), date(1963, 11, 22)) DA_expected = date(1961, 8, 4) tzinfo = timezone(timedelta(seconds=-21600), "-0600") multi_DT_expected = ( datetime(1961, 8, 4), datetime(1963, 11, 22, 12, 30, 0, 0, tzinfo), ) multi_TM_expected = (time(1, 23, 45), time(11, 11, 11)) TM_expected = time(11, 11, 11, 1) ds = dcmread(datetime_name) # Add date/time data elements ds.CalibrationDate = MultiValue(DA, multi_DA_expected) ds.DateOfLastCalibration = DA(DA_expected) ds.ReferencedDateTime = MultiValue(DT, multi_DT_expected) ds.CalibrationTime = MultiValue(TM, multi_TM_expected) ds.TimeOfLastCalibration = TM(TM_expected) ds.save_as(self.file_out) self.file_out.seek(0) # Now read it back in and check the values are as expected ds = dcmread(self.file_out) assert all([a == b for a, b in zip(ds.CalibrationDate, multi_DA_expected)]) assert DA_expected == ds.DateOfLastCalibration assert all([a == b for a, b in zip(ds.ReferencedDateTime, multi_DT_expected)]) assert all([a == b for a, b in zip(ds.CalibrationTime, multi_TM_expected)]) assert TM_expected == ds.TimeOfLastCalibration class TestWriteDataElement: """Attempt to write data elements has the expected behaviour""" def setup_method(self): # Create a dummy (in memory) file to write to self.f1 = DicomBytesIO() self.f1.is_little_endian = True self.f1.is_implicit_VR = True @staticmethod def encode_element(elem, is_implicit_VR=True, is_little_endian=True): """Return the encoded `elem`. Parameters ---------- elem : pydicom.dataelem.DataElement The element to encode is_implicit_VR : bool Encode using implicit VR, default True is_little_endian : bool Encode using little endian, default True Returns ------- str or bytes The encoded element as str (python2) or bytes (python3) """ with DicomBytesIO() as fp: fp.is_implicit_VR = is_implicit_VR fp.is_little_endian = is_little_endian write_data_element(fp, elem) return fp.getvalue() def test_empty_AT(self): """Write empty AT correctly..........""" # Was issue 74 data_elem = DataElement(0x00280009, "AT", []) expected = hex2bytes( " 28 00 09 00" # (0028,0009) Frame Increment Pointer " 00 00 00 00" # length 0 ) write_data_element(self.f1, data_elem) assert expected == self.f1.getvalue() def check_data_element(self, data_elem, expected): encoded_elem = self.encode_element(data_elem) assert expected == encoded_elem def test_write_empty_LO(self): data_elem = DataElement(0x00080070, "LO", None) expected = b"\x08\x00\x70\x00\x00\x00\x00\x00" # tag # length # value self.check_data_element(data_elem, expected) def test_write_DA(self): data_elem = DataElement(0x00080022, "DA", "20000101") expected = ( b"\x08\x00\x22\x00" # tag b"\x08\x00\x00\x00" # length b"20000101" ) # value self.check_data_element(data_elem, expected) data_elem = DataElement(0x00080022, "DA", date(2000, 1, 1)) self.check_data_element(data_elem, expected) def test_write_multi_DA(self): data_elem = DataElement(0x0014407E, "DA", ["20100101", b"20101231"]) expected = ( b"\x14\x00\x7E\x40" # tag b"\x12\x00\x00\x00" # length b"20100101\\20101231 " ) # padded value self.check_data_element(data_elem, expected) data_elem = DataElement( 0x0014407E, "DA", [date(2010, 1, 1), date(2010, 12, 31)] ) self.check_data_element(data_elem, expected) def test_write_TM(self): data_elem = DataElement(0x00080030, "TM", "010203") expected = ( b"\x08\x00\x30\x00" # tag b"\x06\x00\x00\x00" # length b"010203" ) # padded value self.check_data_element(data_elem, expected) data_elem = DataElement(0x00080030, "TM", b"010203") self.check_data_element(data_elem, expected) data_elem = DataElement(0x00080030, "TM", time(1, 2, 3)) self.check_data_element(data_elem, expected) def test_write_multi_TM(self): data_elem = DataElement(0x0014407C, "TM", ["082500", b"092655"]) expected = ( b"\x14\x00\x7C\x40" # tag b"\x0E\x00\x00\x00" # length b"082500\\092655 " ) # padded value self.check_data_element(data_elem, expected) data_elem = DataElement(0x0014407C, "TM", [time(8, 25), time(9, 26, 55)]) self.check_data_element(data_elem, expected) def test_write_DT(self): data_elem = DataElement(0x0008002A, "DT", "20170101120000") expected = ( b"\x08\x00\x2A\x00" # tag b"\x0E\x00\x00\x00" # length b"20170101120000" ) # value self.check_data_element(data_elem, expected) data_elem = DataElement(0x0008002A, "DT", b"20170101120000") self.check_data_element(data_elem, expected) data_elem = DataElement(0x0008002A, "DT", datetime(2017, 1, 1, 12)) self.check_data_element(data_elem, expected) def test_write_multi_DT(self): data_elem = DataElement(0x0040A13A, "DT", ["20120820120804", b"20130901111111"]) expected = ( b"\x40\x00\x3A\xA1" # tag b"\x1E\x00\x00\x00" # length b"20120820120804\\20130901111111 " ) # padded value self.check_data_element(data_elem, expected) data_elem = DataElement(0x0040A13A, "DT", "20120820120804\\20130901111111") self.check_data_element(data_elem, expected) data_elem = DataElement(0x0040A13A, "DT", b"20120820120804\\20130901111111") self.check_data_element(data_elem, expected) data_elem = DataElement( 0x0040A13A, "DT", [datetime(2012, 8, 20, 12, 8, 4), datetime(2013, 9, 1, 11, 11, 11)], ) self.check_data_element(data_elem, expected) def test_write_ascii_vr_with_padding(self): expected = ( b"\x08\x00\x54\x00" # tag b"\x0C\x00\x00\x00" # length b"CONQUESTSRV " ) # padded value data_elem = DataElement(0x00080054, "AE", "CONQUESTSRV") self.check_data_element(data_elem, expected) data_elem = DataElement(0x00080054, "AE", b"CONQUESTSRV") self.check_data_element(data_elem, expected) expected = ( b"\x08\x00\x62\x00" # tag b"\x06\x00\x00\x00" # length b"1.2.3\x00" ) # padded value data_elem = DataElement(0x00080062, "UI", "1.2.3") self.check_data_element(data_elem, expected) data_elem = DataElement(0x00080062, "UI", b"1.2.3") self.check_data_element(data_elem, expected) expected = b"\x08\x00\x60\x00\x04\x00\x00\x00REG " # tag # length data_elem = DataElement(0x00080060, "CS", "REG") self.check_data_element(data_elem, expected) data_elem = DataElement(0x00080060, "CS", b"REG") self.check_data_element(data_elem, expected) def test_write_OB_odd(self): """Test an odd-length OB element is padded during write""" value = b"\x00\x01\x02" elem = DataElement(0x7FE00010, "OB", value) encoded_elem = self.encode_element(elem) ref_bytes = b"\xe0\x7f\x10\x00\x04\x00\x00\x00" + value + b"\x00" assert ref_bytes == encoded_elem # Empty data elem.value = b"" encoded_elem = self.encode_element(elem) ref_bytes = b"\xe0\x7f\x10\x00\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_OD_implicit_little(self): """Test writing elements with VR of OD works correctly.""" # VolumetricCurvePoints bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03\x04\x05\x06\x07" elem = DataElement(0x0070150D, "OD", bytestring) encoded_elem = self.encode_element(elem) # Tag pair (0070,150D): 70 00 0d 15 # Length (16): 10 00 00 00 # | Tag | Length | Value -> ref_bytes = b"\x70\x00\x0d\x15\x10\x00\x00\x00" + bytestring assert ref_bytes == encoded_elem # Empty data elem.value = b"" encoded_elem = self.encode_element(elem) ref_bytes = b"\x70\x00\x0d\x15\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_OD_explicit_little(self): """Test writing elements with VR of OD works correctly. Elements with a VR of 'OD' use the newer explicit VR encoding (see PS3.5 Section 7.1.2). """ # VolumetricCurvePoints bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03\x04\x05\x06\x07" elem = DataElement(0x0070150D, "OD", bytestring) encoded_elem = self.encode_element(elem, False, True) # Tag pair (0070,150D): 70 00 0d 15 # VR (OD): \x4f\x44 # Reserved: \x00\x00 # Length (16): \x10\x00\x00\x00 # | Tag | VR | ref_bytes = b"\x70\x00\x0d\x15\x4f\x44\x00\x00\x10\x00\x00\x00" + bytestring # |Rsrvd | Length | Value -> assert ref_bytes == encoded_elem # Empty data elem.value = b"" encoded_elem = self.encode_element(elem, False, True) ref_bytes = b"\x70\x00\x0d\x15\x4f\x44\x00\x00\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_OL_implicit_little(self): """Test writing elements with VR of OL works correctly.""" # TrackPointIndexList bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03" elem = DataElement(0x00660129, "OL", bytestring) encoded_elem = self.encode_element(elem) # Tag pair (0066,0129): 66 00 29 01 # Length (12): 0c 00 00 00 # | Tag | Length | Value -> ref_bytes = b"\x66\x00\x29\x01\x0c\x00\x00\x00" + bytestring assert ref_bytes == encoded_elem # Empty data elem.value = b"" encoded_elem = self.encode_element(elem) ref_bytes = b"\x66\x00\x29\x01\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_OL_explicit_little(self): """Test writing elements with VR of OL works correctly. Elements with a VR of 'OL' use the newer explicit VR encoding (see PS3.5 Section 7.1.2). """ # TrackPointIndexList bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03" elem = DataElement(0x00660129, "OL", bytestring) encoded_elem = self.encode_element(elem, False, True) # Tag pair (0066,0129): 66 00 29 01 # VR (OL): \x4f\x4c # Reserved: \x00\x00 # Length (12): 0c 00 00 00 # | Tag | VR | ref_bytes = b"\x66\x00\x29\x01\x4f\x4c\x00\x00\x0c\x00\x00\x00" + bytestring # |Rsrvd | Length | Value -> assert ref_bytes == encoded_elem # Empty data elem.value = b"" encoded_elem = self.encode_element(elem, False, True) ref_bytes = b"\x66\x00\x29\x01\x4f\x4c\x00\x00\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_UC_implicit_little(self): """Test writing elements with VR of UC works correctly.""" # VM 1, even data elem = DataElement(0x00189908, "UC", "Test") encoded_elem = self.encode_element(elem) # Tag pair (0018,9908): 08 00 20 01 # Length (4): 04 00 00 00 # Value: \x54\x65\x73\x74 ref_bytes = b"\x18\x00\x08\x99\x04\x00\x00\x00\x54\x65\x73\x74" assert ref_bytes == encoded_elem # VM 1, odd data - padded to even length elem.value = "Test." encoded_elem = self.encode_element(elem) ref_bytes = b"\x18\x00\x08\x99\x06\x00\x00\x00\x54\x65\x73\x74\x2e\x20" assert ref_bytes == encoded_elem # VM 3, even data elem.value = ["Aa", "B", "C"] encoded_elem = self.encode_element(elem) ref_bytes = b"\x18\x00\x08\x99\x06\x00\x00\x00\x41\x61\x5c\x42\x5c\x43" assert ref_bytes == encoded_elem # VM 3, odd data - padded to even length elem.value = ["A", "B", "C"] encoded_elem = self.encode_element(elem) ref_bytes = b"\x18\x00\x08\x99\x06\x00\x00\x00\x41\x5c\x42\x5c\x43\x20" assert ref_bytes == encoded_elem # Empty data elem.value = "" encoded_elem = self.encode_element(elem) ref_bytes = b"\x18\x00\x08\x99\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_UC_explicit_little(self): """Test writing elements with VR of UC works correctly. Elements with a VR of 'UC' use the newer explicit VR encoding (see PS3.5 Section 7.1.2). """ # VM 1, even data elem = DataElement(0x00189908, "UC", "Test") encoded_elem = self.encode_element(elem, False, True) # Tag pair (0018,9908): 08 00 20 01 # VR (UC): \x55\x43 # Reserved: \x00\x00 # Length (4): \x04\x00\x00\x00 # Value: \x54\x65\x73\x74 ref_bytes = b"\x18\x00\x08\x99\x55\x43\x00\x00\x04\x00\x00\x00\x54\x65\x73\x74" assert ref_bytes == encoded_elem # VM 1, odd data - padded to even length elem.value = "Test." encoded_elem = self.encode_element(elem, False, True) ref_bytes = ( b"\x18\x00\x08\x99\x55\x43\x00\x00\x06\x00\x00\x00" b"\x54\x65\x73\x74\x2e\x20" ) assert ref_bytes == encoded_elem # VM 3, even data elem.value = ["Aa", "B", "C"] encoded_elem = self.encode_element(elem, False, True) ref_bytes = ( b"\x18\x00\x08\x99\x55\x43\x00\x00\x06\x00\x00\x00" b"\x41\x61\x5c\x42\x5c\x43" ) assert ref_bytes == encoded_elem # VM 3, odd data - padded to even length elem.value = ["A", "B", "C"] encoded_elem = self.encode_element(elem, False, True) ref_bytes = ( b"\x18\x00\x08\x99\x55\x43\x00\x00\x06\x00\x00\x00" b"\x41\x5c\x42\x5c\x43\x20" ) assert ref_bytes == encoded_elem # Empty data elem.value = "" encoded_elem = self.encode_element(elem, False, True) ref_bytes = b"\x18\x00\x08\x99\x55\x43\x00\x00\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_UR_implicit_little(self): """Test writing elements with VR of UR works correctly.""" # Even length URL elem = DataElement(0x00080120, "UR", "http://github.com/darcymason/pydicom") encoded_elem = self.encode_element(elem) # Tag pair (0008,2001): 08 00 20 01 # Length (36): 24 00 00 00 # Value: 68 to 6d ref_bytes = ( b"\x08\x00\x20\x01\x24\x00\x00\x00\x68\x74" b"\x74\x70\x3a\x2f\x2f\x67\x69\x74\x68\x75" b"\x62\x2e\x63\x6f\x6d\x2f\x64\x61\x72\x63" b"\x79\x6d\x61\x73\x6f\x6e\x2f\x70\x79\x64" b"\x69\x63\x6f\x6d" ) assert ref_bytes == encoded_elem # Odd length URL has trailing \x20 (SPACE) padding elem.value = "../test/test.py" encoded_elem = self.encode_element(elem) # Tag pair (0008,2001): 08 00 20 01 # Length (16): 10 00 00 00 # Value: 2e to 20 ref_bytes = ( b"\x08\x00\x20\x01\x10\x00\x00\x00\x2e\x2e" b"\x2f\x74\x65\x73\x74\x2f\x74\x65\x73\x74" b"\x2e\x70\x79\x20" ) assert ref_bytes == encoded_elem # Empty value elem.value = "" encoded_elem = self.encode_element(elem) assert b"\x08\x00\x20\x01\x00\x00\x00\x00" == encoded_elem def test_write_UR_explicit_little(self): """Test writing elements with VR of UR works correctly. Elements with a VR of 'UR' use the newer explicit VR encoded (see PS3.5 Section 7.1.2). """ # Even length URL elem = DataElement(0x00080120, "UR", "ftp://bits") encoded_elem = self.encode_element(elem, False, True) # Tag pair (0008,2001): 08 00 20 01 # VR (UR): \x55\x52 # Reserved: \x00\x00 # Length (4): \x0a\x00\x00\x00 # Value: \x66\x74\x70\x3a\x2f\x2f\x62\x69\x74\x73 ref_bytes = ( b"\x08\x00\x20\x01\x55\x52\x00\x00\x0a\x00\x00\x00" b"\x66\x74\x70\x3a\x2f\x2f\x62\x69\x74\x73" ) assert ref_bytes == encoded_elem # Odd length URL has trailing \x20 (SPACE) padding elem.value = "ftp://bit" encoded_elem = self.encode_element(elem, False, True) ref_bytes = ( b"\x08\x00\x20\x01\x55\x52\x00\x00\x0a\x00\x00\x00" b"\x66\x74\x70\x3a\x2f\x2f\x62\x69\x74\x20" ) assert ref_bytes == encoded_elem # Empty value elem.value = "" encoded_elem = self.encode_element(elem, False, True) ref_bytes = b"\x08\x00\x20\x01\x55\x52\x00\x00\x00\x00\x00\x00" assert ref_bytes == encoded_elem def test_write_UN_implicit_little(self): """Test writing UN VR in implicit little""" elem = DataElement(0x00100010, "UN", b"\x01\x02") assert self.encode_element(elem) == ( b"\x10\x00\x10\x00\x02\x00\x00\x00\x01\x02" ) def test_write_unknown_vr_raises(self): """Test exception raised trying to write unknown VR element""" fp = DicomBytesIO() fp.is_implicit_VR = True fp.is_little_endian = True elem = DataElement(0x00100010, "ZZ", "Test") with pytest.raises( NotImplementedError, match="write_data_element: unknown Value Representation 'ZZ'", ): write_data_element(fp, elem) class TestCorrectAmbiguousVR: """Test correct_ambiguous_vr.""" def test_pixel_representation_vm_one(self): """Test correcting VM 1 elements which require PixelRepresentation.""" ref_ds = Dataset() # If PixelRepresentation is 0 then VR should be US ref_ds.PixelRepresentation = 0 ref_ds.SmallestValidPixelValue = b"\x00\x01" # Little endian 256 ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert 256 == ds.SmallestValidPixelValue assert "US" == ds[0x00280104].VR # If PixelRepresentation is 1 then VR should be SS ref_ds.PixelRepresentation = 1 ref_ds.SmallestValidPixelValue = b"\x00\x01" # Big endian 1 ds = correct_ambiguous_vr(deepcopy(ref_ds), False) assert 1 == ds.SmallestValidPixelValue assert "SS" == ds[0x00280104].VR # If no PixelRepresentation and no PixelData is present 'US' is set ref_ds = Dataset() ref_ds.SmallestValidPixelValue = b"\x00\x01" # Big endian 1 ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert "US" == ds[0x00280104].VR # If no PixelRepresentation but PixelData is present # AttributeError shall be raised ref_ds.PixelData = b"123" with pytest.raises( AttributeError, match=r"Failed to resolve ambiguous VR for tag " r"\(0028,0104\):.* 'PixelRepresentation'", ): correct_ambiguous_vr(deepcopy(ref_ds), True) def test_pixel_representation_vm_three(self): """Test correcting VM 3 elements which require PixelRepresentation.""" ref_ds = Dataset() # If PixelRepresentation is 0 then VR should be US - Little endian ref_ds.PixelRepresentation = 0 ref_ds.LUTDescriptor = b"\x01\x00\x00\x01\x10\x00" # 1\256\16 ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert [1, 256, 16] == ds.LUTDescriptor assert "US" == ds[0x00283002].VR # If PixelRepresentation is 1 then VR should be SS ref_ds.PixelRepresentation = 1 ref_ds.LUTDescriptor = b"\x01\x00\x00\x01\x00\x10" ds = correct_ambiguous_vr(deepcopy(ref_ds), False) assert [256, 1, 16] == ds.LUTDescriptor assert "SS" == ds[0x00283002].VR # If no PixelRepresentation and no PixelData is present 'US' is set ref_ds = Dataset() ref_ds.LUTDescriptor = b"\x01\x00\x00\x01\x00\x10" ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert "US" == ds[0x00283002].VR # If no PixelRepresentation AttributeError shall be raised ref_ds.PixelData = b"123" with pytest.raises( AttributeError, match=r"Failed to resolve ambiguous VR for tag " r"\(0028,3002\):.* 'PixelRepresentation'", ): correct_ambiguous_vr(deepcopy(ref_ds), False) def test_pixel_data(self): """Test correcting PixelData.""" ref_ds = Dataset() # If BitsAllocated > 8 then VR must be OW ref_ds.BitsAllocated = 16 ref_ds.PixelData = b"\x00\x01" # Little endian 256 ds = correct_ambiguous_vr(deepcopy(ref_ds), True) # Little endian assert b"\x00\x01" == ds.PixelData assert "OW" == ds[0x7FE00010].VR ds = correct_ambiguous_vr(deepcopy(ref_ds), False) # Big endian assert b"\x00\x01" == ds.PixelData assert "OW" == ds[0x7FE00010].VR # If BitsAllocated <= 8 then VR can be OB or OW: we set it to OB ref_ds = Dataset() ref_ds.BitsAllocated = 8 ref_ds.Rows = 2 ref_ds.Columns = 2 ref_ds.PixelData = b"\x01\x00\x02\x00\x03\x00\x04\x00" ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert b"\x01\x00\x02\x00\x03\x00\x04\x00" == ds.PixelData assert "OB" == ds[0x7FE00010].VR # If no BitsAllocated set then AttributesError is raised ref_ds = Dataset() ref_ds.PixelData = b"\x00\x01" # Big endian 1 with pytest.raises( AttributeError, match=r"Failed to resolve ambiguous VR for tag " r"\(7FE0,0010\):.* 'BitsAllocated'", ): correct_ambiguous_vr(deepcopy(ref_ds), True) def test_waveform_bits_allocated(self): """Test correcting elements which require WaveformBitsAllocated.""" ref_ds = Dataset() ref_ds.set_original_encoding(False, True) # If WaveformBitsAllocated > 8 then VR must be OW ref_ds.WaveformBitsAllocated = 16 ref_ds.WaveformData = b"\x00\x01" # Little endian 256 ds = correct_ambiguous_vr(deepcopy(ref_ds), True) # Little endian assert b"\x00\x01" == ds.WaveformData assert "OW" == ds[0x54001010].VR ds = correct_ambiguous_vr(deepcopy(ref_ds), False) # Big endian assert b"\x00\x01" == ds.WaveformData assert "OW" == ds[0x54001010].VR # If WaveformBitsAllocated == 8 then VR is OB or OW - set it to OB ref_ds.WaveformBitsAllocated = 8 ref_ds.WaveformData = b"\x01\x02" ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert b"\x01\x02" == ds.WaveformData assert "OB" == ds[0x54001010].VR # For implicit VR, VR is always OW ref_ds.set_original_encoding(True, True) ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert b"\x01\x02" == ds.WaveformData assert "OW" == ds[0x54001010].VR ref_ds.set_original_encoding(False, True) # If no WaveformBitsAllocated then AttributeError shall be raised ref_ds = Dataset() ref_ds.WaveformData = b"\x00\x01" # Big endian 1 with pytest.raises( AttributeError, match=r"Failed to resolve ambiguous VR for tag " r"\(5400,1010\):.* 'WaveformBitsAllocated'", ): correct_ambiguous_vr(deepcopy(ref_ds), True) def test_lut_descriptor(self): """Test correcting elements which require LUTDescriptor.""" ref_ds = Dataset() ref_ds.PixelRepresentation = 0 # If LUTDescriptor[0] is 1 then LUTData VR is 'US' ref_ds.LUTDescriptor = b"\x01\x00\x00\x01\x10\x00" # 1\256\16 ref_ds.LUTData = b"\x00\x01" # Little endian 256 ds = correct_ambiguous_vr(deepcopy(ref_ds), True) # Little endian assert 1 == ds.LUTDescriptor[0] assert "US" == ds[0x00283002].VR assert 256 == ds.LUTData assert "US" == ds[0x00283006].VR # If LUTDescriptor[0] is not 1 then LUTData VR is 'OW' ref_ds.LUTDescriptor = b"\x02\x00\x00\x01\x10\x00" # 2\256\16 ref_ds.LUTData = b"\x00\x01\x00\x02" ds = correct_ambiguous_vr(deepcopy(ref_ds), True) # Little endian assert 2 == ds.LUTDescriptor[0] assert "US" == ds[0x00283002].VR assert b"\x00\x01\x00\x02" == ds.LUTData assert "OW" == ds[0x00283006].VR # If no LUTDescriptor then raise AttributeError ref_ds = Dataset() ref_ds.LUTData = b"\x00\x01" with pytest.raises( AttributeError, match=r"Failed to resolve ambiguous VR for tag " r"\(0028,3006\):.* 'LUTDescriptor'", ): correct_ambiguous_vr(deepcopy(ref_ds), True) def test_overlay(self): """Test correcting OverlayData""" # VR must be 'OW' ref_ds = Dataset() ref_ds.set_original_encoding(True, True) ref_ds.add(DataElement(0x60003000, "OB or OW", b"\x00")) ref_ds.add(DataElement(0x601E3000, "OB or OW", b"\x00")) ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert "OW" == ds[0x60003000].VR assert "OW" == ds[0x601E3000].VR assert "OB or OW" == ref_ds[0x60003000].VR assert "OB or OW" == ref_ds[0x601E3000].VR ref_ds.set_original_encoding(False, True) ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert "OW" == ds[0x60003000].VR assert "OB or OW" == ref_ds[0x60003000].VR def test_sequence(self): """Test correcting elements in a sequence.""" ref_ds = Dataset() ref_ds.BeamSequence = [Dataset()] ref_ds.BeamSequence[0].PixelRepresentation = 0 ref_ds.BeamSequence[0].SmallestValidPixelValue = b"\x00\x01" ref_ds.BeamSequence[0].BeamSequence = [Dataset()] ref_ds.BeamSequence[0].BeamSequence[0].PixelRepresentation = 0 ref_ds.BeamSequence[0].BeamSequence[0].SmallestValidPixelValue = b"\x00\x01" ds = correct_ambiguous_vr(deepcopy(ref_ds), True) assert ds.BeamSequence[0].SmallestValidPixelValue == 256 assert ds.BeamSequence[0][0x00280104].VR == "US" assert ds.BeamSequence[0].BeamSequence[0].SmallestValidPixelValue == 256 assert ds.BeamSequence[0].BeamSequence[0][0x00280104].VR == "US" def test_write_new_ambiguous(self): """Regression test for #781""" ds = Dataset() ds.SmallestImagePixelValue = 0 assert ds[0x00280106].VR == "US or SS" ds.PixelRepresentation = 0 ds.LUTDescriptor = [1, 0] assert ds[0x00283002].VR == "US or SS" ds.LUTData = 0 assert ds[0x00283006].VR == "US or OW" ds.save_as(DicomBytesIO(), implicit_vr=True) assert ds[0x00280106].VR == "US" assert ds.SmallestImagePixelValue == 0 assert ds[0x00283006].VR == "US" assert ds.LUTData == 0 assert ds[0x00283002].VR == "US" assert ds.LUTDescriptor == [1, 0] def dataset_with_modality_lut_sequence(self, pixel_repr): ds = Dataset() ds.PixelRepresentation = pixel_repr ds.ModalityLUTSequence = [Dataset()] ds.ModalityLUTSequence[0].LUTDescriptor = [0, 0, 16] ds.ModalityLUTSequence[0].LUTExplanation = None ds.ModalityLUTSequence[0].ModalityLUTType = "US" # US = unspecified ds.ModalityLUTSequence[0].LUTData = b"\x0000\x149a\x1f1c\xc2637" return ds def test_ambiguous_element_in_sequence_explicit_using_attribute(self): """Test that writing a sequence with an ambiguous element as explicit transfer syntax works if accessing the tag via keyword.""" # regression test for #804 ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "US" == ds.ModalityLUTSequence[0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "SS" == ds.ModalityLUTSequence[0][0x00283002].VR def test_ambiguous_element_in_sequence_explicit_using_index(self): """Test that writing a sequence with an ambiguous element as explicit transfer syntax works if accessing the tag via the tag number.""" ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "US" == ds[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "SS" == ds[0x00283000][0][0x00283002].VR def test_ambiguous_element_in_sequence_implicit_using_attribute(self): """Test that reading a sequence with an ambiguous element from a file with implicit transfer syntax works if accessing the tag via keyword.""" # regression test for #804 ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "US" == ds.ModalityLUTSequence[0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "SS" == ds.ModalityLUTSequence[0][0x00283002].VR def test_ambiguous_element_in_sequence_implicit_using_index(self): """Test that reading a sequence with an ambiguous element from a file with implicit transfer syntax works if accessing the tag via the tag number.""" ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "US" == ds[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "SS" == ds[0x00283000][0][0x00283002].VR def test_ambiguous_element_sequence_implicit_nearest(self): """Test that the nearest dataset with pixel rep to the ambiguous element is used for correction. """ ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) ds.ModalityLUTSequence[0].PixelRepresentation = 1 fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "SS" == ds[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) ds.ModalityLUTSequence[0].PixelRepresentation = 0 fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) assert "US" == ds[0x00283000][0][0x00283002].VR def test_ambiguous_element_sequence_explicit_nearest(self): """Test that the nearest dataset with pixel rep to the ambiguous element is used for correction. """ ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) ds.ModalityLUTSequence[0].PixelRepresentation = 1 fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "SS" == ds[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) ds.ModalityLUTSequence[0].PixelRepresentation = 0 fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) assert "US" == ds[0x00283000][0][0x00283002].VR def test_pickle_deepcopy_implicit(self): """Test we can correct VR after pickling and deepcopy.""" ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) ds.filename = None ds2 = deepcopy(ds) s = pickle.dumps({"ds": ds}) ds = pickle.loads(s)["ds"] assert "US" == ds[0x00283000][0][0x00283002].VR assert "US" == ds2[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) ds.filename = None ds2 = deepcopy(ds) s = pickle.dumps({"ds": ds}) ds = pickle.loads(s)["ds"] assert "SS" == ds[0x00283000][0][0x00283002].VR assert "SS" == ds2[0x00283000][0][0x00283002].VR def test_pickle_deepcopy_explicit(self): """Test we can correct VR after pickling and deepcopy.""" ds = self.dataset_with_modality_lut_sequence(pixel_repr=0) fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) ds.filename = None ds2 = deepcopy(ds) s = pickle.dumps({"ds": ds}) ds = pickle.loads(s)["ds"] assert "US" == ds[0x00283000][0][0x00283002].VR assert "US" == ds2[0x00283000][0][0x00283002].VR ds = self.dataset_with_modality_lut_sequence(pixel_repr=1) fp = BytesIO() ds.save_as(fp, implicit_vr=False) ds = dcmread(fp, force=True) ds.filename = None ds2 = deepcopy(ds) s = pickle.dumps({"ds": ds}) ds = pickle.loads(s)["ds"] assert "SS" == ds[0x00283000][0][0x00283002].VR assert "SS" == ds2[0x00283000][0][0x00283002].VR def test_parent_change_implicit(self): """Test ambiguous VR correction when parent is changed.""" ds = Dataset() ds.PixelRepresentation = 0 ds.BeamSequence = [Dataset()] # Nesting Modality LUT Sequence to avoid raw -> elem conversion seq = ds.BeamSequence[0] seq.ModalityLUTSequence = [Dataset()] seq.ModalityLUTSequence[0].LUTDescriptor = [0, 0, 16] seq.ModalityLUTSequence[0].LUTExplanation = None seq.ModalityLUTSequence[0].ModalityLUTType = "US" # US = unspecified seq.ModalityLUTSequence[0].LUTData = b"\x0000\x149a\x1f1c\xc2637" fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) ds1 = dcmread(ct_name) ds1.PixelRepresentation = 1 ds1.BeamSequence = ds.BeamSequence assert ds1._pixel_rep == 1 assert ds1["BeamSequence"][0]._pixel_rep == 1 assert isinstance(ds1.BeamSequence[0]._dict[0x00283000], RawDataElement) modality_seq = ds1.BeamSequence[0].ModalityLUTSequence assert modality_seq[0]._pixel_rep == 1 assert "SS" == ds1.BeamSequence[0][0x00283000][0][0x00283002].VR def test_pixel_repr_none_in_nearer_implicit(self): """Test a pixel representation of None in a nearer dataset.""" ds = self.dataset_with_modality_lut_sequence(0) ds.ModalityLUTSequence[0].PixelRepresentation = None fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) item = ds.ModalityLUTSequence[0] assert ds._pixel_rep == 0 assert item._pixel_rep == 0 assert "US" == item[0x00283002].VR def test_pixel_repr_none_in_further_implicit(self): """Test a pixel representation of None in a further dataset.""" ds = self.dataset_with_modality_lut_sequence(None) ds.ModalityLUTSequence[0].PixelRepresentation = 0 fp = BytesIO() ds.save_as(fp, implicit_vr=True) ds = dcmread(fp, force=True) item = ds.ModalityLUTSequence[0] assert not hasattr(ds, "_pixel_rep") assert item._pixel_rep == 0 assert "US" == item[0x00283002].VR class TestCorrectAmbiguousVRElement: """Test filewriter.correct_ambiguous_vr_element""" def test_not_ambiguous(self): """Test no change in element if not ambiguous""" elem = DataElement(0x60003000, "OB", b"\x00") out = correct_ambiguous_vr_element(elem, Dataset(), True) assert out.VR == "OB" assert out.tag == 0x60003000 assert out.value == b"\x00" def test_not_ambiguous_raw_data_element(self): """Test no change in raw data element if not ambiguous""" elem = RawDataElement(0x60003000, "OB", 1, b"\x00", 0, True, True) out = correct_ambiguous_vr_element(elem, Dataset(), True) assert out == elem assert isinstance(out, RawDataElement) def test_correct_ambiguous_data_element(self): """Test correct ambiguous US/SS element""" ds = Dataset() ds.PixelPaddingValue = b"\xfe\xff" out = correct_ambiguous_vr_element(ds[0x00280120], ds, True) # assume US if PixelData is not set assert "US" == out.VR ds = Dataset() ds.PixelPaddingValue = b"\xfe\xff" ds.PixelData = b"3456" with pytest.raises( AttributeError, match=r"Failed to resolve ambiguous VR for tag " r"\(0028,0120\):.* 'PixelRepresentation'", ): correct_ambiguous_vr_element(ds[0x00280120], ds, True) ds.PixelRepresentation = 0 out = correct_ambiguous_vr_element(ds[0x00280120], ds, True) assert out.VR == "US" assert out.value == 0xFFFE def test_correct_ambiguous_raw_data_element(self): """Test that correcting ambiguous US/SS raw data element works and converts it to a data element""" ds = Dataset() elem = RawDataElement(0x00280120, "US or SS", 2, b"\xfe\xff", 0, True, True) ds[0x00280120] = elem ds.PixelRepresentation = 0 out = correct_ambiguous_vr_element(elem, ds, True) assert isinstance(out, DataElement) assert out.VR == "US" assert out.value == 0xFFFE def test_empty_value(self): """Regression test for #1193: empty value raises exception.""" ds = Dataset() elem = RawDataElement(0x00280106, "US or SS", 0, None, 0, True, True) ds[0x00280106] = elem out = correct_ambiguous_vr_element(elem, ds, True) assert isinstance(out, DataElement) assert out.VR == "US" ds.LUTDescriptor = [1, 1, 1] elem = RawDataElement(0x00283006, "US or SS", 0, None, 0, True, True) assert out.value is None ds[0x00283006] = elem out = correct_ambiguous_vr_element(elem, ds, True) assert isinstance(out, DataElement) assert out.VR == "US" assert out.value is None class TestWriteAmbiguousVR: """Attempt to write data elements with ambiguous VR.""" def setup_method(self): # Create a dummy (in memory) file to write to self.fp = DicomBytesIO() self.fp.is_implicit_VR = False self.fp.is_little_endian = True def test_write_explicit_vr_raises(self): """Test writing explicit vr raises exception if unsolved element.""" ds = Dataset() ds.PerimeterValue = b"\x00\x01" with pytest.raises(ValueError): write_dataset(self.fp, ds) def test_write_explicit_vr_little_endian(self): """Test writing explicit little data for ambiguous elements.""" # Create a dataset containing element with ambiguous VRs ref_ds = Dataset() ref_ds.PixelRepresentation = 0 ref_ds.SmallestValidPixelValue = b"\x00\x01" # Little endian 256 fp = BytesIO() file_ds = FileDataset(fp, ref_ds) file_ds.save_as(fp, implicit_vr=False) fp.seek(0) ds = read_dataset(fp, False, True, parent_encoding="latin1") assert 256 == ds.SmallestValidPixelValue assert "US" == ds[0x00280104].VR msg = "'Dataset.read_implicit_vr' will be removed in v4.0" with pytest.warns(DeprecationWarning, match=msg): assert not ds.read_implicit_vr msg = "'Dataset.read_little_endian' will be removed in v4.0" with pytest.warns(DeprecationWarning, match=msg): assert ds.read_little_endian msg = "'Dataset.read_encoding' will be removed in v4.0" with pytest.warns(DeprecationWarning, match=msg): assert ds.read_encoding == "latin1" def test_write_explicit_vr_big_endian(self): """Test writing explicit big data for ambiguous elements.""" # Create a dataset containing element with ambiguous VRs ds = Dataset() ds.PixelRepresentation = 1 ds.SmallestValidPixelValue = b"\x00\x01" # Big endian 1 ds.SpecificCharacterSet = b"ISO_IR 192" fp = BytesIO() ds.save_as(fp, implicit_vr=False, little_endian=False) fp.seek(0) ds = read_dataset(fp, False, False) assert 1 == ds.SmallestValidPixelValue assert "SS" == ds[0x00280104].VR with pytest.warns(DeprecationWarning): assert not ds.read_implicit_vr assert not ds.read_little_endian msg = "'Dataset.read_encoding' will be removed in v4.0" with pytest.warns(DeprecationWarning, match=msg): assert ["UTF8"] == ds.read_encoding class TestScratchWrite: """Simple dataset from scratch, written in all endian/VR combinations""" def setup_method(self): # Create simple dataset for all tests ds = Dataset() ds.PatientName = "Name^Patient" ds.InstanceNumber = None # Set up a simple nested sequence # first, the innermost sequence subitem1 = Dataset() subitem1.ContourNumber = 1 subitem1.ContourData = ["2", "4", "8", "16"] subitem2 = Dataset() subitem2.ContourNumber = 2 subitem2.ContourData = ["32", "64", "128", "196"] sub_ds = Dataset() sub_ds.ContourSequence = Sequence((subitem1, subitem2)) # Now the top-level sequence ds.ROIContourSequence = Sequence((sub_ds,)) # Comma to make one-tuple # Store so each test can use it self.ds = ds def compare_write(self, hex_std, file_ds): """Write file and compare with expected byte string :arg hex_std: the bytes which should be written, as space separated hex :arg file_ds: a FileDataset instance containing the dataset to write """ out_filename = "scratch.dcm" file_ds.save_as(out_filename) std = hex2bytes(hex_std) with open(out_filename, "rb") as f: bytes_written = f.read() # print "std :", bytes2hex(std) # print "written:", bytes2hex(bytes_written) same, pos = bytes_identical(std, bytes_written) assert same if os.path.exists(out_filename): os.remove(out_filename) # get rid of the file def testImpl_LE_deflen_write(self): """Scratch Write for implicit VR little endian, defined length SQs""" file_ds = FileDataset("test", self.ds) self.compare_write(impl_LE_deflen_std_hex, file_ds) class TestDCMWrite: """Tests for dcmwrite()""" def test_implicit_big_raises(self): """Test implicit VR big endian encoding raises exception.""" msg = "Implicit VR and big endian is not a valid encoding combination" with pytest.raises(ValueError, match=msg): dcmwrite(DicomBytesIO(), Dataset(), implicit_vr=True, little_endian=False) def test_implicit_big_force_encoding(self): """Test implicit VR big endian encoding with force_encoding""" fp = DicomBytesIO() ds = Dataset() ds.PatientName = "Foo" dcmwrite(fp, ds, implicit_vr=True, little_endian=False, force_encoding=True) fp.seek(0) assert fp.getvalue() == b"\x00\x10\x00\x10\x00\x00\x00\x04\x46\x6f\x6f\x20" def test_bad_filename(self): """Test that TypeError is raised for a bad filename.""" ds = dcmread(ct_name) with pytest.raises( TypeError, match=( "dcmwrite: Expected a file path, file-like or writeable " "buffer, but got NoneType" ), ): ds.save_as(None) with pytest.raises( TypeError, match=( "dcmwrite: Expected a file path, file-like or writeable " "buffer, but got int" ), ): ds.save_as(42) def test_write_like_original_warns(self): """Test deprecation warning for write_like_original.""" fp = DicomBytesIO() ds = Dataset() ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian ds.SOPClassUID = "1.2" ds.SOPInstanceUID = "1.2.3" msg = ( "'write_like_original' is deprecated and will be removed in " "v4.0, please use 'enforce_file_format' instead" ) with pytest.warns(DeprecationWarning, match=msg): dcmwrite(fp, ds, write_like_original=False) with pytest.warns(DeprecationWarning, match=msg): dcmwrite(fp, ds, write_like_original=True) with pytest.warns(DeprecationWarning, match=msg): dcmwrite(fp, ds, False) with pytest.warns(DeprecationWarning, match=msg): dcmwrite(fp, ds, True) def test_extra_kwargs_raises(self): """Test unknown kwargs raise exception.""" msg = r"Invalid keyword argument\(s\) for dcmwrite\(\): is_implicit_VR" with pytest.warns(DeprecationWarning): with pytest.raises(TypeError, match=msg): dcmwrite( DicomBytesIO(), Dataset(), implicit_vr=False, write_like_original=True, is_implicit_VR=False, ) def test_extra_args_raises(self): """Test unknown kwargs raise exception.""" msg = r"dcmwrite\(\) takes from 2 to 3 positional arguments but 4 were given" with pytest.raises(TypeError, match=msg): dcmwrite( DicomBytesIO(), Dataset(), True, False, is_implicit_VR=False, ) def test_position_and_keyword_raises(self): """Test position and keyword arg raises exception.""" msg = ( "'write_like_original' cannot be used as both a positional and " "keyword argument" ) with pytest.raises(TypeError, match=msg): dcmwrite( DicomBytesIO(), Dataset(), True, implicit_vr=False, write_like_original=True, is_implicit_VR=False, ) def test_command_set_raises(self): """Test exception if command set elements present.""" ds = Dataset() ds.MessageID = 1 msg = ( r"Command Set elements \(0000,eeee\) are not allowed when using " r"dcmwrite\(\), use write_dataset\(\) instead" ) with pytest.raises(ValueError, match=msg): dcmwrite( DicomBytesIO(), ds, implicit_vr=True, enforce_file_format=True, ) def test_file_meta_raises(self): """Test file meta elements in dataset raises exception.""" ds = Dataset() ds.TransferSyntaxUID = ImplicitVRLittleEndian msg = ( r"File Meta Information Group elements \(0002,eeee\) must be in a " r"FileMetaDataset instance in the 'Dataset.file_meta' attribute" ) with pytest.raises(ValueError, match=msg): dcmwrite(DicomBytesIO(), ds, implicit_vr=True) def test_dataset_file_meta_unchanged(self): """Test writing the dataset doesn't change its file_meta.""" # Dataset has no file_meta ds = Dataset() ds.SOPClassUID = "1.2" ds.SOPInstanceUID = "1.2.3" fp = DicomBytesIO() dcmwrite(fp, ds, implicit_vr=True) assert not hasattr(ds, "file_meta") dcmwrite(fp, ds, implicit_vr=True, enforce_file_format=True) assert not hasattr(ds, "file_meta") # Dataset has file_meta ds.file_meta = FileMetaDataset() ds.file_meta.ImplementationVersionName = "Foo" dcmwrite(fp, ds, implicit_vr=True) assert len(ds.file_meta) == 1 assert ds.file_meta.ImplementationVersionName == "Foo" dcmwrite(fp, ds, implicit_vr=True, enforce_file_format=True) assert len(ds.file_meta) == 1 assert ds.file_meta.ImplementationVersionName == "Foo" def test_preamble_custom(self): """Test that a custom preamble is written correctly when present.""" ds = dcmread(ct_name) ds.preamble = b"\x01\x02\x03\x04" + b"\x00" * 124 fp = DicomBytesIO() dcmwrite(fp, ds) fp.seek(0) assert b"\x01\x02\x03\x04" + b"\x00" * 124 == fp.read(128) def test_preamble_default(self): """Test that the default preamble is written correctly when present.""" ds = dcmread(ct_name) ds.preamble = b"\x00" * 128 fp = DicomBytesIO() dcmwrite(fp, ds) fp.seek(0) assert b"\x00" * 128 == fp.read(128) def test_convert_big_to_little(self): """Test simple conversion from big to little endian.""" # Note that O* and UN elements are not converted ds = dcmread(mr_bigendian_name) assert not ds.original_encoding[1] ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds) fp.seek(0) ds_out = dcmread(fp) assert ds_out.original_encoding[1] # pixel data is not converted automatically ds_explicit = dcmread(mr_name) del ds_out.PixelData del ds_explicit.PixelData for elem_in, elem_out in zip(ds_explicit, ds_out): assert elem_in == elem_out def test_convert_little_to_big(self): """Test simple conversion from little to big endian.""" # Note that O* and UN elements are not converted ds = dcmread(mr_name) assert ds.original_encoding[1] ds.file_meta.TransferSyntaxUID = ExplicitVRBigEndian fp = DicomBytesIO() dcmwrite(fp, ds, little_endian=False) fp.seek(0) ds_out = dcmread(fp) assert not ds_out.original_encoding[1] # pixel data is not converted automatically ds_explicit = dcmread(mr_bigendian_name) del ds_out.PixelData del ds_explicit.PixelData for elem_in, elem_out in zip(ds_explicit, ds_out): assert elem_in == elem_out def test_raw_elements_preserved_implicit_vr(self): """Test writing the dataset preserves raw elements.""" ds = dcmread(rtplan_name) # raw data elements after reading assert ds.get_item(0x00080070).is_raw # Manufacturer assert ds.get_item(0x00100020).is_raw # Patient ID assert ds.get_item(0x300A0006).is_raw # RT Plan Date assert ds.get_item(0x300A0010).is_raw # Dose Reference Sequence dcmwrite(DicomBytesIO(), ds, enforce_file_format=True) # data set still contains raw data elements after writing assert ds.get_item(0x00080070).is_raw # Manufacturer assert ds.get_item(0x00100020).is_raw # Patient ID assert ds.get_item(0x300A0006).is_raw # RT Plan Date assert ds.get_item(0x300A0010).is_raw # Dose Reference Sequence def test_raw_elements_preserved_explicit_vr(self): """Test writing the dataset preserves raw elements.""" ds = dcmread(color_pl_name) # raw data elements after reading assert ds.get_item(0x00080070).is_raw # Manufacturer assert ds.get_item(0x00100010).is_raw # Patient Name assert ds.get_item(0x00080030).is_raw # Study Time assert ds.get_item(0x00089215).is_raw # Derivation Code Sequence dcmwrite(DicomBytesIO(), ds, enforce_file_format=True) # data set still contains raw data elements after writing assert ds.get_item(0x00080070).is_raw # Manufacturer assert ds.get_item(0x00100010).is_raw # Patient Name assert ds.get_item(0x00080030).is_raw # Study Time assert ds.get_item(0x00089215).is_raw # Derivation Code Sequence def test_convert_implicit_to_explicit_vr(self): # make sure conversion from implicit to explicit VR works # without private tags ds = dcmread(mr_implicit_name) assert ds.is_implicit_VR ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds, enforce_file_format=True) fp.seek(0) ds_out = dcmread(fp) assert not ds_out.is_implicit_VR ds_explicit = dcmread(mr_name) for elem_in, elem_out in zip(ds_explicit, ds_out): assert elem_in == elem_out def test_convert_implicit_to_explicit_vr_using_destination(self): # make sure conversion from implicit to explicit VR works # if setting the property in the destination ds = dcmread(mr_implicit_name) assert ds.is_implicit_VR ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds, enforce_file_format=True) fp.seek(0) ds_out = dcmread(fp) assert not ds_out.is_implicit_VR ds_explicit = dcmread(mr_name) for elem_in, elem_out in zip(ds_explicit, ds_out): assert elem_in == elem_out def test_convert_explicit_to_implicit_vr(self): # make sure conversion from explicit to implicit VR works # without private tags ds = dcmread(mr_name) assert not ds.is_implicit_VR ds.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds, enforce_file_format=True) fp.seek(0) ds_out = dcmread(fp) assert ds_out.is_implicit_VR ds_implicit = dcmread(mr_implicit_name) for elem_in, elem_out in zip(ds_implicit, ds_out): assert elem_in == elem_out def test_changed_character_set(self): """Make sure that a changed character set is reflected in the written data elements.""" ds = dcmread(multiPN_name) # Latin 1 original encoding assert ds.get_item(0x00100010).value == b"Buc^J\xe9r\xf4me" # change encoding to UTF-8 ds.SpecificCharacterSet = "ISO_IR 192" fp = DicomBytesIO() dcmwrite(fp, ds, enforce_file_format=True) fp.seek(0) ds_out = dcmread(fp) # patient name shall be UTF-8 encoded assert ds_out.get_item(0x00100010).value == b"Buc^J\xc3\xa9r\xc3\xb4me" # decoded values shall be the same as in original dataset for elem_in, elem_out in zip(ds, ds_out): assert elem_in == elem_out def test_private_tag_vr_from_implicit_data(self): """Test that private tags have the correct VR if converting a dataset from implicit to explicit VR. """ # convert a dataset with private tags to Implicit VR ds_orig = dcmread(ct_name) assert not ds_orig.is_implicit_VR ds_orig.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds_orig, enforce_file_format=True) fp.seek(0) ds_impl = dcmread(fp) # convert the dataset back to explicit VR - private tag VR now unknown assert ds_impl.is_implicit_VR ds_impl.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds_impl, enforce_file_format=True) fp.seek(0) ds_expl = dcmread(fp) assert not ds_expl.is_implicit_VR assert ds_expl[(0x0009, 0x0010)].VR == "LO" # private creator assert ds_expl[(0x0009, 0x1001)].VR == "LO" assert ds_expl[(0x0009, 0x10E7)].VR == "UL" assert ds_expl[(0x0043, 0x1010)].VR == "US" def test_convert_rgb_from_implicit_to_explicit_vr(self, no_numpy_use): """Test converting an RGB dataset from implicit to explicit VR and vice verse.""" ds_orig = dcmread(sc_rgb_name) assert not ds_orig.is_implicit_VR ds_orig.file_meta.TransferSyntaxUID = ImplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds_orig, enforce_file_format=True) fp.seek(0) ds_impl = dcmread(fp) assert ds_impl.is_implicit_VR for elem_orig, elem_conv in zip(ds_orig, ds_impl): assert elem_orig.value == elem_conv.value assert "OW" == ds_impl[0x7FE00010].VR ds_impl.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian fp = DicomBytesIO() dcmwrite(fp, ds_impl, enforce_file_format=True) fp.seek(0) # used to raise, see #620 ds_expl = dcmread(fp) assert not ds_expl.is_implicit_VR for elem_orig, elem_conv in zip(ds_orig, ds_expl): assert elem_orig.value == elem_conv.value def test_overwrite(self): """Test the overwrite argument""" ds = dcmread(ct_name) patient_name = ds.PatientName with tempfile.TemporaryDirectory() as tdir: p = Path(tdir) / "foo.dcm" p.touch() assert p.exists() msg = r"File exists: '(.*)foo.dcm'" with pytest.raises(FileExistsError, match=msg): dcmwrite(p, ds, overwrite=False) dcmwrite(p, ds, overwrite=True) assert dcmread(p).PatientName == patient_name class TestDCMWrite_EnforceFileFormat: """Tests for dcmwrite(enforce_file_format=True)""" def test_force_encoding_raises(self): """Test that force_encoding raises.""" msg = "'force_encoding' cannot be used with 'enforce_file_format'" with pytest.raises(ValueError, match=msg): dcmwrite( DicomBytesIO(), Dataset(), force_encoding=True, enforce_file_format=True, ) def test_preamble_default(self): """Test that the default preamble is written correctly when present.""" fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = b"\x00" * 128 ds.save_as(fp, enforce_file_format=True) fp.seek(0) assert fp.read(128) == b"\x00" * 128 def test_preamble_custom(self): """Test that a custom preamble is written correctly when present.""" fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = b"\x01\x02\x03\x04" + b"\x00" * 124 ds.save_as(fp, enforce_file_format=True) fp.seek(0) assert fp.read(128) == b"\x01\x02\x03\x04" + b"\x00" * 124 def test_no_preamble(self): """Test that a default preamble is written when absent.""" fp = DicomBytesIO() ds = dcmread(ct_name) del ds.preamble ds.save_as(fp, enforce_file_format=True) fp.seek(0) assert fp.read(128) == b"\x00" * 128 fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = None ds.save_as(fp, enforce_file_format=True) fp.seek(0) assert fp.read(128) == b"\x00" * 128 def test_bad_preamble(self): """Test that ValueError is raised when preamble is bad.""" ds = dcmread(ct_name) msg = "'FileDataset.preamble' must be 128-bytes long" for preamble in (b"\x00" * 127, b"\x00" * 129): ds.preamble = preamble with pytest.raises(ValueError, match=msg): ds.save_as(DicomBytesIO(), enforce_file_format=True) def test_prefix(self): """Test that the 'DICM' prefix is written with preamble.""" fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = b"\x00" * 128 ds.save_as(fp, enforce_file_format=True) fp.seek(128) assert fp.read(4) == b"DICM" fp = DicomBytesIO() ds = dcmread(ct_name) ds.preamble = None ds.save_as(fp, enforce_file_format=True) fp.seek(128) assert fp.read(4) == b"DICM" def test_file_meta_none(self): """Test writing a dataset with no file_meta""" fp = DicomBytesIO() version = "PYDICOM " + base_version ds = dcmread(rtplan_name) transfer_syntax = ds.file_meta.TransferSyntaxUID ds.file_meta = FileMetaDataset() ds.save_as(fp, enforce_file_format=True) fp.seek(0) out = dcmread(fp) assert out.file_meta.MediaStorageSOPClassUID == ds.SOPClassUID assert out.file_meta.MediaStorageSOPInstanceUID == ds.SOPInstanceUID assert out.file_meta.ImplementationClassUID == PYDICOM_IMPLEMENTATION_UID assert out.file_meta.ImplementationVersionName == version assert out.file_meta.TransferSyntaxUID == transfer_syntax fp = DicomBytesIO() del ds.file_meta ds.save_as(fp, enforce_file_format=True) fp.seek(0) out = dcmread(fp) assert out.file_meta.MediaStorageSOPClassUID == ds.SOPClassUID assert out.file_meta.MediaStorageSOPInstanceUID == ds.SOPInstanceUID assert out.file_meta.ImplementationClassUID == PYDICOM_IMPLEMENTATION_UID assert out.file_meta.ImplementationVersionName == version assert out.file_meta.TransferSyntaxUID == transfer_syntax def test_file_meta_no_syntax(self): """Test a file meta with no transfer syntax.""" ds = Dataset() ds.SOPClassUID = "1.2" ds.SOPInstanceUID = "1.2.3" fp = DicomBytesIO() dcmwrite(fp, ds, implicit_vr=True, little_endian=True, enforce_file_format=True) fp.seek(0) out = dcmread(fp) assert out.file_meta.TransferSyntaxUID == ImplicitVRLittleEndian fp = DicomBytesIO() dcmwrite( fp, ds, implicit_vr=False, little_endian=False, enforce_file_format=True ) fp.seek(0) out = dcmread(fp) assert out.file_meta.TransferSyntaxUID == ExplicitVRBigEndian msg = ( r"Required File Meta Information elements are either missing " r"or have an empty value: \(0002,0010\) Transfer Syntax UID" ) with pytest.raises(AttributeError, match=msg): dcmwrite( fp, ds, implicit_vr=False, little_endian=True, enforce_file_format=True ) def test_file_meta_sop_class_sop_instance(self): """Test a file meta with no Media Storage SOP Class/Instance UID.""" # Test values overwritten if missing or None ds = Dataset() ds.file_meta = FileMetaDataset() ds.SOPClassUID = "1.2" ds.SOPInstanceUID = "1.2.3" fp = DicomBytesIO() dcmwrite(fp, ds, implicit_vr=True, enforce_file_format=True) fp.seek(0) out = dcmread(fp) assert out.file_meta.MediaStorageSOPClassUID == "1.2" assert out.file_meta.MediaStorageSOPInstanceUID == "1.2.3" ds.file_meta.MediaStorageSOPClassUID = None ds.file_meta.MediaStorageSOPInstanceUID = None fp = DicomBytesIO() dcmwrite(fp, ds, implicit_vr=True, enforce_file_format=True) fp.seek(0) out = dcmread(fp) assert out.file_meta.MediaStorageSOPClassUID == "1.2" assert out.file_meta.MediaStorageSOPInstanceUID == "1.2.3" # Test value not overwritten if None in dataset ds.SOPClassUID = None ds.SOPInstanceUID = None ds.file_meta.MediaStorageSOPClassUID = "1.2" ds.file_meta.MediaStorageSOPInstanceUID = "1.2.3" fp = DicomBytesIO() dcmwrite( fp, ds, implicit_vr=False, little_endian=False, enforce_file_format=True ) fp.seek(0) out = dcmread(fp) assert out.file_meta.MediaStorageSOPClassUID == "1.2" assert out.file_meta.MediaStorageSOPInstanceUID == "1.2.3" # Test exception if missing or None del ds.file_meta msg = ( r"Required File Meta Information elements are either missing " r"or have an empty value: \(0002,0002\) Media Storage SOP Class " r"UID, \(0002,0003\) Media Storage SOP Instance UID" ) with pytest.raises(AttributeError, match=msg): dcmwrite(fp, ds, implicit_vr=True, enforce_file_format=True) class TestDetermineEncoding: """Tests for _determine_encoding().""" def test_force_encoding_raises(self): """Test exception raised if force_encoding used without args.""" ds = Dataset() ds._read_implicit = True ds._read_little = True tsyntax = ImplicitVRLittleEndian msg = ( "'implicit_vr' and 'little_endian' are required if " "'force_encoding' is used" ) with pytest.raises(ValueError, match=msg): _determine_encoding(ds, tsyntax, None, True, True) with pytest.raises(ValueError, match=msg): _determine_encoding(ds, tsyntax, True, None, True) def test_force_encoding(self): """Test results with force_encoding are as expected.""" ds = Dataset() ds._is_implicit_VR = True ds._is_little_endian = True tsyntax = ImplicitVRLittleEndian result = _determine_encoding(ds, tsyntax, False, False, True) assert result == (False, False) def test_transfer_syntax(self): """Test when transfer syntax is available.""" ds = Dataset() ds._is_implicit_VR = False ds._is_little_endian = True tsyntax = ImplicitVRLittleEndian result = _determine_encoding(ds, tsyntax, True, None, False) assert result == (True, True) def test_args(self): """Test fallback to args when transfer syntax not available.""" ds = Dataset() ds._is_implicit_VR = False ds._is_little_endian = True result = _determine_encoding(ds, None, True, False, False) assert result == (True, False) def test_dataset(self): """Test fallback to dataset when transfer syntax and args not available.""" ds = Dataset() ds._is_implicit_VR = False ds._is_little_endian = True result = _determine_encoding(ds, None, None, False, False) assert result == (False, True) def test_original(self): """Test fallback to original when tsyntax, args and ds attr not available.""" ds = Dataset() ds._read_implicit = False ds._read_little = True result = _determine_encoding(ds, None, None, False, False) assert result == (False, True) def test_none_raises(self): """Test exception raised if unable to determine encoding.""" msg = ( "Unable to determine the encoding to use for writing the dataset, " "please set the file meta's Transfer Syntax UID or use the " "'implicit_vr' and 'little_endian' arguments" ) with pytest.raises(ValueError, match=msg): _determine_encoding(Dataset(), None, None, None, False) def test_private_transfer_syntax_raises(self): """Test private syntax raises if no args.""" syntax = UID("1.2.3") msg = ( "The 'implicit_vr' and 'little_endian' arguments are required " "when using a private transfer syntax" ) with pytest.raises(ValueError, match=msg): _determine_encoding(Dataset(), syntax, None, None, False) def test_private_transfer_syntax(self): """Test private syntax raises if no args.""" syntax = UID("1.2.3") result = _determine_encoding(Dataset(), syntax, True, True, False) assert result == (True, True) def test_invalid_transfer_syntax_raises(self): """Test public non-transfer syntax raises.""" syntax = CTImageStorage msg = ( "The Transfer Syntax UID 'CT Image Storage' is not a valid " "transfer syntax" ) with pytest.raises(ValueError, match=msg): _determine_encoding(Dataset(), syntax, False, True, False) def test_mismatch_raises(self): """Test mismatch between args and transfer syntax raises.""" ds = Dataset() ds._is_implicit_VR = False ds._is_little_endian = True tsyntax = ImplicitVRLittleEndian msg = ( "The 'little_endian' value is not consistent with the required " "endianness for the 'Implicit VR Little Endian' transfer syntax" ) with pytest.raises(ValueError, match=msg): _determine_encoding(ds, tsyntax, True, False, False) msg = ( "The 'implicit_vr' value is not consistent with the required " "VR encoding for the 'Implicit VR Little Endian' transfer syntax" ) with pytest.raises(ValueError, match=msg): _determine_encoding(ds, tsyntax, False, True, False) class TestWriteDataset: """Tests for write_dataset()""" def test_encoding_buffer(self): """Test buffer.is_implicit_VR, buffer.is_little_endian used.""" ds = Dataset() ds.PatientName = "Foo" ds._read_little = False ds._read_implicit = False ds._is_little_endian = False ds._is_implicit_VR = False fp = DicomBytesIO() fp.is_implicit_VR = True fp.is_little_endian = True # Should use fp's encoding - implicit little write_dataset(fp, ds) assert fp.getvalue()[:8] == b"\x10\x00\x10\x00\x04\x00\x00\x00" def test_encoding_ds_attr(self): """Tests ds.is_implicit_VR, ds.is_little_endian used.""" ds = Dataset() ds.PatientName = "Foo" ds._read_little = False ds._read_implicit = False ds._is_little_endian = True ds._is_implicit_VR = True fp = DicomBytesIO() # Should use ds's encoding - implicit little write_dataset(fp, ds) assert fp.getvalue()[:8] == b"\x10\x00\x10\x00\x04\x00\x00\x00" def test_encoding_ds_original(self): """Test original ds encoding used.""" ds = Dataset() ds.PatientName = "Foo" ds._read_little = True ds._read_implicit = True fp = DicomBytesIO() # Should use ds's original encoding - implicit little write_dataset(fp, ds) assert fp.getvalue()[:8] == b"\x10\x00\x10\x00\x04\x00\x00\x00" def test_encoding_raises(self): """Test raises exception if no encoding set""" def test_write_dataset(self): # make sure writing and reading back a dataset works correctly ds = dcmread(mr_implicit_name) fp = DicomBytesIO() write_dataset(fp, ds) fp.seek(0) ds_read = read_dataset(fp, is_implicit_VR=True, is_little_endian=True) for elem_orig, elem_read in zip(ds_read, ds): assert elem_orig == elem_read def test_write_dataset_with_explicit_vr(self): # make sure conversion from implicit to explicit VR does not # raise (regression test for #632) ds = dcmread(mr_implicit_name) fp = DicomBytesIO() fp.is_implicit_VR = False fp.is_little_endian = True write_dataset(fp, ds) fp.seek(0) ds_read = read_dataset(fp, is_implicit_VR=False, is_little_endian=True) for elem_orig, elem_read in zip(ds_read, ds): assert elem_orig == elem_read def test_no_source_raises(self): """Test trying to write without an encoding source raises.""" ds = Dataset() fp = DicomBytesIO() msg = "'fp.is_implicit_VR' and 'fp.is_little_endian' attributes are required" with pytest.raises(AttributeError, match=msg): write_dataset(fp, ds) class TestWriteFileMetaInfoToStandard: """Unit tests for writing File Meta Info to the DICOM standard.""" def test_bad_elements(self): """Test that non-group 2 elements aren't written to the file meta.""" fp = DicomBytesIO() meta = Dataset() meta.PatientID = "12345678" meta.MediaStorageSOPClassUID = "1.1" meta.MediaStorageSOPInstanceUID = "1.2" meta.TransferSyntaxUID = "1.3" meta.ImplementationClassUID = "1.4" with pytest.raises(ValueError): write_file_meta_info(fp, meta, enforce_standard=True) def test_missing_elements(self): """Test that missing required elements raises ValueError.""" fp = DicomBytesIO() meta = Dataset() msg = ( r"Required File Meta Information elements are either missing or " r"have an empty value: \(0002,0002\) Media Storage SOP Class UID, " r"\(0002,0003\) Media Storage SOP Instance UID, \(0002,0010\) " r"Transfer Syntax UID" ) with pytest.raises(AttributeError, match=msg): write_file_meta_info(fp, meta) msg = ( r"Required File Meta Information elements are either missing or " r"have an empty value: \(0002,0003\) Media Storage SOP Instance " r"UID, \(0002,0010\) Transfer Syntax UID" ) meta.MediaStorageSOPClassUID = "1.1" with pytest.raises(AttributeError, match=msg): write_file_meta_info(fp, meta) msg = ( r"Required File Meta Information elements are either missing or " r"have an empty value: \(0002,0010\) Transfer Syntax UID" ) meta.MediaStorageSOPInstanceUID = "1.2" with pytest.raises(AttributeError, match=msg): write_file_meta_info(fp, meta) meta.TransferSyntaxUID = "1.3" write_file_meta_info(fp, meta, enforce_standard=True) def test_group_length(self): """Test that the value for FileMetaInformationGroupLength is OK.""" fp = DicomBytesIO() meta = Dataset() meta.MediaStorageSOPClassUID = "1.1" meta.MediaStorageSOPInstanceUID = "1.2" meta.TransferSyntaxUID = "1.3" write_file_meta_info(fp, meta, enforce_standard=True) class_length = len(PYDICOM_IMPLEMENTATION_UID) if class_length % 2: class_length += 1 version_length = len(meta.ImplementationVersionName) # Padded to even length if version_length % 2: version_length += 1 fp.seek(8) test_length = unpack(" 1""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x00100010, "US", [1, 2, 3, 4]) fmt = "H" write_numbers(fp, elem, fmt) assert fp.getvalue() == b"\x01\x00\x02\x00\x03\x00\x04\x00" def test_write_singleton(self): """Test writing an element value with VM = 1""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x00100010, "US", 1) fmt = "H" write_numbers(fp, elem, fmt) assert fp.getvalue() == b"\x01\x00" def test_exception(self): """Test exceptions raise OSError""" fp = DicomBytesIO() fp.is_little_endian = True with pytest.warns(UserWarning, match="Invalid value length 1"): elem = DataElement(0x00100010, "US", b"\x00") fmt = "H" with pytest.raises(OSError, match=r"for data_element:\n\(0010,0010\)"): write_numbers(fp, elem, fmt) def test_write_big_endian(self): """Test writing big endian""" fp = DicomBytesIO() fp.is_little_endian = False elem = DataElement(0x00100010, "US", 1) fmt = "H" write_numbers(fp, elem, fmt) assert fp.getvalue() == b"\x00\x01" def test_write_lut_descriptor(self): """Test writing LUT Descriptor""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x00283002, "SS", [32768, 0, 16]) write_numbers(fp, elem, "h") assert fp.getvalue() == b"\x00\x80\x00\x00\x10\x00" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x00283002, "SS", []) write_numbers(fp, elem, "h") assert fp.getvalue() == b"" fp = DicomBytesIO() fp.is_little_endian = False elem = DataElement(0x00283002, "SS", [32768, 0, 16]) write_numbers(fp, elem, "h") assert fp.getvalue() == b"\x80\x00\x00\x00\x00\x10" class TestWriteOtherVRs: """Tests for writing the 'O' VRs like OB, OW, OF, etc.""" def test_write_ob(self): """Test writing element with VR OF""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OB", b"\x00\x01\x02\x03") write_OBvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x03" # Odd length value padded fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OB", b"\x00\x01\x02") write_OBvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x00" def test_write_ob_buffered(self): fp = DicomBytesIO() fp.is_little_endian = True b = BytesIO(b"\x00\x01\x02\x03") elem = DataElement(0x7FE00008, "OB", b) write_OBvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x03" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OB", b) b.close() msg = "the buffer has been closed" with pytest.raises(ValueError, match=msg): write_OBvalue(fp, elem) # Odd length value padded fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OB", BytesIO(b"\x00\x01\x02")) write_OBvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x00" def test_write_ow(self): """Test writing element with VR OW""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OW", b"\x00\x01\x02\x03") write_OWvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x03" # Odd length value padded fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OW", b"\x00\x01\x02") write_OWvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x00" def test_write_ow_buffered(self): fp = DicomBytesIO() fp.is_little_endian = True b = BytesIO(b"\x00\x01\x02\x03") elem = DataElement(0x7FE00008, "OW", b) write_OBvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x03" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OW", b) b.close() msg = "the buffer has been closed" with pytest.raises(ValueError, match=msg): write_OBvalue(fp, elem) # Odd length value padded fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OW", BytesIO(b"\x00\x01\x02")) write_OBvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x00" def test_write_of(self): """Test writing element with VR OF""" fp = DicomBytesIO() fp.is_little_endian = True elem = DataElement(0x7FE00008, "OF", b"\x00\x01\x02\x03") write_OWvalue(fp, elem) assert fp.getvalue() == b"\x00\x01\x02\x03" def test_write_of_dataset(self): """Test writing a dataset with an element with VR OF.""" fp = DicomBytesIO() ds = Dataset() ds.FloatPixelData = b"\x00\x01\x02\x03" ds.save_as(fp, implicit_vr=False) assert fp.getvalue() == ( # Tag | VR | Length | Value b"\xe0\x7f\x08\x00\x4F\x46\x00\x00\x04\x00\x00\x00\x00\x01\x02\x03" ) class TestWritePN: """Test filewriter.write_PN""" def test_no_encoding(self): """If PN element has no encoding info, default is used""" fp = DicomBytesIO() fp.is_little_endian = True # data element with encoded value elem = DataElement(0x00100010, "PN", "Test") write_PN(fp, elem) assert b"Test" == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00100010, "PN", "Test") write_PN(fp, elem) assert b"Test" == fp.getvalue() def test_single_byte_multi_charset_groups(self): """Test component groups with different encodings""" fp = DicomBytesIO() fp.is_little_endian = True encodings = ["latin_1", "iso_ir_126"] # data element with encoded value encoded = b"Dionysios=\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" elem = DataElement(0x00100010, "PN", encoded) write_PN(fp, elem) assert encoded == fp.getvalue() # regression test: make sure no warning is issued, e.g. the # PersonName value has not saved the default encoding fp = DicomBytesIO() fp.is_little_endian = True with assert_no_warning(): write_PN(fp, elem, encodings) assert encoded == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00100010, "PN", "Dionysios=Διονυσιος") write_PN(fp, elem, encodings=encodings) assert encoded == fp.getvalue() def test_single_byte_multi_charset_values(self): """Test multiple values with different encodings""" fp = DicomBytesIO() fp.is_little_endian = True encodings = ["latin_1", "iso_ir_144", "iso_ir_126"] # data element with encoded value encoded = ( b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3 " ) elem = DataElement(0x00100060, "PN", encoded) write_PN(fp, elem) assert encoded == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00100060, "PN", ["Buc^Jérôme", "Διονυσιος", "Люкceмбypг"]) write_PN(fp, elem, encodings=encodings) assert encoded == fp.getvalue() class TestWriteText: """Test filewriter.write_PN""" def test_no_encoding(self): """If text element has no encoding info, default is used""" fp = DicomBytesIO() fp.is_little_endian = True # data element with encoded value elem = DataElement(0x00081039, "LO", "Test") write_text(fp, elem) assert b"Test" == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00081039, "LO", "Test") write_text(fp, elem) assert b"Test" == fp.getvalue() def test_single_byte_multi_charset_text(self): """Test changed encoding inside the string""" fp = DicomBytesIO() fp.is_little_endian = True encoded = b"Dionysios=\x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" # data element with encoded value elem = DataElement(0x00081039, "LO", encoded) encodings = ["latin_1", "iso_ir_126"] write_text(fp, elem) assert encoded == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00081039, "LO", "Dionysios is Διονυσιος") write_text(fp, elem, encodings=encodings) # encoding may not be the same, so decode it first encoded = fp.getvalue() assert "Dionysios is Διονυσιος" == convert_text(encoded, encodings) def test_encode_mixed_charsets_text(self): """Test encodings used inside the string in arbitrary order""" fp = DicomBytesIO() fp.is_little_endian = True encodings = ["latin_1", "euc_kr", "iso-2022-jp", "iso_ir_127"] decoded = "山田-قباني-吉洞-لنزار" # data element with encoded value elem = DataElement(0x00081039, "LO", decoded) write_text(fp, elem, encodings=encodings) encoded = fp.getvalue() # make sure that the encoded string can be converted back assert decoded == convert_text(encoded, encodings) def test_single_byte_multi_charset_text_multivalue(self): """Test multiple values with different encodings""" fp = DicomBytesIO() fp.is_little_endian = True encoded = ( b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3 " ) # data element with encoded value elem = DataElement(0x00081039, "LO", encoded) encodings = ["latin_1", "iso_ir_144", "iso_ir_126"] write_text(fp, elem, encodings=encodings) assert encoded == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value decoded = ["Buc^Jérôme", "Διονυσιος", "Люкceмбypг"] elem = DataElement(0x00081039, "LO", decoded) write_text(fp, elem, encodings=encodings) # encoding may not be the same, so decode it first encoded = fp.getvalue() assert decoded == convert_text(encoded, encodings) def test_invalid_encoding(self, allow_writing_invalid_values): """Test encoding text with invalid encodings""" fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00081039, "LO", "Dionysios Διονυσιος") msg = "Failed to encode value with encodings: iso-2022-jp" expected = b"Dionysios \x1b$B&$&I&O&M&T&R&I&O\x1b(B? " with pytest.warns(UserWarning, match=msg): # encode with one invalid encoding write_text(fp, elem, encodings=["iso-2022-jp"]) assert expected == fp.getvalue() fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00081039, "LO", "Dionysios Διονυσιος") msg = "Failed to encode value with encodings: iso-2022-jp, iso_ir_58" with pytest.warns(UserWarning, match=msg): # encode with two invalid encodings write_text(fp, elem, encodings=["iso-2022-jp", "iso_ir_58"]) assert expected == fp.getvalue() def test_invalid_encoding_enforce_standard(self, enforce_writing_invalid_values): """Test encoding text with invalid encodings with `config.settings.reading_validation_mode` is RAISE""" fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00081039, "LO", "Dionysios Διονυσιος") msg = ( r"'iso2022_jp' codec can't encode character u?'\\u03c2' in " r"position 18: illegal multibyte sequence" ) with pytest.raises(UnicodeEncodeError, match=msg): # encode with one invalid encoding write_text(fp, elem, encodings=["iso-2022-jp"]) fp = DicomBytesIO() fp.is_little_endian = True # data element with decoded value elem = DataElement(0x00081039, "LO", "Dionysios Διονυσιος") with pytest.raises(UnicodeEncodeError, match=msg): # encode with two invalid encodings write_text(fp, elem, encodings=["iso-2022-jp", "iso_ir_58"]) def test_single_value_with_delimiters(self): """Test that text with delimiters encodes correctly""" fp = DicomBytesIO() fp.is_little_endian = True decoded = "Διονυσιος\r\nJérôme/Люкceмбypг\tJérôme" elem = DataElement(0x00081039, "LO", decoded) encodings = ("latin_1", "iso_ir_144", "iso_ir_126") write_text(fp, elem, encodings=encodings) encoded = fp.getvalue() assert decoded == convert_text(encoded, encodings) class TestWriteDT: """Test filewriter.write_DT""" def test_format_dt(self): """Test _format_DT""" elem = DataElement(0x00181078, "DT", DT("20010203123456.123456")) assert hasattr(elem.value, "original_string") assert _format_DT(elem.value) == "20010203123456.123456" del elem.value.original_string assert not hasattr(elem.value, "original_string") assert elem.value.microsecond > 0 assert _format_DT(elem.value) == "20010203123456.123456" elem = DataElement(0x00181078, "DT", DT("20010203123456")) del elem.value.original_string assert _format_DT(elem.value) == "20010203123456" class TestWriteUndefinedLengthPixelData: """Test write_data_element() for pixel data with undefined length.""" def setup_method(self): self.fp = DicomBytesIO() def test_little_endian_correct_data(self): """Pixel data starting with an item tag is written.""" self.fp.is_little_endian = True self.fp.is_implicit_VR = False pixel_data = DataElement( 0x7FE00010, "OB", b"\xfe\xff\x00\xe0\x00\x01\x02\x03", is_undefined_length=True, ) write_data_element(self.fp, pixel_data) expected = ( b"\xe0\x7f\x10\x00" # tag b"OB\x00\x00" # VR b"\xff\xff\xff\xff" # length b"\xfe\xff\x00\xe0\x00\x01\x02\x03" # contents b"\xfe\xff\xdd\xe0\x00\x00\x00\x00" ) # SQ delimiter self.fp.seek(0) assert self.fp.read() == expected def test_big_endian_correct_data(self): """Pixel data starting with an item tag is written.""" self.fp.is_little_endian = False self.fp.is_implicit_VR = False pixel_data = DataElement( 0x7FE00010, "OB", b"\xff\xfe\xe0\x00\x00\x01\x02\x03", is_undefined_length=True, ) write_data_element(self.fp, pixel_data) expected = ( b"\x7f\xe0\x00\x10" # tag b"OB\x00\x00" # VR b"\xff\xff\xff\xff" # length b"\xff\xfe\xe0\x00\x00\x01\x02\x03" # contents b"\xff\xfe\xe0\xdd\x00\x00\x00\x00" ) # SQ delimiter self.fp.seek(0) assert self.fp.read() == expected @pytest.mark.parametrize( "data", ( b"\xff\xff\x00\xe0" b"\x00\x01\x02\x03" b"\xfe\xff\xdd\xe0", BytesIO(b"\xff\xff\x00\xe0" b"\x00\x01\x02\x03" b"\xfe\xff\xdd\xe0"), ), ) def test_little_endian_incorrect_data(self, data): """Writing pixel data not starting with an item tag raises.""" self.fp.is_little_endian = True self.fp.is_implicit_VR = False pixel_data = DataElement( 0x7FE00010, "OB", data, is_undefined_length=True, ) msg = ( r"The \(7FE0,0010\) 'Pixel Data' element value hasn't been encapsulated " "as required for a compressed transfer syntax - see " r"pydicom.encaps.encapsulate\(\) for more information" ) with pytest.raises(ValueError, match=msg): write_data_element(self.fp, pixel_data) @pytest.mark.parametrize( "data", ( b"\x00\x00\x00\x00" b"\x00\x01\x02\x03" b"\xff\xfe\xe0\xdd", BytesIO(b"\x00\x00\x00\x00" b"\x00\x01\x02\x03" b"\xff\xfe\xe0\xdd"), ), ) def test_big_endian_incorrect_data(self, data): """Writing pixel data not starting with an item tag raises.""" self.fp.is_little_endian = False self.fp.is_implicit_VR = False pixel_data = DataElement( 0x7FE00010, "OB", data, is_undefined_length=True, ) msg = ( r"The \(7FE0,0010\) 'Pixel Data' element value hasn't been encapsulated " "as required for a compressed transfer syntax - see " r"pydicom.encaps.encapsulate\(\) for more information" ) with pytest.raises(ValueError, match=msg): write_data_element(self.fp, pixel_data) def test_writing_to_gzip(self): file_path = tempfile.NamedTemporaryFile(suffix=".dcm").name ds = dcmread(rtplan_name) import gzip with gzip.open(file_path, "w") as fp: ds.save_as(fp, enforce_file_format=True) with gzip.open(file_path, "r") as fp: ds_unzipped = dcmread(fp) for elem_in, elem_out in zip(ds, ds_unzipped): assert elem_in == elem_out def test_writing_too_big_data_in_explicit_encoding(self): """Data too large to be written in explicit transfer syntax.""" self.fp.is_little_endian = True self.fp.is_implicit_VR = True # make a multi-value larger than 64kB single_value = b"123456.789012345" large_value = b"\\".join([single_value] * 4500) # can be written with implicit transfer syntax, # where the length field is 4 bytes long pixel_data = DataElement( 0x30040058, "DS", large_value, is_undefined_length=False ) write_data_element(self.fp, pixel_data) self.fp.seek(0) ds = read_dataset(self.fp, True, True) assert "DS" == ds[0x30040058].VR self.fp = DicomBytesIO() self.fp.is_little_endian = True self.fp.is_implicit_VR = False msg = ( r"The value for the data element \(3004,0058\) exceeds the " r"size of 64 kByte and cannot be written in an explicit " r"transfer syntax. The data element VR is changed from " r"'DS' to 'UN' to allow saving the data." ) with pytest.warns(UserWarning, match=msg): write_data_element(self.fp, pixel_data) self.fp.seek(0) ds = read_dataset(self.fp, False, True) assert "UN" == ds[0x30040058].VR # we expect the same behavior in Big Endian transfer syntax self.fp = DicomBytesIO() self.fp.is_little_endian = False self.fp.is_implicit_VR = False with pytest.warns(UserWarning, match=msg): write_data_element(self.fp, pixel_data) self.fp.seek(0) ds = read_dataset(self.fp, False, False) assert "UN" == ds[0x30040058].VR def test_all_writers(): """Test that the VR writer functions are complete""" assert set(VR) == set(writers) class TestWritingBufferedPixelData: @pytest.mark.parametrize("bits_allocated", (8, 16)) def test_writing_dataset_with_buffered_pixel_data(self, bits_allocated): pixel_data = b"\x00\x01\x02\x03" # Baseline fp = DicomBytesIO() fp.is_little_endian = True fp.is_implicit_VR = False ds = Dataset() ds.BitsAllocated = bits_allocated ds.PixelData = pixel_data ds.save_as(fp, implicit_vr=False, little_endian=True) fp_buffered = DicomBytesIO() fp_buffered.is_little_endian = True fp_buffered.is_implicit_VR = False ds_buffered = Dataset() ds_buffered.BitsAllocated = bits_allocated ds_buffered.PixelData = BytesIO(pixel_data) ds_buffered.save_as(fp_buffered, implicit_vr=False, little_endian=True) assert fp.getvalue() == fp_buffered.getvalue() @pytest.mark.skipif(not HAVE_RESOURCE, reason="resource is unix only") @pytest.mark.parametrize("bits_allocated", (8, 16)) def test_writing_dataset_with_buffered_pixel_data_reads_data_in_chunks( self, bits_allocated ): KILOBYTE = 1000 MEGABYTE = KILOBYTE * 1000 FILE_SIZE = 50 * MEGABYTE ds = Dataset() ds.BitsAllocated = bits_allocated with TemporaryFile("+wb") as buffer, TemporaryFile("+wb") as fp: buffer.write(b"\x00" * FILE_SIZE) buffer.seek(0) # take a snapshot of memory baseline_memory_usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss # set the pixel data to the buffer ds.PixelData = buffer ds.save_as(fp, little_endian=True, implicit_vr=False) memory_usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss # on MacOS, maxrss is in bytes. On unix, its in kilobytes limit = 0 if sys.platform.startswith("linux"): # memory usage is in kilobytes limit = (FILE_SIZE / 5 * 4) / KILOBYTE elif sys.platform.startswith("darwin"): # memory usage is in bytes limit = FILE_SIZE / 5 * 4 else: pytest.skip("This test is not setup to run on this platform") # if we have successfully kept the PixelData out of memory, then our peak # memory usage # usage be less than prev peak + the size of the file assert memory_usage < (baseline_memory_usage + limit) @pytest.mark.parametrize("vr", BUFFERABLE_VRS) def test_all_supported_VRS_can_write_a_buffered_value(self, vr): data = b"\x00\x01\x02\x03" buffer = BytesIO(data) fp = DicomBytesIO() fp.is_little_endian = True fp.is_implicit_VR = False fn, _ = writers[cast(VR, vr)] fn(fp, DataElement("PixelData", vr, buffer)) assert fp.getvalue() == data @pytest.mark.skipif(IS_WINDOWS, reason="TemporaryFile on Windows always readable") def test_saving_a_file_with_a_closed_file(self): ds = Dataset() ds.BitsAllocated = 8 with TemporaryFile("+wb") as f: ds.PixelData = f with TemporaryFile("+wb") as f: msg = ( r"Invalid buffer for \(7FE0,0010\) 'Pixel Data': the buffer has been " "closed" ) with pytest.raises(ValueError, match=msg): ds.save_as(f, little_endian=True, implicit_vr=True) @pytest.fixture def use_future(): original = config._use_future config._use_future = True yield config._use_future = original class TestFuture: def test_dcmwrite_write_like_original_raises(self, use_future): ds = Dataset() msg = ( "'write_like_original' is no longer accepted as a positional " "or keyword argument, use 'enforce_file_format' instead" ) with pytest.raises(TypeError, match=msg): dcmwrite(None, ds, write_like_original=True) with pytest.raises(TypeError, match=msg): dcmwrite(None, ds, write_like_original=False) with pytest.raises(TypeError, match=msg): dcmwrite(None, ds, False) with pytest.raises(TypeError, match=msg): dcmwrite(None, ds, True) def test_dcmwrite_arg_kwarg_raises(self, use_future): ds = Dataset() msg = ( "'write_like_original' is no longer accepted as a positional " "or keyword argument, use 'enforce_file_format' instead" ) with pytest.raises(TypeError, match=msg): dcmwrite(None, ds, True, write_like_original=True) pydicom-pydicom-20aa4b7/tests/test_gdcm_pixel_data.py000066400000000000000000000560261515706620200231160ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the GDCM Pixel Data handler.""" from io import BytesIO import os import sys import tempfile import shutil import pytest try: import numpy HAVE_NP = True except ImportError: HAVE_NP = False import pydicom from pydicom.filereader import dcmread from pydicom.data import get_testdata_file from pydicom.encaps import get_frame from pydicom.pixel_data_handlers import numpy_handler, gdcm_handler from pydicom.pixels.processing import _convert_YBR_FULL_to_RGB from pydicom.pixels.utils import get_j2k_parameters from pydicom.tag import Tag try: import gdcm HAVE_GDCM = True except ImportError: HAVE_GDCM = False HAVE_GDCM_IN_MEMORY_SUPPORT = gdcm_handler.HAVE_GDCM_IN_MEMORY_SUPPORT gdcm_present_message = "GDCM is being tested" gdcm_missing_message = "GDCM is not available in this test environment" gdcm_im_missing_message = ( "GDCM is not available or in-memory decoding " "not supported with this GDCM version" ) empty_number_tags_name = get_testdata_file("reportsi_with_empty_number_tags.dcm") rtplan_name = get_testdata_file("rtplan.dcm") rtdose_name = get_testdata_file("rtdose.dcm") ct_name = get_testdata_file("CT_small.dcm") mr_name = get_testdata_file("MR_small.dcm") truncated_mr_name = get_testdata_file("MR_truncated.dcm") jpeg2000_name = get_testdata_file("JPEG2000.dcm") jpeg2000_lossless_name = get_testdata_file("MR_small_jp2klossless.dcm") jpeg_ls_lossless_name = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") jpeg_lossy_name = get_testdata_file("JPEG-lossy.dcm") jpeg_lossless_name = get_testdata_file("JPEG-LL.dcm") jpeg_lossless_odd_data_size_name = get_testdata_file("SC_rgb_small_odd_jpeg.dcm") deflate_name = get_testdata_file("image_dfl.dcm") rtstruct_name = get_testdata_file("rtstruct.dcm") priv_SQ_name = get_testdata_file("priv_SQ.dcm") nested_priv_SQ_name = get_testdata_file("nested_priv_SQ.dcm") meta_missing_tsyntax_name = get_testdata_file("meta_missing_tsyntax.dcm") no_meta_group_length = get_testdata_file("no_meta_group_length.dcm") gzip_name = get_testdata_file("zipMR.gz") color_px_name = get_testdata_file("color-px.dcm") color_pl_name = get_testdata_file("color-pl.dcm") explicit_vr_le_no_meta = get_testdata_file("ExplVR_LitEndNoMeta.dcm") explicit_vr_be_no_meta = get_testdata_file("ExplVR_BigEndNoMeta.dcm") emri_name = get_testdata_file("emri_small.dcm") emri_big_endian_name = get_testdata_file("emri_small_big_endian.dcm") emri_jpeg_ls_lossless = get_testdata_file("emri_small_jpeg_ls_lossless.dcm") emri_jpeg_2k_lossless = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") color_3d_jpeg_baseline = get_testdata_file("color3d_jpeg_baseline.dcm") sc_rgb_jpeg_dcmtk_411_YBR_FULL_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+np.dcm") sc_rgb_jpeg_dcmtk_411_YBR_FULL = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n1.dcm") sc_rgb_jpeg_dcmtk_422_YBR_FULL = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n2.dcm") sc_rgb_jpeg_dcmtk_444_YBR_FULL = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s4.dcm") sc_rgb_jpeg_dcmtk_422_YBR_FULL_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s2.dcm") sc_rgb_jpeg_dcmtk_RGB = get_testdata_file("SC_rgb_dcmtk_+eb+cr.dcm") sc_rgb_jpeg2k_gdcm_KY = get_testdata_file("SC_rgb_gdcm_KY.dcm") ground_truth_sc_rgb_jpeg2k_gdcm_KY_gdcm = get_testdata_file( "SC_rgb_gdcm2k_uncompressed.dcm" ) J2KR_16_13_1_1_1F_M2_MISMATCH = get_testdata_file("J2K_pixelrep_mismatch.dcm") dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() class TestGDCM_JPEG_LS_no_gdcm: def setup_method(self): self.jpeg_ls_lossless = dcmread(jpeg_ls_lossless_name) self.jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEG_LS_PixelArray(self): with pytest.raises(NotImplementedError): self.jpeg_ls_lossless.pixel_array def test_emri_JPEG_LS_PixelArray(self): with pytest.raises(NotImplementedError): self.emri_jpeg_ls_lossless.pixel_array class TestGDCM_JPEG2000_no_gdcm: def setup_method(self): self.jpeg_2k = dcmread(jpeg2000_name) self.jpeg_2k_lossless = dcmread(jpeg2000_lossless_name) self.jpeg_2k_lossless.pixel_array_options(use_v2_backend=True) self.emri_jpeg_2k_lossless = dcmread(emri_jpeg_2k_lossless) self.emri_jpeg_2k_lossless.pixel_array_options(use_v2_backend=True) self.sc_rgb_jpeg2k_gdcm_KY = dcmread(sc_rgb_jpeg2k_gdcm_KY) self.sc_rgb_jpeg2k_gdcm_KY.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEG2000(self): """JPEG2000: Returns correct values for sample data elements""" # XX also tests multiple-valued AT data element expected = [Tag(0x0054, 0x0010), Tag(0x0054, 0x0020)] got = self.jpeg_2k.FrameIncrementPointer assert expected == got got = self.jpeg_2k.DerivationCodeSequence[0].CodeMeaning expected = "Lossy Compression" assert expected == got def test_JPEG2000_pixel_array(self): with pytest.raises(NotImplementedError): self.jpeg_2k_lossless.pixel_array def test_emri_JPEG2000_pixel_array(self): with pytest.raises(NotImplementedError): self.emri_jpeg_2k_lossless.pixel_array def test_jpeg2000_lossy(self): with pytest.raises(NotImplementedError): self.sc_rgb_jpeg2k_gdcm_KY.pixel_array class TestGDCM_JPEGlossy_no_gdcm: def setup_method(self): self.jpeg_lossy = dcmread(jpeg_lossy_name) self.jpeg_lossy.pixel_array_options(use_v2_backend=True) self.color_3d_jpeg = dcmread(color_3d_jpeg_baseline) self.color_3d_jpeg.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEGlossy(self): """JPEG-lossy: Returns correct values for sample data elements""" got = self.jpeg_lossy.DerivationCodeSequence[0].CodeMeaning expected = "Lossy Compression" assert expected == got def test_JPEGlossy_pixel_array(self): with pytest.raises(NotImplementedError): self.jpeg_lossy.pixel_array def test_JPEGBaseline_color_3D_pixel_array(self): with pytest.raises(NotImplementedError): self.color_3d_jpeg.pixel_array class TestGDCM_JPEGlossless_no_gdcm: def setup_method(self): self.jpeg_lossless = dcmread(jpeg_lossless_name) self.jpeg_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def testJPEGlossless(self): """JPEGlossless: Returns correct values for sample data elements""" got = ( self.jpeg_lossless.SourceImageSequence[0] .PurposeOfReferenceCodeSequence[0] .CodeMeaning ) expected = "Uncompressed predecessor" assert expected == got def testJPEGlossless_pixel_array(self): """JPEGlossless: Fails gracefully when uncompressed data asked for""" with pytest.raises(NotImplementedError): self.jpeg_lossless.pixel_array pi_rgb_test_ids = [ "JPEG_RGB_411_AS_YBR_FULL", "JPEG_RGB_411_AS_YBR_FULL_422", "JPEG_RGB_422_AS_YBR_FULL", "JPEG_RGB_422_AS_YBR_FULL_422", "JPEG_RGB_444_AS_YBR_FULL", ] pi_rgb_testdata = [ pytest.param( sc_rgb_jpeg_dcmtk_411_YBR_FULL, "YBR_FULL", [ (253, 1, 0), (253, 128, 132), (0, 255, 5), (127, 255, 127), (1, 0, 254), (127, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], True, ), pytest.param( sc_rgb_jpeg_dcmtk_411_YBR_FULL_422, "YBR_FULL_422", [ (253, 1, 0), (253, 128, 132), (0, 255, 5), (127, 255, 127), (1, 0, 254), (127, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], True, ), pytest.param( sc_rgb_jpeg_dcmtk_422_YBR_FULL, "YBR_FULL", [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], True, ), pytest.param( sc_rgb_jpeg_dcmtk_422_YBR_FULL_422, "YBR_FULL_422", [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], True, ), pytest.param( sc_rgb_jpeg_dcmtk_444_YBR_FULL, "YBR_FULL", [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], True, ), ] with_gdcm_params = [ pytest.param( "File", marks=pytest.mark.skipif(not HAVE_GDCM, reason=gdcm_missing_message) ), pytest.param( "InMemory", marks=pytest.mark.skipif( not HAVE_GDCM_IN_MEMORY_SUPPORT, reason=gdcm_im_missing_message ), ), ] class TestsWithGDCM: @pytest.fixture(params=with_gdcm_params, scope="class", autouse=True) def with_gdcm(self, request): original_value = HAVE_GDCM_IN_MEMORY_SUPPORT if request.param == "File": gdcm_handler.HAVE_GDCM_IN_MEMORY_SUPPORT = False original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [numpy_handler, gdcm_handler] yield gdcm_handler.HAVE_GDCM_IN_MEMORY_SUPPORT = original_value pydicom.config.pixel_data_handlers = original_handlers @pytest.fixture(scope="class") def unicode_filename(self): unicode_filename = os.path.join(tempfile.gettempdir(), "ДИКОМ.dcm") shutil.copyfile(jpeg_ls_lossless_name, unicode_filename) yield unicode_filename os.remove(unicode_filename) @pytest.fixture def jpeg_ls_lossless(self, unicode_filename): return dcmread(unicode_filename) @pytest.fixture def sc_rgb_jpeg2k_gdcm_KY(self): return dcmread(sc_rgb_jpeg2k_gdcm_KY) @pytest.fixture(scope="class") def ground_truth_sc_rgb_jpeg2k_gdcm_KY_gdcm(self): return dcmread(ground_truth_sc_rgb_jpeg2k_gdcm_KY_gdcm) @pytest.fixture def jpeg_2k(self): ds = dcmread(jpeg2000_name) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def jpeg_2k_lossless(self): ds = dcmread(jpeg2000_lossless_name) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture(scope="class") def mr_small(self): ds = dcmread(mr_name) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture(scope="class") def emri_small(self): ds = dcmread(emri_name) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def emri_jpeg_ls_lossless(self): ds = dcmread(emri_jpeg_ls_lossless) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def emri_jpeg_2k_lossless(self): ds = dcmread(emri_jpeg_2k_lossless) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def color_3d_jpeg(self): ds = dcmread(color_3d_jpeg_baseline) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def jpeg_lossy(self): ds = dcmread(jpeg_lossy_name) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def jpeg_lossless(self): ds = dcmread(jpeg_lossless_name) ds.pixel_array_options(use_v2_backend=True) return ds @pytest.fixture def jpeg_lossless_odd_data_size(self): ds = dcmread(jpeg_lossless_odd_data_size_name) ds.pixel_array_options(use_v2_backend=True) return ds def test_JPEG_LS_PixelArray(self, jpeg_ls_lossless, mr_small): a = jpeg_ls_lossless.pixel_array b = mr_small.pixel_array assert a.mean() == b.mean() assert a.flags.writeable def test_emri_JPEG_LS_PixelArray_with_gdcm(self, emri_jpeg_ls_lossless, emri_small): a = emri_jpeg_ls_lossless.pixel_array b = emri_small.pixel_array assert a.mean() == b.mean() assert a.flags.writeable def test_JPEG2000(self, jpeg_2k): """JPEG2000: Returns correct values for sample data elements""" # XX also tests multiple-valued AT data element expected = [Tag(0x0054, 0x0010), Tag(0x0054, 0x0020)] got = jpeg_2k.FrameIncrementPointer assert expected == got got = jpeg_2k.DerivationCodeSequence[0].CodeMeaning assert "Lossy Compression" == got def test_JPEG2000PixelArray(self, jpeg_2k_lossless, mr_small): a = jpeg_2k_lossless.pixel_array b = mr_small.pixel_array assert a.mean() == b.mean() assert a.flags.writeable def test_decompress_using_gdcm(self, jpeg_2k_lossless, mr_small): jpeg_2k_lossless.decompress(handler_name="gdcm") a = jpeg_2k_lossless.pixel_array b = mr_small.pixel_array assert a.mean() == b.mean() def test_emri_JPEG2000PixelArray(self, emri_jpeg_2k_lossless, emri_small): a = emri_jpeg_2k_lossless.pixel_array b = emri_small.pixel_array assert a.mean() == b.mean() assert a.flags.writeable def test_JPEG2000_lossy( self, sc_rgb_jpeg2k_gdcm_KY, ground_truth_sc_rgb_jpeg2k_gdcm_KY_gdcm ): a = sc_rgb_jpeg2k_gdcm_KY.pixel_array b = ground_truth_sc_rgb_jpeg2k_gdcm_KY_gdcm.pixel_array if HAVE_NP: assert numpy.array_equal(a, b) else: assert a.mean() == b.mean() assert a.flags.writeable def test_JPEGlosslessPixelArray(self, jpeg_lossless): """JPEGlossless: Fails gracefully when uncompressed data asked for""" a = jpeg_lossless.pixel_array assert (1024, 256) == a.shape # this test points were manually identified in Osirix viewer assert 227 == a[420, 140] assert 105 == a[230, 120] assert a.flags.writeable def test_JPEGlossless_odd_data_size(self, jpeg_lossless_odd_data_size): pixel_data = jpeg_lossless_odd_data_size.pixel_array assert 27 == pixel_data.nbytes assert (3, 3, 3) == pixel_data.shape def test_JPEGlossy(self, jpeg_lossy): """JPEG-lossy: Returns correct values for sample data elements""" got = jpeg_lossy.DerivationCodeSequence[0].CodeMeaning assert "Lossy Compression" == got def test_JPEGlossyPixelArray(self, jpeg_lossy): a = jpeg_lossy.pixel_array assert (1024, 256) == a.shape # this test points were manually identified in Osirix viewer assert 244 == a[420, 140] assert 95 == a[230, 120] assert a.flags.writeable def test_JPEGBaselineColor3DPixelArray(self, color_3d_jpeg): assert "YBR_FULL_422" == color_3d_jpeg.PhotometricInterpretation a = color_3d_jpeg.pixel_array assert a.flags.writeable assert (120, 480, 640, 3) == a.shape a = _convert_YBR_FULL_to_RGB(a) # this test points were manually identified in Osirix viewer assert (41, 41, 41) == tuple(a[3, 159, 290, :]) assert (57, 57, 57) == tuple(a[3, 169, 290, :]) assert "YBR_FULL_422" == color_3d_jpeg.PhotometricInterpretation @pytest.mark.parametrize( "image,pi,results,convert_yuv_to_rgb", pi_rgb_testdata, ids=pi_rgb_test_ids ) def test_PI_RGB(self, image, pi, results, convert_yuv_to_rgb): t = dcmread(image) assert t.PhotometricInterpretation == pi t.pixel_array_options(use_v2_backend=True) a = t.pixel_array assert a.flags.writeable assert (100, 100, 3) == a.shape if convert_yuv_to_rgb: a = _convert_YBR_FULL_to_RGB(a) # this test points are from the ImageComments tag assert results[0] == tuple(a[5, 50, :]) assert results[1] == tuple(a[15, 50, :]) assert results[2] == tuple(a[25, 50, :]) assert results[3] == tuple(a[35, 50, :]) assert results[4] == tuple(a[45, 50, :]) assert results[5] == tuple(a[55, 50, :]) assert results[6] == tuple(a[65, 50, :]) assert results[7] == tuple(a[75, 50, :]) assert results[8] == tuple(a[85, 50, :]) assert results[9] == tuple(a[95, 50, :]) assert pi == t.PhotometricInterpretation def test_bytes_io(self): """Test using a BytesIO as the dataset source.""" with open(jpeg2000_name, "rb") as f: bs = BytesIO(f.read()) ds = dcmread(bs) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array assert (1024, 256) == arr.shape assert arr.flags.writeable def test_pixel_rep_mismatch(self): """Test mismatched j2k sign and Pixel Representation.""" ds = dcmread(J2KR_16_13_1_1_1F_M2_MISMATCH) ds.pixel_array_options(use_v2_backend=True) assert 1 == ds.PixelRepresentation assert 13 == ds.BitsStored bs = get_frame(ds.PixelData, 0) params = get_j2k_parameters(bs) assert 13 == params["precision"] assert not params["is_signed"] arr = ds.pixel_array assert 1 == ds.PixelRepresentation assert "int16" == arr.dtype assert (512, 512) == arr.shape assert arr.flags.writeable assert -2000 == arr[0, 0] assert [621, 412, 138, -193, -520, -767, -907, -966, -988, -995] == ( arr[47:57, 279].tolist() ) assert [-377, -121, 141, 383, 633, 910, 1198, 1455, 1638, 1732] == ( arr[328:338, 106].tolist() ) class TestSupportFunctions: @pytest.fixture(scope="class") def dataset_2d(self): return dcmread(mr_name) @pytest.fixture(scope="class") def dataset_2d_compressed(self): return dcmread(jpeg2000_name) @pytest.fixture(scope="class") def dataset_3d(self): return dcmread(color_3d_jpeg_baseline) @pytest.mark.skipif(not HAVE_GDCM_IN_MEMORY_SUPPORT, reason=gdcm_im_missing_message) def test_create_data_element_from_uncompressed_2d_dataset(self, dataset_2d): data_element = gdcm_handler.create_data_element(dataset_2d) assert 0x7FE0 == data_element.GetTag().GetGroup() assert 0x0010 == data_element.GetTag().GetElement() assert data_element.GetSequenceOfFragments() is None assert data_element.GetByteValue() is not None @pytest.mark.skipif(not HAVE_GDCM_IN_MEMORY_SUPPORT, reason=gdcm_im_missing_message) def test_create_data_element_from_compressed_2d_dataset( self, dataset_2d_compressed ): data_element = gdcm_handler.create_data_element(dataset_2d_compressed) assert 0x7FE0 == data_element.GetTag().GetGroup() assert 0x0010 == data_element.GetTag().GetElement() assert data_element.GetSequenceOfFragments() is not None assert data_element.GetByteValue() is None @pytest.mark.skipif(not HAVE_GDCM_IN_MEMORY_SUPPORT, reason=gdcm_im_missing_message) def test_create_data_element_from_3d_dataset(self, dataset_3d): data_element = gdcm_handler.create_data_element(dataset_3d) assert 0x7FE0 == data_element.GetTag().GetGroup() assert 0x0010 == data_element.GetTag().GetElement() assert data_element.GetSequenceOfFragments() is not None assert data_element.GetByteValue() is None @pytest.mark.skipif(not HAVE_GDCM_IN_MEMORY_SUPPORT, reason=gdcm_im_missing_message) def test_create_image_from_2d_dataset(self, dataset_2d): data_element = gdcm_handler.create_data_element(dataset_2d) image = gdcm_handler.create_image(dataset_2d, data_element) assert 2 == image.GetNumberOfDimensions() assert [dataset_2d.Rows, dataset_2d.Columns] == image.GetDimensions() pi_type = gdcm.PhotometricInterpretation.GetPIType( dataset_2d.PhotometricInterpretation ) assert pi_type == image.GetPhotometricInterpretation().GetType() uid = str.__str__(dataset_2d.file_meta.TransferSyntaxUID) assert uid == image.GetTransferSyntax().GetString() pixel_format = image.GetPixelFormat() assert dataset_2d.SamplesPerPixel == pixel_format.GetSamplesPerPixel() assert dataset_2d.BitsAllocated == pixel_format.GetBitsAllocated() assert dataset_2d.BitsStored == pixel_format.GetBitsStored() assert dataset_2d.HighBit == pixel_format.GetHighBit() px_repr = dataset_2d.PixelRepresentation assert px_repr == pixel_format.GetPixelRepresentation() @pytest.mark.skipif(not HAVE_GDCM_IN_MEMORY_SUPPORT, reason=gdcm_im_missing_message) def test_create_image_from_3d_dataset(self, dataset_3d): data_element = gdcm_handler.create_data_element(dataset_3d) image = gdcm_handler.create_image(dataset_3d, data_element) assert 3 == image.GetNumberOfDimensions() assert [ dataset_3d.Columns, dataset_3d.Rows, int(dataset_3d.NumberOfFrames), ] == image.GetDimensions() pi = gdcm.PhotometricInterpretation.GetPIType( dataset_3d.PhotometricInterpretation ) assert pi == image.GetPhotometricInterpretation().GetType() uid = str.__str__(dataset_3d.file_meta.TransferSyntaxUID) assert uid == image.GetTransferSyntax().GetString() pixel_format = image.GetPixelFormat() assert dataset_3d.SamplesPerPixel == pixel_format.GetSamplesPerPixel() assert dataset_3d.BitsAllocated == pixel_format.GetBitsAllocated() assert dataset_3d.BitsStored == pixel_format.GetBitsStored() assert dataset_3d.HighBit == pixel_format.GetHighBit() px_repr = dataset_3d.PixelRepresentation assert px_repr == pixel_format.GetPixelRepresentation() planar = dataset_3d.PlanarConfiguration assert planar == image.GetPlanarConfiguration() pydicom-pydicom-20aa4b7/tests/test_handler_util.py000066400000000000000000000116241515706620200224570ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for the pixel_data_handlers.util module.""" from sys import byteorder import pytest try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False from pydicom import config with pytest.warns(DeprecationWarning): from pydicom.pixel_data_handlers.util import dtype_corrected_for_endianness @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_DtypeCorrectedForEndianness: """Tests for util.dtype_corrected_for_endianness.""" def test_byte_swapping(self): """Test that the endianness of the system is taken into account.""" # The main problem is that our testing environments are probably # all little endian, but we'll try our best dtype = np.dtype("uint16") # < is little, = is native, > is big if byteorder == "little": out = dtype_corrected_for_endianness(True, dtype) assert out.byteorder in ["<", "="] out = dtype_corrected_for_endianness(False, dtype) assert out.byteorder == ">" elif byteorder == "big": out = dtype_corrected_for_endianness(True, dtype) assert out.byteorder == "<" out = dtype_corrected_for_endianness(False, dtype) assert out.byteorder in [">", "="] def test_no_endian_raises(self): """Test that an unset endianness raises exception.""" with pytest.raises(ValueError, match="attribute 'is_little_endian' has"): dtype_corrected_for_endianness(None, None) def test_deprecation_warnings(): msg = ( "The 'pydicom.pixel_data_handlers' module will be removed in v4.0, " "please use 'from pydicom.pixels import convert_color_space' instead" ) with pytest.warns(DeprecationWarning, match=msg): from pydicom.pixel_data_handlers import convert_color_space with pytest.warns(DeprecationWarning, match=msg): from pydicom.pixel_data_handlers.util import convert_color_space as x msg = ( "The 'pydicom.pixel_data_handlers' module will be removed in v4.0, " "please use 'from pydicom.pixels.utils import expand_ybr422' instead" ) with pytest.warns(DeprecationWarning, match=msg): from pydicom.pixel_data_handlers import expand_ybr422 with pytest.warns(DeprecationWarning, match=msg): from pydicom.pixel_data_handlers.util import expand_ybr422 as y msg = "'dtype_corrected_for_endianness' is deprecated and will be removed in v4.0" with pytest.warns(DeprecationWarning, match=msg): from pydicom.pixel_data_handlers.util import dtype_corrected_for_endianness @pytest.fixture def use_future(): original = config._use_future config._use_future = True yield config._use_future = original class TestFuture: def test_imports_raise(self, use_future): with pytest.raises(ImportError): from pydicom.pixel_data_handlers import apply_color_lut as x with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import apply_color_lut with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import apply_modality_lut with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import apply_voi_lut with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import apply_voi with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import apply_windowing with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import convert_color_space with pytest.raises(ImportError): from pydicom.pixel_data_handlers import expand_ybr422 as y with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import expand_ybr422 with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import get_expected_length with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import get_image_pixel_ids with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import get_j2k_parameters with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import get_nr_frames with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import pack_bits with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import pixel_dtype with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import reshape_pixel_array with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import unpack_bits with pytest.raises(ImportError): from pydicom.pixel_data_handlers.util import dtype_corrected_for_endianness pydicom-pydicom-20aa4b7/tests/test_helpers.py000066400000000000000000000006631515706620200214500ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Helper functions for tests.""" import warnings from contextlib import contextmanager from collections.abc import Generator @contextmanager def assert_no_warning() -> Generator: """Assert that no warning is issued. Any warning will be handled as an error. """ with warnings.catch_warnings(): warnings.simplefilter("error") yield pydicom-pydicom-20aa4b7/tests/test_hooks.py000066400000000000000000000040371515706620200211300ustar00rootroot00000000000000"""Tests for the hooks module.""" import pytest from pydicom.hooks import hooks, raw_element_vr, raw_element_value @pytest.fixture def reset_hooks(): original = ( hooks.raw_element_vr, hooks.raw_element_value, hooks.raw_element_kwargs, ) yield ( hooks.raw_element_vr, hooks.raw_element_value, hooks.raw_element_kwargs, ) = original class TestHooks: """Tests for Hooks""" def test_unknown_hook_raises(self): """Test invalid hook name or function object raises an exception.""" msg = "'func' must be a callable function" with pytest.raises(TypeError, match=msg): hooks.register_callback("foo", None) def foo(): pass msg = "Unknown hook 'foo'" with pytest.raises(ValueError, match=msg): hooks.register_callback("foo", foo) def test_unknown_hook_kwargs_raises(self): """Test invalid hook name or kwargs object raises an exception.""" msg = "'kwargs' must be a dict, not 'NoneType'" with pytest.raises(TypeError, match=msg): hooks.register_kwargs("foo", None) msg = "Unknown hook 'foo'" with pytest.raises(ValueError, match=msg): hooks.register_kwargs("foo", {}) def test_register_callback(self, reset_hooks): """Test setting the functions for a hook.""" assert hooks.raw_element_vr == raw_element_vr assert hooks.raw_element_value == raw_element_value def foo(): pass def bar(): pass hooks.register_callback("raw_element_vr", foo) hooks.register_callback("raw_element_value", bar) assert hooks.raw_element_vr == foo assert hooks.raw_element_value == bar def test_register_kwargs(self, reset_hooks): """Test setting the kwargs for a hook function""" d = {"a": 1, 2: "foo"} assert hooks.raw_element_kwargs == {} hooks.register_kwargs("raw_element_kwargs", d) assert hooks.raw_element_kwargs == d pydicom-pydicom-20aa4b7/tests/test_jpeg_ls_pixel_data.py000066400000000000000000000260601515706620200236220ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the JPEG-LS Pixel Data handler.""" import os import sys try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False import pytest import pydicom from pydicom.data import get_testdata_file from pydicom.encaps import encapsulate, generate_frames from pydicom.filereader import dcmread from pydicom.pixel_data_handlers import numpy_handler from pydicom.pixel_data_handlers import jpeg_ls_handler jpeg_ls_missing_message = "jpeg_ls is not available in this test environment" jpeg_ls_present_message = "jpeg_ls is being tested" have_numpy_handler = numpy_handler.is_available() have_jpeg_ls_handler = jpeg_ls_handler.is_available() test_jpeg_ls_decoder = have_numpy_handler and have_jpeg_ls_handler empty_number_tags_name = get_testdata_file("reportsi_with_empty_number_tags.dcm") rtplan_name = get_testdata_file("rtplan.dcm") rtdose_name = get_testdata_file("rtdose.dcm") ct_name = get_testdata_file("CT_small.dcm") mr_name = get_testdata_file("MR_small.dcm") truncated_mr_name = get_testdata_file("MR_truncated.dcm") jpeg2000_name = get_testdata_file("JPEG2000.dcm") jpeg2000_lossless_name = get_testdata_file("MR_small_jp2klossless.dcm") jpeg_ls_lossless_name = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") jpeg_lossy_name = get_testdata_file("JPEG-lossy.dcm") jpeg_lossless_name = get_testdata_file("JPEG-LL.dcm") deflate_name = get_testdata_file("image_dfl.dcm") rtstruct_name = get_testdata_file("rtstruct.dcm") priv_SQ_name = get_testdata_file("priv_SQ.dcm") nested_priv_SQ_name = get_testdata_file("nested_priv_SQ.dcm") meta_missing_tsyntax_name = get_testdata_file("meta_missing_tsyntax.dcm") no_meta_group_length = get_testdata_file("no_meta_group_length.dcm") gzip_name = get_testdata_file("zipMR.gz") color_px_name = get_testdata_file("color-px.dcm") color_pl_name = get_testdata_file("color-pl.dcm") explicit_vr_le_no_meta = get_testdata_file("ExplVR_LitEndNoMeta.dcm") explicit_vr_be_no_meta = get_testdata_file("ExplVR_BigEndNoMeta.dcm") emri_name = get_testdata_file("emri_small.dcm") emri_big_endian_name = get_testdata_file("emri_small_big_endian.dcm") emri_jpeg_ls_lossless = get_testdata_file("emri_small_jpeg_ls_lossless.dcm") emri_jpeg_2k_lossless = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") color_3d_jpeg_baseline = get_testdata_file("color3d_jpeg_baseline.dcm") dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() SUPPORTED_HANDLER_NAMES = ( "jpegls", "jpeg_ls", "JPEG_LS", "jpegls_handler", "JPEG_LS_Handler", ) class TestJPEGLS_no_jpeg_ls: def setup_method(self): self.jpeg_ls_lossless = dcmread(jpeg_ls_lossless_name) self.jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEG_LS_PixelArray(self): with pytest.raises((RuntimeError, NotImplementedError)): self.jpeg_ls_lossless.pixel_array class TestJPEGLS_JPEG2000_no_jpeg_ls: def setup_method(self): self.jpeg_2k = dcmread(jpeg2000_name) self.jpeg_2k.pixel_array_options(use_v2_backend=True) self.emri_jpeg_2k_lossless = dcmread(emri_jpeg_2k_lossless) self.emri_jpeg_2k_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEG2000PixelArray(self): """JPEG2000: Now works""" with pytest.raises(NotImplementedError): self.jpeg_2k.pixel_array def test_emri_JPEG2000PixelArray(self): """JPEG2000: Now works""" with pytest.raises(NotImplementedError): self.emri_jpeg_2k_lossless.pixel_array class TestJPEGLS_JPEGlossy_no_jpeg_ls: def setup_method(self): self.jpeg_lossy = dcmread(jpeg_lossy_name) self.jpeg_lossy.pixel_array_options(use_v2_backend=True) self.color_3d_jpeg = dcmread(color_3d_jpeg_baseline) self.color_3d_jpeg.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def testJPEGlossy(self): """JPEG-lossy: Returns correct values for sample data elements""" got = self.jpeg_lossy.DerivationCodeSequence[0].CodeMeaning assert "Lossy Compression" == got def testJPEGlossyPixelArray(self): """JPEG-lossy: Fails gracefully when uncompressed data is asked for""" with pytest.raises(NotImplementedError): self.jpeg_lossy.pixel_array def testJPEGBaselineColor3DPixelArray(self): with pytest.raises(NotImplementedError): self.color_3d_jpeg.pixel_array class TestJPEGLS_JPEGlossless_no_jpeg_ls: def setup_method(self): self.jpeg_lossless = dcmread(jpeg_lossless_name) self.jpeg_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def testJPEGlossless(self): """JPEGlossless: Returns correct values for sample data elements""" got = ( self.jpeg_lossless.SourceImageSequence[0] .PurposeOfReferenceCodeSequence[0] .CodeMeaning ) assert "Uncompressed predecessor" == got def testJPEGlosslessPixelArray(self): """JPEGlossless: Fails gracefully when uncompressed data asked for""" with pytest.raises(NotImplementedError): self.jpeg_lossless.pixel_array @pytest.mark.skipif(not test_jpeg_ls_decoder, reason=jpeg_ls_missing_message) class TestJPEGLS_JPEG_LS_with_jpeg_ls: def setup_method(self): self.jpeg_ls_lossless = dcmread(jpeg_ls_lossless_name) self.jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.mr_small = dcmread(mr_name) self.mr_small.pixel_array_options(use_v2_backend=True) self.emri_jpeg_ls_lossless = dcmread(emri_jpeg_ls_lossless) self.emri_jpeg_ls_lossless.pixel_array_options(use_v2_backend=True) self.emri_small = dcmread(emri_name) self.emri_small.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [jpeg_ls_handler, numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEG_LS_PixelArray(self): a = self.jpeg_ls_lossless.pixel_array b = self.mr_small.pixel_array assert b.mean() == a.mean() assert a.flags.writeable def test_emri_JPEG_LS_PixelArray(self): a = self.emri_jpeg_ls_lossless.pixel_array b = self.emri_small.pixel_array assert b.mean() == a.mean() assert a.flags.writeable @pytest.mark.parametrize("handler_name", SUPPORTED_HANDLER_NAMES) def test_decompress_using_handler(self, handler_name): self.emri_jpeg_ls_lossless.decompress(handler_name=handler_name) a = self.emri_jpeg_ls_lossless.pixel_array b = self.emri_small.pixel_array assert b.mean() == a.mean() @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_frame_multiple_fragments(self): """Test a frame split across multiple fragments.""" ds = dcmread(jpeg_ls_lossless_name) ref = ds.pixel_array frame = next(generate_frames(ds.PixelData, number_of_frames=1)) ds.PixelData = encapsulate([frame, frame], fragments_per_frame=4) ds.NumberOfFrames = 2 assert np.array_equal(ds.pixel_array[0], ref) @pytest.mark.skipif(not test_jpeg_ls_decoder, reason=jpeg_ls_missing_message) class TestJPEGLS_JPEG2000_with_jpeg_ls: def setup_method(self): self.jpeg_2k = dcmread(jpeg2000_name) self.jpeg_2k.pixel_array_options(use_v2_backend=True) self.emri_jpeg_2k_lossless = dcmread(emri_jpeg_2k_lossless) self.emri_jpeg_2k_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [jpeg_ls_handler, numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def test_JPEG2000PixelArray(self): with pytest.raises(NotImplementedError): self.jpeg_2k.pixel_array def test_emri_JPEG2000PixelArray(self): with pytest.raises(NotImplementedError): self.emri_jpeg_2k_lossless.pixel_array @pytest.mark.skipif(not test_jpeg_ls_decoder, reason=jpeg_ls_missing_message) class TestJPEGLS_JPEGlossy_with_jpeg_ls: def setup_method(self): self.jpeg_lossy = dcmread(jpeg_lossy_name) self.jpeg_lossy.pixel_array_options(use_v2_backend=True) self.color_3d_jpeg = dcmread(color_3d_jpeg_baseline) self.color_3d_jpeg.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [jpeg_ls_handler, numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def testJPEGlossy(self): """JPEG-lossy: Returns correct values for sample data elements""" got = self.jpeg_lossy.DerivationCodeSequence[0].CodeMeaning assert "Lossy Compression" == got def testJPEGlossyPixelArray(self): with pytest.raises(NotImplementedError): self.jpeg_lossy.pixel_array def testJPEGBaselineColor3DPixelArray(self): with pytest.raises(NotImplementedError): self.color_3d_jpeg.pixel_array @pytest.mark.skipif(not test_jpeg_ls_decoder, reason=jpeg_ls_missing_message) class TestJPEGLS_JPEGlossless_with_jpeg_ls: def setup_method(self): self.jpeg_lossless = dcmread(jpeg_lossless_name) self.jpeg_lossless.pixel_array_options(use_v2_backend=True) self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [jpeg_ls_handler, numpy_handler] def teardown_method(self): pydicom.config.pixel_data_handlers = self.original_handlers def testJPEGlossless(self): """JPEGlossless: Returns correct values for sample data elements""" got = ( self.jpeg_lossless.SourceImageSequence[0] .PurposeOfReferenceCodeSequence[0] .CodeMeaning ) assert "Uncompressed predecessor" == got def testJPEGlosslessPixelArray(self): """JPEGlossless: Fails gracefully when uncompressed data asked for""" with pytest.raises(NotImplementedError): self.jpeg_lossless.pixel_array pydicom-pydicom-20aa4b7/tests/test_json.py000066400000000000000000000504021515706620200207530ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. import json import logging from unittest import mock import pytest from pydicom import dcmread from pydicom.data import get_testdata_file from pydicom.dataelem import DataElement, RawDataElement from pydicom.dataset import Dataset from pydicom.tag import Tag, BaseTag from pydicom.valuerep import PersonName class TestPersonName: def test_json_pn_from_file(self, disable_value_validation): with open(get_testdata_file("test_PN.json")) as s: ds = Dataset.from_json(s.read()) assert isinstance(ds[0x00080090].value, PersonName) assert isinstance(ds[0x00100010].value, PersonName) inner_seq = ds[0x04000561].value[0][0x04000550] dataelem = inner_seq[0][0x00100010] assert isinstance(dataelem.value, PersonName) def test_pn_components_to_json(self): def check_name(tag, components): # we cannot directly compare the dictionaries, as they are not # guaranteed insertion-ordered in Python < 3.7 value = ds_json[tag]["Value"] assert 1 == len(value) value = value[0] if len(components) == 3: assert components[2] == value["Phonetic"] else: assert "Phonetic" not in value if len(components) >= 2: assert components[1] == value["Ideographic"] else: assert "Ideographic" not in value assert components[0] == value["Alphabetic"] ds = Dataset() ds.add_new(0x00100010, "PN", "Yamada^Tarou=山田^太郎=やまだ^たろう") ds.add_new(0x00091001, "PN", "Yamada^Tarou") ds.add_new(0x00091002, "PN", "Yamada^Tarou==") ds.add_new(0x00091003, "PN", "=山田^太郎=やまだ^たろう") ds.add_new(0x00091004, "PN", "Yamada^Tarou==やまだ^たろう") ds.add_new(0x00091005, "PN", "==やまだ^たろう") ds.add_new(0x00091006, "PN", "=山田^太郎") ds.add_new(0x00091007, "PN", "Yamada^Tarou=山田^太郎") ds_json = ds.to_json_dict() check_name("00100010", ["Yamada^Tarou", "山田^太郎", "やまだ^たろう"]) check_name("00091001", ["Yamada^Tarou"]) check_name("00091002", ["Yamada^Tarou"]) check_name("00091003", ["", "山田^太郎", "やまだ^たろう"]) check_name("00091004", ["Yamada^Tarou", "", "やまだ^たろう"]) check_name("00091005", ["", "", "やまだ^たろう"]) check_name("00091006", ["", "山田^太郎"]) check_name("00091007", ["Yamada^Tarou", "山田^太郎"]) def test_pn_components_from_json(self): # this is the encoded dataset from the previous test, with some # empty components omitted ds_json = ( '{"00100010": {"vr": "PN", "Value": [{"Alphabetic": ' '"Yamada^Tarou", "Ideographic": "山田^太郎", ' '"Phonetic": "やまだ^たろう"}]}, ' '"00091001": {"vr": "PN", "Value": ' '[{"Alphabetic": "Yamada^Tarou"}]}, ' '"00091002": {"vr": "PN", "Value": ' '[{"Alphabetic": "Yamada^Tarou", "Ideographic": "", ' '"Phonetic": ""}]}, ' '"00091003": {"vr": "PN", "Value": [{' '"Ideographic": "山田^太郎", ' '"Phonetic": "やまだ^たろう"}]}, ' '"00091004": {"vr": "PN", "Value": ' '[{"Alphabetic": "Yamada^Tarou", ' '"Phonetic": "やまだ^たろう"}]}, ' '"00091005": {"vr": "PN", "Value": ' '[{"Phonetic": "やまだ^たろう"}]}, ' '"00091006": {"vr": "PN", "Value":' ' [{"Ideographic": "山田^太郎"}]}, ' '"00091007": {"vr": "PN", "Value": ' '[{"Alphabetic": "Yamada^Tarou", ' '"Ideographic": "山田^太郎"}]}}' ) ds = Dataset.from_json(ds_json) assert "Yamada^Tarou=山田^太郎=やまだ^たろう" == ds.PatientName assert "Yamada^Tarou" == ds[0x00091001].value assert "Yamada^Tarou" == ds[0x00091002].value assert "=山田^太郎=やまだ^たろう" == ds[0x00091003].value assert "Yamada^Tarou==やまだ^たろう" == ds[0x00091004].value assert "==やまだ^たろう" == ds[0x00091005].value assert "=山田^太郎" == ds[0x00091006].value assert "Yamada^Tarou=山田^太郎" == ds[0x00091007].value def test_empty_value(self): ds = Dataset() ds.add_new(0x00100010, "PN", "") ds_json = ds.to_json_dict() assert "00100010" in ds_json assert "Value" not in ds_json["00100010"] def test_multi_value_to_json(self): ds = Dataset() patient_names = ["Buc^Jérôme", "Διονυσιος", "Люкceмбypг"] ds.add_new(0x00091001, "PN", patient_names) ds_json = ds.to_json_dict() assert [ {"Alphabetic": "Buc^Jérôme"}, {"Alphabetic": "Διονυσιος"}, {"Alphabetic": "Люкceмбypг"}, ] == ds_json["00091001"]["Value"] def test_dataelem_from_json(self): tag = 0x0080090 vr = "PN" value = [{"Alphabetic": ""}] dataelem = DataElement.from_json(Dataset, tag, vr, value, "Value") assert isinstance(dataelem.value, PersonName) class TestAT: def test_to_json(self): ds = Dataset() ds.add_new(0x00091001, "AT", [0x00100010, 0x00100020]) ds.add_new(0x00091002, "AT", Tag(0x28, 0x02)) ds.add_new(0x00091003, "AT", BaseTag(0x00280002)) ds.add_new(0x00091004, "AT", [0x00280002, Tag("PatientName")]) ds_json = ds.to_json_dict() assert ["00100010", "00100020"] == ds_json["00091001"]["Value"] assert ["00280002"] == ds_json["00091002"]["Value"] assert ["00280002"] == ds_json["00091003"]["Value"] assert ["00280002", "00100010"] == ds_json["00091004"]["Value"] def test_from_json(self): ds_json = ( '{"00091001": {"vr": "AT", "Value": ["000910AF"]}, ' '"00091002": {"vr": "AT", "Value": ["00100010", ' '"00100020", "00100030"]}}' ) ds = Dataset.from_json(ds_json) assert 0x000910AF == ds[0x00091001].value assert [0x00100010, 0x00100020, 0x00100030] == ds[0x00091002].value def test_invalid_value_in_json(self): ds_json = ( '{"00091001": {"vr": "AT", "Value": ["000910AG"]}, ' '"00091002": {"vr": "AT", "Value": ["00100010"]}}' ) with pytest.warns( UserWarning, match="Invalid value '000910AG' for AT element - ignoring it", ): ds = Dataset.from_json(ds_json) assert ds[0x00091001].value is None assert 0x00100010 == ds[0x00091002].value def test_invalid_tag_in_json(self): ds_json = ( '{"000910AG": {"vr": "AT", "Value": ["00091000"]}, ' '"00091002": {"vr": "AT", "Value": ["00100010"]}}' ) with pytest.raises( ValueError, match="Data element '000910AG' could not be loaded from JSON:", ): ds = Dataset.from_json(ds_json) assert ds[0x00091001].value is None assert 0x00100010 == ds[0x00091002].value class TestDataSetToJson: def test_json_from_dicom_file(self, no_numpy_use, disable_value_validation): ds1 = dcmread(get_testdata_file("CT_small.dcm")) ds_json = ds1.to_json() ds2 = Dataset.from_json(ds_json) assert ds1 == ds2 ds_json = ds1.to_json_dict() ds2 = Dataset.from_json(ds_json) assert ds1 == ds2 def test_roundtrip(self): ds = Dataset() ds.add_new(0x00080005, "CS", "ISO_IR 100") ds.add_new(0x00090010, "LO", "Creator 1.0") ds.add_new(0x00091001, "SH", "Version1") ds.add_new(0x00091002, "OB", b"BinaryContent") ds.add_new(0x00091003, "OW", b"\x0102\x3040\x5060") ds.add_new(0x00091004, "OF", b"\x00\x01\x02\x03\x04\x05\x06\x07") ds.add_new( 0x00091005, "OD", b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03\x04\x05\x06\x07", ) ds.add_new( 0x00091006, "OL", b"\x00\x01\x02\x03\x04\x05\x06\x07\x01\x01\x02\x03" ) ds.add_new(0x00091007, "UI", "1.2.3.4.5.6") ds.add_new(0x00091008, "DA", "20200101") ds.add_new(0x00091009, "TM", "115500") ds.add_new(0x0009100A, "DT", "20200101115500.000000") ds.add_new(0x0009100B, "UL", 3000000000) ds.add_new(0x0009100C, "SL", -2000000000) ds.add_new(0x0009100D, "US", 40000) ds.add_new(0x0009100E, "SS", -22222) ds.add_new(0x0009100F, "FL", 3.14) ds.add_new(0x00091010, "FD", 3.14159265) ds.add_new(0x00091011, "CS", "TEST MODE") ds.add_new(0x00091012, "PN", "CITIZEN^1") ds.add_new(0x00091013, "PN", "Yamada^Tarou=山田^太郎=やまだ^たろう") ds.add_new(0x00091014, "IS", "42") ds.add_new(0x00091015, "DS", "3.14159265") ds.add_new(0x00091016, "AE", b"CONQUESTSRV1") ds.add_new(0x00091017, "AS", "055Y") ds.add_new(0x00091018, "LT", 50 * "Калинка,") ds.add_new(0x00091019, "UC", "LONG CODE VALUE") ds.add_new(0x0009101A, "UN", b"\x0102\x3040\x5060") ds.add_new(0x0009101B, "UR", "https://example.com") ds.add_new(0x0009101C, "AT", [0x00100010, 0x00100020]) ds.add_new(0x0009101D, "ST", 100 * "علي بابا") ds.add_new(0x0009101E, "SH", "Διονυσιος") ds.add_new(0x00090011, "LO", "Creator 2.0") ds.add_new(0x00091101, "SH", "Version2") ds.add_new(0x00091102, "US", 2) json_string = ds.to_json() json_model = json.loads(json_string) assert json_model["00080005"]["Value"] == ["ISO_IR 100"] assert json_model["00091007"]["Value"] == ["1.2.3.4.5.6"] assert json_model["0009100A"]["Value"] == ["20200101115500.000000"] assert json_model["0009100B"]["Value"] == [3000000000] assert json_model["0009100C"]["Value"] == [-2000000000] assert json_model["0009100D"]["Value"] == [40000] assert json_model["0009100F"]["Value"] == [3.14] assert json_model["00091010"]["Value"] == [3.14159265] assert json_model["00091018"]["Value"] == [50 * "Калинка,"] ds2 = Dataset.from_json(json_string) assert ds == ds2 ds2 = Dataset.from_json(json_model) assert ds == ds2 json_model2 = ds.to_json_dict() assert json_model == json_model2 def test_dataset_dumphandler(self): ds = Dataset() ds.add_new(0x00100010, "PN", "Jane^Doe") # as the order of the keys is not defined, we have to check both assert ds.to_json() in ( '{"00100010": {"vr": "PN", "Value": [{"Alphabetic": "Jane^Doe"}]}}', '{"00100010": {"Value": [{"Alphabetic": "Jane^Doe"}], "vr": "PN"}}', ) assert { "00100010": {"vr": "PN", "Value": [{"Alphabetic": "Jane^Doe"}]} } == ds.to_json(dump_handler=lambda d: d) def test_dataelement_dumphandler(self): element = DataElement(0x00100010, "PN", "Jane^Doe") # as the order of the keys is not defined, we have to check both assert element.to_json() in ( '{"vr": "PN", "Value": [{"Alphabetic": "Jane^Doe"}]}', '{"Value": [{"Alphabetic": "Jane^Doe"}], "vr": "PN"}', ) assert {"vr": "PN", "Value": [{"Alphabetic": "Jane^Doe"}]} == element.to_json( dump_handler=lambda d: d ) def test_sort_order(self): """Test that tags are serialized in ascending order.""" ds = Dataset() ds.add_new(0x00100040, "CS", "F") ds.add_new(0x00100030, "DA", "20000101") ds.add_new(0x00100020, "LO", "0017") ds.add_new(0x00100010, "PN", "Jane^Doe") ds_json = ds.to_json() assert ds_json.index('"00100010"') < ds_json.index('"00100020"') assert ds_json.index('"00100020"') < ds_json.index('"00100030"') assert ds_json.index('"00100030"') < ds_json.index('"00100040"') @mock.patch("pydicom.DataElement.to_json_dict", side_effect=ValueError) def test_suppress_invalid_tags(self, _): """Test tags that raise exceptions don't if suppress_invalid_tags True.""" ds = Dataset() ds.add_new(0x00100010, "PN", "Jane^Doe") with pytest.raises(ValueError): ds.to_json_dict() ds_json = ds.to_json_dict(suppress_invalid_tags=True) assert "00100010" not in ds_json def test_suppress_invalid_tags_with_failed_dataelement(self, caplog): """Test tags that raise exceptions don't if suppress_invalid_tags True.""" ds = Dataset() # we have to add a RawDataElement as creating a DataElement would # already raise an exception ds[0x00082128] = RawDataElement( Tag(0x00082128), "IS", 4, b"5.25", 0, True, True ) with caplog.at_level(logging.WARNING, logger="pydicom"): ds_json = ds.to_json_dict(suppress_invalid_tags=True) assert "00082128" not in ds_json assert ( "Error while processing tag 00082128: Invalid value for VR IS: '5.25'" ) in caplog.text class TestSequence: def test_nested_sequences(self, disable_value_validation): test1_json = get_testdata_file("test1.json") with open(test1_json) as f: with pytest.warns(UserWarning, match="No bulk data URI handler provided "): ds = Dataset.from_json(f.read()) del ds.PixelData assert ds.AcquisitionMatrix == [128, 0, 0, 32, None] ds2 = Dataset.from_json(ds.to_json()) assert ds == ds2 class TestBinary: def test_inline_binary(self): ds = Dataset() ds.add_new(0x00091002, "OB", b"BinaryContent") ds_json = ds.to_json_dict() assert "00091002" in ds_json assert "QmluYXJ5Q29udGVudA==" == ds_json["00091002"]["InlineBinary"] ds1 = Dataset.from_json(ds_json) assert ds == ds1 # also test if the binary is enclosed in a list ds_json["00091002"]["InlineBinary"] = ["QmluYXJ5Q29udGVudA=="] ds1 = Dataset.from_json(ds_json) assert ds == ds1 def test_inline_binary_un_sq(self): # Test unknown VR with inline binary and a sequence seq_item = Dataset() seq_item.update( { "PatientPosition": "HFS", "PatientSetupNumber": "1", "SetupTechniqueDescription": "", } ) ds_ref = Dataset() ds_ref.PatientSetupSequence = [seq_item] ds_json = { "300A0180": { "vr": "UN", "InlineBinary": "/v8A4B4AAAAYAABRBAAAAEhGUyAKMIIBAgAAADEgCjCyAQAAAAA=", } } ds1 = Dataset.from_json(ds_json) assert "PatientSetupSequence" in ds1 assert ds1 == ds_ref def test_inline_binary_un_pad(self): # Test unknown VR with inline binary and odd-length values # The value ("HFS") is an odd length. # The value is padded with a space before base64 encoding because # UN uses implicit VR little endian. # When reading back, the padding should be removed. ds_json = { "00185100": { "vr": "UN", "InlineBinary": "SEZTIA==", } } ds1 = Dataset.from_json(ds_json) assert "PatientPosition" in ds1 assert ds1.PatientPosition == "HFS" def test_invalid_inline_binary(self): msg = ( "Invalid attribute value for data element '00091002' - the value " "for 'InlineBinary' must be str, not int" ) ds_json = '{"00091002": {"vr": "OB", "InlineBinary": 42}}' with pytest.raises(TypeError, match=msg): Dataset.from_json(ds_json) ds_json = '{"00091002": {"vr": "OB", "InlineBinary": [42]}}' with pytest.raises(TypeError, match=msg): Dataset.from_json(ds_json) def test_valid_bulkdata_uri(self): ds_json = ( '{"00091002": {"vr": "OB", "BulkDataURI": ' '"http://example.com/bulkdatahandler"}}' ) msg = r"No bulk data URI handler provided" with pytest.warns(UserWarning, match=msg): ds = Dataset.from_json(ds_json) assert 0x00091002 in ds ds_json = ( '{"00091002": {"vr": "OB", "BulkDataURI": ' '["http://example.com/bulkdatahandler"]}}' ) with pytest.warns(UserWarning, match=msg): ds = Dataset.from_json(ds_json) assert 0x00091002 in ds def test_invalid_bulkdata_uri(self): msg = ( "Invalid attribute value for data element '00091002' - the value " "for 'BulkDataURI' must be str, not int" ) ds_json = '{"00091002": {"vr": "OB", "BulkDataURI": 42}}' with pytest.raises(TypeError, match=msg): Dataset.from_json(ds_json) ds_json = '{"00091002": {"vr": "OB", "BulkDataURI": [42]}}' with pytest.raises(TypeError, match=msg): Dataset.from_json(ds_json) def test_bulk_data_reader_is_called(self): def bulk_data_reader(value): return b"xyzzy" json_data = {"00091002": {"vr": "OB", "BulkDataURI": "https://a.dummy.url"}} ds = Dataset().from_json(json.dumps(json_data), bulk_data_reader) assert b"xyzzy" == ds[0x00091002].value def test_bulk_data_reader_is_called_2(self): def bulk_data_reader(tag, vr, value): return b"xyzzy" json_data = {"00091002": {"vr": "OB", "BulkDataURI": "https://a.dummy.url"}} ds = Dataset().from_json(json.dumps(json_data), bulk_data_reader) assert b"xyzzy" == ds[0x00091002].value def test_bulk_data_reader_is_called_within_SQ(self): def bulk_data_reader(_): return b"xyzzy" json_data = { "003a0200": { "vr": "SQ", "Value": [ {"54001010": {"vr": "OW", "BulkDataURI": "https://a.dummy.url"}} ], } } ds = Dataset().from_json(json.dumps(json_data), bulk_data_reader) assert b"xyzzy" == ds[0x003A0200].value[0][0x54001010].value class TestNumeric: def test_numeric_values(self): ds = Dataset() ds.add_new(0x0009100B, "UL", 3000000000) ds.add_new(0x0009100C, "SL", -2000000000) ds.add_new(0x0009100D, "US", 40000) ds.add_new(0x0009100E, "SS", -22222) ds.add_new(0x0009100F, "FL", 3.14) ds.add_new(0x00091010, "FD", 3.14159265) ds.add_new(0x00091014, "IS", "42") ds.add_new(0x00091015, "DS", "3.14159265") ds.add_new(0x00091102, "US", 2) ds_json = ds.to_json_dict() assert ds_json["0009100B"]["Value"] == [3000000000] assert ds_json["0009100C"]["Value"] == [-2000000000] assert ds_json["0009100D"]["Value"] == [40000] assert ds_json["0009100E"]["Value"] == [-22222] assert ds_json["0009100F"]["Value"] == [3.14] assert ds_json["00091010"]["Value"] == [3.14159265] assert ds_json["00091014"]["Value"] == [42] assert ds_json["00091015"]["Value"] == [3.14159265] assert ds_json["00091102"]["Value"] == [2] def test_numeric_types(self): ds = Dataset() ds.add_new(0x0009100B, "UL", 3000000000) ds.add_new(0x0009100C, "SL", -2000000000) ds.add_new(0x0009100D, "US", 40000) ds.add_new(0x0009100E, "SS", -22222) ds.add_new(0x0009100F, "FL", 3.14) ds.add_new(0x00091010, "FD", 3.14159265) ds.add_new(0x00091014, "IS", "42") ds.add_new(0x00091015, "DS", "3.14159265") ds.add_new(0x00091102, "US", 2) ds_json = ds.to_json_dict() assert isinstance(ds_json["0009100B"]["Value"][0], int) assert isinstance(ds_json["0009100C"]["Value"][0], int) assert isinstance(ds_json["0009100D"]["Value"][0], int) assert isinstance(ds_json["0009100E"]["Value"][0], int) assert isinstance(ds_json["0009100F"]["Value"][0], float) assert isinstance(ds_json["00091010"]["Value"][0], float) assert isinstance(ds_json["00091014"]["Value"][0], int) assert isinstance(ds_json["00091015"]["Value"][0], float) assert isinstance(ds_json["00091102"]["Value"][0], int) pydicom-pydicom-20aa4b7/tests/test_misc.py000066400000000000000000000041371515706620200207410ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for misc.py""" import logging import os import pytest from pydicom.data import get_testdata_file from pydicom.misc import is_dicom, size_in_bytes, warn_and_log test_file = get_testdata_file("CT_small.dcm") no_meta_file = get_testdata_file("ExplVR_LitEndNoMeta.dcm") class TestMisc: def test_is_dicom(self): """Test the is_dicom function.""" notdicom_file = os.path.abspath(__file__) # use own file # valid file returns True assert is_dicom(test_file) # return false for real file but not dicom assert not is_dicom(notdicom_file) # test invalid path with pytest.raises(OSError): is_dicom("xxxx.dcm") # Test no meta prefix/preamble fails assert not is_dicom(no_meta_file) def test_size_in_bytes(self): """Test convenience function size_in_bytes().""" # None or numbers shall be returned unchanged assert size_in_bytes(None) is None assert size_in_bytes(float("inf")) is None assert size_in_bytes(1234) == 1234 # string shall be parsed assert size_in_bytes("1234") == 1234 assert size_in_bytes("4 kb") == 4000 assert size_in_bytes("4 kib") == 4096 assert size_in_bytes("0.8 kb") == 800 assert size_in_bytes("16 KB") == 16e3 assert size_in_bytes("16 KiB") == 0x4000 assert size_in_bytes("3 MB") == 3e6 assert size_in_bytes("3 MiB") == 0x300000 assert size_in_bytes("2gB") == 2e9 assert size_in_bytes("2giB") == 0x80000000 with pytest.raises(ValueError): size_in_bytes("2 TB") with pytest.raises(ValueError): size_in_bytes("KB 2") with pytest.raises(ValueError): size_in_bytes("4 KB asdf") def test_warn_and_log(self, caplog): """Test warn_and_log""" with caplog.at_level(logging.WARNING, logger="pydicom"): with pytest.warns(UserWarning, match="Foo"): warn_and_log("Foo!") assert "Foo" in caplog.text pydicom-pydicom-20aa4b7/tests/test_multival.py000066400000000000000000000151121515706620200216360ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.multival module.""" import pytest from pydicom import config from pydicom.multival import MultiValue, ConstrainedList from pydicom.valuerep import DS, DSfloat, DSdecimal, IS, ISfloat from copy import deepcopy import sys python_version = sys.version_info class TestMultiValue: def testMultiDS(self): """MultiValue: Multi-valued data elements can be created""" multival = MultiValue(DS, ["11.1", "22.2", "33.3"]) for val in multival: assert isinstance(val, DSfloat | DSdecimal) def testEmptyElements(self): """MultiValue: Empty number string elements are not converted""" multival = MultiValue(DSfloat, ["1.0", ""]) assert 1.0 == multival[0] assert "" == multival[1] multival = MultiValue(IS, ["1", ""]) assert 1 == multival[0] assert "" == multival[1] multival = MultiValue(DSdecimal, ["1", ""]) assert 1 == multival[0] assert "" == multival[1] multival = MultiValue(IS, []) assert not multival assert 0 == len(multival) def testAppend(self): """MultiValue: Append of item converts it to required type""" multival = MultiValue(IS, [1, 5, 10]) multival.append("5") assert isinstance(multival[-1], IS) assert 5 == multival[-1] def testSetIndex(self): """MultiValue: Setting list item converts it to required type""" multival = MultiValue(IS, [1, 5, 10]) multival[1] = "7" assert isinstance(multival[1], IS) assert 7 == multival[1] def testDeleteIndex(self): """MultiValue: Deleting item at index behaves as expected""" multival = MultiValue(IS, [1, 5, 10]) del multival[1] assert 2 == len(multival) assert 1 == multival[0] assert 10 == multival[1] def test_extend(self): """MultiValue: Extending a list converts all to required type""" multival = MultiValue(IS, [1, 5, 10]) multival.extend(["7", 42]) assert isinstance(multival[-2], IS) assert isinstance(multival[-1], IS) assert 7 == multival[-2] msg = "An iterable is required" with pytest.raises(TypeError, match=msg): multival.extend(None) def testSlice(self): """MultiValue: Setting slice converts items to required type.""" multival = MultiValue(IS, range(7)) multival[2:7:2] = [4, 16, 36] for val in multival: assert isinstance(val, IS) assert 16 == multival[4] def testIssue236DeepCopy(self): """MultiValue: deepcopy of MultiValue does not generate an error""" multival = MultiValue(IS, range(7)) deepcopy(multival) multival = MultiValue(DS, range(7)) deepcopy(multival) multival = MultiValue(DSfloat, range(7)) deepcopy(multival) def testSorting(self): """MultiValue: allow inline sort.""" multival = MultiValue(DS, [12, 33, 5, 7, 1]) multival.sort() assert [1, 5, 7, 12, 33] == multival multival.sort(reverse=True) assert [33, 12, 7, 5, 1] == multival multival.sort(key=str) assert [1, 12, 33, 5, 7] == multival def test_equal(self): """MultiValue: test equality operator""" multival = MultiValue(DS, [12, 33, 5, 7, 1]) multival2 = MultiValue(DS, [12, 33, 5, 7, 1]) multival3 = MultiValue(DS, [33, 12, 5, 7, 1]) assert multival == multival2 assert not (multival == multival3) multival = MultiValue(str, ["a", "b", "c"]) multival2 = MultiValue(str, ["a", "b", "c"]) multival3 = MultiValue(str, ["b", "c", "a"]) assert multival == multival2 assert not (multival == multival3) def test_not_equal(self): """MultiValue: test equality operator""" multival = MultiValue(DS, [12, 33, 5, 7, 1]) multival2 = MultiValue(DS, [12, 33, 5, 7, 1]) multival3 = MultiValue(DS, [33, 12, 5, 7, 1]) assert not multival != multival2 assert multival != multival3 multival = MultiValue(str, ["a", "b", "c"]) multival2 = MultiValue(str, ["a", "b", "c"]) multival3 = MultiValue(str, ["b", "c", "a"]) assert not (multival != multival2) assert multival != multival3 def test_str_rep(self): """MultiValue: test print output""" multival = MultiValue(IS, []) assert "" == str(multival) multival.extend(["1", 2, 3, 4]) assert "[1, 2, 3, 4]" == str(multival) multival = MultiValue(str, [1, 2, 3]) assert "['1', '2', '3']" == str(multival) multival = MultiValue(int, [1, 2, 3]) assert "[1, 2, 3]" == str(multival) multival = MultiValue(float, [1.1, 2.2, 3.3]) assert "[1.1, 2.2, 3.3]" == str(multival) mv = MultiValue(IS, []) mv._list = ["1234", b"\x01\x00"] assert "['1234', b'\\x01\\x00']" == str(mv) def test_setitem(self): """Test MultiValue.__setitem__().""" mv = MultiValue(int, [1, 2, 3]) with pytest.raises(TypeError, match="'int' object is not iterable"): mv[1:1] = 4 assert [1, 2, 3] == mv mv[1:1] = [4] assert [1, 4, 2, 3] == mv mv[1:2] = [5, 6] assert [1, 5, 6, 2, 3] == mv mv[1:3] = [7, 8] assert [1, 7, 8, 2, 3] == mv def test_iadd(self): """Test += [T, .]""" multival = MultiValue(IS, [1, 5, 10]) multival += ["7", 42] assert isinstance(multival[-2], IS) assert isinstance(multival[-1], IS) assert 7 == multival[-2] msg = "An iterable is required" with pytest.raises(TypeError, match=msg): multival += None def test_IS_str(self): """Test IS works OK with empty str""" multival = MultiValue(ISfloat, [1, 2, "", 3, 4]) assert multival == [1, 2, "", 3, 4] multival = MultiValue(IS, [1, 2, "", 3, 4]) assert multival == [1, 2, "", 3, 4] def test_DS_str(self): """Test DS works OK with empty str""" multival = MultiValue(DSfloat, [1, 2, "", 3, 4]) assert multival == [1, 2, "", 3, 4] multival = MultiValue(DSdecimal, [1, 2, "", 3, 4]) assert multival == [1, 2, "", 3, 4] def test_constrained_list_raises(): """Test ConstrainedList raises if no _validate() override.""" class Foo(ConstrainedList): pass msg = r"'Foo._validate\(\)' must be implemented" with pytest.raises(NotImplementedError, match=msg): Foo([1, 2, 3, 4]) pydicom-pydicom-20aa4b7/tests/test_numpy_pixel_data.py000066400000000000000000001507411515706620200233530ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for the pixel_data_handlers.numpy_handler module. There are the following possibilities: * numpy is not available and * the numpy handler is not available * the numpy handler is available * numpy is available and * the numpy handler is not available * the numpy handler is available **Supported transfer syntaxes** * 1.2.840.10008.1.2 : Implicit VR Little Endian * 1.2.840.10008.1.2.1 : Explicit VR Little Endian * 1.2.840.10008.1.2.1.99 : Deflated Explicit VR Little Endian * 1.2.840.10008.1.2.2 : Explicit VR Big Endian **Elements affecting the handler** * PixelRepresentation * BitsAllocated * SamplesPerPixel * NumberOfFrames * PlanarConfiguration """ import pytest from pydicom import config from pydicom.data import get_testdata_file from pydicom.dataset import Dataset, FileMetaDataset from pydicom.filereader import dcmread from pydicom.pixels.processing import convert_color_space from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, AllTransferSyntaxes, ) try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: from pydicom.pixel_data_handlers import numpy_handler as NP_HANDLER from pydicom.pixel_data_handlers.numpy_handler import ( get_pixeldata, unpack_bits, ) except ImportError: NP_HANDLER = None # Paths to the test datasets # IMPL: Implicit VR Little Endian # EXPL: Explicit VR Little Endian # DEFL: Deflated Explicit VR Little Endian # EXPB: Explicit VR Big Endian # 1/1, 1 sample/pixel, 1 frame EXPL_1_1_1F = get_testdata_file("liver_1frame.dcm") EXPB_1_1_1F = get_testdata_file("liver_expb_1frame.dcm") # 1/1, 1 sample/pixel, 3 frame EXPL_1_1_3F = get_testdata_file("liver.dcm") EXPB_1_1_3F = get_testdata_file("liver_expb.dcm") # 1/1, 3 sample/pixel, 1 frame EXPL_1_3_1F = None EXPB_1_3_1F = None # 1/1, 3 sample/pixel, XXX frame EXPL_1_3_XF = None EXPB_1_3_XF = None # 8/8, 1 sample/pixel, 1 frame DEFL_8_1_1F = get_testdata_file("image_dfl.dcm") EXPL_8_1_1F = get_testdata_file("OBXXXX1A.dcm") EXPB_8_1_1F = get_testdata_file("OBXXXX1A_expb.dcm") # 8/8, 1 sample/pixel, 2 frame EXPL_8_1_2F = get_testdata_file("OBXXXX1A_2frame.dcm") EXPB_8_1_2F = get_testdata_file("OBXXXX1A_expb_2frame.dcm") # 8/8, 3 sample/pixel, 1 frame EXPL_8_3_1F = get_testdata_file("SC_rgb.dcm") EXPB_8_3_1F = get_testdata_file("SC_rgb_expb.dcm") # 8/8, 3 samples/pixel, 1 frame, 3 x 3 EXPL_8_3_1F_ODD = get_testdata_file("SC_rgb_small_odd.dcm") EXPL_8_3_1F_ODD_BIGE = get_testdata_file("SC_rgb_small_odd_big_endian.dcm") # 8/8, 3 sample/pixel, 1 frame, YBR_FULL_422 EXPL_8_3_1F_YBR422 = get_testdata_file("SC_ybr_full_422_uncompressed.dcm") # 8/8, 3 sample/pixel, 1 frame, YBR_FULL EXPL_8_3_1F_YBR = get_testdata_file("SC_ybr_full_uncompressed.dcm") # 8/8, 3 sample/pixel, 2 frame EXPL_8_3_2F = get_testdata_file("SC_rgb_2frame.dcm") EXPB_8_3_2F = get_testdata_file("SC_rgb_expb_2frame.dcm") # 16/16, 1 sample/pixel, 1 frame IMPL_16_1_1F = get_testdata_file("MR_small_implicit.dcm") EXPL_16_1_1F = get_testdata_file("MR_small.dcm") EXPB_16_1_1F = get_testdata_file("MR_small_expb.dcm") # Pixel Data with 128 bytes trailing padding EXPL_16_1_1F_PAD = get_testdata_file("MR_small_padded.dcm") # 16/12, 1 sample/pixel, 10 frame EXPL_16_1_10F = get_testdata_file("emri_small.dcm") EXPB_16_1_10F = get_testdata_file("emri_small_big_endian.dcm") # 16/16, 3 sample/pixel, 1 frame EXPL_16_3_1F = get_testdata_file("SC_rgb_16bit.dcm") EXPB_16_3_1F = get_testdata_file("SC_rgb_expb_16bit.dcm") # 16/16, 3 sample/pixel, 2 frame EXPL_16_3_2F = get_testdata_file("SC_rgb_16bit_2frame.dcm") EXPB_16_3_2F = get_testdata_file("SC_rgb_expb_16bit_2frame.dcm") # 32/32, 1 sample/pixel, 1 frame IMPL_32_1_1F = get_testdata_file("rtdose_1frame.dcm") EXPB_32_1_1F = get_testdata_file("rtdose_expb_1frame.dcm") # 32/32, 1 sample/pixel, 15 frame IMPL_32_1_15F = get_testdata_file("rtdose.dcm") EXPB_32_1_15F = get_testdata_file("rtdose_expb.dcm") # 32/32, 3 sample/pixel, 1 frame EXPL_32_3_1F = get_testdata_file("SC_rgb_32bit.dcm") EXPB_32_3_1F = get_testdata_file("SC_rgb_expb_32bit.dcm") # 32/32, 3 sample/pixel, 2 frame EXPL_32_3_2F = get_testdata_file("SC_rgb_32bit_2frame.dcm") EXPB_32_3_2F = get_testdata_file("SC_rgb_expb_32bit_2frame.dcm") # Transfer syntaxes supported by other handlers # JPEG Baseline (Process 1) JPEG_BASELINE_1 = get_testdata_file("SC_rgb_jpeg_dcmtk.dcm") # JPEG Baseline (Process 2 and 4) JPEG_EXTENDED_2 = get_testdata_file("JPEG-lossy.dcm") # JPEG Lossless (Process 14) JPEG_LOSSLESS_14 = None # JPEG Lossless (Process 14, Selection Value 1) JPEG_LOSSLESS_14_1 = get_testdata_file("SC_rgb_jpeg_gdcm.dcm") # JPEG-LS Lossless JPEG_LS_LOSSLESS = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") # JPEG-LS Lossy JPEG_LS_LOSSY = None # JPEG2k Lossless JPEG_2K_LOSSLESS = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") # JPEG2k JPEG_2K = get_testdata_file("JPEG2000.dcm") # RLE Lossless RLE = get_testdata_file("MR_small_RLE.dcm") # No Image Pixel module NO_PIXEL = get_testdata_file("rtplan.dcm") # Transfer Syntaxes (non-retired + Explicit VR Big Endian) SUPPORTED_SYNTAXES = [ ImplicitVRLittleEndian, ExplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian, ] UNSUPPORTED_SYNTAXES = list(set(AllTransferSyntaxes) ^ set(SUPPORTED_SYNTAXES)) def test_unsupported_syntaxes(): """Test that UNSUPPORTED_SYNTAXES is as expected.""" for syntax in SUPPORTED_SYNTAXES: assert syntax not in UNSUPPORTED_SYNTAXES REFERENCE_DATA_UNSUPPORTED = [ (JPEG_BASELINE_1, ("1.2.840.10008.1.2.4.50", "Lestrade^G")), (JPEG_EXTENDED_2, ("1.2.840.10008.1.2.4.51", "CompressedSamples^NM1")), # (JPEG_LOSSLESS_14, ('1.2.840.10008.1.2.4.57')), # No dataset available (JPEG_LOSSLESS_14_1, ("1.2.840.10008.1.2.4.70", "Lestrade^G")), (JPEG_LS_LOSSLESS, ("1.2.840.10008.1.2.4.80", "CompressedSamples^MR1")), # (JPEG_LS_LOSSY, ('1.2.840.10008.1.2.4.81')), # No dataset available (JPEG_2K_LOSSLESS, ("1.2.840.10008.1.2.4.90", "")), (JPEG_2K, ("1.2.840.10008.1.2.4.91", "CompressedSamples^NM1")), (RLE, ("1.2.840.10008.1.2.5", "CompressedSamples^MR1")), ] SUPPORTED_HANDLER_NAMES = ("numpy", "NumPy", "np", "np_handler", "numpy_handler") # Numpy and the numpy handler are unavailable @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") class TestNoNumpy_NoNumpyHandler: """Tests for handling datasets without numpy and the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = config.pixel_data_handlers config.pixel_data_handlers = [] def teardown_method(self): """Restore the environment.""" config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert not HAVE_NP assert NP_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in dataset.""" # Explicit little ds = dcmread(EXPL_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) # Implicit little ds = dcmread(IMPL_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) # Deflated little ds = dcmread(DEFL_8_1_1F) assert "^^^^" == ds.PatientName assert 262144 == len(ds.PixelData) # Explicit big ds = dcmread(EXPB_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName def test_pixel_array_raises(self): """Test pixel_array raises exception for all syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid with pytest.raises(NotImplementedError, match=f"UID of '{uid}'"): ds.pixel_array def test_using_numpy_handler_raises(self): ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) msg = "The dataset is already uncompressed" with pytest.raises(ValueError, match=msg): ds.decompress("numpy") # Numpy unavailable and the numpy handler is available @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") class TestNoNumpy_NumpyHandler: """Tests for handling datasets without numpy and the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = config.pixel_data_handlers config.pixel_data_handlers = [NP_HANDLER] def teardown_method(self): """Restore the environment.""" config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert not HAVE_NP assert NP_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in dataset.""" # Explicit little ds = dcmread(EXPL_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) # Implicit little ds = dcmread(IMPL_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) # Deflated little ds = dcmread(DEFL_8_1_1F) assert "^^^^" == ds.PatientName assert 262144 == len(ds.PixelData) # Explicit big ds = dcmread(EXPB_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName def test_unsupported_pixel_array_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid with pytest.raises(NotImplementedError, match=f"UID of '{uid}'"): ds.pixel_array def test_supported_pixel_array_raises(self): """Test pixel_array raises exception for supported syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"The following handlers are available to decode the pixel " r"data however they are missing required dependencies: " r"Numpy \(req. NumPy\)" ) with pytest.raises(RuntimeError, match=exc_msg): ds.pixel_array # Numpy is available, the numpy handler is unavailable @pytest.mark.skipif(not HAVE_NP, reason="Numpy is unavailable") class TestNumpy_NoNumpyHandler: """Tests for handling datasets without the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = config.pixel_data_handlers config.pixel_data_handlers = [] def teardown_method(self): """Restore the environment.""" config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP # We numpy handler should still be available assert NP_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in dataset.""" # Explicit little ds = dcmread(EXPL_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) # Implicit little ds = dcmread(IMPL_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) # Deflated little ds = dcmread(DEFL_8_1_1F) assert "^^^^" == ds.PatientName assert 262144 == len(ds.PixelData) # Explicit big ds = dcmread(EXPB_16_1_1F) assert "CompressedSamples^MR1" == ds.PatientName assert 8192 == len(ds.PixelData) @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName def test_pixel_array_raises(self): """Test pixel_array raises exception for all syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid with pytest.raises((NotImplementedError, RuntimeError)): ds.pixel_array # Numpy and the numpy handler are available MATCHING_DATASETS = [ (EXPL_1_1_1F, EXPB_1_1_1F), (EXPL_1_1_3F, EXPB_1_1_3F), (EXPL_8_1_1F, EXPB_8_1_1F), (EXPL_8_1_2F, EXPB_8_1_2F), (EXPL_8_3_1F, EXPB_8_3_1F), (EXPL_8_3_2F, EXPB_8_3_2F), (EXPL_16_1_1F, EXPB_16_1_1F), (EXPL_16_1_10F, EXPB_16_1_10F), (EXPL_16_3_1F, EXPB_16_3_1F), (EXPL_16_3_2F, EXPB_16_3_2F), (IMPL_32_1_1F, EXPB_32_1_1F), (IMPL_32_1_15F, EXPB_32_1_15F), (EXPL_32_3_1F, EXPB_32_3_1F), (EXPL_32_3_2F, EXPB_32_3_2F), ] EXPL = ExplicitVRLittleEndian IMPL = ImplicitVRLittleEndian REFERENCE_DATA_LITTLE = [ # fpath, (syntax, bits, nr samples, pixel repr, nr frames, shape, dtype) (EXPL_1_1_1F, (EXPL, 1, 1, 0, 1, (512, 512), "uint8")), (EXPL_1_1_3F, (EXPL, 1, 1, 0, 3, (3, 512, 512), "uint8")), (EXPL_8_1_1F, (EXPL, 8, 1, 0, 1, (600, 800), "uint8")), (EXPL_8_3_1F_ODD, (EXPL, 8, 3, 0, 1, (3, 3, 3), "uint8")), (EXPL_8_3_1F_YBR422, (EXPL, 8, 3, 0, 1, (100, 100, 3), "uint8")), (EXPL_8_1_2F, (EXPL, 8, 1, 0, 2, (2, 600, 800), "uint8")), (EXPL_8_3_1F, (EXPL, 8, 3, 0, 1, (100, 100, 3), "uint8")), (EXPL_8_3_2F, (EXPL, 8, 3, 0, 2, (2, 100, 100, 3), "uint8")), (EXPL_16_1_1F, (EXPL, 16, 1, 1, 1, (64, 64), "int16")), (EXPL_16_1_10F, (EXPL, 16, 1, 0, 10, (10, 64, 64), "uint16")), (EXPL_16_3_1F, (EXPL, 16, 3, 0, 1, (100, 100, 3), "uint16")), (EXPL_16_3_2F, (EXPL, 16, 3, 0, 2, (2, 100, 100, 3), "uint16")), (IMPL_32_1_1F, (IMPL, 32, 1, 0, 1, (10, 10), "uint32")), (IMPL_32_1_15F, (IMPL, 32, 1, 0, 15, (15, 10, 10), "uint32")), (EXPL_32_3_1F, (EXPL, 32, 3, 0, 1, (100, 100, 3), "uint32")), (EXPL_32_3_2F, (EXPL, 32, 3, 0, 2, (2, 100, 100, 3), "uint32")), ] @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_NumpyHandler: """Tests for handling Pixel Data with the handler.""" def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = config.pixel_data_handlers config.pixel_data_handlers = [NP_HANDLER] def teardown_method(self): """Restore the environment.""" config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP assert NP_HANDLER is not None def test_unsupported_syntax_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid with pytest.raises((NotImplementedError, RuntimeError)): ds.pixel_array def test_dataset_pixel_array_handler_needs_convert(self): """Test Dataset.pixel_array when converting to RGB.""" ds = dcmread(EXPL_8_3_1F) ds.pixel_array_options(use_v2_backend=True) # Convert to YBR first arr = ds.pixel_array assert (255, 0, 0) == tuple(arr[5, 50, :]) arr = convert_color_space(arr, "RGB", "YBR_FULL") ds.PixelData = arr.tobytes() del ds._pixel_array # Weird PyPy2 issue without this # Test normal functioning (False) assert (76, 85, 255) == tuple(ds.pixel_array[5, 50, :]) def needs_convert(ds): """Change the default return to True""" return True # Test modified orig_fn = NP_HANDLER.needs_to_convert_to_RGB NP_HANDLER.needs_to_convert_to_RGB = needs_convert # Ensure the pixel array gets updated ds._pixel_id = None assert (254, 0, 0) == tuple(ds.pixel_array[5, 50, :]) # Reset NP_HANDLER.needs_to_convert_to_RGB = orig_fn def test_dataset_pixel_array_no_pixels(self): """Test good exception message if no pixel data in dataset.""" ds = dcmread(NO_PIXEL) ds.pixel_array_options(use_v2_backend=True) msg = ( r"Unable to convert the pixel data: one of Pixel Data, Float " r"Pixel Data or Double Float Pixel Data must be present in the " r"dataset" ) with pytest.raises(AttributeError, match=msg): ds.pixel_array @pytest.mark.parametrize("fpath, data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName def test_pixel_array_8bit_un_signed(self): """Test pixel_array for 8-bit unsigned -> signed data.""" ds = dcmread(EXPL_8_1_1F) ds.pixel_array_options(use_v2_backend=True) # 0 is unsigned int, 1 is 2's complement assert ds.PixelRepresentation == 0 ds.PixelRepresentation = 1 arr = ds.pixel_array ref = dcmread(EXPL_8_1_1F) assert not np.array_equal(arr, ref.pixel_array) assert (600, 800) == arr.shape assert -12 == arr[0].min() == arr[0].max() assert (1, -10, 1) == tuple(arr[300, 491:494]) assert 0 == arr[-1].min() == arr[-1].max() @pytest.mark.parametrize("handler_name", SUPPORTED_HANDLER_NAMES) def test_decompress_using_handler(self, handler_name): """Test different possibilities for the numpy handler name.""" ds = dcmread(EXPL_8_1_1F) with pytest.raises(ValueError, match="The dataset is already uncompressed"): ds.decompress(handler_name) def test_pixel_array_16bit_un_signed(self): """Test pixel_array for 16-bit unsigned -> signed.""" ds = dcmread(EXPL_16_3_1F) ds.pixel_array_options(use_v2_backend=True) # 0 is unsigned int, 1 is 2's complement assert ds.PixelRepresentation == 0 ds.PixelRepresentation = 1 arr = ds.pixel_array ref = dcmread(EXPL_16_3_1F) assert not np.array_equal(arr, ref.pixel_array) assert (100, 100, 3) == arr.shape assert -1 == arr[0, :, 0].min() == arr[0, :, 0].max() assert -32640 == arr[50, :, 0].min() == arr[50, :, 0].max() def test_pixel_array_32bit_un_signed(self): """Test pixel_array for 32-bit unsigned -> signed.""" ds = dcmread(EXPL_32_3_1F) ds.pixel_array_options(use_v2_backend=True) # 0 is unsigned int, 1 is 2's complement assert ds.PixelRepresentation == 0 ds.PixelRepresentation = 1 arr = ds.pixel_array ref = dcmread(EXPL_32_3_1F) assert not np.array_equal(arr, ref.pixel_array) assert (100, 100, 3) == arr.shape assert -1 == arr[0, :, 0].min() == arr[0, :, 0].max() assert -2139062144 == arr[50, :, 0].min() == arr[50, :, 0].max() # Endian independent datasets def test_8bit_1sample_1frame(self): """Test pixel_array for 8-bit, 1 sample/pixel, 1 frame.""" # Check supported syntaxes ds = dcmread(EXPL_8_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (600, 800) == arr.shape assert 244 == arr[0].min() == arr[0].max() assert (1, 246, 1) == tuple(arr[300, 491:494]) assert 0 == arr[-1].min() == arr[-1].max() def test_8bit_1sample_2frame(self): """Test pixel_array for 8-bit, 1 sample/pixel, 2 frame.""" # Check supported syntaxes ds = dcmread(EXPL_8_1_2F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (2, 600, 800) == arr.shape # Frame 1 assert 244 == arr[0, 0].min() == arr[0, 0].max() assert (1, 246, 1) == tuple(arr[0, 300, 491:494]) assert 0 == arr[0, -1].min() == arr[0, -1].max() # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) def test_8bit_3sample_1frame_odd_size(self): """Test pixel_array for odd sized (3x3) pixel data.""" # Check supported syntaxes ds = dcmread(EXPL_8_3_1F_ODD) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid ds._pixel_id = {} ds._pixel_array = None assert ds.pixel_array[0].tolist() == [ [166, 141, 52], [166, 141, 52], [166, 141, 52], ] assert ds.pixel_array[1].tolist() == [ [63, 87, 176], [63, 87, 176], [63, 87, 176], ] assert ds.pixel_array[2].tolist() == [ [158, 158, 158], [158, 158, 158], [158, 158, 158], ] def test_8bit_3sample_1frame_ybr422(self): """Test pixel_array for YBR_FULL_422 pixel data.""" ds = dcmread(EXPL_8_3_1F_YBR422) ds.pixel_array_options(use_v2_backend=True) assert ds.PhotometricInterpretation == "YBR_FULL_422" arr = ds.pixel_array # Check resampling assert [[76, 85, 255], [76, 85, 255], [76, 85, 255], [76, 85, 255]] == arr[ 0:4, 0, : ].tolist() # Check values assert (76, 85, 255) == tuple(arr[5, 50, :]) assert (166, 106, 193) == tuple(arr[15, 50, :]) assert (150, 46, 20) == tuple(arr[25, 50, :]) assert (203, 86, 75) == tuple(arr[35, 50, :]) assert (29, 255, 107) == tuple(arr[45, 50, :]) assert (142, 193, 118) == tuple(arr[55, 50, :]) assert (0, 128, 128) == tuple(arr[65, 50, :]) assert (64, 128, 128) == tuple(arr[75, 50, :]) assert (192, 128, 128) == tuple(arr[85, 50, :]) assert (255, 128, 128) == tuple(arr[95, 50, :]) def test_8bit_3sample_1frame(self): """Test pixel_array for 8-bit, 3 sample/pixel, 1 frame.""" # Check supported syntaxes ds = dcmread(EXPL_8_3_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (255, 0, 0) == tuple(arr[5, 50, :]) assert (255, 128, 128) == tuple(arr[15, 50, :]) assert (0, 255, 0) == tuple(arr[25, 50, :]) assert (128, 255, 128) == tuple(arr[35, 50, :]) assert (0, 0, 255) == tuple(arr[45, 50, :]) assert (128, 128, 255) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (64, 64, 64) == tuple(arr[75, 50, :]) assert (192, 192, 192) == tuple(arr[85, 50, :]) assert (255, 255, 255) == tuple(arr[95, 50, :]) def test_8bit_3sample_2frame(self): """Test pixel_array for 8-bit, 3 sample/pixel, 2 frame.""" # Check supported syntaxes ds = dcmread(EXPL_8_3_2F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable # Frame 1 frame = arr[0] assert (255, 0, 0) == tuple(frame[5, 50, :]) assert (255, 128, 128) == tuple(frame[15, 50, :]) assert (0, 255, 0) == tuple(frame[25, 50, :]) assert (128, 255, 128) == tuple(frame[35, 50, :]) assert (0, 0, 255) == tuple(frame[45, 50, :]) assert (128, 128, 255) == tuple(frame[55, 50, :]) assert (0, 0, 0) == tuple(frame[65, 50, :]) assert (64, 64, 64) == tuple(frame[75, 50, :]) assert (192, 192, 192) == tuple(frame[85, 50, :]) assert (255, 255, 255) == tuple(frame[95, 50, :]) # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) # Little endian datasets @pytest.mark.parametrize("fpath, data", REFERENCE_DATA_LITTLE) def test_properties(self, fpath, data): """Test dataset and pixel array properties are as expected.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.BitsAllocated == data[1] assert ds.SamplesPerPixel == data[2] assert ds.PixelRepresentation == data[3] assert getattr(ds, "NumberOfFrames", 1) == data[4] # Check all little endian syntaxes for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert data[5] == arr.shape assert arr.dtype == data[6] # Default to 1 if element not present nr_frames = getattr(ds, "NumberOfFrames", 1) # Odd sized data is padded by a final 0x00 byte size = ds.Rows * ds.Columns * nr_frames * data[1] / 8 * data[2] # YBR_FULL_422 data is 2/3rds usual size if ds.PhotometricInterpretation == "YBR_FULL_422": size = size // 3 * 2 assert len(ds.PixelData) == size + size % 2 if size % 2: assert ds.PixelData[-1] == b"\x00"[0] def test_little_1bit_1sample_1frame(self): """Test pixel_array for little 1-bit, 1 sample/pixel, 1 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_1_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert arr.max() == 1 assert arr.min() == 0 assert (0, 1, 1) == tuple(arr[155, 180:183]) assert (1, 0, 1, 0) == tuple(arr[155, 310:314]) assert (0, 1, 1) == tuple(arr[254, 78:81]) assert (1, 0, 0, 1, 1, 0) == tuple(arr[254, 304:310]) def test_little_1bit_1sample_3frame(self): """Test pixel_array for little 1-bit, 1 sample/pixel, 3 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_1_1_3F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert arr.max() == 1 assert arr.min() == 0 # Frame 1 assert (0, 1, 1) == tuple(arr[0, 155, 180:183]) assert (1, 0, 1, 0) == tuple(arr[0, 155, 310:314]) assert (0, 1, 1) == tuple(arr[0, 254, 78:81]) assert (1, 0, 0, 1, 1, 0) == tuple(arr[0, 254, 304:310]) assert 0 == arr[0][0][0] assert 0 == arr[2][511][511] assert 1 == arr[1][256][256] # Frame 2 assert 0 == arr[1, 146, :254].max() assert (0, 1, 1, 1, 1, 1, 0, 1) == tuple(arr[1, 146, 253:261]) assert 0 == arr[1, 146, 261:].max() assert 0 == arr[1, 210, :97].max() assert 1 == arr[1, 210, 97:350].max() assert 0 == arr[1, 210, 350:].max() # Frame 3 assert 0 == arr[2, 147, :249].max() assert (0, 1, 0, 1, 1, 1) == tuple(arr[2, 147, 248:254]) assert (1, 0, 1, 0, 1, 1) == tuple(arr[2, 147, 260:266]) assert 0 == arr[2, 147, 283:].max() assert 0 == arr[2, 364, :138].max() assert (0, 1, 0, 1, 1, 0, 0, 1) == tuple(arr[2, 364, 137:145]) assert (1, 0, 0, 1, 0) == tuple(arr[2, 364, 152:157]) assert 0 == arr[2, 364, 157:].max() def test_little_16bit_1sample_1frame(self): """Test pixel_array for little 16-bit, 1 sample/pixel, 1 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (422, 319, 361) == tuple(arr[0, 31:34]) assert (366, 363, 322) == tuple(arr[31, :3]) assert (1369, 1129, 862) == tuple(arr[-1, -3:]) # Last pixel assert 862 == arr[-1, -1] def test_little_16bit_1sample_1frame_padded(self): """Test with padded little 16-bit, 1 sample/pixel, 1 frame.""" ds = dcmread(EXPL_16_1_1F_PAD) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian assert ds.BitsAllocated == 16 assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 1 nr_frames = getattr(ds, "NumberOfFrames", 1) assert nr_frames == 1 # Odd sized data is padded by a final 0x00 byte size = ds.Rows * ds.Columns * nr_frames * 16 / 8 * ds.SamplesPerPixel # Has excess padding assert len(ds.PixelData) > size + size % 2 msg = ( r"The length of the pixel data in the dataset \(8320 bytes\) " r"indicates it contains excess padding. 128 bytes will be " r"removed from the end of the data" ) with pytest.warns(UserWarning, match=msg): arr = ds.pixel_array assert (64, 64) == arr.shape assert arr.dtype == "int16" assert arr.flags.writeable assert (422, 319, 361) == tuple(arr[0, 31:34]) assert (366, 363, 322) == tuple(arr[31, :3]) assert (1369, 1129, 862) == tuple(arr[-1, -3:]) # Last pixel assert 862 == arr[-1, -1] def test_little_16bit_1sample_10frame(self): """Test pixel_array for little 16-bit, 1 sample/pixel, 10 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_16_1_10F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable # Frame 1 assert (206, 197, 159) == tuple(arr[0, 0, 31:34]) assert (49, 78, 128) == tuple(arr[0, 31, :3]) assert (362, 219, 135) == tuple(arr[0, -1, -3:]) # Frame 5 assert (67, 82, 44) == tuple(arr[4, 0, 31:34]) assert (37, 41, 17) == tuple(arr[4, 31, :3]) assert (225, 380, 355) == tuple(arr[4, -1, -3:]) # Frame 10 assert (72, 86, 69) == tuple(arr[-1, 0, 31:34]) assert (25, 4, 9) == tuple(arr[-1, 31, :3]) assert (227, 300, 147) == tuple(arr[-1, -1, -3:]) def test_little_16bit_3sample_1frame(self): """Test pixel_array for little 16-bit, 3 sample/pixel, 1 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_16_3_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (65535, 0, 0) == tuple(arr[5, 50, :]) assert (65535, 32896, 32896) == tuple(arr[15, 50, :]) assert (0, 65535, 0) == tuple(arr[25, 50, :]) assert (32896, 65535, 32896) == tuple(arr[35, 50, :]) assert (0, 0, 65535) == tuple(arr[45, 50, :]) assert (32896, 32896, 65535) == tuple(arr[55, 50, :]) assert (0, 0, 0) == tuple(arr[65, 50, :]) assert (16448, 16448, 16448) == tuple(arr[75, 50, :]) assert (49344, 49344, 49344) == tuple(arr[85, 50, :]) assert (65535, 65535, 65535) == tuple(arr[95, 50, :]) def test_little_16bit_3sample_2frame(self): """Test pixel_array for little 16-bit, 3 sample/pixel, 2 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_16_3_2F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable # Frame 1 assert (65535, 0, 0) == tuple(arr[0, 5, 50, :]) assert (65535, 32896, 32896) == tuple(arr[0, 15, 50, :]) assert (0, 65535, 0) == tuple(arr[0, 25, 50, :]) assert (32896, 65535, 32896) == tuple(arr[0, 35, 50, :]) assert (0, 0, 65535) == tuple(arr[0, 45, 50, :]) assert (32896, 32896, 65535) == tuple(arr[0, 55, 50, :]) assert (0, 0, 0) == tuple(arr[0, 65, 50, :]) assert (16448, 16448, 16448) == tuple(arr[0, 75, 50, :]) assert (49344, 49344, 49344) == tuple(arr[0, 85, 50, :]) assert (65535, 65535, 65535) == tuple(arr[0, 95, 50, :]) # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) def test_little_32bit_1sample_1frame(self): """Test pixel_array for little 32-bit, 1 sample/pixel, 1 frame.""" # Check all little endian syntaxes ds = dcmread(IMPL_32_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (1249000, 1249000, 1250000) == tuple(arr[0, :3]) assert (1031000, 1029000, 1027000) == tuple(arr[4, 3:6]) assert (803000, 801000, 798000) == tuple(arr[-1, -3:]) def test_little_32bit_1sample_15frame(self): """Test pixel_array for little 32-bit, 1 sample/pixel, 15 frame.""" # Check all little endian syntaxes ds = dcmread(IMPL_32_1_15F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable # Frame 1 assert (1249000, 1249000, 1250000) == tuple(arr[0, 0, :3]) assert (1031000, 1029000, 1027000) == tuple(arr[0, 4, 3:6]) assert (803000, 801000, 798000) == tuple(arr[0, -1, -3:]) # Frame 8 assert (1253000, 1253000, 1249000) == tuple(arr[7, 0, :3]) assert (1026000, 1023000, 1022000) == tuple(arr[7, 4, 3:6]) assert (803000, 803000, 803000) == tuple(arr[7, -1, -3:]) # Frame 15 assert (1249000, 1250000, 1251000) == tuple(arr[-1, 0, :3]) assert (1031000, 1031000, 1031000) == tuple(arr[-1, 4, 3:6]) assert (801000, 800000, 799000) == tuple(arr[-1, -1, -3:]) def test_little_32bit_3sample_1frame(self): """Test pixel_array for little 32-bit, 3 sample/pixel, 1 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_32_3_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid ar = ds.pixel_array assert ar.flags.writeable assert (4294967295, 0, 0) == tuple(ar[5, 50, :]) assert (4294967295, 2155905152, 2155905152) == tuple(ar[15, 50, :]) assert (0, 4294967295, 0) == tuple(ar[25, 50, :]) assert (2155905152, 4294967295, 2155905152) == tuple(ar[35, 50, :]) assert (0, 0, 4294967295) == tuple(ar[45, 50, :]) assert (2155905152, 2155905152, 4294967295) == tuple(ar[55, 50, :]) assert (0, 0, 0) == tuple(ar[65, 50, :]) assert (1077952576, 1077952576, 1077952576) == tuple(ar[75, 50, :]) assert (3233857728, 3233857728, 3233857728) == tuple(ar[85, 50, :]) assert (4294967295, 4294967295, 4294967295) == tuple(ar[95, 50, :]) def test_little_32bit_3sample_2frame(self): """Test pixel_array for little 32-bit, 3 sample/pixel, 10 frame.""" # Check all little endian syntaxes ds = dcmread(EXPL_32_3_2F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable # Frame 1 assert (4294967295, 0, 0) == tuple(arr[0, 5, 50, :]) assert (4294967295, 2155905152, 2155905152) == tuple(arr[0, 15, 50, :]) assert (0, 4294967295, 0) == tuple(arr[0, 25, 50, :]) assert (2155905152, 4294967295, 2155905152) == tuple(arr[0, 35, 50, :]) assert (0, 0, 4294967295) == tuple(arr[0, 45, 50, :]) assert (2155905152, 2155905152, 4294967295) == tuple(arr[0, 55, 50, :]) assert (0, 0, 0) == tuple(arr[0, 65, 50, :]) assert (1077952576, 1077952576, 1077952576) == tuple(arr[0, 75, 50, :]) assert (3233857728, 3233857728, 3233857728) == tuple(arr[0, 85, 50, :]) assert (4294967295, 4294967295, 4294967295) == tuple(arr[0, 95, 50, :]) # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) def test_little_32bit_float_1frame(self): """Test pixel_array for float pixel data, 1 frame.""" ds = dcmread(IMPL_32_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.FloatPixelData = ds.PixelData del ds.PixelData for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (10, 10) == arr.shape assert 1.75e-39 == pytest.approx(arr[0, 0], abs=0.01e-39) assert 1.44e-39 == pytest.approx(arr[4, 3], abs=0.01e-39) assert 1.13e-39 == pytest.approx(arr[-1, -3], abs=0.01e-39) def test_little_32bit_float_15frame(self): """Test pixel_array for float pixel data, 15 frames.""" ds = dcmread(IMPL_32_1_15F) ds.pixel_array_options(use_v2_backend=True) ds.FloatPixelData = ds.PixelData del ds.PixelData for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (15, 10, 10) == arr.shape assert 1.75e-39 == pytest.approx(arr[0, 0, 0], abs=0.01e-39) assert 1.44e-39 == pytest.approx(arr[0, 4, 3], abs=0.01e-39) assert 1.13e-39 == pytest.approx(arr[0, -1, -3], abs=0.01e-39) def test_little_64bit_float_1frame(self): """Test pixel_array for double float pixel data, 1 frame.""" ds = dcmread(IMPL_32_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.DoubleFloatPixelData = ds.PixelData + ds.PixelData del ds.PixelData ds.BitsAllocated = 64 for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (10, 10) == arr.shape assert 2.65e-308 == pytest.approx(arr[0, 0], abs=0.01e-308) assert 1.80e-308 == pytest.approx(arr[4, 3], abs=0.01e-308) assert 1.69e-308 == pytest.approx(arr[-1, -3], abs=0.01e-308) def test_little_64bit_float_15frame(self): """Test pixel_array for double float pixel data, 15 frames.""" ds = dcmread(IMPL_32_1_15F) ds.pixel_array_options(use_v2_backend=True) ds.DoubleFloatPixelData = ds.PixelData + ds.PixelData del ds.PixelData ds.BitsAllocated = 64 for uid in SUPPORTED_SYNTAXES[:3]: ds.file_meta.TransferSyntaxUID = uid arr = ds.pixel_array assert arr.flags.writeable assert (15, 10, 10) == arr.shape assert 2.65e-308 == pytest.approx(arr[0, 0, 0], abs=0.01e-308) assert 1.80e-308 == pytest.approx(arr[0, 4, 3], abs=0.01e-308) assert 1.69e-308 == pytest.approx(arr[0, -1, -3], abs=0.01e-308) # Big endian datasets @pytest.mark.parametrize("little, big", MATCHING_DATASETS) def test_big_endian_datasets(self, little, big): """Test pixel_array for big endian matches little.""" ds = dcmread(big) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == ExplicitVRBigEndian ref = dcmread(little) ref.pixel_array_options(use_v2_backend=True) assert ref.file_meta.TransferSyntaxUID != ExplicitVRBigEndian assert np.array_equal(ds.pixel_array, ref.pixel_array) # Regression tests def test_endianness_not_set(self): """Test for #704, Dataset.is_little_endian unset.""" ds = Dataset() ds.pixel_array_options(use_v2_backend=True) ds.file_meta = FileMetaDataset() ds.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian ds.Rows = 10 ds.Columns = 10 ds.BitsAllocated = 16 ds.BitsStored = 16 ds.PixelRepresentation = 0 ds.SamplesPerPixel = 1 ds.PhotometricInterpretation = "MONOCHROME2" arr = np.ones((10, 10), dtype="uint16") ds.PixelData = arr.tobytes() assert ds.pixel_array.max() == 1 def test_read_only(self): """Test for #717, returned array read-only.""" ds = dcmread(EXPL_8_1_1F) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array assert 0 != arr[0, 0] arr[0, 0] = 0 assert 0 == arr[0, 0] assert arr.flags.writeable # Tests for numpy_handler module with Numpy available @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_GetPixelData: """Tests for numpy_handler.get_pixeldata with numpy.""" def test_no_pixel_data_raises(self): """Test get_pixeldata raises if dataset has no PixelData.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) del ds.PixelData assert "PixelData" not in ds assert "FloatPixelData" not in ds assert "DoubleFloatPixelData" not in ds msg = ( r"Unable to convert the pixel data: one of Pixel Data, Float " r"Pixel Data or Double Float Pixel Data must be present in " r"the dataset" ) with pytest.raises(AttributeError, match=msg): get_pixeldata(ds) def test_missing_required_elem_pixel_data_monochrome(self): """Tet get_pixeldata raises if dataset missing required element.""" required_attrs = ( "BitsAllocated", "BitsStored", "Rows", "Columns", "SamplesPerPixel", "PhotometricInterpretation", "PixelRepresentation", ) for attr in required_attrs: ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) delattr(ds, attr) msg = ( r"Unable to convert the pixel data as the following required " rf"elements are missing from the dataset: {attr}" ) with pytest.raises(AttributeError, match=msg): get_pixeldata(ds) def test_missing_required_elem_pixel_data_color(self): """Tet get_pixeldata raises if dataset missing required element.""" ds = dcmread(EXPL_8_3_1F) ds.pixel_array_options(use_v2_backend=True) del ds.Rows del ds.Columns msg = ( r"Unable to convert the pixel data as the following required " r"elements are missing from the dataset: Rows, Columns" ) with pytest.raises(AttributeError, match=msg): get_pixeldata(ds) def test_missing_conditionally_required_elem_pixel_data_color(self): """Tet get_pixeldata raises if dataset missing required element.""" ds = dcmread(EXPL_8_3_1F) ds.pixel_array_options(use_v2_backend=True) del ds.PlanarConfiguration msg = ( r"Unable to convert the pixel data as the following conditionally " r"required element is missing from the dataset: " r"PlanarConfiguration" ) with pytest.raises(AttributeError, match=msg): get_pixeldata(ds) def test_missing_required_elem_float_pixel_data_monochrome(self): """Tet get_pixeldata raises if dataset missing required element.""" ds = dcmread(IMPL_32_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.FloatPixelData = ds.PixelData del ds.PixelData del ds.Rows msg = ( r"Unable to convert the pixel data as the following required " r"elements are missing from the dataset: Rows" ) with pytest.raises(AttributeError, match=msg): get_pixeldata(ds) def test_unknown_pixel_representation_raises(self): """Test get_pixeldata raises if unsupported PixelRepresentation.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.PixelRepresentation = 2 with pytest.raises(ValueError, match=r"value of '2' for '\(0028,0103"): get_pixeldata(ds) def test_unsupported_syntaxes_raises(self): """Test get_pixeldata raises if unsupported Transfer Syntax.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.file_meta.TransferSyntaxUID = "1.2.840.10008.1.2.4.50" with pytest.raises( NotImplementedError, match=" the transfer syntax is not supported" ): get_pixeldata(ds) def test_bad_length_raises(self): """Test bad pixel data length raises exception.""" ds = dcmread(EXPL_8_1_1F) ds.pixel_array_options(use_v2_backend=True) # Too short ds.PixelData = ds.PixelData[:-1] msg = ( r"The length of the pixel data in the dataset \(479999 bytes\) " r"doesn't match the expected length \(480000 bytes\). " r"The dataset may be corrupted or there may be an issue " r"with the pixel data handler." ) with pytest.raises(ValueError, match=msg): get_pixeldata(ds) def test_missing_padding_warns(self): """A warning shall be issued if the padding for odd data is missing.""" ds = dcmread(EXPL_8_3_1F_ODD) ds.pixel_array_options(use_v2_backend=True) # remove the padding byte ds.PixelData = ds.PixelData[:-1] msg = r"The odd length pixel data is missing a trailing padding byte" with pytest.warns(UserWarning, match=msg): get_pixeldata(ds) def test_change_photometric_interpretation(self): """Test get_pixeldata changes PhotometricInterpretation if required.""" def to_rgb(ds): """Override the original function that returned False""" return True # Test default ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) assert ds.PhotometricInterpretation == "MONOCHROME2" get_pixeldata(ds) assert ds.PhotometricInterpretation == "MONOCHROME2" # Test modified orig_fn = NP_HANDLER.should_change_PhotometricInterpretation_to_RGB NP_HANDLER.should_change_PhotometricInterpretation_to_RGB = to_rgb get_pixeldata(ds) assert ds.PhotometricInterpretation == "RGB" NP_HANDLER.should_change_PhotometricInterpretation_to_RGB = orig_fn def test_array_read_only(self): """Test returning a read only array for BitsAllocated > 8.""" ds = dcmread(EXPL_8_1_1F) ds.pixel_array_options(use_v2_backend=True) arr = get_pixeldata(ds, read_only=False) assert arr.flags.writeable assert 0 != arr[10] arr[10] = 0 assert 0 == arr[10] arr = get_pixeldata(ds, read_only=True) assert not arr.flags.writeable with pytest.raises(ValueError, match="is read-only"): arr[10] = 0 def test_array_read_only_bit_packed(self): """Test returning a read only array for BitsAllocated = 1.""" ds = dcmread(EXPL_1_1_1F) ds.pixel_array_options(use_v2_backend=True) arr = get_pixeldata(ds, read_only=False) assert arr.flags.writeable arr = get_pixeldata(ds, read_only=True) assert arr.flags.writeable def test_ybr422_excess_padding(self): """Test YBR data with excess padding.""" ds = dcmread(EXPL_8_3_1F_YBR422) ds.pixel_array_options(use_v2_backend=True) assert ds.PhotometricInterpretation == "YBR_FULL_422" ds.PixelData += b"\x00\x00\x00\x00" msg = ( r"The length of the pixel data in the dataset \(20004 bytes\) " r"indicates it contains excess padding. 4 bytes will be removed " r"from the end of the data" ) with pytest.warns(UserWarning, match=msg): arr = ds.pixel_array assert (76, 85, 255) == tuple(arr[5, 50, :]) assert (166, 106, 193) == tuple(arr[15, 50, :]) assert (150, 46, 20) == tuple(arr[25, 50, :]) assert (203, 86, 75) == tuple(arr[35, 50, :]) assert (29, 255, 107) == tuple(arr[45, 50, :]) assert (142, 193, 118) == tuple(arr[55, 50, :]) assert (0, 128, 128) == tuple(arr[65, 50, :]) assert (64, 128, 128) == tuple(arr[75, 50, :]) assert (192, 128, 128) == tuple(arr[85, 50, :]) assert (255, 128, 128) == tuple(arr[95, 50, :]) def test_ybr422_wrong_interpretation(self): """Test YBR data with wrong Photometric Interpretation.""" ds = dcmread(EXPL_8_3_1F_YBR) ds.pixel_array_options(use_v2_backend=True) assert ds.PhotometricInterpretation == "YBR_FULL" assert len(ds.PixelData) == 30000 ds.PhotometricInterpretation = "YBR_FULL_422" msg = r"The Photometric Interpretation of the dataset is YBR_FULL_422" with pytest.warns(UserWarning, match=msg): arr = ds.pixel_array # Resulting data will be nonsense but of correct shape assert (100, 100, 3) == arr.shape def test_float_pixel_data(self): """Test handling of Float Pixel Data.""" # Only 1 sample per pixel allowed ds = dcmread(IMPL_32_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.FloatPixelData = ds.PixelData del ds.PixelData assert 32 == ds.BitsAllocated arr = get_pixeldata(ds) assert "float32" == arr.dtype def test_double_float_pixel_data(self): """Test handling of Double Float Pixel Data.""" # Only 1 sample per pixel allowed ds = dcmread(IMPL_32_1_1F) ds.pixel_array_options(use_v2_backend=True) ds.DoubleFloatPixelData = ds.PixelData + ds.PixelData del ds.PixelData ds.BitsAllocated = 64 arr = get_pixeldata(ds) assert "float64" == arr.dtype def test_big_endian_rgb_data(self): """RGB data encoded as OW in Big Endian transfer syntax shall yield the same data as if encoded in Little Endian.""" ds1 = dcmread(EXPL_8_3_1F_ODD) ds1.pixel_array_options(use_v2_backend=True) data1 = ds1.pixel_array ds2 = dcmread(EXPL_8_3_1F_ODD_BIGE) ds2.pixel_array_options(use_v2_backend=True) data2 = ds2.pixel_array assert len(data1) == len(data2) assert (data1 == data2).all() pydicom-pydicom-20aa4b7/tests/test_overlay_np.py000066400000000000000000000342141515706620200221630ustar00rootroot00000000000000# Copyright 2008-2019 pydicom authors. See LICENSE file for details. """Tests for the overlays.numpy_handler module. There are the following possibilities: * numpy is not available and * the numpy handler is not available * the numpy handler is available * numpy is available and * the numpy handler is not available * the numpy handler is available **Supported transfer syntaxes** * 1.2.840.10008.1.2 : Implicit VR Little Endian * 1.2.840.10008.1.2.1 : Explicit VR Little Endian * 1.2.840.10008.1.2.1.99 : Deflated Explicit VR Little Endian * 1.2.840.10008.1.2.2 : Explicit VR Big Endian **Elements affecting the handler** * OverlayBitsAllocated * NumberOfFramesInOverlay * OverlayRows * OverlayColumns """ import pytest import pydicom from pydicom.data import get_testdata_file from pydicom.filereader import dcmread from pydicom.uid import ImplicitVRLittleEndian, ExplicitVRLittleEndian try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: from pydicom.overlays import numpy_handler as NP_HANDLER from pydicom.overlays.numpy_handler import ( get_overlay_array, reshape_overlay_array, get_expected_length, ) except ImportError: NP_HANDLER = None # Paths to the test datasets # EXPL: Explicit VR Little Endian # Overlay Data # 1/1, 1 sample/pixel, 1 frame EXPL_1_1_1F = get_testdata_file("MR-SIEMENS-DICOM-WithOverlays.dcm") # 1/1, 1 sample/pixel, N frame EXPL_1_1_3F = None # No Overlay Data # 16/16, 1 sample/pixel, 1 frame EXPL_16_1_1F = get_testdata_file("MR_small.dcm") # Numpy unavailable and the numpy handler is available @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") class TestNoNumpy_NumpyHandler: """Tests for handling datasets without numpy and the handler.""" def test_get_overlay_array_raises(self): """Test get_overlay_array raises exception""" ds = dcmread(EXPL_1_1_1F) msg = r"The overlay data handler requires numpy" with pytest.raises(ImportError, match=msg): get_overlay_array(ds, 0x6000) @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_reshape_pixel_array_raises(): """Test that reshape_overlay_array raises exception without numpy.""" with pytest.raises(ImportError, match="Numpy is required to reshape"): reshape_overlay_array(None, None) # Numpy and the numpy handler are available EXPL = ExplicitVRLittleEndian IMPL = ImplicitVRLittleEndian REFERENCE_DATA_LITTLE = [ # fpath, (syntax, bits, nr samples, pixel repr, nr frames, shape, dtype, # group) (EXPL_1_1_1F, (EXPL, 1, 1, 0, 1, (484, 484), "uint8", 0x6000)), # (EXPL_1_1_3F, (EXPL, 1, 1, 0, 3, (3, 512, 512), 'uint8', 0x6000)), ] @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_NumpyHandler: """Tests for handling Overlay Data with the handler.""" # Little endian datasets @pytest.mark.parametrize("fpath, data", REFERENCE_DATA_LITTLE) def test_properties(self, fpath, data): """Test dataset and overlay array properties are as expected.""" ds = dcmread(fpath) group = data[7] assert ds.file_meta.TransferSyntaxUID == data[0] assert ds[group, 0x0100].value == data[1] # OverlayBitsAllocated arr = ds.overlay_array(data[7]) assert data[5] == arr.shape assert arr.dtype == data[6] # Odd sized data is padded by a final 0x00 byte rows = ds[group, 0x0010].value columns = ds[group, 0x0011].value nr_frames = ds[group, 0x0015].value size = rows * columns * nr_frames / 8 * data[2] assert len(ds[group, 0x3000].value) == size + size % 2 if size % 2: assert ds[group, 0x3000].value[-1] == b"\x00"[0] def test_little_1bit_1sample_1frame(self): """Test pixel_array for little 1-bit, 1 sample/pixel, 1 frame.""" ds = dcmread(EXPL_1_1_1F) arr = ds.overlay_array(0x6000) assert arr.flags.writeable assert arr.max() == 1 assert arr.min() == 0 assert 29 == sum(arr[422, 393:422]) def test_read_only(self): """Test for #717, returned array read-only.""" ds = dcmread(EXPL_1_1_1F) arr = ds.overlay_array(0x6000) assert 0 == arr[0, 0] arr[0, 0] = 1 assert 1 == arr[0, 0] assert arr.flags.writeable def test_bad_group_raises(self): """Test that using a bad group raises exception.""" ds = dcmread(EXPL_1_1_1F) msg = ( r"The group part of the 'Overlay Data' element tag must be " r"between 0x6000 and 0x60FF \(inclusive\)" ) with pytest.raises(ValueError, match=msg): ds.overlay_array(0x5FFF) with pytest.raises(ValueError, match=msg): ds.overlay_array(0x6100) def test_no_frames(self): """Test handler with no NumberOfFramesInOverlay element.""" ds = dcmread(EXPL_1_1_1F) del ds[0x6000, 0x0015] arr = ds.overlay_array(0x6000) assert arr.max() == 1 assert arr.min() == 0 assert 29 == sum(arr[422, 393:422]) # Tests for numpy_handler module with Numpy available @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_GetOverlayArray: """Tests for numpy_handler.get_overlay_array with numpy.""" def test_no_overlay_data_raises(self): """Test get_overlay_array raises if dataset has no OverlayData.""" ds = dcmread(EXPL_1_1_1F) del ds[0x6000, 0x3000] assert (0x6000, 0x3000) not in ds with pytest.raises(AttributeError, match=r" dataset: OverlayData"): get_overlay_array(ds, 0x6000) def test_bad_length_raises(self): """Test bad pixel data length raises exception.""" ds = dcmread(EXPL_1_1_1F) # Too short ds[0x6000, 0x3000].value = ds[0x6000, 0x3000][:-1] msg = ( r"The length of the overlay data in the dataset \(29281 bytes\) " r"doesn't match the expected length \(29282 bytes\). " r"The dataset may be corrupted or there may be an issue " r"with the overlay data handler." ) with pytest.raises(ValueError, match=msg): get_overlay_array(ds, 0x6000) def test_missing_padding_warns(self): """A warning shall be issued if the padding for odd data is missing.""" ds = dcmread(EXPL_1_1_1F) # Edit shape ds[0x6000, 0x0010].value = 15 # OverlayRows ds[0x6000, 0x0011].value = 14 # OverlayColumns ds[0x6000, 0x3000].value = ds[0x6000, 0x3000].value[:27] # 15 * 14 / 8 msg = r"The overlay data length is odd and misses a padding byte." with pytest.warns(UserWarning, match=msg): get_overlay_array(ds, 0x6000) def test_excess_padding(self): """A warning shall be issued excess padding present.""" ds = dcmread(EXPL_1_1_1F) # Edit shape ds[0x6000, 0x0010].value = 15 # OverlayRows ds[0x6000, 0x0011].value = 14 # OverlayColumns overlay_data = ds[0x6000, 0x3000].value[:27] + b"\x00\x00\x00" ds[0x6000, 0x3000].value = overlay_data msg = ( r"overlay data in the dataset \(30 bytes\) indicates it contains " r"excess padding. 3 bytes will be removed" ) with pytest.warns(UserWarning, match=msg): get_overlay_array(ds, 0x6000) if HAVE_NP: RESHAPE_ARRAYS = { "reference": np.asarray( [ [ # Frame 1 [[1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21]], [[2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14, 22]], [[3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14, 22], [7, 15, 23]], [[4, 12, 20], [5, 13, 21], [6, 14, 22], [7, 15, 23], [8, 16, 24]], ], [ # Frame 2 [ [25, 33, 41], [26, 34, 42], [27, 35, 43], [28, 36, 44], [29, 37, 45], ], [ [26, 34, 42], [27, 35, 43], [28, 36, 44], [29, 37, 45], [30, 38, 46], ], [ [27, 35, 43], [28, 36, 44], [29, 37, 45], [30, 38, 46], [31, 39, 47], ], [ [28, 36, 44], [29, 37, 45], [30, 38, 46], [31, 39, 47], [32, 40, 48], ], ], ] ), "1frame_1sample": np.asarray( [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8] ), "2frame_1sample": np.asarray( [ 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, # Frame 1 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 25, 26, 27, 28, 29, 26, 27, 28, 29, 30, # Frame 2 27, 28, 29, 30, 31, 28, 29, 30, 31, 32, ] ), } @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_ReshapeOverlayArray: """Tests for numpy_handler.reshape_overlay_array.""" def setup_method(self): """Setup the test dataset.""" self.elem = { "OverlayRows": 4, "OverlayColumns": 5, } # Expected output ref_#frames_#samples self.ref_1_1 = RESHAPE_ARRAYS["reference"][0, :, :, 0] self.ref_2_1 = RESHAPE_ARRAYS["reference"][:, :, :, 0] def test_reference_1frame_1sample(self): """Test the 1 frame 1 sample/pixel reference array is as expected.""" # (rows, columns) assert (4, 5) == self.ref_1_1.shape assert np.array_equal( self.ref_1_1, np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) def test_reference_2frame_1sample(self): """Test the 2 frame 1 sample/pixel reference array is as expected.""" # (nr frames, rows, columns) assert (2, 4, 5) == self.ref_2_1.shape # Frame 1 assert np.array_equal( self.ref_2_1[0, :, :], np.asarray( [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]] ), ) # Frame 2 assert np.array_equal( self.ref_2_1[1, :, :], np.asarray( [ [25, 26, 27, 28, 29], [26, 27, 28, 29, 30], [27, 28, 29, 30, 31], [28, 29, 30, 31, 32], ] ), ) def test_1frame(self): """Test reshaping 1 frame, 1 sample/pixel.""" self.elem["NumberOfFramesInOverlay"] = 1 arr = reshape_overlay_array(self.elem, RESHAPE_ARRAYS["1frame_1sample"]) assert (4, 5) == arr.shape assert np.array_equal(arr, self.ref_1_1) def test_2frame_1sample(self): """Test reshaping 2 frame, 1 sample/pixel.""" self.elem["NumberOfFramesInOverlay"] = 2 arr = reshape_overlay_array(self.elem, RESHAPE_ARRAYS["2frame_1sample"]) assert (2, 4, 5) == arr.shape assert np.array_equal(arr, self.ref_2_1) def test_invalid_nr_frames_raises(self): """Test an invalid Number of Frames value raises exception.""" self.elem["NumberOfFramesInOverlay"] = 0 # Need to escape brackets with pytest.raises(ValueError, match=r"value of 0 for \(60xx,0015\)"): reshape_overlay_array(self.elem, RESHAPE_ARRAYS["1frame_1sample"]) REFERENCE_LENGTH = [ # (frames, rows, cols), bit depth, result in (bytes, pixels) ((1, 0, 0), 1, (0, 0)), ((1, 1, 1), 1, (1, 1)), # 1 bit -> 1 byte ((1, 2, 2), 1, (1, 4)), # 4 bits -> 1 byte ((1, 2, 4), 1, (1, 8)), # 8 bits -> 1 byte ((1, 3, 3), 1, (2, 9)), # 9 bits -> 2 bytes ((1, 512, 512), 1, (32768, 262144)), # Typical length # NumberOfFramesInOverlay odd and > 1 ((3, 0, 0), 1, (0, 0)), ((3, 1, 1), 1, (1, 3)), ((3, 2, 4), 1, (3, 24)), ((3, 2, 2), 1, (2, 12)), ((3, 3, 3), 1, (4, 27)), ((3, 512, 512), 1, (98304, 786432)), # NumberOfFramesInOverlay even ((4, 0, 0), 1, (0, 0)), ((4, 1, 1), 1, (1, 4)), ((4, 2, 4), 1, (4, 32)), ((4, 2, 2), 1, (2, 16)), ((4, 3, 3), 1, (5, 36)), ((4, 512, 512), 1, (131072, 1048576)), ] @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_GetExpectedLength: """Tests for numpy_handler.get_expected_length.""" @pytest.mark.parametrize("shape, bits, length", REFERENCE_LENGTH) def test_length_in_bytes(self, shape, bits, length): """Test get_expected_length(ds, unit='bytes').""" elem = { "OverlayRows": shape[1], "OverlayColumns": shape[2], "OverlayBitsAllocated": bits, "NumberOfFramesInOverlay": shape[0], } assert length[0] == get_expected_length(elem, unit="bytes") @pytest.mark.parametrize("shape, bits, length", REFERENCE_LENGTH) def test_length_in_pixels(self, shape, bits, length): """Test get_expected_length(ds, unit='pixels').""" elem = { "OverlayRows": shape[1], "OverlayColumns": shape[2], "OverlayBitsAllocated": bits, "NumberOfFramesInOverlay": shape[0], } assert length[1] == get_expected_length(elem, unit="pixels") pydicom-pydicom-20aa4b7/tests/test_pillow_pixel_data.py000066400000000000000000000644411515706620200235120ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. import pytest import pydicom from pydicom.data import get_testdata_file from pydicom.encaps import get_frame, generate_frames, encapsulate from pydicom.filereader import dcmread from pydicom.pixels.processing import convert_color_space from pydicom.pixels.utils import get_j2k_parameters from pydicom.uid import ( JPEGBaseline8Bit, JPEGLosslessSV1, JPEGExtended12Bit, JPEG2000, JPEG2000Lossless, AllTransferSyntaxes, ) try: import numpy as np from pydicom.pixel_data_handlers import numpy_handler as NP_HANDLER HAVE_NP = True except ImportError: NP_HANDLER = None HAVE_NP = False try: from pydicom.pixel_data_handlers import pillow_handler as PIL_HANDLER from pydicom.pixel_data_handlers.pillow_handler import get_pixeldata HAVE_PIL = PIL_HANDLER.HAVE_PIL HAVE_JPEG = PIL_HANDLER.HAVE_JPEG HAVE_JPEG2K = PIL_HANDLER.HAVE_JPEG2K except ImportError: PIL_HANDLER = None HAVE_PIL = False HAVE_JPEG = False HAVE_JPEG2K = False TEST_PIL = HAVE_NP and HAVE_PIL TEST_JPEG = TEST_PIL and HAVE_JPEG TEST_JPEG2K = TEST_PIL and HAVE_JPEG2K # JPEG - ISO/IEC 10918 Standard # FMT: Transfer Syntax # BA: BitsAllocated # BV: Actual sample bit depth - may not be the same as BitsStored # SPX: SamplesPerPixel # PR: PixelRepresentation # FRAMES: NumberOfFrames # PI: PhotometricInterpretation # FMT_BA_BV_SPX_PR_FRAMESF_PI # JPGB: 1.2.840.10008.1.2.4.50 - JPEG Baseline (8-bit only) JPGB_08_08_3_0_1F_YBR_FULL = get_testdata_file("SC_rgb_small_odd_jpeg.dcm") JPGB_08_08_3_0_120F_YBR_FULL_422 = get_testdata_file("color3d_jpeg_baseline.dcm") # Different subsampling 411, 422, 444 JPGB_08_08_3_0_1F_YBR_FULL_422_411 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+np.dcm") JPGB_08_08_3_0_1F_YBR_FULL_422_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s2.dcm") JPGB_08_08_3_0_1F_YBR_FULL_411 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n1.dcm") JPGB_08_08_3_0_1F_YBR_FULL_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n2.dcm") JPGB_08_08_3_0_1F_YBR_FULL_444 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s4.dcm") JPGB_08_08_3_0_1F_RGB = get_testdata_file("SC_jpeg_no_color_transform.dcm") JPGB_08_08_3_0_1F_RGB_APP14 = get_testdata_file("SC_jpeg_no_color_transform_2.dcm") # JPGE: 1.2.840.10008.1.2.4.51 - JPEG Extended (Process 2 and 4) (8 and 12-bit) # No supported datasets available # JPEG 2000 - ISO/IEC 15444 Standard # J2KR: 1.2.840.100008.1.2.4.90 - JPEG 2000 Lossless J2KR_08_08_3_0_1F_YBR_ICT = get_testdata_file("US1_J2KR.dcm") J2KR_16_10_1_0_1F_M1 = get_testdata_file("RG3_J2KR.dcm") J2KR_16_12_1_0_1F_M2 = get_testdata_file("MR2_J2KR.dcm") J2KR_16_15_1_0_1F_M1 = get_testdata_file("RG1_J2KR.dcm") J2KR_16_16_1_0_10F_M2 = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") J2KR_16_14_1_1_1F_M2 = get_testdata_file("693_J2KR.dcm") J2KR_16_16_1_1_1F_M2 = get_testdata_file("MR_small_jp2klossless.dcm") J2KR_16_13_1_1_1F_M2_MISMATCH = get_testdata_file("J2K_pixelrep_mismatch.dcm") # J2KI: 1.2.840.10008.1.2.4.91 - JPEG 2000 J2KI_08_08_3_0_1F_RGB = get_testdata_file("SC_rgb_gdcm_KY.dcm") J2KI_08_08_3_0_1F_YBR_ICT = get_testdata_file("US1_J2KI.dcm") J2KI_16_10_1_0_1F_M1 = get_testdata_file("RG3_J2KI.dcm") J2KI_16_12_1_0_1F_M2 = get_testdata_file("MR2_J2KI.dcm") J2KI_16_15_1_0_1F_M1 = get_testdata_file("RG1_J2KI.dcm") J2KI_16_14_1_1_1F_M2 = get_testdata_file("693_J2KI.dcm") J2KI_16_16_1_1_1F_M2 = get_testdata_file("JPEG2000.dcm") # Transfer syntaxes supported by other handlers IMPL = get_testdata_file("MR_small_implicit.dcm") EXPL = get_testdata_file("OBXXXX1A.dcm") EXPB = get_testdata_file("OBXXXX1A_expb.dcm") DEFL = get_testdata_file("image_dfl.dcm") JPEG_LS_LOSSLESS = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") RLE = get_testdata_file("MR_small_RLE.dcm") JPGE_16_12_1_0_1F_M2 = get_testdata_file("JPEG-lossy.dcm") JPGL_16_16_1_1_1F_M2 = get_testdata_file("JPEG-LL.dcm") # JPGL14: 1.2.840.10008.1.2.4.57 - JPEG Lossless P14 # No datasets available # JPGL: 1.2.840.10008.1.2.4.70 - JPEG Lossless, Non-hierarchical, 1st Order JPGL_08_08_1_0_1F = get_testdata_file("JPGLosslessP14SV1_1s_1f_8b.dcm") # Transfer Syntaxes (non-retired + Explicit VR Big Endian) JPEG_SUPPORTED_SYNTAXES = [] if HAVE_JPEG: JPEG_SUPPORTED_SYNTAXES = [JPEGBaseline8Bit, JPEGExtended12Bit] JPEG2K_SUPPORTED_SYNTAXES = [] if HAVE_JPEG2K: JPEG2K_SUPPORTED_SYNTAXES = [JPEG2000, JPEG2000Lossless] SUPPORTED_SYNTAXES = JPEG_SUPPORTED_SYNTAXES + JPEG2K_SUPPORTED_SYNTAXES UNSUPPORTED_SYNTAXES = list(set(AllTransferSyntaxes) ^ set(SUPPORTED_SYNTAXES)) def test_unsupported_syntaxes(): """Test that UNSUPPORTED_SYNTAXES is as expected.""" for syntax in SUPPORTED_SYNTAXES: assert syntax not in UNSUPPORTED_SYNTAXES REFERENCE_DATA_UNSUPPORTED = [ (IMPL, ("1.2.840.10008.1.2", "CompressedSamples^MR1")), (EXPL, ("1.2.840.10008.1.2.1", "OB^^^^")), (EXPB, ("1.2.840.10008.1.2.2", "OB^^^^")), (DEFL, ("1.2.840.10008.1.2.1.99", "^^^^")), (JPEG_LS_LOSSLESS, ("1.2.840.10008.1.2.4.80", "CompressedSamples^MR1")), (JPGL_08_08_1_0_1F, ("1.2.840.10008.1.2.4.70", "Citizen^Jan")), (RLE, ("1.2.840.10008.1.2.5", "CompressedSamples^MR1")), ] # Numpy and the pillow handler are unavailable @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") class TestNoNumpy_NoPillowHandler: """Tests for handling datasets without numpy and the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert not HAVE_NP assert PIL_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in dataset.""" # JPEG Baseline ds = dcmread(JPGB_08_08_3_0_120F_YBR_FULL_422) assert "PLA" == ds.PatientName assert 6108928 == len(ds.PixelData) # JPEG Extended ds = dcmread(JPGE_16_12_1_0_1F_M2) assert "CompressedSamples^NM1" == ds.PatientName assert 6846 == len(ds.PixelData) # JPEG Lossless ds = dcmread(JPGL_16_16_1_1_1F_M2) assert "CompressedSamples^NM1" == ds.PatientName assert 116076 == len(ds.PixelData) # JPEG 2000 ds = dcmread(J2KR_16_10_1_0_1F_M1) assert "CompressedSamples^RG3" == ds.PatientName assert 830542 == len(ds.PixelData) # JPEG 2000 Lossless ds = dcmread(J2KI_08_08_3_0_1F_RGB) assert "Lestrade^G" == ds.PatientName assert 1286 == len(ds.PixelData) @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName def test_pixel_array_raises(self): """Test pixel_array raises exception for all syntaxes.""" ds = dcmread(IMPL) ds.pixel_array_options(use_v2_backend=True) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid with pytest.raises(NotImplementedError, match=f"UID of '{uid}'"): ds.pixel_array def test_using_pillow_handler_raises(self): ds = dcmread(J2KI_08_08_3_0_1F_RGB) ds.pixel_array_options(use_v2_backend=True) msg = ( "The pixel data handler 'pillow' is not available on your " "system. Please refer to the pydicom documentation*" ) with pytest.raises(RuntimeError, match=msg): ds.decompress("pillow") JPGB = JPEGBaseline8Bit JPGE = JPEGExtended12Bit JPGL = JPEGLosslessSV1 J2KI = JPEG2000 J2KR = JPEG2000Lossless REFERENCE_DATA = [ # fpath, (syntax, bits, nr samples, pixel repr, nr frames, shape, dtype) ( JPGB_08_08_3_0_120F_YBR_FULL_422, (JPGB, 8, 3, 0, 120, (120, 480, 640, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_422_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_422_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_444, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), (JPGB_08_08_3_0_1F_RGB, (JPGB, 8, 3, 0, 1, (256, 256, 3), "uint8")), (JPGB_08_08_3_0_1F_RGB_APP14, (JPGB, 8, 3, 0, 1, (256, 256, 3), "uint8")), (J2KR_08_08_3_0_1F_YBR_ICT, (J2KR, 8, 3, 0, 1, (480, 640, 3), "uint8")), (J2KR_16_10_1_0_1F_M1, (J2KR, 16, 1, 0, 1, (1760, 1760), "uint16")), (J2KR_16_12_1_0_1F_M2, (J2KR, 16, 1, 0, 1, (1024, 1024), "uint16")), (J2KR_16_15_1_0_1F_M1, (J2KR, 16, 1, 0, 1, (1955, 1841), "uint16")), (J2KR_16_16_1_0_10F_M2, (J2KR, 16, 1, 0, 10, (10, 64, 64), "uint16")), (J2KR_16_14_1_1_1F_M2, (J2KR, 16, 1, 1, 1, (512, 512), "int16")), (J2KR_16_16_1_1_1F_M2, (J2KR, 16, 1, 1, 1, (64, 64), "int16")), (J2KI_08_08_3_0_1F_RGB, (J2KI, 8, 3, 0, 1, (100, 100, 3), "uint8")), (J2KI_08_08_3_0_1F_YBR_ICT, (J2KI, 8, 3, 0, 1, (480, 640, 3), "uint8")), (J2KI_16_10_1_0_1F_M1, (J2KI, 16, 1, 0, 1, (1760, 1760), "uint16")), (J2KI_16_12_1_0_1F_M2, (J2KI, 16, 1, 0, 1, (1024, 1024), "uint16")), (J2KI_16_15_1_0_1F_M1, (J2KI, 16, 1, 0, 1, (1955, 1841), "uint16")), (J2KI_16_14_1_1_1F_M2, (J2KI, 16, 1, 1, 1, (512, 512), "int16")), (J2KI_16_16_1_1_1F_M2, (J2KI, 16, 1, 1, 1, (1024, 256), "int16")), ] JPEG_MATCHING_DATASETS = [ # (compressed, reference, hard coded check values) pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_422_411, get_testdata_file("SC_rgb_dcmtk_ebcynp_dcmd.dcm"), [ (253, 1, 0), (253, 128, 132), (0, 255, 5), (127, 255, 127), (1, 0, 254), (127, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_422_422, get_testdata_file("SC_rgb_dcmtk_ebcys2_dcmd.dcm"), [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_411, get_testdata_file("SC_rgb_dcmtk_ebcyn1_dcmd.dcm"), [ (253, 1, 0), (253, 128, 132), (0, 255, 5), (127, 255, 127), (1, 0, 254), (127, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_422, get_testdata_file("SC_rgb_dcmtk_ebcyn2_dcmd.dcm"), [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_444, get_testdata_file("SC_rgb_dcmtk_ebcys4_dcmd.dcm"), [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], ), pytest.param( JPGB_08_08_3_0_1F_RGB, get_testdata_file("SC_rgb_jpeg_dcmd.dcm"), [ (244, 244, 244), (244, 244, 244), (244, 244, 244), (244, 244, 244), (236, 237, 234), (244, 244, 244), (244, 244, 244), (244, 244, 244), (244, 244, 244), (244, 244, 244), ], ), pytest.param( JPGB_08_08_3_0_1F_RGB_APP14, get_testdata_file("SC_rgb_jpeg_app14_dcmd.dcm"), [ (246, 246, 246), (246, 246, 246), (246, 246, 246), (246, 246, 246), (246, 246, 246), (244, 244, 246), (246, 246, 246), (246, 246, 246), (246, 246, 246), (246, 246, 246), ], ), ] J2KR_MATCHING_DATASETS = [ # (compressed, reference, fixes) pytest.param( J2KR_08_08_3_0_1F_YBR_ICT, get_testdata_file("US1_UNCR.dcm"), {}, ), pytest.param( J2KR_16_10_1_0_1F_M1, get_testdata_file("RG3_UNCR.dcm"), {}, ), pytest.param( J2KR_16_12_1_0_1F_M2, get_testdata_file("MR2_UNCR.dcm"), {}, ), pytest.param( J2KR_16_15_1_0_1F_M1, get_testdata_file("RG1_UNCR.dcm"), {}, ), pytest.param( J2KR_16_16_1_0_10F_M2, get_testdata_file("emri_small.dcm"), {"BitsStored": 16}, ), pytest.param( J2KR_16_14_1_1_1F_M2, get_testdata_file("693_UNCR.dcm"), {"BitsStored": 14}, ), pytest.param( J2KR_16_16_1_1_1F_M2, get_testdata_file("MR_small.dcm"), {}, ), ] J2KI_MATCHING_DATASETS = [ # (compressed, reference, fixes) pytest.param( J2KI_08_08_3_0_1F_RGB, get_testdata_file("SC_rgb_gdcm2k_uncompressed.dcm"), {}, ), pytest.param( J2KI_08_08_3_0_1F_YBR_ICT, get_testdata_file("US1_UNCI.dcm"), {}, ), pytest.param( J2KI_16_10_1_0_1F_M1, get_testdata_file("RG3_UNCI.dcm"), {}, ), pytest.param( J2KI_16_12_1_0_1F_M2, get_testdata_file("MR2_UNCI.dcm"), {}, ), pytest.param( J2KI_16_15_1_0_1F_M1, get_testdata_file("RG1_UNCI.dcm"), {}, ), pytest.param( J2KI_16_14_1_1_1F_M2, get_testdata_file("693_UNCI.dcm"), {"BitsStored": 16}, ), pytest.param( J2KI_16_16_1_1_1F_M2, get_testdata_file("JPEG2000_UNC.dcm"), {}, ), ] @pytest.mark.skipif(not HAVE_JPEG2K, reason="Pillow or JPEG2K not available") class TestPillowHandler_JPEG2K: """Tests for handling Pixel Data with the handler.""" def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers self.original_j2k = pydicom.config.APPLY_J2K_CORRECTIONS pydicom.config.pixel_data_handlers = [NP_HANDLER, PIL_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers pydicom.config.APPLY_J2K_CORRECTIONS = self.original_j2k def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP assert HAVE_PIL assert PIL_HANDLER is not None def test_unsupported_syntax_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" pydicom.config.pixel_data_handlers = [PIL_HANDLER] ds = dcmread(EXPL) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid with pytest.raises((NotImplementedError, RuntimeError)): ds.pixel_array @pytest.mark.parametrize("fpath, data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName @pytest.mark.parametrize("fpath, data", REFERENCE_DATA) def test_properties(self, fpath, data): """Test dataset and pixel array properties are as expected.""" if data[0] not in JPEG2K_SUPPORTED_SYNTAXES: return ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.BitsAllocated == data[1] assert ds.SamplesPerPixel == data[2] assert ds.PixelRepresentation == data[3] nr_frames = getattr(ds, "NumberOfFrames", 1) assert nr_frames == data[4] bs = get_frame(ds.PixelData, 0, number_of_frames=nr_frames) if get_j2k_parameters(bs)["precision"] != ds.BitsStored: with pytest.warns(UserWarning, match=r"doesn't match the JPEG 20"): arr = ds.pixel_array else: arr = ds.pixel_array assert arr.flags.writeable assert data[5] == arr.shape assert arr.dtype == data[6] @pytest.mark.parametrize("fpath, rpath, fixes", J2KR_MATCHING_DATASETS) def test_array_lossless(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) # May need to correct some element values for kw, val in fixes.items(): setattr(ds, kw, val) arr = ds.pixel_array if "YBR_FULL" in ds.PhotometricInterpretation: arr = convert_color_space(arr, ds.PhotometricInterpretation, "RGB") ref = dcmread(rpath).pixel_array assert np.array_equal(arr, ref) @pytest.mark.parametrize("fpath, rpath, fixes", J2KI_MATCHING_DATASETS) def test_array_lossy(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) # May need to correct some element values for kw, val in fixes.items(): setattr(ds, kw, val) arr = ds.pixel_array if "YBR_FULL" in ds.PhotometricInterpretation: arr = convert_color_space(arr, ds.PhotometricInterpretation, "RGB") ref = dcmread(rpath).pixel_array assert np.allclose(arr, ref, atol=1) def test_warning(self): """Test that the precision warning works OK.""" ds = dcmread(J2KR_16_14_1_1_1F_M2) ds.pixel_array_options(use_v2_backend=True) msg = ( r"The \(0028,0101\) 'Bits Stored' value \(16-bit\) doesn't match " r"the JPEG 2000 data \(14-bit\). It's recommended that you " r"change the 'Bits Stored' value" ) with pytest.warns(UserWarning, match=msg): ds.pixel_array def test_decompress_using_pillow(self): """Test decompressing JPEG2K with pillow handler succeeds.""" ds = dcmread(J2KR_16_14_1_1_1F_M2) ds.pixel_array_options(use_v2_backend=True) ds.BitsStored = 14 ds.decompress(handler_name="pillow") arr = ds.pixel_array ds = dcmread(get_testdata_file("693_UNCR.dcm")) ds.pixel_array_options(use_v2_backend=True) ref = ds.pixel_array assert np.array_equal(arr, ref) def test_changing_bits_stored(self): """Test changing BitsStored affects the pixel data.""" pydicom.config.APPLY_J2K_CORRECTIONS = False ds = dcmread(J2KR_16_14_1_1_1F_M2) ds.pixel_array_options(use_v2_backend=True) assert 16 == ds.BitsStored with pytest.warns(UserWarning): arr = ds.pixel_array ds.BitsStored = 14 arr_14 = ds.pixel_array assert not np.array_equal(arr, arr_14) def test_pixel_rep_mismatch(self): """Test mismatched j2k sign and Pixel Representation.""" ds = dcmread(J2KR_16_13_1_1_1F_M2_MISMATCH) ds.pixel_array_options(use_v2_backend=True) assert 1 == ds.PixelRepresentation assert 13 == ds.BitsStored bs = get_frame(ds.PixelData, 0) params = get_j2k_parameters(bs) assert 13 == params["precision"] assert not params["is_signed"] arr = ds.pixel_array assert "int16" == arr.dtype assert (512, 512) == arr.shape assert arr.flags.writeable assert -2000 == arr[0, 0] assert [621, 412, 138, -193, -520, -767, -907, -966, -988, -995] == ( arr[47:57, 279].tolist() ) assert [-377, -121, 141, 383, 633, 910, 1198, 1455, 1638, 1732] == ( arr[328:338, 106].tolist() ) @pytest.mark.skipif(not HAVE_JPEG, reason="Pillow or JPEG not available") class TestPillowHandler_JPEG: """Tests for handling Pixel Data with the handler.""" def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [NP_HANDLER, PIL_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP assert HAVE_PIL assert PIL_HANDLER is not None def test_unsupported_syntax_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" pydicom.config.pixel_data_handlers = [PIL_HANDLER] ds = dcmread(EXPL) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid with pytest.raises((NotImplementedError, RuntimeError)): ds.pixel_array @pytest.mark.parametrize("fpath, data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName @pytest.mark.parametrize("fpath, data", REFERENCE_DATA) def test_properties(self, fpath, data): """Test dataset and pixel array properties are as expected.""" if data[0] not in JPEG_SUPPORTED_SYNTAXES: return ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.BitsAllocated == data[1] assert ds.SamplesPerPixel == data[2] assert ds.PixelRepresentation == data[3] assert getattr(ds, "NumberOfFrames", 1) == data[4] arr = ds.pixel_array assert arr.flags.writeable assert data[5] == arr.shape assert arr.dtype == data[6] @pytest.mark.parametrize("fpath, rpath, values", JPEG_MATCHING_DATASETS) def test_array(self, fpath, rpath, values): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array if "YBR" in ds.PhotometricInterpretation: arr = convert_color_space(arr, ds.PhotometricInterpretation, "RGB") ds2 = dcmread(rpath) ds2.pixel_array_options(use_v2_backend=True) ref = ds2.pixel_array if values: assert tuple(arr[5, 50, :]) == values[0] assert tuple(arr[15, 50, :]) == values[1] assert tuple(arr[25, 50, :]) == values[2] assert tuple(arr[35, 50, :]) == values[3] assert tuple(arr[45, 50, :]) == values[4] assert tuple(arr[55, 50, :]) == values[5] assert tuple(arr[65, 50, :]) == values[6] assert tuple(arr[75, 50, :]) == values[7] assert tuple(arr[85, 50, :]) == values[8] assert tuple(arr[95, 50, :]) == values[9] close = [ JPGB_08_08_3_0_1F_YBR_FULL_422_411, JPGB_08_08_3_0_1F_YBR_FULL_411, ] if fpath in close: assert np.allclose(arr, ref, atol=1) else: assert np.array_equal(arr, ref) def test_color_3d(self): """Test decoding JPEG with pillow handler succeeds.""" ds = dcmread(JPGB_08_08_3_0_120F_YBR_FULL_422) ds.pixel_array_options(use_v2_backend=True) assert "YBR_FULL_422" == ds.PhotometricInterpretation arr = ds.pixel_array assert arr.flags.writeable assert (120, 480, 640, 3) == arr.shape arr = convert_color_space(arr, "YBR_FULL_422", "RGB") # this test points were manually identified in Osirix viewer assert (41, 41, 41) == tuple(arr[3, 159, 290, :]) assert (57, 57, 57) == tuple(arr[3, 169, 290, :]) assert "YBR_FULL_422" == ds.PhotometricInterpretation def test_JPGE_16bit_raises(self): """Test decoding JPEG lossy with pillow handler fails.""" ds = dcmread(JPGE_16_12_1_0_1F_M2) ds.pixel_array_options(use_v2_backend=True) msg = ( r"1.2.840.10008.1.2.4.51 - JPEG Extended \(Process 2 and 4\) is only " r"supported by Pillow if \(0028,0100\) Bits Allocated = 8" ) with pytest.raises(NotImplementedError, match=msg): ds.pixel_array def test_JPGL_raises(self): """Test decoding JPEG Lossless with pillow handler fails.""" ds = dcmread(JPGL_16_16_1_1_1F_M2) ds.pixel_array_options(use_v2_backend=True) msg = r"as there are no pixel data handlers available that support it" with pytest.raises(NotImplementedError, match=msg): ds.pixel_array def test_JPGB_odd_data_size(self): """Test decoding JPEG Baseline with pillow handler succeeds.""" ds = dcmread(JPGB_08_08_3_0_1F_YBR_FULL) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array assert arr.nbytes == 27 assert arr.shape == (3, 3, 3) def test_frame_multiple_fragments(self): """Test a frame split across multiple fragments.""" ds = dcmread(JPGB_08_08_3_0_120F_YBR_FULL_422) ds.pixel_array_options(use_v2_backend=True) ref = ds.pixel_array frames = [ f for f in generate_frames(ds.PixelData, number_of_frames=ds.NumberOfFrames) ] ds.PixelData = encapsulate(frames, fragments_per_frame=4) assert np.array_equal(ds.pixel_array, ref) pydicom-pydicom-20aa4b7/tests/test_pylibjpeg.py000066400000000000000000001006171515706620200217730ustar00rootroot00000000000000# Copyright 2020 pydicom authors. See LICENSE file for details. """Tests for the pixel_data_handlers.pylibjpeg_handler module.""" from pathlib import Path import pytest import pydicom from pydicom.data import get_testdata_file from pydicom.encaps import get_frame from pydicom.filereader import dcmread from pydicom.pixels.processing import convert_color_space from pydicom.pixels.utils import get_j2k_parameters, get_expected_length from pydicom.uid import ( JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, RLELossless, AllTransferSyntaxes, ) try: import numpy as np from pydicom.pixel_data_handlers import numpy_handler as NP_HANDLER HAVE_NP = True except ImportError: NP_HANDLER = None HAVE_NP = False try: from pydicom.pixel_data_handlers import pylibjpeg_handler as LJ_HANDLER from pydicom.pixel_data_handlers.pylibjpeg_handler import ( get_pixeldata, as_array, generate_frames, ) HAVE_PYLIBJPEG = LJ_HANDLER.HAVE_PYLIBJPEG HAVE_LJ = LJ_HANDLER.HAVE_LIBJPEG HAVE_OJ = LJ_HANDLER.HAVE_OPENJPEG HAVE_RLE = LJ_HANDLER.HAVE_RLE except ImportError: LJ_HANDLER = None HAVE_PYLIBJPEG = False HAVE_LJ = False HAVE_OJ = False HAVE_RLE = False TEST_HANDLER = HAVE_NP and HAVE_PYLIBJPEG # Run handler tests TEST_JPEG = TEST_HANDLER and HAVE_LJ # Run 10918 JPEG tests TEST_JPEGLS = TEST_HANDLER and HAVE_LJ # Run 14495 JPEG-LS tests TEST_JPEG2K = TEST_HANDLER and HAVE_OJ # Run 15444 JPEG 2000 tests TEST_RLE = TEST_HANDLER and HAVE_RLE # Run RLE Lossless tests SUPPORTED_SYNTAXES = [ JPEGBaseline8Bit, JPEGExtended12Bit, JPEGLossless, JPEGLosslessSV1, JPEGLSLossless, JPEGLSNearLossless, JPEG2000Lossless, JPEG2000, RLELossless, ] UNSUPPORTED_SYNTAXES = list(set(AllTransferSyntaxes) ^ set(SUPPORTED_SYNTAXES)) # Transfer syntaxes supported by other handlers IMPL = get_testdata_file("MR_small_implicit.dcm") EXPL = get_testdata_file("OBXXXX1A.dcm") EXPB = get_testdata_file("OBXXXX1A_expb.dcm") DEFL = get_testdata_file("image_dfl.dcm") REFERENCE_DATA_UNSUPPORTED = [ (IMPL, ("1.2.840.10008.1.2", "CompressedSamples^MR1")), (EXPL, ("1.2.840.10008.1.2.1", "OB^^^^")), (EXPB, ("1.2.840.10008.1.2.2", "OB^^^^")), (DEFL, ("1.2.840.10008.1.2.1.99", "^^^^")), ] # RLE Lossless - PackBits algorithm RLE_8_1_1F = get_testdata_file("OBXXXX1A_rle.dcm") RLE_8_1_2F = get_testdata_file("OBXXXX1A_rle_2frame.dcm") RLE_8_3_1F = get_testdata_file("SC_rgb_rle.dcm") RLE_8_3_2F = get_testdata_file("SC_rgb_rle_2frame.dcm") RLE_16_1_1F = get_testdata_file("MR_small_RLE.dcm") RLE_16_1_10F = get_testdata_file("emri_small_RLE.dcm") RLE_16_3_1F = get_testdata_file("SC_rgb_rle_16bit.dcm") RLE_16_3_2F = get_testdata_file("SC_rgb_rle_16bit_2frame.dcm") RLE_32_1_1F = get_testdata_file("rtdose_rle_1frame.dcm") RLE_32_1_15F = get_testdata_file("rtdose_rle.dcm") RLE_32_3_1F = get_testdata_file("SC_rgb_rle_32bit.dcm") RLE_32_3_2F = get_testdata_file("SC_rgb_rle_32bit_2frame.dcm") # JPEG - ISO/IEC 10918 Standard # FMT_BA_BV_SPX_PR_FRAMESF_PI # JPGB: 1.2.840.10008.1.2.4.50 - JPEG Baseline (8-bit only) JPGB_08_08_3_0_1F_YBR_FULL = get_testdata_file("SC_rgb_small_odd_jpeg.dcm") JPGB_08_08_3_0_120F_YBR_FULL_422 = get_testdata_file("color3d_jpeg_baseline.dcm") # Different subsampling 411, 422, 444 JPGB_08_08_3_0_1F_YBR_FULL_422_411 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+np.dcm") JPGB_08_08_3_0_1F_YBR_FULL_422_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s2.dcm") JPGB_08_08_3_0_1F_YBR_FULL_411 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n1.dcm") JPGB_08_08_3_0_1F_YBR_FULL_422 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+n2.dcm") JPGB_08_08_3_0_1F_YBR_FULL_444 = get_testdata_file("SC_rgb_dcmtk_+eb+cy+s4.dcm") JPGB_08_08_3_0_1F_RGB = get_testdata_file("SC_rgb_dcmtk_+eb+cr.dcm") # JPGE: 1.2.840.1.2.4.51 - JPEG Extended JPGE_BAD = get_testdata_file("JPEG-lossy.dcm") # Bad JPEG file JPGE_16_12_1_0_1F_M2 = get_testdata_file("JPGExtended.dcm") # Fixed version # JPGL: 1.2.840.10008.1.2.4.70 - JPEG Lossless, Non-hierarchical, 1st Order JPGL_08_08_1_0_1F = get_testdata_file("JPGLosslessP14SV1_1s_1f_8b.dcm") JPGL_16_16_1_1_1F_M2 = get_testdata_file("JPEG-LL.dcm") JPGB = JPEGBaseline8Bit JPGE = JPEGExtended12Bit JPGL = JPEGLosslessSV1 JPG_REFERENCE_DATA = [ # fpath, (syntax, bits, nr samples, pixel repr, nr frames, shape, dtype) ( JPGB_08_08_3_0_120F_YBR_FULL_422, (JPGB, 8, 3, 0, 120, (120, 480, 640, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_422_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_422_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_411, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_422, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), ( JPGB_08_08_3_0_1F_YBR_FULL_444, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8"), ), (JPGB_08_08_3_0_1F_RGB, (JPGB, 8, 3, 0, 1, (100, 100, 3), "uint8")), (JPGE_16_12_1_0_1F_M2, (JPGE, 16, 1, 0, 1, (1024, 256), "uint16")), (JPGL_08_08_1_0_1F, (JPGL, 8, 1, 0, 1, (768, 1024), "uint8")), (JPGL_16_16_1_1_1F_M2, (JPGL, 16, 1, 1, 1, (1024, 256), "int16")), ] JPG_MATCHING_DATASETS = [ # (compressed, reference, hard coded check values), px tolerance pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_422_411, get_testdata_file("SC_rgb_dcmtk_ebcynp_dcmd.dcm"), [ (253, 1, 0), (253, 129, 131), (0, 255, 5), (127, 255, 129), (0, 0, 254), (127, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], 2, ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_422_422, get_testdata_file("SC_rgb_dcmtk_ebcys2_dcmd.dcm"), [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], 0, ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_411, get_testdata_file("SC_rgb_dcmtk_ebcyn1_dcmd.dcm"), [ (253, 1, 0), (253, 129, 131), (0, 255, 5), (127, 255, 129), (0, 0, 254), (127, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], 2, ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_422, get_testdata_file("SC_rgb_dcmtk_ebcyn2_dcmd.dcm"), [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], 0, ), pytest.param( JPGB_08_08_3_0_1F_YBR_FULL_444, get_testdata_file("SC_rgb_dcmtk_ebcys4_dcmd.dcm"), [ (254, 0, 0), (255, 127, 127), (0, 255, 5), (129, 255, 129), (0, 0, 254), (128, 127, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], 0, ), pytest.param( JPGB_08_08_3_0_1F_RGB, get_testdata_file("SC_rgb_dcmtk_ebcr_dcmd.dcm"), [ (255, 0, 0), (255, 128, 128), (0, 255, 0), (128, 255, 128), (0, 0, 255), (128, 128, 255), (0, 0, 0), (64, 64, 64), (192, 192, 192), (255, 255, 255), ], 1, ), ] # JPEG-LS - ISO/IEC 14495 Standard JLSL = JPEGLSNearLossless JLSN = JPEGLSLossless JPEG_LS_LOSSLESS = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") JLS_REFERENCE_DATA = [ # fpath, (syntax, bits, nr samples, pixel repr, nr frames, shape, dtype) (JPEG_LS_LOSSLESS, (JLSN, 16, 1, 1, 1, (64, 64), "int16")), ] # JPEG 2000 - ISO/IEC 15444 Standard J2KR = JPEG2000Lossless J2KI = JPEG2000 # J2KR: 1.2.840.100008.1.2.4.90 - JPEG 2000 Lossless J2KR_08_08_3_0_1F_YBR_ICT = get_testdata_file("US1_J2KR.dcm") J2KR_16_10_1_0_1F_M1 = get_testdata_file("RG3_J2KR.dcm") J2KR_16_12_1_0_1F_M2 = get_testdata_file("MR2_J2KR.dcm") J2KR_16_15_1_0_1F_M1 = get_testdata_file("RG1_J2KR.dcm") J2KR_16_16_1_0_10F_M2 = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") J2KR_16_14_1_1_1F_M2 = get_testdata_file("693_J2KR.dcm") J2KR_16_16_1_1_1F_M2 = get_testdata_file("MR_small_jp2klossless.dcm") J2KR_16_13_1_1_1F_M2_MISMATCH = get_testdata_file("J2K_pixelrep_mismatch.dcm") # Non-conformant pixel data -> JP2 header present J2KR_08_08_3_0_1F_YBR_RCT = get_testdata_file("GDCMJ2K_TextGBR.dcm") # J2KI: 1.2.840.10008.1.2.4.91 - JPEG 2000 J2KI_08_08_3_0_1F_RGB = get_testdata_file("SC_rgb_gdcm_KY.dcm") J2KI_08_08_3_0_1F_YBR_ICT = get_testdata_file("US1_J2KI.dcm") J2KI_16_10_1_0_1F_M1 = get_testdata_file("RG3_J2KI.dcm") J2KI_16_12_1_0_1F_M2 = get_testdata_file("MR2_J2KI.dcm") J2KI_16_15_1_0_1F_M1 = get_testdata_file("RG1_J2KI.dcm") J2KI_16_14_1_1_1F_M2 = get_testdata_file("693_J2KI.dcm") J2KI_16_16_1_1_1F_M2 = get_testdata_file("JPEG2000.dcm") J2K_REFERENCE_DATA = [ # fpath, (syntax, bits, nr samples, pixel repr, nr frames, shape, dtype) (J2KR_08_08_3_0_1F_YBR_ICT, (J2KR, 8, 3, 0, 1, (480, 640, 3), "uint8")), (J2KR_16_10_1_0_1F_M1, (J2KR, 16, 1, 0, 1, (1760, 1760), "uint16")), (J2KR_16_12_1_0_1F_M2, (J2KR, 16, 1, 0, 1, (1024, 1024), "uint16")), (J2KR_16_15_1_0_1F_M1, (J2KR, 16, 1, 0, 1, (1955, 1841), "uint16")), # should be Bits Stored = 12 (J2KR_16_16_1_0_10F_M2, (J2KR, 16, 1, 0, 10, (10, 64, 64), "uint16")), # should be Bits Stored = 16 (J2KR_16_14_1_1_1F_M2, (J2KR, 16, 1, 1, 1, (512, 512), "int16")), (J2KR_16_16_1_1_1F_M2, (J2KR, 16, 1, 1, 1, (64, 64), "int16")), (J2KI_08_08_3_0_1F_RGB, (J2KI, 8, 3, 0, 1, (100, 100, 3), "uint8")), (J2KI_08_08_3_0_1F_YBR_ICT, (J2KI, 8, 3, 0, 1, (480, 640, 3), "uint8")), (J2KI_16_10_1_0_1F_M1, (J2KI, 16, 1, 0, 1, (1760, 1760), "uint16")), (J2KI_16_12_1_0_1F_M2, (J2KI, 16, 1, 0, 1, (1024, 1024), "uint16")), (J2KI_16_15_1_0_1F_M1, (J2KI, 16, 1, 0, 1, (1955, 1841), "uint16")), # should be Bits Stored = 16 (J2KI_16_14_1_1_1F_M2, (J2KI, 16, 1, 1, 1, (512, 512), "int16")), (J2KI_16_16_1_1_1F_M2, (J2KI, 16, 1, 1, 1, (1024, 256), "int16")), ] J2KR_MATCHING_DATASETS = [ # (compressed, reference, fixes) pytest.param( J2KR_08_08_3_0_1F_YBR_ICT, get_testdata_file("US1_UNCR.dcm"), {}, ), pytest.param( J2KR_16_10_1_0_1F_M1, get_testdata_file("RG3_UNCR.dcm"), {}, ), pytest.param( J2KR_16_12_1_0_1F_M2, get_testdata_file("MR2_UNCR.dcm"), {}, ), pytest.param( J2KR_16_15_1_0_1F_M1, get_testdata_file("RG1_UNCR.dcm"), {}, ), pytest.param( J2KR_16_16_1_0_10F_M2, get_testdata_file("emri_small.dcm"), {"BitsStored": 16}, ), pytest.param( J2KR_16_14_1_1_1F_M2, get_testdata_file("693_UNCR.dcm"), {"BitsStored": 14}, ), pytest.param( J2KR_16_16_1_1_1F_M2, get_testdata_file("MR_small.dcm"), {}, ), ] J2KI_MATCHING_DATASETS = [ pytest.param( J2KI_08_08_3_0_1F_RGB, get_testdata_file("SC_rgb_gdcm2k_uncompressed.dcm"), {}, ), pytest.param( J2KI_08_08_3_0_1F_YBR_ICT, get_testdata_file("US1_UNCI.dcm"), {}, ), pytest.param( J2KI_16_10_1_0_1F_M1, get_testdata_file("RG3_UNCI.dcm"), {}, ), pytest.param( J2KI_16_12_1_0_1F_M2, get_testdata_file("MR2_UNCI.dcm"), {}, ), pytest.param( J2KI_16_15_1_0_1F_M1, get_testdata_file("RG1_UNCI.dcm"), {}, ), pytest.param( J2KI_16_14_1_1_1F_M2, get_testdata_file("693_UNCI.dcm"), {"BitsStored": 16}, ), pytest.param( J2KI_16_16_1_1_1F_M2, get_testdata_file("JPEG2000_UNC.dcm"), {}, ), ] def test_unsupported_syntaxes(): """Test that UNSUPPORTED_SYNTAXES is as expected.""" for syntax in SUPPORTED_SYNTAXES: assert syntax not in UNSUPPORTED_SYNTAXES @pytest.mark.skipif(not HAVE_PYLIBJPEG, reason="pylibjpeg not available") class TestHandler: """Tests for handling Pixel Data with the handler.""" def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [NP_HANDLER, LJ_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP assert HAVE_PYLIBJPEG assert LJ_HANDLER is not None def test_unsupported_syntax_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" pydicom.config.pixel_data_handlers = [LJ_HANDLER] ds = dcmread(EXPL) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid with pytest.raises((NotImplementedError, RuntimeError)): ds.pixel_array @pytest.mark.skipif(HAVE_LJ or HAVE_OJ or HAVE_RLE, reason="plugins available") def test_no_plugins_raises(self): """Test exception raised if required plugin missing.""" ds = dcmread(JPGB_08_08_3_0_1F_YBR_FULL) ds.pixel_array_options(use_v2_backend=True) msg = ( r"Unable to convert the Pixel Data as the 'pylibjpeg-libjpeg' " r"plugin is not installed" ) with pytest.raises(RuntimeError, match=msg): ds.pixel_array ds = dcmread(J2KI_08_08_3_0_1F_RGB) ds.pixel_array_options(use_v2_backend=True) msg = ( r"Unable to convert the Pixel Data as the 'pylibjpeg-openjpeg' " r"plugin is not installed" ) with pytest.raises(RuntimeError, match=msg): ds.pixel_array # Don't use pydicom decoder ds = dcmread(RLE_8_1_1F) ds.pixel_array_options(use_v2_backend=True) msg = ( r"Unable to convert the Pixel Data as the 'pylibjpeg-rle' " r"plugin is not installed" ) with pytest.raises(RuntimeError, match=msg): ds.pixel_array def test_change_photometric_interpretation(self): """Test returned value.""" ds = dcmread(J2KR_16_12_1_0_1F_M2) func = LJ_HANDLER.should_change_PhotometricInterpretation_to_RGB assert func(ds) is False @pytest.mark.skipif(not TEST_JPEG, reason="no -libjpeg plugin") class TestJPEG: def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [NP_HANDLER, LJ_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers @pytest.mark.parametrize("fpath, data", JPG_REFERENCE_DATA) def test_properties(self, fpath, data): """Test dataset and pixel array properties are as expected.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.BitsAllocated == data[1] assert ds.SamplesPerPixel == data[2] assert ds.PixelRepresentation == data[3] assert getattr(ds, "NumberOfFrames", 1) == data[4] arr = ds.pixel_array assert arr.flags.writeable assert data[5] == arr.shape assert arr.dtype == data[6] @pytest.mark.parametrize("fpath, rpath, val, tol", JPG_MATCHING_DATASETS) def test_array(self, fpath, rpath, val, tol): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array if "YBR" in ds.PhotometricInterpretation: arr = convert_color_space(arr, ds.PhotometricInterpretation, "RGB") ref = dcmread(rpath).pixel_array if val: assert tuple(arr[5, 50, :]) == val[0] assert tuple(arr[15, 50, :]) == val[1] assert tuple(arr[25, 50, :]) == val[2] assert tuple(arr[35, 50, :]) == val[3] assert tuple(arr[45, 50, :]) == val[4] assert tuple(arr[55, 50, :]) == val[5] assert tuple(arr[65, 50, :]) == val[6] assert tuple(arr[75, 50, :]) == val[7] assert tuple(arr[85, 50, :]) == val[8] assert tuple(arr[95, 50, :]) == val[9] # All results within `tol` intensity units of the reference assert np.allclose(arr, ref, atol=tol) @pytest.mark.parametrize("fpath, rpath, val, tol", JPG_MATCHING_DATASETS) def test_generate_frames(self, fpath, rpath, val, tol): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) frame_generator = generate_frames(ds) ref = dcmread(rpath).pixel_array nr_frames = getattr(ds, "NumberOfFrames", 1) for ii in range(nr_frames): arr = next(frame_generator) if "YBR" in ds.PhotometricInterpretation: arr = convert_color_space(arr, ds.PhotometricInterpretation, "RGB") if nr_frames > 1: assert np.allclose(arr, ref[ii, ...], atol=tol) else: assert np.allclose(arr, ref, atol=tol) with pytest.raises(StopIteration): next(frame_generator) def test_bad_file_raises(self): """Test a bad JPEG file raises an exception.""" ds = dcmread(JPGE_BAD) ds.pixel_array_options(use_v2_backend=True) msg = ( r"libjpeg error code '-1038' returned from Decode\(\): A " r"misplaced marker segment was found - scan start must be zero " r"and scan stop must be 63 for the sequential operating modes" ) with pytest.raises(RuntimeError, match=msg): ds.pixel_array def test_missing_element_raises(self): """Test that missing required element raises exception.""" ds = dcmread(JPGB_08_08_3_0_1F_YBR_FULL) ds.pixel_array_options(use_v2_backend=True) del ds.PixelData msg = ( r"Unable to convert the pixel data as the following required " r"elements are missing from the dataset: PixelData" ) with pytest.raises(AttributeError, match=msg): ds.pixel_array @pytest.mark.skipif(not TEST_JPEGLS, reason="no -libjpeg plugin") class TestJPEGLS: def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [NP_HANDLER, LJ_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers @pytest.mark.parametrize("fpath, data", JLS_REFERENCE_DATA) def test_properties(self, fpath, data): """Test dataset and pixel array properties are as expected.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.BitsAllocated == data[1] assert ds.SamplesPerPixel == data[2] assert ds.PixelRepresentation == data[3] assert getattr(ds, "NumberOfFrames", 1) == data[4] arr = ds.pixel_array assert arr.flags.writeable assert data[5] == arr.shape assert arr.dtype == data[6] def test_array(self): """Test returned array values are OK.""" ds = dcmread(JPEG_LS_LOSSLESS) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array # Checked against GDCM assert [170, 193, 191, 373, 1293, 2053, 1879, 1683, 1711] == arr[ 55:65, 35 ].tolist() @pytest.mark.skipif(not TEST_JPEG2K, reason="no -openjpeg plugin") class TestJPEG2K: def setup_method(self): """Setup the test datasets and the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [NP_HANDLER, LJ_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers @pytest.mark.parametrize("fpath, data", J2K_REFERENCE_DATA) def test_properties_as_array(self, fpath, data): """Test dataset, pixel_array and as_array() are as expected.""" req_fixes = [J2KR_16_16_1_0_10F_M2, J2KR_16_14_1_1_1F_M2, J2KI_16_14_1_1_1F_M2] ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.BitsAllocated == data[1] assert ds.SamplesPerPixel == data[2] assert ds.PixelRepresentation == data[3] assert getattr(ds, "NumberOfFrames", 1) == data[4] # Check Dataset.pixel_array if fpath in req_fixes: with pytest.warns(UserWarning): arr = ds.pixel_array else: arr = ds.pixel_array assert arr.flags.writeable assert data[5] == arr.shape assert arr.dtype == data[6] # Check handlers as_array() function if fpath in req_fixes: with pytest.warns(UserWarning): arr = as_array(ds) else: arr = as_array(ds) assert arr.flags.writeable assert data[5] == arr.shape assert arr.dtype == data[6] @pytest.mark.parametrize("fpath, rpath, fixes", J2KR_MATCHING_DATASETS) def test_array_lossless(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) if fixes: with pytest.warns(UserWarning): arr = ds.pixel_array else: arr = ds.pixel_array ds2 = dcmread(rpath) ds2.pixel_array_options(use_v2_backend=True) ref = ds2.pixel_array assert np.array_equal(arr, ref) @pytest.mark.parametrize("fpath, rpath, fixes", J2KI_MATCHING_DATASETS) def test_array_lossy(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) if fixes: with pytest.warns(UserWarning): arr = ds.pixel_array else: arr = ds.pixel_array ds2 = dcmread(rpath) ds2.pixel_array_options(use_v2_backend=True) ref = ds2.pixel_array assert np.allclose(arr, ref, atol=1) @pytest.mark.parametrize("fpath, rpath, fixes", J2KR_MATCHING_DATASETS) def test_generate_frames_lossless(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) frame_generator = generate_frames(ds) ref = dcmread(rpath).pixel_array nr_frames = getattr(ds, "NumberOfFrames", 1) for ii in range(nr_frames): if fixes: with pytest.warns(UserWarning): arr = next(frame_generator) else: arr = next(frame_generator) if nr_frames > 1: assert np.array_equal(arr, ref[ii, ...]) else: assert np.array_equal(arr, ref) with pytest.raises(StopIteration): next(frame_generator) @pytest.mark.parametrize("fpath, rpath, fixes", J2KI_MATCHING_DATASETS) def test_generate_frames_lossy(self, fpath, rpath, fixes): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) frame_generator = generate_frames(ds) ref = dcmread(rpath).pixel_array nr_frames = getattr(ds, "NumberOfFrames", 1) for ii in range(nr_frames): if fixes: with pytest.warns(UserWarning): arr = next(frame_generator) else: arr = next(frame_generator) if nr_frames > 1: assert np.allclose(arr, ref[ii, ...], atol=1) else: assert np.allclose(arr, ref, atol=1) with pytest.raises(StopIteration): next(frame_generator) def test_warnings(self): """Test the plugin warnings work.""" # Bits Stored ds = dcmread(J2KR_16_14_1_1_1F_M2) ds.pixel_array_options(use_v2_backend=True) msg = ( r"The \(0028,0101\) Bits Stored value '16' in the dataset does " r"not match the component precision value '14' found in the JPEG " r"2000 data. It's recommended that you change the Bits Stored " r"value to produce the correct output" ) with pytest.warns(UserWarning, match=msg): ds.pixel_array # Pixel Representation ds.BitsStored = 14 ds.PixelRepresentation = 0 msg = ( r"The \(0028,0103\) Pixel Representation value '0' \(unsigned\) " r"in the dataset does not match the format of the values found in " r"the JPEG 2000 data 'signed'" ) with pytest.warns(UserWarning, match=msg): ds.pixel_array # Samples per Pixel ds.PixelRepresentation = 1 ds.SamplesPerPixel = 3 msg = ( r"The \(0028,0002\) Samples per Pixel value '3' in the dataset " r"does not match the number of components '1' found in the JPEG " r"2000 data. It's recommended that you change the Samples per " r"Pixel value to produce the correct output" ) with pytest.warns(UserWarning, match=msg): with pytest.raises(ValueError): ds.pixel_array # JP2 header ds = dcmread(J2KR_08_08_3_0_1F_YBR_RCT) ds.pixel_array_options(use_v2_backend=True) msg = ( r"The \(7FE0,0010\) Pixel Data contains a JPEG 2000 codestream " r"with the optional JP2 file format header, which is " r"non-conformant to the DICOM Standard \(Part 5, Annex A.4.4\)" ) with pytest.warns(UserWarning, match=msg): ds.pixel_array def test_decompress_using_pylibjpeg(self): """Test decompressing JPEG2K with pylibjpeg handler succeeds.""" ds = dcmread(J2KR_16_12_1_0_1F_M2) ds.pixel_array_options(use_v2_backend=True) ds.decompress(handler_name="pylibjpeg") arr = ds.pixel_array ds = dcmread(get_testdata_file("MR2_J2KR.dcm")) ds.pixel_array_options(use_v2_backend=True) ref = ds.pixel_array assert np.array_equal(arr, ref) def test_pixel_rep_mismatch(self): """Test mismatched j2k sign and Pixel Representation.""" ds = dcmread(J2KR_16_13_1_1_1F_M2_MISMATCH) ds.pixel_array_options(use_v2_backend=True) assert 1 == ds.PixelRepresentation assert 13 == ds.BitsStored bs = get_frame(ds.PixelData, 0) params = get_j2k_parameters(bs) assert 13 == params["precision"] assert not params["is_signed"] msg = r"value '1' \(signed\)" with pytest.warns(UserWarning, match=msg): arr = ds.pixel_array assert 1 == ds.PixelRepresentation assert "int16" == arr.dtype assert (512, 512) == arr.shape assert arr.flags.writeable assert -2000 == arr[0, 0] assert [621, 412, 138, -193, -520, -767, -907, -966, -988, -995] == ( arr[47:57, 279].tolist() ) assert [-377, -121, 141, 383, 633, 910, 1198, 1455, 1638, 1732] == ( arr[328:338, 106].tolist() ) RLE_REFERENCE_DATA = [ # fpath, (bits, nr samples, pixel repr, nr frames, shape, dtype) (RLE_8_1_1F, (8, 1, 0, 1, (600, 800), "uint8")), (RLE_8_1_2F, (8, 1, 0, 2, (2, 600, 800), "uint8")), (RLE_8_3_1F, (8, 3, 0, 1, (100, 100, 3), "uint8")), (RLE_8_3_2F, (8, 3, 0, 2, (2, 100, 100, 3), "uint8")), (RLE_16_1_1F, (16, 1, 1, 1, (64, 64), "int16")), (RLE_16_1_10F, (16, 1, 0, 10, (10, 64, 64), "uint16")), (RLE_16_3_1F, (16, 3, 0, 1, (100, 100, 3), "uint16")), (RLE_16_3_2F, (16, 3, 0, 2, (2, 100, 100, 3), "uint16")), (RLE_32_1_1F, (32, 1, 0, 1, (10, 10), "uint32")), (RLE_32_1_15F, (32, 1, 0, 15, (15, 10, 10), "uint32")), (RLE_32_3_1F, (32, 3, 0, 1, (100, 100, 3), "uint32")), (RLE_32_3_2F, (32, 3, 0, 2, (2, 100, 100, 3), "uint32")), ] RLE_MATCHING_DATASETS = [ # (compressed, reference) pytest.param(RLE_8_1_1F, get_testdata_file("OBXXXX1A.dcm")), pytest.param(RLE_8_1_2F, get_testdata_file("OBXXXX1A_2frame.dcm")), pytest.param(RLE_8_3_1F, get_testdata_file("SC_rgb.dcm")), pytest.param(RLE_8_3_2F, get_testdata_file("SC_rgb_2frame.dcm")), pytest.param(RLE_16_1_1F, get_testdata_file("MR_small.dcm")), pytest.param(RLE_16_1_10F, get_testdata_file("emri_small.dcm")), pytest.param(RLE_16_3_1F, get_testdata_file("SC_rgb_16bit.dcm")), pytest.param(RLE_16_3_2F, get_testdata_file("SC_rgb_16bit_2frame.dcm")), pytest.param(RLE_32_1_1F, get_testdata_file("rtdose_1frame.dcm")), pytest.param(RLE_32_1_15F, get_testdata_file("rtdose.dcm")), pytest.param(RLE_32_3_1F, get_testdata_file("SC_rgb_32bit.dcm")), pytest.param(RLE_32_3_2F, get_testdata_file("SC_rgb_32bit_2frame.dcm")), ] @pytest.mark.skipif(not TEST_RLE, reason="no -rle plugin") class TestRLE: def test_decompress_using_pylibjpeg(self): """Test decompressing RLE with pylibjpeg handler succeeds.""" ds = dcmread(RLE_8_3_1F) ds.pixel_array_options(use_v2_backend=True) ds.decompress(handler_name="pylibjpeg") arr = ds.pixel_array ds = dcmread(get_testdata_file("SC_rgb.dcm")) ds.pixel_array_options(use_v2_backend=True) ref = ds.pixel_array assert np.array_equal(arr, ref) @pytest.mark.parametrize("fpath, data", RLE_REFERENCE_DATA) def test_properties_as_array(self, fpath, data): """Test dataset, pixel_array and as_array() are as expected.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) assert RLELossless == ds.file_meta.TransferSyntaxUID assert ds.BitsAllocated == data[0] assert ds.SamplesPerPixel == data[1] assert ds.PixelRepresentation == data[2] assert getattr(ds, "NumberOfFrames", 1) == data[3] # Note: decompress modifies the dataset inplace ds.decompress("pylibjpeg") # Check Dataset.pixel_array arr = ds.pixel_array assert arr.flags.writeable assert data[4] == arr.shape assert arr.dtype == data[5] # Check handler's as_array() function ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) arr = as_array(ds) assert arr.flags.writeable assert data[4] == arr.shape assert arr.dtype == data[5] @pytest.mark.parametrize("fpath, rpath", RLE_MATCHING_DATASETS) def test_array(self, fpath, rpath): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) ds.decompress("pylibjpeg") arr = ds.pixel_array ref = dcmread(rpath).pixel_array assert np.array_equal(arr, ref) @pytest.mark.parametrize("fpath, rpath", RLE_MATCHING_DATASETS) def test_generate_frames(self, fpath, rpath): """Test pixel_array returns correct values.""" ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) frame_generator = generate_frames(ds) ref = dcmread(rpath).pixel_array nr_frames = getattr(ds, "NumberOfFrames", 1) for ii in range(nr_frames): arr = next(frame_generator) if nr_frames > 1: assert np.array_equal(arr, ref[ii, ...]) else: assert np.array_equal(arr, ref) with pytest.raises(StopIteration): next(frame_generator) pydicom-pydicom-20aa4b7/tests/test_rawread.py000066400000000000000000000530731515706620200214360ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.filereader module using raw data elements.""" from io import BytesIO import pytest from pydicom.filereader import data_element_generator from pydicom.values import convert_value from pydicom.sequence import Sequence from pydicom.util.hexutil import hex2bytes class TestRawReaderExplVRTests: # See comments in data_element_generator # summary of DICOM data element formats # Here we are trying to test all those variations def testExplVRLittleEndianLongLength(self): """Raw read: Explicit VR Little Endian long length...""" # (0002,0001) OB 2-byte-reserved 4-byte-length, value 0x00 0x01 bytes_input = "02 00 01 00 4f 42 00 00 02 00 00 00 00 01" infile = BytesIO(hex2bytes(bytes_input)) expected = ((2, 1), "OB", 2, b"\00\01", 0xC, False, True, True, False) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) # (0002,0002) OB 2-byte-reserved 4-byte-length, # value 0x00 0x01 def testExplVRLittleEndianShortLength(self): """Raw read: Explicit VR Little Endian short length...""" # (0008,212A) IS 2-byte-length, value '1 ' infile = BytesIO(hex2bytes("08 00 2a 21 49 53 02 00 31 20")) # XXX Assumes that a RawDataElement doesn't convert the value based # upon the VR value, thus it will remain a byte string since that is # the input expected = ((8, 0x212A), "IS", 2, b"1 ", 0x8, False, True, True, False) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) def testExplVRLittleEndianUndefLength(self): """Raw read: Expl VR Little Endian with undefined length...""" # (7FE0,0010), OB, 2-byte reserved, 4-byte-length (UNDEFINED) hexstr1 = "e0 7f 10 00 4f 42 00 00 ff ff ff ff" hexstr2 = " 41 42 43 44 45 46 47 48 49 4a" # 'content' hexstr3 = " fe ff dd e0 00 00 00 00" # Sequence Delimiter hexstr = hexstr1 + hexstr2 + hexstr3 infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, b"ABCDEFGHIJ", 0xC, False, True, True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) # Test again such that delimiter crosses default 128-byte "chunks" for multiplier in (116, 117, 118, 120): multiplier = 116 hexstr2b = hexstr2 + " 00" * multiplier hexstr = hexstr1 + hexstr2b + hexstr3 infile = BytesIO(hex2bytes(hexstr)) expected = len("ABCDEFGHIJ" + "\0" * multiplier) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) got = next(de_gen) got_len = len(got.value) assert expected == got_len assert got.value.startswith(b"ABCDEFGHIJ\0") class TestRawReaderImplVR: # See comments in data_element_generator # summary of DICOM data element formats # Here we are trying to test all those variations def testImplVRLittleEndian(self): """Raw read: Implicit VR Little Endian...""" # (0008,212A) {IS} 4-byte-length, value '1 ' infile = BytesIO(hex2bytes("08 00 2a 21 02 00 00 00 31 20")) expected = ((8, 0x212A), None, 2, b"1 ", 0x8, True, True, True, False) de_gen = data_element_generator( infile, is_implicit_VR=True, is_little_endian=True ) assert expected == next(de_gen) def testImplVRLittleEndianUndefLength(self): """Raw read: Impl VR Little Endian with undefined length...""" # (7FE0,0010), OB, 2-byte reserved, 4-byte-length (UNDEFINED) hexstr1 = "e0 7f 10 00 ff ff ff ff" hexstr2 = " 41 42 43 44 45 46 47 48 49 4a" # 'content' hexstr3 = " fe ff dd e0 00 00 00 00" # Sequence Delimiter hexstr = hexstr1 + hexstr2 + hexstr3 infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB or OW", 0xFFFFFFFF, b"ABCDEFGHIJ", 0x8, True, True, True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=True, is_little_endian=True ) assert expected == next(de_gen) # Test again such that delimiter crosses default 128-byte "chunks" for multiplier in (116, 117, 118, 120): multiplier = 116 hexstr2b = hexstr2 + " 00" * multiplier hexstr = hexstr1 + hexstr2b + hexstr3 infile = BytesIO(hex2bytes(hexstr)) expected = len("ABCDEFGHIJ" + "\0" * multiplier) de_gen = data_element_generator( infile, is_implicit_VR=True, is_little_endian=True ) got = next(de_gen) assert expected == len(got.value) assert got.value.startswith(b"ABCDEFGHIJ\0") def testExplVRLittleEndianEncapsulatedUndefLength(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag "18 00 00 00" # Item (dataset) Length "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "51 52 53 54" "55 56 57 58" "fe ff dd e0" # (fffe, edd) Sequence Delimiter "00 00 00 00" # required Item Length Field of value 0 ) infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, # declared value length b"\xfe\xff\x00\xe0\x18\x00\x00\x00ABCDEFGHIJKLMNOPQRSTUVWX", 12, # value starts 12 bytes after beginning of element False, # is Implicit VR True, # is Little Endian True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) assert 52 == infile.tell() def testExplVRLittleEndianEncapsulatedUndefLengthTwoFragments(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length broken into two defined-length fragments...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag "18 00 00 00" # Item (dataset) Length "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "51 52 53 54" "55 56 57 58" "fe ff 00 e0" # (FFFE,E000) Item Tag "14 00 00 00" # Item (dataset) Length "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "51 52 53 54" "fe ff dd e0" # (fffe, edd) Sequence Delimiter "00 00 00 00" # required Item Length Field of value 0 ) infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, # declared value length ( b"\xfe\xff\x00\xe0\x18\x00\x00\x00ABCDEFGHIJKLMNOPQRSTUVWX" b"\xfe\xff\x00\xe0\x14\x00\x00\x00ABCDEFGHIJKLMNOPQRST" ), 12, # value starts 12 bytes after beginning of element False, # is Implicit VR True, # is Little Endian True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) assert 80 == infile.tell() def testExplVRLittleEndianEncapsulatedUndefLengthUndefItemLength(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length and whose fragment (Item) also has an undefined length...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag "ff ff ff ff" # Item (dataset) Length - undefined "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "51 52 53 54" "55 56 57 58" "fe ff dd e0" # (fffe, edd) Sequence Delimiter "00 00 00 00" # required Item Length Field of value 0 ) infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, # declared value length b"\xfe\xff\x00\xe0\xff\xff\xff\xffABCDEFGHIJKLMNOPQRSTUVWX", 12, # value starts 12 bytes after beginning of element False, # is Implicit VR True, # is Little Endian True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) assert 52 == infile.tell() def testExplVRLittleEndianEncapsulatedUndefLengthAndTooLongItemLength(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length and whose fragment (Item) has an erroneous (too long) length...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag "50 00 00 00" # Item (dataset) Length - too long "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "51 52 53 54" "55 56 57 58" "fe ff dd e0" # (fffe, edd) Sequence Delimiter "00 00 00 00" # required Item Length Field of value 0 ) infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, # declared value length b"\xfe\xff\x00\xe0\x50\x00\x00\x00ABCDEFGHIJKLMNOPQRSTUVWX", 12, # value starts 12 bytes after beginning of element False, # is Implicit VR True, # is Little Endian True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) assert 52 == infile.tell() def testExplVRLittleEndianEncapsulatedUndefLengthAndItemLengthMIssing(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length and whose fragment (Item) ends before its length is specified...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag ) infile = BytesIO(hex2bytes(hexstr)) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) with pytest.raises(EOFError): next(de_gen) def testExplVRLittleEndianEncapsulatedUndefLengthDeferred(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length that's longer than defer_size...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag "14 00 00 00" # Item (dataset) Length "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "51 52 53 54" "fe ff dd e0" # (fffe, edd) Sequence Delimiter "00 00 00 00" # required Item Length Field of value 0 ) infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, # declared value length None, # extracted data 12, # value starts 12 bytes after beginning of element False, # is Implicit VR True, # is Little Endian True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True, defer_size=16 ) assert expected == next(de_gen) assert 48 == infile.tell() def testExplVRLittleEndianEncapsulatedUndefLengthBadDelimiterLength(self): """Raw read: Expl VR Little Endian encapsulated pixel data with undefined length and a bad (non-zero) sequence delimiter length...""" hexstr = ( "e0 7f 10 00" # (7FE0,0010) Pixel Data "4f 42 00 00" # VR OB, 2 bytes reserved "ff ff ff ff" # -1 undefined length "fe ff 00 e0" # (FFFE,E000) Item Tag "10 00 00 00" # Item (dataset) Length "41 42 43 44" "45 46 47 48" "49 4a 4b 4c" "4d 4e 4f 50" "fe ff dd e0" # (fffe, edd) Sequence Delimiter "12 13 14 15" # bad non-0 required Item Length Field ) infile = BytesIO(hex2bytes(hexstr)) expected = ( (0x7FE0, 0x10), "OB", 0xFFFFFFFF, # declared value length b"\xfe\xff\x00\xe0\x10\x00\x00\x00ABCDEFGHIJKLMNOP", 12, # value starts 12 bytes after beginning of element False, # is Implicit VR True, # is Little Endian True, False, # is buffered ) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=True ) assert expected == next(de_gen) assert 44 == infile.tell() class TestRawSequence: # See DICOM standard PS3.5-2008 section 7.5 for sequence syntax def testEmptyItem(self): """Read sequence with a single empty item...""" # This is fix for issue 27 hexstr = ( "08 00 32 10" # (0008,1032) SQ "Procedure Code Sequence" " 08 00 00 00" # length 8 " fe ff 00 e0" # (FFFE,E000) Item Tag " 00 00 00 00" # length = 0 ) + ( # --------------- end of Sequence " 08 00 3e 10" # (0008,103E) LO "Series Description" nopep8 " 0c 00 00 00" # length nopep8 " 52 20 41 44 44 20 56 49 45 57 53 20" # value nopep8 ) # "\x08\x00\x32\x10\x08\x00\x00\x00\xfe\xff\x00\xe0\x00\x00\x00\x00" # from issue 27, procedure code sequence (0008,1032) # hexstr += "\x08\x00\x3e\x10\x0c\x00\x00\x00\x52\x20 # \x41\x44\x44\x20\x56\x49\x45\x57\x53\x20" # data element following fp = BytesIO(hex2bytes(hexstr)) gen = data_element_generator(fp, is_implicit_VR=True, is_little_endian=True) raw_seq = next(gen) seq = convert_value("SQ", raw_seq) assert isinstance(seq, Sequence) assert 1 == len(seq) assert 0 == len(seq[0]) elem2 = next(gen) assert 0x0008103E == elem2.tag def testImplVRLittleEndian_ExplicitLengthSeq(self): """Raw read: ImplVR Little Endian SQ with explicit lengths...""" # Create a fictional sequence with bytes directly, # similar to PS 3.5-2008 Table 7.5-1 p42 hexstr = ( "0a 30 B0 00" # (300A,00B0) Beam Sequence " 40 00 00 00" # length " fe ff 00 e0" # (FFFE,E000) Item Tag " 18 00 00 00" # Item (dataset) Length " 0a 30 c0 00" # (300A,00C0) Beam Number " 02 00 00 00" # length " 31 20" # value '1 ' " 0a 30 c2 00" # (300A,00C2) Beam Name " 06 00 00 00" # length " 42 65 61 6d 20 31" # value 'Beam 1' # ------------- " fe ff 00 e0" # (FFFE,E000) Item Tag " 18 00 00 00" # Item (dataset) Length " 0a 30 c0 00" # (300A,00C0) Beam Number " 02 00 00 00" # length " 32 20" # value '2 ' " 0a 30 c2 00" # (300A,00C2) Beam Name " 06 00 00 00" # length " 42 65 61 6d 20 32" # value 'Beam 2' ) infile = BytesIO(hex2bytes(hexstr)) de_gen = data_element_generator( infile, is_implicit_VR=True, is_little_endian=True ) raw_seq = next(de_gen) seq = convert_value("SQ", raw_seq) # The sequence is parsed, but only into raw data elements. # They will be converted when asked for. Check some: assert 1 == seq[0].BeamNumber assert "Beam 2" == seq[1].BeamName def testImplVRBigEndian_ExplicitLengthSeq(self): """Raw read: ImplVR BigEndian SQ with explicit lengths...""" # Create a fictional sequence with bytes directly, # similar to PS 3.5-2008 Table 7.5-1 p42 hexstr = ( "30 0a 00 B0" # (300A,00B0) Beam Sequence " 00 00 00 40" # length " ff fe e0 00" # (FFFE,E000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A,00C0) Beam Number " 00 00 00 02" # length " 31 20" # value '1 ' " 30 0a 00 c2" # (300A,00C2) Beam Name " 00 00 00 06" # length " 42 65 61 6d 20 31" # value 'Beam 1' # ------------- " ff fe e0 00" # (FFFE,E000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A,00C0) Beam Number " 00 00 00 02" # length " 32 20" # value '2 ' " 30 0a 00 c2" # (300A,00C2) Beam Name " 00 00 00 06" # length " 42 65 61 6d 20 32" # value 'Beam 2' ) infile = BytesIO(hex2bytes(hexstr)) de_gen = data_element_generator( infile, is_implicit_VR=True, is_little_endian=False ) raw_seq = next(de_gen) seq = convert_value("SQ", raw_seq) # The sequence is parsed, but only into raw data elements. # They will be converted when asked for. Check some: assert 1 == seq[0].BeamNumber assert "Beam 2" == seq[1].BeamName def testExplVRBigEndian_UndefinedLengthSeq(self): """Raw read: ExplVR BigEndian Undefined Length SQ...""" # Create a fictional sequence with bytes directly, # similar to PS 3.5-2008 Table 7.5-2 p42 hexstr = ( "30 0a 00 B0" # (300A,00B0) Beam Sequence " 53 51" # SQ " 00 00" # reserved " ff ff ff ff" # undefined length " ff fe e0 00" # (FFFE,E000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A,00C0) Beam Number " 49 53" # IS " 00 02" # length " 31 20" # value '1 ' " 30 0a 00 c2" # (300A,00C2) Beam Name " 4c 4F" # LO " 00 06" # length " 42 65 61 6d 20 31" # value 'Beam 1' # ------------- " ff fe e0 00" # (FFFE,E000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A,00C0) Beam Number " 49 53" # IS " 00 02" # length " 32 20" # value '2 ' " 30 0a 00 c2" # (300A,00C2) Beam Name " 4C 4F" # LO " 00 06" # length " 42 65 61 6d 20 32" # value 'Beam 2' " ff fe E0 dd" # SQ delimiter " 00 00 00 00" # zero length ) infile = BytesIO(hex2bytes(hexstr)) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=False ) seq = next(de_gen) # Note seq itself is not a raw data element. # The parser does parse undefined length SQ # The sequence is parsed, but only into raw data elements. # They will be converted when asked for. Check some: assert 1 == seq[0].BeamNumber assert "Beam 2" == seq[1].BeamName def test_explVR_switch_implVR_in_SQ_item(self): """Raw read: Tolerate missing VR in Sequence item""" # issue 1305 hexstr = ( "30 0a 00 B0" # (300A,00B0) Beam Sequence " 53 51" # SQ " 00 00" # reserved " FF FF FF FF" # undefined length " ff fe e0 00" # (FFFE,E000) Item Tag " 00 00 00 12" # Item (dataset) Length - 18 bytes " 00 10 00 20 00 00 00 0a" # (0010,0020) IMPL VR with length 0a " 34 34 34 34 34 34 34 34 34 34" " ff fe E0 dd" # SQ delimiter " 00 00 00 00" # zero length ) infile = BytesIO(hex2bytes(hexstr)) de_gen = data_element_generator( infile, is_implicit_VR=False, is_little_endian=False ) seq = next(de_gen) assert seq[0].PatientID == "4444444444" pydicom-pydicom-20aa4b7/tests/test_rle_pixel_data.py000066400000000000000000001342641515706620200227670ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for the pixel_data_handlers.rle_handler module. There are the following possibilities: * numpy is not available and * the RLE handler is not available * the RLE handler is available * numpy is available and * The RLE handler is not available * The RLE handler is available **Supported transfer syntaxes** * 1.2.840.10008.1.2.5 : RLE Lossless **Elements affecting the handler** * PixelRepresentation (0, 1) * BitsAllocated (1, 8, 16, 32, ...) * SamplesPerPixel (1, 2, 3, ...) * NumberOfFrames (1, 2, ...) """ from io import BytesIO from struct import pack, unpack import pytest from pydicom import dcmread import pydicom.config from pydicom.data import get_testdata_file from pydicom.encaps import get_frame, generate_frames, encapsulate from pydicom.uid import RLELossless, AllTransferSyntaxes, ExplicitVRLittleEndian try: import numpy as np from pydicom.pixel_data_handlers import numpy_handler as NP_HANDLER from pydicom.pixels.utils import reshape_pixel_array HAVE_NP = NP_HANDLER.HAVE_NP except ImportError: NP_HANDLER = None HAVE_NP = False try: from pydicom.pixel_data_handlers import rle_handler as RLE_HANDLER from pydicom.pixel_data_handlers.rle_handler import ( get_pixeldata, _rle_decode_frame, _rle_decode_segment, _parse_rle_header, ) HAVE_RLE = RLE_HANDLER.HAVE_RLE except ImportError: HAVE_RLE = False RLE_HANDLER = None # Paths to the test datasets # EXPL: Explicit VR Little Endian # RLE: RLE Lossless # 8/8-bit, 1 sample/pixel, 1 frame EXPL_8_1_1F = get_testdata_file("OBXXXX1A.dcm") RLE_8_1_1F = get_testdata_file("OBXXXX1A_rle.dcm") # 8/8-bit, 1 sample/pixel, 2 frame EXPL_8_1_2F = get_testdata_file("OBXXXX1A_2frame.dcm") RLE_8_1_2F = get_testdata_file("OBXXXX1A_rle_2frame.dcm") # 8/8-bit, 3 sample/pixel, 1 frame EXPL_8_3_1F = get_testdata_file("SC_rgb.dcm") RLE_8_3_1F = get_testdata_file("SC_rgb_rle.dcm") # 8/8-bit, 3 sample/pixel, 2 frame EXPL_8_3_2F = get_testdata_file("SC_rgb_2frame.dcm") RLE_8_3_2F = get_testdata_file("SC_rgb_rle_2frame.dcm") # 16/16-bit, 1 sample/pixel, 1 frame EXPL_16_1_1F = get_testdata_file("MR_small.dcm") RLE_16_1_1F = get_testdata_file("MR_small_RLE.dcm") # 16/12-bit, 1 sample/pixel, 10 frame EXPL_16_1_10F = get_testdata_file("emri_small.dcm") RLE_16_1_10F = get_testdata_file("emri_small_RLE.dcm") # 16/16-bit, 3 sample/pixel, 1 frame EXPL_16_3_1F = get_testdata_file("SC_rgb_16bit.dcm") RLE_16_3_1F = get_testdata_file("SC_rgb_rle_16bit.dcm") # 16/16-bit, 3 sample/pixel, 2 frame EXPL_16_3_2F = get_testdata_file("SC_rgb_16bit_2frame.dcm") RLE_16_3_2F = get_testdata_file("SC_rgb_rle_16bit_2frame.dcm") # 32/32-bit, 1 sample/pixel, 1 frame EXPL_32_1_1F = get_testdata_file("rtdose_1frame.dcm") RLE_32_1_1F = get_testdata_file("rtdose_rle_1frame.dcm") # 32/32-bit, 1 sample/pixel, 15 frame EXPL_32_1_15F = get_testdata_file("rtdose.dcm") RLE_32_1_15F = get_testdata_file("rtdose_rle.dcm") # 32/32-bit, 3 sample/pixel, 1 frame EXPL_32_3_1F = get_testdata_file("SC_rgb_32bit.dcm") RLE_32_3_1F = get_testdata_file("SC_rgb_rle_32bit.dcm") # 32/32-bit, 3 sample/pixel, 2 frame EXPL_32_3_2F = get_testdata_file("SC_rgb_32bit_2frame.dcm") RLE_32_3_2F = get_testdata_file("SC_rgb_rle_32bit_2frame.dcm") # Transfer syntaxes supported by other handlers # Implicit VR Little Endian IMPL = get_testdata_file("rtdose_1frame.dcm") # Deflated Explicit VR Little Endian DELF = get_testdata_file("image_dfl.dcm") # Explicit VR Big Endian EXPB = get_testdata_file("SC_rgb_expb_2frame.dcm") # JPEG Baseline (Process 1) JPEG_BASELINE_1 = get_testdata_file("SC_rgb_jpeg_dcmtk.dcm") # JPEG Baseline (Process 2 and 4) JPEG_EXTENDED_2 = get_testdata_file("JPEG-lossy.dcm") # JPEG Lossless (Process 14) JPEG_LOSSLESS_14 = None # JPEG Lossless (Process 14, Selection Value 1) JPEG_LOSSLESS_14_1 = get_testdata_file("SC_rgb_jpeg_gdcm.dcm") # JPEG-LS Lossless JPEG_LS_LOSSLESS = get_testdata_file("MR_small_jpeg_ls_lossless.dcm") # JPEG-LS Lossy JPEG_LS_LOSSY = None # JPEG2k Lossless JPEG_2K_LOSSLESS = get_testdata_file("emri_small_jpeg_2k_lossless.dcm") # JPEG2k JPEG_2K = get_testdata_file("JPEG2000.dcm") # RLE Lossless RLE = get_testdata_file("MR_small_RLE.dcm") # Transfer Syntaxes (non-retired + Explicit VR Big Endian) SUPPORTED_SYNTAXES = [RLELossless] UNSUPPORTED_SYNTAXES = list(set(AllTransferSyntaxes) ^ set(SUPPORTED_SYNTAXES)) def test_unsupported_syntaxes(): """Test that UNSUPPORTED_SYNTAXES is as expected.""" assert RLELossless not in UNSUPPORTED_SYNTAXES def _get_pixel_array(fpath): """Return the pixel data as a numpy ndarray. Only suitable for transfer syntaxes supported by the numpy pixel data handler. Parameters ---------- fpath : str Path to the dataset containing the Pixel Data. Returns ------- numpy.ndarray """ if not HAVE_NP: raise RuntimeError("Function only usable if the numpy handler is available") original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [NP_HANDLER] ds = dcmread(fpath) ds.pixel_array_options(use_v2_backend=True) arr = ds.pixel_array pydicom.config.pixel_data_handlers = original_handlers return arr REFERENCE_DATA_UNSUPPORTED = [ (IMPL, ("1.2.840.10008.1.2", "Lastname^Firstname")), (EXPL_8_3_1F, ("1.2.840.10008.1.2.1", "Lestrade^G")), (DELF, ("1.2.840.10008.1.2.1.99", "^^^^")), (EXPB, ("1.2.840.10008.1.2.2", "Lestrade^G")), (JPEG_BASELINE_1, ("1.2.840.10008.1.2.4.50", "Lestrade^G")), (JPEG_EXTENDED_2, ("1.2.840.10008.1.2.4.51", "CompressedSamples^NM1")), # (JPEG_LOSSLESS_14, ('1.2.840.10008.1.2.4.57')), # No dataset available (JPEG_LOSSLESS_14_1, ("1.2.840.10008.1.2.4.70", "Lestrade^G")), (JPEG_LS_LOSSLESS, ("1.2.840.10008.1.2.4.80", "CompressedSamples^MR1")), # (JPEG_LS_LOSSY, ('1.2.840.10008.1.2.4.81')), # No dataset available (JPEG_2K_LOSSLESS, ("1.2.840.10008.1.2.4.90", "")), (JPEG_2K, ("1.2.840.10008.1.2.4.91", "CompressedSamples^NM1")), ] # Numpy and the RLE handler are unavailable @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") class TestNoNumpy_NoRLEHandler: """Tests for handling datasets without numpy and the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert not HAVE_NP # The RLE handler should still be available assert RLE_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in an RLE dataset.""" ds = dcmread(RLE_16_1_1F) assert ds.PatientName == "CompressedSamples^MR1" assert len(ds.PixelData) == 6128 @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.PatientName == data[1] def test_pixel_array_raises(self): """Test pixel_array raises exception for all syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"Unable to decode pixel data with a transfer syntax UID of " rf"'{uid}'" ) with pytest.raises(NotImplementedError, match=exc_msg): ds.pixel_array # Numpy unavailable and the RLE handler is available @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") class TestNoNumpy_RLEHandler: """Tests for handling datasets without numpy and the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [RLE_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert not HAVE_NP # The RLE handler should still be available assert RLE_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in an RLE dataset.""" ds = dcmread(RLE_16_1_1F) assert ds.PatientName == "CompressedSamples^MR1" assert len(ds.PixelData) == 6128 @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.PatientName == data[1] def test_unsupported_pixel_array_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"Unable to decode pixel data with a transfer syntax UID of " rf"'{uid}'" ) with pytest.raises(RuntimeError, match=exc_msg): ds.pixel_array def test_supported_pixel_array_raises(self): """Test pixel_array raises exception for supported syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in SUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"The following handlers are available to decode the pixel " r"data however they are missing required dependencies: " r"RLE Lossless \(req. NumPy\)" ) with pytest.raises(RuntimeError, match=exc_msg): ds.pixel_array # Numpy is available, the RLE handler is unavailable @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_NoRLEHandler: """Tests for handling datasets with no handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP # The RLE handler should still be available assert RLE_HANDLER is not None def test_can_access_supported_dataset(self): """Test that we can read and access elements in an RLE dataset.""" ds = dcmread(RLE_16_1_1F) assert ds.PatientName == "CompressedSamples^MR1" assert len(ds.PixelData) == 6128 @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert data[0] == ds.file_meta.TransferSyntaxUID assert data[1] == ds.PatientName def test_pixel_array_raises(self): """Test pixel_array raises exception for all syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in AllTransferSyntaxes: ds.file_meta.TransferSyntaxUID = uid exc_msg = ( r"Unable to decode pixel data with a transfer syntax UID of " rf"'{uid}'" ) with pytest.raises(NotImplementedError, match=exc_msg): ds.pixel_array # Numpy and the RLE handler are available @pytest.mark.skipif(not HAVE_NP, reason="Numpy is not available") class TestNumpy_RLEHandler: """Tests for handling datasets with the handler.""" def setup_method(self): """Setup the environment.""" self.original_handlers = pydicom.config.pixel_data_handlers pydicom.config.pixel_data_handlers = [RLE_HANDLER] def teardown_method(self): """Restore the environment.""" pydicom.config.pixel_data_handlers = self.original_handlers def test_environment(self): """Check that the testing environment is as expected.""" assert HAVE_NP assert RLE_HANDLER is not None def test_unsupported_syntax_raises(self): """Test pixel_array raises exception for unsupported syntaxes.""" ds = dcmread(EXPL_16_1_1F) ds.pixel_array_options(use_v2_backend=True) for uid in UNSUPPORTED_SYNTAXES: ds.file_meta.TransferSyntaxUID = uid msg = ( r"Unable to decode pixel data with a transfer syntax UID of " rf"'{uid}'" ) with pytest.raises(NotImplementedError, match=msg): ds.pixel_array if not uid.is_compressed: continue with pytest.raises(NotImplementedError, match=msg): ds.decompress(handler_name="rle") @pytest.mark.parametrize("fpath,data", REFERENCE_DATA_UNSUPPORTED) def test_can_access_unsupported_dataset(self, fpath, data): """Test can read and access elements in unsupported datasets.""" ds = dcmread(fpath) assert ds.file_meta.TransferSyntaxUID == data[0] assert ds.PatientName == data[1] assert len(ds.PixelData) def test_pixel_array_signed(self): """Test pixel_array for unsigned -> signed data.""" ds = dcmread(RLE_8_1_1F) ds.pixel_array_options(use_v2_backend=True) # 0 is unsigned int, 1 is 2's complement assert ds.PixelRepresentation == 0 ds.PixelRepresentation = 1 ref = _get_pixel_array(EXPL_8_1_1F) arr = ds.pixel_array assert not np.array_equal(arr, ref) assert arr.shape == (600, 800) assert arr[0].max() == arr[0].min() == -12 assert tuple(arr[300, 491:494]) == (1, -10, 1) assert arr[-1].min() == arr[-1].max() == 0 def test_pixel_array_1bit_raises(self): """Test pixel_array for 1-bit raises exception.""" ds = dcmread(RLE_8_3_1F) ds.pixel_array_options(use_v2_backend=True) ds.BitsAllocated = 1 msg = r"Bits Allocated' value of 1" with pytest.raises(NotImplementedError, match=msg): ds.pixel_array def test_pixel_array_8bit_1sample_1f(self): """Test pixel_array for 8-bit, 1 sample/pixel, 1 frame.""" ds = dcmread(RLE_8_1_1F) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 1 assert ds.PixelRepresentation == 0 assert "NumberOfFrames" not in ds ref = _get_pixel_array(EXPL_8_1_1F) arr = ds.pixel_array assert arr.flags.writeable assert np.array_equal(arr, ref) assert arr.shape == (600, 800) assert arr[0].min() == arr[0].max() == 244 assert tuple(arr[300, 491:494]) == (1, 246, 1) assert arr[-1].min() == arr[-1].max() == 0 def test_decompress_with_handler(self): """Test that decompress works with the correct handler.""" ds = dcmread(RLE_8_1_1F) ds.pixel_array_options(use_v2_backend=True) msg = r"'zip' is not a known handler name" with pytest.raises(ValueError, match=msg): ds.decompress(handler_name="zip") with pytest.raises(NotImplementedError, match="Unable to decode*"): ds.decompress(handler_name="numpy") ds.decompress(handler_name="rle") pydicom.config.pixel_data_handlers.append(NP_HANDLER) assert hasattr(ds, "_pixel_array") arr = ds.pixel_array assert arr.shape == (600, 800) assert arr[0].min() == arr[0].max() == 244 assert tuple(arr[300, 491:494]) == (1, 246, 1) assert arr[-1].min() == arr[-1].max() == 0 def test_pixel_array_8bit_1sample_2f(self): """Test pixel_array for 8-bit, 1 sample/pixel, 2 frame.""" ds = dcmread(RLE_8_1_2F) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 1 assert ds.NumberOfFrames == 2 assert ds.PixelRepresentation == 0 ref = _get_pixel_array(EXPL_8_1_2F) arr = ds.pixel_array assert arr.flags.writeable assert np.array_equal(arr, ref) assert arr.shape == (2, 600, 800) assert 244 == arr[0, 0].min() == arr[0, 0].max() == 244 assert tuple(arr[0, 300, 491:494]) == (1, 246, 1) assert arr[0, -1].min() == arr[0, -1].max() == 0 # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) def test_pixel_array_8bit_3sample_1f(self): """Test pixel_array for 8-bit, 3 sample/pixel, 1 frame.""" ds = dcmread(RLE_8_3_1F) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 3 assert ds.PixelRepresentation == 0 assert "NumberOfFrames" not in ds ref = _get_pixel_array(EXPL_8_3_1F) arr = ds.pixel_array assert arr.flags.writeable assert np.array_equal(arr, ref) assert tuple(arr[5, 50, :]) == (255, 0, 0) assert tuple(arr[15, 50, :]) == (255, 128, 128) assert tuple(arr[25, 50, :]) == (0, 255, 0) assert tuple(arr[35, 50, :]) == (128, 255, 128) assert tuple(arr[45, 50, :]) == (0, 0, 255) assert tuple(arr[55, 50, :]) == (128, 128, 255) assert tuple(arr[65, 50, :]) == (0, 0, 0) assert tuple(arr[75, 50, :]) == (64, 64, 64) assert tuple(arr[85, 50, :]) == (192, 192, 192) assert tuple(arr[95, 50, :]) == (255, 255, 255) def test_pixel_array_8bit_3sample_2f(self): """Test pixel_array for 8-bit, 3 sample/pixel, 2 frame.""" ds = dcmread(RLE_8_3_2F) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds.BitsAllocated == 8 assert ds.SamplesPerPixel == 3 assert ds.NumberOfFrames == 2 assert ds.PixelRepresentation == 0 ref = _get_pixel_array(EXPL_8_3_2F) arr = ds.pixel_array assert arr.flags.writeable assert np.array_equal(arr, ref) # Frame 1 frame = arr[0] assert tuple(frame[5, 50, :]) == (255, 0, 0) assert tuple(frame[15, 50, :]) == (255, 128, 128) assert tuple(frame[25, 50, :]) == (0, 255, 0) assert tuple(frame[35, 50, :]) == (128, 255, 128) assert tuple(frame[45, 50, :]) == (0, 0, 255) assert tuple(frame[55, 50, :]) == (128, 128, 255) assert tuple(frame[65, 50, :]) == (0, 0, 0) assert tuple(frame[75, 50, :]) == (64, 64, 64) assert tuple(frame[85, 50, :]) == (192, 192, 192) assert tuple(frame[95, 50, :]) == (255, 255, 255) # Frame 2 is frame 1 inverted assert np.array_equal((2**ds.BitsAllocated - 1) - arr[1], arr[0]) def test_pixel_array_16bit_1sample_1f(self): """Test pixel_array for 16-bit, 1 sample/pixel, 1 frame.""" ds = dcmread(RLE_16_1_1F) ds.pixel_array_options(use_v2_backend=True) assert ds.file_meta.TransferSyntaxUID == RLELossless assert ds.BitsAllocated == 16 assert ds.SamplesPerPixel == 1 assert "NumberOfFrames" not in ds assert ds.PixelRepresentation == 1 ref = _get_pixel_array(EXPL_16_1_1F) arr = ds.pixel_array assert arr.flags.writeable assert arr.dtype == "= 0 and n < 127: read next (n + 1) bytes literally elif n <= -1 and n >= -127: copy the next byte (-n + 1) times elif n = -128: do nothing Using uint8 (as in handler) --------------------------- if n < 128 read next (n + 1) bytes literally elif n > 128 copy the next byte (256 - n + 1) times elif n == 128 do nothing References ---------- DICOM Standard, Part 5, Annex G.3.2 """ def test_noop(self): """Test no-operation output.""" # For n == 128, do nothing # data is only noop, 0x80 = 128 data = b"\x80\x80\x80" assert bytes(_rle_decode_segment(data)) == b"" # noop at start, data after data = ( b"\x80\x80" # No operation b"\x05\x01\x02\x03\x04\x05\x06" # Literal b"\xFE\x01" # Copy b"\x80" ) assert bytes(_rle_decode_segment(data)) == ( b"\x01\x02\x03\x04\x05\x06\x01\x01\x01" ) # data at start, noop middle, data at end data = ( b"\x05\x01\x02\x03\x04\x05\x06" # Literal b"\x80" # No operation b"\xFE\x01" # Copy b"\x80" ) assert bytes(_rle_decode_segment(data)) == ( b"\x01\x02\x03\x04\x05\x06\x01\x01\x01" ) # data at start, noop end # Copy 6 bytes literally, then 3 x 0x01 data = b"\x05\x01\x02\x03\x04\x05\x06\xFE\x01\x80" assert bytes(_rle_decode_segment(data)) == ( b"\x01\x02\x03\x04\x05\x06\x01\x01\x01" ) def test_literal(self): """Test literal output.""" # For n < 128, read the next (n + 1) bytes literally # n = 0 (0x80 is 128 -> no operation) data = b"\x00\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02" # n = 1 data = b"\x01\x02\x03\x80" assert bytes(_rle_decode_segment(data)) == b"\x02\x03" # n = 127 data = b"\x7f" + b"\x40" * 128 + b"\x80" assert bytes(_rle_decode_segment(data)) == b"\x40" * 128 def test_copy(self): """Test copy output.""" # For n > 128, copy the next byte (257 - n) times # n = 255, copy x2 (0x80 is 128 -> no operation) data = b"\xFF\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02\x02" # n = 254, copy x3 data = b"\xFE\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02\x02\x02" # n = 129, copy x128 data = b"\x81\x02\x80" assert bytes(_rle_decode_segment(data)) == b"\x02" * 128 pydicom-pydicom-20aa4b7/tests/test_sequence.py000066400000000000000000000120031515706620200216050ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.sequence module.""" import copy import pytest from pydicom.dataset import Dataset from pydicom.sequence import Sequence class TestSequence: def testDefaultInitialization(self): """Sequence: Ensure a valid Sequence is created""" empty = Sequence() assert 0 == len(empty) def testValidInitialization(self): """Sequence: Ensure valid creation of Sequences using Dataset inputs""" inputs = { "PatientPosition": "HFS", "PatientSetupNumber": "1", "SetupTechniqueDescription": "", } patientSetups = Dataset() patientSetups.update(inputs) # Construct the sequence seq = Sequence((patientSetups,)) assert isinstance(seq[0], Dataset) def testInvalidInitialization(self): """Sequence: Raise error if inputs are not iterables or Datasets""" # Error on construction with single Dataset with pytest.raises(TypeError): Sequence(Dataset()) # Test for non-iterable with pytest.raises(TypeError): Sequence(1) # Test for invalid iterable contents with pytest.raises(TypeError): Sequence([1, 2]) def testInvalidAssignment(self): """Sequence: validate exception for invalid assignment""" seq = Sequence( [ Dataset(), ] ) # Attempt to assign an integer to the first element with pytest.raises(TypeError): seq.__setitem__(0, 1) def testValidAssignment(self): """Sequence: ensure ability to assign a Dataset to a Sequence item""" ds = Dataset() ds.add_new((1, 1), "IS", 1) # Create a single element Sequence first seq = Sequence( [ Dataset(), ] ) seq[0] = ds assert ds == seq[0] def test_str(self): """Test string output of the sequence""" ds = Dataset() ds.BeamSequence = [Dataset()] ds.BeamSequence[0].PatientName = "TEST" ds.BeamSequence[0].PatientID = "12345" out = str(ds.BeamSequence) assert "[(0010,0010) Patient's Name" in out assert "PN: 'TEST'" in out assert "(0010,0020) Patient ID" in out assert "LO: '12345']" in out def test_adding_datasets(self): """Tests for adding datasets to the Sequence""" ds_a = Dataset() ds_a.Rows = 1 ds_b = Dataset() ds_b.Rows = 2 ds_c = Dataset() ds_c.Rows = 3 ds_d = Dataset() ds_d.Rows = 4 ds_e = Dataset() ds_e.Rows = 5 parent = Dataset() parent.PatientName = "Parent" seq = Sequence() seq.append(ds_a) seq.append(ds_c) seq.insert(1, ds_b) assert 3 == len(seq) seq[1] = ds_e assert ds_e == seq[1] assert [ds_a, ds_e, ds_c] == seq seq[1:1] = [ds_d] assert [ds_a, ds_d, ds_e, ds_c] == seq seq[1:2] = [ds_c, ds_e] assert [ds_a, ds_c, ds_e, ds_e, ds_c] == seq msg = r"Can only assign an iterable of 'Dataset'" with pytest.raises(TypeError, match=msg): seq[1:1] = ds_d def test_extending(self): """Test Sequence.extend().""" ds_a = Dataset() ds_a.Rows = 1 ds_b = Dataset() ds_b.Rows = 2 ds_c = Dataset() ds_c.Rows = 3 ds_d = Dataset() ds_d.Rows = 4 ds_e = Dataset() ds_e.Rows = 5 parent = Dataset() parent.PatientName = "Parent" seq = Sequence() seq.extend([ds_a, ds_b, ds_c]) assert [ds_a, ds_b, ds_c] == seq msg = r"An iterable of 'Dataset' is required" with pytest.raises(TypeError, match=msg): seq.extend(ds_d) assert [ds_a, ds_b, ds_c] == seq seq.extend([ds_d, ds_e]) assert [ds_a, ds_b, ds_c, ds_d, ds_e] == seq def test_iadd(self): """Test Sequence() += [Dataset()].""" ds_a = Dataset() ds_a.Rows = 1 ds_b = Dataset() ds_b.Rows = 2 ds_c = Dataset() ds_c.Rows = 3 ds_d = Dataset() ds_d.Rows = 4 ds_e = Dataset() ds_e.Rows = 5 parent = Dataset() parent.PatientName = "Parent" seq = Sequence() seq += [ds_a, ds_b, ds_c] assert [ds_a, ds_b, ds_c] == seq msg = r"An iterable of 'Dataset' is required" with pytest.raises(TypeError, match=msg): seq += ds_d assert [ds_a, ds_b, ds_c] == seq seq += [ds_d, ds_e] assert [ds_a, ds_b, ds_c, ds_d, ds_e] == seq def test_deepcopy_sequence_subclass(self): """Regression test for #1813.""" class MySequenceSubclass(Sequence): pass my_sequence_subclass = MySequenceSubclass() seq2 = copy.deepcopy(my_sequence_subclass) assert seq2.__class__ is MySequenceSubclass pydicom-pydicom-20aa4b7/tests/test_tag.py000066400000000000000000000375501515706620200205660ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for the pydicom.tag module.""" import pytest from pydicom.tag import BaseTag, Tag, TupleTag, tag_in_exception class TestBaseTag: """Test the BaseTag class.""" def test_le_same_class(self): """Test __le__ of two classes with same type.""" assert BaseTag(0x00000000) <= BaseTag(0x00000001) assert BaseTag(0x00000001) <= BaseTag(0x00000001) assert not BaseTag(0x00000001) <= BaseTag(0x00000000) def test_le_diff_class(self): """Test __le__ of two classes with different type.""" assert BaseTag(0x00000000) <= 1 assert BaseTag(0x00000001) <= 1 assert not BaseTag(0x00000001) <= 0 def test_le_subclass(self): """Test __le__ of two classes with one as a subclass.""" class BaseTagPlus(BaseTag): pass assert BaseTagPlus(0x00000000) <= BaseTag(0x00000001) assert BaseTagPlus(0x00000001) <= BaseTag(0x00000001) assert not BaseTagPlus(0x00000001) <= BaseTag(0x00000000) def test_le_tuple(self): """Test __le__ of tuple with BaseTag.""" assert BaseTag(0x00010001) <= (0x0001, 0x0002) assert BaseTag(0x00010002) <= (0x0001, 0x0002) assert not BaseTag(0x00010002) <= (0x0001, 0x0001) def test_le_raises(self): """Test __le__ raises TypeError when comparing to non numeric.""" def test_raise(): BaseTag(0x00010002) <= "Somethin" pytest.raises(TypeError, test_raise) def test_lt_same_class(self): """Test __lt__ of two classes with same type.""" assert BaseTag(0x00000000) < BaseTag(0x00000001) assert not BaseTag(0x00000001) < BaseTag(0x00000001) assert not BaseTag(0x00000001) < BaseTag(0x00000000) def test_lt_diff_class(self): """Test __lt__ of two classes with different type.""" assert BaseTag(0x00000000) < 1 assert not BaseTag(0x00000001) < 1 assert not BaseTag(0x00000001) < 0 def test_lt_subclass(self): """Test __lt__ of two classes with one as a subclass.""" class BaseTagPlus(BaseTag): pass assert BaseTagPlus(0x00000000) < BaseTag(0x00000001) assert not BaseTagPlus(0x00000001) < BaseTag(0x00000001) assert not BaseTagPlus(0x00000001) < BaseTag(0x00000000) def test_lt_tuple(self): """Test __lt__ of tuple with BaseTag.""" assert BaseTag(0x00010001) < (0x0001, 0x0002) assert not BaseTag(0x00010002) < (0x0001, 0x0002) assert not BaseTag(0x00010002) < (0x0001, 0x0001) def test_lt_raises(self): """Test __lt__ raises TypeError when comparing to non numeric.""" def test_raise(): BaseTag(0x00010002) < "Somethin" pytest.raises(TypeError, test_raise) def test_ge_same_class(self): """Test __ge__ of two classes with same type.""" assert not BaseTag(0x00000000) >= BaseTag(0x00000001) assert BaseTag(0x00000001) >= BaseTag(0x00000001) assert BaseTag(0x00000001) >= BaseTag(0x00000000) def test_ge_diff_class(self): """Test __ge__ of two classes with different type.""" assert not BaseTag(0x00000000) >= 1 assert BaseTag(0x00000001) >= 1 assert BaseTag(0x00000001) >= 0 def test_ge_subclass(self): """Test __ge__ of two classes with one as a subclass.""" class BaseTagPlus(BaseTag): pass assert not BaseTagPlus(0x00000000) >= BaseTag(0x00000001) assert BaseTagPlus(0x00000001) >= BaseTag(0x00000001) assert BaseTagPlus(0x00000001) >= BaseTag(0x00000000) def test_ge_tuple(self): """Test __ge__ of tuple with BaseTag.""" assert not BaseTag(0x00010001) >= (0x0001, 0x0002) assert BaseTag(0x00010002) >= (0x0001, 0x0002) assert BaseTag(0x00010002) >= (0x0001, 0x0001) def test_ge_raises(self): """Test __ge__ raises TypeError when comparing to non numeric.""" def test_raise(): BaseTag(0x00010002) >= "AGHIJJJJ" pytest.raises(TypeError, test_raise) def test_gt_same_class(self): """Test __gt__ of two classes with same type.""" assert not BaseTag(0x00000000) > BaseTag(0x00000001) assert not BaseTag(0x00000001) > BaseTag(0x00000001) assert BaseTag(0x00000001) > BaseTag(0x00000000) def test_gt_diff_class(self): """Test __gt__ of two classes with different type.""" assert not BaseTag(0x00000000) > 1 assert not BaseTag(0x00000001) > 1 assert BaseTag(0x00000001) > 0 def test_gt_subclass(self): """Test __gt__ of two classes with one as a subclass.""" class BaseTagPlus(BaseTag): pass assert not BaseTagPlus(0x00000000) > BaseTag(0x00000001) assert not BaseTagPlus(0x00000001) > BaseTag(0x00000001) assert BaseTagPlus(0x00000001) > BaseTag(0x00000000) def test_gt_tuple(self): """Test __gt__ of tuple with BaseTag.""" assert not BaseTag(0x00010001) > (0x0001, 0x0002) assert not BaseTag(0x00010002) > (0x0001, 0x0002) assert BaseTag(0x00010002) > (0x0001, 0x0001) def test_gt_raises(self): """Test __gt__ raises TypeError when comparing to non numeric.""" def test_raise(): BaseTag(0x00010002) > "BLUH" pytest.raises(TypeError, test_raise) def test_eq_same_class(self): """Test __eq__ of two classes with same type.""" assert BaseTag(0x00000000) == BaseTag(0x00000000) assert not BaseTag(0x00000001) == BaseTag(0x00000000) def test_eq_diff_class(self): """Test __eq__ of two classes with different type.""" # Make sure to test BaseTag.__eq__() not int.__eq__() assert BaseTag(0x00000000) == 0 assert not BaseTag(0x00000001) == 0 def test_eq_subclass(self): """Test __eq__ of two classes with one as a subclass.""" class BaseTagPlus(BaseTag): pass assert BaseTagPlus(0x00000000) == BaseTag(0x00000000) assert not BaseTagPlus(0x00000001) == BaseTag(0x00000000) def test_eq_tuple(self): """Test __eq__ of tuple with BaseTag.""" # Make sure to test BaseTag.__eq__() not tuple.__eq__() assert BaseTag(0x00010002) == (0x0001, 0x0002) assert not BaseTag(0x00010001) == (0x0001, 0x0002) def test_eq_non_numeric(self): """Test __eq__ of non numeric with BaseTag.""" assert not BaseTag(0x00010002) == "eraa" def test_ne_same_class(self): """Test __ne__ of two classes with same type.""" assert not BaseTag(0x00000000) != BaseTag(0x00000000) assert BaseTag(0x00000001) != BaseTag(0x00000000) def test_ne_diff_class(self): """Test __ne__ of two classes with different type.""" # Make sure to test BaseTag.__ne__() not int.__ne__() assert not BaseTag(0x00000000) != 0 assert BaseTag(0x00000001) != 0 def test_ne_subclass(self): """Test __ne__ of two classes with one as a subclass.""" class BaseTagPlus(BaseTag): pass assert not BaseTagPlus(0x00000000) != BaseTag(0x00000000) assert BaseTagPlus(0x00000001) != BaseTag(0x00000000) def test_ne_tuple(self): """Test __ne__ of tuple with BaseTag.""" # Make sure to test BaseTag.__ne__() not tuple.__ne__() assert not BaseTag(0x00010002) != (0x0001, 0x0002) assert BaseTag(0x00010001) != (0x0001, 0x0002) def test_ne_non_numeric(self): """Test __ne__ of non numeric with BaseTag.""" assert BaseTag(0x00010002) != "aaag" def test_hash(self): """Test hash of BaseTag class.""" assert hash(BaseTag(0x00010001)) == hash(BaseTag(0x00010001)) assert hash(BaseTag(0x00010001)) != hash(BaseTag(0x00010002)) assert hash(BaseTag(0x00020001)) != hash(BaseTag(0x00010002)) def test_str(self): """Test str(BaseTag) produces correct value.""" assert "(0000,0000)" == str(BaseTag(0x00000000)) assert "(0001,0002)" == str(BaseTag(0x00010002)) assert "(1000,2000)" == str(BaseTag(0x10002000)) assert "(FFFF,FFFE)" == str(BaseTag(0xFFFFFFFE)) def test_json_key(self): """Test BaseTag.json_key() produces correct value.""" assert "00000000" == BaseTag(0x00000000).json_key assert "00010002" == BaseTag(0x00010002).json_key assert "10002000" == BaseTag(0x10002000).json_key assert "FFFFFFFE" == BaseTag(0xFFFFFFFE).json_key def test_group(self): """Test BaseTag.group returns correct values.""" assert 0x0000 == BaseTag(0x00000001).group assert 0x0002 == BaseTag(0x00020001).group assert 0xFFFF == BaseTag(0xFFFF0001).group def test_element(self): """Test BaseTag.element returns correct values.""" assert 0x0000 == BaseTag(0x00010000).element assert 0x0002 == BaseTag(0x00010002).element assert 0xFFFF == BaseTag(0x0001FFFF).element def test_private(self): """Test BaseTag.is_private returns correct values.""" # Odd groups private assert BaseTag(0x00010001).is_private # Even groups not private assert not BaseTag(0x00020001).is_private # Group 0 not private assert not BaseTag(0x00000001).is_private def test_is_private_creator(self): """Test BaseTag.is_private_creator returns correct values.""" # Non-private tag assert not BaseTag(0x00080010).is_private_creator # private creator have element 0x0010 - 0x00FF assert not BaseTag(0x0009000F).is_private_creator assert BaseTag(0x00090010).is_private_creator assert BaseTag(0x000900FF).is_private_creator assert not BaseTag(0x00090100).is_private_creator def test_private_creator(self): assert BaseTag(0x00091000).private_creator == BaseTag(0x00090010) assert BaseTag(0x00292526).private_creator == BaseTag(0x00290025) class TestTag: """Test the Tag method.""" def test_tag_single_int(self): """Test creating a Tag from a single int.""" assert Tag(0x0000) == BaseTag(0x00000000) assert Tag(10) == BaseTag(0x0000000A) assert Tag(0xFFFF) == BaseTag(0x0000FFFF) assert Tag(0x00010002) == BaseTag(0x00010002) # Must be 32-bit pytest.raises(OverflowError, Tag, 0xFFFFFFFF1) # Must be positive pytest.raises(ValueError, Tag, -1) def test_tag_single_tuple(self): """Test creating a Tag from a single tuple.""" assert Tag((0x0000, 0x0000)) == BaseTag(0x00000000) assert Tag((0x22, 0xFF)) == BaseTag(0x002200FF) assert Tag((14, 0xF)) == BaseTag(0x000E000F) assert Tag((0x1000, 0x2000)) == BaseTag(0x10002000) assert Tag(("0x01", "0x02")) == BaseTag(0x00010002) # Must be 2 tuple pytest.raises(ValueError, Tag, (0x1000, 0x2000, 0x0030)) pytest.raises(ValueError, Tag, ("0x10", "0x20", "0x03")) # Must be 32-bit pytest.raises(OverflowError, Tag, (0xFFFF, 0xFFFF1)) pytest.raises(OverflowError, Tag, ("0xFFFF", "0xFFFF1")) # Must be positive pytest.raises(ValueError, Tag, (-1, 0)) pytest.raises(ValueError, Tag, (0, -1)) pytest.raises(ValueError, Tag, ("0x0", "-0x1")) pytest.raises(ValueError, Tag, ("-0x1", "0x0")) # Can't have second parameter msg = r"Unable to create an element tag from '\(\(1, 2\), 1\)'" with pytest.raises(TypeError, match=msg): Tag((0x01, 0x02), 0x01) pytest.raises(TypeError, Tag, (0x01, 0x02), "0x01") pytest.raises(TypeError, Tag, ("0x01", "0x02"), "0x01") pytest.raises(TypeError, Tag, ("0x01", "0x02"), 0x01) def test_tag_single_list(self): """Test creating a Tag from a single list.""" assert Tag([0x0000, 0x0000]) == BaseTag(0x00000000) assert Tag([0x99, 0xFE]) == BaseTag(0x009900FE) assert Tag([15, 0xE]) == BaseTag(0x000F000E) assert Tag([0x1000, 0x2000]) == BaseTag(0x10002000) assert Tag(["0x01", "0x02"]) == BaseTag(0x00010002) # Must be 2 list pytest.raises(ValueError, Tag, [0x1000, 0x2000, 0x0030]) pytest.raises(ValueError, Tag, ["0x10", "0x20", "0x03"]) pytest.raises(ValueError, Tag, [0x1000]) pytest.raises(ValueError, Tag, ["0x10"]) # Must be int or string msg = ( r"Unable to create an element tag from '\[1.0, 2.0\]': both " r"arguments must be the same type and str or int" ) with pytest.raises(TypeError, match=msg): Tag([1.0, 2.0]) # Must be 32-bit pytest.raises(OverflowError, Tag, [65536, 0]) pytest.raises(OverflowError, Tag, [0, 65536]) pytest.raises(OverflowError, Tag, ("0xFFFF", "0xFFFF1")) # Must be positive pytest.raises(ValueError, Tag, [-1, 0]) pytest.raises(ValueError, Tag, [0, -1]) pytest.raises(ValueError, Tag, ("0x0", "-0x1")) pytest.raises(ValueError, Tag, ("-0x1", "0x0")) # Can't have second parameter msg = r"Unable to create an element tag from '\(\[1, 2\], 1\)'" with pytest.raises(TypeError, match=msg): Tag([0x01, 0x02], 0x01) pytest.raises(TypeError, Tag, [0x01, 0x02], "0x01") pytest.raises(TypeError, Tag, ["0x01", "0x02"], "0x01") pytest.raises(TypeError, Tag, ["0x01", "0x02"], 0x01) def test_tag_single_str(self): """Test creating a Tag from a single str.""" assert Tag("0x10002000") == BaseTag(0x10002000) assert Tag("0x2000") == BaseTag(0x00002000) assert Tag("15") == BaseTag(0x00000015) assert Tag("0xF") == BaseTag(0x0000000F) assert Tag("PatientName") == BaseTag(0x00100010) # Must be 32-bit pytest.raises(OverflowError, Tag, "0xFFFFFFFF1") # Must be positive pytest.raises(ValueError, Tag, "-0x01") # Must be numeric str or DICOM keyword pytest.raises(ValueError, Tag, "hello") def test_tag_double_str(self): """Test creating a Tag from two str.""" assert Tag("0x1000", "0x2000") == BaseTag(0x10002000) assert Tag("0x10", "0x20") == BaseTag(0x00100020) assert Tag("15", "0") == BaseTag(0x00150000) assert Tag("0xF", "0") == BaseTag(0x000F0000) # Must be 32-bit pytest.raises(OverflowError, Tag, "0xFFFF1", "0") pytest.raises(OverflowError, Tag, "0", "0xFFFF1") # Must be positive pytest.raises(ValueError, Tag, "-0x01", "0") pytest.raises(ValueError, Tag, "0", "-0x01") pytest.raises(ValueError, Tag, "-1", "-0x01") # Must both be str pytest.raises(TypeError, Tag, "0x01", 0) pytest.raises(TypeError, Tag, 0, "0x01") def test_tag_double_int(self): """Test creating a Tag from a two ints.""" assert Tag(0x0000, 0x0000) == BaseTag(0x00000000) assert Tag(2, 0) == BaseTag(0x00020000) assert Tag(2, 0).elem == 0x0000 assert Tag(0x99, 0xFE) == BaseTag(0x009900FE) assert Tag(15, 14) == BaseTag(0x000F000E) assert Tag(0x1000, 0x2000) == BaseTag(0x10002000) # Must be 32-bit pytest.raises(OverflowError, Tag, 65536, 0) pytest.raises(OverflowError, Tag, 0, 65536) # Must be positive pytest.raises(ValueError, Tag, -1, 0) pytest.raises(ValueError, Tag, 0, -1) pytest.raises(ValueError, Tag, -65535, -1) class TestTupleTag: """Test the TupleTag method.""" def test_tuple_tag(self): """Test quick tag construction with TupleTag.""" assert TupleTag((0xFFFF, 0xFFEE)) == BaseTag(0xFFFFFFEE) class TestTagInException: """Test the tag_in_exception method.""" def test_raise_exception(self): """""" def test(): tag = Tag(0x00100010) with tag_in_exception(tag) as tag: raise ValueError("Test message.") pytest.raises(ValueError, test) pydicom-pydicom-20aa4b7/tests/test_uid.py000066400000000000000000000404161515706620200205670ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Test suite for uid.py""" import uuid import pytest from pydicom.uid import ( UID, generate_uid, register_transfer_syntax, PYDICOM_ROOT_UID, JPEGLSNearLossless, CTImageStorage, ) import pydicom.uid def test_storage_sopclass_uids(): assert CTImageStorage == pydicom.uid.CTImageStorage class TestGenerateUID: def test_generate_uid(self): """Test UID generator""" # Test standard UID generation with pydicom prefix uid = generate_uid() assert uid[:26] == PYDICOM_ROOT_UID assert len(uid) <= 64 # Test standard UID generation with no prefix uid = generate_uid(None) assert uid[:5] == "2.25." assert len(uid) <= 64 # Test invalid UID prefixes for invalid_prefix in ( ("1" * 54) + ".", "", ".", "1", "1.2", "1.2..3.", "1.a.2.", "1.01.1.", ): with pytest.raises(ValueError): generate_uid(prefix=invalid_prefix) # Test some valid prefixes and make sure they survive for valid_prefix in ( "0.", "1.", "1.23.", "1.0.23.", ("1" * 53) + ".", "1.2.3.444444.", ): uid = generate_uid(prefix=valid_prefix) assert uid[: len(valid_prefix)] == valid_prefix assert len(uid) <= 64 def test_entropy_src(self): """Test UID generator with default entropy sources""" # Should be different uid = generate_uid(entropy_srcs=None) assert uid != generate_uid(entropy_srcs=None) def test_entropy_src_custom(self): """Test UID generator with custom entropy sources""" # Should be identical uid = generate_uid(entropy_srcs=["lorem", "ipsum"]) rf = "1.2.826.0.1.3680043.8.498.87507166259346337659265156363895084463" assert uid == rf assert len(uid) == 64 def test_none(self): """Test generate_uid(None).""" uid = generate_uid(prefix=None) # Check prefix assert "2.25." == uid[:5] # Check UUID suffix as_uuid = uuid.UUID(int=int(uid[5:])) assert isinstance(as_uuid, uuid.UUID) assert as_uuid.version == 4 assert as_uuid.variant == uuid.RFC_4122 def test_none_iterate(self): """Test generate_uid(None) generates valid UIDs.""" # Generate random UIDs, if a bad method then should eventually fail for ii in range(10000): uid = generate_uid(None) assert uid.is_valid class TestUID: """Test DICOM UIDs""" def setup_method(self): """Set default UID""" self.uid = UID("1.2.840.10008.1.2") def test_equality(self): """Test that UID.__eq__ works.""" assert self.uid == UID("1.2.840.10008.1.2") assert self.uid == "1.2.840.10008.1.2" assert "1.2.840.10008.1.2" == self.uid assert not self.uid == "Implicit VR Little Endian" assert not "Implicit VR Little Endian" == self.uid assert not self.uid == UID("1.2.840.10008.1.2.1") assert not self.uid == "1.2.840.10008.1.2.1" assert not "1.2.840.10008.1.2.1" == self.uid # Issue 96 assert not self.uid == 3 assert self.uid is not None def test_inequality(self): """Test that UID.__ne__ works.""" assert not self.uid != UID("1.2.840.10008.1.2") assert not self.uid != "1.2.840.10008.1.2" assert not "1.2.840.10008.1.2" != self.uid assert self.uid != "Implicit VR Little Endian" assert "Implicit VR Little Endian" != self.uid assert self.uid != UID("1.2.840.10008.1.2.1") assert self.uid != "1.2.840.10008.1.2.1" assert "1.2.840.10008.1.2.1" != self.uid # Issue 96 assert self.uid != 3 def test_hash(self): """Test that UID.__hash_- works.""" assert hash(self.uid) == hash(self.uid) def test_str(self): """Test that UID.__str__ works.""" assert self.uid.__str__() == "1.2.840.10008.1.2" def test_is_implicit_vr(self): """Test that UID.is_implicit_VR works.""" # '1.2.840.10008.1.2' Implicit VR Little Endian # '1.2.840.10008.1.2.1' Explicit VR Little Endian # '1.2.840.10008.1.2.1.99' Deflated Explicit VR Little Endian # '1.2.840.10008.1.2.2' Explicit VR Big Endian # '1.2.840.10008.1.2.4.50'JPEG Baseline (Process 1) assert UID("1.2.840.10008.1.2").is_implicit_VR assert not UID("1.2.840.10008.1.2.1").is_implicit_VR assert not UID("1.2.840.10008.1.2.1.99").is_implicit_VR assert not UID("1.2.840.10008.1.2.2").is_implicit_VR assert not UID("1.2.840.10008.1.2.4.50").is_implicit_VR with pytest.raises(ValueError): UID("1.2.840.10008.5.1.4.1.1.2").is_implicit_VR def test_is_little_endian(self): """Test that UID.is_little_endian works.""" # '1.2.840.10008.1.2' Implicit VR Little Endian # '1.2.840.10008.1.2.1' Explicit VR Little Endian # '1.2.840.10008.1.2.1.99' Deflated Explicit VR Little Endian # '1.2.840.10008.1.2.2' Explicit VR Big Endian # '1.2.840.10008.1.2.4.50'JPEG Baseline (Process 1) assert UID("1.2.840.10008.1.2").is_little_endian assert UID("1.2.840.10008.1.2.1").is_little_endian assert UID("1.2.840.10008.1.2.1.99").is_little_endian assert not UID("1.2.840.10008.1.2.2").is_little_endian assert UID("1.2.840.10008.1.2.4.50").is_little_endian with pytest.raises(ValueError): UID("1.2.840.10008.5.1.4.1.1.2").is_little_endian def test_is_deflated(self): """Test that UID.is_deflated works.""" # '1.2.840.10008.1.2' Implicit VR Little Endian # '1.2.840.10008.1.2.1' Explicit VR Little Endian # '1.2.840.10008.1.2.1.99' Deflated Explicit VR Little Endian # '1.2.840.10008.1.2.2' Explicit VR Big Endian # '1.2.840.10008.1.2.4.50'JPEG Baseline (Process 1) assert not UID("1.2.840.10008.1.2").is_deflated assert not UID("1.2.840.10008.1.2.1").is_deflated assert UID("1.2.840.10008.1.2.1.99").is_deflated assert not UID("1.2.840.10008.1.2.2").is_deflated assert not UID("1.2.840.10008.1.2.4.50").is_deflated with pytest.raises(ValueError): UID("1.2.840.10008.5.1.4.1.1.2").is_deflated def test_is_transfer_syntax(self): """Test that UID.is_transfer_syntax works.""" # '1.2.840.10008.1.2' Implicit VR Little Endian # '1.2.840.10008.1.2.1' Explicit VR Little Endian # '1.2.840.10008.1.2.1.99' Deflated Explicit VR Little Endian # '1.2.840.10008.1.2.2' Explicit VR Big Endian # '1.2.840.10008.1.2.4.50'JPEG Baseline (Process 1) assert UID("1.2.840.10008.1.2").is_transfer_syntax assert UID("1.2.840.10008.1.2.1").is_transfer_syntax assert UID("1.2.840.10008.1.2.1.99").is_transfer_syntax assert UID("1.2.840.10008.1.2.2").is_transfer_syntax assert UID("1.2.840.10008.1.2.4.50").is_transfer_syntax assert not UID("1.2.840.10008.5.1.4.1.1.2").is_transfer_syntax def test_is_compressed(self): """Test that UID.is_compressed works.""" # '1.2.840.10008.1.2' Implicit VR Little Endian # '1.2.840.10008.1.2.1' Explicit VR Little Endian # '1.2.840.10008.1.2.1.99' Deflated Explicit VR Little Endian # '1.2.840.10008.1.2.2' Explicit VR Big Endian # '1.2.840.10008.1.2.4.50'JPEG Baseline (Process 1) assert not UID("1.2.840.10008.1.2").is_compressed assert not UID("1.2.840.10008.1.2.1").is_compressed assert not UID("1.2.840.10008.1.2.1.99").is_compressed assert not UID("1.2.840.10008.1.2.2").is_compressed assert UID("1.2.840.10008.1.2.4.50").is_compressed with pytest.raises(ValueError): UID("1.2.840.10008.5.1.4.1.1.2").is_compressed def test_is_encapsulated(self): """Test that UID.is_encapsulated works.""" # '1.2.840.10008.1.2' Implicit VR Little Endian # '1.2.840.10008.1.2.1' Explicit VR Little Endian # '1.2.840.10008.1.2.1.99' Deflated Explicit VR Little Endian # '1.2.840.10008.1.2.2' Explicit VR Big Endian # '1.2.840.10008.1.2.4.50'JPEG Baseline (Process 1) assert not UID("1.2.840.10008.1.2").is_encapsulated assert not UID("1.2.840.10008.1.2.1").is_encapsulated assert not UID("1.2.840.10008.1.2.1.99").is_encapsulated assert not UID("1.2.840.10008.1.2.2").is_encapsulated assert UID("1.2.840.10008.1.2.4.50").is_encapsulated with pytest.raises(ValueError): UID("1.2.840.10008.5.1.4.1.1.2").is_encapsulated def test_name(self): """Test that UID.name works.""" assert self.uid.name == "Implicit VR Little Endian" assert UID("1.2.840.10008.5.1.4.1.1.2").name == "CT Image Storage" def test_name_with_equal_hash(self): """Test that UID name works for UID with same hash as predefined UID.""" class MockedUID(UID): # Force the UID to return the same hash as one of the # uid dictionary entries (any will work). # The resulting hash collision forces the usage of the `eq` # operator while checking for containment in the uid dictionary # (regression test for issue #499) def __hash__(self): return hash(JPEGLSNearLossless) uid = MockedUID("1.2.3") assert uid.name == "1.2.3" def test_type(self): """Test that UID.type works.""" assert self.uid.type == "Transfer Syntax" assert UID("1.2.840.10008.5.1.4.1.1.2").type == "SOP Class" def test_info(self): """Test that UID.info works.""" assert self.uid.info == "Default Transfer Syntax for DICOM" assert UID("1.2.840.10008.5.1.4.1.1.2").info == "" def test_is_retired(self): """Test that UID.is_retired works.""" assert not self.uid.is_retired assert UID("1.2.840.10008.1.2.2").is_retired def test_is_valid(self, disable_value_validation): """Test that UID.is_valid works.""" for invalid_uid in ( "1" * 65, "1." + ("2" * 63), "", ".", "1.", "1.01", "1.a.2", ): assert not UID(invalid_uid).is_valid for valid_uid in ("0", "1", "0.1", "1" * 64, "1." + ("2" * 62), "1.0.23"): assert UID(valid_uid).is_valid def test_is_private(self): """Test the is_private property""" private_uid = UID("1.2.840.10009.1.2") assert private_uid.is_private assert not self.uid.is_private def test_raises(self): """Test raises exception if not a str type""" with pytest.raises(TypeError): UID(1234) def test_transitive(self): """Test for #256""" a = "1.2.840.10008.1.1" uid = UID(a) b = str(uid) assert uid.name == "Verification SOP Class" assert uid == a assert uid == b assert a == b def test_keyword(self): """Test the keyword property.""" assert "ImplicitVRLittleEndian" == self.uid.keyword class TestUIDPrivate: """Test private UIDs""" def setup_method(self): """Set default UID""" self.uid = UID("9.9.999.90009.1.2") def test_equality(self): """Test that UID.__eq__ works with private UIDs.""" assert self.uid == UID("9.9.999.90009.1.2") assert self.uid == "9.9.999.90009.1.2" assert not self.uid == UID("9.9.999.90009.1.3") assert not self.uid == "9.9.999.90009.1.3" def test_inequality(self): """Test that UID.__ne__ works with private UIDs.""" assert not self.uid != UID("9.9.999.90009.1.2") assert not self.uid != "9.9.999.90009.1.2" assert self.uid != UID("9.9.999.90009.1.3") assert self.uid != "9.9.999.90009.1.3" def test_hash(self): """Test that UID.__hash_- works with private UIDs.""" assert hash(self.uid) == hash(self.uid) def test_str(self): """Test that UID.__str__ works with private UIDs.""" assert self.uid.__str__() == "9.9.999.90009.1.2" def test_is_implicit_vr(self): """Test that UID.is_implicit_VR works with private UIDs.""" with pytest.raises(ValueError): self.uid.is_implicit_VR def test_is_little_endian(self): """Test that UID.is_little_endian works with private UIDs.""" with pytest.raises(ValueError): self.uid.is_little_endian def test_is_deflated(self): """Test that UID.is_deflated works with private UIDs.""" with pytest.raises(ValueError): self.uid.is_deflated def test_is_transfer_syntax(self): """Test that UID.is_transfer_syntax works with private UIDs.""" assert not self.uid.is_transfer_syntax def test_is_compressed(self): """Test that UID.is_compressed works with private UIDs.""" with pytest.raises(ValueError): self.uid.is_compressed def test_is_encapsulated(self): """Test that UID.is_encapsulated works with private UIDs.""" with pytest.raises(ValueError): self.uid.is_encapsulated def test_name(self): """Test that UID.name works with private UIDs.""" assert self.uid.name == "9.9.999.90009.1.2" def test_type(self): """Test that UID.type works with private UIDs.""" assert self.uid.type == "" def test_info(self): """Test that UID.info works with private UIDs.""" assert self.uid.info == "" def test_is_retired(self): """Test that UID.is_retired works with private UIDs.""" assert not self.uid.is_retired def test_is_valid(self): """Test that UID.is_valid works with private UIDs.""" assert self.uid.is_valid def test_is_private(self): """Test that UID.is_private works with private UIDs.""" assert self.uid.is_private def test_keyword(self): """Test the keyword property.""" assert "" == self.uid.keyword def test_private_encoding(self): """Test setting encoding via UID.set_private_encoding()""" self.uid.set_private_encoding(True, True) assert self.uid.is_transfer_syntax assert self.uid.is_implicit_VR assert self.uid.is_little_endian self.uid.set_private_encoding(False, False) assert not self.uid.is_implicit_VR assert not self.uid.is_little_endian # Test encoding attr are copied to new UID instance uid = UID(self.uid) assert uid.is_transfer_syntax assert not uid.is_implicit_VR assert not uid.is_little_endian class TestRegisterTransferSyntax: """Tests for register_transfer_syntax()""" def teardown_method(self): pydicom.uid.PrivateTransferSyntaxes = [] def test_no_encoding_raises(self): """Test not supplying the encoding raises""" uid = UID("1.2.3") msg = ( "The corresponding dataset encoding for 'uid' must be set using " "the 'implicit_vr' and 'little_endian' arguments" ) with pytest.raises(ValueError, match=msg): register_transfer_syntax(uid) with pytest.raises(ValueError, match=msg): register_transfer_syntax("1.2.3") assert pydicom.uid.PrivateTransferSyntaxes == [] def test_encoding_uid(self): """Test encoding supplied via set_private_encoding()""" assert pydicom.uid.PrivateTransferSyntaxes == [] uid = UID("1.2.3") uid.set_private_encoding(True, False) register_transfer_syntax(uid) assert uid in pydicom.uid.PrivateTransferSyntaxes uid = pydicom.uid.PrivateTransferSyntaxes[0] assert uid.is_transfer_syntax assert uid.is_implicit_VR assert not uid.is_little_endian def test_encoding_str(self): """Test encoding supplied via args""" assert pydicom.uid.PrivateTransferSyntaxes == [] register_transfer_syntax("1.2.3", False, True) uid = pydicom.uid.PrivateTransferSyntaxes[0] assert uid == "1.2.3" assert uid.is_transfer_syntax assert not uid.is_implicit_VR assert uid.is_little_endian pydicom-pydicom-20aa4b7/tests/test_unicode.py000066400000000000000000000014471515706620200214350ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Unit tests for unicode.""" import sys from pydicom import dcmread class TestUnicodeFilenames: def test_read(self): """Unicode: Can read a file with unicode characters in name...""" uni_name = "test°" # verify first that we could encode file name in this environment try: _ = uni_name.encode(sys.getfilesystemencoding()) except UnicodeEncodeError: print("SKIP: Environment doesn't support unicode filenames") return try: dcmread(uni_name) except UnicodeEncodeError: self.fail("UnicodeEncodeError generated for unicode name") # ignore file doesn't exist error except OSError: pass pydicom-pydicom-20aa4b7/tests/test_util.py000066400000000000000000000467351515706620200207750ustar00rootroot00000000000000# Copyright 2008-2021 pydicom authors. See LICENSE file for details. """Test suite for util functions""" import copy from contextlib import contextmanager from io import BytesIO import os import pytest from pydicom import config, dcmread, Dataset, Sequence from pydicom import filereader from pydicom._private_dict import private_dictionaries from pydicom.data import get_testdata_file from pydicom.dataelem import DataElement from pydicom.tag import Tag from pydicom.uid import ( ImplicitVRLittleEndian, ExplicitVRBigEndian, ExplicitVRLittleEndian, ) from pydicom.util import fixer from pydicom.util import hexutil from pydicom.util.codify import ( camel_to_underscore, tag_repr, default_name_filter, code_imports, code_dataelem, code_dataset, main as codify_main, code_file_from_dataset, ) from pydicom.util.dump import ( print_character, filedump, datadump, hexdump, pretty_print, ) from pydicom.util.hexutil import hex2bytes, bytes2hex from pydicom.util.leanread import dicomfile have_numpy = True try: import numpy except ImportError: have_numpy = False test_dir = os.path.dirname(__file__) raw_hex_module = os.path.join(test_dir, "_write_stds.py") raw_hex_code = open(raw_hex_module, "rb").read() # For Python >=3.11, this can be imported from contextlib @contextmanager def chdir(new_dir): import os old_dir = os.getcwd() try: os.chdir(new_dir) yield finally: os.chdir(old_dir) class TestCodify: """Test the utils.codify module""" def test_camel_to_underscore(self): """Test utils.codify.camel_to_underscore""" input_str = ["TheNameToConvert", "Some12Variable_Name"] output_str = ["the_name_to_convert", "some12_variable__name"] for in_str, out_str in zip(input_str, output_str): assert out_str == camel_to_underscore(in_str) def test_tag_repr(self): """Test utils.codify.tag_repr""" input_tag = [0x00000000, 0x00100010, 0x7FE00010, 0x11110001] output_str = [ "(0x0000, 0x0000)", "(0x0010, 0x0010)", "(0x7FE0, 0x0010)", "(0x1111, 0x0001)", ] for tag, out_str in zip(input_tag, output_str): assert out_str == tag_repr(Tag(tag)) def test_default_name_filter(self): """Test utils.codify.default_name_filter""" input_keyword = ["ControlPointSet", "ReferenceDataSet", "FractionGroupThing"] output_str = ["cp_set", "ref_data_set", "frxn_gp_thing"] for in_str, out_str in zip(input_keyword, output_str): assert out_str == default_name_filter(in_str) def test_code_imports(self): """Test utils.codify.code_imports""" out = ["import pydicom"] out.append("from pydicom.dataset import Dataset, FileMetaDataset") out.append("from pydicom.sequence import Sequence") assert "\n".join(out) == code_imports() def test_code_dataelem_standard(self): """Test utils.codify.code_dataelem for standard element""" # Element keyword in data dictionary input_elem = [ DataElement(0x00100010, "PN", "CITIZEN"), DataElement(0x0008010C, "UI", "1.1.2.3.4.5"), DataElement(0x00080301, "US", 1200), ] out_str = [ "ds.PatientName = 'CITIZEN'", "ds.CodingSchemeUID = '1.1.2.3.4.5'", "ds.PrivateGroupReference = 1200", ] for elem, out in zip(input_elem, out_str): assert out == code_dataelem(elem) def test_code_dataelem_exclude_size(self): """Test utils.codify.code_dataelem exclude_size param""" input_elem = [ DataElement(0x00100010, "OB", b"CITIZEN"), DataElement(0x0008010C, "UI", "1.1"), DataElement(0x00200011, "IS", 3), ] # Fails # DataElement(0x00080301, 'US', 1200)] out_str = [ "ds.PatientName = # XXX Array of 7 bytes excluded", "ds.CodingSchemeUID = '1.1'", "ds.SeriesNumber = '3'", ] # Fails # "ds.PrivateGroupReference = 1200"] for elem, out in zip(input_elem, out_str): assert out == code_dataelem(elem, exclude_size=4) def test_code_dataelem_private(self): """Test utils.codify.code_dataelem""" # Element keyword not in data dictionary input_elem = [ DataElement(0x00111010, "PN", "CITIZEN"), DataElement(0x0081010C, "UI", "1.1.2.3.4.5"), DataElement(0x11110301, "US", 1200), ] out_str = [ "ds.add_new((0x0011, 0x1010), 'PN', 'CITIZEN')", "ds.add_new((0x0081, 0x010C), 'UI', '1.1.2.3.4.5')", "ds.add_new((0x1111, 0x0301), 'US', 1200)", ] for elem, out in zip(input_elem, out_str): assert out == code_dataelem(elem) def test_code_dataelem_sequence(self): """Test utils.codify.code_dataelem""" # ControlPointSequence elem = DataElement(0x300A0111, "SQ", []) out = "\n# Control Point Sequence\n" out += "cp_sequence = Sequence()\n" out += "ds.ControlPointSequence = cp_sequence" assert out == code_dataelem(elem) def test_code_sequence(self): """Test utils.codify.code_dataelem""" # ControlPointSequence elem = DataElement(0x300A0111, "SQ", []) elem.value.append(Dataset()) elem.value[0].PatientID = "1234" out = ( "\n" "# Control Point Sequence\n" "cp_sequence = Sequence()\n" "ds.ControlPointSequence = cp_sequence\n" "\n" "# Control Point Sequence: Control Point 1\n" "cp1 = Dataset()\n" "cp_sequence.append(cp1)\n" "cp1.PatientID = '1234'" ) assert out == code_dataelem(elem) def test_codify_recurring_keyword(self): """Test utils.codify.code_dataset with same keyword nested""" # Create fake Dataset with repeated DICOM keyword nested # (0040,A730) Content Sequence 1 item(s) ---- # (0040,A040) Value Type CS: 'CODE' # (0040,A730) Content Sequence 1 item(s) ---- # (0040,A040) Value Type CS: 'CODE' ds = Dataset() ds.ContentSequence = seq1 = Sequence() seq1.append(Dataset()) seq1[0].ValueType = "CODE" seq1[0].ContentSequence = seq2 = Sequence() seq2.append(Dataset()) seq2[0].ValueType = "CODE_1" ds_code = code_dataset(ds) # normal 1st use of var name assert "content1.ValueType = 'CODE'" in ds_code # Nested item of same name should have subscript assert "content1_1.ValueType = 'CODE_1'" in ds_code def test_code_file(self, capsys): """Test utils.codify.code_file""" filename = get_testdata_file("rtplan.dcm") args = [filename] codify_main(100, args) out, err = capsys.readouterr() assert r"rtplan_from_codify.dcm" in out def test_code_file_save_as(self, capsys): """Test utils.codify.code_file""" filename = get_testdata_file("rtplan.dcm") args = ["--save-as", r"c:\temp\testout.dcm", filename] codify_main(100, args) out, err = capsys.readouterr() assert r"c:\temp\testout.dcm" in out def test_code_file_deflated(self, capsys): """Test utils.codify.code_file with a deflated dataset""" filename = get_testdata_file("image_dfl.dcm") args = [filename] codify_main(100, args) out, err = capsys.readouterr() assert r"image_dfl_from_codify.dcm" in out def test_code_relative_filename(self, capsys): """Test utils.codify.code_file with a relative path that doesn't exist""" # regression test for #1865 args = ["XXxUN_sequenceXX.dcm"] # file that doesn't exist with pytest.raises(SystemExit): codify_main(100, args) def test_code_dataelem_at(self): """Test utils.codify.code_dataelem""" elem = DataElement(0x00000901, "AT", (0x1234, 0x5678)) out = "ds.OffendingElement = (0x1234, 0x5678)" assert out == code_dataelem(elem) class TestDump: """Test the utils.dump module""" def test_print_character(self): """Test utils.dump.print_character""" assert print_character(0x30) == "0" assert print_character(0x31) == "1" assert print_character(0x39) == "9" assert print_character(0x41) == "A" assert print_character(0x5A) == "Z" assert print_character(0x61) == "a" assert print_character(0x7A) == "z" assert print_character(0x00) == "." def test_filedump(self): """Test utils.dump.filedump""" p = get_testdata_file("CT_small.dcm") s = filedump(p, start_address=500, stop_address=1000) assert ( "000 49 49 2A 00 54 18 08 00 00 00 00 00 00 00 00 00 II*.T..........." ) not in s assert ( "1F4 2E 31 2E 31 2E 31 2E 31 2E 32 30 30 34 30 31 31 .1.1.1.1.2004011" ) in s def test_datadump(self): """Test utils.dump.datadump""" p = get_testdata_file("CT_small.dcm") with open(p, "rb") as f: s = datadump(f.read(), 500, 1000) assert ( "1F4 2E 31 2E 31 2E 31 2E 31 2E 32 30 30 34 30 31 31 .1.1.1.1.2004011" ) in s def test_hexdump(self): """Test utils.dump.hexdump""" # Default p = get_testdata_file("CT_small.dcm") with open(p, "rb") as f: s = hexdump(f) assert ( "0000 49 49 2A 00 54 18 08 00 00 00 00 00 00 00 00 00 II*.T..........." ) in s assert ( "0170 41 4C 5C 50 52 49 4D 41 52 59 5C 41 58 49 41 4C AL.PRIMARY.AXIAL" ) in s assert ("9920 08 00 00 00 00 00 ......") in s # `stop_address` parameter with open(p, "rb") as f: s = hexdump(f, stop_address=1000) assert ( "000 49 49 2A 00 54 18 08 00 00 00 00 00 00 00 00 00 II*.T..........." ) in s assert ( "170 41 4C 5C 50 52 49 4D 41 52 59 5C 41 58 49 41 4C AL.PRIMARY.AXIAL" ) in s assert ( "9920 08 00 00 00 00 00 ......" ) not in s # `show_address` parameter with open(p, "rb") as f: s = hexdump(f, show_address=False, stop_address=1000) assert ( "49 49 2A 00 54 18 08 00 00 00 00 00 00 00 00 00 II*.T..........." ) in s assert ( "000 49 49 2A 00 54 18 08 00 00 00 00 00 00 00 00 00 II*.T..........." ) not in s # `start_address` parameter with open(p, "rb") as f: s = hexdump(f, start_address=500, stop_address=1000) assert ( "000 49 49 2A 00 54 18 08 00 00 00 00 00 00 00 00 00 II*.T..........." ) not in s assert ( "1F4 2E 31 2E 31 2E 31 2E 31 2E 32 30 30 34 30 31 31 .1.1.1.1.2004011" ) in s def test_pretty_print(self, capsys): """Test utils.dump.pretty_print""" ds = get_testdata_file("CT_small.dcm", read=True) pretty_print(ds) s = capsys.readouterr().out assert ("(0008,0005) Specific Character Set CS: 'ISO_IR 100'") in s assert ("(0010,1002) Other Patient IDs Sequence -- 2 item(s)") in s assert (" (0010,0022) Type of Patient ID CS: 'TEXT'") in s assert ( "(FFFC,FFFC) Data Set Trailing Padding OB: Array of " "126 elements" ) in s class TestHexUtil: """Test the utils.hexutil module""" def test_hex_to_bytes(self): """Test utils.hexutil.hex2bytes""" hexstring = "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" assert hex2bytes(hexstring) == bytestring hexstring = "00 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0" bytestring = b"\x00\x10\x20\x30\x40\x50\x60\x70\x80\x90\xA0\xB0\xC0\xD0\xE0\xF0" assert hex2bytes(hexstring) == bytestring hexstring = b"00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" assert hex2bytes(hexstring) == bytestring with pytest.raises(TypeError): hex2bytes(0x1234) def test_bytes_to_hex(self): """Test utils.hexutil.hex2bytes""" hexstring = "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" bytestring = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" assert bytes2hex(bytestring) == hexstring hexstring = "00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0" bytestring = b"\x00\x10\x20\x30\x40\x50\x60\x70\x80\x90\xA0\xB0\xC0\xD0\xE0\xF0" assert bytes2hex(bytestring) == hexstring class TestDataElementCallbackTests: def setup_method(self): # Set up a dataset with commas in one item instead of backslash namespace = {} exec(raw_hex_code, {}, namespace) ds_bytes = hexutil.hex2bytes(namespace["impl_LE_deflen_std_hex"]) # Change "2\4\8\16" to "2,4,8,16" ds_bytes = ds_bytes.replace( b"\x32\x5c\x34\x5c\x38\x5c\x31\x36", b"\x32\x2c\x34\x2c\x38\x2c\x31\x36" ) self.ds_bytes = ds_bytes self.bytesio = BytesIO(ds_bytes) def teardown_method(self): config.reset_data_element_callback() def test_bad_separator(self, enforce_valid_values): """Ensure that unchanged bad separator does raise an error...""" ds = filereader.read_dataset( self.bytesio, is_little_endian=True, is_implicit_VR=True ) contour = ds.ROIContourSequence[0].ContourSequence[0] with pytest.raises(ValueError): getattr(contour, "ContourData") def test_impl_vr_comma(self): """util.fix_separator: Able to replace comma in Implicit VR dataset..""" fixer.fix_separator(b",", for_VRs=["DS", "IS"], process_unknown_VRs=False) ds = filereader.read_dataset( self.bytesio, is_little_endian=True, is_implicit_VR=True ) got = ds.ROIContourSequence[0].ContourSequence[0].ContourData expected = [2.0, 4.0, 8.0, 16.0] if have_numpy and config.use_DS_numpy: assert numpy.allclose(expected, got) else: assert expected == got def test_null_value_for_fixed_vr(self): # Wipe first Contour Data, mark as length 0 null_ds_bytes = self.ds_bytes.replace(b"\x08\x00\x00\x00", b"\x00\x00\x00\x00") contour_data = b"\x32\x2c\x34\x2c\x38\x2c\x31\x36" null_ds_bytes = null_ds_bytes.replace(contour_data, b"") fixer.fix_separator(b",", for_VRs=["DS", "IS"], process_unknown_VRs=False) ds = filereader.read_dataset( BytesIO(null_ds_bytes), is_little_endian=True, is_implicit_VR=True ) assert ds.ROIContourSequence[0].ContourSequence[0].ContourData is None def test_space_delimiter(self): # Change "32\64\128\196" to "32 64 128 196", keeping the trailing space existing = b"\x33\x32\x5c\x36\x34\x5c\x31\x32\x38\x5c\x31\x39\x36\x20" spaced = b"\x33\x32\x20\x36\x34\x20\x31\x32\x38\x20\x31\x39\x36\x20" space_ds_bytes = self.ds_bytes.replace(existing, spaced) fixer.fix_separator(b" ", for_VRs=["DS", "IS"], process_unknown_VRs=False) ds = filereader.read_dataset( BytesIO(space_ds_bytes), is_little_endian=True, is_implicit_VR=True ) got = ds.ROIContourSequence[0].ContourSequence[1].ContourData expected = [32.0, 64.0, 128.0, 196.0] if have_numpy and config.use_DS_numpy: assert numpy.allclose(expected, got) else: assert expected == got @pytest.mark.filterwarnings("ignore:Unknown DICOM tag") def test_process_unknown_vr(self): bad_vr_bytes = self.ds_bytes # tag (0900,0010), length 4, value "1,2" bad_vr_bytes += b"\x00\x09\x10\x00\x04\x00\x00\x00\x31\x2c\x32\x20" fixer.fix_separator(b",", for_VRs=["DS", "IS"], process_unknown_VRs=True) ds = filereader.read_dataset( BytesIO(bad_vr_bytes), is_little_endian=True, is_implicit_VR=True ) msg = ( r"VR lookup failed for the raw element with tag \(0900,0010\) - setting " "VR to 'UN'" ) with pytest.warns(UserWarning, match=msg): got = ds.get((0x0900, 0x0010)) assert got.value == b"1\\2 " # with process_unknown_VRs=False, unknown VR separator is not replaced fixer.fix_separator(b",", for_VRs=["DS", "IS"], process_unknown_VRs=False) ds = filereader.read_dataset( BytesIO(bad_vr_bytes), is_little_endian=True, is_implicit_VR=True ) msg = ( r"VR lookup failed for the raw element with tag \(0900,0010\) - setting " "VR to 'UN'" ) with pytest.warns(UserWarning, match=msg): got = ds.get((0x0900, 0x0010)) assert got.value == b"1,2 " class TestLeanRead: def test_explicit_little(self): p = get_testdata_file("CT_small.dcm") ds = dcmread(p) assert ds.file_meta.TransferSyntaxUID == ExplicitVRLittleEndian with dicomfile(p) as ds: assert ds.preamble is not None for elem in ds: if elem[0] == (0x7FE0, 0x0010): assert elem[2] == 32768 def test_implicit_little(self): p = get_testdata_file("MR_small_implicit.dcm") ds = dcmread(p) assert ds.file_meta.TransferSyntaxUID == ImplicitVRLittleEndian with dicomfile(p) as ds: assert ds.preamble is not None for elem in ds: if elem[0] == (0x7FE0, 0x0010): assert elem[2] == 8192 def test_explicit_big(self): p = get_testdata_file("MR_small_bigendian.dcm") ds = dcmread(p) assert ds.file_meta.TransferSyntaxUID == ExplicitVRBigEndian with dicomfile(p) as ds: assert ds.preamble is not None for elem in ds: if elem[0] == (0x7FE0, 0x0010): assert elem[2] == 8192 def test_no_tsyntax(self): p = get_testdata_file("meta_missing_tsyntax.dcm") ds = dcmread(p) assert "TransferSyntaxUID" not in ds.file_meta msg = "No transfer syntax in file meta info" with dicomfile(p) as ds: assert ds.preamble is not None with pytest.raises(NotImplementedError, match=msg): for elem in ds: pass def test_no_meta(self): p = get_testdata_file("no_meta.dcm") msg = "No transfer syntax in file meta info" with dicomfile(p) as ds: assert ds.preamble is None with pytest.raises(NotImplementedError, match=msg): for elem in ds: pass def test_UN_sequence(self): p = get_testdata_file("UN_sequence.dcm") msg = "This reader does not handle undefined length except for SQ" with dicomfile(p) as ds: with pytest.raises(NotImplementedError, match=msg): for elem in ds: pass @contextmanager def save_private_dict(): saved_private_dict = copy.deepcopy(private_dictionaries) try: yield finally: private_dictionaries.clear() private_dictionaries.update(saved_private_dict) pydicom-pydicom-20aa4b7/tests/test_valuerep.py000066400000000000000000001701321515706620200216300ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Test suite for valuerep.py""" import copy from datetime import datetime, date, time, timedelta, timezone from decimal import Decimal from itertools import chain from io import BytesIO import pickle import math import pytest import pydicom from pydicom import config, valuerep from pydicom.config import settings from pydicom.data import get_testdata_file from pydicom.dataset import Dataset from pydicom._dicom_dict import DicomDictionary, RepeatersDictionary from pydicom.filereader import read_dataset from pydicom.tag import Tag from pydicom.valuerep import ( DS, IS, DSfloat, DSdecimal, ISfloat, PersonName, VR, STANDARD_VR, AMBIGUOUS_VR, STR_VR, BYTES_VR, FLOAT_VR, INT_VR, LIST_VR, ) from pydicom.values import convert_value badvr_name = get_testdata_file("badVR.dcm") default_encoding = "iso8859" @pytest.fixture(params=(True, False)) def enforce_valid_both_fixture(request): """Fixture to run tests with enforce_valid_values with both True and False and ensure it is reset afterwards regardless of whether test succeeds. """ orig_reading_validation_mode = settings.reading_validation_mode settings.reading_validation_mode = config.RAISE if request.param else config.WARN yield settings.reading_validation_mode = orig_reading_validation_mode class TestTM: """Unit tests for pickling TM""" def test_pickling(self): # Check that a pickled TM is read back properly tm = pydicom.valuerep.TM("212223") assert tm == time(21, 22, 23) assert tm.original_string == "212223" assert tm == time(21, 22, 23) loaded_tm = pickle.loads(pickle.dumps(tm)) assert loaded_tm == tm assert loaded_tm.original_string == tm.original_string assert str(loaded_tm) == str(tm) def test_pickling_tm_from_time(self): tm = pydicom.valuerep.TM(time(21, 22, 23)) assert tm.original_string == "212223" time_string = pickle.dumps(tm) loaded_tm = pickle.loads(time_string) assert loaded_tm == tm assert loaded_tm.original_string == tm.original_string assert str(loaded_tm) == str(tm) def test_str_and_repr(self): assert str(pydicom.valuerep.TM("212223.1234")) == "212223.1234" assert repr(pydicom.valuerep.TM("212223.1234")) == '"212223.1234"' assert str(pydicom.valuerep.TM("212223")) == "212223" assert repr(pydicom.valuerep.TM("212223")) == '"212223"' assert str(pydicom.valuerep.TM("2122")) == "2122" assert repr(pydicom.valuerep.TM("2122")) == '"2122"' assert str(pydicom.valuerep.TM("21")) == "21" assert str(pydicom.valuerep.TM(time(21, 22, 23))) == "212223" assert str(pydicom.valuerep.TM(time(21, 22, 23, 24))) == "212223.000024" assert str(pydicom.valuerep.TM(time(1, 2, 3))) == "010203" assert repr(pydicom.valuerep.TM(time(1, 2, 3))) == '"010203"' def test_new_empty_str(self): """Test converting an empty string.""" assert pydicom.valuerep.TM("") is None def test_new_str_conversion(self): """Test converting strings to times.""" tm = pydicom.valuerep.TM("00") assert tm == time(0, 0, 0) tm = pydicom.valuerep.TM("23") assert tm == time(23, 0, 0) msg = r"Unable to convert non-conformant value '24' to 'TM' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.TM("24") tm = pydicom.valuerep.TM("0000") assert tm == time(0, 0, 0) tm = pydicom.valuerep.TM("2359") assert tm == time(23, 59, 0) msg = r"Unable to convert non-conformant value '2360' to 'TM' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.TM("2360") tm = pydicom.valuerep.TM("000000") assert tm == time(0, 0, 0) # Valid DICOM TM seconds range is 0..60, but time is 0..59 msg = ( r"'datetime.time' doesn't allow a value of '60' for the " r"seconds component, changing to '59'" ) with pytest.warns(UserWarning, match=msg): tm = pydicom.valuerep.TM("235960") assert tm == time(23, 59, 59) msg = r"Unable to convert non-conformant value '235' to 'TM' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.TM("235") def test_new_obj_conversion(self): """Test other conversion attempts.""" assert pydicom.valuerep.TM(None) is None tm = pydicom.valuerep.TM("010203.123456") assert pydicom.valuerep.TM(tm) == time(1, 2, 3, 123456) assert tm == pydicom.valuerep.TM(tm) tm = pydicom.valuerep.TM(time(1, 2, 3)) assert isinstance(tm, pydicom.valuerep.TM) assert tm == time(1, 2, 3) msg = r"Unable to convert '123456' to 'TM' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.TM(123456) def test_comparison(self): tm = pydicom.valuerep.TM("010203.123456") tm_object = time(1, 2, 3, 123456) assert tm == tm # noqa: PLR0124 Need to check equality with self assert tm != 1 assert tm == tm_object assert tm_object == tm assert hash(tm) == hash(tm_object) assert tm == pydicom.valuerep.TM(tm_object) assert tm < time(1, 2, 3, 123457) assert tm != time(1, 2, 3, 123457) assert tm < pydicom.valuerep.TM(time(1, 2, 3, 123457)) assert tm <= time(1, 2, 3, 123457) assert tm <= tm_object assert tm > time(1, 2, 3) assert tm > pydicom.valuerep.TM(time(1, 2, 3)) assert tm >= time(1, 2, 3) assert time(1, 2, 3, 123457) > tm assert tm_object >= tm assert time(1, 2, 3) < tm with pytest.raises(TypeError): tm > 5 def test_time_behavior(self): """Test that TM behaves like time.""" tm = pydicom.valuerep.TM("010203.123456") assert tm.hour == 1 assert tm.second == 3 assert tm.microsecond == 123456 assert tm.replace(hour=23) == time(23, 2, 3, 123456) assert "minute" in dir(tm) assert "original_string" in dir(tm) class TestDT: """Unit tests for pickling DT""" def test_pickling(self): # Check that a pickled DT is read back properly dt = pydicom.valuerep.DT("19111213212123") assert dt == datetime(1911, 12, 13, 21, 21, 23) data1_string = pickle.dumps(dt) loaded_dt = pickle.loads(data1_string) assert loaded_dt == dt assert dt.original_string == loaded_dt.original_string assert str(loaded_dt) == str(dt) def test_pickling_with_timezone(self): dt = pydicom.valuerep.DT("19111213212123-0630") loaded_dt = pickle.loads(pickle.dumps(dt)) assert loaded_dt == dt assert loaded_dt.original_string == dt.original_string assert str(loaded_dt) == str(dt) def test_pickling_dt_from_datetime(self): dt = pydicom.valuerep.DT(datetime(2222, 11, 23, 1, 2, 3, 4)) assert dt.original_string == "22221123010203.000004" loaded_dt = pickle.loads(pickle.dumps(dt)) assert loaded_dt == dt assert loaded_dt.original_string == dt.original_string assert str(dt) == str(loaded_dt) def test_pickling_dt_from_datetime_with_timezone(self): tz_info = timezone(timedelta(seconds=-23400), "-0630") dt_object = datetime(2022, 12, 31, 23, 59, 59, 42, tzinfo=tz_info) dt = pydicom.valuerep.DT(dt_object) assert dt.original_string == "20221231235959.000042-0630" loaded_dt = pickle.loads(pickle.dumps(dt)) assert dt == loaded_dt assert dt.original_string == loaded_dt.original_string assert str(dt) == str(loaded_dt) def test_new_empty_str(self): """Test converting an empty string.""" assert pydicom.valuerep.DT("") is None def test_new_obj_conversion(self): """Test other conversion attempts.""" assert pydicom.valuerep.DT(None) is None dt = pydicom.valuerep.DT("10010203") assert pydicom.valuerep.DT(dt) == datetime(1001, 2, 3) assert dt == pydicom.valuerep.DT(dt) dt = pydicom.valuerep.DT(datetime(1001, 2, 3)) assert isinstance(dt, pydicom.valuerep.DT) assert dt == datetime(1001, 2, 3) msg = r"Unable to convert '123456' to 'DT' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.DT(123456) def test_new_str_conversion(self): """Test string conversion.""" # Valid DICOM TM seconds range is 0..60, but time is 0..59 msg = ( r"'datetime.datetime' doesn't allow a value of '60' for the " r"seconds component, changing to '59'" ) with pytest.warns(UserWarning, match=msg): dt = pydicom.valuerep.DT("20010101235960") assert str(dt) == "20010101235960" assert dt == datetime(2001, 1, 1, 23, 59, 59) msg = r"Unable to convert non-conformant value 'a2000,00,00' to 'DT' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.DT("a2000,00,00") def test_str_and_repr(self): dt = datetime(1911, 12, 13, 21, 21, 23) assert str(pydicom.valuerep.DT(dt)) == "19111213212123" assert repr(pydicom.valuerep.DT(dt)) == '"19111213212123"' assert str(pydicom.valuerep.DT("19111213212123")) == "19111213212123" assert str(pydicom.valuerep.DA("1001.02.03")) == "1001.02.03" assert repr(pydicom.valuerep.DA("1001.02.03")) == '"1001.02.03"' tz_info = timezone(timedelta(seconds=21600), "+0600") dt = datetime(2022, 1, 2, 8, 9, 7, 123456, tzinfo=tz_info) assert str(pydicom.valuerep.DT(dt)) == "20220102080907.123456+0600" assert repr(pydicom.valuerep.DT(dt)) == '"20220102080907.123456+0600"' tz_info = timezone(timedelta(seconds=-23400), "-0630") dt = datetime(2022, 12, 31, 23, 59, 59, 42, tzinfo=tz_info) assert str(pydicom.valuerep.DT(dt)) == "20221231235959.000042-0630" assert repr(pydicom.valuerep.DT(dt)) == '"20221231235959.000042-0630"' def test_comparison(self): dt = pydicom.valuerep.DT("19111213212123") dt_object = datetime(1911, 12, 13, 21, 21, 23) assert dt == dt # noqa: PLR0124 Need to check equality with self assert dt != 1 assert dt == dt_object assert dt_object == dt assert hash(dt) == hash(dt_object) assert dt == pydicom.valuerep.DT(dt_object) assert dt < datetime(1911, 12, 13, 21, 21, 23, 123) assert dt != datetime(1911, 12, 13, 21, 21, 24) assert dt < pydicom.valuerep.DT(datetime(1911, 12, 13, 21, 21, 24)) assert dt <= datetime(1911, 12, 13, 21, 21, 23) assert dt <= dt_object assert dt > datetime(1911, 12, 13, 21, 21, 22) assert dt > pydicom.valuerep.DT(datetime(1911, 12, 13, 21, 21, 22)) assert dt >= datetime(1911, 12, 13, 21, 21, 23) assert datetime(1911, 12, 13, 21, 21, 24) > dt assert dt_object >= dt assert datetime(1911, 12, 13, 21, 21, 22) < dt with pytest.raises(TypeError): dt > 5 def test_datetime_behavior(self): """Test that DT behaves like datetime.""" tz_info = timezone(timedelta(seconds=-23400), "-0630") dt_object = datetime(2022, 12, 31, 23, 59, 59, 42, tzinfo=tz_info) dt = pydicom.valuerep.DT(dt_object) assert dt == dt_object assert dt_object == dt assert dt.year == 2022 assert dt.month == 12 assert dt.hour == 23 assert dt.second == 59 assert dt.microsecond == 42 assert dt.tzinfo == tz_info assert dt.today().date() == dt_object.today().date() assert "hour" in dir(dt) assert "original_string" in dir(dt) class TestDA: """Unit tests for pickling DA""" def test_pickling(self): # Check that a pickled DA is read back properly x = pydicom.valuerep.DA("19111213") assert date(1911, 12, 13) == x x.original_string = "hello" data1_string = pickle.dumps(x) x2 = pickle.loads(data1_string) assert x == x2 assert x.original_string == x2.original_string assert str(x) == str(x2) def test_new_obj_conversion(self): """Test other conversion attempts.""" assert pydicom.valuerep.DA(None) is None x = pydicom.valuerep.DA("10010203") assert date(1001, 2, 3) == pydicom.valuerep.DA(x) assert x == pydicom.valuerep.DA(x) x = pydicom.valuerep.DA(date(1001, 2, 3)) assert isinstance(x, pydicom.valuerep.DA) assert date(1001, 2, 3) == x msg = r"Unable to convert '123456' to 'DA' object" with pytest.raises(ValueError, match=msg): pydicom.valuerep.DA(123456) def test_str_and_repr(self): assert str(pydicom.valuerep.DA(date(1001, 2, 3))) == "10010203" assert repr(pydicom.valuerep.DA(date(1001, 2, 3))) == '"10010203"' assert str(pydicom.valuerep.DA("10010203")) == "10010203" assert repr(pydicom.valuerep.DA("10010203")) == '"10010203"' assert str(pydicom.valuerep.DA("1001.02.03")) == "1001.02.03" assert repr(pydicom.valuerep.DA("1001.02.03")) == '"1001.02.03"' def test_comparison(self): da = pydicom.valuerep.DA("19111213") da_object = date(1911, 12, 13) assert da == da # noqa: PLR0124 Need to check equality with self assert da != 1 assert da == da_object assert hash(da) == hash(da_object) assert da_object == da assert da == pydicom.valuerep.DA(da_object) assert da < date(1911, 12, 14) assert da != date(1901, 12, 13) assert da < pydicom.valuerep.DA(date(1912, 12, 13)) assert da <= date(1911, 12, 13) assert da <= da_object assert da > date(1911, 12, 12) assert da > pydicom.valuerep.DA(date(1911, 12, 12)) assert da >= date(1911, 12, 13) assert date(1911, 12, 14) > da assert da_object >= da assert date(1911, 12, 12) < da with pytest.raises(TypeError): da > 5 def test_date_behavior(self): da = pydicom.valuerep.DA("10010203") da_object = date(1001, 2, 3) assert da == da_object assert da_object == da assert da.year == 1001 assert da.month == 2 assert da.day == 3 assert da.today() == da_object.today() assert "day" in dir(da) assert "original_string" in dir(da) class TestIsValidDS: """Unit tests for the is_valid_ds function.""" @pytest.mark.parametrize( "s", [ "1", "3.14159265358979", "-1234.456e78", "1.234E-5", "1.234E+5", "+1", " 42", # leading spaces allowed "42 ", # trailing spaces allowed ], ) def test_valid(self, s: str): """Various valid decimal strings.""" assert pydicom.valuerep.is_valid_ds(s) @pytest.mark.parametrize( "s", [ "nan", "-inf", "3.141592653589793", # too long "1,000", # no commas "1 000", # no embedded spaces "127.0.0.1", # not a number "1.e", # not a number ], ) def test_invalid(self, s: str): """Various invalid decimal strings.""" assert not pydicom.valuerep.is_valid_ds(s) class TestTruncateFloatForDS: """Unit tests for float truncation function""" def check_valid(self, s: str) -> bool: # Use the pydicom test function if not pydicom.valuerep.is_valid_ds(s): return False # Disallow floats ending in '.' since this may not be correctly # interpreted if s.endswith("."): return False # Otherwise return True return True @pytest.mark.parametrize( "val,expected_str", [ [1.0, "1.0"], [0.0, "0.0"], [-0.0, "-0.0"], [0.123, "0.123"], [-0.321, "-0.321"], [0.00001, "1e-05"], [3.14159265358979323846, "3.14159265358979"], [-3.14159265358979323846, "-3.1415926535898"], [5.3859401928763739403e-7, "5.3859401929e-07"], [-5.3859401928763739403e-7, "-5.385940193e-07"], [1.2342534378125532912998323e10, "12342534378.1255"], [6.40708699858767842501238e13, "64070869985876.8"], [1.7976931348623157e308, "1.797693135e+308"], ], ) def test_auto_format(self, val: float, expected_str: str): """Test truncation of some basic values.""" assert pydicom.valuerep.format_number_as_ds(val) == expected_str @pytest.mark.parametrize("exp", [-101, -100, 100, 101] + list(range(-16, 17))) def test_powers_of_pi(self, exp: int): """Raise pi to various powers to test truncation.""" val = math.pi * 10**exp s = pydicom.valuerep.format_number_as_ds(val) assert self.check_valid(s) @pytest.mark.parametrize("exp", [-101, -100, 100, 101] + list(range(-16, 17))) def test_powers_of_negative_pi(self, exp: int): """Raise negative pi to various powers to test truncation.""" val = -math.pi * 10**exp s = pydicom.valuerep.format_number_as_ds(val) assert self.check_valid(s) @pytest.mark.parametrize( "val", [float("-nan"), float("nan"), float("-inf"), float("inf")] ) def test_invalid(self, val: float): """Test non-finite floating point numbers raise an error""" with pytest.raises(ValueError): pydicom.valuerep.format_number_as_ds(val) def test_wrong_type(self): """Test calling with a string raises an error""" with pytest.raises( TypeError, match="'val' must be of type float or decimal.Decimal" ): pydicom.valuerep.format_number_as_ds("1.0") class TestDS: """Unit tests for DS values""" def test_empty_value(self): assert DS(None) is None assert DS("") == "" assert DS(" ") == " " def test_float_values(self): val = DS(0.9) assert isinstance(val, DSfloat) assert 0.9 == val val = DS("0.9") assert isinstance(val, DSfloat) assert 0.9 == val class TestDSfloat: """Unit tests for pickling DSfloat""" def test_pickling(self, enforce_valid_both_fixture): # Check that a pickled DSFloat is read back properly x = DSfloat(9.0) x.original_string = "hello" data1_string = pickle.dumps(x) x2 = pickle.loads(data1_string) assert x.real == x2.real assert x.original_string == x2.original_string def test_new_empty(self, enforce_valid_both_fixture): """Test passing an empty value.""" assert isinstance(DSfloat(""), str) assert DSfloat("") == "" assert DSfloat(None) is None def test_str_value(self, enforce_valid_both_fixture): """Test creating using str""" assert DSfloat("1.20") == 1.2 assert DSfloat("1.20") == 1.20 assert DSfloat("1.20 ") == 1.2 assert DSfloat("1.20 ") == 1.20 assert DSfloat("1.20") != "1.2" assert DSfloat("1.20") == "1.20" assert DSfloat("1.20 ") == "1.20" def test_str(self, enforce_valid_both_fixture): """Test DSfloat.__str__().""" val = DSfloat(1.1) assert str(val) == "1.1" val = DSfloat("1.1") assert str(val) == "1.1" def test_repr(self, enforce_valid_both_fixture): """Test DSfloat.__repr__().""" val = DSfloat(1.1) assert repr(val) == "'1.1'" val = DSfloat("1.1") assert repr(val) == "'1.1'" assert repr(val) == repr("1.1") assert repr(val) == repr("1.1") def test_DSfloat(self, enforce_valid_both_fixture): """Test creating a value using DSfloat.""" x = DSfloat("1.2345") y = DSfloat(x) assert x == y assert y == x assert 1.2345 == y assert "1.2345" == y.original_string def test_DSdecimal(self, enforce_valid_both_fixture): """Test creating a value using DSdecimal.""" x = DSdecimal("1.2345") y = DSfloat(x) assert 1.2345 == y assert "1.2345" == y.original_string def test_auto_format(self, enforce_valid_both_fixture): """Test truncating floats""" x = DSfloat(math.pi, auto_format=True) # Float representation should be unaltered by truncation assert x == math.pi # String representations should be correctly formatted assert str(x) == "3.14159265358979" assert repr(x) == repr("3.14159265358979") def test_auto_format_from_invalid_DS(self, disable_value_validation): """Test truncating floats""" # A DSfloat that has a non-valid string representation x = DSfloat(math.pi) # Use this to initialise another with auto_format set to true y = DSfloat(x, auto_format=True) # Float representation should be unaltered by truncation assert y == math.pi # String representations should be correctly formatted assert str(y) == "3.14159265358979" assert repr(y) == repr("3.14159265358979") def test_auto_format_invalid_string(self, enforce_valid_both_fixture): """If the user supplies an invalid string, this should be formatted.""" x = DSfloat("3.141592653589793", auto_format=True) # Float representation should be unaltered by truncation assert x == float("3.141592653589793") # String representations should be correctly formatted assert str(x) == "3.14159265358979" assert repr(x) == repr("3.14159265358979") def test_auto_format_valid_string(self, enforce_valid_both_fixture): """If the user supplies a valid string, this should not be altered.""" x = DSfloat("1.234e-1", auto_format=True) # Float representation should be correct assert x == 0.1234 # String representations should be unaltered assert str(x) == "1.234e-1" assert repr(x) == repr("1.234e-1") def test_enforce_valid_values_length(self): """Test that errors are raised when length is too long.""" with pytest.raises(OverflowError): valuerep.DSfloat("3.141592653589793", validation_mode=config.RAISE) def test_handle_missing_leading_zero(self): """Test that no error is raised with maximum length DS string without leading zero.""" # Regression test for #1632 valuerep.DSfloat(".002006091181818", validation_mode=config.RAISE) def test_DSfloat_auto_format(self): """Test creating a value using DSfloat copies auto_format""" x = DSfloat(math.pi, auto_format=True) y = DSfloat(x) assert x == y assert y == x assert y.auto_format assert math.pi == y assert str(y) == "3.14159265358979" assert repr(y) == repr("3.14159265358979") @pytest.mark.parametrize( "val", [ "nan", "-nan", "inf", "-inf", float("nan"), float("-nan"), float("-inf"), float("inf"), ], ) def test_enforce_valid_values_value(self, val: float | str): """Test that errors are raised when value is invalid.""" with pytest.raises(ValueError): valuerep.DSfloat(val, validation_mode=config.RAISE) def test_comparison_operators(self): """Tests for the comparison operators""" float_decimal = DSfloat(Decimal(1234.5)) for val in (DSfloat("1234.5"), DSfloat(1234.5), float_decimal): assert val == Decimal(1234.5) assert val != Decimal(1235) assert val < Decimal(1235) assert val <= Decimal(1235) assert val > Decimal(1233) assert val >= Decimal(1233) assert val == 1234.5 assert val != 1235.0 assert val < 1235.0 assert val <= 1235.0 assert val > 1233.0 assert val >= 1233.0 assert val == "1234.5" assert val != " 1234.5" assert val != "1234.50" assert val != "1234.5 " assert val != "1235" with pytest.raises(TypeError, match="'<' not supported"): val < "1235" with pytest.raises(TypeError, match="'<=' not supported"): val <= "1235" with pytest.raises(TypeError, match="'>' not supported"): val > "1233" with pytest.raises(TypeError, match="'>=' not supported"): val >= "1233" def test_hash(self): """Test hash(DSfloat)""" assert hash(DSfloat(1.2345)) == hash(1.2345) assert hash(DSfloat("1.2345")) == hash(1.2345) class TestDSdecimal: @pytest.fixture def allow_ds_float(self): old_value = config.allow_DS_float config.allow_DS_float = True yield config.allow_DS_float = old_value """Unit tests for pickling DSdecimal""" def test_pickling(self): # Check that a pickled DSdecimal is read back properly # DSdecimal actually prefers original_string when # reading back x = DSdecimal(19) x.original_string = "19" data1_string = pickle.dumps(x) x2 = pickle.loads(data1_string) assert x.real == x2.real assert x.original_string == x2.original_string def test_float_value(self, allow_ds_float): assert 9 == DSdecimal(9.0) config.allow_DS_float = False msg = "cannot be instantiated with a float value" with pytest.raises(TypeError, match=msg): DSdecimal(9.0) def test_new_empty(self): """Test passing an empty value.""" assert DSdecimal("") == "" assert DSdecimal(" ") == " " assert DSdecimal(None) is None def test_str_value(self): """Test creating using str""" # Not equal because float(1.2) != Decimal('1.2') assert DSdecimal("1.20") != 1.2 assert DSdecimal("1.20") != 1.20 # Decimal(1.2) is different to Decimal('1.2') assert DSdecimal("1.20") == Decimal("1.2") assert DSdecimal("1.20") == Decimal("1.20") assert DSdecimal("1.20 ") == Decimal("1.2") assert DSdecimal("1.20 ") == Decimal("1.20") assert DSdecimal("1.20") != "1.2" assert DSdecimal("1.20") == "1.20" assert DSdecimal("1.20 ") == "1.20" def test_DSfloat(self): """Test creating a value using DSfloat.""" x = DSdecimal("1.2345") y = DSdecimal(x) assert x == y assert y == x assert Decimal("1.2345") == y assert "1.2345" == y.original_string def test_DSdecimal(self, allow_ds_float): """Test creating a value using DSdecimal.""" x = DSfloat("1.2345") assert x.original_string == "1.2345" assert not x.auto_format assert str(x) == "1.2345" assert repr(x) == "'1.2345'" y = DSdecimal(x) assert y.original_string == "1.2345" assert not y.auto_format assert str(y) == "1.2345" assert repr(y) == "'1.2345'" assert Decimal(1.2345) == y assert "1.2345" == y.original_string def test_repr(self): """Test repr(DSdecimal).""" x = DSdecimal("1.2345") assert repr(x) == repr("1.2345") def test_string_too_long(self): msg = ( "Values for elements with a VR of 'DS' values must be <= 16 " "characters long. Use a smaller string, *" ) with pytest.warns(UserWarning, match=msg): DSdecimal(Decimal(math.pi), auto_format=False) def test_string_too_long_raises(self, enforce_valid_values): msg = ( "Values for elements with a VR of 'DS' values must be <= 16 " "characters long. Use a smaller string, *" ) with pytest.raises(OverflowError, match=msg): DSdecimal(Decimal(math.pi), auto_format=False) def test_auto_format(self, enforce_valid_both_fixture): """Test truncating decimal""" x = DSdecimal(Decimal(math.pi), auto_format=True) # Decimal representation should be unaltered by truncation assert x == Decimal(math.pi) # String representations should be correctly formatted assert str(x) == "3.14159265358979" assert repr(x) == repr("3.14159265358979") def test_auto_format_from_invalid_DS( self, allow_ds_float, disable_value_validation ): """Test truncating floats""" # A DSdecimal that has a non-valid string representation x = DSdecimal(math.pi) # Use this to initialise another with auto_format set to true y = DSdecimal(x, auto_format=True) # Float representation should be unaltered by truncation assert y == math.pi # String representations should be correctly formatted assert str(y) == "3.14159265358979" assert repr(y) == repr("3.14159265358979") def test_auto_format_invalid_string(self, enforce_valid_both_fixture): """If the user supplies an invalid string, this should be formatted.""" x = DSdecimal("3.141592653589793", auto_format=True) # Decimal representation should be unaltered by truncation assert x == Decimal("3.141592653589793") # String representations should be correctly formatted assert str(x) == "3.14159265358979" assert repr(x) == repr("3.14159265358979") @pytest.mark.parametrize( "val", [ "NaN", "-NaN", "Infinity", "-Infinity", Decimal("NaN"), Decimal("-NaN"), Decimal("-Infinity"), Decimal("Infinity"), ], ) def test_enforce_valid_values_value(self, val: Decimal | str): """Test that errors are raised when value is invalid.""" with pytest.raises(ValueError): valuerep.DSdecimal(val, validation_mode=config.RAISE) def test_auto_format_valid_string(self, enforce_valid_both_fixture): """If the user supplies a valid string, this should not be altered.""" x = DSdecimal("1.234e-1", auto_format=True) # Decimal representation should be correct assert x == Decimal("1.234e-1") # String representations should be unaltered assert str(x) == "1.234e-1" assert repr(x) == repr("1.234e-1") def test_DSdecimal_auto_format(self, allow_ds_float): """Test creating a value using DSdecimal copies auto_format""" x = DSdecimal(math.pi, auto_format=True) y = DSdecimal(x) assert x == y assert y == x assert y.auto_format assert math.pi == y assert str(y) == "3.14159265358979" assert repr(y) == repr("3.14159265358979") def test_comparison_operators(self, allow_ds_float): """Tests for the comparison operators""" decimal_decimal = DSdecimal(Decimal(1234.5)) for val in (DSdecimal("1234.5"), DSdecimal(1234.5), decimal_decimal): assert val == Decimal(1234.5) assert val != Decimal(1235) assert val < Decimal(1235) assert val <= Decimal(1235) assert val > Decimal(1233) assert val >= Decimal(1233) assert val == 1234.5 assert val != 1235.0 assert val < 1235.0 assert val <= 1235.0 assert val > 1233.0 assert val >= 1233.0 assert val == "1234.5" assert val != " 1234.5" assert val != "1234.50" assert val != "1234.5 " assert val != "1235" with pytest.raises(TypeError, match="'<' not supported"): val < "1235" with pytest.raises(TypeError, match="'<=' not supported"): val <= "1235" with pytest.raises(TypeError, match="'>' not supported"): val > "1233" with pytest.raises(TypeError, match="'>=' not supported"): val >= "1233" def test_hash(self, allow_ds_float, disable_value_validation): """Test hash(DSdecimal)""" assert hash(DSdecimal(1.2345)) == hash(Decimal(1.2345)) assert hash(DSdecimal("1.2345")) == hash(Decimal("1.2345")) class TestIS: """Unit tests for IS""" def test_empty_value(self): assert IS(None) is None assert IS("") == "" assert IS(" ") == " " def test_str_value(self): """Test creating using str""" assert IS("1") == 1 assert IS("1 ") == 1 assert IS(" 1 ") == 1 def test_valid_value(self, disable_value_validation): assert 42 == IS(42) assert 42 == IS("42") assert 42 == IS("42.0") assert 42 == IS(42.0) def test_float_value(self): """Read binary value of IS that is actually a float""" # from issue #1661 # Create BytesIO with single data element for Exposure (0018,1152) # length 4, value "14.5" bin_elem = b"\x18\x00\x52\x11\x04\x00\x00\x0014.5" with BytesIO(bin_elem) as bio: ds = read_dataset(bio, True, True) # Will warn when the element is first converted to DataElement msg1 = 'Value "14.5" is not valid for elements with a VR of IS' msg2 = "Invalid value for VR IS: '14.5'" with pytest.warns(UserWarning, match=msg1): with pytest.warns(UserWarning, match=msg2): assert isinstance(ds.Exposure, ISfloat) assert ds.Exposure == 14.5 # Strict checking raises an error with pytest.raises(ValueError): IS("14.5", validation_mode=config.RAISE) with pytest.raises(TypeError): IS(14.5, validation_mode=config.RAISE) def test_float_init(self): """New ISfloat created from another behaves correctly""" is1 = IS("14.5", validation_mode=config.IGNORE) with pytest.warns(UserWarning, match='Value "14.5" is not valid'): is2 = IS(is1) assert is1 == is2 assert is2.original_string == is1.original_string def test_invalid_value(self, disable_value_validation): with pytest.raises(ValueError, match="could not convert string"): IS("foo") def test_pickling(self): # Check that a pickled IS is read back properly x = IS(921) x.original_string = "hello" data1_string = pickle.dumps(x) x2 = pickle.loads(data1_string) assert x.real == x2.real assert x.original_string == x2.original_string def test_longint(self, allow_reading_invalid_values): # Check that a long int is read properly # Will not work with enforce_valid_values x = IS(3103050000) data1_string = pickle.dumps(x) x2 = pickle.loads(data1_string) assert x.real == x2.real def test_overflow(self): msg = ( r"Elements with a VR of IS must have a value between -2\*\*31 " r"and \(2\*\*31 - 1\). Set " r"'config.settings.reading_validation_mode' to 'WARN' " r"to override the value check" ) with pytest.raises(OverflowError, match=msg): IS(3103050000, validation_mode=config.RAISE) def test_str(self, disable_value_validation): """Test IS.__str__().""" val = IS(1) assert str(val) == "1" val = IS("1") assert str(val) == "1" val = IS("1.0") assert str(val) == "1.0" def test_repr(self, disable_value_validation): """Test IS.__repr__().""" val = IS(1) assert repr(val) == repr("1") val = IS("1") assert repr(val) == repr("1") assert repr(val) == repr("1") val = IS("1.0") assert str(val) == "1.0" def test_comparison_operators(self): """Tests for the comparison operators""" for val in (IS("1234"), IS(1234), IS(1234.0)): assert val == 1234 assert val != 1235 assert val < 1235 assert val <= 1235 assert val > 1233 assert val >= 1233 assert val == 1234.0 assert val != 1235.0 assert val < 1235.0 assert val <= 1235.0 assert val > 1233.0 assert val >= 1233.0 assert val == "1234" assert val != "1234.0" assert val != "1235" assert val != "1234 " assert val != " 1234" with pytest.raises(TypeError, match="'<' not supported"): val < "1235" with pytest.raises(TypeError, match="'<=' not supported"): val <= "1235" with pytest.raises(TypeError, match="'>' not supported"): val > "1233" with pytest.raises(TypeError, match="'>=' not supported"): val >= "1233" def test_hash(self): """Test hash(IS)""" assert hash(IS(1)) == hash(1) assert hash(IS("1")) == hash(1) class TestBadValueRead: """Unit tests for handling a bad value for a VR (a string in a number VR here)""" def setup_method(self): class TagLike: pass self.tag = TagLike() self.tag.value = b"1A" self.tag.is_little_endian = True self.tag.is_implicit_VR = False self.tag.tag = Tag(0x0010, 0x0020) self.tag.length = 2 self.default_retry_order = pydicom.values.convert_retry_VR_order def teardown_method(self): pydicom.values.convert_retry_VR_order = self.default_retry_order def test_read_bad_value_in_VR_default(self, disable_value_validation): # found a conversion assert "1A" == convert_value("SH", self.tag) # converted with fallback vr "SH" assert "1A" == convert_value("IS", self.tag) pydicom.values.convert_retry_VR_order = ["FL", "UL"] # no fallback VR succeeded, returned original value untranslated assert b"1A" == convert_value("IS", self.tag) def test_read_bad_value_in_VR_enforce_valid_value(self, enforce_valid_values): # found a conversion assert "1A" == convert_value("SH", self.tag) # invalid literal for base 10 with pytest.raises(ValueError): convert_value("IS", self.tag) class TestDecimalString: """Unit tests unique to the use of DS class derived from python Decimal""" @pytest.fixture(autouse=True) def ds_decimal(self): original = config.use_DS_decimal config.DS_decimal(True) yield config.DS_decimal(original) def test_DS_decimal_set(self): config.use_DS_decimal = False config.DS_decimal(True) assert config.use_DS_decimal is True def test_valid_decimal_strings(self): # Ensures that decimal.Decimal doesn't cause a valid string to become # invalid valid_str = "-9.81338674e-006" ds = valuerep.DS(valid_str) assert isinstance(ds, valuerep.DSdecimal) assert len(str(ds)) <= 16 def test_invalid_decimal_strings(self): # Now the input string truly is invalid invalid_string = "-9.813386743e-006" with pytest.raises(ValueError): valuerep.DS(invalid_string, validation_mode=config.RAISE) class TestPersonName: def test_last_first(self): """PN: Simple Family-name^Given-name works...""" value = "Family^Given" pn = PersonName(val=value) assert value == pn.alphabetic assert "Family" == pn.family_name assert "Given" == pn.given_name assert "" == pn.name_suffix assert "" == pn.phonetic def test_no_components(self): """PN: Empty Person Name does not raise errors...""" pn = PersonName(val="") assert "" == pn.alphabetic == pn.phonetic == pn.ideographic def test_copy(self): """PN: Copy and deepcopy works...""" pn = PersonName( "Hong^Gildong=" "\033$)C\373\363^\033$)C\321\316\324\327=" "\033$)C\310\253^\033$)C\261\346\265\277", [default_encoding, "euc_kr"], ) pn_copy = copy.copy(pn) assert pn == pn_copy assert pn.components == pn_copy.components # the copied object references the original components assert pn_copy.components is pn.components assert pn.encodings == pn_copy.encodings pn_copy = copy.deepcopy(pn) assert pn == pn_copy assert pn.components == pn_copy.components # deepcopy() returns the same immutable objects (tuples) assert pn_copy.components is pn.components assert pn.encodings is pn_copy.encodings def test_three_component(self): """PN: 3component (single-byte, ideographic, phonetic characters) works...""" # Example name from PS3.5-2008 section I.2 p. 108 pn = PersonName( "Hong^Gildong^Andrews=" "\033$)C\373\363^\033$)C\321\316\324\327=" "\033$)C\310\253^\033$)C\261\346\265\277" ) assert ("Hong", "Gildong", "Andrews") == ( pn.family_name, pn.given_name, pn.middle_name, ) assert "Hong^Gildong^Andrews" == pn.alphabetic assert "\033$)C\373\363^\033$)C\321\316\324\327" == pn.ideographic assert "\033$)C\310\253^\033$)C\261\346\265\277" == pn.phonetic def test_formatting(self): """PN: Formatting works...""" pn = PersonName("Family^Given") assert pn.family_comma_given() == "Family, Given" s = pn.formatted("%(family_name)s, %(given_name)s") assert s == "Family, Given" def test_unicode_kr(self): """PN: 3component in unicode works (Korean)...""" # Example name from PS3.5-2008 section I.2 p. 101 pn = PersonName( b"Hong^Gildong=" b"\033$)C\373\363^\033$)C\321\316\324\327=" b"\033$)C\310\253^\033$)C\261\346\265\277", [default_encoding, "euc_kr"], ) # PersonName does not decode the components automatically pn = pn.decode() assert ("Hong", "Gildong") == (pn.family_name, pn.given_name) assert "洪^吉洞" == pn.ideographic assert "홍^길동" == pn.phonetic def test_unicode_jp_from_bytes(self): """PN: 3component in unicode works (Japanese)...""" # Example name from PS3.5-2008 section H p. 98 pn = PersonName( b"Yamada^Tarou=" b"\033$B;3ED\033(B^\033$BB@O:\033(B=" b"\033$B$d$^$@\033(B^\033$B$?$m$&\033(B", [default_encoding, "iso2022_jp"], ) pn = pn.decode() assert ("Yamada", "Tarou") == (pn.family_name, pn.given_name) assert "山田^太郎" == pn.ideographic assert "やまだ^たろう" == pn.phonetic def test_unicode_jp_from_bytes_comp_delimiter(self): """The example encoding without the escape sequence before '='""" pn = PersonName( b"Yamada^Tarou=" b"\033$B;3ED\033(B^\033$BB@O:=" b"\033$B$d$^$@\033(B^\033$B$?$m$&\033(B", [default_encoding, "iso2022_jp"], ) pn = pn.decode() assert ("Yamada", "Tarou") == (pn.family_name, pn.given_name) assert "山田^太郎" == pn.ideographic assert "やまだ^たろう" == pn.phonetic def test_unicode_jp_from_bytes_caret_delimiter(self): """PN: 3component in unicode works (Japanese)...""" # Example name from PS3.5-2008 section H p. 98 pn = PersonName( b"Yamada^Tarou=" b"\033$B;3ED\033(B^\033$BB@O:\033(B=" b"\033$B$d$^$@\033(B^\033$B$?$m$&\033(B", [default_encoding, "iso2022_jp"], ) pn = pn.decode() assert ("Yamada", "Tarou") == (pn.family_name, pn.given_name) assert "山田^太郎" == pn.ideographic assert "やまだ^たろう" == pn.phonetic def test_unicode_jp_from_unicode(self): """A person name initialized from unicode is already decoded""" pn = PersonName( "Yamada^Tarou=山田^太郎=やまだ^たろう", [default_encoding, "iso2022_jp"] ) assert ("Yamada", "Tarou") == (pn.family_name, pn.given_name) assert "山田^太郎" == pn.ideographic assert "やまだ^たろう" == pn.phonetic def test_not_equal(self): """PN3: Not equal works correctly (issue 121)...""" # Meant to only be used in python 3 but doing simple check here from pydicom.valuerep import PersonName pn = PersonName("John^Doe") assert not pn != "John^Doe" def test_encoding_carried(self): """Test encoding is carried over to a new PN3 object""" # Issue 466 from pydicom.valuerep import PersonName pn = PersonName("John^Doe", encodings="iso_ir_126") assert pn.encodings == ("iso_ir_126",) pn2 = PersonName(pn) assert pn2.encodings == ("iso_ir_126",) def test_hash(self): """Test that the same name creates the same hash.""" # Regression test for #785 pn1 = PersonName("John^Doe^^Dr", encodings=default_encoding) pn2 = PersonName("John^Doe^^Dr", encodings=default_encoding) assert hash(pn1) == hash(pn2) pn3 = PersonName("John^Doe", encodings=default_encoding) assert hash(pn1) != hash(pn3) pn1 = PersonName( "Yamada^Tarou=山田^太郎=やまだ^たろう", [default_encoding, "iso2022_jp"] ) pn2 = PersonName( "Yamada^Tarou=山田^太郎=やまだ^たろう", [default_encoding, "iso2022_jp"] ) assert hash(pn1) == hash(pn2) def test_next(self): """Test that the next function works on it's own""" # Test getting the first character pn1 = PersonName("John^Doe^^Dr", encodings=default_encoding) pn1_itr = iter(pn1) assert next(pn1_itr) == "J" # Test getting multiple characters pn2 = PersonName( "Yamada^Tarou=山田^太郎=やまだ^たろう", [default_encoding, "iso2022_jp"] ) pn2_itr = iter(pn2) assert next(pn2_itr) == "Y" assert next(pn2_itr) == "a" # Test getting all characters pn3 = PersonName("SomeName") pn3_itr = iter(pn3) assert next(pn3_itr) == "S" assert next(pn3_itr) == "o" assert next(pn3_itr) == "m" assert next(pn3_itr) == "e" assert next(pn3_itr) == "N" assert next(pn3_itr) == "a" assert next(pn3_itr) == "m" assert next(pn3_itr) == "e" # Attempting to get next character should stop the iteration # I.e. next can only start once with pytest.raises(StopIteration): next(pn3_itr) # Test that next() doesn't work without instantiating an iterator pn4 = PersonName("SomeName") msg = r"'PersonName' object is not an iterator" with pytest.raises(TypeError, match=msg): next(pn4) def test_iterator(self): """Test that iterators can be correctly constructed""" name_str = "John^Doe^^Dr" pn1 = PersonName(name_str) for i, c in enumerate(pn1): assert name_str[i] == c # Ensure that multiple iterators can be created on the same variable for i, c in enumerate(pn1): assert name_str[i] == c for s in iter(PersonName(name_str)): pass def test_contains(self): """Test that characters can be check if they are within the name""" pn1 = PersonName("John^Doe") assert "J" in pn1 assert "o" in pn1 assert "x" not in pn1 assert "^" in pn1 def test_length(self): """Test len(PN)""" pn1 = PersonName("John^Doe") assert len(pn1) == 8 # "Hong^Gildong=洪^吉洞=홍^길동" pn = PersonName.from_named_components( family_name="Hong", given_name="Gildong", family_name_ideographic=b"\033$)C\373\363", given_name_ideographic=b"\033$)C\321\316\324\327", family_name_phonetic=b"\033$)C\310\253", given_name_phonetic=b"\033$)C\261\346\265\277", encodings=[default_encoding, "euc_kr"], ) pn = pn.decode() assert len(pn) == 12 + 1 + 4 + 1 + 4 def test_from_named_components(self): # Example from DICOM standard, part 5, sect 6.2.1.1 pn = PersonName.from_named_components( family_name="Adams", given_name="John Robert Quincy", name_prefix="Rev.", name_suffix="B.A. M.Div.", ) assert pn == "Adams^John Robert Quincy^^Rev.^B.A. M.Div." assert pn.family_name == "Adams" assert pn.given_name == "John Robert Quincy" assert pn.name_prefix == "Rev." assert pn.name_suffix == "B.A. M.Div." def test_from_named_components_kr_from_bytes(self): # Example name from PS3.5-2008 section I.2 p. 108 pn = PersonName.from_named_components( family_name="Hong", given_name="Gildong", family_name_ideographic=b"\033$)C\373\363", given_name_ideographic=b"\033$)C\321\316\324\327", family_name_phonetic=b"\033$)C\310\253", given_name_phonetic=b"\033$)C\261\346\265\277", encodings=[default_encoding, "euc_kr"], ) pn = pn.decode() assert ("Hong", "Gildong") == (pn.family_name, pn.given_name) assert "洪^吉洞" == pn.ideographic assert "홍^길동" == pn.phonetic def test_from_named_components_kr_from_unicode(self): # Example name from PS3.5-2008 section I.2 p. 108 pn = PersonName.from_named_components( family_name="Hong", given_name="Gildong", family_name_ideographic="洪", given_name_ideographic="吉洞", family_name_phonetic="홍", given_name_phonetic="길동", encodings=[default_encoding, "euc_kr"], ) pn = pn.decode() assert ("Hong", "Gildong") == (pn.family_name, pn.given_name) assert "洪^吉洞" == pn.ideographic assert "홍^길동" == pn.phonetic def test_from_named_components_jp_from_bytes(self): # Example name from PS3.5-2008 section H p. 98 pn = PersonName.from_named_components( family_name="Yamada", given_name="Tarou", family_name_ideographic=b"\033$B;3ED\033(B", given_name_ideographic=b"\033$BB@O:\033(B", family_name_phonetic=b"\033$B$d$^$@\033(B", given_name_phonetic=b"\033$B$?$m$&\033(B", encodings=[default_encoding, "iso2022_jp"], ) pn = pn.decode() assert ("Yamada", "Tarou") == (pn.family_name, pn.given_name) assert "山田^太郎" == pn.ideographic assert "やまだ^たろう" == pn.phonetic def test_from_named_components_jp_from_unicode(self): # Example name from PS3.5-2008 section H p. 98 pn = PersonName.from_named_components( family_name="Yamada", given_name="Tarou", family_name_ideographic="山田", given_name_ideographic="太郎", family_name_phonetic="やまだ", given_name_phonetic="たろう", encodings=[default_encoding, "iso2022_jp"], ) pn = pn.decode() assert ("Yamada", "Tarou") == (pn.family_name, pn.given_name) assert "山田^太郎" == pn.ideographic assert "やまだ^たろう" == pn.phonetic def test_from_named_components_veterinary(self): # Example from DICOM standard, part 5, sect 6.2.1.1 # A horse whose responsible organization is named ABC Farms, and whose # name is "Running On Water" pn = PersonName.from_named_components_veterinary( responsible_party_name="ABC Farms", patient_name="Running on Water", ) assert pn == "ABC Farms^Running on Water" assert pn.family_name == "ABC Farms" assert pn.given_name == "Running on Water" def test_from_named_components_with_separator(self): # If the names already include separator chars # a ValueError should be raised with pytest.raises(ValueError): PersonName.from_named_components(given_name="Yamada^Tarou") def test_from_named_components_with_separator_from_bytes(self): # If the names already include separator chars # a ValueError should be raised with pytest.raises(ValueError): PersonName.from_named_components( family_name_ideographic=b"\033$B;3ED\033(B^\033$BB@O:\033(B", encodings=[default_encoding, "iso2022_jp"], ) class TestDateTime: """Unit tests for DA, DT, TM conversion to datetime objects""" def setup_method(self): config.datetime_conversion = True def teardown_method(self): config.datetime_conversion = False def test_date(self): """DA conversion to datetime.date ...""" dicom_date = "19610804" da = valuerep.DA(dicom_date) # Assert `da` equals to correct `date` assert date(1961, 8, 4) == da # Assert `da.__repr__` holds original string assert f'"{dicom_date}"' == repr(da) dicom_date = "1961.08.04" # ACR-NEMA Standard 300 da = valuerep.DA(dicom_date) # Assert `da` equals to correct `date` assert date(1961, 8, 4) == da # Assert `da.__repr__` holds original string assert f'"{dicom_date}"' == repr(da) dicom_date = "" da = valuerep.DA(dicom_date) # Assert `da` equals to no date assert da is None def test_date_time(self): """DT conversion to datetime.datetime ...""" dicom_datetime = "1961" dt = valuerep.DT(dicom_datetime) # Assert `dt` equals to correct `datetime` assert datetime(1961, 1, 1) == dt # Assert `dt.__repr__` holds original string assert f'"{dicom_datetime}"' == repr(dt) dicom_datetime = "19610804" dt = valuerep.DT(dicom_datetime) # Assert `dt` equals to correct `datetime` assert datetime(1961, 8, 4) == dt # Assert `dt.__repr__` holds original string assert f'"{dicom_datetime}"' == repr(dt) dicom_datetime = "19610804192430.123" dt = valuerep.DT(dicom_datetime) # Assert `dt` equals to correct `datetime` assert datetime(1961, 8, 4, 19, 24, 30, 123000) == dt # Assert `dt.__repr__` holds original string assert f'"{dicom_datetime}"' == repr(dt) dicom_datetime = "196108041924-1000" dt = valuerep.DT(dicom_datetime) # Assert `dt` equals to correct `datetime` datetime_datetime = datetime( 1961, 8, 4, 19, 24, 0, 0, timezone(timedelta(seconds=-10 * 3600)) ) assert datetime_datetime == dt assert timedelta(0, 0, 0, 0, 0, -10) == dt.utcoffset() # Assert `dt.__repr__` holds original string assert f'"{dicom_datetime}"' == repr(dt) def test_time(self): """TM conversion to datetime.time...""" dicom_time = "2359" tm = valuerep.TM(dicom_time) # Assert `tm` equals to correct `time` assert time(23, 59) == tm # Assert `tm.__repr__` holds original string assert f'"{dicom_time}"' == repr(tm) dicom_time = "235900.123" tm = valuerep.TM(dicom_time) # Assert `tm` equals to correct `time` assert time(23, 59, 00, 123000) == tm # Assert `tm.__repr__` holds original string assert f'"{dicom_time}"' == repr(tm) # Assert `tm` equals to no `time` tm = valuerep.TM("") assert tm is None VALUE_REFERENCE = [ # (VR, Python setter type, (VM 0 values), (VM >= 1 values), keyword) ("AE", str, (None, ""), ("foo", "bar"), "Receiver"), ("AS", str, (None, ""), ("foo", "bar"), "PatientAge"), ("AT", int, (None,), (0, 2**32 - 1), "OffendingElement"), ("CS", str, (None, ""), ("foo", "bar"), "QualityControlSubject"), ("DA", str, (None, ""), ("20010203", "20020304"), "PatientBirthDate"), ("DS", str, (None, ""), ("-1.5", "3.2"), "PatientWeight"), ("DS", int, (None, ""), (-1, 3), "PatientWeight"), ("DS", float, (None, ""), (-1.5, 3.2), "PatientWeight"), ("DT", str, (None, ""), ("20010203040506", "2000"), "AcquisitionDateTime"), ("FD", float, (None,), (-1.5, 3.2), "RealWorldValueLUTData"), ("FL", float, (None,), (-1.5, 3.2), "VectorAccuracy"), ("IS", str, (None, ""), ("0", "25"), "BeamNumber"), ("IS", int, (None, ""), (0, 25), "BeamNumber"), ("IS", float, (None, ""), (0.0, 25.0), "BeamNumber"), ("LO", str, (None, ""), ("foo", "bar"), "DataSetSubtype"), ("LT", str, (None, ""), ("foo", "bar"), "ExtendedCodeMeaning"), ("OB", bytes, (None, b""), (b"\x00\x01",), "FillPattern"), ("OD", bytes, (None, b""), (b"\x00\x01",), "DoubleFloatPixelData"), ("OF", bytes, (None, b""), (b"\x00\x01",), "UValueData"), ("OL", bytes, (None, b""), (b"\x00\x01",), "TrackPointIndexList"), ("OV", bytes, (None, b""), (b"\x00\x01",), "SelectorOVValue"), ("OW", bytes, (None, b""), (b"\x00\x01",), "TrianglePointIndexList"), ("PN", str, (None, ""), ("foo", "bar"), "PatientName"), ("SH", str, (None, ""), ("foo", "bar"), "CodeValue"), ("SL", int, (None,), (-(2**31), 2**31 - 1), "RationalNumeratorValue"), ("SQ", list, ([],), (Dataset(), Dataset()), "BeamSequence"), ("SS", int, (None,), (-(2**15), 2**15 - 1), "SelectorSSValue"), ("ST", str, (None, ""), ("foo", "bar"), "InstitutionAddress"), ("SV", int, (None,), (-(2**63), 2**63 - 1), "SelectorSVValue"), ("TM", str, (None, ""), ("123456", "000000"), "StudyTime"), ("UC", str, (None, ""), ("foo", "bar"), "LongCodeValue"), ("UI", str, (None, ""), ("foo", "bar"), "SOPClassUID"), ("UL", int, (None,), (0, 2**32 - 1), "SimpleFrameList"), ("UN", bytes, (None, b""), (b"\x00\x01",), "SelectorUNValue"), ("UR", str, (None, ""), ("foo", "bar"), "CodingSchemeURL"), ("US", int, (None,), (0, 2**16 - 1), "SourceAcquisitionBeamNumber"), ("UT", str, (None, ""), ("foo", "bar"), "StrainAdditionalInformation"), ("UV", int, (None,), (0, 2**64 - 1), "SelectorUVValue"), ] @pytest.mark.parametrize("vr, pytype, vm0, vmN, keyword", VALUE_REFERENCE) def test_set_value(vr, pytype, vm0, vmN, keyword, disable_value_validation): """Test that element values are set consistently""" # Test VM = 0 ds = Dataset() for value in vm0: setattr(ds, keyword, value) elem = ds[keyword] assert elem.VR == vr assert elem.value == value assert value == elem.value # Test VM = 1 if vr != "SQ": ds = Dataset() value = vmN[0] setattr(ds, keyword, value) elem = ds[keyword] assert elem.value == value assert value == elem.value # Test VM = 1 as list ds = Dataset() value = vmN[0] setattr(ds, keyword, [value]) elem = ds[keyword] if vr == "SQ": assert elem.value[0] == value assert value == elem.value[0] else: assert elem.value == value assert value == elem.value if vr[0] == "O" or vr == "UN": return # Test VM > 1 ds = Dataset() value = vmN[0] setattr(ds, keyword, list(vmN)) elem = ds[keyword] assert elem.value == list(vmN) assert list(vmN) == elem.value @pytest.mark.parametrize("vr, pytype, vm0, vmN, keyword", VALUE_REFERENCE) def test_assigning_bytes(vr, pytype, vm0, vmN, keyword): """Test that byte VRs are excluded from the backslash check.""" if pytype is bytes: ds = Dataset() value = b"\x00\x01" + b"\\" + b"\x02\x03" setattr(ds, keyword, value) elem = ds[keyword] assert elem.VR == vr assert elem.value == value assert elem.VM == 1 class TestVR: def test_behavior(self): """Test that VR class behaves as expected""" assert isinstance(VR.AE, str) assert VR.AE == "AE" assert VR.US_SS_OW == "US or SS or OW" assert f"{VR.AE}" == "AE" def test_all_present(self): """Test all VRs are configured""" elem = chain(DicomDictionary.values(), RepeatersDictionary.values()) ref = {v[0] for v in elem} - {"NONE"} assert ref == STANDARD_VR | AMBIGUOUS_VR # Test all have Python built-in assert STANDARD_VR == BYTES_VR | FLOAT_VR | INT_VR | LIST_VR | STR_VR pydicom-pydicom-20aa4b7/tests/test_values.py000066400000000000000000000261071515706620200213060ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """Tests for dataset.py""" import logging import pytest from pydicom.tag import Tag from pydicom.uid import UID from pydicom.values import ( convert_value, converters, convert_tag, convert_ATvalue, convert_DA_string, convert_text, convert_single_string, convert_AE_string, convert_PN, multi_string, ) from pydicom.valuerep import VR class TestConvertTag: def test_big_endian(self): """Test convert_tag with a big endian byte string""" bytestring = b"\x00\x10\x00\x20" assert convert_tag(bytestring, False) == Tag(0x0010, 0x0020) def test_little_endian(self): """Test convert_tag with a little endian byte string""" bytestring = b"\x10\x00\x20\x00" assert convert_tag(bytestring, True) == Tag(0x0010, 0x0020) def test_offset(self): """Test convert_tag with an offset""" bytestring = b"\x12\x23\x10\x00\x20\x00\x34\x45" assert convert_tag(bytestring, True, 0) == Tag(0x2312, 0x0010) assert convert_tag(bytestring, True, 2) == Tag(0x0010, 0x0020) def test_empty_bytestring(self): """Test convert_tag with empty bytestring""" bytestring = b"" with pytest.raises(ValueError, match="byte string too short*"): convert_tag(bytestring, True) def test_bad_bytestring(self): """Test convert_tag with a bad bytestring""" bytestring = b"\x10\x00" with pytest.raises(ValueError, match="byte string too short*"): convert_tag(bytestring, True) class TestConvertAE: def test_strip_blanks(self): bytestring = b" AE_TITLE " assert "AE_TITLE" == convert_AE_string(bytestring, True) def test_convert_multival(self): bytestring = b"AE_ONE\\AE_TWO" assert ["AE_ONE", "AE_TWO"] == convert_AE_string(bytestring, True) class TestConvertText: def test_single_value(self): """Test that encoding can change inside a text string""" bytestring = b"Dionysios is \x1b\x2d\x46\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" encodings = ["latin_1", "iso_ir_126"] assert "Dionysios is Διονυσιος" == convert_text(bytestring, encodings) def test_multi_value(self): """Test that backslash is handled as value separator""" bytestring = ( b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3" ) encodings = ["latin_1", "iso_ir_144", "iso_ir_126"] assert ["Buc^Jérôme", "Διονυσιος", "Люкceмбypг"] == convert_text( bytestring, encodings ) def test_single_value_with_backslash(self): """Test that backslash is handled as character""" bytestring = ( b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3" ) encodings = ["latin_1", "iso_ir_144", "iso_ir_126"] assert "Buc^Jérôme\\Διονυσιος\\Люкceмбypг" == convert_single_string( bytestring, encodings ) def test_multi_value_with_backslash_in_multibyte_encoding(self): """Test that backslash in multibyte encoding is not mishandled as value separator """ bytestring = b"\x1b$BG\\<\\\x1b-A\\\x1b$BK\\L\\\x1b-A" encodings = ["latin_1", "iso2022_jp"] assert ["倍尺", "本目"] == convert_text(bytestring, encodings) def test_single_value_with_unknown_encoding(self): bytestring = b"Buc^J\xe9r\xf4me" encodings = ["unknown"] msg = "Unknown encoding 'unknown' - using default encoding instead" with pytest.warns(UserWarning, match=msg): assert convert_single_string(bytestring, encodings) == "Buc^Jérôme" def test_single_value_with_unknown_encoding_raises(self, enforce_valid_values): bytestring = b"Buc^J\xe9r\xf4me" encodings = ["unknown"] with pytest.raises(LookupError, match="unknown encoding: unknown"): convert_single_string(bytestring, encodings) def test_single_value_with_delimiters(self): """Test that delimiters reset the encoding""" bytestring = ( b"\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2" b"\r\nJ\xe9r\xf4me/" b"\x1b\x2d\x4C" b"\xbb\xee\xda\x63\x65\xdc\xd1\x79\x70\xd3" b"\tJ\xe9r\xf4me" ) encodings = ["latin_1", "iso_ir_144", "iso_ir_126"] expected = "Διονυσιος\r\nJérôme/Люкceмбypг\tJérôme" assert expected == convert_single_string(bytestring, encodings) def test_value_ending_with_padding(self): bytestring = b"Value ending with spaces " assert "Value ending with spaces" == convert_single_string(bytestring) assert "Value ending with spaces" == convert_text(bytestring) bytestring = b"Values \\with spaces " assert ["Values", "with spaces"] == convert_text(bytestring) bytestring = b"Value ending with zeros\0\0\0" assert "Value ending with zeros" == convert_single_string(bytestring) assert "Value ending with zeros" == convert_text(bytestring) bytestring = b"Values\0\0\\with zeros\0" assert ["Values", "with zeros"] == convert_text(bytestring) class TestConvertAT: def test_big_endian(self): """Test convert_ATvalue with a big endian byte string""" # VM 1 bytestring = b"\x00\x10\x00\x20" assert convert_ATvalue(bytestring, False) == Tag(0x0010, 0x0020) # VM 3 bytestring += b"\x00\x10\x00\x30\x00\x10\x00\x40" out = convert_ATvalue(bytestring, False) assert Tag(0x0010, 0x0020) in out assert Tag(0x0010, 0x0030) in out assert Tag(0x0010, 0x0040) in out def test_little_endian(self): """Test convert_ATvalue with a little endian byte string""" # VM 1 bytestring = b"\x10\x00\x20\x00" assert convert_ATvalue(bytestring, True) == Tag(0x0010, 0x0020) # VM 3 bytestring += b"\x10\x00\x30\x00\x10\x00\x40\x00" out = convert_ATvalue(bytestring, True) assert Tag(0x0010, 0x0020) in out assert Tag(0x0010, 0x0030) in out assert Tag(0x0010, 0x0040) in out def test_empty_bytestring(self): """Test convert_ATvalue with empty bytestring""" bytestring = b"" assert convert_ATvalue(bytestring, True) == [] def test_bad_length(self, caplog): """Test convert_ATvalue with bad length bytestring""" bytestring = b"\x10\x00\x20\x00\x10\x00\x30\x00\x10" out = convert_ATvalue(bytestring, True) assert Tag(0x0010, 0x0020) in out assert Tag(0x0010, 0x0030) in out assert len(caplog.records) == 1 assert caplog.records[0].levelno == logging.WARNING assert ( caplog.records[0].message == "Expected length to be multiple of 4 for VR 'AT', got length 9" ) class TestConvertDA: def test_big_endian(self): """Test convert_DA_string with a big endian byte string""" # VM 1 bytestring = b"\x32\x30\x30\x34\x30\x31\x31\x39" # byte ordering independent assert convert_DA_string(bytestring, False) == "20040119" # VM 2 bytestring += b"\x5c\x31\x39\x39\x39\x31\x32\x31\x32" out = convert_DA_string(bytestring, False) assert out == ["20040119", "19991212"] def test_little_endian(self): """Test convert_DA_string with a little endian byte string""" # VM 1 bytestring = b"\x32\x30\x30\x34\x30\x31\x31\x39" # byte ordering independent assert convert_DA_string(bytestring, True) == "20040119" # VM 2 bytestring += b"\x5c\x31\x39\x39\x39\x31\x32\x31\x32" out = convert_DA_string(bytestring, True) assert out == ["20040119", "19991212"] def test_empty_bytestring(self): """Test convert_DA_string with empty bytestring""" bytestring = b"" assert convert_DA_string(bytestring, True) == "" class TestConvertValue: def test_convert_value_raises(self): """Test convert_value raises exception if unsupported VR""" converter_func = converters["PN"] del converters["PN"] with pytest.raises( NotImplementedError, match="Unknown Value Representation 'PN'" ): convert_value("PN", None) # Fix converters converters["PN"] = converter_func assert "PN" in converters class TestConvertOValues: """Test converting values with the 'O' VRs like OB, OW, OF, etc.""" def test_convert_of(self): """Test converting OF.""" fp = b"\x00\x01\x02\x03" assert b"\x00\x01\x02\x03" == converters["OF"](fp, True) class TestConvertPN: def test_valid_PN(self): bytestring = b"John^Doe" assert "John^Doe" == convert_PN(bytestring) bytestring = b"Yamada^Tarou=\x1b$B;3ED\x1b(B^\x1b$BB@O:" converted_string = convert_PN(bytestring, ["latin_1", "iso2022_jp"]) assert "Yamada^Tarou=山田^太郎" == converted_string # 0x5c (\) in multibyte codes bytestring = b"Baishaku^Honme=\x1b$BG\\<\\\x1b(B^\x1b$BK\\L\\" converted_string = convert_PN(bytestring, ["latin_1", "iso2022_jp"]) assert "Baishaku^Honme=倍尺^本目" == converted_string # 0x3d (=) in multibyte codes bytestring = b"Sunatouge^Ayano=\x1b$B:=F=\x1b(B^\x1b$B0=G=" converted_string = convert_PN(bytestring, ["latin_1", "iso2022_jp"]) assert "Sunatouge^Ayano=砂峠^綾能" == converted_string def test_multi_value(self): """Test that backslash is handled as value separator""" bytestring = ( b"Buc^J\xe9r\xf4me\\\x1b\x2d\x46" b"\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2\\" b"\x1b$BG\\<\\\x1b(B^\x1b$BK\\L\\" ) encodings = ["latin_1", "iso2022_jp", "iso_ir_126"] assert ["Buc^Jérôme", "Διονυσιος", "倍尺^本目"] == convert_PN( bytestring, encodings ) def test_all_converters(): """Test that the VR decoder functions are complete""" assert set(VR) == set(converters) def test_multistring(): """Tests for multi_string""" # Test stripping trailing nulls and spaces value = multi_string("abjoaisj\\afsdfa\\aasdf \x00 \x00\x00 ") assert value == ["abjoaisj", "afsdfa", "aasdf"] value = multi_string("abjoaisj\\afsdfa\\\x00 \x00 \x00\x00 ") assert value == ["abjoaisj", "afsdfa", ""] value = multi_string(" \x00abjoaisj \\ afsdfa\\\x00 \x00 \x00\x00 ") assert value == [" \x00abjoaisj ", " afsdfa", ""] # Test default constructor assert isinstance(value[0], str) # Test supplied constructor value = multi_string("1.2.3.4\\5.6.7.8", UID) assert value == ["1.2.3.4", "5.6.7.8"] assert all(isinstance(x, UID) for x in value) # Test single item value = multi_string("aasdf \x00 \x00\x00 ") assert value == "aasdf" pydicom-pydicom-20aa4b7/tests/test_waveform.py000066400000000000000000000117741515706620200216410ustar00rootroot00000000000000# Copyright 2008-2020 pydicom authors. See LICENSE file for details. import pytest from pydicom.data import get_testdata_file from pydicom.filereader import dcmread try: import numpy as np HAVE_NP = True except ImportError: HAVE_NP = False try: from pydicom.waveforms import numpy_handler as NP_HANDLER from pydicom.waveforms.numpy_handler import generate_multiplex, multiplex_array except ImportError: NP_HANDLER = None ECG = get_testdata_file("waveform_ecg.dcm") @pytest.mark.skipif(HAVE_NP, reason="Numpy is available") def test_waveform_array_raises(): """Test waveform_array raises exception for all syntaxes.""" ds = dcmread(ECG) msg = r"The waveform data handler requires numpy" with pytest.raises(RuntimeError, match=msg): ds.waveform_array(0) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") def test_simple(): """Simple functionality test.""" ds = dcmread(ECG) ds.waveform_array(index=0) ds.waveform_array(index=1) @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestHandlerGenerateMultiplex: """Tests for the waveform numpy_handler.generate_multiplex.""" def test_no_waveform_sequence(self): """Test that missing waveform sequence raises exception.""" ds = dcmread(ECG) del ds.WaveformSequence msg = r"No \(5400,0100\) Waveform Sequence element found in the dataset" gen = generate_multiplex(ds) with pytest.raises(AttributeError, match=msg): next(gen) def test_missing_required(self): """Test that missing required element in sequence raises exception.""" ds = dcmread(ECG) item = ds.WaveformSequence[0] del item.NumberOfWaveformSamples msg = ( "Unable to convert the waveform multiplex group with index " "0 as the following required elements are missing from " "the sequence item: NumberOfWaveformSamples" ) gen = generate_multiplex(ds) with pytest.raises(AttributeError, match=msg): next(gen) def test_as_raw(self): """Test that as_raw=True works as expected.""" ds = dcmread(ECG) gen = generate_multiplex(ds, as_raw=True) arr = next(gen) assert [80, 65, 50, 35, 37] == arr[0:5, 0].tolist() assert [90, 85, 80, 75, 77] == arr[0:5, 1].tolist() assert arr.dtype == "int16" assert arr.flags.writeable assert (10000, 12) == arr.shape def test_not_as_raw(self): """Test that as_raw=False works as expected.""" ds = dcmread(ECG) gen = generate_multiplex(ds, as_raw=False) arr = next(gen) assert [100, 81.25, 62.5, 43.75, 46.25] == arr[0:5, 0].tolist() assert [112.5, 106.25, 100, 93.75, 96.25] == arr[0:5, 1].tolist() assert arr.dtype == "float" assert arr.flags.writeable assert (10000, 12) == arr.shape @pytest.mark.skipif(not HAVE_NP, reason="Numpy not available") class TestHandlerMultiplexArray: """Tests for the waveform numpy_handler.multiplex_array.""" def test_no_waveform_sequence(self): """Test that missing waveform sequence raises exception.""" ds = dcmread(ECG) del ds.WaveformSequence msg = r"No \(5400,0100\) Waveform Sequence element found in the dataset" with pytest.raises(AttributeError, match=msg): multiplex_array(ds, 0) def test_missing_required(self): """Test that missing required element in sequence raises exception.""" ds = dcmread(ECG) item = ds.WaveformSequence[0] del item.NumberOfWaveformSamples msg = ( "Unable to convert the waveform multiplex group with index " "0 as the following required elements are missing from " "the sequence item: NumberOfWaveformSamples" ) with pytest.raises(AttributeError, match=msg): multiplex_array(ds, 0) def test_as_raw(self): """Test that as_raw=True works as expected.""" ds = dcmread(ECG) arr = multiplex_array(ds, index=0, as_raw=True) assert [80, 65, 50, 35, 37] == arr[0:5, 0].tolist() assert [90, 85, 80, 75, 77] == arr[0:5, 1].tolist() assert arr.dtype == "int16" assert arr.flags.writeable assert (10000, 12) == arr.shape arr = multiplex_array(ds, index=1, as_raw=True) assert [10, 10, 30, 35, 25] == arr[0:5, 0].tolist() assert [80, 80, 80, 85, 80] == arr[0:5, 1].tolist() assert arr.dtype == "int16" assert arr.flags.writeable assert (1200, 12) == arr.shape def test_not_as_raw(self): """Test that as_raw=False works as expected.""" ds = dcmread(ECG) arr = multiplex_array(ds, index=0, as_raw=False) assert [100, 81.25, 62.5, 43.75, 46.25] == arr[0:5, 0].tolist() assert [112.5, 106.25, 100, 93.75, 96.25] == arr[0:5, 1].tolist() assert arr.dtype == "float" assert arr.flags.writeable assert (10000, 12) == arr.shape pydicom-pydicom-20aa4b7/util/000077500000000000000000000000001515706620200162035ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/util/generate_cids/000077500000000000000000000000001515706620200207775ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/util/generate_cids/generate_concept_dicts.py000066400000000000000000001225331515706620200260520ustar00rootroot00000000000000#!/usr/bin/env python # Encoding required to deal with 'micro' character """Script for auto-generating DICOM SR context groups from FHIR JSON value set resources. """ import argparse from io import BytesIO import json from keyword import iskeyword import ftplib import logging import os from pathlib import Path import re from pprint import pprint import urllib.request as urllib_request from xml.etree import ElementTree as ET import zipfile LOGGER = logging.getLogger(__name__) PYDICOM_SRC = Path(__file__).parent.parent.parent / "src" / "pydicom" SR_DIRECTORY = PYDICOM_SRC / "sr" FTP_HOST = "medical.nema.org" FTP_PATH = "medical/dicom/resources/valuesets/" FTP_FHIR_REGEX = re.compile( r".+/DICOM_ValueSets(?P[0-9]{4}[a-z])_release_fhir_json_[0-9]+.zip" ) CID_ID_REGEX = re.compile("^dicom-cid-([0-9]+)-[a-zA-Z]+") P16_TO1_URL = ( "http://dicom.nema.org/medical/dicom/current/output/chtml/part16/chapter_O.html" ) P16_TD1_URL = ( "http://dicom.nema.org/medical/dicom/current/output/chtml/part16/chapter_D.html" ) # Example excerpt fhir JSON for reference """ "resourceType":"ValueSet", "id":"dicom-cid-10-InterventionalDrug", ... "name":"InterventionalDrug", ... "compose":{ "include":[ { "system":"http://dicom.nema.org/resources/ontology/DCM", "concept":[ { "code":"130290", "display":"Median" } ] }, { "system":"http://snomed.info/sct", "concept":[ { "code":"387362001", "display":"Epinephrine" }, ], ... }, ... ], """ # The list of scheme designators is not complete. # For full list see table 8-1 in part 3.16 chapter 8: # http://dicom.nema.org/medical/dicom/current/output/chtml/part16/chapter_8.html#table_8-1 FHIR_SYSTEM_TO_DICOM_SCHEME_DESIGNATOR = { "http://snomed.info/sct": "SCT", "http://dicom.nema.org/resources/ontology/DCM": "DCM", "http://loinc.org": "LN", "http://www.radlex.org": "RADLEX", "http://sig.biostr.washington.edu/projects/fm/AboutFM.html": "FMA", "http://www.nlm.nih.gov/mesh/meshhome.html": "MSH", "http://ncit.nci.nih.gov": "NCIt", "http://unitsofmeasure.org": "UCUM", "http://hl7.org/fhir/sid/ndc": "NDC", "urn:iso:std:iso:11073:10101": "MDC", "doi:10.1016/S0735-1097(99)00126-6": "BARI", "http://www.nlm.nih.gov/research/umls": "UMLS", "http://pubchem.ncbi.nlm.nih.gov": "PUBCHEM_CID", "http://braininfo.rprc.washington.edu/aboutBrainInfo.aspx#NeuroNames": "NEU", "http://www.itis.gov": "ITIS_TSN", "http://arxiv.org/abs/1612.07003": "IBSI", "http://www.nlm.nih.gov/research/umls/rxnorm": "RXNORM", "http://hl7.org/fhir/sid/icd-10": "I10", } DOC_LINES = [ f"# Auto-generated by {os.path.basename(__file__)}.\n", "# -*- coding: utf-8 -*-\n", "\n", ] KEYWORD_FIXES = { # scheme: {code: keyword} "SCT": { "399136008": "LeftPosteriorObliqueEmissiveProjection", # CIDs [26], [501] "399159002": "LateroMedialObliqueEmissiveProjection", # CIDs [26], [501] "399089007": "ObliqueAxialEmissiveProjection", # CIDs [26], [501] "399075002": "RightPosteriorObliqueEmissiveProjection", # CIDs [26], [501] "399061009": "AxialProjection", # CIDs [26], [501] "399074003": "LeftAnteriorObliqueEmissiveProjection", # CIDs [26], [501] "399182000": "ObliqueProjection", # CIDs [26], [501] "399108003": "RightAnteriorObliqueEmissiveProjection", # CIDs [26], [501] "399273000": "SagittalObliqueAxisEmissiveProjection", # CIDs [26], [501] "399300004": "LateralMedialEmissiveProjection", # CIDs [26], [501] "399012007": "MedialLateralEmissiveProjection", # CIDs [26], [501] "399268006": "MedioLateralObliqueEmissiveProjection", # CIDs [26], [501] "399067008": "LateralProjection", # CIDs [2, ...], [501] "32672002": "StructureOfDescendingThoracicAorta", # [4, ...], [3827, ...] "118378005": "PacemakerPulseGenerator", # CIDs [1000, ...], [6040, ...] "468115008": "Armrest", # CIDs [7151], [7151] "430757002": "PulmonaryVeinGreatVessel", # CIDs [4, ...], [3827, ...] "71836000": "Nasopharyngeal", # CIDs [4, ...], [7601, 8134] "118645006": "BoneStructureOfPelvis", # CIDs [4, ...], [7304, ...] "243898001": "AnatomicalReferencePlane", # CIDs 1217253001 [4, ...], 243898001 [7304, ...] "3138006": "BoneTissue", # CIDs [645, ...], [6202, ...] "399220000": "TransverseBodyPosition", "62824007": "Transverse", "768763008": "GadoliniumContainingProduct", # CIDs [12], [13] "62413002": "RadiusBone", # CIDs [218, ...], [7304, ...] "91727004": "MuscleTissue", # CIDs [6202, ...], [7151, ...] "164854000": "ECGNormal", # CIDs [222, ...], [3230] "55603005": "AdiposeTissue", # CIDs [218, ...], [7151, ...] "399366008": "ObliqueBodyPosition", # CIDs [6, ...], [21] "44808001": "ConductionDisorderOfTheHeart", # CIDs [3201, ...], [3700] "81839001": "AnticoagulantAgent", # CIDs [10], [621] "30492008": "DiureticAgent", # CIDs [10], [621] "372681003": "HaemostaticAgent", # CIDs [10], [621] "372806008": "HistomineReceptorAntagonist", # CIDs [10], [621] "82573000": "LidocaineContainingProduct", # CIDs [10], [623] "373148008": "ThrombolyticAgentContraindicated", # CIDs [3740], [3741] "44241007": "HeartValveStenosis", # CIDs [3711], [3810] "733020007": "SyringeUnit", # CIDs [68], [69] "37058002": "ForeignBodyGiantCellGranuloma", # CIDs [6030, ...], [6054] "119406000": "ThalamusPart", # CIDs [7140], [7151, ...] "19695001": "HypochondriacRegion", # CIDs [4, ...], [5] "129759000": "VascularCalcificationRadiographicFinding", # CIDs [3491, ...], [6010] "442726008": "FindingOfDifferenceInLocation", # CIDs [], [] "442714003": "FindingOfDifferenceInSize", # CIDs [], [] "91747007": "LumenOfBloodVessel", # CIDs [5], [7156] "33252009": "BetaBlockerContainingProduct", # CIDs [3760], [621] "48698004": "CalciumChannelBlockerContainingProduct", # CIDs [3760], [621] "118927008": "ThromboticDisorder", # CIDs [3815], [3805] "354064008": "MethylthioniniumChlorideContainingProduct", # CIDs [4200], [10] "771928002": "AtropineInOcularDoseForm", # CIDs [4208], [10] "399368009": "MedioLateralObliqueProjection", # CIDs [7302], [4014] "422996004": "WolfProjection", # CIDs [7480], [4012] "122456005": "LaserDevice", # CIDs [8125], [8, ...] "441950002": "HistopathologyDepartment", # CIDs [8131], [7030] "13576009": "FetalUmbilicalVein", # CIDs [12140], [4, ...] "439470001": "ArteriovenousFistulaDisorder", # CIDs [12293], [3810] "88619007": "VascularResistanceFunction", # CIDs [12304], [3641] "118538004": "MassQuantity", # CIDs [12304], [6102, ...] "19130008": "TraumaticAbnormalityMorphologic", # Inactive "23583003": "InflammationMorphologic", # Inactive "36060005": "HemangiopericytomaMorphologic", # Inactive "1052201004": "EstrogenReceptorAgonist", "309523001": "ArtificialLensPresent", # CID 4231 "102874004": "PossiblePregnancy_Inactive", "8715000": "HospitalAdmissionElective", # CID 3729 "133943005": "LeftLumbarRegion_Inactive", "133944004": "RightLumbarRegion_Inactive", "76388001": "STSegmentElevation", # CID 3230 "244089006": "SkinOfSideOfNose_Inactive", "252418006": "TransthoracicEchocardiography_Inactive", "258661006": "Slide_Inactive", "261061003": "Bronchial_Inactive", "399260004": "MedioLateralProjection", # CID 7484 "263816006": "Muscular_Inactive", "255052006": "MalignantTumourOfUnknownOrigin", # CID 6055 "118375008": "CardiacSeptumProsthesis", # CID 4 "870406003": "Vasopressor", # CID 621 "385315009": "SuddenOnset", # CID 6130 "49992008": "DexamethasoneSodiumPhosphate_Inactive", "399118008": "LeftLateralEmissiveProjection", # CID 26 "399297009": "RightLateralEmissiveProjection", # CID 26 "404846007": "GadopentetateDimeglumine_Inactive", "330888007": "RoseBengalContainingProduct", # CID 4200 "409105003": "Yttrium90Microspheres_Inactive", "409586006": "Complaint_Inactive", "26141007": "STSegmentDepression", # CID 3230 "445769006": "IntracorpusCavernosumRoute_Inactive", "707009005": "SupernumeraryDeciduousMaxillaryRightSecondMolarTooth_Inactive", "707010000": "SupernumeraryDeciduousMaxillaryRightFirstMolarTooth_Inactive", "707011001": "SupernumeraryDeciduousMaxillaryRightCanineTooth_Inactive", "707012008": "SupernumeraryDeciduousMaxillaryRightLateralIncisorTooth_Inactive", "707013003": "SupernumeraryDeciduousMaxillaryRightCentralIncisorTooth_Inactive", "707014009": "SupernumeraryDeciduousMaxillaryLeftCentralIncisorTooth_Inactive", "707015005": "SupernumeraryDeciduousMaxillaryLeftLateralIncisorTooth_Inactive", "707016006": "SupernumeraryDeciduousMaxillaryLeftCanineTooth_Inactive", "707017002": "SupernumeraryDeciduousMaxillaryLeftFirstMolarTooth_Inactive", "707018007": "SupernumeraryDeciduousMaxillaryLeftSecondMolarTooth_Inactive", "707021009": "SupernumeraryDeciduousMandibularRightSecondMolarTooth_Inactive", "707022002": "SupernumeraryDeciduousMandibularRightFirstMolarTooth_Inactive", "707023007": "SupernumeraryDeciduousMandibularRightCanineTooth_Inactive", "707024001": "SupernumeraryDeciduousMandibularRightLateralIncisorTooth_Inactive", "707025000": "SupernumeraryDeciduousMandibularRightCentralIncisorTooth_Inactive", "707026004": "SupernumeraryDeciduousMandibularLeftCentralIncisorTooth_Inactive", "707028003": "SupernumeraryDeciduousMandibularLeftLateralIncisorTooth_Inactive", "707029006": "SupernumeraryDeciduousMandibularLeftCanineTooth_Inactive", "707030001": "SupernumeraryDeciduousMandibularLeftFirstMolarTooth_Inactive", "707031002": "SupernumeraryDeciduousMandibularLeftSecondMolarTooth_Inactive", "707032009": "SupernumeraryPermanentMaxillaryRightThirdMolarTooth_Inactive", "707033004": "SupernumeraryPermanentMaxillaryRightSecondMolarTooth_Inactive", "707035006": "SupernumeraryPermanentMaxillaryRightFirstMolarTooth_Inactive", "707036007": "SupernumeraryPermanentMaxillaryRightSecondPremolarTooth_Inactive", "707037003": "SupernumeraryPermanentMaxillaryRightFirstPremolarTooth_Inactive", "707038008": "SupernumeraryPermanentMaxillaryRightCanineTooth_Inactive", "707039000": "SupernumeraryPermanentMaxillaryRightLateralIncisorTooth_Inactive", "707041004": "SupernumeraryPermanentMaxillaryRightCentralIncisorTooth_Inactive", "707042006": "SupernumeraryPermanentMaxillaryLeftCentralIncisorTooth_Inactive", "707043001": "SupernumeraryPermanentMaxillaryLeftLateralIncisorTooth_Inactive", "707044007": "SupernumeraryPermanentMaxillaryLeftCanineTooth_Inactive", "707045008": "SupernumeraryPermanentMaxillaryLeftFirstPremolarTooth_Inactive", "707046009": "SupernumeraryPermanentMaxillaryLeftSecondPremolarTooth_Inactive", "707047000": "SupernumeraryPermanentMaxillaryLeftFirstMolarTooth_Inactive", "707048005": "SupernumeraryPermanentMaxillaryLeftSecondMolarTooth_Inactive", "707049002": "SupernumeraryPermanentMaxillaryLeftThirdMolarTooth_Inactive", "707052005": "SupernumeraryPermanentMandibularLeftThirdMolarTooth_Inactive", "707054006": "SupernumeraryPermanentMandibularLeftSecondMolarTooth_Inactive", "707055007": "SupernumeraryPermanentMandibularLeftFirstMolarTooth_Inactive", "707056008": "SupernumeraryPermanentMandibularLeftSecondPremolarTooth_Inactive", "707057004": "SupernumeraryPermanentMandibularLeftFirstPremolarTooth_Inactive", "707058009": "SupernumeraryPermanentMandibularLeftCanineTooth_Inactive", "707059001": "SupernumeraryPermanentMandibularLeftLateralIncisorTooth_Inactive", "707060006": "SupernumeraryPermanentMandibularLeftCentralIncisorTooth_Inactive", "707061005": "SupernumeraryPermanentMandibularRightCentralIncisorTooth_Inactive", "707062003": "SupernumeraryPermanentMandibularRightLateralIncisorTooth_Inactive", "707063008": "SupernumeraryPermanentMandibularRightCanineTooth_Inactive", "707064002": "SupernumeraryPermanentMandibularRightFirstPremolarTooth_Inactive", "707065001": "SupernumeraryPermanentMandibularRightSecondPremolarTooth_Inactive", "707066000": "SupernumeraryPermanentMandibularRightFirstMolarTooth_Inactive", "707067009": "SupernumeraryPermanentMandibularRightSecondMolarTooth_Inactive", "707068004": "SupernumeraryPermanentMandibularRightThirdMolarTooth_Inactive", }, "MDC": { "2:98": "ChestLeadSymmetricPlacement", # CID 3001 "3:3146": "Grade1AVBlock", # CID 3415, 3038 "3:3148": "Grade2AVBlock", # CID 3415, 3038 "7:756": "MusculusAbductorDigitiMinimiHand", # CID 3031 "7:757": "MusculusAbductorDigitiMinimiHandLeft", # CID 3031 "7:758": "MusculusAbductorDigitiMinimiHandRight", # CID 3031 "7:760": "MusculusFlexorDigitiMinimiBrevisHand", # CID 3031 "7:761": "MusculusFlexorDigitiMinimiBrevisHandLeft", # CID 3031 "7:762": "MusculusFlexorDigitiMinimiBrevisHandRight", # CID 3031 "7:968": "MusculusAdductorHallucis", # CID 3031 "7:969": "MusculusAdductorHallucisLeft", # CID 3031 "7:970": "MusculusAdductorHallucisRight", # CID 3031 "7:972": "MusculusAbductorDigitiMinimiFoot", # CID 3031 "7:973": "MusculusAbductorDigitiMinimiFootLeft", # CID 3031 "7:974": "MusculusAbductorDigitiMinimiFootRight", # CID 3031 "7:976": "MusculusFlexorDigitiMinimiBrevisFoot", # CID 3031 "7:977": "MusculusFlexorDigitiMinimiBrevisFootLeft", # CID 3031 "7:978": "MusculusFlexorDigitiMinimiBrevisFootRight", # CID 3031 "10:8624": "PreExcitationBeat", # CID 3415, 3335 "10:8640": "WolfParkinsonWhiteSyndromeLessSpecific", # CID 3415, 3335 "10:8656": "WolfParkinsonTypeAQRSPositiveInV1V2", # CID 3415, 3335 "10:8672": "WolfParkinsonTypeBQRSNegativeInV1V2", # CID 3415, 3335 "10:8688": "LownGanongLevineSyndromeNormalQRS", # CID 3415, 3335 "10:9264": "SinusTachycardiaRhythm", # CID 3415, 3038 "10:9456": "AtrialFlutterRhythm", # CID 3415, 3038 "10:9472": "AtrialFibrillationRhythm", # CID 3415, 3038 "10:10336": "AsystoleRhythm", # CID 3415, 3038 "10:10352": "IrregularRhythmLowHeartRate", # CID 3415, 3038 "10:10432": "BrachycardiaAny", # CID 3415, 3038 }, "DCM": { "109018": "BeatsDetectedAccepted", # CID 3337 "109019": "BeatsDetectedRejected", # CID 3337 "109045": "StartOfAtrialContraction", # CID 3339 "109046": "StartOfAtrialContractionSubsequent", # CID 3339 "110818": "T2StarWeightedDynamicContrastEnhancedMRSignalIntensity", # CID 218 "110806": "T2StarWeightedMRSignalIntensity", # CID 218 "109931": "DINGrayscalePatternBild2", "109932": "DINGeometryPatternBild3", "110012": "TranscriptionOutput", "111103": "Density_Retired", # -> SCT 129793001 "111137": "Ultrasound_Retired", # -> SCT 16310003 "111487": "MammographicCrosshair", # CID 6058 "111488": "MammographicGrid", # CID 6058 "112300": "APPlus45", # CID 7303 "112301": "APMinus45", # CID 7303 "112702": "SlideMicroscopyPathologyImaging", # CID 8131, 29, 30, 33 "113064": "T2Star", # CID 218 "113076": "SegmentationImageDerivation", # CID 7203, 32, 33 "113735": "ExposureTime_Retired", # -> DCM 113824 "113806": "StationaryAcquisitionCT", # CID 10013, 10002 "113853": "IrradiationEventUID_Retired", # -> DCM 113769 "113951": "FilmDetectorType", # CID 10030, 405 "121201": "AreaOutline_Retired", # -> DCM 121056 "126395": "R2Star", # CID 218 "128186": "RTPrescriptionResultForRTTreatmentPlanning", # CID 9510, 7010, 7023 "128304": "OCTAOneSidedRatioLesser", # CID 4270 "128305": "OCTAOneSidedRatioGreater", # CID 4270 "121210": "Path_Retired", # -> DCM 121055 "121213": "PerimeterOutline_Retired", # -> DCM 121057 "121428": "Calculated_Retired", # -> SCT 258090004 "122046": "EquipmentFailure_Retired", # -> DCM 110501 "122383": "EntirePullback", # Mismatched in CID 3487 "122384": "StentedRegion", # Mismatched in CID 3487 "126712": "FlubatineF18_Retired", # -> DCM 126503 "DOC": "DocumentProducer", "FID": "SpatialFiducialsProducer", }, "RADLEX": { "RID50296": "PIRADS1VeryLowLesion", # CID 6328, 6324, 6325 "RID50297": "PIRADS2LowLesion", # CID 6328 6324 6325 "RID50298": "PIRADS3IntermediateLesion", # CID 6328, 6324, 6325 "RID50299": "PIRADS4HighLesion", # CID 6328, 6324, 6325 "RID50300": "PIRADS5VeryHighLesion", # CID 6328, 6324, 6325 "RID50320": "PIRADS_DCENegative", # CID 6332 "RID50321": "PIRADS_DCEPositive", # CID 6332 "RID50323": "PIRADSXInadequateOrAbsentLesion", # CID 6328, 6324, 6325 }, "UCUM": { "/cm": "PerCentimeter", # CIDs 83, 84, 7181 "cm": "Centimeter", # CID 7181 "cm2": "SquareCentimeter", # CID 7181 "/s": "PerSecond", "s": "Second", "mgcm3": "MilligramsPerCubicCentimeter", "mmHg": "MillimetersHg", "mm[Hg]": "MillimetersHg", "kPa": "Kilopascal", "mm": "Millimeter", "mm/s": "MillimeterPerSecond", "mg/ml": "MilligramsPerMilliliter", "mg/cm3": "MilligramsPerCubicCentimeter", "m": "Meter", "um": "Micrometer", "um2/s": "SquareMicrometerPerSecond", "cm2/ml": "SquareCentimeterPerMilliliter", "mm2/s": "SquareMillimeterPerSecond", "um2/ms": "SquareMicrometerPerMillisecond", "umol/min/ml": "MicromolePerMinutePerMilliliter", "ml/g": "MilliliterPerGram", "ml/min/g": "MilliliterPerMinutePerGram", "umol/ml": "MicromolePerMilliliter", "mg/min/ml": "MilligramsPerMinutePerMilliliter", "Bq/ml": "BecquerelsPerMilliliter", "Monitor Units/s": "MonitorUnitsPerSecond", "Gy/s": "GrayPerSecond", "rad/s": "RadiansPerSecond", "uV": "Microvolt", "mV": "Millivolt", "dB[mV]": "DecibelsMillivolt", "dB[uV]": "DecibelsMicrovolt", "km/h": "KilometersPerHour", "[mi_i]/h": "MilesPerHour", "[PRU]/m2": "PRUPerSquareMeter", "/min": "PerMinute", "cm/s": "CentimeterPerSecond", "10-6.mm2/s": "_10EMinus6SquareMillimetersPerSecond", "MeV": "MegaElectronVolt", "{MU}/s": "MonitorUnitsPerSecond", "mmol/kg{WetWeight}": "MillimolesPerKilogramWetWeight", }, "LN": { "18015-8": "AorticRootAnnuloAorticJunctionDiameter", # CID 12300, 12212 "79967-6": "InferiorVenaCavaDiameterAtEndExpiration", # CIDs 12300, 12215 "79987-4": "LeftPulmonaryArteryDiameterAtEndSystole", # CID 12300, 12210 "80009-4": "LeftVentricularInternalDiastolicDimensionByUSMModeBSA", # CID 12300 "80010-2": "LeftVentricularInternalDiastolicDimensionByUS2DBSA", # CID 12300 "80013-6": "LeftVentricularInternalSystolicDimensionByUSMModeBSA", # CID 12300 "80014-4": "LeftVentricularInternalSystolicDimensionByUS2DBSA", # CID 12300 "80031-8": "LeftVentricularPosteriorWallDiastolicThicknessByUSMMode", # CID 12300 "80032-6": "LeftVentricularPosteriorWallDiastolicThicknessByUS2D", # CID 12300 "80033-4": "LeftVentricularPosteriorWallSystolicThicknessByUSMMode", # CID 12300 "80034-2": "LeftVentricularPosteriorWallSystolicThicknessByUS2D", # CID 12300 "80049-0": "MainPulmonaryArteryDiameterAtEndSystole", # CID 12300, 12210 "80079-7": "RightPulmonaryArteryDiameterAtEndSystole", # CID 12300, 12210 }, } def camel_case(s): leave_alone = ( "mm", "cm", "km", "um", "ms", # 'us'?-doesn't seem to be there "ml", "mg", "kg", ) # ... probably need others return "".join( word.capitalize() if word != word.upper() and word not in leave_alone else word for word in re.split(r"\W", s, flags=re.UNICODE) if word.isalnum() ) def keyword_from_meaning(name): """Return a camel case valid python identifier""" # Try to adhere to keyword scheme in DICOM (CP850) # singular/plural alternative forms are made plural # e.g., “Physician(s) of Record” becomes “PhysiciansOfRecord” kw = name.replace("(s)", "s") # “Patient’s Name” -> “PatientName” # “Operators’ Name” -> “OperatorsName” kw = kw.replace("’s ", " ") kw = kw.replace("'s ", " ") kw = kw.replace("s’ ", "s ") kw = kw.replace("s' ", "s ") # Mathematical symbols kw = kw.replace("%", " Percent ") kw = kw.replace(">", " Greater Than ") kw = kw.replace("=", " Equals ") kw = kw.replace("<", " Lesser Than ") kw = kw.replace("_", " ") kw = re.sub(r"([0-9]+)\.([0-9]+)", "\\1 Point \\2", kw) kw = re.sub(r"\s([0-9.]+)-([0-9.]+)\s", " \\1 To \\2 ", kw) kw = re.sub(r"([0-9]+)day", "\\1 Day", kw) kw = re.sub(r"([0-9]+)y", "\\1 Years", kw) # Remove category modifiers, such as "(specimen)", "(procedure)", # "(body structure)", etc. kw = re.sub(r"^(.+) \([a-z ]+\)$", "\\1", kw) kw = camel_case(kw.strip()) # Python variables must not begin with a number. if re.match(r"[0-9]", kw): kw = "_" + kw if kw == "None": kw = "None_" if not kw.isidentifier() or iskeyword(kw): raise ValueError(f"Invalid keyword '{kw}' generated from '{name}'") return kw def setup_logger(debug_level=logging.INFO) -> None: """Setup the logging.""" LOGGER = logging.getLogger(__name__) # Ensure only have one StreamHandler LOGGER.handlers = [] handler = logging.StreamHandler() LOGGER.setLevel(debug_level) formatter = logging.Formatter("%(levelname).1s: %(message)s") handler.setFormatter(formatter) LOGGER.addHandler(handler) def download_fhir_value_sets(local_dir: Path) -> None | str: """Log into the DICOM FTP server and download the zip file containing the FHIR JSON files. Parameters ---------- local_dir : pathlib.Path The directory where the zip file will be written to, as ``local_dir/version/*.zip``. Returns ------- str | None If the download failed then returns ``None``, otherwise returns the DICOM version as :class:`str`. """ LOGGER.debug(f" Logging into FTP server: {FTP_HOST}") ftp = ftplib.FTP(FTP_HOST, timeout=60) ftp.login("anonymous") version = None try: LOGGER.debug(f" Searching contents of '{FTP_PATH}' for JSON ZIP file") for remote_path in ftp.nlst(FTP_PATH): LOGGER.debug(f" {remote_path}") match = FTP_FHIR_REGEX.match(remote_path) if match: LOGGER.debug(" Found FHIR JSON ZIP file, downloading...") with BytesIO() as fp: ftp.retrbinary(f"RETR {remote_path}", fp.write) data = fp.getvalue() version = match.group("version") (local_dir / version).mkdir(parents=True, exist_ok=True) local_path = local_dir / version / Path(remote_path).name LOGGER.debug(f" Writing data to {local_path}") with open(local_path, "wb") as f: f.write(data) break finally: ftp.quit() return version def extract_cid_files(path: Path, version: str, cid_folder="CIDs") -> None: """Extract the JSON files in the downloaded ZIP file to ``path / cid_folder``. Parameters ---------- path : pathlib.Path The base directory. version : str The name of the version subdirectory containing the ZIP file. cid_folder : str, optional The name of the subdirectory the CID files will be extracted to, default ``CIDs``. """ files = list((path / version).glob("*.zip")) if not files: raise ValueError(f"No zip files found in {path / version}") if len(files) > 1: raise ValueError(f"Multiple zip files found in {path / version}") # Create the output directory (if it doesn't already exist) cid_dir = path / cid_folder cid_dir.mkdir(parents=True, exist_ok=True) LOGGER.debug(f" Extracting FHIR JSON files to {cid_dir}") with zipfile.ZipFile(files[0]) as z: # Forcibly flatten the ZIP contents into the `cid_folder` for zip_path in (Path(x) for x in z.namelist()): with open(cid_dir / zip_path.name, "wb") as f: f.write(z.read(str(zip_path))) def extract_table_data( path: Path, version: str, ext: tuple[str, ...] = (".htm", ".html") ) -> list[bytes]: """Extract the table data from the downloaded HTML files. Parameters ---------- path : pathlib.Path The base directory. version : str The name of the version subdirectory containing the HTML files. ext : str, optional The extension of the downloaded HTML files. """ files = [p for p in (path / version).iterdir() if p.suffix in ext] if len(files) != 2: raise ValueError( f"The Part 16, Chapter D and O HTML files were not found in {path / version}" ) # Chapter D # # # # D DICOM Controlled Terminology Definitions (Normative) # Chapter O # # # # O SNOMED Concept ID to SNOMED ID Mapping data = [None, None] for html_file in files: with open(html_file, "rb") as f: file_data = f.read() root = ET.fromstring(file_data, parser=ET.XMLParser(encoding="utf-8")) for element in root.iter(): if element.tag.endswith("title"): title = element.text if title.startswith("D"): data[0] = file_data elif title.startswith("O"): data[1] = file_data break if None in data: raise ValueError("One or both HTML files do not contain the expected data") return data def _get_text(element) -> str: return "".join(element.itertext()).strip() def get_table_o1(data: bytes) -> list[tuple[str, str, str]]: """Return a list of SNOMED-CT to SNOMED RT mappings. Returns ------- list[tuple[str, str, str]] A list of (SCT, SRT, SNOMED Fully Specified Name) generated from Table O-1 in Part 16 of the DICOM Standard. """ LOGGER.info("Download and process SNOMED mappings from Part 16, Table O-1") root = ET.fromstring(data, parser=ET.XMLParser(encoding="utf-8")) namespaces = {"w3": root.tag.split("}")[0].strip("{")} body = root.find("w3:body", namespaces=namespaces) table = body.findall(".//w3:tbody", namespaces=namespaces)[0] rows = table.findall("./w3:tr", namespaces=namespaces) table_data = [ ( _get_text(row[0].findall(".//w3:p", namespaces=namespaces)[-1]), _get_text(row[1].findall(".//w3:p", namespaces=namespaces)[0]), _get_text(row[2].findall(".//w3:p", namespaces=namespaces)[0]), ) for row in rows ] return table_data def get_table_d1(data: bytes) -> list[tuple[str, str]]: """Return a list of DICOM code values to code meaning mappings. Returns ------- list[tuple[str, str]] A list of (Code Value, Code Meaning) generated from Table D-1 in Part 16 of the DICOM Standard. """ LOGGER.info("Processing Part 16, Table D-1") root = ET.fromstring(data, parser=ET.XMLParser(encoding="utf-8")) namespaces = {"w3": root.tag.split("}")[0].strip("{")} body = root.find("w3:body", namespaces=namespaces) table = body.findall(".//w3:tbody", namespaces=namespaces)[0] rows = table.findall("./w3:tr", namespaces=namespaces) return [ ( _get_text(row[0].findall(".//w3:p", namespaces=namespaces)[0]), _get_text(row[1].findall(".//w3:p", namespaces=namespaces)[0]), ) for row in rows ] def write_concepts( concepts: dict[str, dict[str, dict[str, tuple[str, list[int]]]]], cid_lists: dict[int, dict[str, list[str]]], name_for_cid: dict[int, str], ) -> None: """Write. Parameters ---------- concepts : dict[str, dict[str, dict[str, tuple[str, list[int]]]]] A :class:`dict` containing the concept schemes and their contents as ``concepts[scheme_designator][keyword] = {code: (display, [cid, ...])}`` cid_lists : dict[int, dict[str, list[str]]] The schemes and code keywords for each CID ID as name_for_cid : dict[int, str] A :class:`dict:` mapping CID IDs their name. """ # Write the concepts dict path = SR_DIRECTORY / "_concepts_dict.py" LOGGER.info(f"Writing concepts to '{path}'") lines = DOC_LINES + [ "# Dict with scheme designator keys; value format is:\n", "# {keyword: {code1: (meaning, cid_list), code2: ...}\n", "#\n", "# Most keyword identifiers map to a single code, but not all\n", "\n", ] with open(path, "w", encoding="UTF8") as f: f.writelines(lines) f.write("concepts = {}\n") # start with empty dict for scheme, value in concepts.items(): f.write(f"\nconcepts['{scheme}'] = \\\n") pprint(value, f, width=200) # Write the CID dict path = SR_DIRECTORY / "_cid_dict.py" LOGGER.info(f"Writing CIDs to '{path}'") lines = DOC_LINES + [ "# Dict with cid number as keys; value format is:\n", "# {scheme designator: \n", "# scheme_designator: ...}\n", "\n", ] with open(path, "w", encoding="UTF8") as f: f.writelines(lines) f.write("name_for_cid = {}\n") f.write("cid_concepts = {}\n") for cid, value in cid_lists.items(): f.write(f"\nname_for_cid[{cid}] = '{name_for_cid[cid]}'\n") f.write(f"cid_concepts[{cid}] = \\\n") pprint(value, f) def write_snomed_mapping(snomed_codes: list[tuple[str, str, str]]) -> None: """Write the SNOMED-CT <-> SNOMED RT mapping dict to ``_snomed_dict.py``.""" path = SR_DIRECTORY / "_snomed_dict.py" LOGGER.info(f"Writing SNOMED-CT to RT mappings to '{path}'") with open(path, "w", encoding="UTF8") as f: lines = DOC_LINES + [ "# Dict with scheme designator keys; value format is:\n", "# {concept_id1: snomed_id1, concept_id2: ...}\n", "# or\n", "# {snomed_id1: concept_id1, snomed_id2: ...}\n", "\n", ] f.writelines(lines) f.write("mapping = {}\n") # Write the SCT -> SRT mapping f.write("\nmapping['SCT'] = {\n") for sct, srt, _ in snomed_codes: f.write(f" '{sct}': '{srt}',\n") f.write("}\n") # Write the SRT -> SCT mapping f.write("\nmapping['SRT'] = {\n") for sct, srt, _ in snomed_codes: f.write(f" '{srt}': '{sct}',\n") f.write("}") def setup_argparse(): parser = argparse.ArgumentParser( description=("Update the sr/ code and concepts dictionaries"), usage="generate_concept_dicts.py path [options]", ) opts = parser.add_argument_group("Options") opts.add_argument( "path", help="The path to download the JSON CID files to", type=str, ) opts.add_argument( "--download", help="Download the FHIR JSON CID files", action="store_true", ) opts.add_argument( "--cid-directory", help="The name of the directory where the CID should be located", type=str, default="CIDs", ) opts.add_argument( "--version", help="The version of the downloaded CID ZIP file", type=str, ) opts.add_argument( "--debug", help="Set logging to debug mode", action="store_true", default=False, ) return parser.parse_args() def process_files(cid_directory: Path, snomed_mapping, dicom_mapping) -> None: LOGGER.info(f"Processing the CID JSON files in {cid_directory}") # Mapping of: # Scheme: Keywords # Keyword: Codes # Code: (Display, [CIDs containing the code]) # concepts[scheme_designator][name] = {code: (display, [cid])} concepts: dict[str, dict[str, dict[str, tuple[str, list[int]]]]] = {} # The schemes and code keywords for each CID ID cid_lists: dict[int, dict[str, list[str]]] = {} # Mapping of CID ID to CID name name_for_cid: dict[int, str] = {} # Mapping code <-> keyword(s) kw_codes = {} cid_paths = sorted( cid_directory.glob("*.json"), key=lambda x: int(x.name.split("-")[3]) ) for path in cid_paths: LOGGER.debug(f" Processing '{path.name}'") with open(path, "rb") as f: data = json.loads(f.read()) cid = int(CID_ID_REGEX.match(data["id"]).group(1)) name_for_cid[cid] = data["name"] # A mapping of scheme to a list of code keywords cid_concepts: dict[str, list[str]] = {} for group in data["compose"]["include"]: system = group["system"] try: scheme_designator = FHIR_SYSTEM_TO_DICOM_SCHEME_DESIGNATOR[system] except KeyError: raise NotImplementedError( "The DICOM scheme designator for the following FHIR system " f"has not been specified: {system}" ) if scheme_designator not in concepts: concepts[scheme_designator] = {} if scheme_designator not in kw_codes: kw_codes[scheme_designator] = {} for concept in group["concept"]: code = concept["code"].strip() # Fix incorrect code in CID4412 if cid == 4412 and code == "7539900": code = "75399008" # Fix incorrect code value in CID 6337 if cid in (6337, 6335, 6336): if code == "Focal abnormality": code = "130591" elif code == "Non-focal abnormality": code = "130592" display = concept["display"].strip() try: code_keyword = KEYWORD_FIXES[scheme_designator][code] except KeyError: code_keyword = keyword_from_meaning(concept["display"]) if not code_keyword.isidentifier() or iskeyword(code_keyword): raise ValueError( f"Invalid keyword '{code_keyword}' generated from '{display}'" ) # Check each keyword matches only one code in a given scheme codes = kw_codes[scheme_designator].setdefault(code_keyword, []) codes.append(code) if len(set(codes)) > 1: previous = concepts[scheme_designator][code_keyword] current = {code: (display, [cid])} current.update(previous) LOGGER.error( f" {scheme_designator}: keyword '{code_keyword}' is being " f"used for different codes {current}" ) # If new code_keyword under this scheme, start dict of codes/cids that use that code if code_keyword not in concepts[scheme_designator]: concepts[scheme_designator][code_keyword] = {code: (display, [cid])} else: prior = concepts[scheme_designator][code_keyword] if code in prior: prior[code][1].append(cid) else: prior[code] = (display, [cid]) if prior[code][0].lower() != display.lower(): # Multiple 'display' values for the same code found LOGGER.info( f" Found multiple 'display' values for code {code} in " f"scheme {scheme_designator}: CID{cid}: '{display}', " f"previously '{prior[code][0]}'" ) # Keep track of this cid referencing that code_keyword if scheme_designator not in cid_concepts: cid_concepts[scheme_designator] = [] # Same keyword is being used for different codes in the same scheme if code_keyword in cid_concepts[scheme_designator]: previous = concepts[scheme_designator][code_keyword] LOGGER.error( f" {scheme_designator}: keyword '{code_keyword}' is being " f"used for different codes {previous}" ) cid_concepts[scheme_designator].append(code_keyword) cid_lists[cid] = cid_concepts duplicates = False LOGGER.debug("Applying SCT mappings to the concepts") scheme_designator = "SCT" for code, srt_code, meaning in snomed_mapping: try: name = KEYWORD_FIXES[scheme_designator][code] except KeyError: name = keyword_from_meaning(meaning) if name not in concepts[scheme_designator]: concepts[scheme_designator][name] = {code: (meaning, [])} else: previous = concepts[scheme_designator][name] if code not in previous: previous[code] = (meaning, []) duplicates = True LOGGER.error( f" {scheme_designator}: keyword '{name}' is being " f"used for different codes {previous}" ) LOGGER.debug("Applying DCM mappings to the concepts") scheme_designator = "DCM" for code, meaning in dicom_mapping: # 2024b has row with ellipses after 113270 for some reason if code == "..." or meaning == "...": continue try: name = KEYWORD_FIXES[scheme_designator][code] except KeyError: name = keyword_from_meaning(meaning) if name not in concepts[scheme_designator]: concepts[scheme_designator][name] = {code: (meaning, [])} else: previous = concepts[scheme_designator][name] if code not in previous: previous[code] = (meaning, []) duplicates = True LOGGER.error( f" {scheme_designator}: keyword '{name}' is being " f"used for different codes {previous}" ) for scheme in kw_codes: for codes in kw_codes[scheme].values(): if len(set(codes)) != 1: duplicates = True if duplicates: raise ValueError("Each keyword must correspond to one and only one code") return concepts, cid_lists, name_for_cid if __name__ == "__main__": args = setup_argparse() level = logging.DEBUG if args.debug else logging.ERROR setup_logger(level) path = Path(args.path).resolve() if not path.exists(): path.mkdir(parents=True, exist_ok=True) elif not path.is_dir(): raise ValueError("'path' must be a path to a directory") if args.download: # Download the ZIP file containing the JSON data LOGGER.info(f"Downloading CID files to {path / args.cid_directory}") version = download_fhir_value_sets(path) if version: extract_cid_files(path, version, args.cid_directory) else: LOGGER.error("Failed to download the CID files") LOGGER.info(f"Downloading Part 16, Chapters D and O to {path / version}") snomed_data = urllib_request.urlopen(P16_TO1_URL).read() with open(path / version / "Table_O1.html", "wb") as f: f.write(snomed_data) dicom_data = urllib_request.urlopen(P16_TD1_URL).read() with open(path / version / "Table_D1.html", "wb") as f: f.write(dicom_data) elif args.version: # Use the already downloaded ZIP file extract_cid_files(path, args.version, args.cid_directory) # Parse the already downloaded HTM files dicom_data, snomed_data = extract_table_data(path, args.version) # Process the data files snomed_mapping = get_table_o1(snomed_data) dicom_mapping = get_table_d1(dicom_data) concepts, cid_lists, name_for_cid = process_files( path / args.cid_directory, snomed_mapping, dicom_mapping ) # Write the results write_concepts(concepts, cid_lists, name_for_cid) write_snomed_mapping(snomed_mapping) pydicom-pydicom-20aa4b7/util/generate_dict/000077500000000000000000000000001515706620200210005ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/util/generate_dict/generate_dicom_dict.py000066400000000000000000000267161515706620200253360ustar00rootroot00000000000000#!/usr/bin/env python # Encoding required to deal with 'micro' character """ Create the _dicom_dict.py DICOM dictionary file from the Standard. Reformat The DICOM dictionary PS3.6 and PS3.7 docbook xml files (from e.g. standard docs) to Python syntax. DicomDictionary --------------- Write the main DICOM dictionary elements as a python dict called `main_attributes` with format: Tag: ('VR', 'VM', "Name", 'is_retired', 'Keyword') Where: * Tag is a 32-bit representation of the group, element as 0xggggeeee (e.g. 0x00181600) * VR is the Value Representation (e.g. 'OB' or 'OB or UI' or 'NONE') * VM is the Value Multiplicity (e.g. '1' or '2-2n' or '3-n' or '1-32') * Name is the DICOM Element Name (or Message Field for Command Elements) (e.g. 'Tomo Time' or 'Retired-blank' or 'Time Source') * is_retired is '' if not retired, 'Retired' otherwise (e.g. '' or 'Retired') * Keyword is the DICOM Keyword (e.g. 'TomoTime' or 'TimeSource') The results are sorted in ascending order of the Tag. RepeatersDictionary ------------------- Also write the repeating groups or elements (e.g. group "50xx") as a python dict called `mask_attributes` as masks that can be tested later for tag lookups that didn't work using format: 'Tag': ('VR', 'VM', "Name", 'is_retired', 'Keyword') Where: * Tag is a string representation of the element (e.g. '002031xx' or '50xx0022') The results are sorted in ascending order of the Tag. Based on Rickard Holmberg's docbook_to_dict2013.py. """ import argparse import itertools import os from pathlib import Path import xml.etree.ElementTree as ET import urllib.request as urllib2 from pydicom import _version from pydicom.values import converters _PKG_DIRECTORY = Path(__file__).parent.parent.parent / "src" / "pydicom" PYDICOM_DICT_FILENAME = _PKG_DIRECTORY / "_dicom_dict.py" MAIN_DICT_NAME = "DicomDictionary: dict[int, tuple[str, str, str, str, str]]" MASK_DICT_NAME = "RepeatersDictionary: dict[str, tuple[str, str, str, str, str]]" BR = "{http://docbook.org/ns/docbook}" def write_dict(fp, dict_name, attributes, tag_is_string): """Write the `dict_name` dict to file `fp`. Parameters ---------- fp : file The file to write the dict to. dict_name : str The name of the dict variable. attributes : list of str List of attributes of the dict entries. tag_is_string : bool If the tag is a string (as it is for the RepeatersDictionary) """ tag_content = """('{VR}', '{VM}', "{Name}", '{Retired}', '{Keyword}')""" if tag_is_string: entry_format = f"'{{Tag}}': {tag_content}" else: entry_format = f"{{Tag}}: {tag_content}" fp.write(f"\n{dict_name} = {{\n ") fp.write(",\n ".join(entry_format.format(**attr) for attr in attributes)) fp.write("\n}\n") def parse_header(header_row): """Parses the table's thead/tr row, header_row, for the column headers The header_row should be ... Which leaves the following: Header 1 Header 2 etc... Note that for the part06 tables the last col header (Retired) is: Parameters ---------- header_row The XML for the header row of the table Returns ------- field_names : list of str A list of the field header names used in the table """ field_names = [] for x in header_row.iter(f"{BR}th"): # If there is an emphasis tag under the para tag then its # text is the column header if x.find(f"{BR}para").find(f"{BR}emphasis") is not None: # noqa col_label = x.find(f"{BR}para").find(f"{BR}emphasis").text # noqa field_names.append(col_label) # If there isn't an emphasis tag under the para tag then it # must be the Retired header else: field_names.append("Retired") return field_names def parse_row(field_names, row): """Parses the table's tbody tr row, row, for the Element data. The row should be ... Which leaves the following: Value 1 Value 2 etc... Some rows are Value 1 Value 2 etc... There are also some without text values Parameters ---------- field_names : list of str The field header names row The XML for the row to parse Returns ------- dict {header1 : val1, header2 : val2, ...} representing the information for the row. """ cell_values = [] for cell in row.iter(f"{BR}para"): # If we have an emphasis tag under the para tag value = cell.find(f"{BR}emphasis") if value is not None: # If there is a text value add it, otherwise add "" if value.text is not None: # 200b is a zero width space cell_values.append(value.text.strip().replace("\u200b", "")) else: cell_values.append("") # Otherwise just grab the para tag text else: if cell.text is not None: cell_values.append(cell.text.strip().replace("\u200b", "")) else: cell_values.append("") return {k: v for k, v in zip(field_names, cell_values)} def parse_docbook_table(book_root, caption): """Parses the XML `book_root` for the table with `caption`. Parameters ---------- book_root The XML book root caption : str The caption of the table to parse Returns ------- row_attrs : list of dict A list of the Element dicts generated by parsing the table. """ for table in book_root.iter(f"{BR}table"): # Find the table in book_root with caption if table.find(f"{BR}caption").text == caption: # Get the column headers element = table.find(f"{BR}thead").find(f"{BR}tr") field_names = parse_header(element) # Get all the Element data from the table return [ parse_row(field_names, row) for row in table.find(f"{BR}tbody").iter(f"{BR}tr") ] def setup_argparse(): parser = argparse.ArgumentParser( description=( "Generate a new _dicom_dict.py file from Parts 6 and 7 of the " "DICOM Standard" ), usage="generate_dicom_dict.py [options]", ) opts = parser.add_argument_group("Options") opts.add_argument( "--local", help=( "The path to the directory containing the XML files (used instead " "of downloading them)" ), type=str, ) return parser.parse_args() if __name__ == "__main__": args = setup_argparse() USE_DOWNLOAD = True if args.local: USE_DOWNLOAD = False attrs = [] if not USE_DOWNLOAD: local_dir = Path(args.local) part_06 = (local_dir / "part06.xml").resolve(strict=True) part_07 = (local_dir / "part07.xml").resolve(strict=True) else: url = "https://dicom.nema.org/medical/dicom/current/source/docbook" url_06 = f"{url}/part06/part06.xml" url_07 = f"{url}/part07/part07.xml" print(f"Downloading '{url_06}'") part_06 = urllib2.urlopen(url_06) print(f"Downloading '{url_07}'") part_07 = urllib2.urlopen(url_07) print("Downloads complete, processing...") # The public and repeating group elements - Part 6 tree = ET.parse(part_06) root = tree.getroot() # Check the version is up to date dcm_version = root.find(f"{BR}subtitle") dcm_version = dcm_version.text.split()[2] lib_version = getattr(_version, "__dicom_version__", None) if lib_version != dcm_version: print( "Warning: 'pydicom._version.__dicom_version__' needs to be " f"updated to '{dcm_version}'" ) title = "Registry of DICOM" attrs += parse_docbook_table(root, f"{title} Data Elements") attrs += parse_docbook_table(root, f"{title} File Meta Elements") attrs += parse_docbook_table(root, f"{title} Directory Structuring Elements") # Get the Command Group elements (0000,eeee) - Part 7 tree = ET.parse(part_07) root = tree.getroot() command_attrs = parse_docbook_table(root, "Command Fields") for attr in command_attrs: attr["Name"] = attr["Message Field"] attr["Retired"] = "" retired_command_attrs = parse_docbook_table(root, "Retired Command Fields") for attr in retired_command_attrs: attr["Name"] = attr["Message Field"] attr["Retired"] = "Retired" attrs += command_attrs attrs += retired_command_attrs # Create the dictionary attrs = sorted(attrs, key=lambda x: x["Tag"]) main_attributes = [] mask_attributes = [] for attr in attrs: group, elem = attr["Tag"][1:-1].split(",") # e.g. (FFFE,E000) if attr["VR"] == "See Note": attr["VR"] = "NONE" # e.g. (0018,1153), (0018,8150) and (0018,8151) # SyntaxError without encoding statement # replace micro symbol attr["Name"] = attr["Name"].replace("µ", "u") # some new tags don't have the retired entry (2019) if "Retired" not in attr: attr["Retired"] = "" # e.g. (0014,0023) and (0018,9445) elif attr["Retired"] in ["RET", "RET - See Note"]: attr["Retired"] = "Retired" # since 2019 the year is added, e.g. RET(2007) elif attr["Retired"].startswith("RET ("): attr["Retired"] = "Retired" # e.g. (0008,0102), (0014,0025), (0040,A170) elif attr["Retired"] in ["DICOS", "DICONDE", "See Note"]: attr["Retired"] = "" # e.g. (0028,1200) attr["VM"] = attr["VM"].split(" or ")[0] # If blank then add dummy vals # e.g. (0018,9445) and (0028,0020) if attr["VR"] == "" and attr["VM"] == "": attr["VR"] = "OB" attr["VM"] = "1" attr["Name"] = "Retired-blank" # handle retired 'repeating group' tags # e.g. (50xx,eeee) or (gggg,31xx) if "x" in group or "x" in elem: attr["Tag"] = group + elem mask_attributes.append(attr) else: attr["Tag"] = f"0x{group}{elem}" main_attributes.append(attr) with open(PYDICOM_DICT_FILENAME, "w") as f: f.write( '"""DICOM data dictionary auto-generated by ' f'{os.path.basename(__file__)}"""\n\n' ) f.write("# Each dict entry is Tag: (VR, VM, Name, Retired, Keyword)") write_dict(f, MAIN_DICT_NAME, main_attributes, tag_is_string=False) write_dict(f, MASK_DICT_NAME, mask_attributes, tag_is_string=True) nr_tags = len(main_attributes) + len(mask_attributes) print(f"Processing completed, wrote {nr_tags} tags") print("Checking that all VRs are supported...") for attr in itertools.chain(main_attributes, mask_attributes): vr = attr["VR"] tag = attr["Tag"] try: # (FFFE,E000), (FFFE,E00D) and (FFFE,E0DD) have no VR assert vr in converters or vr == "NONE" except AssertionError: print(f"Warning: the VR '{vr}' for tag {tag} is not implemented") print("VR checks complete") pydicom-pydicom-20aa4b7/util/generate_dict/generate_private_dict.py000066400000000000000000000140521515706620200257030ustar00rootroot00000000000000"""Update the _private_dict.py file using data from the GDCM private dict.""" import xml.etree.ElementTree as ET from urllib.request import urlopen from pathlib import Path from collections import defaultdict import sys from pydicom.valuerep import VR GDCM_PRIVATE_DICT = ( r"https://raw.githubusercontent.com/malaterre/GDCM/" r"master/Source/DataDictionary/privatedicts.xml" ) PYDICOM_DICT_NAME = ( "private_dictionaries: dict[str, dict[str, tuple[str, str, str, str]]]" ) _PKG_DIRECTORY = Path(__file__).parent.parent.parent / "src" / "pydicom" PYDICOM_DICT_FILENAME = _PKG_DIRECTORY / "_private_dict.py" PYDICOM_DICT_DOCSTRING = """DICOM private dictionary auto-generated by generate_private_dict.py. Data generated from GDCM project\'s private dictionary. The outer dictionary key is the Private Creator name ("owner"), while the inner dictionary key is a map of DICOM tag to (VR, VM, name, is_retired). """ # Manual additions for the autogenerated dict ADDITIONS = { "ELSCINT1": { # Philips Access CT DICOM Conformance Statement (May 2015) "00E11021": ("DS", "1", "DLP"), "00E11037": ("DS", "1", "Total Saving Dose"), "00E1103E": ("IS", "1", "Split Is Dual Surview"), "00E11050": ("DS", "1", "Acquisition Duration"), "00E110C4": ("DS", "1", "Abs Bed Pos"), "01E11017": ("UI", "1", "ECG Reference UID"), "01E11026": ("CS", "1", "Phantom Type"), "01F11001": ("CS", "1", "Acquisition Type"), "01F11002": ("CS", "1", "Resolution"), "01F11004": ("CS", "1", "Angular Sampling"), "01F11008": ("DS", "1", "Scan Length"), "01F1100C": ("DS", "1", "Scanner Relative Center"), "01F1100E": ("FL", "1", "Recon Enhancement"), "01F11026": ("FD", "1", "Pitch"), "01F11027": ("DS", "1", "Rotation Time"), "01F11028": ("DS", "1", "Table Increment"), "01F11032": ("CS", "1", "View Convention"), "01F11033": ("DS", "1", "Cycle Time"), "01F11041": ("LO", "1", "Gating Delay"), "01F11045": ("IS", "1", "Initial Heart Rate"), "01F11049": ("DS", "1", "Planned mAs"), "01F1104B": ("SH", "1", "Collimation"), "01F1104C": ("SH", "1", "DOSE Right DOM"), "01F1104D": ("SH", "1", "Adaptive Filter"), "01F1104E": ("SH", "1", "Scan Type"), "01F7109B": ("IS", "1", "iDose Level"), "01F91001": ("LO", "1", "Mar Filter"), "01F91002": ("DS", "1", "Recon Increment"), "01F91003": ("DS", "1", "CTDIw"), "01F91004": ("IS", "1", "Couch Direction"), "01F91005": ("IS", "1", "Series No In Acquisition"), "01F91007": ("SH", "1", "Dose Right ACS"), "01F91008": ("DS", "1", "Left DMS Tmp Diff"), "01F91009": ("DS", "1", "Right DMS Tmp Diff"), "01F91010": ("LO", "1", "Dose Right Noise"), "01F91011": ("DS", "1", "Zero Position"), "01F91012": ("DS", "1", "Show Couch Position"), "01F91013": ("IS", "1", "Recon Mode"), "01F91014": ("DS", "1", "Water Size"), "01F91015": ("DS", "1", "Digital Tilt"), "01F91016": ("DS", "1", "Scan Arc"), }, } def parse_private_docbook(doc_root): """Return a dict containing the private dictionary data""" # Excerpt for understanding formatting, from GDCM file taken 2023-09 # # # # ...first "xx" element # # ...last element # # entries = defaultdict(dict) for entry in root: owner = entry.attrib["owner"] tag = entry.attrib["group"].upper() + entry.attrib["element"].upper() tag = tag.replace("XX", "xx") vr = entry.attrib["vr"] vm = entry.attrib["vm"] name = entry.attrib["name"].replace("\\", "\\\\") # escape backslashes # Check VR for conformance try: VR(vr) except Exception: print(f"Invalid VR found for {owner} {tag}: {vr}") if "_" in vr: vr = vr.replace("_", " or ") print(f" Replacing VR with {vr}") else: sys.exit() # Convert unknown element names to 'Unknown' if name == "?": name = "Unknown" entries[owner][tag] = (vr, vm, name) return entries def write_dict(fp, dict_name, dict_entries): """Write the `dict_name` dict to file `fp`. Dict Format ----------- private_dictionaries = { 'CREATOR_1' : { '0029xx00': ('US', '1', 'Unknown', ''), '0029xx01': ('US', '1', 'Unknown', ''), }, ... 'CREATOR_N' : { '0029xx00': ('US', '1', 'Unknown', ''), '0029xx01': ('US', '1', 'Unknown', ''), }, } Parameters ---------- fp : file The file to write the dict to. dict_name : str The name of the dict variable. attributes : list of str List of attributes of the dict entries. """ fp.write(f"\n{dict_name} = {{\n") for owner in sorted(dict_entries): fp.write(f" '{owner}': {{\n") for tag in sorted(dict_entries[owner]): vr, vm, name = dict_entries[owner][tag] quote = '"' if "'" in name else "'" fp.write( f""" '{tag}': ('{vr}', '{vm}', {quote}{name}{quote}, ''),\n""" ) fp.write(" },\n") fp.write("}\n") if __name__ == "__main__": with urlopen(GDCM_PRIVATE_DICT) as response: root = ET.fromstring(response.read().decode("utf-8")) entries = parse_private_docbook(root) for creator in ADDITIONS: entries[creator].update(ADDITIONS[creator]) with open(PYDICOM_DICT_FILENAME, "w", encoding="utf8") as py_file: py_file.write('"""' + PYDICOM_DICT_DOCSTRING + '"""') py_file.write("\n\n") write_dict(py_file, PYDICOM_DICT_NAME, entries) pydicom-pydicom-20aa4b7/util/generate_dict/generate_uid_dict.py000066400000000000000000000164131515706620200250150ustar00rootroot00000000000000#!/usr/bin/env python """ Reformat the UID list (tables A-1 and A-2) from the PS3.6 docbook file to Python syntax. Write the dict element as: UID: (name, type, info, is_retired, keyword) * info is extra information extracted from very long names, e.g. which bit size a particular transfer syntax is default for * is_retired is 'Retired' if true, else '' Based on Rickard Holmberg's docbook_to_uiddict2013.py. """ import argparse import os from pathlib import Path from urllib import request import xml.etree.ElementTree as ET from pydicom import _version _PKG_DIRECTORY = Path(__file__).parent.parent.parent / "src" / "pydicom" PYDICOM_DICT_FILENAME = _PKG_DIRECTORY / "_uid_dict.py" DICT_NAME = "UID_dictionary" BR = "{http://docbook.org/ns/docbook}" def write_dict(fp, dict_name, attributes): """Write the `dict_name` dict to file `fp`. Parameters ---------- fp : file The file to write the dict to. dict_name : str The name of the dict variable. attributes : list of str List of attributes of the dict entries. """ uid_entry = ( "'{UID Value}': ('{UID Name}', '{UID Type}', '{UID Info}', '{Retired}', " "'{UID Keyword}')" ) fp.write(f"\n{dict_name} = {{\n ") fp.write(",\n ".join(uid_entry.format(**attr) for attr in attributes)) fp.write("\n}\n") def parse_row(column_names, row): """Parses `row` for the DICOM Element data. The row should be ... Which leaves the following: Value 1 Value 2 etc... Some rows have Value 1 Value 2 etc... There are also some without text values Parameters ---------- column_names : list of str The column header names row The XML for the header row of the table Returns ------- dict {header1 : val1, header2 : val2, ...} representing the information for the row. """ # Value, name, keyword, type | info, retired cell_values = [] * len(column_names) for cell in row.iter(f"{BR}para"): # If we have an emphasis tag under the para tag emph_value = cell.find(f"{BR}emphasis") if emph_value is not None: # If there is a text value add it, otherwise add "" if emph_value.text is not None: # 200b is a zero width space cell_values.append(emph_value.text.strip().replace("\u200b", "")) else: cell_values.append("") # Otherwise just grab the para tag text else: if cell.text is not None: cell_values.append(cell.text.strip().replace("\u200b", "")) else: cell_values.append("") cell_values.append("") return {k: v for k, v in zip(column_names, cell_values)} def parse_docbook_table(root, labels, caption): """Return the parsed XML data for a table. Parameters ---------- root The XML book root labels : List[str] The table column labels. caption : str The caption of the table to be parsed. Returns ------- List[Dict[str, str]] The list of dicts generated by parsing the table. """ # Find the table in book_root with caption for table in root.iter(f"{BR}table"): if table.find(f"{BR}caption").text == caption: # Get all the Element data from the table return [ parse_row(labels, row) for row in table.find(f"{BR}tbody").iter(f"{BR}tr") ] raise ValueError(f"No tables found with the caption {caption}") def parse_a1(root): """Return the parsed XML data for Table A-1. Parameters ---------- root The XML book root Returns ------- List[Dict[str, str]] The list of dicts generated by parsing the table. """ labels = [ "UID Value", "UID Name", "UID Keyword", "UID Type", "UID Info", "Retired", ] attrs = parse_docbook_table(root, labels, "UID Values") # Customisations for Table A-1 for attr in attrs: name = attr["UID Name"] if "(Retired)" in name: attr["Retired"] = "Retired" attr["UID Name"] = attr["UID Name"].replace("(Retired)", "").strip() if ":" in name: name = name.split(":") attr["UID Name"] = name[0].strip() attr["UID Info"] = name[-1].strip() return attrs def parse_a2(root): """Return the parsed XML data for Table A-2. Parameters ---------- root The XML book root Returns ------- List[Dict[str, str]] The list of dicts generated by parsing the table. """ labels = ["UID Value", "UID Name", "UID Keyword", "Normative Reference"] attrs = parse_docbook_table(root, labels, "Well-known Frames of Reference") # Customisations for Table A-2 for v in attrs: v["UID Type"] = "Well-known frame of reference" v["UID Info"] = "" v["Retired"] = "" del v["Normative Reference"] return attrs def setup_argparse(): parser = argparse.ArgumentParser( description=( "Generate a new _uid_dict.py file from Part 6 of the " "DICOM Standard" ), usage="generate_uid_dict.py [options]", ) opts = parser.add_argument_group("Options") opts.add_argument( "--local", help=( "The path to the directory containing the XML files (used instead " "of downloading them)" ), type=str, ) return parser.parse_args() if __name__ == "__main__": args = setup_argparse() USE_DOWNLOAD = True if args.local: USE_DOWNLOAD = False attrs = [] if not USE_DOWNLOAD: local_dir = Path(args.local) part_06 = (local_dir / "part06.xml").resolve(strict=True) else: url = "https://medical.nema.org/medical/dicom/current/source/docbook" url_06 = f"{url}/part06/part06.xml" print(f"Downloading '{url_06}'") part_06 = request.urlopen(url_06) print("Download complete, processing...") tree = ET.parse(part_06) root = tree.getroot() # Check the version is up to date dcm_version = root.find(f"{BR}subtitle") dcm_version = dcm_version.text.split()[2] lib_version = getattr(_version, "__dicom_version__", None) if lib_version != dcm_version: print( "Warning: 'pydicom._version.__dicom_version__' needs to be " f"updated to '{dcm_version}'" ) attrs += parse_a1(root) attrs += parse_a2(root) for attr in attrs: attr["UID Name"] = attr["UID Name"].replace("&", "and") attr["UID Value"] = attr["UID Value"].replace("\u00ad", "") with open(PYDICOM_DICT_FILENAME, "w") as f: f.write( '"""DICOM UID dictionary auto-generated by ' f'{os.path.basename(__file__)}"""\n' ) f.write("# Each dict entry is UID: (Name, Type, Info, Retired, Keyword)") write_dict(f, DICT_NAME, attrs) print(f"Finished, wrote {len(attrs)} UIDs") pydicom-pydicom-20aa4b7/util/generate_uids/000077500000000000000000000000001515706620200210215ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/util/generate_uids/generate_storage_sopclass_uids.py000066400000000000000000000046101515706620200276450ustar00rootroot00000000000000#!/usr/bin/env python """ Create UIDs for the Storage SOP Classes taken from the generated ``_uids.py``. """ from pathlib import Path import re from pydicom._uid_dict import UID_dictionary STORAGE_REGEX = re.compile( ".*(Storage|Storage SOP Class|Storage - For Presentation|Storage - For " "Processing)$" ) AUTOGEN_COMMENT = "# Only auto-generated Storage SOP Class UIDs below" API_DOC_HEADING = "Storage SOP Class UIDs" def is_storage_class(attributes): return ( attributes[1] == "SOP Class" and STORAGE_REGEX.match(attributes[0]) and attributes[3] != "Retired" ) def uid_line(uid, keyword): """Return the UID class definition line to be written to the file.""" return f"{keyword} = UID('{uid}')\n" def update_uids(path: Path) -> None: """Update pydicom.uid with Storage SOP Class UID definitions.""" retained_lines = [] with open(path) as f: for line in f: retained_lines.append(line) if line.startswith(AUTOGEN_COMMENT): break retained_lines.append("\n\n") with open(path, "w") as f: for line in retained_lines: f.write(line) for uid, attr in sorted(UID_dictionary.items()): if is_storage_class(attr): f.write(uid_line(uid, attr[4])) f.write(f'"""{uid}"""\n') def update_api_reference(path: Path) -> None: """Update the API reference with the Storage SOP Class UIDs""" retained_lines = [] with open(path) as f: for line in f: retained_lines.append(line) if line.startswith(API_DOC_HEADING): break retained_lines.append("----------------------\n") retained_lines.append(".. autosummary::\n") retained_lines.append(" :toctree: generated/\n") retained_lines.append("\n") with open(path, "w") as f: for line in retained_lines: f.write(line) attr = UID_dictionary.values() attr = [v for v in attr if is_storage_class(v)] for attr in sorted(attr, key=lambda x: x[4]): f.write(f" {attr[4]}\n") if __name__ == "__main__": p = Path(__file__).parent.parent.parent / "src" / "pydicom" / "uid.py" p.resolve(strict=True) update_uids(p) p = Path(__file__).parent.parent.parent / "doc" / "reference" / "uid.rst" p.resolve(strict=True) update_api_reference(p) pydicom-pydicom-20aa4b7/util/scripts/000077500000000000000000000000001515706620200176725ustar00rootroot00000000000000pydicom-pydicom-20aa4b7/util/scripts/charlist.py000066400000000000000000000031461515706620200220610ustar00rootroot00000000000000# Copyright 2008-2018 pydicom authors. See LICENSE file for details. """List summary info for the test files in the charset directory""" import logging import os import pydicom from pydicom.data import get_charset_files if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format="%(message)s") logger = logging.getLogger("charlist") # Get list of all DICOM files names = get_charset_files("*.dcm") # Collect summary information from the files files_info = [] for name in names: ds = pydicom.dcmread(name) ds.decode() fname = os.path.basename(name) try: files_info.append((fname, ds.SpecificCharacterSet, ds.PatientName)) except Exception: try: requested_seq = ds.RequestedProcedureCodeSequence[0] spec_charset = requested_seq.SpecificCharacterSet patient_name = requested_seq.PatientName files_info.append((fname, spec_charset, patient_name)) except Exception: logger.warning("Trouble reading file %s", name) # Show the information format = "%-16s %-40s %s" logging.info(format % ("Filename", "Character Sets", "Patient's Name")) logging.info(format % ("--------", "--------------", "--------------")) for file_info in files_info: logging.info(format % file_info) if "chrFrenMulti.dcm" in names: logging.info("\nOther\n=====") logging.info( "chrFrenMulti.dcm is a modified version of chrFren.dcm" " with multi-valued PN and LO for testing decoding" )